[
  {
    "path": "CHANGELOG.md",
    "content": "# Changelog\r\n\r\nAll notable changes to this project will be documented in this file.\r\n\r\nThe format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),\r\nand this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).\r\n\r\n## [Unreleased]\r\n\r\n## [0.6.0] - 2025-06-11\r\n\r\n### Added\r\n- eBPF/XDP packet filtering support for high-performance knocking\r\n- Docker local debugging environment\r\n- `PASS_KNOCKIP_WITH_RANGE` mode for AC to include IP address ranges\r\n\r\n### Changed\r\n- Refactored peer hostname resolve logic\r\n- Aligned UDP open resource behavior with HTTP version\r\n- Server now continues when AC connections are lost in resource groups\r\n\r\n### Fixed\r\n- CGO compilation issues\r\n- Escape mod bug\r\n- Possible nil pointer dereference\r\n- Size comparison error\r\n\r\n## [0.5.0] - 2025-04-13\r\n\r\n### Added\r\n- Plugin system for NHP-Server with separate modules\r\n- Improved build system for server plugins\r\n\r\n### Changed\r\n- Separated modules to accommodate building of nhp-serverd and its plugins\r\n\r\n## [0.4.1] - 2025-04-06\r\n\r\n### Added\r\n- DHP (Data Hiding Protocol) function code\r\n- SM2 P256 ECDH curve support\r\n- Default cipher scheme configuration for DE\r\n\r\n### Changed\r\n- Using GMSM as default cipher scheme\r\n- Updated Makefile for building DE on Linux\r\n\r\n### Fixed\r\n- Removed redundant logging\r\n- Fixed SM2 P256 ECDH curve usage\r\n\r\n## [0.4.0] - 2024-09-04\r\n\r\n### Added\r\n- Initial public release\r\n- Jekyll-based documentation site\r\n- GitHub Pages deployment\r\n\r\n### Changed\r\n- Updated code structure and symbols to be more self-explanatory\r\n\r\n## [0.3.6] - 2024-09-03\r\n\r\n### Added\r\n- Pre-release version with core NHP protocol implementation\r\n- Agent, Server, and AC components\r\n- Noise Protocol Framework integration\r\n- Curve25519 and SM2 cipher scheme support\r\n\r\n[Unreleased]: https://github.com/OpenNHP/opennhp/compare/v0.6.0...HEAD\r\n[0.6.0]: https://github.com/OpenNHP/opennhp/compare/v0.5.0...v0.6.0\r\n[0.5.0]: https://github.com/OpenNHP/opennhp/compare/v0.4.1...v0.5.0\r\n[0.4.1]: https://github.com/OpenNHP/opennhp/compare/v0.4.0...v0.4.1\r\n[0.4.0]: https://github.com/OpenNHP/opennhp/compare/v0.3.6...v0.4.0\r\n[0.3.6]: https://github.com/OpenNHP/opennhp/releases/tag/v0.3.6\r\n"
  },
  {
    "path": "CLAUDE.md",
    "content": "# CLAUDE.md\r\n\r\nThis file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.\r\n\r\n## Project Overview\r\n\r\nOpenNHP is a Go-based Zero Trust security toolkit implementing two core protocols:\r\n- **NHP (Network-infrastructure Hiding Protocol)**: Conceals server ports, IPs, and domains from unauthorized access\r\n- **DHP (Data-object Hiding Protocol)**: Ensures data security via encryption and confidential computing\r\n\r\nThe system follows NIST Zero Trust Architecture with three core components that communicate via encrypted UDP packets using the Noise Protocol Framework.\r\n\r\n## Git Commit Requirements\r\n\r\nAll commits must be signed with a verified GPG or SSH key. Unsigned commits will fail CI checks.\r\n\r\n```bash\r\n# Sign commits (if not configured globally)\r\ngit commit -S -m \"your message\"\r\n\r\n# Amend to sign an existing commit\r\ngit commit --amend --no-edit -S\r\n```\r\n\r\n## Build Commands\r\n\r\n```bash\r\n# Full build (all components + SDKs + plugins + archive)\r\nmake\r\n\r\n# Build individual components\r\nmake agentd      # Build nhp-agent daemon\r\nmake serverd     # Build nhp-server daemon\r\nmake acd         # Build nhp-ac (access controller) daemon\r\nmake db          # Build nhp-db daemon\r\nmake kgc         # Build nhp-kgc (key generation center)\r\n\r\n# Build with eBPF support (requires clang)\r\nmake ebpf\r\n\r\n# Build plugins\r\nmake plugins\r\n\r\n# Initialize/tidy modules\r\nmake init\r\n```\r\n\r\n## Running Tests\r\n\r\n```bash\r\n# Run tests in the nhp module\r\ncd nhp && go test ./...\r\n\r\n# Run tests in the endpoints module\r\ncd endpoints && go test ./...\r\n\r\n# Run specific test file\r\ncd nhp && go test -v ./test/packet_test.go\r\n\r\n# Run benchmark tests\r\ncd nhp && go test -bench=. ./core/benchmark/\r\n```\r\n\r\n## Code Formatting\r\n\r\n**IMPORTANT**: All Go code must be properly formatted before committing. CI will fail if formatting is incorrect.\r\n\r\n### Before Committing\r\n\r\nAlways run these commands on modified Go files:\r\n\r\n```bash\r\n# Format code with gofmt\r\ngofmt -w <file.go>\r\n\r\n# Fix import grouping with goimports\r\ngoimports -w <file.go>\r\n\r\n# Or format all files in a directory\r\ngofmt -w ./path/to/package/\r\ngoimports -w ./path/to/package/\r\n```\r\n\r\n### Import Grouping Style\r\n\r\nImports must be organized into three groups separated by blank lines:\r\n\r\n1. Standard library imports\r\n2. External third-party imports\r\n3. Internal project imports\r\n\r\n```go\r\nimport (\r\n\t\"fmt\"\r\n\t\"net/http\"\r\n\r\n\t\"github.com/gin-gonic/gin\"\r\n\t\"github.com/pelletier/go-toml/v2\"\r\n\r\n\t\"github.com/OpenNHP/opennhp/nhp/common\"\r\n\t\"github.com/OpenNHP/opennhp/nhp/log\"\r\n)\r\n```\r\n\r\n### Verify Formatting\r\n\r\nCheck if files need formatting (no output means properly formatted):\r\n\r\n```bash\r\ngofmt -l <file.go>\r\ngoimports -l <file.go>\r\n```\r\n\r\n### Install goimports\r\n\r\nIf `goimports` is not installed:\r\n\r\n```bash\r\ngo install golang.org/x/tools/cmd/goimports@latest\r\n```\r\n\r\n## Docker Development\r\n\r\n```bash\r\n# Build and run the full stack\r\ncd docker && docker-compose up --build\r\n\r\n# Individual service testing\r\ndocker-compose up nhp-server\r\ndocker-compose up nhp-ac\r\ndocker-compose up nhp-agent\r\n```\r\n\r\n## Architecture\r\n\r\n### Module Structure\r\n\r\nThe codebase uses two separate Go modules with a local replace directive:\r\n\r\n- **`nhp/`**: Core protocol library\r\n  - `core/`: Packet handling, cryptography, device management, Noise Protocol implementation\r\n  - `common/`: Shared types and message definitions (AgentKnockMsg, ServerKnockAckMsg, etc.)\r\n  - `utils/`: Utility functions\r\n  - `plugins/`: Plugin handler interfaces (PluginHandler interface)\r\n  - `log/`: Logging infrastructure\r\n  - `etcd/`: Distributed configuration support\r\n\r\n- **`endpoints/`**: Daemon implementations (depends on nhp module)\r\n  - `agent/`: NHP-Agent - client that sends knock requests\r\n  - `server/`: NHP-Server - authenticates and authorizes requests\r\n  - `ac/`: NHP-AC - access controller that manages firewall rules\r\n  - `db/`: NHP-DB - data object management for DHP\r\n  - `kgc/`: Key Generation Center for IBC (Identity-Based Cryptography)\r\n  - `relay/`: TCP relay functionality\r\n\r\n### Core Concepts\r\n\r\n**Device Types** (defined in `nhp/core/device.go`):\r\n- `NHP_AGENT`: Client initiating access requests\r\n- `NHP_SERVER`: Central authentication/authorization server\r\n- `NHP_AC`: Access controller managing network rules\r\n- `NHP_DB`: Data object backend for DHP\r\n- `NHP_RELAY`: Packet relay\r\n\r\n**Packet Types** (defined in `nhp/core/packet.go`):\r\n- `NHP_KNK`: Agent knock request\r\n- `NHP_ACK`: Server knock acknowledgment\r\n- `NHP_AOP`: Server-to-AC operation request\r\n- `NHP_ART`: AC operation result\r\n- `NHP_REG`/`NHP_RAK`: Agent registration flow\r\n- `DHP_*`: Data Hiding Protocol messages\r\n\r\n**Cipher Schemes** (in `nhp/core/crypto.go`):\r\n- `CIPHER_SCHEME_CURVE`: Curve25519 + ChaCha20-Poly1305 + BLAKE2s\r\n- `CIPHER_SCHEME_GMSM`: SM2 + SM4-GCM + SM3 (Chinese national standards)\r\n\r\n### Configuration\r\n\r\nAll daemons use TOML configuration files in their respective `etc/` directories:\r\n- `config.toml`: Base configuration (private key, listen address, log level)\r\n- `server.toml`: Remote server/peer definitions\r\n- `resource.toml`: Protected resources and auth service providers\r\n- `http.toml`: HTTP server settings (for nhp-server)\r\n\r\n### Plugin System\r\n\r\nServer plugins implement the `PluginHandler` interface (`nhp/plugins/serverpluginhandler.go`) and are built as Go plugins (`.so` files). See `examples/server_plugin/` for reference implementation.\r\n\r\nKey plugin methods:\r\n- `AuthWithNHP()`: Handle NHP protocol authentication\r\n- `AuthWithHttp()`: Handle HTTP-based authentication\r\n- `RegisterAgent()`: Agent registration\r\n- `ListService()`: Service discovery\r\n\r\n### Key Generation\r\n\r\nAll daemons support the `keygen` command:\r\n```bash\r\n./nhp-serverd keygen --curve  # Generate Curve25519 keys\r\n./nhp-serverd keygen --sm2    # Generate SM2 keys (default)\r\n```\r\n\r\n## Protocol Flow\r\n\r\n1. Agent sends encrypted knock (`NHP_KNK`) to Server\r\n2. Server validates, sends operation request (`NHP_AOP`) to AC\r\n3. AC opens firewall, responds (`NHP_ART`) to Server\r\n4. Server sends acknowledgment (`NHP_ACK`) with access info to Agent\r\n5. Agent can now access the protected resource through AC\r\n"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "content": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nWe as members, contributors, and leaders pledge to make participation in our\ncommunity a harassment-free experience for everyone, regardless of age, body\nsize, visible or invisible disability, ethnicity, sex characteristics, gender\nidentity and expression, level of experience, education, socio-economic status,\nnationality, personal appearance, race, religion, or sexual identity\nand orientation.\n\nWe pledge to act and interact in ways that contribute to an open, welcoming,\ndiverse, inclusive, and healthy community.\n\n## Our Standards\n\nExamples of behavior that contributes to a positive environment for our\ncommunity include:\n\n* Demonstrating empathy and kindness toward other people\n* Being respectful of differing opinions, viewpoints, and experiences\n* Giving and gracefully accepting constructive feedback\n* Accepting responsibility and apologizing to those affected by our mistakes,\n  and learning from the experience\n* Focusing on what is best not just for us as individuals, but for the\n  overall community\n\nExamples of unacceptable behavior include:\n\n* The use of sexualized language or imagery, and sexual attention or\n  advances of any kind\n* Trolling, insulting or derogatory comments, and personal or political attacks\n* Public or private harassment\n* Publishing others' private information, such as a physical or email\n  address, without their explicit permission\n* Other conduct which could reasonably be considered inappropriate in a\n  professional setting\n\n## Enforcement Responsibilities\n\nCommunity leaders are responsible for clarifying and enforcing our standards of\nacceptable behavior and will take appropriate and fair corrective action in\nresponse to any behavior that they deem inappropriate, threatening, offensive,\nor harmful.\n\nCommunity leaders have the right and responsibility to remove, edit, or reject\ncomments, commits, code, wiki edits, issues, and other contributions that are\nnot aligned to this Code of Conduct, and will communicate reasons for moderation\ndecisions when appropriate.\n\n## Scope\n\nThis Code of Conduct applies within all community spaces, and also applies when\nan individual is officially representing the community in public spaces.\nExamples of representing our community include using an official e-mail address,\nposting via an official social media account, or acting as an appointed\nrepresentative at an online or offline event.\n\n## Enforcement\n\nInstances of abusive, harassing, or otherwise unacceptable behavior may be\nreported to the community leaders responsible for enforcement at\nopennhp@gmail.com.\nAll complaints will be reviewed and investigated promptly and fairly.\n\nAll community leaders are obligated to respect the privacy and security of the\nreporter of any incident.\n\n## Enforcement Guidelines\n\nCommunity leaders will follow these Community Impact Guidelines in determining\nthe consequences for any action they deem in violation of this Code of Conduct:\n\n### 1. Correction\n\n**Community Impact**: Use of inappropriate language or other behavior deemed\nunprofessional or unwelcome in the community.\n\n**Consequence**: A private, written warning from community leaders, providing\nclarity around the nature of the violation and an explanation of why the\nbehavior was inappropriate. A public apology may be requested.\n\n### 2. Warning\n\n**Community Impact**: A violation through a single incident or series\nof actions.\n\n**Consequence**: A warning with consequences for continued behavior. No\ninteraction with the people involved, including unsolicited interaction with\nthose enforcing the Code of Conduct, for a specified period of time. This\nincludes avoiding interactions in community spaces as well as external channels\nlike social media. Violating these terms may lead to a temporary or\npermanent ban.\n\n### 3. Temporary Ban\n\n**Community Impact**: A serious violation of community standards, including\nsustained inappropriate behavior.\n\n**Consequence**: A temporary ban from any sort of interaction or public\ncommunication with the community for a specified period of time. No public or\nprivate interaction with the people involved, including unsolicited interaction\nwith those enforcing the Code of Conduct, is allowed during this period.\nViolating these terms may lead to a permanent ban.\n\n### 4. Permanent Ban\n\n**Community Impact**: Demonstrating a pattern of violation of community\nstandards, including sustained inappropriate behavior,  harassment of an\nindividual, or aggression toward or disparagement of classes of individuals.\n\n**Consequence**: A permanent ban from any sort of public interaction within\nthe community.\n\n## Attribution\n\nThis Code of Conduct is adapted from the [Contributor Covenant][homepage],\nversion 2.0, available at\nhttps://www.contributor-covenant.org/version/2/0/code_of_conduct.html.\n\nCommunity Impact Guidelines were inspired by [Mozilla's code of conduct\nenforcement ladder](https://github.com/mozilla/diversity).\n\n[homepage]: https://www.contributor-covenant.org\n\nFor answers to common questions about this code of conduct, see the FAQ at\nhttps://www.contributor-covenant.org/faq. Translations are available at\nhttps://www.contributor-covenant.org/translations.\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# Contributing to OpenNHP\r\n\r\nThank you for your interest in contributing to OpenNHP! This document provides guidelines and information for contributors.\r\n\r\n## Code of Conduct\r\n\r\nPlease read and follow our [Code of Conduct](CODE_OF_CONDUCT.md) to maintain a welcoming and inclusive community.\r\n\r\n## Getting Started\r\n\r\n### Prerequisites\r\n\r\n- **Go 1.24+** - Required for building the project\r\n- **Make** - Build automation\r\n- **Git** - Version control\r\n- **golangci-lint** (optional) - For code linting\r\n\r\n### Clone and Build\r\n\r\n```bash\r\n# Clone the repository\r\ngit clone https://github.com/OpenNHP/opennhp.git\r\ncd opennhp\r\n\r\n# Initialize dependencies\r\nmake init\r\n\r\n# Build all binaries\r\nmake\r\n```\r\n\r\n### Project Structure\r\n\r\n```\r\nopennhp/\r\n├── nhp/                 # Core NHP protocol library\r\n│   ├── core/            # Protocol implementation\r\n│   ├── common/          # Shared types and utilities\r\n│   ├── utils/           # Helper functions\r\n│   ├── plugins/         # Plugin system\r\n│   └── test/            # Unit tests\r\n├── endpoints/           # Network daemon implementations\r\n│   ├── agent/           # NHP Agent (client)\r\n│   ├── server/          # NHP Server\r\n│   ├── ac/              # Access Controller\r\n│   ├── db/              # Database component\r\n│   └── kgc/             # Key Generation Center\r\n├── examples/            # Example implementations\r\n│   ├── server_plugin/   # Example server plugin\r\n│   └── client_sdk/      # SDK usage examples\r\n├── docs/                # Documentation\r\n├── docker/              # Docker configurations\r\n└── release/             # Build outputs\r\n```\r\n\r\n### Running Tests\r\n\r\n```bash\r\n# Run all tests\r\nmake test\r\n\r\n# Run tests with race detection\r\nmake test-race\r\n\r\n# Run tests with coverage\r\nmake coverage\r\n```\r\n\r\n### Code Style\r\n\r\n- Use `gofmt` for code formatting: `make fmt`\r\n- Follow [Go Code Review Comments](https://github.com/golang/go/wiki/CodeReviewComments)\r\n- Write clear, descriptive commit messages\r\n- Add tests for new functionality\r\n- Document exported functions and types\r\n\r\n## Development Workflow\r\n\r\n### Making Changes\r\n\r\n1. **Fork** the repository on GitHub\r\n2. **Clone** your fork locally\r\n3. **Create a branch** for your changes:\r\n   ```bash\r\n   git checkout -b feature/your-feature-name\r\n   ```\r\n4. **Make your changes** and commit them\r\n5. **Test** your changes:\r\n   ```bash\r\n   make test\r\n   make fmt\r\n   ```\r\n6. **Push** to your fork:\r\n   ```bash\r\n   git push origin feature/your-feature-name\r\n   ```\r\n7. **Open a Pull Request** on GitHub\r\n\r\n### Commit Messages\r\n\r\nWrite clear, concise commit messages that explain the \"why\" behind your changes:\r\n\r\n```\r\nfeat(server): add health check endpoint\r\n\r\nAdd /health and /ready endpoints for Kubernetes liveness\r\nand readiness probes.\r\n```\r\n\r\nUse conventional commit prefixes:\r\n- `feat:` - New features\r\n- `fix:` - Bug fixes\r\n- `docs:` - Documentation changes\r\n- `test:` - Test additions or modifications\r\n- `refactor:` - Code refactoring\r\n- `ci:` - CI/CD changes\r\n- `build:` - Build system changes\r\n\r\n### Pull Request Guidelines\r\n\r\n- Keep PRs focused on a single change\r\n- Update documentation if needed\r\n- Add tests for new functionality\r\n- Ensure all tests pass\r\n- Request review from maintainers\r\n\r\n## Reporting Issues\r\n\r\n### Bug Reports\r\n\r\nWhen reporting bugs, please include:\r\n\r\n- Go version (`go version`)\r\n- Operating system and version\r\n- Steps to reproduce the issue\r\n- Expected vs actual behavior\r\n- Relevant logs or error messages\r\n\r\n### Feature Requests\r\n\r\nFor feature requests, please:\r\n\r\n- Check existing issues to avoid duplicates\r\n- Clearly describe the use case\r\n- Explain the proposed solution\r\n\r\n## Security Issues\r\n\r\nFor security vulnerabilities, please see our [Security Policy](SECURITY.md) and report issues privately.\r\n\r\n## Getting Help\r\n\r\n- **GitHub Issues** - For bugs and feature requests\r\n- **Discussions** - For questions and community support\r\n- **Documentation** - See the [docs/](docs/) directory\r\n\r\n## License\r\n\r\nBy contributing to OpenNHP, you agree that your contributions will be licensed under the [Apache 2.0 License](LICENSE).\r\n"
  },
  {
    "path": "LICENSE",
    "content": "                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "Makefile",
    "content": "export GO111MODULE := on\nCUSTOM_LD_FLAGS ?=\n\nall: generate-version-and-build\n\n# Repo settings\nGOMODULE = github.com/OpenNHP/opennhp/nhp\n\n# Version and build settings\nMAKEFLAGS += --no-print-directory\nOS_NAME = $(shell uname -s | tr A-Z a-z)\nGOPATH = $(shell go env GOPATH)\nGOMOBILE = $(shell which gomobile 2>/dev/null || echo $(GOPATH)/bin/gomobile)\nXCODE_APP = $(shell test -d /Applications/Xcode.app && echo found || echo \"\")\nXCODE_SELECT = $(shell xcode-select -p 2>/dev/null | grep -q Xcode.app && echo found || echo \"\")\n\n# Version number auto increment\nTIMESTAMP=$(shell date +%y%m%d%H%M%S)\nVERSION = $(shell cat nhp/version/VERSION).$(TIMESTAMP)\n# Other version settings\nCOMMIT_ID = $(shell git show -s --format=%H)\nCOMMIT_TIME = $(shell git show -s --format=%cd --date=format:'%Y-%m-%d %H:%M:%S')\nBUILD_TIME = $(shell date \"+%Y-%m-%d %H:%M:%S\")\n# Built Package File Name\nPACKAGE_FILE = opennhp-$(VERSION).tar.gz\n# Go build flags\nLD_FLAGS = \"${CUSTOM_LD_FLAGS} -s -w -X '${GOMODULE}/version.Version=${VERSION}' -X '${GOMODULE}/version.CommitId=${COMMIT_ID}' -X '${GOMODULE}/version.CommitTime=${COMMIT_TIME}' -X '${GOMODULE}/version.BuildTime=${BUILD_TIME}'\"\n\n# Color definition\nCOLOUR_GREEN=\\033[0;32m\nCOLOUR_RED=\\033[0;31m\nCOLOUR_BLUE=\\033[0;34m\nEND_COLOUR=\\033[0m\n\n# Plugins\nNHP_SERVER_PLUGINS = ./examples/server_plugin/basic\nNHP_AUTHENTICATOR_PLUGINS = ./examples/server_plugin/authenticator\n\n# Android environment settings\nANDROID_CC='${TOOLCHAIN}/bin/aarch64-linux-android21-clang'\nANDROID_CXX='${TOOLCHAIN}/bin/aarch64-linux-android21-clang++'\n\n# eBPF compile\nifneq (,$(findstring ebpf,$(MAKECMDGOALS)))\n    CLANG := $(shell command -v clang 2>/dev/null)\n    ifeq ($(CLANG),)\n        $(error \"clang is not installed. Please install clang to compile eBPF programs.\")\n    endif\nendif\n\nEBPF_SRC_XDP = ./nhp/ebpf/xdp/nhp_ebpf_xdp.c\nEBPF_SRC_TC_EGRESS = ./nhp/ebpf/xdp/tc_egress.c\nEBPF_OBJ_XDP = ./release/nhp-ac/etc/nhp_ebpf_xdp.o\nEBPF_OBJ_TC_EGRESS = ./release/nhp-ac/etc/tc_egress.o\nCLANG_OPTS = -O2 -target bpf -g -Wall -I.\n\n.PHONY: ebpf\nebpf: $(EBPF_OBJ_XDP) $(EBPF_OBJ_TC_EGRESS) generate-version-and-build\n\t@echo \"$(COLOUR_GREEN)[eBPF] Full build completed$(END_COLOUR)\"\n\n$(EBPF_OBJ_XDP): $(EBPF_SRC_XDP)\n\t@mkdir -p $(@D)\n\t@echo \"$(COLOUR_BLUE)[eBPF] Compiling: $< -> $@ $(END_COLOUR)\"\n\t$(CLANG) $(CLANG_OPTS) -c $(EBPF_SRC_XDP) -o $(EBPF_OBJ_XDP)\n$(EBPF_OBJ_TC_EGRESS): $(EBPF_SRC_TC_EGRESS)\n\t@mkdir -p $(@D)\n\t@echo \"$(COLOUR_BLUE)[eBPF] Compiling: $< -> $@ $(END_COLOUR)\"\n\t$(CLANG) $(CLANG_OPTS) -c $(EBPF_SRC_TC_EGRESS) -o $(EBPF_OBJ_TC_EGRESS)\n\nclean_ebpf:\n\t@rm -f $(EBPF_OBJ_XDP) $(EBPF_OBJ_TC_EGRESS)\n\t@echo \"$(COLOUR_GREEN)[Clean] Removed eBPF object file$(END_COLOUR)\"\n\ngenerate-version-and-build:\n\t@echo \"$(COLOUR_BLUE)[OpenNHP] Start building... $(END_COLOUR)\"\n\t@echo \"$(COLOUR_BLUE)Version: ${VERSION} $(END_COLOUR)\"\n\t@echo \"$(COLOUR_BLUE)Commit id: ${COMMIT_ID} $(END_COLOUR)\"\n\t@echo \"$(COLOUR_BLUE)Commit time: ${COMMIT_TIME} $(END_COLOUR)\"\n\t@echo \"$(COLOUR_BLUE)Build time: ${BUILD_TIME} $(END_COLOUR)\"\n\t@$(MAKE) init\n\t@$(MAKE) agentd\n\t@$(MAKE) acd\n\t@$(MAKE) serverd\n\t@$(MAKE) db\n\t@$(MAKE) kgc\n\t@$(MAKE) linuxagentsdk\n\t@$(MAKE) androidagentsdk\n\t@$(MAKE) macosagentsdk\n\t@$(MAKE) iosagentsdk\n\t@$(MAKE) devicesdk\n\t@$(MAKE) plugins\n\t@$(MAKE) archive\n\t@echo \"$(COLOUR_GREEN)[OpenNHP] Build for platform ${OS_NAME} successfully done!$(END_COLOUR)\"\n\ninit:\n\t@echo \"$(COLOUR_BLUE)[OpenNHP] Initializing... $(END_COLOUR)\"\n\tgit clean -df release\n\tcd nhp && go mod download\n\tcd endpoints && go mod download\n\t@for dir in ./examples/server_plugin/*/; do \\\n\t\tif [ -f \"$$dir/go.mod\" ]; then \\\n\t\t\techo \"$(COLOUR_BLUE)[Plugin-$$(basename $$dir)] Running go mod download... $(END_COLOUR)\"; \\\n\t\t\tcd \"$$dir\" && go mod download && cd - > /dev/null; \\\n\t\telse \\\n\t\t\tfor subdir in \"$$dir\"/*/; do \\\n\t\t\t\tif [ -f \"$$subdir/go.mod\" ]; then \\\n\t\t\t\t\techo \"$(COLOUR_BLUE)[Plugin-$$(basename $$subdir)] Running go mod download... $(END_COLOUR)\"; \\\n\t\t\t\t\tcd \"$$subdir\" && go mod download && cd - > /dev/null; \\\n\t\t\t\tfi \\\n\t\t\tdone \\\n\t\tfi \\\n\tdone\n\n# Use this target when you need to update dependencies (will modify go.sum)\ntidy:\n\t@echo \"$(COLOUR_BLUE)[OpenNHP] Running go mod tidy... $(END_COLOUR)\"\n\tcd nhp && go mod tidy\n\tcd endpoints && go mod tidy\n\t@for dir in ./examples/server_plugin/*/; do \\\n\t\tif [ -f \"$$dir/go.mod\" ]; then \\\n\t\t\techo \"$(COLOUR_BLUE)[Plugin-$$(basename $$dir)] Running go mod tidy... $(END_COLOUR)\"; \\\n\t\t\tcd \"$$dir\" && go mod tidy && cd - > /dev/null; \\\n\t\telse \\\n\t\t\tfor subdir in \"$$dir\"/*/; do \\\n\t\t\t\tif [ -f \"$$subdir/go.mod\" ]; then \\\n\t\t\t\t\techo \"$(COLOUR_BLUE)[Plugin-$$(basename $$subdir)] Running go mod tidy... $(END_COLOUR)\"; \\\n\t\t\t\t\tcd \"$$subdir\" && go mod tidy && cd - > /dev/null; \\\n\t\t\t\tfi \\\n\t\t\tdone \\\n\t\tfi \\\n\tdone\n\t@echo \"$(COLOUR_GREEN)[OpenNHP] go mod tidy complete. Remember to commit go.sum files!$(END_COLOUR)\"\n\nagentd:\n\t@echo \"$(COLOUR_BLUE)[OpenNHP] Building nhp-agent... $(END_COLOUR)\"\n\tcd endpoints && \\\n\tgo build -trimpath -ldflags ${LD_FLAGS} -v -o ../release/nhp-agent/nhp-agentd ./agent/main/main.go && \\\n\tcp ./agent/main/etc/*.toml ../release/nhp-agent/etc/ && \\\n\tcp -rf ./agent/main/etc/certs ../release/nhp-agent/etc/\n\nacd:\n\t@echo \"$(COLOUR_BLUE)[OpenNHP] Building nhp-ac... $(END_COLOUR)\"\n\tcd endpoints && \\\n\tgo build -trimpath -ldflags ${LD_FLAGS} -v -o ../release/nhp-ac/nhp-acd ./ac/main/main.go && \\\n\tcp ./ac/main/etc/*.toml ../release/nhp-ac/etc/\n\nserverd:\n\t@echo \"$(COLOUR_BLUE)[OpenNHP] Building nhp-server... $(END_COLOUR)\"\n\tcd endpoints && \\\n\tgo build -trimpath -ldflags ${LD_FLAGS} -v -o ../release/nhp-server/nhp-serverd ./server/main/main.go && \\\n\tmkdir -p ../release/nhp-server/etc; \\\n\tcp ./server/main/etc/*.toml ../release/nhp-server/etc/\n\ndb:\n\t@echo \"$(COLOUR_BLUE)[OpenNHP] Building nhp-db... $(END_COLOUR)\"\n\tcd endpoints && \\\n\tgo build -trimpath -ldflags ${LD_FLAGS} -v -o ../release/nhp-db/nhp-db ./db/main/main.go && \\\n\tmkdir -p ../release/nhp-db/etc; \\\n\tcp ./db/main/etc/*.toml ../release/nhp-db/etc/\n\nkgc:\n\t@echo \"$(COLOUR_BLUE)[OpenNHP] Building nhp-kgc... $(END_COLOUR)\"\n\tcd endpoints && \\\n\tgo build -trimpath -ldflags ${LD_FLAGS} -v -o ../release/nhp-kgc/nhp-kgc ./kgc/main/main.go && \\\n\tmkdir -p ../release/nhp-kgc/etc; \\\n\tcp ./kgc/main/etc/*.toml ../release/nhp-kgc/etc/\n\nlinuxagentsdk:\n\t@echo \"$(COLOUR_BLUE)[OpenNHP] Building Linux agent SDK... $(END_COLOUR)\"\nifeq ($(OS_NAME), linux)\n\tcd endpoints && \\\n\tgo build -a -trimpath -buildmode=c-shared -ldflags ${LD_FLAGS} -v -o ../release/nhp-agent/nhp-agent.so ./agent/main/main.go ./agent/main/export.go\nendif\n\nandroidagentsdk:\n\t@echo \"$(COLOUR_BLUE)[OpenNHP] Building Android agent SDK... $(END_COLOUR)\"\nifeq ($(OS_NAME), linux)\n    ifeq ($(TOOLCHAIN),)\n\t\t@echo \"Android NDK is not installed. Please install Android NDK to compile Android SDK.\"\n    else\n\t\tcd endpoints && \\\n\t\tGOOS=android GOARCH=arm64 CGO_ENABLED=1 \\\n\t\tCC=${ANDROID_CC} CXX=${ANDROID_CXX} \\\n\t\tgo build -a -trimpath -buildmode=c-shared -ldflags ${LD_FLAGS} -v -o ../release/nhp-agent/libnhpagent.so ./agent/main/main.go ./agent/main/export.go\n    endif\nendif\n\n\nmacosagentsdk:\n\t@echo \"$(COLOUR_BLUE)[OpenNHP] Building MacOS agent SDK... $(END_COLOUR)\"\nifeq ($(OS_NAME), darwin)\nifeq (, $(shell test -f $(GOMOBILE) && echo found))\n\t$(error \"No gomobile found, consider doing `go install golang.org/x/mobile/cmd/gomobile@latest`\")\nendif\n\tcd endpoints && \\\n\tGOOS=darwin GOARCH=arm64 CGO_ENABLED=1 \\\n\tgo build -a -trimpath -buildmode=c-shared -ldflags ${LD_FLAGS} -v -o ../release/nhp-agent/nhp-agent.dylib ./agent/main/main.go ./agent/main/export.go\nendif\n\niosagentsdk:\n\t@echo \"$(COLOUR_BLUE)[OpenNHP] Building IOS agent SDK... $(END_COLOUR)\"\nifeq ($(OS_NAME), darwin)\nifeq (, $(shell test -f $(GOMOBILE) && echo found))\n\t@echo \"$(COLOUR_RED)[Warning] No gomobile found, skipping iOS SDK build$(END_COLOUR)\"\n\t@echo \"$(COLOUR_RED)Consider doing: go install golang.org/x/mobile/cmd/gomobile@latest$(END_COLOUR)\"\nelse\nifeq (, $(XCODE_APP))\n\t@echo \"$(COLOUR_RED)[Warning] Xcode is not installed, skipping iOS SDK build$(END_COLOUR)\"\n\t@echo \"$(COLOUR_RED)iOS SDK requires full Xcode installation (not just Command Line Tools)$(END_COLOUR)\"\nelse\nifeq (, $(XCODE_SELECT))\n\t@echo \"$(COLOUR_RED)[Warning] xcode-select is not pointing to Xcode.app, skipping iOS SDK build$(END_COLOUR)\"\n\t@echo \"$(COLOUR_RED)Please run: sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer$(END_COLOUR)\"\nelse\n\tcd endpoints && \\\n\tPATH=$(GOPATH)/bin:$$PATH $(GOMOBILE) bind -target ios -o ../release/nhp-agent/nhpagent.xcframework ./agent/iossdk\nendif\nendif\nendif\nendif\n\n\ndevicesdk:\n\t@echo \"$(COLOUR_BLUE)[OpenNHP] Building nhp SDK... $(END_COLOUR)\"\nifeq ($(OS_NAME), linux)\n\tcd nhp && \\\n\tgo build -a -trimpath -buildmode=c-shared -ldflags ${LD_FLAGS} -v -o ../release/nhp-device/nhpdevice.so ./core/main/main.go ./core/main/nhpdevice.go\n#\tgcc ./core/sdkdemo/nhp-device-demo.c -I ./release/nhp-device -I ./core/main -l:nhpdevice.so -L./release/nhp-device -Wl,-rpath=. -o ./release/nhp-device/nhp-device-demo\nendif\n\nplugins:\n\t@echo \"$(COLOUR_BLUE)[OpenNHP] Building plugins... $(END_COLOUR)\"\n\t@for dir in ./examples/server_plugin/*/; do \\\n\t\tif [ -f \"$$dir/Makefile\" ]; then \\\n\t\t\techo \"$(COLOUR_BLUE)[Plugin-$$(basename $$dir)] Building... $(END_COLOUR)\"; \\\n\t\t\t$(MAKE) -C \"$$dir\" || exit 1; \\\n\t\telse \\\n\t\t\tfor subdir in \"$$dir\"/*/; do \\\n\t\t\t\tif [ -f \"$$subdir/Makefile\" ]; then \\\n\t\t\t\t\techo \"$(COLOUR_BLUE)[Plugin-$$(basename $$subdir)] Building... $(END_COLOUR)\"; \\\n\t\t\t\t\t$(MAKE) -C \"$$subdir\" || exit 1; \\\n\t\t\t\tfi \\\n\t\t\tdone \\\n\t\tfi \\\n\tdone\n# Development build (faster, no version injection)\ndev:\n\t@echo \"$(COLOUR_BLUE)[OpenNHP] Development build...$(END_COLOUR)\"\n\tcd nhp && go build ./...\n\tcd endpoints && go build ./...\n\t@echo \"$(COLOUR_GREEN)[OpenNHP] Development build complete$(END_COLOUR)\"\n\n# Run all tests (excludes wasm/policy which requires WASM build tags)\ntest:\n\t@echo \"$(COLOUR_BLUE)[OpenNHP] Running tests...$(END_COLOUR)\"\n\tcd nhp && go test -v $$(go list ./... | grep -v /wasm/policy)\n\tcd endpoints && go test -v ./...\n\t@echo \"$(COLOUR_GREEN)[OpenNHP] All tests passed!$(END_COLOUR)\"\n\n# Run tests with race detection\ntest-race:\n\t@echo \"$(COLOUR_BLUE)[OpenNHP] Running tests with race detection...$(END_COLOUR)\"\n\tcd nhp && go test -race -v $$(go list ./... | grep -v /wasm/policy)\n\tcd endpoints && go test -race -v ./...\n\t@echo \"$(COLOUR_GREEN)[OpenNHP] Race detection tests passed!$(END_COLOUR)\"\n\n# Format code\nfmt:\n\t@echo \"$(COLOUR_BLUE)[OpenNHP] Formatting code...$(END_COLOUR)\"\n\tcd nhp && go fmt ./...\n\tcd endpoints && go fmt ./...\n\tcd examples/server_plugin/basic && go fmt ./...\n\t@echo \"$(COLOUR_GREEN)[OpenNHP] Code formatted$(END_COLOUR)\"\n\n# Lint code (requires golangci-lint: https://golangci-lint.run/usage/install/)\nlint:\n\t@echo \"$(COLOUR_BLUE)[OpenNHP] Linting code...$(END_COLOUR)\"\n\t@which golangci-lint > /dev/null || (echo \"$(COLOUR_RED)golangci-lint not found. Install: https://golangci-lint.run/usage/install/$(END_COLOUR)\" && exit 1)\n\tcd nhp && golangci-lint run ./...\n\tcd endpoints && golangci-lint run ./...\n\t@echo \"$(COLOUR_GREEN)[OpenNHP] Linting complete$(END_COLOUR)\"\n\n# Clean build artifacts\nclean:\n\t@echo \"$(COLOUR_BLUE)[OpenNHP] Cleaning build artifacts...$(END_COLOUR)\"\n\trm -rf release/\n\tcd nhp && go clean\n\tcd endpoints && go clean\n\t@echo \"$(COLOUR_GREEN)[OpenNHP] Clean complete$(END_COLOUR)\"\n\n# Show available targets\nhelp:\n\t@echo \"\"\n\t@echo \"$(COLOUR_BLUE)OpenNHP Makefile$(END_COLOUR)\"\n\t@echo \"\"\n\t@echo \"$(COLOUR_GREEN)Development:$(END_COLOUR)\"\n\t@echo \"  make dev        - Quick development build (no version injection)\"\n\t@echo \"  make test       - Run all tests\"\n\t@echo \"  make test-race  - Run tests with race detection\"\n\t@echo \"  make fmt        - Format code with gofmt\"\n\t@echo \"  make lint       - Lint code with golangci-lint\"\n\t@echo \"  make clean      - Remove build artifacts\"\n\t@echo \"\"\n\t@echo \"$(COLOUR_GREEN)Build:$(END_COLOUR)\"\n\t@echo \"  make            - Build all binaries (default)\"\n\t@echo \"  make init       - Download dependencies (preserves go.sum)\"\n\t@echo \"  make tidy       - Update dependencies (modifies go.sum)\"\n\t@echo \"  make agentd     - Build nhp-agent\"\n\t@echo \"  make serverd    - Build nhp-server\"\n\t@echo \"  make acd        - Build nhp-ac\"\n\t@echo \"  make db         - Build nhp-db\"\n\t@echo \"  make kgc        - Build nhp-kgc\"\n\t@echo \"  make plugins    - Build server plugins\"\n\t@echo \"\"\n\t@echo \"$(COLOUR_GREEN)SDK:$(END_COLOUR)\"\n\t@echo \"  make linuxagentsdk    - Build Linux agent SDK (.so)\"\n\t@echo \"  make macosagentsdk    - Build macOS agent SDK (.dylib)\"\n\t@echo \"  make iosagentsdk      - Build iOS agent SDK (.xcframework)\"\n\t@echo \"  make androidagentsdk  - Build Android agent SDK (.so)\"\n\t@echo \"  make devicesdk        - Build device SDK\"\n\t@echo \"\"\n\t@echo \"$(COLOUR_GREEN)Other:$(END_COLOUR)\"\n\t@echo \"  make ebpf       - Compile eBPF programs (requires clang)\"\n\t@echo \"  make archive    - Package binaries for distribution\"\n\t@echo \"  make help       - Show this help message\"\n\t@echo \"\"\n\n# Run fuzz tests (60 seconds each by default)\nfuzz:\n\t@echo \"$(COLOUR_BLUE)[OpenNHP] Running fuzz tests...$(END_COLOUR)\"\n\tcd nhp && go test -fuzz=FuzzECDHFromKey -fuzztime=60s ./test/\n\tcd nhp && go test -fuzz=FuzzAESDecrypt -fuzztime=60s ./test/\n\tcd nhp && go test -fuzz=FuzzHeaderTypeToDeviceType -fuzztime=60s ./test/\n\tcd nhp && go test -fuzz=FuzzAgentKnockMsg -fuzztime=60s ./test/\n\t@echo \"$(COLOUR_GREEN)[OpenNHP] Fuzz tests completed$(END_COLOUR)\"\n\n# Run fuzz tests briefly (for CI)\nfuzz-quick:\n\t@echo \"$(COLOUR_BLUE)[OpenNHP] Running quick fuzz tests...$(END_COLOUR)\"\n\tcd nhp && go test -fuzz=FuzzECDHFromKey -fuzztime=10s ./test/\n\tcd nhp && go test -fuzz=FuzzAESDecrypt -fuzztime=10s ./test/\n\tcd nhp && go test -fuzz=FuzzAgentKnockMsg -fuzztime=10s ./test/\n\t@echo \"$(COLOUR_GREEN)[OpenNHP] Quick fuzz tests completed$(END_COLOUR)\"\n\n# Run tests with coverage\ncoverage:\n\t@echo \"$(COLOUR_BLUE)[OpenNHP] Running tests with coverage...$(END_COLOUR)\"\n\tcd nhp && go test -coverprofile=coverage.out -covermode=atomic ./...\n\tcd endpoints && go test -coverprofile=coverage.out -covermode=atomic ./...\n\t@echo \"$(COLOUR_GREEN)[OpenNHP] Coverage reports generated$(END_COLOUR)\"\n\n# View coverage report in browser\ncoverage-html:\n\t@echo \"$(COLOUR_BLUE)[OpenNHP] Generating HTML coverage reports...$(END_COLOUR)\"\n\tcd nhp && go tool cover -html=coverage.out -o coverage.html\n\tcd endpoints && go tool cover -html=coverage.out -o coverage.html\n\t@echo \"$(COLOUR_GREEN)[OpenNHP] Coverage reports: nhp/coverage.html, endpoints/coverage.html$(END_COLOUR)\"\n\narchive:\n\t@echo \"$(COLOUR_BLUE)[OpenNHP] Start archiving... $(END_COLOUR)\"\n\t@cd release && mkdir -p archive && tar -czvf ./archive/$(PACKAGE_FILE) nhp-agent nhp-ac nhp-db nhp-server\n\t@echo \"$(COLOUR_GREEN)[OpenNHP] Package ${PACKAGE_FILE} archived!$(END_COLOUR)\"\n\n.PHONY: all generate-version-and-build init tidy agentd acd serverd db linuxagentsdk androidagentsdk macosagentsdk iosagentsdk devicesdk plugins dev test test-race fmt lint clean help fuzz fuzz-quick coverage coverage-html archive ebpf clean_ebpf\n"
  },
  {
    "path": "README.de.md",
    "content": "[![en](https://img.shields.io/badge/lang-en-green.svg)](https://github.com/OpenNHP/opennhp/blob/master/README.md)\r\n[![zh-cn](https://img.shields.io/badge/lang-zh--cn-green.svg)](https://github.com/OpenNHP/opennhp/blob/master/README.zh-cn.md)\r\n[![de](https://img.shields.io/badge/lang-de-green.svg)](https://github.com/OpenNHP/opennhp/blob/master/README.de.md)\r\n[![ja](https://img.shields.io/badge/lang-ja-green.svg)](https://github.com/OpenNHP/opennhp/blob/master/README.ja.md)\r\n[![fr](https://img.shields.io/badge/lang-fr-green.svg)](https://github.com/OpenNHP/opennhp/blob/master/README.fr.md)\r\n[![es](https://img.shields.io/badge/lang-es-green.svg)](https://github.com/OpenNHP/opennhp/blob/master/README.es.md)\r\n\r\n![OpenNHP Logo](docs/images/logo11.png)\r\n# OpenNHP: Zero Trust Netzwerk-Infrastruktur-Verbergungsprotokoll\r\nEin leichtgewichtiges, kryptographisch getriebenes Zero Trust Netzwerkprotokoll auf der OSI-Schicht 5, um Ihren Server und Ihre Daten vor Angreifern zu verbergen.\r\n\r\n![Build Status](https://img.shields.io/badge/build-passing-brightgreen)\r\n![Version](https://img.shields.io/badge/version-1.0.0-blue)\r\n![Lizenz](https://img.shields.io/badge/license-Apache%202.0-green)\r\n\r\n---\r\n\r\n## Herausforderung: KI verwandelt das Internet in einen \"Dunklen Wald\"\r\n\r\nDer schnelle Fortschritt der **KI**-Technologien, insbesondere großer Sprachmodelle (LLMs), verändert die Cybersicherheitslandschaft erheblich. Das Aufkommen der **autonomen Ausnutzung von Schwachstellen (AVE)** stellt einen großen Fortschritt im KI-Zeitalter dar, indem es die Ausnutzung von Schwachstellen automatisiert, wie in [diesem Forschungspapier](https://arxiv.org/abs/2404.08144) gezeigt wird. Diese Entwicklung erhöht das Risiko für alle exponierten Netzwerkdienste erheblich und erinnert an die [Dunkle Wald-Hypothese](https://de.wikipedia.org/wiki/Dunkler_Wald) des Internets. KI-gesteuerte Tools scannen kontinuierlich die digitale Umgebung, identifizieren schnell Schwachstellen und nutzen sie aus. Folglich entwickelt sich das Internet zu einem **\"dunklen Wald\"**, in dem **Sichtbarkeit Verwundbarkeit bedeutet**.\r\n\r\n![Verwundbarkeitsrisiken](docs/images/Vul_Risks.png)\r\n\r\nGartner prognostiziert einen [schnellen Anstieg von KI-gesteuerten Cyberangriffen](https://www.gartner.com/en/newsroom/press-releases/2024-08-28-gartner-forecasts-global-information-security-spending-to-grow-15-percent-in-2025). Dieser Wandel erfordert eine Neubewertung traditioneller Cybersicherheitsstrategien mit einem Fokus auf proaktive Verteidigungsmaßnahmen, schnelle Reaktionsmechanismen und die Einführung von Netzwerkverbergungstechnologien zum Schutz kritischer Infrastrukturen.\r\n\r\n---\r\n\r\n## Schnelle Demo: OpenNHP in Aktion sehen\r\n\r\nBevor wir in die Details von OpenNHP eintauchen, beginnen wir mit einer kurzen Demonstration, wie OpenNHP einen Server vor unbefugtem Zugriff schützt. Sie können dies in Aktion sehen, indem Sie den geschützten Server unter https://acdemo.opennhp.org aufrufen.\r\n\r\n### 1) Der geschützte Server ist für nicht authentifizierte Benutzer \"unsichtbar\"\r\n\r\nStandardmäßig führt jeder Versuch, eine Verbindung zum geschützten Server herzustellen, zu einem TIME OUT-Fehler, da alle Ports geschlossen sind, wodurch der Server *\"unsichtbar\"* und scheinbar offline wird.\r\n\r\n![OpenNHP Demo](docs/images/OpenNHP_ACDemo0.png)\r\n\r\nDas Scannen der Ports des Servers führt ebenfalls zu einem TIME OUT-Fehler.\r\n\r\n![OpenNHP Demo](docs/images/OpenNHP_ScanDemo.png)\r\n\r\n### 2) Nach der Authentifizierung wird der geschützte Server zugänglich\r\n\r\nOpenNHP unterstützt eine Vielzahl von Authentifizierungsmethoden, wie OAuth, SAML, QR-Codes und mehr. Für diese Demonstration verwenden wir einen einfachen Benutzernamen/Passwort-Authentifizierungsdienst unter https://demologin.opennhp.org.\r\n\r\n![OpenNHP Demo](docs/images/OpenNHP_DemoLogin.png)\r\n\r\nSobald Sie auf die Schaltfläche \"Login\" klicken, ist die Authentifizierung erfolgreich und Sie werden zum geschützten Server weitergeleitet. Zu diesem Zeitpunkt wird der Server *\"sichtbar\"* und auf Ihrem Gerät zugänglich.\r\n\r\n![OpenNHP Demo](docs/images/OpenNHP_ACDemo1.png)\r\n\r\n---\r\n\r\n## Vision: Das Internet vertrauenswürdig machen\r\n\r\nDie Offenheit der TCP/IP-Protokolle hat das explosive Wachstum von Internetanwendungen vorangetrieben, aber auch Schwachstellen offengelegt, die es böswilligen Akteuren ermöglichen, unbefugten Zugriff zu erhalten und jede exponierte IP-Adresse auszunutzen. Obwohl das [OSI-Netzwerkmodell](https://de.wikipedia.org/wiki/OSI-Modell) die *5. Schicht (Sitzungsschicht)* zur Verwaltung von Verbindungen definiert, wurden bisher nur wenige effektive Lösungen hierfür implementiert.\r\n\r\n**NHP**, oder das **\"Netzwerk-Infrastruktur-Verbergungsprotokoll\"**, ist ein leichtgewichtiges, kryptographisch getriebenes Zero Trust Netzwerkprotokoll, das auf der *OSI-Sitzungsschicht* arbeitet und sich ideal zur Verwaltung der Netzwerkvisibilität und Verbindungen eignet. Das Hauptziel von NHP ist es, geschützte Ressourcen vor unbefugten Entitäten zu verbergen und den Zugriff nur verifizierten, autorisierten Benutzern durch kontinuierliche Überprüfung zu gewähren, um so zu einem vertrauenswürdigeren Internet beizutragen.\r\n\r\n![Vertrauenswürdiges Internet](docs/images/TrustworthyCyberspace.png)\r\n\r\n---\r\n\r\n## Lösung: OpenNHP stellt die Kontrolle über die Netzwerkvisibilität wieder her\r\n\r\n**OpenNHP** ist die Open-Source-Implementierung des NHP-Protokolls. Es basiert auf der Kryptographie und wurde mit Sicherheitsprinzipien im Vordergrund entwickelt, um eine echte Zero Trust-Architektur auf der *OSI-Sitzungsschicht* zu implementieren.\r\n\r\n![OpenNHP als OSI 5. Schicht](docs/images/OSI_OpenNHP.png)\r\n\r\nOpenNHP baut auf früheren Forschungen zur Netzwerkverbergungstechnologie auf und nutzt moderne kryptographische Rahmenwerke und Architektur, um Sicherheit und hohe Leistung zu gewährleisten und die Einschränkungen früherer Technologien zu überwinden.\r\n\r\n| Netzwerk-Infrastruktur-Verbergungsprotokoll | 1. Generation | 2. Generation | 3. Generation |\r\n|:---|:---|:---|:---|\r\n| **Kerntechnologie** | [Port Knocking](https://de.wikipedia.org/wiki/Port_knocking) | [Single Packet Authorization (SPA)](https://cloudsecurityalliance.org/artifacts/software-defined-perimeter-zero-trust-specification-v2) | Netzwerk-Infrastruktur-Verbergungsprotokoll (NHP) |\r\n| **Authentifizierung** | Port-Sequenzen | Geteilte Geheimnisse | Modernes Kryptographie-Rahmenwerk |\r\n| **Architektur** | Kein Kontrollplan | Kein Kontrollplan | Skalierbarer Kontrollplan |\r\n| **Fähigkeit** | Ports verbergen | Ports verbergen | Ports, IPs und Domains verbergen |\r\n| **Zugriffskontrolle** | IP-Ebene | Port-Ebene | Anwendungsebene |\r\n| **Open-Source-Projekte** | [knock](https://github.com/jvinet/knock) *(C)* | [fwknop](https://github.com/mrash/fwknop) *(C++)* | [OpenNHP](https://github.com/OpenNHP/opennhp) *(Go)* |\r\n\r\n> Es ist entscheidend, eine **speichersichere** Sprache wie *Go* für die Entwicklung von OpenNHP zu wählen, wie im [technischen Bericht der US-Regierung](https://www.whitehouse.gov/wp-content/uploads/2024/02/Final-ONCD-Technical-Report.pdf) betont wird. Für einen detaillierten Vergleich zwischen **SPA und NHP** lesen Sie bitte die [Abschnitt unten](#comparison-between-spa-and-nhp).\r\n\r\n## Sicherheitsvorteile\r\n\r\nDa OpenNHP Zero Trust-Prinzipien auf der *OSI-Sitzungsschicht* implementiert, bietet es erhebliche Vorteile:\r\n\r\n- Reduziert die Angriffsfläche durch Verbergen der Infrastruktur\r\n- Verhindert unbefugte Netzwerkaufklärung\r\n- Mildert die Ausnutzung von Schwachstellen\r\n- Verhindert Phishing durch verschlüsseltes DNS\r\n- Schützt vor DDoS-Angriffen\r\n- Ermöglicht granulare Zugriffskontrolle\r\n- Bietet verbindungsbasierte Identitätsverfolgung\r\n- Angriffszurechnung\r\n\r\n## Architektur\r\n\r\nDie Architektur von OpenNHP orientiert sich an der [NIST Zero Trust-Architektur](https://www.nist.gov/publications/zero-trust-architecture). Sie folgt einem modularen Design mit drei Hauptkomponenten: **NHP-Server**, **NHP-AC** und **NHP-Agent**, wie in der folgenden Abbildung dargestellt.\r\n\r\n![OpenNHP Architektur](docs/images/OpenNHP_Arch.png)\r\n\r\n> Weitere Informationen zur Architektur und zum Workflow finden Sie in der [OpenNHP-Dokumentation](https://docs.opennhp.org/).\r\n\r\n## Kern: Kryptographische Algorithmen\r\n\r\nKryptographie steht im Mittelpunkt von OpenNHP und bietet robuste Sicherheit, hervorragende Leistung und Skalierbarkeit durch den Einsatz modernster kryptographischer Algorithmen. Nachfolgend sind die wichtigsten kryptographischen Algorithmen und Frameworks aufgeführt, die von OpenNHP verwendet werden:\r\n\r\n- **[Elliptische Kurvenkryptographie (ECC)](https://de.wikipedia.org/wiki/Elliptische-Kurven-Kryptographie)**: Wird für effiziente asymmetrische Kryptographie verwendet.\r\n\r\n> Im Vergleich zu RSA bietet ECC eine höhere Effizienz mit stärkerer Verschlüsselung bei kürzeren Schlüssellängen, was sowohl die Netzwerkübertragung als auch die Rechenleistung verbessert. Die folgende Tabelle zeigt die Unterschiede in der Sicherheitsstärke, den Schlüssellängen und dem Verhältnis zwischen RSA und ECC sowie die jeweiligen Gültigkeitszeiträume.\r\n\r\n| Sicherheitsstärke (Bits) | DSA/RSA-Schlüssellänge (Bits) | ECC-Schlüssellänge (Bits) | Verhältnis: ECC zu DSA/RSA | Gültigkeit |\r\n|:------------------------:|:-----------------------------:|:------------------------:|:--------------------------:|:---------:|\r\n| 80                       | 1024                          | 160-223                  | 1:6                        | Bis 2010  |\r\n| 112                      | 2048                          | 224-255                  | 1:9                        | Bis 2030  |\r\n| 128                      | 3072                          | 256-383                  | 1:12                       | Nach 2031 |\r\n| 192                      | 7680                          | 384-511                  | 1:20                       |           |\r\n| 256                      | 15360                         | 512+                     | 1:30                       |           |\r\n\r\n- **[Noise Protocol Framework](https://noiseprotocol.org/)**: Ermöglicht sicheren Schlüsselaustausch, Nachrichtenverschlüsselung/-entschlüsselung und gegenseitige Authentifizierung.\r\n\r\n> Das Noise-Protokoll basiert auf dem [Diffie-Hellman-Schlüsselaustausch](https://de.wikipedia.org/wiki/Diffie-Hellman-Schl%C3%BCsselaustausch) und bietet moderne kryptographische Lösungen wie gegenseitige und optionale Authentifizierung, Identitätsverbergung, Vorwärtsgeheimnis und null Round-Trip-Verschlüsselung. Es hat sich bereits durch seine Sicherheit und Leistung bewährt und wird von beliebten Anwendungen wie [WhatsApp](https://www.whatsapp.com/security/WhatsApp-Security-Whitepaper.pdf), [Slack](https://github.com/slackhq/nebula) und [WireGuard](https://www.wireguard.com/) verwendet.\r\n\r\n- **[Identitätsbasierte Kryptographie (IBC)](https://de.wikipedia.org/wiki/Identit%C3%A4tsbasierte_Kryptographie)**: Vereinfacht die Schlüsselverteilung im großen Maßstab.\r\n\r\n> Eine effiziente Schlüsselverteilung ist entscheidend für die Umsetzung von Zero Trust. OpenNHP unterstützt sowohl PKI als auch IBC. Während PKI seit Jahrzehnten weit verbreitet ist, hängt es von zentralisierten Zertifizierungsstellen (CA) zur Identitätsprüfung und Schlüsselverwaltung ab, was zeitaufwändig und kostspielig sein kann. Im Gegensatz dazu ermöglicht IBC einen dezentralisierten und selbstverwalteten Ansatz für die Identitätsprüfung und Schlüsselverwaltung, was es kostengünstiger für die Zero Trust-Umgebung von OpenNHP macht, in der Milliarden von Geräten oder Servern in Echtzeit geschützt und eingebunden werden müssen.\r\n\r\n- **[Zertifikatslose Kryptographie (CL-PKC)](https://de.wikipedia.org/wiki/Zertifikatslose_Kryptographie)**: Empfohlener IBC-Algorithmus\r\n\r\n> CL-PKC ist ein Schema, das die Sicherheit verbessert, indem es die Schlüsselverwaltung vermeidet und die Einschränkungen der identitätsbasierten Kryptographie (IBC) angeht. In den meisten IBC-Systemen wird der private Schlüssel eines Benutzers von einer Schlüsselgenerierungsstelle (KGC) erstellt, was erhebliche Risiken birgt. Ein kompromittierter KGC kann zur Offenlegung der privaten Schlüssel aller Benutzer führen, wodurch volles Vertrauen in den KGC erforderlich ist. CL-PKC mindert dieses Problem, indem der Schlüsselerstellungsprozess aufgeteilt wird, sodass der KGC nur einen Teil des privaten Schlüssels kennt. Dadurch kombiniert CL-PKC die Stärken von PKI und IBC und bietet eine stärkere Sicherheit ohne die Nachteile der zentralisierten Schlüsselverwaltung.\r\n\r\nWeiterführende Informationen:\r\n\r\n> Weitere Details zu den in OpenNHP verwendeten kryptographischen Algorithmen finden Sie in der [OpenNHP-Dokumentation](https://docs.opennhp.org/cryptography/).\r\n\r\n## Hauptfunktionen\r\n\r\n- Mildert die Ausnutzung von Schwachstellen, indem standardmäßig \"deny-all\"-Regeln angewendet werden\r\n- Verhindert Phishing-Angriffe durch verschlüsselte DNS-Auflösung\r\n- Schützt vor DDoS-Angriffen, indem die Infrastruktur verborgen wird\r\n- Ermöglicht Angriffszurechnung durch identitätsbasierte Verbindungen\r\n- Standardmäßig verweigerter Zugriff auf alle geschützten Ressourcen\r\n- Authentifizierung basierend auf Identität und Geräten vor dem Netzwerkzugang\r\n- Verschlüsselte DNS-Auflösung, um DNS-Hijacking zu verhindern\r\n- Verteilte Infrastruktur zur Minderung von DDoS-Angriffen\r\n- Skalierbare Architektur mit entkoppelten Komponenten\r\n- Integration mit bestehenden Systemen zur Verwaltung von Identitäten und Zugriffen\r\n- Unterstützung für verschiedene Bereitstellungsmodelle (Client-zu-Gateway, Client-zu-Server usw.)\r\n- Kryptographisch sicher unter Verwendung moderner Algorithmen (ECC, Noise Protocol, IBC)\r\n\r\n<details>\r\n<summary>Klicken Sie hier, um die Funktionsdetails zu erweitern</summary>\r\n\r\n- **Standardmäßig verweigerter Zugriff**: Alle Ressourcen sind standardmäßig verborgen und werden nur nach Authentifizierung und Autorisierung zugänglich.\r\n- **Authentifizierung basierend auf Identität und Geräten**: Stellt sicher, dass nur bekannte Benutzer auf zugelassenen Geräten Zugriff erhalten.\r\n- **Verschlüsselte DNS-Auflösung**: Verhindert DNS-Hijacking und damit verbundene Phishing-Angriffe.\r\n- **DDoS-Minderung**: Das verteilte Infrastruktursystem hilft beim Schutz vor DDoS-Angriffen.\r\n- **Skalierbare Architektur**: Entkoppelte Komponenten ermöglichen flexiblen Einsatz und Skalierung.\r\n- **IAM-Integration**: Funktioniert mit Ihren bestehenden Systemen zur Verwaltung von Identitäten und Zugriffen.\r\n- **Flexibler Einsatz**: Unterstützt verschiedene Modelle, einschließlich Client-zu-Gateway, Client-zu-Server und mehr.\r\n- **Starke Kryptographie**: Nutzt moderne Algorithmen wie ECC, Noise Protocol und IBC für robuste Sicherheit.\r\n</details>\r\n\r\n## Bereitstellung\r\n\r\nOpenNHP unterstützt mehrere Bereitstellungsmodelle für unterschiedliche Anwendungsfälle:\r\n\r\n- Client-zu-Gateway: Sichert den Zugriff auf mehrere Server hinter einem Gateway\r\n- Client-zu-Server: Sichert direkt einzelne Server/Anwendungen\r\n- Server-zu-Server: Sichert die Kommunikation zwischen Backend-Diensten\r\n- Gateway-zu-Gateway: Sichert Standort-zu-Standort-Verbindungen\r\n\r\n> Weitere Details zur Bereitstellung finden Sie in der [OpenNHP-Dokumentation](https://docs.opennhp.org/deploy/).\r\n\r\n## Vergleich zwischen SPA und NHP\r\nDas Single Packet Authorization (SPA)-Protokoll ist in der vom [Cloud Security Alliance (CSA)](https://cloudsecurityalliance.org/) veröffentlichten [Software Defined Perimeter (SDP)-Spezifikation](https://cloudsecurityalliance.org/artifacts/software-defined-perimeter-zero-trust-specification-v2) enthalten. NHP verbessert die Sicherheit, Zuverlässigkeit, Skalierbarkeit und Erweiterbarkeit durch ein modernes kryptographisches Framework und eine moderne Architektur, wie im [AHAC-Forschungspapier](https://www.mdpi.com/2076-3417/14/13/5593) gezeigt.\r\n\r\n| - | SPA | NHP | Vorteile von NHP |\r\n|:---|:---|:---|:---|\r\n| **Architektur** | Das SPA-Paketentschlüsselungs- und Benutzer-/Geräteauthentifizierungskomponente ist mit der Netzwerkzugriffskontrollkomponente im SPA-Server gekoppelt. | NHP-Server (die Paketentschlüsselungs- und Benutzer-/Geräteauthentifizierungskomponente) und NHP-AC (die Zugriffskontrollkomponente) sind entkoppelt. Der NHP-Server kann auf separaten Hosts bereitgestellt werden und unterstützt horizontale Skalierung. | <ul><li>Performance: Die ressourcenintensive Komponente NHP-Server ist vom geschützten Server getrennt.</li><li>Skalierbarkeit: Der NHP-Server kann im verteilten oder Cluster-Modus bereitgestellt werden.</li><li>Sicherheit: Die IP-Adresse des geschützten Servers ist für den Client nicht sichtbar, solange die Authentifizierung nicht erfolgreich war.</li></ul>|\r\n| **Kommunikation** | Einfache Richtung | Bidirektional | Bessere Zuverlässigkeit durch Statusbenachrichtigung der Zugriffskontrolle |\r\n| **Kryptographisches Framework** | Geteilte Geheimnisse | PKI oder IBC, Noise Framework | <ul><li>Sicherheit: Bewährter Schlüsselvereinbarungsmechanismus zur Abschwächung von MITM-Bedrohungen</li><li>Niedrige Kosten: Effiziente Schlüsselverteilung für das Zero Trust-Modell</li><li>Performance: Hochleistungs-Verschlüsselung/Entschlüsselung</li></ul>|\r\n| **Fähigkeit zur Verbergung der Netzwerkinfrastruktur** | Nur Serverports | Domains, IPs und Ports | Stärker gegen verschiedene Angriffe (z.B. Schwachstellen, DNS-Hijacking und DDoS-Angriffe) |\r\n| **Erweiterbarkeit** | Keine, nur für SDP | Universell | Unterstützt jedes Szenario, das eine Dienstverschleierung erfordert |\r\n| **Interoperabilität** | Nicht verfügbar | Anpassbar | NHP kann nahtlos mit bestehenden Protokollen (z.B. DNS, FIDO usw.) integriert werden |\r\n\r\n## Beitrag leisten\r\n\r\nWir begrüßen Beiträge zu OpenNHP! Bitte lesen Sie unsere [Beitragsrichtlinien](CONTRIBUTING.md), um mehr darüber zu erfahren, wie Sie sich beteiligen können.\r\n\r\n## Lizenz\r\n\r\nOpenNHP wird unter der [Apache 2.0-Lizenz](LICENSE) veröffentlicht.\r\n\r\n## Kontakt\r\n\r\n- Projekt-Website: [https://github.com/OpenNHP/opennhp](https://github.com/OpenNHP/opennhp)\r\n- E-Mail: [opennhp@gmail.com](mailto:opennhp@gmail.com)\r\n- Discord: [Treten Sie unserem Discord bei](https://discord.gg/CpyVmspx5x)\r\n\r\nFür eine detaillierte Dokumentation besuchen Sie bitte unsere [Offizielle Dokumentation](https://opennhp.org).\r\n\r\n## Referenzen\r\n\r\n- [Software-Defined Perimeter (SDP) Specification v2.0](https://cloudsecurityalliance.org/artifacts/software-defined-perimeter-zero-trust-specification-v2). Jason Garbis, Juanita Koilpillai, Junaid lslam, Bob Flores, Daniel Bailey, Benfeng Chen, Eitan Bremler, Michael Roza, Ahmed Refaey Hussein. [*Cloud Security Alliance (CSA)*](https://cloudsecurityalliance.org/). März 2022.\r\n- [AHAC: Fortschrittliches Netzwerk-Verbergung-Zugriffskontroll-Framework](https://www.mdpi.com/2076-3417/14/13/5593). Mudi Xu, Benfeng Chen, Zhizhong Tan, Shan Chen, Lei Wang, Yan Liu, Tai Io San, Sou Wang Fong, Wenyong Wang und Jing Feng. *Zeitschrift für Angewandte Wissenschaften*. Juni 2024.\r\n- [STALE: Ein skalierbares und sicheres grenzüberschreitendes Authentifizierungssystem, das E-Mail und ECDH-Schlüsselaustausch nutzt](https://www.mdpi.com/2079-9292/14/12/2399) Jiexin Zheng, Mudi Xu, Jianqing Li, Benfeng Chen, Zhizhong Tan, Anyu Wang, Shuo Zhang, Yan Liu, Kevin Qi Zhang, Lirong Zheng, Wenyong Wang. *Elektronik*. Juni 2025\r\n- [DRL-AMIR: Intelligent Flow Scheduling für Software-Defined Zero Trust Networks](https://www.techscience.com/cmc/v84n2/62920). Wenlong Ke, Zilong Li, Peiyu Chen, Benfeng Chen, Jinglin Lv, Qiang Wang, Ziyi Jia und Shigen Shen. *CMC*. Juli 2025.\r\n- [auf tiefe zu lernen NHP netzwerke den kontrolle zu](https://www.nature.com/articles/s41598-025-31556-3). Qinglin Huang, Zhizhong Tan, Qiang Wang, Ziyi Jia und Benfeng Chen. *Wissenschaftliche Berichte der Zeitschrift Nature* dezember 2025.\r\n- Noise Protocol Framework. https://noiseprotocol.org/\r\n- Vulnerability Management Framework-Projekt. https://phoenix.security/web-vuln-management/\r\n\r\n---\r\n\r\n🌟 Vielen Dank für Ihr Interesse an OpenNHP! Wir freuen uns auf Ihre Beiträge und Ihr Feedback.\r\n\r\n"
  },
  {
    "path": "README.es.md",
    "content": "[![en](https://img.shields.io/badge/lang-en-green.svg)](https://github.com/OpenNHP/opennhp/blob/master/README.md)\r\n[![zh-cn](https://img.shields.io/badge/lang-zh--cn-green.svg)](https://github.com/OpenNHP/opennhp/blob/master/README.zh-cn.md)\r\n[![de](https://img.shields.io/badge/lang-de-green.svg)](https://github.com/OpenNHP/opennhp/blob/master/README.de.md)\r\n[![ja](https://img.shields.io/badge/lang-ja-green.svg)](https://github.com/OpenNHP/opennhp/blob/master/README.ja.md)\r\n[![fr](https://img.shields.io/badge/lang-fr-green.svg)](https://github.com/OpenNHP/opennhp/blob/master/README.fr.md)\r\n[![es](https://img.shields.io/badge/lang-es-green.svg)](https://github.com/OpenNHP/opennhp/blob/master/README.es.md)\r\n\r\n![Logo OpenNHP](docs/images/logo11.png)\r\n# OpenNHP: Protocolo de Ocultación de Infraestructura de Red Zero Trust\r\nUn protocolo de red de confianza cero impulsado por criptografía en la capa 5 del modelo OSI para ocultar su servidor y sus datos de los atacantes.\r\n\r\n![Estado de Construcción](https://img.shields.io/badge/build-passing-brightgreen)\r\n![Versión](https://img.shields.io/badge/version-1.0.0-blue)\r\n![Licencia](https://img.shields.io/badge/license-Apache%202.0-green)\r\n\r\n---\r\n\r\n## Desafío: La IA transforma Internet en un \"Bosque Oscuro\"\r\n\r\nEl rápido avance de las tecnologías de **IA**, especialmente los grandes modelos de lenguaje (LLM), está transformando significativamente el panorama de la ciberseguridad. El surgimiento de la **Explotación Autónoma de Vulnerabilidades (AVE)** representa un gran avance en la era de la IA, al automatizar la explotación de vulnerabilidades, como se muestra en [este artículo de investigación](https://arxiv.org/abs/2404.08144). Este desarrollo aumenta significativamente el riesgo para todos los servicios de red expuestos, evocando la [Hipótesis del Bosque Oscuro](https://es.wikipedia.org/wiki/Hip%C3%B3tesis_del_bosque_oscuro) en Internet. Las herramientas impulsadas por IA escanean continuamente el entorno digital, identifican rápidamente las debilidades y las explotan. Como resultado, Internet está evolucionando hacia un **\"bosque oscuro\"** donde **la visibilidad equivale a vulnerabilidad**.\r\n\r\n![Riesgos de Vulnerabilidad](docs/images/Vul_Risks.png)\r\n\r\nLa investigación de Gartner pronostica un [rápido aumento de los ciberataques impulsados por IA](https://www.gartner.com/en/newsroom/press-releases/2024-08-28-gartner-forecasts-global-information-security-spending-to-grow-15-percent-in-2025). Este cambio de paradigma requiere una reevaluación de las estrategias tradicionales de ciberseguridad, con un enfoque en defensas proactivas, mecanismos de respuesta rápida y la adopción de tecnologías de ocultación de red para proteger la infraestructura crítica.\r\n\r\n---\r\n\r\n## Demostración rápida: Ver OpenNHP en acción\r\n\r\nAntes de profundizar en los detalles de OpenNHP, comencemos con una breve demostración de cómo OpenNHP protege un servidor del acceso no autorizado. Puede verlo en acción accediendo al servidor protegido en https://acdemo.opennhp.org.\r\n\r\n### 1) El servidor protegido es \"invisible\" para los usuarios no autenticados\r\n\r\nPor defecto, cualquier intento de conectar con el servidor protegido resultará en un error TIME OUT, ya que todos los puertos están cerrados, haciendo que el servidor parezca *\"invisible\"* y efectivamente fuera de línea.\r\n\r\n![Demostración de OpenNHP](docs/images/OpenNHP_ACDemo0.png)\r\n\r\nEl escaneo de puertos del servidor también devolverá un error TIME OUT.\r\n\r\n![Demostración de OpenNHP](docs/images/OpenNHP_ScanDemo.png)\r\n\r\n### 2) Después de la autenticación, el servidor protegido se vuelve accesible\r\n\r\nOpenNHP admite una variedad de métodos de autenticación, como OAuth, SAML, códigos QR, y más. Para esta demostración, utilizamos un servicio de autenticación básica de nombre de usuario/contraseña en https://demologin.opennhp.org.\r\n\r\n![Demostración de OpenNHP](docs/images/OpenNHP_DemoLogin.png)\r\n\r\nUna vez que haga clic en el botón \"Login\", la autenticación se completará con éxito y será redirigido al servidor protegido. En ese momento, el servidor se vuelve *\"visible\"* y accesible en su dispositivo.\r\n\r\n![Demostración de OpenNHP](docs/images/OpenNHP_ACDemo1.png)\r\n\r\n---\r\n\r\n## Visín: Hacer de Internet un lugar confiable\r\n\r\nLa apertura de los protocolos TCP/IP ha impulsado el crecimiento explosivo de las aplicaciones de Internet, pero también ha expuesto vulnerabilidades, permitiendo que actores malintencionados obtengan acceso no autorizado y exploten cualquier dirección IP expuesta. Aunque el [modelo de red OSI](https://es.wikipedia.org/wiki/Modelo_OSI) define la *capa 5 (capa de sesión)* para la gestión de conexiones, pocas soluciones efectivas se han implementado para abordar este problema.\r\n\r\n**NHP**, o el **\"Protocolo de Ocultación de la Infraestructura de Red\"**, es un protocolo de red ligero y basado en criptografía Zero Trust, diseñado para funcionar en la *capa de sesión OSI*, óptimo para gestionar la visibilidad y las conexiones de la red. El objetivo principal de NHP es ocultar los recursos protegidos de entidades no autorizadas, otorgando acceso solo a los usuarios verificados y autorizados mediante una verificación continua, contribuyendo así a un Internet más confiable.\r\n\r\n![Internet confiable](docs/images/TrustworthyCyberspace.png)\r\n\r\n---\r\n\r\n## Solución: OpenNHP restablece el control de la visibilidad de la red\r\n\r\n**OpenNHP** es la implementación de código abierto del protocolo NHP. Está impulsado por criptografía y diseñado con principios de seguridad en primer lugar, implementando una verdadera arquitectura de confianza cero en la *capa de sesión OSI*.\r\n\r\n![OpenNHP como la capa 5 del OSI](docs/images/OSI_OpenNHP.png)\r\n\r\nOpenNHP se basa en investigaciones anteriores sobre tecnología de ocultación de redes, utilizando un marco criptográfico moderno y una arquitectura que garantiza seguridad y alto rendimiento, superando las limitaciones de tecnologías anteriores.\r\n\r\n| Protocolo de Ocultación de Infraestructura de Red | 1ª Generación | 2ª Generación | 3ª Generación |\r\n|:---|:---|:---|:---|\r\n| **Tecnología Clave** | [Port Knocking](https://es.wikipedia.org/wiki/Port_knocking) | [Single Packet Authorization (SPA)](https://cloudsecurityalliance.org/artifacts/software-defined-perimeter-zero-trust-specification-v2) | Protocolo de Ocultación de Infraestructura de Red (NHP) |\r\n| **Autenticación** | Secuencias de puertos | Secretos compartidos | Marco Criptográfico Moderno |\r\n| **Arquitectura** | Sin plano de control | Sin plano de control | Plano de control escalable |\r\n| **Capacidad** | Ocultar puertos | Ocultar puertos | Ocultar puertos, IPs y dominios |\r\n| **Control de Acceso** | Nivel IP | Nivel de Puertos | Nivel de Aplicación |\r\n| **Proyectos de Código Abierto** | [knock](https://github.com/jvinet/knock) *(C)* | [fwknop](https://github.com/mrash/fwknop) *(C++)* | [OpenNHP](https://github.com/OpenNHP/opennhp) *(Go)* |\r\n\r\n> Es crucial elegir un lenguaje **seguro para la memoria** como *Go* para el desarrollo de OpenNHP, como se destaca en el [informe técnico del gobierno de los EE.UU.](https://www.whitehouse.gov/wp-content/uploads/2024/02/Final-ONCD-Technical-Report.pdf). Para una comparación detallada entre **SPA y NHP**, consulte la [sección a continuación](#comparison-between-spa-and-nhp).\r\n\r\n## Beneficios de Seguridad\r\n\r\nDado que OpenNHP implementa los principios de confianza cero en la *capa de sesión OSI*, ofrece beneficios significativos:\r\n\r\n- Reduce la superficie de ataque ocultando la infraestructura\r\n- Evita el reconocimiento no autorizado de la red\r\n- Mitiga la explotación de vulnerabilidades\r\n- Previene ataques de phishing mediante DNS cifrado\r\n- Protege contra ataques DDoS\r\n- Permite el control de acceso granular\r\n- Proporciona seguimiento de conexiones basado en identidad\r\n- Atribución de ataques\r\n\r\n## Arquitectura\r\n\r\nLa arquitectura de OpenNHP se inspira en el [estándar de Arquitectura de Confianza Cero del NIST](https://www.nist.gov/publications/zero-trust-architecture). Sigue un diseño modular con los tres componentes principales: **NHP-Server**, **NHP-AC** y **NHP-Agent**, como se ilustra en el siguiente diagrama.\r\n\r\n![Arquitectura de OpenNHP](docs/images/OpenNHP_Arch.png)\r\n\r\n> Consulte la [documentación de OpenNHP](https://docs.opennhp.org/) para obtener información detallada sobre la arquitectura y el flujo de trabajo.\r\n\r\n## Centro: Algoritmos Criptográficos\r\n\r\nLa criptografía es el centro de OpenNHP, proporcionando seguridad robusta, un excelente rendimiento y escalabilidad mediante el uso de algoritmos criptográficos de vanguardia. A continuación se muestran los principales algoritmos y marcos criptográficos utilizados por OpenNHP:\r\n\r\n- **[Criptografía de Curva Elíptica (ECC)](https://es.wikipedia.org/wiki/Criptograf%C3%ADa_de_curva_el%C3%ADptica)**: Utilizada para criptografía asimétrica eficiente.\r\n\r\n> En comparación con RSA, ECC ofrece una mayor eficiencia con una encriptación más fuerte en longitudes de clave más cortas, mejorando tanto la transmisión en la red como el rendimiento computacional. La tabla a continuación muestra las diferencias en la fortaleza de la seguridad, las longitudes de clave y la proporción de longitud de clave entre RSA y ECC, junto con sus respectivos períodos de validez.\r\n\r\n| Fortaleza de Seguridad (bits) | Longitud de Clave DSA/RSA (bits) | Longitud de Clave ECC (bits) | Relación: ECC vs. DSA/RSA | Validez |\r\n|:----------------------------:|:-------------------------------:|:---------------------------:|:--------------------------:|:-------:|\r\n| 80                           | 1024                            | 160-223                     | 1:6                        | Hasta 2010 |\r\n| 112                          | 2048                            | 224-255                     | 1:9                        | Hasta 2030 |\r\n| 128                          | 3072                            | 256-383                     | 1:12                       | Después de 2031 |\r\n| 192                          | 7680                            | 384-511                     | 1:20                       | |\r\n| 256                          | 15360                           | 512+                        | 1:30                       | |\r\n\r\n- **[Marco de Protocolo Noise](https://noiseprotocol.org/)**: Permite el intercambio seguro de claves, el cifrado/descifrado de mensajes y la autenticación mutua.\r\n\r\n> El Protocolo Noise se basa en el [acuerdo de clave Diffie-Hellman](https://es.wikipedia.org/wiki/Intercambio_de_claves_Diffie-Hellman) y proporciona soluciones criptográficas modernas como la autenticación mutua y opcional, el ocultamiento de identidad, la confidencialidad directa y el cifrado de ida y vuelta. Probado por su seguridad y rendimiento, ya es utilizado por aplicaciones populares como [WhatsApp](https://www.whatsapp.com/security/WhatsApp-Security-Whitepaper.pdf), [Slack](https://github.com/slackhq/nebula) y [WireGuard](https://www.wireguard.com/).\r\n\r\n- **[Criptografía Basada en Identidad (IBC)](https://es.wikipedia.org/wiki/Criptograf%C3%ADa_basada_en_la_identidad)**: Simplifica la distribución de claves a escala.\r\n\r\n> Una distribución eficiente de claves es esencial para implementar Zero Trust. OpenNHP admite tanto PKI como IBC. Mientras que PKI se ha utilizado ampliamente durante décadas, depende de Autoridades Certificadoras (CA) centralizadas para la verificación de identidad y la gestión de claves, lo que puede ser costoso y llevar tiempo. En contraste, IBC permite un enfoque descentralizado y autogestionado para la verificación de identidad y la gestión de claves, haciéndolo más rentable para el entorno Zero Trust de OpenNHP, donde miles de millones de dispositivos o servidores pueden necesitar protección e integración en tiempo real.\r\n\r\n- **[Criptografía sin Certificados (CL-PKC)](https://es.wikipedia.org/wiki/Criptograf%C3%ADa_sin_certificado)**: Algoritmo IBC recomendado\r\n\r\n> CL-PKC es un esquema que mejora la seguridad al evitar la custodia de claves y abordar las limitaciones de la Criptografía Basada en Identidad (IBC). En la mayoría de los sistemas IBC, la clave privada de un usuario es generada por un Centro de Generación de Claves (KGC), lo cual conlleva riesgos significativos. Un KGC comprometido puede llevar a la exposición de todas las claves privadas de los usuarios, requiriendo plena confianza en el KGC. CL-PKC mitiga este problema dividiendo el proceso de generación de claves, de modo que el KGC solo tiene conocimiento de una clave privada parcial. Como resultado, CL-PKC combina las fortalezas de PKI e IBC, ofreciendo una mayor seguridad sin los inconvenientes de la gestión centralizada de claves.\r\n\r\nLectura adicional:\r\n\r\n> Consulte la [documentación de OpenNHP](https://docs.opennhp.org/cryptography/) para una explicación detallada de los algoritmos criptográficos utilizados en OpenNHP.\r\n\r\n## Características Clave\r\n\r\n- Mitiga la explotación de vulnerabilidades mediante la aplicación de reglas \"denegar todo\" por defecto\r\n- Previene ataques de phishing mediante la resolución DNS cifrada\r\n- Protege contra ataques DDoS ocultando la infraestructura\r\n- Permite la atribución de ataques mediante conexiones basadas en identidad\r\n- Control de acceso predeterminado para todos los recursos protegidos\r\n- Autenticación basada en identidad y dispositivos antes del acceso a la red\r\n- Resolución DNS cifrada para prevenir secuestro de DNS\r\n- Infraestructura distribuida para mitigar ataques DDoS\r\n- Arquitectura escalable con componentes desacoplados\r\n- Integración con sistemas de gestión de identidades y accesos existentes\r\n- Compatible con varios modelos de despliegue (cliente a puerta de enlace, cliente a servidor, etc.)\r\n- Seguridad criptográfica con algoritmos modernos (ECC, Noise Protocol, IBC)\r\n\r\n<details>\r\n<summary>Haga clic para expandir los detalles de las características</summary>\r\n\r\n- **Control de acceso predeterminado**: Todos los recursos están ocultos por defecto, solo siendo accesibles tras la autenticación y autorización.\r\n- **Autenticación basada en identidad y dispositivos**: Garantiza que solo los usuarios conocidos en dispositivos aprobados puedan acceder.\r\n- **Resolución DNS cifrada**: Evita el secuestro de DNS y los ataques de phishing asociados.\r\n- **Mitigación de DDoS**: El diseño de infraestructura distribuida ayuda a proteger contra los ataques de denegación de servicio distribuidos.\r\n- **Arquitectura escalable**: Los componentes desacoplados permiten un despliegue y escalado flexibles.\r\n- **Integración IAM**: Funciona con sus sistemas de gestión de identidades y accesos existentes.\r\n- **Despliegue flexible**: Compatible con varios modelos, incluido cliente a puerta de enlace, cliente a servidor y más.\r\n- **Criptografía robusta**: Utiliza algoritmos modernos como ECC, Noise Protocol e IBC para una seguridad robusta.\r\n</details>\r\n\r\n## Despliegue\r\n\r\nOpenNHP admite varios modelos de despliegue para adaptarse a diferentes casos de uso:\r\n\r\n- Cliente a puerta de enlace: Asegura el acceso a varios servidores detrás de una puerta de enlace\r\n- Cliente a servidor: Asegura directamente servidores/aplicaciones individuales\r\n- Servidor a servidor: Asegura la comunicación entre servicios backend\r\n- Puerta de enlace a puerta de enlace: Asegura conexiones entre sitios\r\n\r\n> Consulte la [documentación de OpenNHP](https://docs.opennhp.org/deploy/) para obtener instrucciones detalladas de despliegue.\r\n\r\n## Comparación entre SPA y NHP\r\nEl protocolo Single Packet Authorization (SPA) está incluido en la [especificación del Perímetro Definido por Software (SDP)](https://cloudsecurityalliance.org/artifacts/software-defined-perimeter-zero-trust-specification-v2) publicada por la [Cloud Security Alliance (CSA)](https://cloudsecurityalliance.org/). NHP mejora la seguridad, la fiabilidad, la escalabilidad y la extensibilidad mediante un marco criptográfico moderno y una arquitectura moderna, como se demuestra en el [artículo de investigación AHAC](https://www.mdpi.com/2076-3417/14/13/5593).\r\n\r\n| - | SPA | NHP | Ventajas de NHP |\r\n|:---|:---|:---|:---|\r\n| **Arquitectura** | El componente de descifrado de paquetes SPA y autenticación de usuario/dispositivo está acoplado con el componente de control de acceso a la red en el servidor SPA. | NHP-Server (el componente de descifrado de paquetes y autenticación de usuario/dispositivo) y NHP-AC (el componente de control de acceso) están desacoplados. NHP-Server se puede desplegar en hosts separados y admite la escalabilidad horizontal. | <ul><li>Rendimiento: el componente que consume muchos recursos, NHP-server, está separado del servidor protegido.</li><li>Escalabilidad: NHP-server se puede desplegar en modo distribuido o clúster.</li><li>Seguridad: la dirección IP del servidor protegido no es visible para el cliente a menos que la autenticación sea exitosa.</li></ul>|\r\n| **Comunicación** | Dirección única | Bidireccional | Mejor fiabilidad con la notificación de estado del control de acceso |\r\n| **Marco criptográfico** | Secretos compartidos | PKI o IBC, Marco Noise | <ul><li>Seguridad: mecanismo comprobado de intercambio de claves para mitigar las amenazas MITM</li><li>Bajo costo: distribución de claves eficiente para el modelo de confianza cero</li><li>Rendimiento: cifrado/descifrado de alto rendimiento</li></ul>|\r\n| **Capacidad de Ocultación de Infraestructura de Red** | Solo puertos de servidor | Dominios, IPs y puertos | Más poderoso contra varios ataques (p. ej., vulnerabilidades, secuestro de DNS y ataques DDoS) |\r\n| **Extensibilidad** | Ninguna, solo para SDP | Todo uso | Compatible con cualquier escenario que necesite oscurecimiento del servicio |\r\n| **Interoperabilidad** | No disponible | Personalizable | NHP puede integrarse sin problemas con protocolos existentes (p. ej., DNS, FIDO, etc.) |\r\n\r\n## Contribuir\r\n\r\n¡Damos la bienvenida a las contribuciones a OpenNHP! Consulte nuestras [Directrices de Contribución](CONTRIBUTING.md) para obtener más información sobre cómo participar.\r\n\r\n## Licencia\r\n\r\nOpenNHP se publica bajo la [Licencia Apache 2.0](LICENSE).\r\n\r\n## Contacto\r\n\r\n- Sitio web del proyecto: [https://github.com/OpenNHP/opennhp](https://github.com/OpenNHP/opennhp)\r\n- Correo electrónico: [opennhp@gmail.com](mailto:opennhp@gmail.com)\r\n- Discord: [Únase a nuestro Discord](https://discord.gg/CpyVmspx5x)\r\n\r\nPara obtener una documentación más detallada, visite nuestra [Documentación Oficial](https://opennhp.org).\r\n\r\n## Referencias\r\n\r\n- [Especificación del Perímetro Definido por Software (SDP) v2.0](https://cloudsecurityalliance.org/artifacts/software-defined-perimeter-zero-trust-specification-v2). Jason Garbis, Juanita Koilpillai, Junaid lslam, Bob Flores, Daniel Bailey, Benfeng Chen, Eitan Bremler, Michael Roza, Ahmed Refaey Hussein. [*Cloud Security Alliance (CSA)*](https://cloudsecurityalliance.org/). Marzo 2022.\r\n- [AHAC: Marco Avanzado de Control de Acceso Oculto en Red](https://www.mdpi.com/2076-3417/14/13/5593). Mudi Xu, Benfeng Chen, Zhizhong Tan, Shan Chen, Lei Wang, Yan Liu, Tai Io San, Sou Wang Fong, Wenyong Wang y Jing Feng. *Revista de Ciencias Aplicadas*. Junio 2024.\r\n- [STALE: Un esquema de autenticación transfronteriza escalable y seguro aprovechando el correo electrónico y el intercambio de claves ECDH](https://www.mdpi.com/2079-9292/14/12/2399) Jiexin Zheng, Mudi Xu, Jianqing Li, Benfeng Chen, Zhizhong Tan, Anyu Wang, Shuo Zhang, Yan Liu, Kevin Qi Zhang, Lirong Zheng, Wenyong Wang. *electrónica*. Junio 2025.\r\n- [DRL-AMIR: Programación de flujo inteligente para redes de confianza cero definidas por software](https://www.techscience.com/cmc/v84n2/62920). WenLong Ke, Zilong Li, Peiyu Chen, Benfeng Chen, Jinglin Lv, Qiang Wang, Ziyi Jia y Shigen Shen. *CMC* julio de 2025.\r\n- [método de control de tráfico de red de NHP basado en aprendizaje de refuerzo profundo](https://www.nature.com/articles/s41598-025-31556-3). Qinglin Huang, Zhizhong Tan, Qiang Wang, Ziyi Jia y Benfeng Chen.*Informes científicos de la revista Nature* diciembre de 2025.\r\n- Noise Protocol Framework. https://noiseprotocol.org/\r\n- Proyecto de Marco de Gestión de Vulnerabilidades. https://phoenix.security/web-vuln-management/\r\n\r\n---\r\n\r\n🌟 ¡Gracias por su interés en OpenNHP! Esperamos sus contribuciones y comentarios.\r\n\r\n"
  },
  {
    "path": "README.fr.md",
    "content": "[![en](https://img.shields.io/badge/lang-en-green.svg)](https://github.com/OpenNHP/opennhp/blob/master/README.md)\r\n[![zh-cn](https://img.shields.io/badge/lang-zh--cn-green.svg)](https://github.com/OpenNHP/opennhp/blob/master/README.zh-cn.md)\r\n[![de](https://img.shields.io/badge/lang-de-green.svg)](https://github.com/OpenNHP/opennhp/blob/master/README.de.md)\r\n[![ja](https://img.shields.io/badge/lang-ja-green.svg)](https://github.com/OpenNHP/opennhp/blob/master/README.ja.md)\r\n[![fr](https://img.shields.io/badge/lang-fr-green.svg)](https://github.com/OpenNHP/opennhp/blob/master/README.fr.md)\r\n[![es](https://img.shields.io/badge/lang-es-green.svg)](https://github.com/OpenNHP/opennhp/blob/master/README.es.md)\r\n\r\n![Logo OpenNHP](docs/images/logo11.png)\r\n# OpenNHP : Protocole de Masquage de l'Infrastructure Réseau en Zéro Confiance\r\nUn protocole réseau de zéro confiance, basé sur la cryptographie, au niveau 5 du modèle OSI, permettant de cacher votre serveur et vos données des attaquants.\r\n\r\n![Statut de Construction](https://img.shields.io/badge/build-passing-brightgreen)\r\n![Version](https://img.shields.io/badge/version-1.0.0-blue)\r\n![Licence](https://img.shields.io/badge/license-Apache%202.0-green)\r\n\r\n---\r\n\r\n## Défi : L'IA transforme Internet en une \"Forêt Sombre\"\r\n\r\nL'avancement rapide des technologies d'**IA**, en particulier les grands modèles de langage (LLM), transforme de manière significative le paysage de la cybersécurité. L'émergence de l'**exploitation autonome des vulnérabilités (AVE)** représente un bond majeur dans l'ère de l'IA, automatisant l'exploitation des vulnérabilités, comme le montre [cet article de recherche](https://arxiv.org/abs/2404.08144). Ce développement augmente de manière significative le risque pour tous les services réseau exposés, évoquant l'hypothèse de la [forêt sombre](https://fr.wikipedia.org/wiki/For%C3%AAt_sombre) sur Internet. Les outils pilotés par l'IA scannent continuellement l'environnement numérique, identifiant rapidement les faiblesses et les exploitant. Ainsi, Internet devient une **\"forêt sombre\"** où **la visibilité équivaut à la vulnérabilité**.\r\n\r\n![Risques de Vulnérabilité](docs/images/Vul_Risks.png)\r\n\r\nSelon les recherches de Gartner, les [cyberattaques pilotées par l'IA vont augmenter rapidement](https://www.gartner.com/en/newsroom/press-releases/2024-08-28-gartner-forecasts-global-information-security-spending-to-grow-15-percent-in-2025). Ce paradigme en évolution impose une réévaluation des stratégies de cybersécurité traditionnelles, avec un accent sur les défenses proactives, des mécanismes de réponse rapide, et l'adoption de technologies de masquage réseau pour protéger les infrastructures critiques.\r\n\r\n---\r\n\r\n## Démo rapide : Voir OpenNHP en action\r\n\r\nAvant de plonger dans les détails d'OpenNHP, commençons par une démonstration rapide de la façon dont OpenNHP protège un serveur contre les accès non autorisés. Vous pouvez le voir en action en accédant au serveur protégé à l'adresse suivante : https://acdemo.opennhp.org.\r\n\r\n### 1) Le serveur protégé est \"invisible\" aux utilisateurs non authentifiés\r\n\r\nPar défaut, toute tentative de connexion au serveur protégé résultera en une erreur de TYPE OUT, car tous les ports sont fermés, rendant le serveur *\"invisible\"* et apparemment hors ligne.\r\n\r\n![Démo OpenNHP](docs/images/OpenNHP_ACDemo0.png)\r\n\r\nLe scan des ports du serveur retournera également une erreur de TYPE OUT.\r\n\r\n![Démo OpenNHP](docs/images/OpenNHP_ScanDemo.png)\r\n\r\n### 2) Après authentification, le serveur protégé devient accessible\r\n\r\nOpenNHP supporte une variété de méthodes d'authentification, telles que OAuth, SAML, QR codes, et plus encore. Pour cette démonstration, nous utilisons un service d'authentification basé sur un nom d'utilisateur/mot de passe simple à l'adresse https://demologin.opennhp.org.\r\n\r\n![Démo OpenNHP](docs/images/OpenNHP_DemoLogin.png)\r\n\r\nUne fois que vous cliquez sur le bouton \"Login\", l'authentification est réussie, et vous êtes redirigé vers le serveur protégé. Le serveur devient alors *\"visible\"* et accessible sur votre appareil.\r\n\r\n![Démo OpenNHP](docs/images/OpenNHP_ACDemo1.png)\r\n\r\n---\r\n\r\n## Vision : Faire d'Internet un espace de confiance\r\n\r\nL'ouverture des protocoles TCP/IP a stimulé la croissance des applications Internet, mais a aussi exposé des vulnérabilités, permettant aux acteurs malveillants d'accéder de manière non autorisée à toute adresse IP exposée. Bien que le [modèle réseau OSI](https://fr.wikipedia.org/wiki/Mod%C3%A8le_OSI) définisse la *couche 5 (couche session)* pour la gestion des connexions, peu de solutions efficaces ont été mises en place à cet égard.\r\n\r\n**NHP**, ou **\"Protocole de Masquage de l'Infrastructure Réseau\"**, est un protocole réseau de zéro confiance, basé sur la cryptographie, conçu pour fonctionner au *niveau de la couche session OSI*, idéal pour gérer la visibilité réseau et les connexions. L'objectif principal de NHP est de dissimuler les ressources protégées des entités non autorisées, accordant l'accès uniquement aux utilisateurs vérifiés et autorisés par une vérification continue, contribuant ainsi à un Internet plus digne de confiance.\r\n\r\n![Internet de Confiance](docs/images/TrustworthyCyberspace.png)\r\n\r\n---\r\n\r\n## Solution : OpenNHP rétablit le contrôle de la visibilité réseau\r\n\r\n**OpenNHP** est l'implémentation open source du protocole NHP. Il est basé sur la cryptographie et conçu avec des principes de sécurité en priorité, implémentant une véritable architecture de zéro confiance au *niveau de la couche session OSI*.\r\n\r\n![OpenNHP en tant que couche 5 OSI](docs/images/OSI_OpenNHP.png)\r\n\r\nOpenNHP s'appuie sur des recherches antérieures sur la technologie de masquage réseau, en utilisant des cadres et une architecture modernes de cryptographie pour garantir la sécurité et des performances élevées, surmontant ainsi les limitations des technologies précédentes.\r\n\r\n| Protocole de Masquage de l'Infrastructure | 1ère Génération | 2ème Génération | 3ème Génération |\r\n|:---|:---|:---|:---|\r\n| **Technologie Clé** | [Port Knocking](https://fr.wikipedia.org/wiki/Port_knocking) | [Autorisation par Paquet Unique (SPA)](https://cloudsecurityalliance.org/artifacts/software-defined-perimeter-zero-trust-specification-v2) | Protocole de Masquage de l'Infrastructure Réseau (NHP) |\r\n| **Authentification** | Séquences de ports | Secrets partagés | Cadre cryptographique moderne |\r\n| **Architecture** | Pas de plan de contrôle | Pas de plan de contrôle | Plan de contrôle scalable |\r\n| **Capacité** | Masquer les ports | Masquer les ports | Masquer les ports, IPs et domaines |\r\n| **Contrôle d'Accès** | Niveau IP | Niveau Port | Niveau Application |\r\n| **Projets Open Source** | [knock](https://github.com/jvinet/knock) *(C)* | [fwknop](https://github.com/mrash/fwknop) *(C++)* | [OpenNHP](https://github.com/OpenNHP/opennhp) *(Go)* |\r\n\r\n> Il est crucial de choisir un langage **sûr pour la mémoire** comme *Go* pour le développement d'OpenNHP, comme le souligne le [rapport technique du gouvernement des États-Unis](https://www.whitehouse.gov/wp-content/uploads/2024/02/Final-ONCD-Technical-Report.pdf). Pour une comparaison détaillée entre **SPA et NHP**, référez-vous à la [section ci-dessous](#comparison-between-spa-and-nhp).\r\n\r\n## Bénéfices en matière de sécurité\r\n\r\nPuisqu'OpenNHP implémente les principes de zéro confiance au *niveau de la couche session OSI*, il offre des avantages significatifs :\r\n\r\n- Réduit la surface d'attaque en cachant l'infrastructure\r\n- Empêche la reconnaissance réseau non autorisée\r\n- Atténue l'exploitation des vulnérabilités\r\n- Empêche le phishing via DNS chiffré\r\n- Protège contre les attaques DDoS\r\n- Permet un contrôle d'accès granulaire\r\n- Fournit un suivi des connexions basé sur l'identité\r\n- Attribution des attaques\r\n\r\n## Architecture\r\n\r\nL'architecture d'OpenNHP s'inspire de la [norme d'architecture Zero Trust du NIST](https://www.nist.gov/publications/zero-trust-architecture). Elle suit une conception modulaire avec trois composants principaux : **NHP-Server**, **NHP-AC** et **NHP-Agent**, comme illustré dans le diagramme ci-dessous.\r\n\r\n![Architecture OpenNHP](docs/images/OpenNHP_Arch.png)\r\n\r\n> Veuillez consulter la [documentation d'OpenNHP](https://docs.opennhp.org/) pour des informations détaillées sur l'architecture et le flux de travail.\r\n\r\n## Cœur : Algorithmes Cryptographiques\r\n\r\nLa cryptographie est au cœur d'OpenNHP, fournissant une sécurité robuste, d'excellentes performances et une bonne évolutivité en utilisant des algorithmes cryptographiques de pointe. Voici les principaux algorithmes et cadres cryptographiques employés par OpenNHP :\r\n\r\n- **[Cryptographie à Courbes Elliptiques (ECC)](https://fr.wikipedia.org/wiki/Cryptographie_sur_courbe_elliptique)** : Utilisée pour la cryptographie asymétrique efficace.\r\n\r\n> Comparée à RSA, l'ECC offre une efficacité supérieure avec un chiffrement plus fort à des longueurs de clé plus courtes, améliorant la transmission réseau et les performances de calcul. Le tableau ci-dessous montre les différences de force de sécurité, de longueurs de clé et du ratio entre RSA et ECC, ainsi que leurs périodes de validité respectives.\r\n\r\n| Force de Sécurité (bits) | Longueur de Clé DSA/RSA (bits) | Longueur de Clé ECC (bits) | Ratio : ECC vs DSA/RSA | Validité |\r\n|:--------------------------:|:------------------------------:|:--------------------------:|:-----------------------:|:---------:|\r\n| 80                         | 1024                           | 160-223                    | 1:6                     | Jusqu'en 2010 |\r\n| 112                        | 2048                           | 224-255                    | 1:9                     | Jusqu'en 2030 |\r\n| 128                        | 3072                           | 256-383                    | 1:12                    | Après 2031 |\r\n| 192                        | 7680                           | 384-511                    | 1:20                    | |\r\n| 256                        | 15360                          | 512+                       | 1:30                    | |\r\n\r\n- **[Cadre de Protocole Noise](https://noiseprotocol.org/)** : Permet l'échange de clés sécurisé, le chiffrement/déchiffrement des messages, et l'authentification mutuelle.\r\n\r\n> Le protocole Noise est basé sur l'[accord de clé Diffie-Hellman](https://fr.wikipedia.org/wiki/%C3%89change_de_cl%C3%A9_Diffie-Hellman) et offre des solutions cryptographiques modernes telles que l'authentification mutuelle et optionnelle, le masquage de l'identité, la sécurité persistante, et le chiffrement à tour de passezà-tour de zéro. Déjà prouvé pour sa sécurité et ses performances, il est utilisé par des applications populaires comme [WhatsApp](https://www.whatsapp.com/security/WhatsApp-Security-Whitepaper.pdf), [Slack](https://github.com/slackhq/nebula), et [WireGuard](https://www.wireguard.com/).\r\n\r\n- **[Cryptographie basée sur l'Identité (IBC)](https://fr.wikipedia.org/wiki/Cryptographie_bas%C3%A9e_sur_l%27identit%C3%A9)** : Simplifie la distribution des clés à grande échelle.\r\n\r\n> Une distribution efficace des clés est essentielle pour implémenter le Zéro Confiance. OpenNHP prend en charge à la fois PKI et IBC. Alors que PKI est utilisée depuis des décennies, elle dépend de Certificats d'Autorité centralisés (CA) pour la vérification de l'identité et la gestion des clés, ce qui peut être long et coûteux. En revanche, l'IBC permet une approche décentralisée et autonome de la vérification de l'identité et de la gestion des clés, la rendant plus rentable pour l'environnement Zero Trust d'OpenNHP, où des milliards d'appareils ou de serveurs peuvent avoir besoin de protection et d'intégration en temps réel.\r\n\r\n- **[Cryptographie à Clé Publique sans Certificat (CL-PKC)](https://fr.wikipedia.org/wiki/Cryptographie_sans_certificat)** : Algorithme IBC recommandé\r\n\r\n> CL-PKC est un schéma qui améliore la sécurité en évitant la garde des clés et en répondant aux limites de la cryptographie basée sur l'identité (IBC). Dans la plupart des systèmes IBC, la clé privée d'un utilisateur est générée par un Centre de Génération de Clés (KGC), ce qui introduit des risques importants. Un KGC compromis peut entraîner l'exposition des clés privées de tous les utilisateurs, nécessitant une confiance totale dans le KGC. CL-PKC atténue ce problème en divisant le processus de génération de clés, de sorte que le KGC n'a connaissance que d'une clé privée partielle. En conséquence, CL-PKC combine les forces du PKI et de l'IBC, offrant une sécurité renforcée sans les inconvénients de la gestion centralisée des clés.\r\n\r\nPour en savoir plus :\r\n\r\n> Veuillez consulter la [documentation OpenNHP](https://docs.opennhp.org/cryptography/) pour une explication détaillée des algorithmes cryptographiques utilisés dans OpenNHP.\r\n\r\n## Principales Fonctionnalités\r\n\r\n- Atténue l'exploitation des vulnérabilités en appliquant par défaut des règles \"deny-all\"\r\n- Empêche les attaques de phishing via la résolution DNS chiffrée\r\n- Protège contre les attaques DDoS en cachant l'infrastructure\r\n- Permet l'attribution des attaques via des connexions basées sur l'identité\r\n- Contrôle d'accès par défaut pour toutes les ressources protégées\r\n- Authentification basée sur l'identité et les appareils avant l'accès au réseau\r\n- Résolution DNS chiffrée pour empêcher le piratage DNS\r\n- Infrastructure distribuée pour atténuer les attaques DDoS\r\n- Architecture évolutive avec des composants découplés\r\n- Intégration avec les systèmes existants de gestion des identités et des accès\r\n- Prend en charge divers modèles de déploiement (client-à-passerelle, client-à-serveur, etc.)\r\n- Sécurité cryptographique avec des algorithmes modernes (ECC, Noise Protocol, IBC)\r\n\r\n<details>\r\n<summary>Cliquez pour développer les détails des fonctionnalités</summary>\r\n\r\n- **Contrôle d'accès par défaut** : Toutes les ressources sont cachées par défaut, ne devenant accessibles qu'après authentification et autorisation.\r\n- **Authentification basée sur l'identité et les appareils** : Garantit que seuls les utilisateurs connus sur des appareils approuvés peuvent accéder.\r\n- **Résolution DNS chiffrée** : Empêche le piratage DNS et les attaques de phishing associées.\r\n- **Atténuation des DDoS** : Conception d'infrastructure distribuée aide à protéger contre les attaques par DDoS.\r\n- **Architecture évolutive** : Les composants découplés permettent un déploiement et une évolution flexibles.\r\n- **Intégration IAM** : Fonctionne avec vos systèmes de gestion des identités et des accès.\r\n- **Déploiement flexible** : Prend en charge divers modèles, y compris client-à-passerelle, client-à-serveur, et plus encore.\r\n- **Cryptographie forte** : Utilise des algorithmes modernes comme ECC, Noise Protocol, et IBC pour une sécurité robuste.\r\n</details>\r\n\r\n## Déploiement\r\n\r\nOpenNHP prend en charge plusieurs modèles de déploiement pour répondre à différents cas d'utilisation :\r\n\r\n- Client-à-Passerelle : Sécurise l'accès à plusieurs serveurs derrière une passerelle\r\n- Client-à-Serveur : Sécurise directement des serveurs/applications individuels\r\n- Serveur-à-Serveur : Sécurise la communication entre les services backend\r\n- Passerelle-à-Passerelle : Sécurise les connexions site-à-site\r\n\r\n> Veuillez consulter la [documentation OpenNHP](https://docs.opennhp.org/deploy/) pour des instructions de déploiement détaillées.\r\n\r\n## Comparaison entre SPA et NHP\r\nLe protocole d'Autorisation par Paquet Unique (SPA) est inclus dans la [spécification du Périmètre Défini par Logiciel (SDP)](https://cloudsecurityalliance.org/artifacts/software-defined-perimeter-zero-trust-specification-v2) publiée par l'[Alliance pour la Sécurité Cloud (CSA)](https://cloudsecurityalliance.org/). NHP améliore la sécurité, la fiabilité, la scalabilité et l'extensibilité grâce à un cadre et une architecture de cryptographie modernes, comme démontré dans l'article de recherche [AHAC](https://www.mdpi.com/2076-3417/14/13/5593).\r\n\r\n| - | SPA | NHP | Avantages de NHP |\r\n|:---|:---|:---|:---|\r\n| **Architecture** | Le déchiffrement du paquet SPA et le composant d'authentification de l'utilisateur/appareil sont couplés au composant de contrôle d'accès réseau dans le serveur SPA. | NHP-Server (le composant de déchiffrement de paquet et d'authentification utilisateur/appareil) et NHP-AC (le composant de contrôle d'accès) sont découplés. NHP-Server peut être déployé sur des hôtes distincts et prend en charge la mise à l'échelle horizontale. | <ul><li>Performance : le composant gourmand en ressources NHP-server est séparé du serveur protégé.</li><li>Scalabilité : NHP-server peut être déployé en mode distribué ou en cluster.</li><li>Sécurité : l'adresse IP du serveur protégé n'est pas visible par le client tant que l'authentification n'a pas réussi.</li></ul>|\r\n| **Communication** | Simple direction | Bidirectionnelle | Meilleure fiabilité avec la notification d'état du contrôle d'accès |\r\n| **Cadre cryptographique** | Secrets partagés | PKI ou IBC, Cadre Noise | <ul><li>Sécurité : mécanisme éprouvé d'échange de clés pour atténuer les menaces MITM</li><li>Coût faible : distribution efficace des clés pour le modèle de zéro confiance</li><li>Performance : chiffrement/déchiffrement haute performance</li></ul>|\r\n| **Capacité de Masquage de l'Infrastructure Réseau** | Uniquement les ports de serveur | Domaines, IP et ports | Plus puissant contre diverses attaques (e.g., vulnérabilités, piratage DNS, et attaques DDoS) |\r\n| **Extensibilité** | Aucune, uniquement pour SDP | Tout usage | Prise en charge de tout scénario nécessitant un obscurcissement de service |\r\n| **Interopérabilité** | Non disponible | Personnalisable | NHP peut s'intégrer de manière transparente avec les protocoles existants (e.g., DNS, FIDO, etc.) |\r\n\r\n## Contribuer\r\n\r\nNous accueillons avec plaisir les contributions à OpenNHP ! Veuillez consulter nos [lignes directrices de contribution](CONTRIBUTING.md) pour plus d'informations sur la manière de participer.\r\n\r\n## Licence\r\n\r\nOpenNHP est publié sous la [licence Apache 2.0](LICENSE).\r\n\r\n## Contact\r\n\r\n- Site Web du Projet : [https://github.com/OpenNHP/opennhp](https://github.com/OpenNHP/opennhp)\r\n- E-mail : [opennhp@gmail.com](mailto:opennhp@gmail.com)\r\n- Discord : [Rejoignez notre Discord](https://discord.gg/CpyVmspx5x)\r\n\r\nPour plus de documentation détaillée, veuillez visiter notre [Documentation Officielle](https://opennhp.org).\r\n\r\n## Références\r\n\r\n- [Spécification du Périmètre Défini par Logiciel (SDP) v2.0](https://cloudsecurityalliance.org/artifacts/software-defined-perimeter-zero-trust-specification-v2). Jason Garbis, Juanita Koilpillai, Junaid lslam, Bob Flores, Daniel Bailey, Benfeng Chen, Eitan Bremler, Michael Roza, Ahmed Refaey Hussein. [*Cloud Security Alliance (CSA)*](https://cloudsecurityalliance.org/). Mar 2022.\r\n- [AHAC : Cadre Avancé de Contrôle d'Accès Caché au Réseau](https://www.mdpi.com/2076-3417/14/13/5593). Mudi Xu, Benfeng Chen, Zhizhong Tan, Shan Chen, Lei Wang, Yan Liu, Tai Io San, Sou Wang Fong, Wenyong Wang, et Jing Feng. *Journal des Sciences Appliquées*. Juin 2024.\r\n- [STALE : Un schéma d'authentification transfrontalière évolutif et sécurisé tirant parti du courrier électronique et de l'échange de clés ECDH](https://www.mdpi.com/2079-9292/14/12/2399) Jiexin Zheng, Mudi Xu, Jianqing Li, Benfeng Chen, Zhizhong Tan, Anyu Wang, Shuo Zhang, Yan Liu, Kevin Qi Zhang, Lirong Zheng, et Wenyong Wang. *électronique*. Juin 2025.\r\n- [DRL-AMIR : Planification intelligente des flux pour les réseaux de confiance zéro définis par logiciel](https://www.techscience.com/cmc/v84n2/62920) WenLong Ke, Zilong Li, Peiyu Chen, Benfeng Chen, Jinglin Lv, Qiang Wang, Ziyi Jia et Shigen Shen. *CMC*. Juillet 2025.\r\n[méthode de contrôle du trafic réseau de NHP basée sur l’apprentissage par renforcement profond](https://www.nature.com/articles/s41598-025-31556-3). Qinglin Huang, Zhizhong Tan, Qiang Wang, Ziyi Jia et Benfeng Chen. *rapports scientifiques par Nature* décembre 2025.\r\n- Noise Protocol Framework. https://noiseprotocol.org/\r\n- Projet de Cadre de Gestion des Vulnérabilités. https://phoenix.security/web-vuln-management/\r\n\r\n---\r\n\r\n🌟 Merci pour votre intérêt dans OpenNHP ! Nous attendons vos contributions et vos commentaires avec impatience.\r\n\r\n"
  },
  {
    "path": "README.ja.md",
    "content": "[![en](https://img.shields.io/badge/lang-en-green.svg)](https://github.com/OpenNHP/opennhp/blob/master/README.md)\r\n[![zh-cn](https://img.shields.io/badge/lang-zh--cn-green.svg)](https://github.com/OpenNHP/opennhp/blob/master/README.zh-cn.md)\r\n[![de](https://img.shields.io/badge/lang-de-green.svg)](https://github.com/OpenNHP/opennhp/blob/master/README.de.md)\r\n[![ja](https://img.shields.io/badge/lang-ja-green.svg)](https://github.com/OpenNHP/opennhp/blob/master/README.ja.md)\r\n[![fr](https://img.shields.io/badge/lang-fr-green.svg)](https://github.com/OpenNHP/opennhp/blob/master/README.fr.md)\r\n[![es](https://img.shields.io/badge/lang-es-green.svg)](https://github.com/OpenNHP/opennhp/blob/master/README.es.md)\r\n\r\n![OpenNHP Logo](docs/images/logo11.png)\r\n# OpenNHP: ゼロトラストネットワークインフラストラクチャ隠蔽プロトコル\r\n攻撃者からサーバーとデータを隠すためのOSI第5層に位置する、軽量の暗号化駆動型ゼロトラストネットワークプロトコルです。\r\n\r\n![Build Status](https://img.shields.io/badge/build-passing-brightgreen)\r\n![Version](https://img.shields.io/badge/version-1.0.0-blue)\r\n![License](https://img.shields.io/badge/license-Apache%202.0-green)\r\n\r\n---\r\n\r\n## セキュリティの利点\r\n\r\nOpenNHPは*OSIセッション層*でゼロトラストの原則を実装しているため、次のような大きな利点があります。\r\n\r\n- インフラの隠蔽による攻撃面の削減\r\n- 不正なネットワーク偵察の防止\r\n- 脆弱性の悪用を防ぐ\r\n- 暗号化されたDNSによるフィッシング防止\r\n- DDoS攻撃に対する防御\r\n- 細粒度のアクセス制御を実現\r\n- アイデンティティベースの接続追跡\r\n- 攻撃の帰属\r\n\r\n## アーキテクチャ\r\n\r\nOpenNHPのアーキテクチャは[NISTゼロトラストアーキテクチャ標準](https://www.nist.gov/publications/zero-trust-architecture)に触発されています。以下の図に示すように、3つの主要なコンポーネント（**NHP-Server**、**NHP-AC**、**NHP-Agent**）を持つモジュール設計に従います。\r\n\r\n![OpenNHP architecture](docs/images/OpenNHP_Arch.png)\r\n\r\n> アーキテクチャとワークフローの詳細については、[OpenNHPドキュメント](https://docs.opennhp.org/)を参照してください。\r\n\r\n## コア: 暗号化アルゴリズム\r\n\r\n暗号化はOpenNHPの中心にあり、強力なセキュリティ、高いパフォーマンス、およびスケーラビリティを提供するために最新の暗号化アルゴリズムを利用しています。以下は、OpenNHPで使用されている主要な暗号化アルゴリズムとフレームワークです。\r\n\r\n- **[楕円曲線暗号（ECC）](https://en.wikipedia.org/wiki/Elliptic-curve_cryptography)**：効率的な公開鍵暗号に使用されています。\r\n\r\n> RSAと比較して、ECCは短い鍵長で強力な暗号化を提供し、ネットワーク伝送と計算パフォーマンスを向上させます。以下の表は、RSAとECCのセキュリティ強度、鍵長、および鍵長の比率の違いを示し、それぞれの有効期間を示しています。\r\n\r\n| セキュリティ強度（ビット） | DSA/RSA鍵長（ビット） | ECC鍵長（ビット） | 比率：ECC対DSA/RSA | 有効期限 |\r\n|:------------------------:|:-------------------------:|:---------------------:|:----------------------:|:--------:|\r\n| 80                       | 1024                      | 160-223               | 1:6                    | 2010年まで |\r\n| 112                      | 2048                      | 224-255               | 1:9                    | 2030年まで |\r\n| 128                      | 3072                      | 256-383               | 1:12                   | 2031年以降 |\r\n| 192                      | 7680                      | 384-511               | 1:20                   | |\r\n| 256                      | 15360                     | 512+                  | 1:30                   | |\r\n\r\n- **[ノイズプロトコルフレームワーク](https://noiseprotocol.org/)**：安全な鍵交換、メッセージの暗号化/復号化、および相互認証を可能にします。\r\n\r\n> ノイズプロトコルは[ディフィー・ヘルマン鍵共有](https://en.wikipedia.org/wiki/Diffie%E2%80%93Hellman_key_exchange)に基づいており、相互およびオプションの認証、アイデンティティの隠蔽、前方秘匿性、ゼロラウンドトリップ暗号化などの最新の暗号化ソリューションを提供します。そのセキュリティとパフォーマンスは、[WhatsApp](https://www.whatsapp.com/security/WhatsApp-Security-Whitepaper.pdf)、[Slack](https://github.com/slackhq/nebula)、および[WireGuard](https://www.wireguard.com/)などの人気アプリケーションで既に証明されています。\r\n\r\n- **[アイデンティティベース暗号（IBC）](https://en.wikipedia.org/wiki/Identity-based_cryptography)**：大規模な鍵配布を簡素化します。\r\n\r\n> 効率的な鍵配布は、ゼロトラストの実装に不可欠です。OpenNHPはPKIとIBCの両方をサポートしています。PKIは数十年にわたって広く使用されてきましたが、アイデンティティの確認と鍵管理に中央集権的な認証局（CA）に依存しており、時間とコストがかかることがあります。一方、IBCは、アイデンティティの確認と鍵管理を分散型で自己管理可能な方法で行うことができ、リアルタイムで何十億ものデバイスやサーバーを保護し、オンボーディングする必要があるOpenNHPのゼロトラスト環境において、よりコスト効率的です。\r\n\r\n- **[証明書レス公開鍵暗号（CL-PKC）](https://en.wikipedia.org/wiki/Certificateless_cryptography)**：推奨されるIBCアルゴリズム\r\n\r\n> CL-PKCは、鍵エスクローを回避し、アイデンティティベース暗号（IBC）の制限に対処することでセキュリティを強化するスキームです。ほとんどのIBCシステムでは、ユーザーの秘密鍵は鍵生成センター（KGC）によって生成され、これは重大なリスクをもたらします。KGCが侵害された場合、すべてのユーザーの秘密鍵が公開される可能性があり、KGCへの完全な信頼が必要です。CL-PKCは鍵生成プロセスを分割し、KGCは部分的な秘密鍵のみを知っているため、CL-PKCはPKIとIBCの両方の強みを組み合わせ、中央集権的な鍵管理の欠点なしに強力なセキュリティを提供します。\r\n\r\n詳細について：\r\n\r\n> OpenNHPで使用されている暗号化アルゴリズムの詳細な説明については、[OpenNHPドキュメント](https://docs.opennhp.org/cryptography/)を参照してください。\r\n\r\n## 主な機能\r\n\r\n- デフォルトで「すべて拒否」ルールを適用することにより、脆弱性の悪用を軽減\r\n- 暗号化されたDNS解決を通じてフィッシング攻撃を防止\r\n- インフラの隠蔽によるDDoS攻撃の防御\r\n- アイデンティティベースの接続による攻撃の帰属\r\n- 保護されたリソースに対するすべてのアクセスをデフォルトで拒否\r\n- ネットワークアクセス前にアイデンティティおよびデバイスベースの認証\r\n- DNSハイジャックを防止するための暗号化されたDNS解決\r\n- DDoS攻撃を緩和するための分散インフラ\r\n- 分離されたコンポーネントによるスケーラブルなアーキテクチャ\r\n- 既存のアイデンティティおよびアクセス管理システムとの統合\r\n- さまざまな展開モデルをサポート（クライアント対ゲートウェイ、クライアント対サーバーなど）\r\n- 最新のアルゴリズム（ECC、ノイズプロトコル、IBC）を使用した暗号化によるセキュリティの確保\r\n\r\n<details>\r\n<summary>機能の詳細を表示</summary>\r\n\r\n- **デフォルト拒否のアクセス制御**：すべてのリソースはデフォルトで隠蔽され、認証と認可が行われた後にのみアクセス可能になります。\r\n- **アイデンティティおよびデバイスベースの認証**：既知のユーザーと承認されたデバイスのみがアクセス可能です。\r\n- **暗号化されたDNS解決**：DNSハイジャックとそれに伴うフィッシング攻撃を防止します。\r\n- **DDoS緩和**：分散型インフラ設計により、分散型サービス拒否攻撃を防御します。\r\n- **スケーラブルなアーキテクチャ**：分離されたコンポーネントにより柔軟な展開とスケーリングが可能です。\r\n- **IAM統合**：既存のアイデンティティおよびアクセス管理システムと連携します。\r\n- **柔軟な展開**：クライアント対ゲートウェイ、クライアント対サーバーなど、さまざまなモデルをサポートします。\r\n- **強力な暗号化**：ECC、ノイズプロトコル、IBCなどの最新アルゴリズムを使用して強力なセキュリティを提供します。\r\n</details>\r\n\r\n## 展開\r\n\r\nOpenNHPは、さまざまなユースケースに合わせた複数の展開モデルをサポートしています。\r\n\r\n- クライアント対ゲートウェイ：ゲートウェイの背後にある複数のサーバーへのアクセスを保護します\r\n- クライアント対サーバー：個々のサーバー/アプリケーションを直接保護します\r\n- サーバー対サーバー：バックエンドサービス間の通信を保護します\r\n- ゲートウェイ対ゲートウェイ：サイト間接続を保護します\r\n\r\n> 詳細な展開手順については、[OpenNHPドキュメント](https://docs.opennhp.org/deploy/)を参照してください。\r\n\r\n## SPAとNHPの比較\r\n[クラウドセキュリティアライアンス（CSA）](https://cloudsecurityalliance.org/)がリリースした[ソフトウェア定義境界（SDP）仕様](https://cloudsecurityalliance.org/artifacts/software-defined-perimeter-zero-trust-specification-v2)には、シングルパケット認証（SPA）プロトコルが含まれています。NHPは、最新の暗号化フレームワークとアーキテクチャを通じてセキュリティ、信頼性、スケーラビリティ、拡張性を向上させ、[AHAC研究論文](https://www.mdpi.com/2076-3417/14/13/5593)で示されているように従来の技術の限界を克服しています。\r\n\r\n| - | SPA |NHP | NHPの利点  |\r\n|:---|:---|:---|:---|\r\n| **アーキテクチャ** | SPAサーバーのパケット復号化およびユーザー/デバイス認証コンポーネントがネットワークアクセス制御コンポーネントと結合されています。 | NHP-Server（パケット復号化およびユーザー/デバイス認証コンポーネント）とNHP-AC（アクセス制御コンポーネント）が分離されています。NHP-Serverは別のホストに展開でき、水平スケーリングをサポートします。 | <ul><li>パフォーマンス：リソース消費の多いコンポーネントNHP-Serverが保護されたサーバーから分離されています。</li><li>スケーラビリティ：NHP-Serverは分散またはクラスター化モードで展開可能です。</li><li>セキュリティ：認証が成功するまでは、保護されたサーバーのIPアドレスがクライアントには見えません。</li></ul>|\r\n| **通信** | 単方向 | 双方向 | アクセス制御のステータス通知による信頼性の向上 |\r\n| **暗号化フレームワーク** | 共有シークレット | PKIまたはIBC、ノイズフレームワーク |<ul><li>セキュリティ：MITM脅威を軽減する証明された安全な鍵交換メカニズム</li><li>低コスト：ゼロトラストモデルにおける効率的な鍵配布</li><li>パフォーマンス：高パフォーマンスの暗号化/復号化</li></ul>|\r\n| **ネットワークインフラストラクチャ隠蔽能力** | サーバーポートのみ | ドメイン、IP、ポート | 脆弱性、DNSハイジャック、DDoS攻撃など、さまざまな攻撃に対する強力な防御 |\r\n| **拡張性** | なし、SDP専用 | 汎用 | あらゆるサービス暗黒化の必要があるシナリオに対応 |\r\n| **相互運用性** | 利用不可 | カスタマイズ可能| NHPは既存のプロトコル（例：DNS、FIDOなど）とシームレスに統合可能 |\r\n\r\n## コントリビューション\r\n\r\nOpenNHPへの貢献を歓迎します！貢献方法の詳細については、[コントリビューションガイドライン](CONTRIBUTING.md)を参照してください。\r\n\r\n## ライセンス\r\n\r\nOpenNHPは[Apache 2.0ライセンス](LICENSE)の下でリリースされています。\r\n\r\n## 連絡先\r\n\r\n- プロジェクトウェブサイト：[https://github.com/OpenNHP/opennhp](https://github.com/OpenNHP/opennhp)\r\n- メール：[opennhp@gmail.com](mailto:opennhp@gmail.com)\r\n- Discord：[Discordに参加する](https://discord.gg/CpyVmspx5x)\r\n\r\n詳細なドキュメントについては、[公式ドキュメント](https://opennhp.org)をご覧ください。\r\n\r\n## 参考文献\r\n\r\n- [ソフトウェア定義境界（SDP）仕様 v2.0](https://cloudsecurityalliance.org/artifacts/software-defined-perimeter-zero-trust-specification-v2)。Jason Garbis、Juanita Koilpillai、Junaid Islam、Bob Flores、Daniel Bailey、Benfeng Chen、Eitan Bremler、Michael Roza、Ahmed Refaey Hussein。[*クラウドセキュリティアライアンス（CSA）*](https://cloudsecurityalliance.org/)。2022年3月。\r\n- [AHAC：高度なネットワーク隠蔽アクセス制御フレームワーク](https://www.mdpi.com/2076-3417/14/13/5593)。Mudi Xu、Benfeng Chen、Zhizhong Tan、Shan Chen、Lei Wang、Yan Liu、Tai Io San、Sou Wang Fong、Wenyong Wang、Jing Feng。*応用科学ジャーナル*。2024年6月。\r\n- [STALE ：電子メールと ECDH 鍵交換を活用したスケーラブルでセキュアなクロスボーダー認証スキーム](https://www.mdpi.com/2079-9292/14/12/2399) Jiexin Zheng, Mudi Xu, Jianqing Li, Benfeng Chen, Zhizhong Tan, Anyu Wang, Shuo Zhang, Yan Liu, Kevin Qi Zhang, Lirong Zheng, Wenyong Wang. *電子ジャーナル*。2025 年 6 月。\r\n- [DRL—AMIR：ソフトウェア定義ゼロ信頼ネットワークのインテリジェントストリームスケジューリング]（https://www.techscience.com/cmc/v84n2/62920）Wenlong Ke, Zilong Li, Peiyu Chen, Benfeng Chen, Jinglin Lv,Qiang Wang, Ziyi Jia と Shigen Shen 。*コンピュータ材料と連続通信*。2025 年 7 月。\r\n- [深層強化学習に基づくNHPネットワークトラフィック制御手法](https://www.nature.com/articles/s41598-025-31556-3) Qinglin Huang, Zhizhong Tan, Qiang Wang, Ziyi Jia と Benfeng Chen. 『科学報告』。2025年12月。\r\n- ノイズプロトコルフレームワーク。https://noiseprotocol.org/\r\n- 脆弱性管理フレームワークプロジェクト。https://phoenix.security/web-vuln-management/\r\n\r\n---\r\n\r\n✨ OpenNHPにご関心をお寄せいただき、ありがとうございます！皆様の貢献とフィードバックをお待ちしております。\r\n\r\n"
  },
  {
    "path": "README.md",
    "content": "[![en](https://img.shields.io/badge/lang-en-green.svg)](https://github.com/OpenNHP/opennhp/blob/master/README.md)\n[![zh-cn](https://img.shields.io/badge/lang-zh--cn-green.svg)](https://github.com/OpenNHP/opennhp/blob/master/README.zh-cn.md)\n[![de](https://img.shields.io/badge/lang-de-green.svg)](https://github.com/OpenNHP/opennhp/blob/master/README.de.md)\n[![ja](https://img.shields.io/badge/lang-ja-green.svg)](https://github.com/OpenNHP/opennhp/blob/master/README.ja.md)\n[![fr](https://img.shields.io/badge/lang-fr-green.svg)](https://github.com/OpenNHP/opennhp/blob/master/README.fr.md)\n[![es](https://img.shields.io/badge/lang-es-green.svg)](https://github.com/OpenNHP/opennhp/blob/master/README.es.md)\n\n![OpenNHP Logo](docs/images/logo11.png)\n\n# OpenNHP: Open Source Zero Trust Security Toolkit\n\n![Build Status](https://img.shields.io/badge/build-passing-brightgreen)\n![Version](https://img.shields.io/badge/version-1.0.0-blue)\n![License](https://img.shields.io/badge/license-Apache%202.0-green)\n[![codecov](https://codecov.io/gh/OpenNHP/opennhp/branch/main/graph/badge.svg)](https://codecov.io/gh/OpenNHP/opennhp)\n[![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/OpenNHP/opennhp)\n\n**OpenNHP** is a lightweight, cryptography-powered, open-source toolkit implementing Zero Trust security for infrastructure, applications, and data. It features two core protocols:\n\n- **[Network-infrastructure Hiding Protocol (NHP)](https://cloudsecurityalliance.org/artifacts/stealth-mode-sdp-for-zero-trust-network-infrastructure):** Conceals server ports, IP addresses, and domain names to protect applications and infrastructure from unauthorized access.\n- **Data-object Hiding Protocol (DHP):** Ensures data security and privacy via encryption and confidential computing, making data *\"usable but not visible.\"*\n\n**[Website](https://opennhp.org) · [Documentation](https://docs.opennhp.org) · [Live Demo](https://opennhp.org/demo.html) · [Discord](https://discord.gg/CpyVmspx5x)**\n\n---\n\n## Architecture\n\nOpenNHP follows a modular design with three core components, inspired by the [NIST Zero Trust Architecture](https://www.nist.gov/publications/zero-trust-architecture):\n\n![OpenNHP architecture](docs/images/OpenNHP_Arch.png)\n\n| Component | Role |\n|-----------|------|\n| **NHP-Agent** | Client that sends encrypted knock requests to gain access |\n| **NHP-Server** | Authenticates and authorizes requests; decoupled from protected resources |\n| **NHP-AC** | Access controller that manages firewall rules on the protected server |\n\n> For protocol details, deployment models, and cryptographic design, see the [documentation](https://docs.opennhp.org).\n\n---\n\n## Repository Structure\n\n```\nopennhp/\n├── nhp/              # Core protocol library (Go module)\n│   ├── core/         # Packet handling, cryptography, Noise Protocol, device management\n│   ├── common/       # Shared types and message definitions\n│   ├── utils/        # Utility functions\n│   ├── plugins/      # Plugin handler interfaces\n│   ├── log/          # Logging infrastructure\n│   └── etcd/         # Distributed configuration support\n└── endpoints/        # Daemon implementations (Go module, depends on nhp)\n    ├── agent/        # NHP-Agent daemon\n    ├── server/        # NHP-Server daemon\n    ├── ac/           # NHP-AC (access controller) daemon\n    ├── db/           # NHP-DB (data object backend for DHP)\n    ├── kgc/          # Key Generation Center (IBC)\n    └── relay/        # TCP relay\n```\n\n---\n\n## Quick Start\n\n### Prerequisites\n\n- Go 1.25.6+\n- `make`\n- Docker and Docker Compose (for the full-stack demo)\n\n### Build\n\n```bash\n# Build all components\nmake\n\n# Build individual daemons\nmake agentd    # NHP-Agent\nmake serverd   # NHP-Server\nmake acd       # NHP-AC\nmake db        # NHP-DB\nmake kgc       # Key Generation Center\n```\n\n### Test\n\n```bash\ncd nhp && go test ./...\ncd endpoints && go test ./...\n```\n\n### Run with Docker\n\n```bash\ncd docker && docker-compose up --build\n```\n\nFollow the [Quick Start tutorial](https://docs.opennhp.org/nhp_quick_start/) to simulate the full authentication workflow in a Docker environment.\n\n---\n\n## Contributing\n\nWe welcome contributions! Please read [CONTRIBUTING.md](CONTRIBUTING.md) before submitting pull requests.\n\n**Note:** All commits must be signed with a verified GPG or SSH key.\n\n```bash\ngit commit -S -m \"your message\"\n```\n\n---\n\n## Sponsors\n\n<a href=\"https://layerv.ai\">\n  <img src=\"docs/images/layerv_logo.png\" width=\"80\" alt=\"LayerV.ai\">\n  <br>\n  <img src=\"docs/images/layerv_text.svg\" width=\"120\" alt=\"LayerV.ai\">\n</a>\n\n---\n\n## License\n\nReleased under the [Apache 2.0 License](LICENSE).\n\n## Contact\n\n- Email: [support@opennhp.org](mailto:support@opennhp.org)\n- Discord: [Join our Discord](https://discord.gg/CpyVmspx5x)\n- Website: [https://opennhp.org](https://opennhp.org)\n"
  },
  {
    "path": "README.zh-cn.md",
    "content": "[![en](https://img.shields.io/badge/lang-en-green.svg)](https://github.com/OpenNHP/opennhp/blob/master/README.md)\n[![zh-cn](https://img.shields.io/badge/lang-zh--cn-green.svg)](https://github.com/OpenNHP/opennhp/blob/master/README.zh-cn.md)\n[![de](https://img.shields.io/badge/lang-de-green.svg)](https://github.com/OpenNHP/opennhp/blob/master/README.de.md)\n[![ja](https://img.shields.io/badge/lang-ja-green.svg)](https://github.com/OpenNHP/opennhp/blob/master/README.ja.md)\n[![fr](https://img.shields.io/badge/lang-fr-green.svg)](https://github.com/OpenNHP/opennhp/blob/master/README.fr.md)\n[![es](https://img.shields.io/badge/lang-es-green.svg)](https://github.com/OpenNHP/opennhp/blob/master/README.es.md)\n\n![OpenNHP Logo](docs/images/logo11.png)\n# OpenNHP: 零信任网络隐身协议\nOpenNHP是一个轻量级、基于加密算法的零信任网络协议，其工作在OSI网络模型第五层，用于隐藏您的服务器和数据，避免被攻击者发现和访问\n\n![Build Status](https://img.shields.io/badge/build-passing-brightgreen)\n![Version](https://img.shields.io/badge/version-1.0.0-blue)\n![License](https://img.shields.io/badge/license-Apache%202.0-green)\n\n---\n\n## 挑战：AI 将互联网变为“黑暗森林”\n\n**AI** 技术的快速发展，尤其是大语言模型（LLM），正在显著改变网络安全格局。**自主漏洞利用（AVE）** 的兴起是 AI 时代的一个重大飞跃，大大简化了漏洞的利用，这一点在[这篇研究论文](https://arxiv.org/abs/2404.08144)中有详细说明。这一发展显著增加了任何暴露网络服务的风险，与互联网的[黑暗森林假说](https://en.wikipedia.org/wiki/Dark_forest_hypothesis)不谋而合。AI 驱动的工具不断扫描数字环境，迅速识别和利用弱点。因此，互联网正逐渐成为一个**“黑暗森林”**，**可见性意味着脆弱性**。\n\n![Vulnerability Risks](docs/images/Vul_Risks.png)\n\nGartner 研究预测，[AI 驱动的网络攻击将迅速增加](https://www.gartner.com/en/newsroom/press-releases/2024-08-28-gartner-forecasts-global-information-security-spending-to-grow-15-percent-in-2025)。这一变化要求重新评估传统的网络安全策略，重点放在主动防御、快速响应机制和网络隐藏技术的采用，以保护关键基础设施。\n\n---\n\n## 快速演示：查看 OpenNHP 的工作原理\n\n在深入了解 OpenNHP 的详细信息之前，让我们先来看一个 OpenNHP 如何保护服务器免受未经授权访问的演示。您可以通过访问 https://acdemo.opennhp.org 查看其实际效果。\n\n### 1) 受保护的服务器对未经身份验证的用户“不可见”\n\n默认情况下，任何试图连接受保护服务器的操作都会导致超时错误，因为所有端口都是关闭的，使服务器看起来像是*“离线”*且实际上是“不可见”的。\n\n![OpenNHP Demo](docs/images/OpenNHP_ACDemo0.png)\n\n对服务器进行端口扫描也会返回超时错误。\n\n![OpenNHP Demo](docs/images/OpenNHP_ScanDemo.png)\n\n### 2) 身份验证后，受保护的服务器变得可访问\n\nOpenNHP 支持多种身份验证方法，如 OAuth、SAML、二维码等。为了演示方便，本次演示使用 https://demologin.opennhp.org 上的基本用户名/密码身份验证服务来展示该过程。\n\n![OpenNHP Demo](docs/images/OpenNHP_DemoLogin.png)\n\n点击“登录”按钮后，身份验证成功完成，您会被重定向到受保护的服务器。此时，服务器在您的设备上变得*“可见”*并且可以访问。\n\n![OpenNHP Demo](docs/images/OpenNHP_ACDemo1.png)\n\n---\n\n## 快速开始: 构建和测试 OpenNHP\n\n按照我们的[快速入门教程](https://docs.opennhp.org/zh-cn/nhp_quick_start/) 构建 OpenNHP 源代码，并在 Docker 环境中进行测试。您将启动自己的 OpenNHP 调试环境，模拟“不可见”的网络隐藏行为并测试身份验证工作流。\n\n---\n\n## 愿景：让互联网变得值得信赖\n\nTCP/IP 协议的开放性推动了互联网应用的爆炸式增长，但也暴露了漏洞，使得恶意攻击者可以获得未经授权的访问并利用任何暴露的 IP 地址。尽管 [OSI 网络模型](https://en.wikipedia.org/wiki/OSI_model) 在*第五层（会话层）*定义了连接管理，但在实际中很少有有效的解决方案能够应对这一挑战。\n\n**NHP**，即**“网络基础设施隐藏协议”**，是一种轻量级、基于加密的零信任网络协议，旨在工作于*OSI 会话层*，该层在管理网络可见性和连接方面是最佳选择。NHP 的主要目标是将受保护的资源隐藏于未授权的实体，只允许经过验证的用户通过持续认证访问，从而为更值得信赖的互联网作出贡献。\n\n![Trustworthy Internet](docs/images/TrustworthyCyberspace.png)\n\n---\n\n## 解决方案：OpenNHP 解决网络可见性控制问题\n\n**OpenNHP** 是 NHP 协议的开源实现。它基于加密技术，采用安全优先的原则，在*OSI 会话层*实现了真正的零信任架构。\n\n![OpenNHP as the OSI 5th layer](docs/images/OSI_OpenNHP.png)\n\nOpenNHP 构建在早期的网络隐藏技术研究基础之上，利用现代加密框架和架构确保安全性和高性能，从而克服了前代技术的局限性。\n\n| 网络隐藏协议 | 第一代 | 第二代 | 第三代 |\n|:---|:---|:---|:---|\n| **核心技术** | [端口敲门](https://en.wikipedia.org/wiki/Port_knocking) | [单包认证（SPA）](https://cloudsecurityalliance.org/artifacts/software-defined-perimeter-zero-trust-specification-v2) | 网络基础设施隐藏协议（NHP） |\n| **身份认证** | 端口序列 | 共享密钥 | 现代加密框架 |\n| **架构** | 无控制平面 | 无控制平面 | 可扩展控制平面 |\n| **功能** | 隐藏端口 | 隐藏端口 | 隐藏端口、IP 和域名 |\n| **访问控制** | IP 层级 | 端口层级 | 应用层级 |\n| **开源项目** | [knock](https://github.com/jvinet/knock) *(C)* | [fwknop](https://github.com/mrash/fwknop) *(C++)* | [OpenNHP](https://github.com/OpenNHP/opennhp) *(Go)* |\n\n> 开发 OpenNHP 选择使用**内存安全**的语言如 *Go*，这一点在[美国政府技术报告](https://www.whitehouse.gov/wp-content/uploads/2024/02/Final-ONCD-Technical-Report.pdf)中得到了强调。有关 **SPA 和 NHP** 之间详细的比较，请参见[下文](#comparison-between-spa-and-nhp)。\n\n## 安全性优势\n\n由于 OpenNHP 在 *OSI 会话层*实现了零信任原则，因此具有显著的优势：\n\n- 通过隐藏基础设施减少攻击面\n- 防止未经授权的网络侦察\n- 减少漏洞利用的可能性\n- 通过加密的 DNS 保护防止钓鱼\n- 抵御 DDoS 攻击\n- 提供细粒度的访问控制\n- 实现基于身份的连接追踪\n- 支持攻击溯源\n\n## 架构\n\nOpenNHP 的架构受 [NIST 零信任架构标准](https://www.nist.gov/publications/zero-trust-architecture) 启发，采用模块化设计，包含三个核心组件：**NHP-Server**、**NHP-AC** 和 **NHP-Agent**，如下图所示。\n\n![OpenNHP architecture](docs/images/OpenNHP_Arch.png)\n\n> 有关架构和工作流程的详细信息，请参阅 [OpenNHP 文档](https://docs.opennhp.org/)。\n\n## 核心：加密算法\n\n加密是 OpenNHP 的核心，提供强大的安全性、出色的性能和可扩展性，使用了先进的加密算法。以下是 OpenNHP 采用的关键加密算法和框架：\n\n- **[椭圆曲线密码学（ECC）](https://en.wikipedia.org/wiki/Elliptic-curve_cryptography)**：用于高效的公钥密码学。\n\n> 与 RSA 相比，ECC 具有更高的效率，以较短的密钥长度提供更强的加密能力，从而提高网络传输和计算性能。下表显示了 RSA 和 ECC 在安全强度、密钥长度和密钥长度比率上的差异，以及其有效期。\n\n| 安全强度（位） | DSA/RSA 密钥长度（位） | ECC 密钥长度（位） | 比率：ECC 与 DSA/RSA | 有效期 |\n|:---------------:|:----------------------:|:-----------------:|:------------------:|:------:|\n| 80              | 1024                   | 160-223           | 1:6                | 到 2010 年 |\n| 112             | 2048                   | 224-255           | 1:9                | 到 2030 年 |\n| 128             | 3072                   | 256-383           | 1:12               | 2031 年后 |\n| 192             | 7680                   | 384-511           | 1:20               | |\n| 256             | 15360                  | 512+              | 1:30               | |\n\n- **[Noise 协议框架](https://noiseprotocol.org/)**：用于安全的密钥交换、消息加密/解密和相互身份认证。\n\n> Noise 协议基于[Diffie-Hellman 密钥交换](https://en.wikipedia.org/wiki/Diffie%E2%80%93Hellman_key_exchange)，提供了现代加密解决方案，如相互和可选认证、身份隐藏、前向安全性和零轮次加密。它已被 WhatsApp、Slack 和 WireGuard 等应用广泛验证并使用，证明其安全性和性能。\n\n- **[基于身份的加密（IBC）](https://en.wikipedia.org/wiki/Identity-based_cryptography)**：简化了大规模的密钥分发。\n\n> 高效的密钥分发是实现零信任的关键。OpenNHP 支持 PKI 和 IBC。虽然 PKI 已经被广泛使用，但它依赖于集中式的证书颁发机构（CA）进行身份验证和密钥管理，这在时间和成本上较为昂贵。相比之下，IBC 允许在身份验证和密钥管理方面采用去中心化和自我管理的方法，使其在 OpenNHP 的零信任环境中更具成本效益，尤其是在需要实时保护和管理数十亿设备或服务器的情况下。\n\n- **[无证书公钥加密（CL-PKC）](https://en.wikipedia.org/wiki/Certificateless_cryptography)**：推荐的 IBC 算法。\n\n> CL-PKC 是一种通过避免密钥托管和解决基于身份的加密（IBC）局限性来增强安全性的方案。在大多数 IBC 系统中，用户的私钥由密钥生成中心（KGC）生成，这带来了显著的风险。如果 KGC 被攻破，所有用户的私钥都可能被泄露，这要求对 KGC 完全信任。CL-PKC 通过将密钥生成过程分离，使 KGC 仅了解部分私钥，从而避免这一问题。结果，CL-PKC 结合了 PKI 和 IBC 的优点，在不牺牲安全性的情况下提供更强的保护。\n\n更多阅读：\n\n> 有关 OpenNHP 中使用的加密算法的详细说明，请参阅 [OpenNHP 文档](https://docs.opennhp.org/cryptography/)。\n\n## 主要特性\n\n- 通过强制默认“全部拒绝”规则减少漏洞利用\n- 通过加密的 DNS 解决防止钓鱼攻击\n- 通过隐藏基础设施保护免受 DDoS 攻击\n- 通过身份追踪连接实现攻击溯源\n- 对所有受保护资源的默认拒绝访问控制\n- 在网络访问前进行基于身份和设备的身份认证\n- 加密的 DNS 解决防止 DNS 劫持\n- 分布式基础设施抵御 DDoS 攻击\n- 解耦组件实现可扩展架构\n- 与现有身份和访问管理系统集成\n- 支持多种部署模型（客户端到网关、客户端到服务器等）\n- 使用现代算法（ECC、Noise 协议、IBC）进行加密确保安全性\n\n<details>\n<summary>点击展开特性详情</summary>\n\n- **默认拒绝访问控制**：所有资源默认隐藏，只有通过身份验证和授权后才会变得可访问。\n- **基于身份和设备的身份验证**：确保只有已知用户在授权设备上可以访问。\n- **加密的 DNS 解决**：防止 DNS 劫持和相关的钓鱼攻击。\n- **DDoS 缓解**：分布式基础设施设计有助于抵御分布式拒绝服务攻击。\n- **可扩展架构**：解耦组件允许灵活部署和扩展。\n- **IAM 集成**：可以与现有身份和访问管理系统配合使用。\n- **灵活部署**：支持包括客户端到网关、客户端到服务器等多种模型。\n- **强大加密**：使用现代算法如 ECC、Noise 协议和 IBC 确保安全性。\n</details>\n\n## 部署\n\nOpenNHP 支持多种部署模型，以适应不同的使用场景：\n\n- 客户端到网关：保护网关后面的多个服务器的访问\n- 客户端到服务器：直接保护单个服务器/应用\n- 服务器到服务器：保护后端服务之间的通信\n- 网关到网关：保护站点到站点的连接\n\n> 有关详细部署说明，请参阅 [OpenNHP 文档](https://docs.opennhp.org/deploy/)。\n\n## SPA 和 NHP 的比较\n单包认证（SPA）协议被包含在 [软件定义边界（SDP）规范](https://cloudsecurityalliance.org/artifacts/software-defined-perimeter-zero-trust-specification-v2) 中，由 [云安全联盟（CSA）](https://cloudsecurityalliance.org/) 发布。NHP 通过现代加密框架和架构在安全性、可靠性、可扩展性和可扩展性方面进行了改进，这一点在 [AHAC 研究论文](https://www.mdpi.com/2076-3417/14/13/5593) 中得到了验证。\n\n| - | SPA | NHP | NHP 优势 |\n|:---|:---|:---|:---|\n| **架构** | SPA 服务器中的 SPA 数据包解密和用户/设备身份验证组件与网络访问控制组件是耦合的。 | NHP-Server（数据包解密和用户/设备身份验证组件）和 NHP-AC（访问控制组件）是解耦的。NHP-Server 可以部署在独立的主机上，并支持水平扩展。 | <ul><li>性能：资源消耗大的组件 NHP-Server 从受保护服务器分离。</li><li>可扩展性：NHP-Server 可以以分布式或集群模式部署。</li><li>安全性：受保护服务器的 IP 地址在身份验证成功之前对客户端是不可见的。</li></ul> |\n| **通信** | 单向 | 双向 | 更好的可靠性，访问控制状态通知 |\n| **加密框架** | 共享密钥 | PKI 或 IBC，Noise 框架 | <ul><li>安全性：经过验证的安全密钥交换机制，减轻中间人攻击威胁</li><li>低成本：适合零信任模型的高效密钥分发</li><li>性能：高性能加密/解密</li></ul> |\n| **隐藏网络基础设施的能力** | 仅服务器端口 | 域名、IP 和端口 | 更强大，针对各种攻击（如漏洞利用、DNS 劫持和 DDoS 攻击） |\n| **可扩展性** | 无，仅适用于 SDP | 通用 | 支持任何需要服务暗化的场景 |\n| **互操作性** | 不支持 | 可定制 | NHP 可以无缝集成现有协议（如 DNS、FIDO 等） |\n\n## 贡献\n\n我们欢迎对 OpenNHP 的贡献！有关如何参与的更多信息，请参阅我们的[贡献指南](CONTRIBUTING.md)。\n\n## 许可协议\n\nOpenNHP 遵循 [Apache 2.0 许可协议](LICENSE)。\n\n## 联系方式\n\n- 项目网站：[https://github.com/OpenNHP/opennhp](https://github.com/OpenNHP/opennhp)\n- 电子邮件：[opennhp@gmail.com](mailto:opennhp@gmail.com)\n- Discord：[加入我们的 Discord](https://discord.gg/CpyVmspx5x)\n\n有关更详细的文档，请访问我们的[官方网站](https://opennhp.org)。\n\n## 参考文献\n\n- [软件定义边界（SDP）规范 v2.0](https://cloudsecurityalliance.org/artifacts/software-defined-perimeter-zero-trust-specification-v2)。Jason Garbis、Juanita Koilpillai、Junaid lslam、Bob Flores、Daniel Bailey、Benfeng Chen、Eitan Bremler、Michael Roza、Ahmed Refaey Hussein。[*云安全联盟（CSA）*](https://cloudsecurityalliance.org/)。2022 年 3 月。\n- [AHAC：高级网络隐藏访问控制框架](https://www.mdpi.com/2076-3417/14/13/5593)。Mudi Xu、Benfeng Chen、Zhizhong Tan、Shan Chen、Lei Wang、Yan Liu、Tai Io San、Sou Wang Fong、Wenyong Wang 和 Jing Feng。*应用科学杂志*。2024 年 6 月。\n- [STALE：利用电子邮件和ECDH密钥交换的可扩展、安全的跨境认证方案](https://www.mdpi.com/2079-9292/14/12/2399).Jiexin Zheng, Mudi Xu, Jianqing Li, Benfeng Chen, Zhizhong Tan, Anyu Wang, Shuo Zhang, Yan Liu, Kevin Qi Zhang, Lirong Zheng, 和 Wenyong Wang.*电子学报*。2025年6月。\n- [DRL-AMIR：软件定义的零信任网络的智能流调度](https://www.techscience.com/cmc/v84n2/62920).Wenlong Ke, Zilong Li, Peiyu Chen, Benfeng Chen, Jinglin Lv, Qiang Wang, Ziyi Jia 和 Shigen Shen. *计算机材料和连续通信*。2025年7月。\n-- [基于深度强化学习的NHP网络流量控制方法](https://www.nature.com/articles/s41598-025-31556-3)。Qinglin Huang, Zhizhong Tan, Qiang Wang, Ziyi Jia 和 Benfeng Chen. *科学报告*。 2025年12月。\n- Noise 协议框架。https://noiseprotocol.org/\n- 漏洞管理框架项目。https://phoenix.security/web-vuln-management/\n\n---\n\n🌟 感谢您对 OpenNHP 的关注！我们期待您的贡献和反馈。\n\n"
  },
  {
    "path": "SECURITY.md",
    "content": "# Security Policy\n\n## Reporting Security Issues\n\nThe OpenNHP team and community take security bugs in OpenNHP seriously. We appreciate your efforts to responsibly disclose your findings, and will make every effort to acknowledge your contributions.\n\nTo report a security issue, please use the GitHub Security Advisory [\"Report a Vulnerability\"](https://github.com/opennhp/opennhp/security/advisories/new) tab.\n\nThe OpenNHP team will send a response indicating the next steps in handling your report. After the initial reply to your report, the security team will keep you informed of the progress towards a fix and full announcement, and may ask for additional information or guidance.\n\nReport security bugs in third-party modules to the person or team maintaining the module. \n\n"
  },
  {
    "path": "build.bat",
    "content": "@echo off\r\n\r\ncd %~dp0\r\n\r\nFOR /F %%i in ('powershell -c \"get-date -format yyMMddHHmmss\"') do SET BUILD_NO=%%i\r\nFOR /F \"tokens=*\" %%a in (nhp\\version\\VERSION) do SET VERSION=%%a.%BUILD_NO%\r\necho OpenNHP version: %VERSION%\r\nFOR /F \"tokens=* usebackq\" %%a in (`\"git show -s \"--format^=%%H\"\"`) do SET COMMIT_ID=%%a\r\necho Commit id: %COMMIT_ID%\r\nFOR /F \"tokens=* usebackq\" %%a in (`\"git show -s \"--format^=%%cd\" \"--date^=format:%%Y-%%m-%%d %%H:%%M:%%S\"\"`) do SET COMMIT_TIME=%%a\r\necho Commit time: %COMMIT_TIME%\r\nFOR /F \"tokens=1 usebackq\" %%a in (`echo %date%`) do SET CURR_DATE=%%a\r\nFOR /F \"tokens=1 delims=. usebackq\" %%a in (`echo %time%`) do SET CURR_TIME=%%a\r\nSET BUILD_TIME=%CURR_DATE% %CURR_TIME%\r\necho Build time: %BUILD_TIME%\r\n\r\nset LD_FLAGS=\"-X 'github.com/OpenNHP/opennhp/nhp/version.Version=%VERSION%' -X 'github.com/OpenNHP/opennhp/nhp/version.CommitId=%COMMIT_ID%' -X 'github.com/OpenNHP/opennhp/nhp/version.CommitTime=%COMMIT_TIME%' -X 'github.com/OpenNHP/opennhp/nhp/version.BuildTime=%BUILD_TIME%'\"\r\nset CGO_ENABLED=1\r\n\r\ncd nhp\r\ngo mod tidy\r\ncd ../endpoints\r\ngo mod tidy\r\n\r\n:agentd\r\ngo build -trimpath -ldflags %LD_FLAGS% -v -o ..\\release\\nhp-agent\\nhp-agentd.exe agent\\main\\main.go\r\nIF %ERRORLEVEL% NEQ 0 goto :exit\r\nif not exist ..\\release\\nhp-agent\\etc mkdir ..\\release\\nhp-agent\\etc\r\ncopy agent\\main\\etc\\*.* ..\\release\\nhp-agent\\etc\r\n\r\n:acd\r\ngo build -trimpath -ldflags %LD_FLAGS% -v -o ..\\release\\nhp-ac\\nhp-acd.exe ac\\main\\main.go\r\nIF %ERRORLEVEL% NEQ 0 goto :exit\r\nif not exist ..\\release\\nhp-ac\\etc mkdir ..\\release\\nhp-ac\\etc\r\ncopy  ac\\main\\etc\\*.* ..\\release\\nhp-ac\\etc\r\n\r\n:serverd\r\ngo build -trimpath -ldflags %LD_FLAGS% -v -o ..\\release\\nhp-server\\nhp-serverd.exe server\\main\\main.go\r\nIF %ERRORLEVEL% NEQ 0 goto :exit\r\nif not exist ..\\release\\nhp-server\\etc mkdir ..\\release\\nhp-server\\etc\r\ncopy  server\\main\\etc\\*.* ..\\release\\nhp-server\\etc\r\n\r\n:db\r\ngo build -trimpath -ldflags %LD_FLAGS% -v -o ..\\release\\nhp-db\\nhp-db.exe db\\main\\main.go\r\nIF %ERRORLEVEL% NEQ 0 goto :exit\r\nif not exist ..\\release\\nhp-db\\etc mkdir ..\\release\\nhp-db\\etc\r\ncopy  db\\main\\etc\\*.* ..\\release\\nhp-db\\etc\r\n\r\n:kgc\r\ngo build -trimpath -ldflags %LD_FLAGS% -v -o ..\\release\\nhp-kgc\\nhp-kgc.exe kgc\\main\\main.go\r\nIF %ERRORLEVEL% NEQ 0 goto :exit\r\nif not exist ..\\release\\nhp-kgc\\etc mkdir ..\\release\\nhp-kgc\\etc\r\ncopy  kgc\\main\\etc\\*.* ..\\release\\nhp-kgc\\etc\r\n\r\n:agentsdk\r\ngo build -trimpath -buildmode=c-shared -ldflags %LD_FLAGS% -v -o ..\\release\\nhp-agent\\nhp-agent.dll agent\\main\\main.go agent\\main\\export.go\r\nIF %ERRORLEVEL% NEQ 0 goto :exit\r\n@REM :devicesdk\r\n@REM go build -trimpath -buildmode=c-shared -ldflags %LD_FLAGS% -v -o release\\nhp-device\\nhpdevice.dll core\\main\\main.go core\\main\\nhpdevice.go\r\n@REM IF %ERRORLEVEL% NEQ 0 exit /b 1\r\n@REM REM gcc nhp\\sdkdemo\\nhp-device-demo.c -I nhp\\main -I release\\nhp-device -l:nhpdevice.dll -Lrelease\\nhp-device -Wl,-rpath=. -o release\\nhp-device\\nhp-device-demo.exe\r\n@REM IF %ERRORLEVEL% NEQ 0 exit /b 1\r\n@REM cd release\\nhp-device\r\n@REM call \"C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Community\\VC\\Auxiliary\\Build\\vcvarsall.bat\" x64\r\n@REM lib /def:./nhpdevice.def /name:nhpdevice.dll /out:./nhpdevice.lib /MACHINE:X64\r\n@REM cd ..\\..\r\n\r\n:exit\r\nIF %ERRORLEVEL% NEQ 0 (\r\n    echo [Error] %ERRORLEVEL%\r\n) ELSE (\r\n    echo [Done] OpenNHP v%VERSION% for platform %OS% built!\r\n)\r\ncd ..\r\n"
  },
  {
    "path": "codecov.yml",
    "content": "codecov:\r\n  require_ci_to_pass: yes\r\n\r\ncoverage:\r\n  precision: 2\r\n  round: down\r\n  range: \"60...100\"\r\n  status:\r\n    project:\r\n      default:\r\n        target: auto\r\n        threshold: 1%\r\n    patch:\r\n      default:\r\n        target: auto\r\n        threshold: 1%\r\n\r\nparsers:\r\n  gcov:\r\n    branch_detection:\r\n      conditional: yes\r\n      loop: yes\r\n      method: no\r\n      macro: no\r\n\r\ncomment:\r\n  layout: \"reach,diff,flags,files\"\r\n  behavior: default\r\n  require_changes: no\r\n"
  },
  {
    "path": "docker/Dockerfile.ac",
    "content": "FROM opennhp-base:latest AS builder\nWORKDIR /nhp-server\n\nCOPY . .\n\nRUN echo \"Building for architecture: ${TARGETARCH}\"\n\nRUN cd /nhp-server &&  make init acd\n\nFROM ubuntu:22.04  AS runtime\n\nARG APT_MIRROR=\nENV DEBIAN_FRONTEND=noninteractive\n\n# Switch APT mirror if specified\nRUN if [ -n \"$APT_MIRROR\" ]; then \\\n    sed -i \"s|ports.ubuntu.com|${APT_MIRROR}|g\" /etc/apt/sources.list && \\\n    sed -i \"s|archive.ubuntu.com|${APT_MIRROR}|g\" /etc/apt/sources.list && \\\n    sed -i \"s|security.ubuntu.com|${APT_MIRROR}|g\" /etc/apt/sources.list; \\\n    fi\n\nRUN apt-get update && \\\n    apt-get install -y  wget \\\n    ca-certificates \\\n    iptables \\\n    tcpdump \\\n    clang \\\n    ipset \\\n    git \\\n    curl \\\n    telnet \\\n    && rm -rf /var/lib/apt/lists/*\n\n# Traefik version\nARG TRAEFIK_VERSION=v2.10.4\n\n# traefik config\nRUN mkdir -p /opt/traefik/\n\n# Copy the traefik configuration file\nCOPY --from=builder /nhp-server/docker/traefik_v3.4.0-rc2_linux_amd64.tar.gz /traefik.tar.gz\nRUN tar -zxvf traefik.tar.gz && \\\n    mv traefik /opt/traefik/ && \\\n    chmod +x /opt/traefik/traefik && \\\n    rm -rf /tmp/*\n\nCOPY --from=builder /nhp-server/release/nhp-ac /nhp-ac\nCOPY --from=builder /nhp-server/docker/iptables_defaults_ubuntu.sh /iptables_defaults_ubuntu.sh\nCOPY --from=builder /nhp-server/docker/iptables_defaults_x86.sh /iptables_defaults_x86.sh\nRUN if [ \"$(uname -m)\" = \"x86_64\" ]; then \\\n        mv /iptables_defaults_x86.sh /iptables_defaults.sh; \\\n    else \\\n        mv /iptables_defaults_ubuntu.sh /iptables_defaults.sh; \\\n    fi && \\\n    chmod +x /iptables_defaults.sh && \\\n    rm -f /iptables_defaults_*.sh\n\nENTRYPOINT [\"/bin/sh\", \"-c\"]\nCMD [\"/iptables_defaults.sh -f && cd /opt/traefik/ && nohup ./traefik --configFile=traefik.toml 2>&1 & -- & /nhp-ac/nhp-acd run\"]\n#ENTRYPOINT [\"/nhp-ac/nhp-acd\", \"run\"]\n"
  },
  {
    "path": "docker/Dockerfile.agent",
    "content": "FROM opennhp-base:latest  AS builder\n\nWORKDIR /workdir\n\nCOPY . .\n\nRUN echo \"Building for architecture: ${TARGETARCH}\"\n\nRUN cd /workdir && cat Makefile && make init agentd\n\nENV DEBIAN_FRONTEND=noninteractive\nRUN apt-get update && \\\n    apt-get install -y  wget \\\n    ca-certificates \\\n    iptables \\\n    tcpdump \\\n    clang \\\n    ipset \\\n    nginx \\\n    git \\\n    curl \\\n    inetutils-ping \\\n    telnet \\\n    && rm -rf /var/lib/apt/lists/*\nRUN groupadd -r nginx && \\\n    useradd -r -g nginx -s /bin/bash -d /home/nginx -m nginx\n\nRUN mv /workdir/release/nhp-agent /nhp-agent\nUSER root\n\nCMD [\"tail\", \"-f\", \"/dev/null\"]\n#CMD [\"nginx && /nhp-agent/nhp-agentd run\"]\n#CMD [\"nginx\"]"
  },
  {
    "path": "docker/Dockerfile.app",
    "content": "FROM --platform=$BUILDPLATFORM ubuntu:22.04 AS builder\n\n# Get target platform architecture\nARG TARGETARCH\nARG TARGETOS\nARG APT_MIRROR=\n\n# Switch APT mirror if specified\nRUN if [ -n \"$APT_MIRROR\" ]; then \\\n    sed -i \"s|ports.ubuntu.com|${APT_MIRROR}|g\" /etc/apt/sources.list && \\\n    sed -i \"s|archive.ubuntu.com|${APT_MIRROR}|g\" /etc/apt/sources.list && \\\n    sed -i \"s|security.ubuntu.com|${APT_MIRROR}|g\" /etc/apt/sources.list; \\\n    fi\n\n# Install basic tools\nRUN apt-get update && \\\n    apt-get install -y --no-install-recommends \\\n    build-essential \\\n    wget \\\n    ca-certificates \\\n    clang \\\n    iptables \\\n    tcpdump \\\n    ipset \\\n    git \\\n    && rm -rf /var/lib/apt/lists/*\n\n# Set Go version\nENV GO_VERSION=1.25.6\n\n# Set Go download URL based on architecture\nRUN case \"${TARGETARCH}\" in \\\n    \"amd64\") \\\n        GO_ARCH=\"linux-amd64\" \\\n        ;; \\\n    \"arm64\") \\\n        GO_ARCH=\"linux-arm64\" \\\n        ;; \\\n    \"arm\") \\\n        GO_ARCH=\"linux-armv6l\" \\\n        ;; \\\n    *) \\\n        echo \"Unsupported architecture: ${TARGETARCH}\" && exit 1 \\\n        ;; \\\n    esac && \\\n    wget https://golang.org/dl/go${GO_VERSION}.${GO_ARCH}.tar.gz -O /tmp/go.tar.gz && \\\n    tar -C /usr/local -xzf /tmp/go.tar.gz && \\\n    rm /tmp/go.tar.gz\n\n# Set Go environment variables\nENV PATH=\"/usr/local/go/bin:${PATH}\"\nENV GOPATH=/go\nENV PATH=\"${GOPATH}/bin:${PATH}\"\nENV GOOS=${TARGETOS}\nENV GOARCH=${TARGETARCH}\nENV CGO_ENABLED=1\n\n# Verify installations\nRUN go version && \\\n    gcc --version && \\\n    make --version\n# Set working directory\nWORKDIR /app\n\n# Copy the source code\nCOPY ./web-app .\n##\n# Build the application\nRUN CGO_ENABLED=0 GOOS=linux go mod tidy && go build -o app\n\n# Stage 2: Create a minimal runtime image\nFROM ubuntu:22.04\n\nARG APT_MIRROR=\n\n# Switch APT mirror if specified\nRUN if [ -n \"$APT_MIRROR\" ]; then \\\n    sed -i \"s|ports.ubuntu.com|${APT_MIRROR}|g\" /etc/apt/sources.list && \\\n    sed -i \"s|archive.ubuntu.com|${APT_MIRROR}|g\" /etc/apt/sources.list && \\\n    sed -i \"s|security.ubuntu.com|${APT_MIRROR}|g\" /etc/apt/sources.list; \\\n    fi\n\nRUN apt-get update && \\\n    apt-get install -y --no-install-recommends \\\n    build-essential \\\n    wget \\\n    ca-certificates \\\n    clang \\\n    iptables \\\n    tcpdump \\\n    && rm -rf /var/lib/apt/lists/*\n\n# Set working directory\nWORKDIR /root/\n\n# Copy the binary from builder\nCOPY --from=builder /app/app /app\nCOPY ./web-app/entrypoint.sh /entrypoint.sh\nRUN chmod +x /entrypoint.sh\n\n# Expose port 8080\nEXPOSE 8080\n\n# Command to run the application\nENTRYPOINT [\"/entrypoint.sh\"]\n"
  },
  {
    "path": "docker/Dockerfile.base",
    "content": "FROM --platform=$BUILDPLATFORM ubuntu:22.04 AS builder\n\n# Get target platform architecture\nARG TARGETARCH\nARG TARGETOS\nARG GOPROXY=https://proxy.golang.org,direct\nARG GO_VERSION=1.25.6\nARG APT_MIRROR=\n\n# Set Proxy\nENV GOPROXY=${GOPROXY}\n\n# Switch APT mirror if specified (for users in China, use mirrors.aliyun.com)\nRUN if [ -n \"$APT_MIRROR\" ]; then \\\n    sed -i \"s|ports.ubuntu.com|${APT_MIRROR}|g\" /etc/apt/sources.list && \\\n    sed -i \"s|archive.ubuntu.com|${APT_MIRROR}|g\" /etc/apt/sources.list && \\\n    sed -i \"s|security.ubuntu.com|${APT_MIRROR}|g\" /etc/apt/sources.list; \\\n    fi\n\n# Install basic tools\nRUN apt-get update && \\\n    apt-get install -y --no-install-recommends \\\n    build-essential \\\n    wget \\\n    ca-certificates \\\n    clang \\\n    iptables \\\n    tcpdump \\\n    ipset \\\n    git \\\n    vim \\\n    && rm -rf /var/lib/apt/lists/*\n\n# Set Go version\nENV GO_VERSION=${GO_VERSION}\n\n# Set Go download URL based on architecture\nRUN case \"${TARGETARCH}\" in \\\n    \"amd64\") \\\n        GO_ARCH=\"linux-amd64\" \\\n        ;; \\\n    \"arm64\") \\\n        GO_ARCH=\"linux-arm64\" \\\n        ;; \\\n    \"arm\") \\\n        GO_ARCH=\"linux-armv6l\" \\\n        ;; \\\n    *) \\\n        echo \"Unsupported architecture: ${TARGETARCH}\" && exit 1 \\\n        ;; \\\n    esac && \\\n    wget https://golang.org/dl/go${GO_VERSION}.${GO_ARCH}.tar.gz -O /tmp/go.tar.gz && \\\n    tar -C /usr/local -xzf /tmp/go.tar.gz && \\\n    rm /tmp/go.tar.gz\n\n# Set Go environment variables\nENV PATH=\"/usr/local/go/bin:${PATH}\"\nENV GOPATH=/go\nENV PATH=\"${GOPATH}/bin:${PATH}\"\nENV GOOS=${TARGETOS}\nENV GOARCH=${TARGETARCH}\nENV CGO_ENABLED=1\n# Force all builds to use go1.25.6 to ensure plugin compatibility\nENV GOTOOLCHAIN=go1.25.6\n\n# Verify installations\nRUN go version && \\\n    gcc --version && \\\n    make --version\n\n# Set working directory\nWORKDIR /nhp-server\n\n# Default command (keep container running)\nCMD [\"tail\", \"-f\", \"/dev/null\"]"
  },
  {
    "path": "docker/Dockerfile.server",
    "content": "FROM opennhp-base:latest  AS builder\n\nWORKDIR /nhp-server\n\nCOPY . .\n\nRUN echo \"Building for architecture: ${TARGETARCH}\"\n\nRUN cd /nhp-server &&  make init serverd plugins\n\nFROM ubuntu:22.04  AS runtime\n\nARG APT_MIRROR=\nENV DEBIAN_FRONTEND=noninteractive\n\n# Switch APT mirror if specified\nRUN if [ -n \"$APT_MIRROR\" ]; then \\\n    sed -i \"s|ports.ubuntu.com|${APT_MIRROR}|g\" /etc/apt/sources.list && \\\n    sed -i \"s|archive.ubuntu.com|${APT_MIRROR}|g\" /etc/apt/sources.list && \\\n    sed -i \"s|security.ubuntu.com|${APT_MIRROR}|g\" /etc/apt/sources.list; \\\n    fi\n\nRUN apt-get update && \\\n    apt-get install -y  wget \\\n    ca-certificates \\\n    nginx \\\n    iptables \\\n    tcpdump \\\n    ipset \\\n    git \\\n    curl \\\n    telnet \\\n    vim \\\n    && rm -rf /var/lib/apt/lists/*\n\nCOPY --from=builder /nhp-server/release/nhp-server /nhp-server\n\nENTRYPOINT [\"/bin/sh\", \"-c\"]\nCMD [\"nginx & /nhp-server/nhp-serverd run\"]"
  },
  {
    "path": "docker/certs/server.crt",
    "content": "-----BEGIN CERTIFICATE-----\nMIIFKDCCAxCgAwIBAgIUR0G6YkK3Fjt2uqAEtfjlAgzxxoowDQYJKoZIhvcNAQEL\nBQAwFTETMBEGA1UEAwwKb3Blbm5ocC5jbjAeFw0yNTA0MjkwOTQyMTJaFw0yNjA0\nMjkwOTQyMTJaMBUxEzARBgNVBAMMCm9wZW5uaHAuY24wggIiMA0GCSqGSIb3DQEB\nAQUAA4ICDwAwggIKAoICAQCr9I9uWvVZU8PU50/T4eN+Qp+B+j9WtGI8vqrT8dMU\nNhbCvbx8HCtwlxBnw55TagvDhauiIULD4MAmEjtsFt5AvlB2oiPjmCNVPuQK5FNt\nFyO+9DlYAsPm6weF7uKv86CGTb+16SwY++u/oM/8saifTY4oR94GAUqN/RSiutJK\nvMbjUcUEGHRdLJCX+soxvWGWAUx3DudssOIoKR2S2AVZB5rBW58gfb5/i0k24Jb6\nryJdIzRA4nWtuRNMht2jxcywtayZaKr0uROajXdW/AP87huowyOCiajvg2wy4jh/\nCFDHdb7pcss1H+A7YxEKstHAR+sZbPifLxGP2Ugo3S4k6yjclnRz4q2xpEBEE1/9\numRKnjZrABAUdo0lfTw41xYQCEg3cBglTOnvMtixGdmsjjO1JGvbL6tEY5CWtdMY\n7FfToxJVK1TfrSmOoN0A8ahumKjeOPrckgSzxlUVJ0URcxSTnqFGo526JK+ex+OD\n096hG9QvLd2KhgJCYAirY5aWVppL23yb/CGRPYmAgDp5EX7kSpDPYKe8fNQyXCVA\nlPhE/DZ7D4FpWlQnRtApCGmX1jqN54Cq02srCiBPm1x1aS9VSUKjNDc3LLHFkyTv\nEZ8AIGnh032V1diXVK8qSJHoIcsBs2gSiYX3h0BZv3ycv5482JGX9RXG/qi1WzJy\nNwIDAQABo3AwbjAdBgNVHQ4EFgQUdwviO9R5EaGw+x802uZYXHCl6MgwHwYDVR0j\nBBgwFoAUdwviO9R5EaGw+x802uZYXHCl6MgwDwYDVR0TAQH/BAUwAwEB/zAbBgNV\nHREEFDASggpvcGVubmhwLmNuhwR/AAABMA0GCSqGSIb3DQEBCwUAA4ICAQCZ2dzQ\nTIDgfGA6TPNF5azvVcxa+KN0ixBKaNh/6ziQLLGkD8clBzWCYzRx8PTxlv7K7Rvw\nKwyK5mR2WM53ypfTmOEBoucwnzGMJhTSubCnPcRoUbqE0Lyu9UHnf31u9eYQYVNH\nqj9mrpI7aLsqC6OWnR0aaY008rOSeQCEo/YdPszxaPyzZMYrKZ0gzLBF4Jr+i3CQ\n6pDFWuj9MyThbqJb8P7+knqoYOGwwCiMRqLmtT1MdFFRtVkJRi1gorYXtzn6Pvnp\nC3dU2p73PlVRgyR0Sc23iHVNeG2B9FVU2BOZGfq0hMxjbyCaANvSmuR74JwqWxwO\nJSN0Zw4i250X8Bb3tb0krYI2YMTU60phr98cO7Ha8BtL030zWz2VQYyPLNCuo/r7\nQVgFit236STHsO1N6K9uE8HGKic3TxmOyPecCXkyjkajJsQtIwzTDbxzeib+w5Ic\nlZt4ROyrf+Z6P974at2xVp2E7EfpK7YgflwVRMwCOSylWMLBesrmqGxRCmxwuPoz\nBT51S0ijamkRjGoJj+C8/Jwnf6Qj62tmCQAE0ZsiE0Mrb+NBWEwROQt7dB5i8GHR\n0w3G4EmmGT/ZQ3QHnodfdcuyD2EvFxm6hzpTOfBoIKIkgTAaUFks3PHlMWncsq9u\nZd0Z5e6C4p/chC0xhkI2e132xejhVprF2EbYHw==\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "docker/certs/server.key",
    "content": "-----BEGIN PRIVATE KEY-----\nMIIJQwIBADANBgkqhkiG9w0BAQEFAASCCS0wggkpAgEAAoICAQCr9I9uWvVZU8PU\n50/T4eN+Qp+B+j9WtGI8vqrT8dMUNhbCvbx8HCtwlxBnw55TagvDhauiIULD4MAm\nEjtsFt5AvlB2oiPjmCNVPuQK5FNtFyO+9DlYAsPm6weF7uKv86CGTb+16SwY++u/\noM/8saifTY4oR94GAUqN/RSiutJKvMbjUcUEGHRdLJCX+soxvWGWAUx3DudssOIo\nKR2S2AVZB5rBW58gfb5/i0k24Jb6ryJdIzRA4nWtuRNMht2jxcywtayZaKr0uROa\njXdW/AP87huowyOCiajvg2wy4jh/CFDHdb7pcss1H+A7YxEKstHAR+sZbPifLxGP\n2Ugo3S4k6yjclnRz4q2xpEBEE1/9umRKnjZrABAUdo0lfTw41xYQCEg3cBglTOnv\nMtixGdmsjjO1JGvbL6tEY5CWtdMY7FfToxJVK1TfrSmOoN0A8ahumKjeOPrckgSz\nxlUVJ0URcxSTnqFGo526JK+ex+OD096hG9QvLd2KhgJCYAirY5aWVppL23yb/CGR\nPYmAgDp5EX7kSpDPYKe8fNQyXCVAlPhE/DZ7D4FpWlQnRtApCGmX1jqN54Cq02sr\nCiBPm1x1aS9VSUKjNDc3LLHFkyTvEZ8AIGnh032V1diXVK8qSJHoIcsBs2gSiYX3\nh0BZv3ycv5482JGX9RXG/qi1WzJyNwIDAQABAoICAAE87QLD4ov77OctqnxMM4mX\nVt5Q3BThOUCBCj96uGTRsN9CY3GB+GltRP/M6j5lKeQvTwQx+MY/6ieRWQksWaRI\nr9FIKzmlFkKzsGDzB4tmWmpdCBlTR8V0ABAIShcvNK19hiRRTfEjcIKRg1MpP51f\nVGcuK/HfdNcfMSoCGKfTbRvPh7tsUPt8vyZroU9eCC5UIGX5CanVf4NU1x2ACFB9\nnAZ0BOoZzah4axSwkEBfc2q36VU67ChN3U7fPQhD+8xyj7q5BLC8sQtF+nZ6Blio\nqYf7rlfvFXQdU5xC1wT0conFFhSd2ssCnugpN0MG9ONNVpV5HInKL8uuf5+qW/3Y\nBuOFpUdOW1JcuhWc81Lw7Dl6h26wG04Aq62YW2jbQfCnf+qwAGxDWn1k0p6Wdghf\neTQ7jnLKuDJIJ9OnKBFtrNQY/D0fQY4yNIqgWzuaWnrMvZUso3u9MLNM1IYFJOAZ\n9vrmlC8O0LZgLRPWES1gpCN2eEJPvI6y/jiAj5JToHxTODWcsTMeRZA6hx5+ZZl5\nJOsYHzGTuHNf6mL/hVPE/whcCcI8dEDipkegKbn9LVUw1El0sI6Qjx2xIlmniB5G\ndOzVpgHpSeRPk3P3HWqSAMqenU26rz2GCq13+sLyeBXwvt8AA6bGiLkzivDcKlk3\nXAjR3qelWJARcYpu6z4BAoIBAQDeQ1EDCAcvsuic2VytZbXU2ogP9WArU8S8V0n4\nFwSrcHasKX1tL1+RJtcOkkC72YC+EfcKx/XCPbOn+CAgjnUCjSsmpoQ+p1PhaMTF\n3t+HIe5lZ2lmlf8aHXjqNCGKh5Iu3AmmPcwNFficbqlIfHNUYkDvlSLM0NOxO2G/\n7xlCNKSOOrKw6PRtWZN8WPhaJZzs6vZC+04QEPIFBmd6K9f/rNsOIg/r7ndIIEQ9\nMLG4GaHd7Qany0CVuM+hE2g86QZNjEwiMk6q/IuLZ001oszOPRuCyVlJsqYzQlID\nzLBvfK3Vru0wMUt0Kzr9Ey2KGxm9fzLnsGrXlUR/XFfIQdQ3AoIBAQDGDmRPzTVI\nv54MrPtGACCEa24MoSOtZ1c/CmYJKrHGHepTODdML51Au+gi0jKm6QV37F53rUri\n5kkDhE+1VyG/Jr8DVlOYTaDnqBpNAfNXfaVtX7SLJF3H9uEMgzytWFtFzehYMh8q\nmBwzdU9N11CefmYsN2PqTJc+ntIYPOYHn0fCHX8tNfvxKHoiHrS4hfb1QLKY1cgT\nWskvI6eqi+yc0STOGD+eSiXwSxFeEmhDv80CQxCe6/xPDRm2+dkOGAa2ysGVptwE\nOhLqZNpC5YDk3swSDH+AfsYQ+uks81XSvDSxIQLCs8WgV4jC40F94Yfecn8YrnAf\nG147glO9QVIBAoIBAQDFQ83E+P0X0pwtiaV9qEYH0qTsNQXTrpdv6bEW5acZWcmZ\n54EQxPj25Rf+MMQPdW2URHGUOgDfEtA/BjPNcWJcj1p7BVNeIDiMWOY8ECEn2G+z\nxGKB0CMH1JyakQYr40NVH6nYyAQwoQ10GatZUEsz27hya1Tln3ojVObe6KDsZ7id\nG2+5ICjAXL5PoM9bgwKSK7/BlzWjgMasuxBgGEWvAIWzN3wWFCH9+9VU0cEJ+oX1\naAd+KSD7QXnWJllfphoX/asctrWngFmBsn+OWR2Y9hdSrs32YP6tg/Eyuhrl+Cx4\n+LY/DaFAS5YhQ0Ipzv+7dgeCJsvM5whSWWz3qaVlAoIBABmTXDLN7haR4AgFAoG8\nnHZdJR3uZRwMX0Ddx+VhJQnPbSYH+WQWNflZCpYMjMvvBWzCEkTkFOqOEFmq6Vwi\nf1Ie38W/jRX62E9x7suI9/KRYB5qoHbjYFTlNZSXEevUoBy4hUt2VX37nJCskmwb\n5OZCrlEBah6ke1dzzO+iVZYgZHTVuEmPUhSHRJZJXs8BRa3QCAAigy60p4w1z33/\nibOKcnVGvlhjfNi16O079UjiaMfk/y12jeNrbqmpQ/VE9wD919fKb1kAYtbv5RuE\nZYuolbOy93gRZuRkcl4Cok+PTEKfX6ri6h9VjmyUSi3GRPRd1rnKNOJfd2C56LRk\nzgECggEBAKJb6aoGJRT96RwuMrsENJQ0H3STu49zC8O/mEn6Orw/29vo1+qlvT9P\nZ+iRBbgG1oQZbceT4zRj22eqYf4lG9pwSd0neUq+Os9jdDv8XPXIS9b7RL1SgQtR\n/Y686KX6Rd4Yjyd9zbjpHGJa5iEzSBvbEYoWavC1ayxVp1bBjIOgrHwV3AvlNc50\nZiKZV+C6JCw5EMeYzFJnCeQciY5eUuDp5FbxkowEP7F3c/qQWiEbtaPBqcOmI1Jv\niGjLRoyLbIF/fpE5bRK10MZCQSZy1pOsfAyyBCyZtuNnX3CTnW+b7SvTACnPIClC\n+T3/6HbDSpvkk5fhbMR5QkMLg3Tv8RA=\n-----END PRIVATE KEY-----\n"
  },
  {
    "path": "docker/docker-compose.dhp.yaml",
    "content": "networks:\n  network_default:\n    ipam:\n      driver: default\n      config:\n        - subnet: '177.7.0.0/16'\n\nvolumes:\n  postgres_data:\n\nservices:\n  nhp-server:\n    image: opennhp-server\n    build:\n      context: ..\n      dockerfile: ./docker/Dockerfile.server\n      args:\n        - GOPROXY=${GOPROXY:-}\n    container_name: nhp-server\n    restart: always\n    networks:\n      network_default:\n        ipv4_address: 177.7.0.9\n    volumes:\n      - ./nhp-server/etc/:/nhp-server/etc/:rw\n      - ./nhp-server/logs/:/nhp-server/logs/:rw\n      - ./nhp-server/templates/:/nhp-server/templates/:rw\n      - ./nhp-server/plugins/example/etc/:/nhp-server/plugins/example/etc/:rw\n\n  nhp-db:\n    image: opennhp-db\n    container_name: nhp-db\n    build:\n      context: ..\n      dockerfile: ./docker/Dockerfile.db\n      args:\n        - GOPROXY=${GOPROXY:-}\n    volumes:\n      - ./nhp-db/etc/:/nhp-db/etc/\n      - ./nhp-db/logs/:/nhp-db/logs/\n      - ./nhp-db/demo/:/nhp-db/demo/\n    restart: always\n    cap_add:\n      - NET_ADMIN\n    depends_on:\n      - nhp-server\n    networks:\n      network_default:\n        ipv4_address: 177.7.0.12\n\n  nhp-agent:\n    image: opennhp-agent:latest\n    build:\n      context: ..\n      dockerfile: ./docker/Dockerfile.agent\n      args:\n        - GOPROXY=${GOPROXY:-}\n    container_name: nhp-agent\n    restart: always\n    #command: []\n    ports:\n      - \"8443:443\"\n    networks:\n      network_default:\n        ipv4_address: 177.7.0.8\n    depends_on:\n      - nhp-server\n      - nhp-db\n    volumes:\n      - ./nhp-agent/etc:/nhp-agent/etc:rw\n      - ./nhp-agent/logs:/nhp-agent/logs:rw\n"
  },
  {
    "path": "docker/docker-compose.yaml",
    "content": "networks:\n  network_default:\n    ipam:\n      driver: default\n      config:\n        - subnet: '177.7.0.0/16'\n\nvolumes:\n  postgres_data: \n\nservices:\n  nhp-server:\n    image: opennhp-server\n    build:\n      context: ..\n      dockerfile: ./docker/Dockerfile.server\n      args:\n        - GOPROXY=${GOPROXY:-}\n        - APT_MIRROR=${APT_MIRROR:-}\n    container_name: nhp-server\n    restart: always\n    networks:\n      network_default:\n        ipv4_address: 177.7.0.9\n    volumes:\n      - ./nhp-server/etc/:/nhp-server/etc/:rw\n      - ./nhp-server/logs/:/nhp-server/logs/:rw\n      - ./nhp-server/templates/:/nhp-server/templates/:rw\n      - ./nhp-server/plugins/example/etc/:/nhp-server/plugins/example/etc/:rw\n\n  nhp-ac:\n    image: opennhp-ac\n    container_name: nhp-ac\n    build:\n      context: ..\n      dockerfile: ./docker/Dockerfile.ac\n      args:\n        - GOPROXY=${GOPROXY:-}\n        - APT_MIRROR=${APT_MIRROR:-}\n    volumes:\n      - ./nhp-ac/etc/:/nhp-ac/etc/\n      - ./nhp-ac/traefik/etc/traefik.toml:/opt/traefik/traefik.toml\n      - ./nhp-ac/traefik/etc/provider.toml:/opt/traefik/provider.toml\n      - ./nhp-ac/logs/:/nhp-ac/logs/\n    restart: always\n    cap_add:\n      - NET_ADMIN\n    depends_on:\n      - nhp-server\n    networks:\n      network_default:\n        ipv4_address: 177.7.0.10\n\n  web-app:\n    image: web-app\n    container_name: web-app\n    build:\n      context: .\n      dockerfile: ./Dockerfile.app\n      args:\n        - GOPROXY=${GOPROXY:-}\n        - APT_MIRROR=${APT_MIRROR:-}\n    restart: always\n    cap_add:\n      - NET_ADMIN\n    networks:\n      network_default:\n        ipv4_address: 177.7.0.11\n\n  nhp-agent:\n    image: opennhp-agent:latest\n    build:\n      context: ..\n      dockerfile: ./docker/Dockerfile.agent\n      args:\n        - GOPROXY=${GOPROXY:-}\n        - APT_MIRROR=${APT_MIRROR:-}\n    container_name: nhp-agent\n    restart: always\n    #command: []\n    ports:\n      - \"443:443\"\n      - \"80:80\"\n    networks:\n      network_default:\n        ipv4_address: 177.7.0.8\n    depends_on:\n      - nhp-server\n      - nhp-ac\n    volumes:\n      - ./nhp-enter-nginx.conf:/etc/nginx/nginx.conf:rw\n      - ./certs/server.crt:/cert.pem:r\n      - ./certs/server.key:/key.pem:r\n      - ./nhp-agent/etc:/nhp-agent/etc:rw\n      - ./nhp-agent/logs:/nhp-agent/logs:rw"
  },
  {
    "path": "docker/iptables_defaults_ubuntu.sh",
    "content": "#!/bin/bash\nCURRENT_DIR=$(cd \"$(dirname \"$0\")\" && pwd)\nif [ \"$1\" = \"-f\" ];then\n    echo \"Flushing existing iptables rules...\"\n    # Set DROP policy first to avoid exposure window during flush\n    iptables -P INPUT DROP\n    iptables -P FORWARD DROP\n    iptables -F\n    iptables -X\n    # Flush ipsets to clear previously authorized tuples\n    ipset flush 2>/dev/null || true\n    ipset destroy 2>/dev/null || true\n    # Flush IPv6 rules as well\n    if which ip6tables > /dev/null 2>&1; then\n        ip6tables -P INPUT DROP\n        ip6tables -P FORWARD DROP\n        ip6tables -F\n        ip6tables -X\n    fi\nfi\n### ipset (IPv4) ###\necho \"Setting up IPv4 ipset\"\necho \"\"\nipset -exist create defaultset hash:ip,port,ip counters maxelem 1000000 timeout 120\nipset -exist create defaultset_down hash:ip,port,ip counters maxelem 1000000 timeout 121\nipset -exist create tempset hash:net,port counters maxelem 1000000 timeout 5\necho \"\"\necho \"Setting IPv4 ipset OK ...\"\n\n### ipset (IPv6) ###\nIP6TABLES=$(which ip6tables 2>/dev/null)\nIPSET6_OK=0\nif [ -n \"$IP6TABLES\" ]; then\n    echo \"Setting up IPv6 ipset\"\n    ipset -exist create defaultset_v6 hash:ip,port,ip family inet6 counters maxelem 1000000 timeout 120 2>/dev/null || true\n    ipset -exist create defaultset_down_v6 hash:ip,port,ip family inet6 counters maxelem 1000000 timeout 121 2>/dev/null || true\n    ipset -exist create tempset_v6 hash:net,port family inet6 counters maxelem 1000000 timeout 5 2>/dev/null || true\n\n    # Verify IPv6 ipset creation\n    IPSET6_OK=1\n    ipset list defaultset_v6 > /dev/null 2>&1 || IPSET6_OK=0\n    if [ $IPSET6_OK -eq 1 ]; then\n        echo \"Setting IPv6 ipset OK ...\"\n    fi\nfi\n\n### NHP_BLOCK chain ###\necho \"Setting up NHP_BLOCK chain ...\"\necho \"\"\niptables -N NHP_BLOCK\niptables -C NHP_BLOCK -j LOG --log-prefix \"[NHP-BLOCK] \" --log-level 6 --log-ip-options > /dev/null 2>&1\nif [ $? -ne 0 ]; then\n    iptables -A NHP_BLOCK -j LOG --log-prefix \"[NHP-BLOCK] \" --log-level 6 --log-ip-options\nfi\niptables -C NHP_BLOCK -j DROP > /dev/null 2>&1\nif [ $? -ne 0 ]; then\n    iptables -A NHP_BLOCK -j DROP\nfi\n\n### INPUT chain ###\necho \"Setting up INPUT chain ...\"\necho \"\"\n# tempset -> defaultset\niptables -C INPUT -m set --match-set tempset src,dst -j SET --add-set defaultset src,dst,dst > /dev/null 2>&1\nif [ $? -ne 0 ]; then\n    iptables -A INPUT -m set --match-set tempset src,dst -j SET --add-set defaultset src,dst,dst\nfi\n\n# defaultset -> defaultset_down\niptables -C INPUT -m set --match-set defaultset src,dst,dst -j SET --add-set defaultset_down src,dst,dst > /dev/null 2>&1\nif [ $? -ne 0 ]; then\n    iptables -A INPUT -m set --match-set defaultset src,dst,dst -j SET --add-set defaultset_down src,dst,dst\nfi\n\n# defaultset\niptables -C INPUT -m set --match-set defaultset src,dst,dst -j LOG --log-prefix \"[NHP-ACCEPT] \" --log-level 6 --log-ip-options > /dev/null 2>&1\nif [ $? -ne 0 ]; then\n    iptables -A INPUT -m set --match-set defaultset src,dst,dst -j LOG --log-prefix \"[NHP-ACCEPT] \" --log-level 6 --log-ip-options\nfi\niptables -C INPUT -m set --match-set defaultset src,dst,dst -j ACCEPT > /dev/null 2>&1\nif [ $? -ne 0 ]; then\n    iptables -A INPUT -m set --match-set defaultset src,dst,dst -j ACCEPT\nfi\n\n# tempset\niptables -C INPUT -m set --match-set tempset src,dst -j ACCEPT > /dev/null 2>&1\nif [ $? -ne 0 ]; then\n    iptables -A INPUT -m set --match-set tempset src,dst -j ACCEPT\nfi\n\n# loopback interface\niptables -C INPUT -i lo -j ACCEPT > /dev/null 2>&1\nif [ $? -ne 0 ]; then\n    iptables -I INPUT -i lo -j ACCEPT\nfi\n\n# ssh\n# iptables -C INPUT -p tcp --dport 22  -j ACCEPT > /dev/null 2>&1\n# if [ $? -ne 0 ]; then\n#     iptables -I INPUT -p tcp --dport 22  -j ACCEPT\n# fi\n\n# established connections\niptables -C INPUT -m state --state ESTABLISHED -j ACCEPT > /dev/null 2>&1\nif [ $? -ne 0 ]; then\n    iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT\nfi\n\n# rest of INPUT\niptables -C INPUT -j NHP_BLOCK > /dev/null 2>&1\nif [ $? -ne 0 ]; then\n    iptables -A INPUT -j NHP_BLOCK\nfi\n\n### OUTPUT chain ###\necho \"Setting up OUTPUT chain ...\"\necho \"\"\n#iptables -A OUTPUT -m set --match-set defaultset_down dst,src,src -j SET --add-set defaultset_down dst,src,src\n\n### FORWARD chain ###\necho \"Setting up FORWARD chain ...\"\necho \"\"\n\n# defaultset -> defaultset_down\niptables -C FORWARD -m set --match-set defaultset src,dst,dst -j SET --add-set defaultset_down src,dst,dst > /dev/null 2>&1\nif [ $? -ne 0 ]; then\n    iptables -A FORWARD -m set --match-set defaultset src,dst,dst -j SET --add-set defaultset_down src,dst,dst\nfi\n\n# defaultset\niptables -C FORWARD -m set --match-set defaultset src,dst,dst -j LOG --log-prefix \"[NHP-FORWARD] \" --log-level 6 --log-ip-options > /dev/null 2>&1\nif [ $? -ne 0 ]; then\n    iptables -A FORWARD -m set --match-set defaultset src,dst,dst -j LOG --log-prefix \"[NHP-FORWARD] \" --log-level 6 --log-ip-options\nfi\niptables -C FORWARD -m set --match-set defaultset src,dst,dst -j ACCEPT > /dev/null 2>&1\nif [ $? -ne 0 ]; then\n    iptables -A FORWARD -m set --match-set defaultset src,dst,dst -j ACCEPT\nfi\n\n# established connections\niptables -C FORWARD -m state --state ESTABLISHED -j ACCEPT > /dev/null 2>&1\nif [ $? -ne 0 ]; then\n    iptables -A FORWARD -m state --state ESTABLISHED -j ACCEPT\nfi\n\n# rest of FORWARD\niptables -C FORWARD -j NHP_BLOCK > /dev/null 2>&1\nif [ $? -ne 0 ]; then\n    iptables -A FORWARD -j NHP_BLOCK\nfi\n\n### chain policy (IPv4) ###\niptables -P INPUT DROP\niptables -P OUTPUT ACCEPT\niptables -P FORWARD DROP\n\n### IPv6 firewall rules ###\nif [ -n \"$IP6TABLES\" ] && [ $IPSET6_OK -eq 1 ]; then\n    echo \"Setting up IPv6 NHP_BLOCK chain ...\"\n    ip6tables -N NHP_BLOCK 2>/dev/null || true\n    ip6tables -C NHP_BLOCK -j LOG --log-prefix \"[NHP-BLOCK6] \" --log-level 6 --log-ip-options > /dev/null 2>&1\n    if [ $? -ne 0 ]; then\n        ip6tables -A NHP_BLOCK -j LOG --log-prefix \"[NHP-BLOCK6] \" --log-level 6 --log-ip-options 2>/dev/null || true\n    fi\n    ip6tables -C NHP_BLOCK -j DROP > /dev/null 2>&1\n    if [ $? -ne 0 ]; then\n        ip6tables -A NHP_BLOCK -j DROP 2>/dev/null || true\n    fi\n\n    echo \"Setting up IPv6 INPUT chain ...\"\n    # tempset_v6 -> defaultset_v6\n    ip6tables -C INPUT -m set --match-set tempset_v6 src,dst -j SET --add-set defaultset_v6 src,dst,dst > /dev/null 2>&1\n    if [ $? -ne 0 ]; then\n        ip6tables -A INPUT -m set --match-set tempset_v6 src,dst -j SET --add-set defaultset_v6 src,dst,dst 2>/dev/null || true\n    fi\n\n    # defaultset_v6 -> defaultset_down_v6\n    ip6tables -C INPUT -m set --match-set defaultset_v6 src,dst,dst -j SET --add-set defaultset_down_v6 src,dst,dst > /dev/null 2>&1\n    if [ $? -ne 0 ]; then\n        ip6tables -A INPUT -m set --match-set defaultset_v6 src,dst,dst -j SET --add-set defaultset_down_v6 src,dst,dst 2>/dev/null || true\n    fi\n\n    # defaultset_v6 accept with logging\n    ip6tables -C INPUT -m set --match-set defaultset_v6 src,dst,dst -j LOG --log-prefix \"[NHP-ACCEPT6] \" --log-level 6 --log-ip-options > /dev/null 2>&1\n    if [ $? -ne 0 ]; then\n        ip6tables -A INPUT -m set --match-set defaultset_v6 src,dst,dst -j LOG --log-prefix \"[NHP-ACCEPT6] \" --log-level 6 --log-ip-options 2>/dev/null || true\n    fi\n    ip6tables -C INPUT -m set --match-set defaultset_v6 src,dst,dst -j ACCEPT > /dev/null 2>&1\n    if [ $? -ne 0 ]; then\n        ip6tables -A INPUT -m set --match-set defaultset_v6 src,dst,dst -j ACCEPT 2>/dev/null || true\n    fi\n\n    # tempset_v6 accept\n    ip6tables -C INPUT -m set --match-set tempset_v6 src,dst -j ACCEPT > /dev/null 2>&1\n    if [ $? -ne 0 ]; then\n        ip6tables -A INPUT -m set --match-set tempset_v6 src,dst -j ACCEPT 2>/dev/null || true\n    fi\n\n    # loopback interface\n    ip6tables -C INPUT -i lo -j ACCEPT > /dev/null 2>&1\n    if [ $? -ne 0 ]; then\n        ip6tables -I INPUT -i lo -j ACCEPT\n    fi\n\n    # established connections\n    ip6tables -C INPUT -m state --state ESTABLISHED -j ACCEPT > /dev/null 2>&1\n    if [ $? -ne 0 ]; then\n        ip6tables -A INPUT -m state --state ESTABLISHED -j ACCEPT\n    fi\n\n    # rest of INPUT\n    ip6tables -C INPUT -j NHP_BLOCK > /dev/null 2>&1\n    if [ $? -ne 0 ]; then\n        ip6tables -A INPUT -j NHP_BLOCK 2>/dev/null || true\n    fi\n\n    echo \"Setting up IPv6 FORWARD chain ...\"\n    # defaultset_v6 -> defaultset_down_v6\n    ip6tables -C FORWARD -m set --match-set defaultset_v6 src,dst,dst -j SET --add-set defaultset_down_v6 src,dst,dst > /dev/null 2>&1\n    if [ $? -ne 0 ]; then\n        ip6tables -A FORWARD -m set --match-set defaultset_v6 src,dst,dst -j SET --add-set defaultset_down_v6 src,dst,dst 2>/dev/null || true\n    fi\n\n    # defaultset_v6 forward with logging\n    ip6tables -C FORWARD -m set --match-set defaultset_v6 src,dst,dst -j LOG --log-prefix \"[NHP-FORWARD6] \" --log-level 6 --log-ip-options > /dev/null 2>&1\n    if [ $? -ne 0 ]; then\n        ip6tables -A FORWARD -m set --match-set defaultset_v6 src,dst,dst -j LOG --log-prefix \"[NHP-FORWARD6] \" --log-level 6 --log-ip-options 2>/dev/null || true\n    fi\n    ip6tables -C FORWARD -m set --match-set defaultset_v6 src,dst,dst -j ACCEPT > /dev/null 2>&1\n    if [ $? -ne 0 ]; then\n        ip6tables -A FORWARD -m set --match-set defaultset_v6 src,dst,dst -j ACCEPT 2>/dev/null || true\n    fi\n\n    # established connections\n    ip6tables -C FORWARD -m state --state ESTABLISHED -j ACCEPT > /dev/null 2>&1\n    if [ $? -ne 0 ]; then\n        ip6tables -A FORWARD -m state --state ESTABLISHED -j ACCEPT\n    fi\n\n    # rest of FORWARD\n    ip6tables -C FORWARD -j NHP_BLOCK > /dev/null 2>&1\n    if [ $? -ne 0 ]; then\n        ip6tables -A FORWARD -j NHP_BLOCK 2>/dev/null || true\n    fi\n\n    ### IPv6 chain policy ###\n    ip6tables -P INPUT DROP\n    ip6tables -P OUTPUT ACCEPT\n    ip6tables -P FORWARD DROP\n\n    echo \"Setting IPv6 iptables OK ...\"\nfi\n\n### iptables kernel logging ###\nif [ -d /etc/rsyslog.d ] && [ ! -f /etc/rsyslog.d/10-nhplog.conf ]; then\n    echo \"Setting up rsyslog ...\"\n    mkdir -p logs\n    chmod -R 777 logs/\n    echo \":msg,contains,\\\"[NHP-ACCEPT]\\\" -$CURRENT_DIR/logs/nhp_accept.log\n\n& stop\n:msg,contains,\\\"[NHP-FORWARD]\\\" -$CURRENT_DIR/logs/nhp_forward.log\n\n& stop\n:msg,contains,\\\"[NHP-BLOCK]\\\" -$CURRENT_DIR/logs/nhp_block.log\n\n& stop\" > /etc/rsyslog.d/10-nhplog.conf\n    systemctl restart rsyslog\nfi\n\necho \"Setting iptables default OK ...\"\necho \"\"\n### EOF ###"
  },
  {
    "path": "docker/iptables_defaults_x86.sh",
    "content": "#!/bin/bash\nCURRENT_DIR=`cd \\`dirname $0\\`; pwd`\n\n### flush existing rules and set chain policy setting to DROP\nif [ \"$1\" = \"-f\" ]; then\n    echo \"Flushing existing iptables rules...\"\n    echo \"\"\n    # Set DROP policy first to avoid exposure window during flush\n    iptables -P INPUT DROP\n    iptables -P FORWARD DROP\n    iptables -F\n    iptables -X\n    # Flush ipsets to clear previously authorized tuples\n    ipset flush 2>/dev/null || true\n    ipset destroy 2>/dev/null || true\n    # Flush IPv6 rules as well\n    if which ip6tables > /dev/null 2>&1; then\n        ip6tables -P INPUT DROP\n        ip6tables -P FORWARD DROP\n        ip6tables -F\n        ip6tables -X\n    fi\nfi\n\n### ipset (IPv4) ###\necho \"Setting up IPv4 ipset\"\necho \"\"\nipset -exist create defaultset hash:ip,port,ip counters maxelem 1000000 timeout 120\nipset -exist create defaultset_down hash:ip,port,ip counters maxelem 1000000 timeout 121\nipset -exist create tempset hash:net,port counters maxelem 1000000 timeout 5\necho \"\"\necho \"Setting IPv4 ipset OK ...\"\n\n### ipset (IPv6) ###\nIP6TABLES=$(which ip6tables 2>/dev/null)\nIPSET6_OK=0\nif [ -n \"$IP6TABLES\" ]; then\n    echo \"Setting up IPv6 ipset\"\n    ipset -exist create defaultset_v6 hash:ip,port,ip family inet6 counters maxelem 1000000 timeout 120 2>/dev/null || true\n    ipset -exist create defaultset_down_v6 hash:ip,port,ip family inet6 counters maxelem 1000000 timeout 121 2>/dev/null || true\n    ipset -exist create tempset_v6 hash:net,port family inet6 counters maxelem 1000000 timeout 5 2>/dev/null || true\n\n    # Verify IPv6 ipset creation\n    IPSET6_OK=1\n    ipset list defaultset_v6 > /dev/null 2>&1 || IPSET6_OK=0\n    if [ $IPSET6_OK -eq 1 ]; then\n        echo \"Setting IPv6 ipset OK ...\"\n    fi\nfi\n\n### NHP_BLOCK chain ###\necho \"Setting up NHP_BLOCK chain ...\"\necho \"\"\niptables -N NHP_BLOCK\niptables -C NHP_BLOCK -j LOG --log-prefix \"[NHP-BLOCK] \" --log-level 6 --log-ip-options > /dev/null 2>&1\nif [ $? -ne 0 ]; then\n    iptables -A NHP_BLOCK -j LOG --log-prefix \"[NHP-BLOCK] \" --log-level 6 --log-ip-options\nfi\niptables -C NHP_BLOCK -j DROP > /dev/null 2>&1\nif [ $? -ne 0 ]; then\n    iptables -A NHP_BLOCK -j DROP\nfi\n\n### INPUT chain ###\necho \"Setting up INPUT chain ...\"\necho \"\"\n# tempset -> defaultset\niptables -C INPUT -m set --match-set tempset src,dst -j SET --add-set defaultset src,dst,dst > /dev/null 2>&1\nif [ $? -ne 0 ]; then\n    iptables -A INPUT -m set --match-set tempset src,dst -j SET --add-set defaultset src,dst,dst\nfi\n\n# defaultset -> defaultset_down\niptables -C INPUT -m set --match-set defaultset src,dst,dst -j SET --add-set defaultset_down src,dst,dst > /dev/null 2>&1\nif [ $? -ne 0 ]; then\n    iptables -A INPUT -m set --match-set defaultset src,dst,dst -j SET --add-set defaultset_down src,dst,dst\nfi\n\n# defaultset\niptables -C INPUT -m set --match-set defaultset src,dst,dst -j LOG --log-prefix \"[NHP-ACCEPT] \" --log-level 6 --log-ip-options > /dev/null 2>&1\nif [ $? -ne 0 ]; then\n    iptables -A INPUT -m set --match-set defaultset src,dst,dst -j LOG --log-prefix \"[NHP-ACCEPT] \" --log-level 6 --log-ip-options\nfi\niptables -C INPUT -m set --match-set defaultset src,dst,dst -j ACCEPT > /dev/null 2>&1\nif [ $? -ne 0 ]; then\n    iptables -A INPUT -m set --match-set defaultset src,dst,dst -j ACCEPT\nfi\n\n# tempset\niptables -C INPUT -m set --match-set tempset src,dst -j ACCEPT > /dev/null 2>&1\nif [ $? -ne 0 ]; then\n    iptables -A INPUT -m set --match-set tempset src,dst -j ACCEPT\nfi\n\n# loopback interface\niptables -C INPUT -i lo -j ACCEPT > /dev/null 2>&1\nif [ $? -ne 0 ]; then\n    iptables -I INPUT -i lo -j ACCEPT\nfi\n\n# ssh\n# iptables -C INPUT -p tcp --dport 22  -j ACCEPT > /dev/null 2>&1\n# if [ $? -ne 0 ]; then\n#     iptables -I INPUT -p tcp --dport 22  -j ACCEPT\n# fi\n\n# established connections\niptables -C INPUT -m state --state ESTABLISHED -j ACCEPT > /dev/null 2>&1\nif [ $? -ne 0 ]; then\n    iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT\nfi\n\n# rest of INPUT\niptables -C INPUT -j NHP_BLOCK > /dev/null 2>&1\nif [ $? -ne 0 ]; then\n    iptables -A INPUT -j NHP_BLOCK\nfi\n\n### OUTPUT chain ###\necho \"Setting up OUTPUT chain ...\"\necho \"\"\n#iptables -A OUTPUT -m set --match-set defaultset_down dst,src,src -j SET --add-set defaultset_down dst,src,src\n\n### FORWARD chain ###\necho \"Setting up FORWARD chain ...\"\necho \"\"\n\n# defaultset -> defaultset_down\niptables -C FORWARD -m set --match-set defaultset src,dst,dst -j SET --add-set defaultset_down src,dst,dst > /dev/null 2>&1\nif [ $? -ne 0 ]; then\n    iptables -A FORWARD -m set --match-set defaultset src,dst,dst -j SET --add-set defaultset_down src,dst,dst\nfi\n\n# defaultset\niptables -C FORWARD -m set --match-set defaultset src,dst,dst -j LOG --log-prefix \"[NHP-FORWARD] \" --log-level 6 --log-ip-options > /dev/null 2>&1\nif [ $? -ne 0 ]; then\n    iptables -A FORWARD -m set --match-set defaultset src,dst,dst -j LOG --log-prefix \"[NHP-FORWARD] \" --log-level 6 --log-ip-options\nfi\niptables -C FORWARD -m set --match-set defaultset src,dst,dst -j ACCEPT > /dev/null 2>&1\nif [ $? -ne 0 ]; then\n    iptables -A FORWARD -m set --match-set defaultset src,dst,dst -j ACCEPT\nfi\n\n# established connections\niptables -C FORWARD -m state --state ESTABLISHED -j ACCEPT > /dev/null 2>&1\nif [ $? -ne 0 ]; then\n    iptables -A FORWARD -m state --state ESTABLISHED -j ACCEPT\nfi\n\n# rest of FORWARD\niptables -C FORWARD -j NHP_BLOCK > /dev/null 2>&1\nif [ $? -ne 0 ]; then\n    iptables -A FORWARD -j NHP_BLOCK\nfi\n\n### chain policy (IPv4) ###\niptables -P INPUT DROP\niptables -P OUTPUT ACCEPT\niptables -P FORWARD DROP\n\n### IPv6 firewall rules ###\nif [ -n \"$IP6TABLES\" ] && [ $IPSET6_OK -eq 1 ]; then\n    echo \"Setting up IPv6 NHP_BLOCK chain ...\"\n    ip6tables -N NHP_BLOCK 2>/dev/null || true\n    ip6tables -C NHP_BLOCK -j LOG --log-prefix \"[NHP-BLOCK6] \" --log-level 6 --log-ip-options > /dev/null 2>&1\n    if [ $? -ne 0 ]; then\n        ip6tables -A NHP_BLOCK -j LOG --log-prefix \"[NHP-BLOCK6] \" --log-level 6 --log-ip-options 2>/dev/null || true\n    fi\n    ip6tables -C NHP_BLOCK -j DROP > /dev/null 2>&1\n    if [ $? -ne 0 ]; then\n        ip6tables -A NHP_BLOCK -j DROP 2>/dev/null || true\n    fi\n\n    echo \"Setting up IPv6 INPUT chain ...\"\n    # tempset_v6 -> defaultset_v6\n    ip6tables -C INPUT -m set --match-set tempset_v6 src,dst -j SET --add-set defaultset_v6 src,dst,dst > /dev/null 2>&1\n    if [ $? -ne 0 ]; then\n        ip6tables -A INPUT -m set --match-set tempset_v6 src,dst -j SET --add-set defaultset_v6 src,dst,dst 2>/dev/null || true\n    fi\n\n    # defaultset_v6 -> defaultset_down_v6\n    ip6tables -C INPUT -m set --match-set defaultset_v6 src,dst,dst -j SET --add-set defaultset_down_v6 src,dst,dst > /dev/null 2>&1\n    if [ $? -ne 0 ]; then\n        ip6tables -A INPUT -m set --match-set defaultset_v6 src,dst,dst -j SET --add-set defaultset_down_v6 src,dst,dst 2>/dev/null || true\n    fi\n\n    # defaultset_v6 accept with logging\n    ip6tables -C INPUT -m set --match-set defaultset_v6 src,dst,dst -j LOG --log-prefix \"[NHP-ACCEPT6] \" --log-level 6 --log-ip-options > /dev/null 2>&1\n    if [ $? -ne 0 ]; then\n        ip6tables -A INPUT -m set --match-set defaultset_v6 src,dst,dst -j LOG --log-prefix \"[NHP-ACCEPT6] \" --log-level 6 --log-ip-options 2>/dev/null || true\n    fi\n    ip6tables -C INPUT -m set --match-set defaultset_v6 src,dst,dst -j ACCEPT > /dev/null 2>&1\n    if [ $? -ne 0 ]; then\n        ip6tables -A INPUT -m set --match-set defaultset_v6 src,dst,dst -j ACCEPT 2>/dev/null || true\n    fi\n\n    # tempset_v6 accept\n    ip6tables -C INPUT -m set --match-set tempset_v6 src,dst -j ACCEPT > /dev/null 2>&1\n    if [ $? -ne 0 ]; then\n        ip6tables -A INPUT -m set --match-set tempset_v6 src,dst -j ACCEPT 2>/dev/null || true\n    fi\n\n    # loopback interface\n    ip6tables -C INPUT -i lo -j ACCEPT > /dev/null 2>&1\n    if [ $? -ne 0 ]; then\n        ip6tables -I INPUT -i lo -j ACCEPT\n    fi\n\n    # established connections\n    ip6tables -C INPUT -m state --state ESTABLISHED -j ACCEPT > /dev/null 2>&1\n    if [ $? -ne 0 ]; then\n        ip6tables -A INPUT -m state --state ESTABLISHED -j ACCEPT\n    fi\n\n    # rest of INPUT\n    ip6tables -C INPUT -j NHP_BLOCK > /dev/null 2>&1\n    if [ $? -ne 0 ]; then\n        ip6tables -A INPUT -j NHP_BLOCK 2>/dev/null || true\n    fi\n\n    echo \"Setting up IPv6 FORWARD chain ...\"\n    # defaultset_v6 -> defaultset_down_v6\n    ip6tables -C FORWARD -m set --match-set defaultset_v6 src,dst,dst -j SET --add-set defaultset_down_v6 src,dst,dst > /dev/null 2>&1\n    if [ $? -ne 0 ]; then\n        ip6tables -A FORWARD -m set --match-set defaultset_v6 src,dst,dst -j SET --add-set defaultset_down_v6 src,dst,dst 2>/dev/null || true\n    fi\n\n    # defaultset_v6 forward with logging\n    ip6tables -C FORWARD -m set --match-set defaultset_v6 src,dst,dst -j LOG --log-prefix \"[NHP-FORWARD6] \" --log-level 6 --log-ip-options > /dev/null 2>&1\n    if [ $? -ne 0 ]; then\n        ip6tables -A FORWARD -m set --match-set defaultset_v6 src,dst,dst -j LOG --log-prefix \"[NHP-FORWARD6] \" --log-level 6 --log-ip-options 2>/dev/null || true\n    fi\n    ip6tables -C FORWARD -m set --match-set defaultset_v6 src,dst,dst -j ACCEPT > /dev/null 2>&1\n    if [ $? -ne 0 ]; then\n        ip6tables -A FORWARD -m set --match-set defaultset_v6 src,dst,dst -j ACCEPT 2>/dev/null || true\n    fi\n\n    # established connections\n    ip6tables -C FORWARD -m state --state ESTABLISHED -j ACCEPT > /dev/null 2>&1\n    if [ $? -ne 0 ]; then\n        ip6tables -A FORWARD -m state --state ESTABLISHED -j ACCEPT\n    fi\n\n    # rest of FORWARD\n    ip6tables -C FORWARD -j NHP_BLOCK > /dev/null 2>&1\n    if [ $? -ne 0 ]; then\n        ip6tables -A FORWARD -j NHP_BLOCK 2>/dev/null || true\n    fi\n\n    ### IPv6 chain policy ###\n    ip6tables -P INPUT DROP\n    ip6tables -P OUTPUT ACCEPT\n    ip6tables -P FORWARD DROP\n\n    echo \"Setting IPv6 iptables OK ...\"\nfi\n\n### iptables kernel logging ###\nif [ -d /etc/rsyslog.d ] && [ ! -f /etc/rsyslog.d/10-nhplog.conf ]; then\n    echo \"Setting up rsyslog ...\"\n    mkdir -p logs\n    chmod -R 777 logs/\n    echo \":msg,contains,\\\"[NHP-ACCEPT]\\\" -$CURRENT_DIR/logs/nhp_accept.log\n\n& stop\n:msg,contains,\\\"[NHP-FORWARD]\\\" -$CURRENT_DIR/logs/nhp_forward.log\n\n& stop\n:msg,contains,\\\"[NHP-BLOCK]\\\" -$CURRENT_DIR/logs/nhp_block.log\n\n& stop\" > /etc/rsyslog.d/10-nhplog.conf\n    systemctl restart rsyslog\nfi\n\necho \"Setting iptables default OK ...\"\necho \"\"\n### EOF ###\n"
  },
  {
    "path": "docker/nhp-ac/etc/config.toml",
    "content": "# NHP-Agent base config\r\n# field with (-) does not support dynamic update\r\n\r\n# PrivateKeyBase64 (-): agent private key in base64 format.\r\n# DefaultCipherScheme: 0: curve25519, 1: gmsm.\r\n# MIGRATION: Values changed in v2.x. If upgrading: old 0(gmsm)->new 1, old 1(curve)->new 0.\r\n# UserId: specify the user id this agent represents.\r\n# OrganizationId: specify the organization id this agent represents.\r\n# LogLevel: 0: silent, 1: error, 2: info, 3: audit, 4: debug, 5: trace.\r\nPrivateKeyBase64 = \"hpo6FtdcPir87EV8BYeAINAG7nEDPU2LG/WTRS+bPF4=\"\r\nACId = \"testAC-1\"\r\nDefaultCipherScheme = 1\r\nUserId = \"agent-0\"\r\nOrganizationId = \"opennhp.org\"\r\nLogLevel = 4\r\n# UserData: a customized user entry for flexibility.\r\n# Its key-value pairs will be send to server along with knock message.\r\n[UserData]\r\n\"ExampleKey0\" = \"StringValue\"\r\n\"ExampleKey1\" = 1\r\n\"ExampleKey2\" = true\r\n"
  },
  {
    "path": "docker/nhp-ac/etc/resource.toml",
    "content": "# List resources for the agent to knock automatically after launch\r\n\r\n# AuthServiceId: id of the authentication and authorization service provider the resource belongs to.\r\n# ResourceId: id of the resource group.\r\n# ServerAddr: the server address that manages this resource group.\r\n[[Resources]]\r\nAuthServiceId = \"example\"\r\nResourceId = \"demo\"\r\n#ServerAddr = \"host.docker.internal\"\r\nServerAddr = \"177.7.0.9\"\r\n"
  },
  {
    "path": "docker/nhp-ac/etc/server.toml",
    "content": "# list the server peers for the agent under [[Servers]] table\r\n\r\n# Hostname: the domain of the server peer. If specified, it overrides the \"Ip\" field with its first resolved address.\r\n# Ip: specify the ip address of the server peer\r\n# Port: specify the port number of this server peer is listening\r\n# PubKeyBase64: public key of the server peer in base64 format\r\n# ExpireTime (epoch timestamp in seconds): peer key validation will fail when it expires.\r\n[[Servers]]\r\n#Hostname = \"host.docker.internal\"\r\nIp = \"177.7.0.9\"\r\nPort = 62206\r\nPubKeyBase64 = \"4/p0mIknwmVIMocRLQKil7xIthgEdZNncv9UagiBaK2kpcH7i4hEtZjpcHox+Bn7xdV+rBKNbKlV9ye6V1VCLA==\"\r\nExpireTime = 1924991999\r\n"
  },
  {
    "path": "docker/nhp-ac/traefik/etc/provider.toml",
    "content": "\n[http]\n  [http.routers]\n    #\n    # hqdata-opennhp-cn\n    #\n    [http.routers.router-hqdata-opennhp-cn]\n      entryPoints = [\"web\"]\n      #rule = \"Host(`*`)\"\n      rule = \"PathPrefix(`/`)\"\n      service = \"service-demo\"\n      #tls = \"true\"\n      \n  [http.services]\n    [http.services.service-demo.loadBalancer]\n      [[http.services.service-demo.loadBalancer.servers]]\n        url = \"http://web-app:8080\""
  },
  {
    "path": "docker/nhp-ac/traefik/etc/traefik.toml",
    "content": "[entryPoints]\n  [entryPoints.web]\n    address = \":80\"\n\n[providers.file]\n  filename = \"provider.toml\"\n\n[log]\n  level = \"TRACE\"\n\n  # Js147258!"
  },
  {
    "path": "docker/nhp-agent/etc/certs/server.crt",
    "content": "-----BEGIN CERTIFICATE-----\r\nMIIDKzCCAhMCFCl+W8SPu1590nfwXgANK1STySQ0MA0GCSqGSIb3DQEBCwUAMFIx\r\nCzAJBgNVBAYTAkNOMRMwEQYDVQQIDApaaGFuZ0ppYW5nMQswCQYDVQQHDAJIWjEL\r\nMAkGA1UECgwCWFMxFDASBgNVBAMMC3Rlc3RAeHMuY29tMB4XDTI1MDcxNTA4MDEx\r\nNVoXDTI2MDcxNTA4MDExNVowUjELMAkGA1UEBhMCQ04xEzARBgNVBAgMClpoYW5n\r\nSmlhbmcxCzAJBgNVBAcMAkhaMQswCQYDVQQKDAJYUzEUMBIGA1UEAwwLdGVzdEB4\r\ncy5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQD4O/9vxs1dGFKJ\r\nL+IjwrRIOJDHuoEzTtJQ7fsyAoow9siv+qvIXDJ42+ReJiehDcvtpPosyyScD6rx\r\nihWH2I+9su29iz7qyE2aeEwDWOkrNcMGfInhCDmT9BvfveKIgh2CJeh5MwJ5zqnL\r\nQAs8t+2OHlBwxCfTzPe4CGsGX0Ry0324ysqkybHVG3k7BCEpk4oebvbWw1Wemq5d\r\n1yHFbwJFcAuPSaM/Jqi1QO1breQu7azFBHq3PexReKxeshgOqrYR3vFE2XpYLR5/\r\nd45S5eK5Vk1fT0F/UoFCM9P8HrOhir1Di0pKNbhp1etTz3wHsWBo62wliP+2D/Cy\r\n7ux3TC3pAgMBAAEwDQYJKoZIhvcNAQELBQADggEBALWM3eqlFuQzkzF1NIwnCxQ0\r\nRZmXhTtsDnqCwgdTzUT7NyXMiLcDQTQusJAi87L+yc5DMaRqPcr+gCHes8YJQ9Cc\r\nFtqAi15TUiyIdKqt82A6vS5Mr5yHcI3EO4WtAArTj9UUdX4X5unig9KHLb1AyQFk\r\nPJoalnmWy+vnxMBhGemo8ousLZrDOWpPRylW/wnafjvGMxNAF03b32MvtggKKT9m\r\nS0XgmHi7eo/FGYCwKSrgsfAWfitZ/izv4KVw9T4g8m7rSoleTo/0lWKbt1K2U2YR\r\nFoeYltvDOVfgmf1MPlGvyn5llwW4Z1PyR3/mReELJEh79O01KwLc+nJ1oAsbJ8g=\r\n-----END CERTIFICATE-----\r\n"
  },
  {
    "path": "docker/nhp-agent/etc/certs/server.key",
    "content": "-----BEGIN PRIVATE KEY-----\r\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQD4O/9vxs1dGFKJ\r\nL+IjwrRIOJDHuoEzTtJQ7fsyAoow9siv+qvIXDJ42+ReJiehDcvtpPosyyScD6rx\r\nihWH2I+9su29iz7qyE2aeEwDWOkrNcMGfInhCDmT9BvfveKIgh2CJeh5MwJ5zqnL\r\nQAs8t+2OHlBwxCfTzPe4CGsGX0Ry0324ysqkybHVG3k7BCEpk4oebvbWw1Wemq5d\r\n1yHFbwJFcAuPSaM/Jqi1QO1breQu7azFBHq3PexReKxeshgOqrYR3vFE2XpYLR5/\r\nd45S5eK5Vk1fT0F/UoFCM9P8HrOhir1Di0pKNbhp1etTz3wHsWBo62wliP+2D/Cy\r\n7ux3TC3pAgMBAAECggEABX3ASA74BoXt93pvcHaTaeCUdVKfHo0xEli9XI0ZVP10\r\nkY4ERE2j0TAeFGYYLNQjDXn/jcOdpvUixS6WjNeB0IK3hyCgLu3o55CfL9jE6a+K\r\nBaf2HdwCeA8nmbK34uir8e/YPWwfMyYa8/PR+9EeyGzLvz7bmbAYT8Ih6fVsDHUt\r\nlNyPNuhi1GigAv3fRyQOSB4MrIrS5NfQzyArL3S/Se/g9PJ4TJFKL+SjlC75Yyt8\r\nmt20wrcBC52tbx6XvKq6JdZAxbi9NAgsq/mcWITdH0j+BAF8NvmNuUiGMs0DnMgJ\r\nD+gLb3SH/kM/BdFNQJZf9n/02wuOtaRhXFQ4WsaEIQKBgQD8KFt0CD8InK5E34z1\r\nuOsSz2REWZ5fYXC4FsOyITtF94j8tATI7CqDXYN31KEhFlQnN4cCb/Y7Vg3dDezl\r\n7vBYtPTBHIxvuN0aioy7nmqueyniZOXpBNmL+ercFXQh2LPri+8sHHwN87Xc2lJ6\r\noww+ka0Yw0+FKQyT4PYDzNVm0QKBgQD8BFYS2pevqGM930KtW6yV069PA0JJKLAB\r\nUwsU8ccYI35Gd2y3h+ZWT95liLfQRSoup/d3O59+uSjY+Z9M1I3xXyO8DyLOto4B\r\nBEYxHAJ8N8vc1HI5XORI94sOtgZGa4iTqKt23fXNG6D0jMRJxGsdtpcKJVz4jRXn\r\nOUIzwhrLmQKBgQDr/3WAhotAKywrR7Ls85IHe9US53GDQXY2xQ+JMvL/y+oI4Q8t\r\nYWN0qVv3FilsBzLhtWWFkXY6GJNHFdZnaRbHXy1HY8nIcpN1WMDYhC7CeIE940MO\r\nsLxO9quqKeYUG3Zg+QnzFgHBKRxHxIm3P8yg7sS7zWgqb73W1ZBLBDWiUQKBgGca\r\nbwxvmbcnsNJTULgT1VvGquYscyXzG26vRs1ezRE3FCZIHZZIZxfQvS/U6z6tzUAh\r\nP8DsB6iUn/2EwoNwQlIJllkN6DOhxB7uXLkiuHGRcjn6QHDvbAXeIGn4VkDhJZMj\r\nYmLTFAjB0Ou722JClYAmf0yLVKnrLpbWehsqwkOhAoGALAnJKXacPKtWETMh12Ce\r\nppQOAYvyhYjc7JD2bbOqqy1SrzP7Ikm/DoahTQW3A4jaSboZDYs8gICG5vywVHF2\r\nrOE3n2pb1YM/SkS6CK9n/TdKqlKhl5uzTY11cr2WNV1Dab/Tk89QbYz7gX7c3+X7\r\noHimTjCCO4pQO36V48Bd6EM=\r\n-----END PRIVATE KEY-----\r\n"
  },
  {
    "path": "docker/nhp-agent/etc/config.toml",
    "content": "# NHP-Agent base config\r\n# field with (-) does not support dynamic update\r\n\r\n# PrivateKeyBase64 (-): agent private key in base64 format.\r\n# DefaultCipherScheme: 0: curve25519, 1: gmsm.\r\n# MIGRATION: Values changed in v2.x. If upgrading: old 0(gmsm)->new 1, old 1(curve)->new 0.\r\n# UserId: specify the user id this agent represents.\r\n# OrganizationId: specify the organization id this agent represents.\r\n# LogLevel: 0: silent, 1: error, 2: info, 3: audit, 4: debug, 5: trace.\r\nPrivateKeyBase64 = \"O2Ytgu7YraFYqq0iS41vhBNhwb1nPVS9kmPzXxLVNo0=\"\r\nDefaultCipherScheme = 1\r\nUserId = \"agent-0\"\r\nOrganizationId = \"opennhp.org\"\r\nLogLevel = 5\r\n# UserData: a customized user entry for flexibility.\r\n# Its key-value pairs will be send to server along with knock message.\r\n[UserData]\r\n\"ExampleKey0\" = \"StringValue\"\r\n\"ExampleKey1\" = 1\r\n\"ExampleKey2\" = true\r\n"
  },
  {
    "path": "docker/nhp-agent/etc/dhp.toml",
    "content": "# Configuration that is related to data object hiding protocol in agent side.\n\n# TEEPrivateKeyBase64: base64 encoded private key of TEE (Trusted Execution Environment).\nTEEPrivateKeyBase64 = \"j20JfF3rjoRtz2m+KP+agYjDBPdQwC9Dwfcasn83yAQ=\"\n"
  },
  {
    "path": "docker/nhp-agent/etc/resource.toml",
    "content": "# List resources for the agent to knock automatically after launch\r\n\r\n# AuthServiceId: id of the authentication and authorization service provider the resource belongs to.\r\n# ResourceId: id of the resource group.\r\n# ServerAddr: the server address that manages this resource group.\r\n[[Resources]]\r\nAuthServiceId = \"example\"\r\nResourceId = \"demo\"\r\nServerHostname = \"\"\r\nServerIp = \"177.7.0.9\"\r\nServerPort = 62206"
  },
  {
    "path": "docker/nhp-agent/etc/server.toml",
    "content": "# list the server peers for the agent under [[Servers]] table\r\n\r\n# Hostname: the domain of the server peer. If specified, it overrides the \"Ip\" field with its first resolved address.\r\n# Ip: specify the ip address of the server peer\r\n# Port: specify the port number of this server peer is listening\r\n# PubKeyBase64: public key of the server peer in base64 format\r\n# ExpireTime (epoch timestamp in seconds): peer key validation will fail when it expires.\r\n[[Servers]]\r\nHostname = \"\"\r\nIp = \"177.7.0.9\"\r\nPort = 62206\r\nPubKeyBase64 = \"4/p0mIknwmVIMocRLQKil7xIthgEdZNncv9UagiBaK2kpcH7i4hEtZjpcHox+Bn7xdV+rBKNbKlV9ye6V1VCLA==\"\r\nExpireTime = 1924991999\r\n"
  },
  {
    "path": "docker/nhp-db/demo/metadata.json",
    "content": "{\r\n   \"typeIdentifier\": \"risk involved accounts\",\r\n   \"dataSize\": 7311,\r\n   \"owner\": \"police@police.com\",\r\n   \"description\": \"risk involved accounts which are delivered by police.\",\r\n   \"structuredData\": true,\r\n   \"vocabulary\": {\r\n        \"dataType\": \"csv\",\r\n        \"fields\": [\r\n            {\r\n                \"path\": \"account_id\",\r\n                \"type\": \"string\"\r\n            },\r\n            {\r\n                \"path\": \"id_card\",\r\n                \"type\": \"string\"\r\n            },\r\n            {\r\n                \"path\": \"risk_level\",\r\n                \"type\": \"string\"\r\n            },\r\n            {\r\n                \"path\": \"risk_tags\",\r\n                \"type\": \"string\"\r\n            },\r\n            {\r\n                \"path\": \"valid_from\",\r\n                \"type\": \"string\"\r\n            },\r\n            {\r\n                \"path\": \"valid_to\",\r\n                \"type\": \"string\"\r\n            }\r\n        ]\r\n   },\r\n   \"sample\": [\r\n        {\r\n            \"account_id\": \"1234567890\",\r\n            \"id_card\": \"1234567890\",\r\n            \"risk_level\": \"high\",\r\n            \"risk_tags\": \"high risk\",\r\n            \"valid_from\": \"2019-01-01\",\r\n            \"valid_to\": \"2019-01-02\"\r\n        }\r\n   ]\r\n}\r\n"
  },
  {
    "path": "docker/nhp-db/demo/metadata.schema.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"type\": \"object\",\n  \"title\": \"metadata of zero trust data object\",\n  \"description\": \"Schema for metadata describing zero trust data object\",\n  \"required\": [\n    \"typeIdentifier\",\n    \"dataSize\",\n    \"owner\",\n    \"description\",\n    \"structuredData\",\n    \"vocabulary\",\n    \"sample\"\n  ],\n  \"properties\": {\n    \"typeIdentifier\": {\n      \"type\": \"string\",\n      \"description\": \"Identifier for the type of data\",\n      \"examples\": [\"risk involved accounts\"]\n    },\n    \"dataSize\": {\n      \"type\": \"integer\",\n      \"description\": \"Size of the data in bytes\",\n      \"minimum\": 0,\n      \"examples\": [7311]\n    },\n    \"owner\": {\n      \"type\": \"string\",\n      \"description\": \"Email address of the data owner\",\n      \"format\": \"email\",\n      \"examples\": [\"police@police.com\"]\n    },\n    \"description\": {\n      \"type\": \"string\",\n      \"description\": \"Human-readable description of the data\",\n      \"examples\": [\"risk involved accounts which are delivered by police.\"]\n    },\n    \"structuredData\": {\n      \"type\": \"boolean\",\n      \"description\": \"Indicates whether the data is structured\",\n      \"examples\": [true, false]\n    },\n    \"vocabulary\": {\n      \"type\": \"object\",\n      \"description\": \"Metadata about the data structure and fields\",\n      \"required\": [\"dataType\", \"fields\"],\n      \"properties\": {\n        \"dataType\": {\n          \"type\": \"string\",\n          \"description\": \"Format of the data\",\n          \"examples\": [\"csv\", \"json\", \"xml\"]\n        },\n        \"fields\": {\n          \"type\": \"array\",\n          \"description\": \"List of fields in the data, each with path and type\",\n          \"minItems\": 1,\n          \"items\": {\n            \"type\": \"object\",\n            \"required\": [\"path\", \"type\"],\n            \"properties\": {\n              \"path\": {\n                \"type\": \"string\",\n                \"description\": \"Name or path of the field\",\n                \"examples\": [\"account_id\", \"risk_level\", \"any_other_field\"]\n              },\n              \"type\": {\n                \"type\": \"string\",\n                \"description\": \"Data type of the field\",\n                \"examples\": [\"string\", \"number\", \"boolean\", \"date\", \"integer\"]\n              }\n            },\n            \"additionalProperties\": true\n          }\n        }\n      },\n      \"additionalProperties\": true\n    },\n    \"sample\": {\n      \"type\": \"array\",\n      \"description\": \"Sample data records matching the field definitions\",\n      \"minItems\": 1,\n      \"items\": {\n        \"type\": \"object\",\n        \"description\": \"A sample data record\",\n        \"additionalProperties\": true\n      }\n    }\n  },\n  \"additionalProperties\": true\n}\n"
  },
  {
    "path": "docker/nhp-db/demo/risk.involved.accounts.csv",
    "content": "account_id,id_card,risk_level,risk_tags,valid_from,valid_to\r\n6222021101123456789,110101199001011234,L3,\"telecom_fraud,cross_border_violation\",2023/1/1,2027/3/15\r\n6217001201567890123,120102199102022345,L2,money_laundering,2023/2/15,2027/7/22\r\n6230611301901234567,130103199203033456,L3,terrorism_financing,2023/3/20,2027/1/8\r\n6214881401345678901,140104199304044567,L1,smuggling,2023/4/10,2027/9/14\r\n6225881501789012345,150105199405055678,L2,fraudulent_trading,2023/5/25,2027/11/30\r\n6231001601234567890,160106199506066789,L3,corruption,2023/6/8,2027/5/21\r\n6216991701678901234,170107199607077890,L1,illegal_gambling,2023/7/12,2027/4/5\r\n6229001801012345678,180108199708088901,L2,insider_trading,2023/8/19,2027/8/17\r\n6232001901456789012,190109199809099012,L3,pyramid_scheme,2023/9/5,2027/12/25\r\n6218002001890123456,200110199910100123,L1,embezzlement,2023/10/30,2027/2/9\r\n6223012101234567890,210111200011111234,L2,illegal_fund_raising,2023/11/14,2027/10/3\r\n6233012201678901234,220112200112122345,L3,document_forgery,2023/12/22,2027/6/18\r\n6219012301012345678,230113200201013456,L1,identity_theft,2023/1/18,2027/3/31\r\n6226012401456789012,240114200302024567,L2,cybercrime,2023/2/28,2027/8/23\r\n6234012501890123456,250115200403035678,L3,human_trafficking,2023/3/16,2027/1/27\r\n6220012601234567890,260116200504046789,L1,arms_smuggling,2023/4/30,2027/7/12\r\n6227012701678901234,270117200605057890,L2,drug_trafficking,2023/5/15,2027/11/4\r\n6235012801012345678,280118200706068901,L3,environmental_crime,2023/6/29,2027/5/19\r\n6221012901456789012,290119200807079012,L1,artifacts_smuggling,2023/7/23,2027/9/6\r\n6236013001890123456,300120200908080123,L2,human_organ_trafficking,2023/8/6,2027/4/21\r\n6215013101234567890,310121201009091234,L3,illegal_mining,2023/9/20,2027/12/8\r\n6237013201678901234,320122201110102345,L1,food_safety_violation,2023/10/5,2027/2/23\r\n6224013301012345678,330123201211113456,L2,medical_fraud,2023/11/19,2027/8/15\r\n6238013401456789012,340124201312124567,L3,educational_fraud,2023/12/3,2027/6/30\r\n6213013501890123456,350125201401015678,L1,insurance_fraud,2023/1/27,2027/10/13\r\n6239013601234567890,360126201502026789,L2,real_estate_fraud,2023/2/11,2027/3/7\r\n6240013701678901234,370127201603037890,L3,securities_fraud,2023/3/25,2027/1/20\r\n6212013801012345678,380128201704048901,L1,bank_fraud,2023/4/19,2027/7/5\r\n6241013901456789012,390129201805059012,L2,credit_card_fraud,2023/5/4,2027/11/18\r\n6211014001890123456,400130201906060123,L3,loan_sharking,2023/6/18,2027/5/3\r\n6242014101234567890,410131202007071234,L1,illegal_immigration,2023/7/13,2027/9/27\r\n6210014201678901234,420132202108082345,L2,child_abuse,2023/8/7,2027/4/12\r\n6243014301012345678,430133202209093456,L3,animal_cruelty,2023/9/21,2027/12/16\r\n6209014401456789012,440134202310104567,L1,illegal_logging,2023/10/6,2027/2/28\r\n6244014501890123456,450135202411115678,L2,poaching,2023/11/20,2027/8/22\r\n6208014601234567890,460136202512126789,L3,illegal_fishing,2023/12/4,2027/6/14\r\n6245014701678901234,470137202601017890,L1,data_theft,2023/1/28,2027/10/9\r\n6207014801012345678,480138202702028901,L2,cyber_espionage,2023/2/12,2027/3/19\r\n6246014901456789012,490139202803039012,L3,software_piracy,2023/3/26,2027/1/24\r\n6206015001890123456,500140202904040123,L1,patent_infringement,2023/4/20,2027/7/10\r\n6247015101234567890,510141203005051234,L2,copyright_infringement,2023/5/5,2027/11/2\r\n6205015201678901234,520142203106062345,L3,trademark_infringement,2023/6/19,2027/5/17\r\n6248015301012345678,530143203207073456,L1,industrial_espionage,2023/7/14,2027/9/23\r\n6204015401456789012,540144203308084567,L2,trade_secret_theft,2023/8/8,2027/4/18\r\n6249015501890123456,550145203409095678,L3,price_fixing,2023/9/22,2027/12/12\r\n6203015601234567890,560146203510106789,L1,market_manipulation,2023/10/7,2027/2/24\r\n6250015701678901234,570147203611117890,L2,monopoly,2023/11/21,2027/8/18\r\n6202015801012345678,580148203712128901,L3,anti_competitive_practices,2023/12/5,2027/6/10\r\n6251015901456789012,590149203801019012,L1,unfair_trade_practices,2023/1/29,2027/10/5\r\n6201016001890123456,600150203902020123,L2,consumer_fraud,2023/2/13,2027/3/15\r\n6252016101234567890,610151204003031234,L3,product_liability,2023/3/27,2027/1/30\r\n6200016201678901234,620152204104042345,L1,environmental_liability,2023/4/21,2027/7/16\r\n6253016301012345678,630153204205053456,L2,workplace_safety_violation,2023/5/6,2027/11/8\r\n6299016401456789012,640154204306064567,L3,employment_discrimination,2023/6/20,2027/5/23\r\n6254016501890123456,650155204407075678,L1,sexual_harassment,2023/7/15,2027/9/29\r\n6298016601234567890,660156204508086789,L2,age_discrimination,2023/8/9,2027/4/24\r\n6255016701678901234,670157204609097890,L3,racial_discrimination,2023/9/23,2027/12/18\r\n6297016801012345678,680158204710108901,L1,disability_discrimination,2023/10/8,2027/2/28\r\n6256016901456789012,690159204811119012,L2,gender_discrimination,2023/11/22,2027/8/24\r\n6296017001890123456,700160204912120123,L3,religious_discrimination,2023/12/6,2027/6/16\r\n6257017101234567890,710161205001011234,L1,whistleblower_retaliation,2023/1/30,2027/10/11\r\n6295017201678901234,720162205102022345,L2,emotional_distress,2023/2/14,2027/3/21\r\n6258017301012345678,730163205203033456,L3,defamation,2023/3/28,2027/1/26\r\n6294017401456789012,740164205304044567,L1,libel,2023/4/22,2027/7/22\r\n6259017501890123456,750165205405055678,L2,slander,2023/5/7,2027/11/14\r\n6293017601234567890,760166205506066789,L3,invasion_of_privacy,2023/6/21,2027/5/30\r\n6260017701678901234,770167205607077890,L1,fraudulent_misrepresentation,2023/7/16,2027/9/25\r\n6292017801012345678,780168205708088901,L2,negligence,2023/8/10,2027/4/30\r\n6261017901456789012,790169205809099012,L3,professional_malpractice,2023/9/24,2027/12/24\r\n6291018001890123456,800170205910100123,L1,legal_malpractice,2023/10/9,2027/2/20\r\n6262018101234567890,810171206011111234,L2,medical_malpractice,2023/11/23,2027/8/16\r\n6290018201678901234,820172206112122345,L3,accounting_malpractice,2023/12/7,2027/6/12\r\n6263018301012345678,830173206201013456,L1,engineering_malpractice,2023/1/31,2027/10/7\r\n6289018401456789012,840174206302024567,L2,architectural_malpractice,2023/2/15,2027/3/17\r\n6264018501890123456,850175206403035678,L3,insurance_bad_faith,2023/3/29,2027/1/22\r\n6288018601234567890,860176206504046789,L1,breach_of_contract,2023/4/23,2027/7/18\r\n6265018701678901234,870177206605057890,L2,breach_of_fiduciary_duty,2023/5/8,2027/11/10\r\n6287018801012345678,880178206706068901,L3,conversion,2023/6/22,2027/5/26\r\n6266018901456789012,890179206807079012,L1,extortion,2023/7/17,2027/9/21\r\n6286019001890123456,900180206908080123,L2,blackmail,2023/8/11,2027/4/26\r\n6267019101234567890,910181207009091234,L3,robbery,2023/9/25,2027/12/20\r\n6285019201678901234,920182207110102345,L2,burglary,2023/10/10,2027/2/16\r\n6268019301012345678,930183207211113456,L3,larceny,2023/11/24,2027/8/12\r\n6284019401456789012,940184207312124567,L1,embezzlement,2023/12/8,2027/6/8\r\n6269019501890123456,950185207401015678,L2,receiving_stolen_property,2023/1/26,2027/10/3\r\n6283019601234567890,960186207502026789,L3,arson,2023/2/16,2027/3/13\r\n6270019701678901234,970187207603037890,L1,child_endangerment,2023/3/30,2027/1/18\r\n6282019801012345678,980188207704048901,L2,elder_abuse,2023/4/24,2027/7/14\r\n6271019901456789012,990189207805059012,L3,domestic_violence,2023/5/9,2027/11/6\r\n6281011000189012345,1000190207906060123,L1,stalking,2023/6/23,2027/5/22\r\n"
  },
  {
    "path": "docker/nhp-db/demo/smart.policy.json",
    "content": "{\r\n    \"policy\": \"file://./allow.policy.wasm\",\r\n    \"embedded\": true\r\n}\r\n"
  },
  {
    "path": "docker/nhp-db/demo/smart.policy.schema.json",
    "content": "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"type\": \"object\",\n  \"title\": \"Policy Configuration\",\n  \"description\": \"Schema for policy configuration including various protocol references and base64 encoded content\",\n  \"required\": [\n    \"policy\",\n    \"embedded\"\n  ],\n  \"properties\": {\n    \"policy\": {\n      \"type\": \"string\",\n      \"description\": \"Policy reference which can be a URL (http, https, file) or base64 encoded raw content\",\n      \"oneOf\": [\n        {\n          \"description\": \"HTTP protocol reference\",\n          \"pattern\": \"^http://.*$\",\n          \"examples\": [\"http://example.com/policies/allow.policy.wasm\"]\n        },\n        {\n          \"description\": \"HTTPS protocol reference\",\n          \"pattern\": \"^https://.*$\",\n          \"examples\": [\"https://example.com/policies/deny.policy.wasm\"]\n        },\n        {\n          \"description\": \"File protocol reference. Relative paths are relative to this JSON configuration file's location.\",\n          \"pattern\": \"^file://.*$\",\n          \"examples\": [\n            \"file://./allow.policy.wasm\",\n            \"file:///absolute/path/to/deny.policy.wasm\",\n            \"file://../parentdir/policy.wasm\"\n          ]\n        },\n        {\n          \"description\": \"Base64 encoded raw policy content\",\n          \"pattern\": \"^[A-Za-z0-9+/=]+$\",\n          \"examples\": [\"SGVsbG8gV29ybGQhCg==\"]\n        }\n      ]\n    },\n    \"embedded\": {\n      \"type\": \"boolean\",\n      \"description\": \"Flag indicating whether the policy is embedded\",\n      \"examples\": [true, false]\n    }\n  },\n  \"additionalProperties\": false\n}\n"
  },
  {
    "path": "docker/nhp-db/etc/config.toml",
    "content": "# NHP-Db base config\n# field with (-) does not support dynamic update\n\n# PrivateKeyBase64 (-): db private key in base64 format.\n# SymmetricCipherMode: default mode is AES-256-GCM-128, supported modes:\n#   AES-256-GCM-64, AES-256-GCM-96, AES-256-GCM-104, AES-256-GCM-112, AES-256-GCM-120, AES-256-GCM-128, SM4-GCM-64, SM4-GCM-128.\n# UserId: specify the user id this agent represents.\n# OrganizationId: specify the organization id this agent represents.\n# LogLevel: 0: silent, 1: error, 2: info, 3: audit, 4: debug, 5: trace.\nPrivateKeyBase64 = \"WAb4iFVXHnF5yMpacue1HKTa6nyOebx7BPNn++0ix1c=\"\nDefaultCipherScheme = 0\nSymmetricCipherMode = \"AES-256-GCM-128\"\nDbId = \"device-0\"\nOrganizationId = \"opennhp.org\"\nLogLevel = 4\n\n# UserData: a customized user entry for flexibility.\n# Its key-value pairs will be send to server along with knock message.\n[UserData]\n"
  },
  {
    "path": "docker/nhp-db/etc/server.toml",
    "content": "# list the server peers for the device under [[Servers]] table\n\n# Hostname: the domain of the server peer. If specified, it overrides the \"Ip\" field with its first resolved address.\n# Ip: specify the ip address of the server peer\n# Port: specify the port number of this server peer is listening\n# PubKeyBase64: public key of the server peer in base64 format\n# ExpireTime (epoch timestamp in seconds): peer key validation will fail when it expires.\n[[Servers]]\nHostname = \"\"\nIp = \"177.7.0.9\"\nPort = 62206\nPubKeyBase64 = \"4/p0mIknwmVIMocRLQKil7xIthgEdZNncv9UagiBaK2kpcH7i4hEtZjpcHox+Bn7xdV+rBKNbKlV9ye6V1VCLA==\"\nExpireTime = 1924991999"
  },
  {
    "path": "docker/nhp-db/etc/tee.toml",
    "content": "# Configuration for trusted execution environment.\n\n# TEEPublicKeyBase64: base64 encoded public key of TEE (Trusted Execution Environment).\n[[TEEs]]\nTEEPublicKeyBase64 = \"Jxg2hkMuHSr0Lw5DMKtm2PE9skt/VD53bWxlmnn8XI7J+30A2zxTAyVSoMwt5YveD5sQOFRXyTI/ihbMriyBpw==\"\nExpireTime = 1924991999\n"
  },
  {
    "path": "docker/nhp-enter-nginx.conf",
    "content": "\n#user  root;\nworker_processes  auto;\n\nerror_log  /var/log/nginx/error.log notice;\npid        /var/run/nginx.pid;\n\n\nevents {\n    worker_connections  1024;\n}\n\n\nhttp {\n    include       /etc/nginx/mime.types;\n    default_type  application/octet-stream;\n\n    log_format  main  '$remote_addr - $remote_user [$time_local] \"$request\" '\n                      '$status $body_bytes_sent \"$http_referer\" '\n                      '\"$http_user_agent\" \"$http_x_forwarded_for\"';\n\n    access_log  /var/log/nginx/access.log  main;\n\n    sendfile        on;\n    #tcp_nopush     on;\n\n    keepalive_timeout  65;\n    server {\n        listen       80;\n        server_name  loginlocal.opennhp.org localhost;\n        \n        location / {\n            proxy_pass   http://nhp-server:62206;\n            proxy_set_header Host $host;\n            proxy_set_header X-Real-IP $remote_addr;\n        }\n    }\n    # #gzip  on;\n    # server {\n    #     listen       443 ssl;\n    #     server_name  _;\n    #     ssl_certificate     /cert.pem;\n    #     ssl_certificate_key /key.pem;\n    #     location / {\n    #         proxy_pass   http://nhp-server:62206;\n    #         proxy_set_header Host $host;\n    #         proxy_set_header X-Real-IP $remote_addr;\n    #     }\n    # }\n    server {\n        listen       443 ssl;               \n        server_name  loginlocal.opennhp.org localhost; \n        \n        ssl_certificate     /cert.pem;  \n        ssl_certificate_key /key.pem;\n        location / {\n            proxy_pass   http://nhp-ac;  \n            proxy_set_header Host $host;\n            proxy_set_header X-Real-IP $remote_addr;\n        }\n    }\n}\n"
  },
  {
    "path": "docker/nhp-server/etc/ac.toml",
    "content": "# list the AC peers for the server under [[ACs]] table\r\n\r\n# PubKeyBase64: public key for the AC in base64 format.\r\n# ExpireTime (epoch timestamp in seconds): peer key validation will fail when it expires.\r\n[[ACs]]\r\nPubKeyBase64 = \"tovd99hsYLjjvRjig95bZa+PSh8CZQKzbbKHH74+oiIEOBEjslZ7WzjCOYzd4TJNgYO8TOZYc0w0sxhz0I9J5w==\"\r\nExpireTime = 1924991999\r\n"
  },
  {
    "path": "docker/nhp-server/etc/agent.toml",
    "content": "# list the agent peers for the server under [[Agents]] table\r\n\r\n# PubKeyBase64: public key for the agent in base64 format.\r\n# ExpireTime (epoch timestamp in seconds): peer key validation will fail when it expires.\r\n[[Agents]]\r\nPubKeyBase64 = \"hdDrqJl0lAPNn7o/+MaZhfPOaAMjveLUsSPEq7ax4IVpsbjxbWwahyb3hoKlY1jqshDZrTc91dEXT4aTBiYmhg==\"\r\nExpireTime = 1924991999\r\n"
  },
  {
    "path": "docker/nhp-server/etc/config.toml",
    "content": "# NHP-Server base config\r\n# field with (-) does not support dynamic update\r\n\r\n# PrivateKeyBase64 (-): server private key in base64 format.\r\n# DefaultCipherScheme: 0: curve25519, 1: gmsm.\r\n# MIGRATION: Values changed in v2.x. If upgrading: old 0(gmsm)->new 1, old 1(curve)->new 0.\r\n# ListenIp (-): udp listening address.\r\n# ListenPort (-): udp listening port.\r\n# Hostname (-): server domain name.\r\n# LogLevel: 0: silent, 1: error, 2: info, 3: audit, 4: debug, 5: trace.\r\n# DisableAgentValidation: whether for the server to skip the agent's public key validation.\r\nPrivateKeyBase64 = \"I9UzYO3skKYmDykz9DRBbV+cEebSw/L5yIvzHI4jz+o=\"\r\nDefaultCipherScheme = 1\r\nListenIp = \"0.0.0.0\"    # empty for ipv4 + ipv6, \"0.0.0.0\" for ipv4 only\r\nListenPort = 62206\r\nHostname = \"localhost:62206\" # the hostname of NHP-Server\r\nLogLevel = 5\r\nDisableAgentValidation = false\r\n\r\n"
  },
  {
    "path": "docker/nhp-server/etc/db.toml",
    "content": "# list the device peers for the server under [[Devices]] table\n\n# PubKeyBase64: public key for the device in base64 format.\n# ExpireTime (epoch timestamp in seconds): peer key validation will fail when it expires.\n[[DBs]]\nPubKeyBase64 = \"hyYDOu6Hkv6vDMwgqVJ3ZWB/A+WmHASTWGLmhGJI5mebMQgpf56RQPhRR7xTm7JXJ0dIXxSpSLL8w5DdN9WDMw==\"\nExpireTime = 1924991999\n"
  },
  {
    "path": "docker/nhp-server/etc/http.toml",
    "content": "# http server config\r\n\r\n# EnableHttp: true: turn on http server, false: shutdown http server.\r\n# EnableTLS: whether to use TLS certificates for hosting https server.\r\n# TLSCertFile: certificate file path.\r\n# TLSKeyFile: key file path.\r\n# to update http changes, you need to restart the http server by changing \"EnableHttp\" to \"false\" and then switch it back to \"true\".\r\nEnableHttp = true\r\nEnableTLS = true\r\nHttpListenIp = \"0.0.0.0\"    # empty for ipv4 + ipv6, \"0.0.0.0\" for ipv4 only, \"127.0.0.1\" for local ipv4 access only\r\nTLSCertFile = \"cert/cert.pem\"\r\nTLSKeyFile = \"cert/cert.key\"\r\n"
  },
  {
    "path": "docker/nhp-server/etc/resource.toml",
    "content": "# List resources and their sub-fields here\r\n\r\n# syntax [\"{AuthServiceId}\"]\r\n# AuthServiceId: id of the authentication and authorization service provider.\r\n# PluginPath: path of plugin to implement auth logic.\r\n[\"example\"]\r\nPluginPath = \"example/example.so\"\r\n"
  },
  {
    "path": "docker/nhp-server/etc/srcip.toml",
    "content": "# list additional source addresses to be passed along with the agent address\r\n\r\n# syntax [[\"{SrcIp}\"]]\r\n# SrcIp: specify the agent source ip. Each source ip can have multiple side source ips.\r\n# Ip: specify a side source ip address to be also passed after successful knock.\r\n\r\n[[\"192.168.65.1\"]]\r\nIp = \"177.7.0.8\"\r\n"
  },
  {
    "path": "docker/nhp-server/etc/tee.toml",
    "content": "# list trusted execution environments under [[TEEs]] table\n\n# Measure: cryptographic hashes that ensure the integrity of software and data within the TEE.\n# SerialNumber: unique serial number of the TEE.\n\n[[TEEs]]\nMeasure = \"19178a674248bbca705863bbf75ecaa049fcf3dfcc5ff59a80dcc5cbb60dae59\"\nSerialNumber = \"TMEX300023050201\"\n\n"
  },
  {
    "path": "docker/nhp-server/plugins/example/etc/config.toml",
    "content": "ExampleUsername = \"user\"\r\nExamplePassword = \"password\"\r\n"
  },
  {
    "path": "docker/nhp-server/plugins/example/etc/resource.toml",
    "content": "# List resources id and their sub-fields here\r\n\r\n# syntax [\"{ResourceId}\"]\r\n# ResourceId: id for the resource group. Each AuthServiceId can have multiple ResourceIds.\r\n# SkipAuth: true: auth by matching the AuthServiceId and ResourceId, skip using plugin logic.\r\n# OpenTime: seconds for traffic passing duration after successful knock.\r\n# RedirectUrl: a customized url send back with the http response message as an option for redirection. (only applicable for http agent)\r\n# RedirectWithParams: whether or not to include queries in the original http request. (only applicable for http agent)\r\n[\"demo\"]\r\nSkipAuth = true\r\nOpenTime = 15\r\nRedirectUrl = \"https://localhost\"\r\nRedirectWithParams = false\r\nCookieDomain = \"opennhp.org\"\r\n\r\n# syntax [\"{ResourceId}\".Resources.\"{ResourceName}\"]\r\n# ResourceName: name of resource inside a resource group. Each ResourceId can have multiple ResourceNames.\r\n# ACId: id of the NHP-AC that guards the resource.\r\n# Hostname: domain for the resource.\r\n# Addr.Ip: destination ip address of the resource.\r\n# Addr.Port: destination port of the resource.\r\n# Addr.Protocol: whether to pass a specific protocol among \"tcp\", \"udp\", \"any\". \"any\" also includes ping traffic.\r\n# PortSuffix: true: fill ack field \"resHost\" with \"{Hostname}:{Port}\", false: fill ack field \"resHost\" with just \"{Hostname}\"\r\n\r\n[\"demo\".Resources.\"demoServer\"]\r\nACId = \"testAC-1\"\r\nHostname = \"localhost\"\r\nAddr.Ip = \"177.7.0.10\"\r\nAddr.Port = 80 # empty or 0 for all ports\r\nAddr.Protocol = \"\" # \"tcp/udp/any\", empty for \"any\"\r\nPortSuffix = false\r\n\r\n# extra information as per-plugin defined fields\r\n[\"demo\".ExInfo]\r\nTitle = \"OpenNHP Demo Login(Local docker)\"\r\n"
  },
  {
    "path": "docker/nhp-server/templates/example/example_acdemo.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>Welcome to NHP Demo(Local docker)</title>\n    <style>\n        body {\n            font-family: Arial, sans-serif;\n            background-color: #f0f0f0;\n            display: flex;\n            justify-content: center;\n            align-items: center;\n            height: 100vh;\n            margin: 0;\n        }\n        .container {\n            text-align: center;\n            background-color: white;\n            padding: 2rem;\n            border-radius: 10px;\n            box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);\n        }\n        h1 {\n            color: #4a4a4a;\n            font-size: 2.5rem;\n            margin-bottom: 1rem;\n        }\n        p {\n            color: #0066cc;\n            font-size: 1.8rem;\n            margin-top: 1rem;\n            font-weight: bold;\n        }\n        #countdown {\n            margin-top: 2rem;\n            color: red;\n            font-size: 1.5rem;\n            font-weight: bold;\n        }\n        #message {\n            margin-top: 1rem;\n            color: green;\n            font-size: 1.5rem;\n            display: none;\n        }\n    </style>\n</head>\n<body>\n    <div class=\"container\">\n        <h1>Welcome to the Demo NHP-AC Server(Local)</h1>\n        <p>localhost</p>\n        <div><a href=\"https://dnschecker.org/port-scanner.php?query=acdemo.opennhp.org&ptype=server\" target=\"_blank\">Scan Its Ports &gt;&gt;</a></div>\n        <!-- Add countdown display -->\n        <div id=\"countdown\">This Server Will be Hidden after <span id=\"timer\">15</span> seconds ...</div>\n        <!-- Messages with hidden information -->\n        <div id=\"message\">The Server Has been Hidden.</div>\n    </div>\n\n    <script>\n        // Initialize countdown seconds\n        let seconds = 15;\n\n        // Retrieve DOM elements\n        const timerElement = document.getElementById('timer');\n        const countdownElement = document.getElementById('countdown');\n        const messageElement = document.getElementById('message');\n\n        // Update countdown every second\n        const countdownInterval = setInterval(() => {\n            seconds--;\n            timerElement.textContent = seconds;\n\n            if (seconds <= 0) {\n                clearInterval(countdownInterval);\n                // Hide Countdown\n                countdownElement.style.display = 'none';\n                // Show hidden messages\n                messageElement.style.display = 'block';\n            }\n        }, 1000);\n    </script>\n</body>\n</html>\n\n"
  },
  {
    "path": "docker/nhp-server/templates/example/example_login.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>OpenNHP Demo</title>\n    <style>\n        @import url('https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;600&display=swap');\n\n        body {\n            font-family: 'Poppins', sans-serif;\n            background-color: #f0f4f8;\n            margin: 0;\n            padding: 0;\n            display: flex;\n            justify-content: center;\n            align-items: center;\n            height: 100vh;\n        }\n\n        .container {\n            background-color: #ffffff;\n            border-radius: 8px;\n            box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);\n            padding: 2rem;\n            width: 640px;\n            transition: width 0.3s ease;\n        }\n\n        .container.expanded {\n            width: 800px;\n        }\n\n        h1 {\n            color: #3498db;\n            text-align: center;\n        }\n\n        .input-group {\n            margin-bottom: 1rem;\n        }\n\n        label {\n            display: block;\n            margin-bottom: 0.5rem;\n            color: #555;\n        }\n\n        input {\n            width: 100%;\n            padding: 0.5rem;\n            border: 1px solid #ddd;\n            border-radius: 4px;\n            font-size: 1rem;\n        }\n\n        button {\n            width: 100%;\n            padding: 0.75rem;\n            background-color: #3498db;\n            color: white;\n            border: none;\n            border-radius: 4px;\n            font-size: 1rem;\n            cursor: pointer;\n            transition: background-color 0.3s;\n        }\n\n        button:hover {\n            background-color: #2980b9;\n        }\n\n        .note {\n            text-align: center;\n            margin-top: 1rem;\n            font-size: 1.1rem;\n            color: #777;\n        }\n\n        .status {\n            margin-bottom: 1.5rem;\n            border-bottom: 1px solid #eee;\n            padding-bottom: 1rem;\n        }\n\n        .status-item {\n            display: flex;\n            justify-content: space-between;\n            margin-bottom: 0.5rem;\n        }\n\n        .status-label {\n            font-weight: 600;\n            padding-right: 0.5rem;\n        }\n\n        .status-value {\n            font-weight: 300;\n        }\n\n        .timeout {\n            color: #e74c3c;\n        }\n\n        .success {\n            color: #2ecc71;\n        }\n\n        .language-select {\n            text-align: right;\n            margin-bottom: 1rem;\n        }\n\n        select {\n            padding: 0.25rem;\n        }\n\n        #message {\n            margin-top: 1rem;\n            font-size: 1.2rem;\n            color: #2ecc71;  \n            display: none;  \n            text-align: center;\n        }\n\n        .countdown-container {\n            display: flex;\n            align-items: center;\n            justify-content: center;\n            gap: 0;\n            white-space: nowrap;  \n            min-width: 200px;  \n            margin-top: 1rem; /* Adjust if needed */\n        }\n\n        #countdown {\n            font-size: 1.5rem;\n            font-weight: bold;\n            margin-right: 0.5rem;\n        }\n\n        #timeUnit {\n            font-size: 1.2rem;\n        }\n\n        #welcomeMessage {\n            font-size: 1.3rem;\n            margin-right: 0.5rem;\n        }\n\n        .note a {\n            white-space: nowrap;\n            overflow: hidden;\n            text-overflow: ellipsis;\n        }\n    </style>\n</head>\n<body>\n    <div class=\"container\" id=\"mainContainer\">\n        <div class=\"language-select\" id=\"languageSelectContainer\">\n            <select id=\"languageSelect\" onchange=\"changeLanguage()\">\n                <option value=\"en\">English</option>\n                <option value=\"zh\">中文</option>\n                <option value=\"es\">Español</option>\n            </select>\n        </div>\n        <h1 id=\"title\">OpenNHP Demo</h1>\n        <div class=\"status\">\n            <p class=\"note\">\n                <span id=\"protectedServer\">The Protected Server is</span> \n                <a href=\"https://localhost\" target=\"_blank\">https://localhost</a>. \n            </p>\n            <div class=\"status-item\">\n                <span class=\"status-label\" id=\"beforeLogin\">Before Login: </span>\n                <span class=\"status-value timeout\" id=\"timeoutStatus\">Connection to the Protected Server should be <strong>TIMEOUT. ❌</strong></span>\n            </div>\n            <div class=\"status-item\">\n                <span class=\"status-label\" id=\"afterLogin\">After Login: </span>\n                <span class=\"status-value success\" id=\"successStatus\">Connection to the Protected Server should be <strong>SUCCESSFUL. ✅</strong></span>\n            </div>\n        </div>     \n        <form id=\"loginForm\" onsubmit=\"return nhpValidate()\">\n            <div class=\"input-group\">\n                <label for=\"username\" id=\"usernameLabel\">Username:</label>\n                <input type=\"text\" id=\"username\" name=\"username\" value=\"user\">\n            </div>\n            <div class=\"input-group\">\n                <label for=\"password\" id=\"passwordLabel\">Password:</label>\n                <input type=\"password\" id=\"password\" name=\"password\" value=\"password\">\n            </div>\n            <button type=\"submit\" id=\"loginButton\">Login</button>\n        </form>\n        <div id=\"message\">\n            <h2 id=\"authSuccessMessage\"></h2>\n\n            <div class=\"message-content\">\n                <span id=\"redirectMessage\"></span> \n                <a href=\"\" id=\"redirectUrl\"></a>\n            </div>\n            <div class=\"countdown-container\">\n                <div id=\"welcomeMessage\"></div> <!-- Welcome Message -->\n                <span id=\"countdown\">5</span>\n                <span id=\"timeUnit\"></span>\n            </div>\n        </div> \n    </div>\n\n    <script>\n        const translations = {\n            en: {\n                title: \"OpenNHP Demo\",\n                protectedServer: \"The Protected Server is\",\n                scanPorts: \"Scan Its Ports >>\",\n                beforeLogin: \"Before Login:\",\n                afterLogin: \"After Login:\",\n                timeoutStatus: \"Connection to the Protected Server should be TIMEOUT. ❌\",\n                successStatus: \"Connection to the Protected Server should be SUCCESSFUL. ✅\",\n                usernameLabel: \"Username:\",\n                passwordLabel: \"Password:\",\n                loginButton: \"Login\",\n                authSuccess: \"Authentication Succeeded!\",\n                redirectMessage: \"You can now access\",\n                timeUnit: \"   seconds ...\",\n                welcomeMessage: \"Redirecting in\"\n            },\n            zh: {\n                title: \"OpenNHP 演示\",\n                protectedServer: \"受保护的服务器是\",\n                scanPorts: \"扫描其端口 >>\",\n                beforeLogin: \"登录前：\",\n                afterLogin: \"登录后：\",\n                timeoutStatus: \"与受保护服务器的连接应为超时。❌\",\n                successStatus: \"与受保护服务器的连接应该成功。✅\",\n                usernameLabel: \"用户名：\",\n                passwordLabel: \"密码：\",\n                loginButton: \"登录\",\n                authSuccess: \"认证成功！\",\n                redirectMessage: \"您现在可以访问\",\n                timeUnit: \"   秒后自动跳转...\",\n                welcomeMessage: \"\"\n            },\n            es: {\n                title: \"Demostración de OpenNHP\",\n                protectedServer: \"El Servidor Protegido es\",\n                scanPorts: \"Escanear Sus Puertos >>\",\n                beforeLogin: \"Antes del Inicio de Sesión:\",\n                afterLogin: \"Después del Inicio de Sesión:\",\n                timeoutStatus: \"La conexión al Servidor Protegido debe ser TIEMPO DE ESPERA. ❌\",\n                successStatus: \"La conexión al Servidor Protegido debe ser EXITOSA. ✅\",\n                usernameLabel: \"Nombre de Usuario:\",\n                passwordLabel: \"Contraseña:\",\n                loginButton: \"Iniciar Sesión\",\n                authSuccess: \"¡Autenticación Exitosa!\",\n                redirectMessage: \"Ahora puedes acceder a\",\n                timeUnit: \"   segundo...\",\n                welcomeMessage: \"Saltar automáticamente después de\"\n            }\n        };\n\n        function changeLanguage() {\n            const lang = document.getElementById('languageSelect').value;\n            const container = document.getElementById('mainContainer');\n            if (lang === 'es') {\n                container.classList.add('expanded');\n            } else {\n                container.classList.remove('expanded');\n            }\n            document.documentElement.lang = lang;\n            const t = translations[lang];\n\n            document.getElementById('title').textContent = t.title;\n            document.getElementById('protectedServer').textContent = t.protectedServer;\n            document.getElementById('scanPorts').textContent = t.scanPorts;\n            document.getElementById('beforeLogin').textContent = t.beforeLogin;\n            document.getElementById('afterLogin').textContent = t.afterLogin;\n            document.getElementById('timeoutStatus').textContent = t.timeoutStatus;\n            document.getElementById('successStatus').textContent = t.successStatus;\n            document.getElementById('usernameLabel').textContent = t.usernameLabel;\n            document.getElementById('passwordLabel').textContent = t.passwordLabel;\n            document.getElementById('loginButton').textContent = t.loginButton;\n        }\n\n        function nhpValidate() {\n            const user = document.getElementById(\"username\").value;\n            const password = document.getElementById(\"password\").value;\n            const nhpValidUrl = \"/plugins/example?resid=demo&action=valid\" + \n            \"&username=\" + encodeURIComponent(user) + \n            \"&password=\" + encodeURIComponent(password);\n            console.log(nhpValidUrl);\n\n            fetch(nhpValidUrl,{\n                credentials: \"include\"\n            })\n            .then(response => response.json())\n            .then(result => {\n                console.log(result);\n                const lang = document.getElementById('languageSelect').value;  \n                const t = translations[lang];  \n                const messageElement = document.getElementById(\"message\");\n                const authSuccessMessageElement = document.getElementById(\"authSuccessMessage\");\n                const welcomeMessageElement = document.getElementById(\"welcomeMessage\");\n                const redirectMessageElement = document.getElementById(\"redirectMessage\");\n                const redirectUrlElement = document.getElementById(\"redirectUrl\");\n                const timeUnitElement = document.getElementById('timeUnit');\n\n                if (result && result.redirectUrl) {\n\n                    document.getElementById('languageSelectContainer').style.display = 'none';\n\n                    redirectUrlElement.href = result.redirectUrl;\n                    redirectUrlElement.textContent = result.redirectUrl;\n                    authSuccessMessageElement.textContent = t.authSuccess;\n                    welcomeMessageElement.textContent = t.welcomeMessage; // 添加的欢迎消息显示\n                    redirectMessageElement.textContent = t.redirectMessage;\n                    messageElement.style.display = 'block';\n                    document.getElementById(\"loginForm\").style.display = \"none\"; \n\n                    let countdown = 5;\n                    const countdownElement = document.getElementById('countdown');\n                    const intervalId = setInterval(() => {\n                        countdown -= 1;\n                        if (countdown <= 0) {\n                            clearInterval(intervalId);\n                            window.location.href = result.redirectUrl;\n                        } else {\n                            countdownElement.textContent = countdown;\n                        }\n                    }, 1000);\n                    timeUnitElement.textContent = t.timeUnit;\n\n                } else {\n                    if (result.errMsg) {\n                        alert(result.errMsg);\n                    } else {\n                        alert(\"Invalid username or password\");\n                    }\n                }\n            })\n            .catch(error => {\n                alert(error.message);\n            });\n            return false; \n        }\n\n        document.addEventListener('DOMContentLoaded', () => {\n            const userLang = navigator.language || navigator.userLanguage;\n            const lang = userLang.startsWith('es') ? 'es' : (userLang.startsWith('zh') ? 'zh' : 'en');\n            document.getElementById('languageSelect').value = lang;\n            changeLanguage(); \n        });\n    </script>\n</body>\n</html>\n"
  },
  {
    "path": "docker/quick_start.sh",
    "content": "#!/bin/bash\n\n# OpenNHP Docker Quick Start Script\n# Supports Linux and macOS\n\nset -e\n\n# Colors for output\nRED='\\033[0;31m'\nGREEN='\\033[0;32m'\nYELLOW='\\033[1;33m'\nBLUE='\\033[0;34m'\nNC='\\033[0m' # No Color\n\n# Script directory\nSCRIPT_DIR=\"$(cd \"$(dirname \"${BASH_SOURCE[0]}\")\" && pwd)\"\ncd \"$SCRIPT_DIR\"\n\n# Default values\nUSE_CHINA_MIRROR=false\nGOPROXY_DEFAULT=\"https://proxy.golang.org,direct\"\nGOPROXY_CHINA=\"https://goproxy.cn,direct\"\nAPT_MIRROR_CHINA=\"mirrors.aliyun.com\"\n\n# Export environment variables\nexport_env() {\n    if [ \"$USE_CHINA_MIRROR\" = true ]; then\n        export GOPROXY=\"$GOPROXY_CHINA\"\n        export APT_MIRROR=\"$APT_MIRROR_CHINA\"\n        echo -e \"${GREEN}Using China mirrors: GOPROXY=$GOPROXY, APT_MIRROR=$APT_MIRROR${NC}\"\n    else\n        export GOPROXY=\"$GOPROXY_DEFAULT\"\n        export APT_MIRROR=\"\"\n        echo -e \"${GREEN}Using default mirrors: GOPROXY=$GOPROXY${NC}\"\n    fi\n}\n\n# Print header\nprint_header() {\n    echo -e \"${BLUE}\"\n    echo \"╔══════════════════════════════════════════════════════════════╗\"\n    echo \"║           OpenNHP Docker Quick Start Script                  ║\"\n    echo \"╚══════════════════════════════════════════════════════════════╝\"\n    echo -e \"${NC}\"\n}\n\n# Print menu\nprint_menu() {\n    echo -e \"${YELLOW}Please select an option:${NC}\"\n    echo \"\"\n    echo \"  [1] Build ALL and Start (Full rebuild)\"\n    echo \"  [2] Build Base Image (opennhp-base)\"\n    echo \"  [3] Build NHP-Server\"\n    echo \"  [4] Build NHP-AC\"\n    echo \"  [5] Build NHP-Agent\"\n    echo \"  [6] Build Web-App\"\n    echo \"  [7] Start All Services\"\n    echo \"  [8] Stop All Services\"\n    echo \"  [9] Restart All Services\"\n    echo \"  [10] View Logs (nhp-server)\"\n    echo \"  [11] View Logs (nhp-ac)\"\n    echo \"  [12] View Logs (nhp-agent)\"\n    echo \"  [13] Clean Docker Images\"\n    echo \"  [14] Clean ALL (images + volumes + networks)\"\n    echo \"  [15] Toggle China Mirror (current: $([ \"$USE_CHINA_MIRROR\" = true ] && echo \"ON\" || echo \"OFF\"))\"\n    echo \"  [0] Exit\"\n    echo \"\"\n}\n\n# Build base image\nbuild_base() {\n    echo -e \"${BLUE}Building opennhp-base image...${NC}\"\n    export_env\n\n    local build_args=(--no-cache -t opennhp-base:latest -f Dockerfile.base)\n    if [ \"$USE_CHINA_MIRROR\" = true ]; then\n        build_args+=(--build-arg \"GOPROXY=$GOPROXY\" --build-arg \"APT_MIRROR=$APT_MIRROR\")\n    fi\n\n    docker build \"${build_args[@]}\" ..\n    echo -e \"${GREEN}Base image built successfully!${NC}\"\n}\n\n# Build a specific service\nbuild_service() {\n    local service=$1\n    echo -e \"${BLUE}Building $service...${NC}\"\n    export_env\n\n    docker compose build --no-cache \"$service\"\n    echo -e \"${GREEN}$service built successfully!${NC}\"\n}\n\n# Build all and start\nbuild_all_and_start() {\n    echo -e \"${BLUE}Building all images and starting services...${NC}\"\n    export_env\n\n    # Build base image first\n    build_base\n\n    # Build all services\n    echo -e \"${BLUE}Building all services...${NC}\"\n    docker compose build --no-cache\n\n    # Stop and remove existing containers\n    echo -e \"${BLUE}Stopping existing services...${NC}\"\n    docker compose down 2>/dev/null || true\n\n    # Start services\n    echo -e \"${BLUE}Starting all services...${NC}\"\n    docker compose up -d\n\n    echo -e \"${GREEN}All services are running!${NC}\"\n    docker compose ps\n}\n\n# Start services\nstart_services() {\n    echo -e \"${BLUE}Starting all services...${NC}\"\n    docker compose up -d\n    echo -e \"${GREEN}Services started!${NC}\"\n    docker compose ps\n}\n\n# Stop services\nstop_services() {\n    echo -e \"${BLUE}Stopping all services...${NC}\"\n    docker compose down\n    echo -e \"${GREEN}Services stopped!${NC}\"\n}\n\n# Restart services\nrestart_services() {\n    echo -e \"${BLUE}Restarting all services...${NC}\"\n    docker compose restart\n    echo -e \"${GREEN}Services restarted!${NC}\"\n    docker compose ps\n}\n\n# View logs\nview_logs() {\n    local service=$1\n    echo -e \"${BLUE}Viewing logs for $service (Ctrl+C to exit)...${NC}\"\n    docker compose logs -f \"$service\"\n}\n\n# Clean images\nclean_images() {\n    echo -e \"${YELLOW}This will remove all OpenNHP Docker images.${NC}\"\n    read -p \"Are you sure? (y/N): \" confirm\n    if [ \"$confirm\" = \"y\" ] || [ \"$confirm\" = \"Y\" ]; then\n        echo -e \"${BLUE}Stopping services...${NC}\"\n        docker compose down 2>/dev/null || true\n\n        echo -e \"${BLUE}Removing images...${NC}\"\n        docker rmi opennhp-base:latest 2>/dev/null || true\n        docker rmi opennhp-server:latest 2>/dev/null || true\n        docker rmi opennhp-ac:latest 2>/dev/null || true\n        docker rmi opennhp-agent:latest 2>/dev/null || true\n        docker rmi web-app:latest 2>/dev/null || true\n\n        # Also remove by compose project name\n        docker images | grep -E \"^(opennhp|docker)\" | awk '{print $3}' | xargs -r docker rmi 2>/dev/null || true\n\n        echo -e \"${GREEN}Images cleaned!${NC}\"\n    else\n        echo -e \"${YELLOW}Operation cancelled.${NC}\"\n    fi\n}\n\n# Clean all\nclean_all() {\n    echo -e \"${RED}WARNING: This will remove ALL OpenNHP Docker images, volumes, and networks!${NC}\"\n    read -p \"Are you sure? (y/N): \" confirm\n    if [ \"$confirm\" = \"y\" ] || [ \"$confirm\" = \"Y\" ]; then\n        echo -e \"${BLUE}Stopping services...${NC}\"\n        docker compose down -v 2>/dev/null || true\n\n        echo -e \"${BLUE}Removing images...${NC}\"\n        docker rmi opennhp-base:latest 2>/dev/null || true\n        docker rmi opennhp-server:latest 2>/dev/null || true\n        docker rmi opennhp-ac:latest 2>/dev/null || true\n        docker rmi opennhp-agent:latest 2>/dev/null || true\n        docker rmi web-app:latest 2>/dev/null || true\n        docker images | grep -E \"^(opennhp|docker)\" | awk '{print $3}' | xargs -r docker rmi 2>/dev/null || true\n\n        echo -e \"${BLUE}Removing volumes...${NC}\"\n        docker volume ls | grep -E \"docker_\" | awk '{print $2}' | xargs -r docker volume rm 2>/dev/null || true\n\n        echo -e \"${BLUE}Removing networks...${NC}\"\n        docker network ls | grep -E \"docker_\" | awk '{print $2}' | xargs -r docker network rm 2>/dev/null || true\n\n        echo -e \"${BLUE}Pruning unused Docker resources...${NC}\"\n        docker system prune -f\n\n        echo -e \"${GREEN}All cleaned!${NC}\"\n    else\n        echo -e \"${YELLOW}Operation cancelled.${NC}\"\n    fi\n}\n\n# Toggle China mirror\ntoggle_china_mirror() {\n    if [ \"$USE_CHINA_MIRROR\" = true ]; then\n        USE_CHINA_MIRROR=false\n        echo -e \"${GREEN}China mirror: OFF${NC}\"\n    else\n        USE_CHINA_MIRROR=true\n        echo -e \"${GREEN}China mirror: ON${NC}\"\n    fi\n}\n\n# Rebuild and restart a specific service\nrebuild_and_restart_service() {\n    local service=$1\n    echo -e \"${BLUE}Rebuilding and restarting $service...${NC}\"\n    export_env\n\n    docker compose build --no-cache \"$service\"\n    docker stop \"$service\" 2>/dev/null || true\n    docker rm \"$service\" 2>/dev/null || true\n    docker compose up -d \"$service\"\n\n    echo -e \"${GREEN}$service rebuilt and restarted!${NC}\"\n}\n\n# Check Docker\ncheck_docker() {\n    if ! command -v docker &> /dev/null; then\n        echo -e \"${RED}Error: Docker is not installed or not in PATH${NC}\"\n        exit 1\n    fi\n\n    if ! docker info &> /dev/null; then\n        echo -e \"${RED}Error: Docker daemon is not running${NC}\"\n        exit 1\n    fi\n\n    if ! command -v docker compose &> /dev/null && ! docker compose version &> /dev/null; then\n        echo -e \"${RED}Error: Docker Compose is not available${NC}\"\n        exit 1\n    fi\n}\n\n# Main function\nmain() {\n    check_docker\n\n    # Check for --china flag\n    if [[ \"$1\" == \"--china\" ]] || [[ \"$1\" == \"-c\" ]]; then\n        USE_CHINA_MIRROR=true\n    fi\n\n    while true; do\n        print_header\n        print_menu\n\n        read -p \"Enter your choice [0-15]: \" choice\n        echo \"\"\n\n        case $choice in\n            1)\n                build_all_and_start\n                ;;\n            2)\n                build_base\n                ;;\n            3)\n                rebuild_and_restart_service \"nhp-server\"\n                ;;\n            4)\n                rebuild_and_restart_service \"nhp-ac\"\n                ;;\n            5)\n                rebuild_and_restart_service \"nhp-agent\"\n                ;;\n            6)\n                rebuild_and_restart_service \"web-app\"\n                ;;\n            7)\n                start_services\n                ;;\n            8)\n                stop_services\n                ;;\n            9)\n                restart_services\n                ;;\n            10)\n                view_logs \"nhp-server\"\n                ;;\n            11)\n                view_logs \"nhp-ac\"\n                ;;\n            12)\n                view_logs \"nhp-agent\"\n                ;;\n            13)\n                clean_images\n                ;;\n            14)\n                clean_all\n                ;;\n            15)\n                toggle_china_mirror\n                ;;\n            0)\n                echo -e \"${GREEN}Goodbye!${NC}\"\n                exit 0\n                ;;\n            *)\n                echo -e \"${RED}Invalid option. Please try again.${NC}\"\n                ;;\n        esac\n\n        echo \"\"\n        read -p \"Press Enter to continue...\"\n        clear\n    done\n}\n\n# Run main\nmain \"$@\"\n"
  },
  {
    "path": "docker/web-app/entrypoint.sh",
    "content": "#!/bin/bash\niptables -P INPUT DROP\niptables -P FORWARD DROP\niptables -I INPUT -p tcp --dport 8080 -s 177.7.0.10 -j ACCEPT\n\n/app"
  },
  {
    "path": "docker/web-app/go.mod",
    "content": "module nhp-app\n\ngo 1.25.6\n\nrequire github.com/gin-gonic/gin v1.10.0\n\nrequire (\n\tgithub.com/bytedance/sonic v1.11.6 // indirect\n\tgithub.com/bytedance/sonic/loader v0.1.1 // indirect\n\tgithub.com/cloudwego/base64x v0.1.4 // indirect\n\tgithub.com/cloudwego/iasm v0.2.0 // indirect\n\tgithub.com/gabriel-vasile/mimetype v1.4.3 // indirect\n\tgithub.com/gin-contrib/sse v0.1.0 // indirect\n\tgithub.com/go-playground/locales v0.14.1 // indirect\n\tgithub.com/go-playground/universal-translator v0.18.1 // indirect\n\tgithub.com/go-playground/validator/v10 v10.20.0 // indirect\n\tgithub.com/goccy/go-json v0.10.2 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.7 // indirect\n\tgithub.com/leodido/go-urn v1.4.0 // indirect\n\tgithub.com/mattn/go-isatty v0.0.20 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/pelletier/go-toml/v2 v2.2.2 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgithub.com/ugorji/go/codec v1.2.12 // indirect\n\tgolang.org/x/arch v0.8.0 // indirect\n\tgolang.org/x/crypto v0.45.0 // indirect\n\tgolang.org/x/net v0.47.0 // indirect\n\tgolang.org/x/sys v0.38.0 // indirect\n\tgolang.org/x/text v0.31.0 // indirect\n\tgoogle.golang.org/protobuf v1.34.1 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "docker/web-app/main.go",
    "content": "package main\n\nimport \"github.com/gin-gonic/gin\"\n\nfunc main() {\n\t//Create a default Gin router\n\tr := gin.Default()\n\n\t//Set the router to use the default middleware\n\tr.GET(\"/\", func(c *gin.Context) {\n\t\t//Handle the request and respond with a JSON message\n\t\tc.JSON(200, gin.H{\n\t\t\t\"message\": \"Hello World!\",\n\t\t})\n\t})\n\t// Set the router to listen on port 8080\n\tr.Run()\n}\n"
  },
  {
    "path": "docs/404.html",
    "content": "---\nlayout: default\ntitle: 404\npermalink: /404\nnav_exclude: true\nsearch_exclude: true\n---\n\n<style type=\"text/css\" media=\"screen\">\n  .container {\n    margin: 10px auto;\n    max-width: 600px;\n    text-align: center;\n  }\n  h1 {\n    margin: 30px 0;\n    font-size: 4em;\n    line-height: 1;\n    letter-spacing: -1px;\n  }\n</style>\n\n<div class=\"container\">\n  <h1>404</h1>\n\n  <p><strong>Page not found :(</strong></p>\n  <p>The requested page could not be found.</p>\n</div>\n"
  },
  {
    "path": "docs/CNAME",
    "content": "opennhp.org"
  },
  {
    "path": "docs/Gemfile",
    "content": "source 'https://rubygems.org'\n\ngem \"jekyll\", \"~> 4.3.3\" # installed by `gem jekyll`\n# gem \"webrick\"        # required when using Ruby >= 3 and Jekyll <= 4.2.2\n\n#gem \"just-the-docs\", \"0.9.0\" # pinned to the current release\ngem \"just-the-docs\"        # always download the latest release\n"
  },
  {
    "path": "docs/README.md",
    "content": ""
  },
  {
    "path": "docs/_config.yml",
    "content": "# Welcome to Jekyll!\n#\n# This config file is meant for settings that affect your whole blog, values\n# which you are expected to set up once and rarely edit after that. If you find\n# yourself editing this file very often, consider using Jekyll's data files\n# feature for the data you need to update frequently.\n#\n# For technical reasons, this file is *NOT* reloaded automatically when you use\n# 'bundle exec jekyll serve'. If you change this file, please restart the server process.\n#\n# If you need help with YAML syntax, here are some quick references for you:\n# https://learn-the-web.algonquindesign.ca/topics/markdown-yaml-cheat-sheet/#yaml\n# https://learnxinyminutes.com/docs/yaml/\n#\n# Site settings\n# These are used to personalize your new site. If you look in the HTML files,\n# you will see them accessed via {{ site.title }}, {{ site.email }}, and so on.\n# You can create any custom variable you would like, and they will be accessible\n# in the templates via {{ site.myvariable }}.\n\ntitle: OpenNHP Documentation\ndescription: Zero Trust Network-infrastructure Hiding Protocol\nbaseurl: \"\" # the subpath of your site, e.g. /blog\n#remote_theme: just-the-docs\ntheme: just-the-docs\n\nurl: \"https://opennhp.org\"\nlogo: \"/images/logo12.png\"\nfavicon_ico: \"/favicon.ico\"\nrepository: OpenNHP/opennhp # for github-metadata\n\npermalink: pretty\n\ndefaults:\n  - scope:\n      path: \"docs\" # an empty string here means all files in the project\n      type: \"pages\"\n    values:\n      layout: \"default\"\n\n\n\n# Enable or disable the site search\n# Supports true (default) or false\nsearch_enabled: true\n\nsearch:\n  # Split pages into sections that can be searched individually\n  # Supports 1 - 6, default: 2\n  heading_level: 2\n  # Maximum amount of previews per search result\n  # Default: 3\n  previews: 3\n  # Maximum amount of words to display before a matched word in the preview\n  # Default: 5\n  preview_words_before: 5\n  # Maximum amount of words to display after a matched word in the preview\n  # Default: 10\n  preview_words_after: 10\n  # Set the search token separator\n  # Default: /[\\s\\-/]+/\n  # Example: enable support for hyphenated search words\n  tokenizer_separator: /[\\s/]+/\n  # Display the relative url in search results\n  # Supports true (default) or false\n  rel_url: true\n  # Enable or disable the search button that appears in the bottom right corner of every page\n  # Supports true or false (default)\n  button: false\n  # Focus the search input by pressing `ctrl + focus_shortcut_key` (or `cmd + focus_shortcut_key` on macOS)\n  focus_shortcut_key: 'k'\n\n# For copy button on code\nenable_copy_code_button: true\n\n# Aux links for the upper right navigation\naux_links:\n  \"OpenNHP on GitHub\":\n    - \"//github.com/OpenNHP/opennhp\"\n\n# Makes Aux links open in a new tab. Default is false\naux_links_new_tab: true\n\n# Enable or disable the side/mobile menu globally\n# Nav menu can also be selectively enabled or disabled using page variables or the minimal layout\nnav_enabled: true\n\n# Heading anchor links appear on hover over h1-h6 tags in page content\n# allowing users to deep link to a particular heading on a page.\n#\n# Supports true (default) or false\nheading_anchors: true\n\n# Color scheme supports \"light\" (default) and \"dark\"\ncolor_scheme: light\n\n\n# Exclude from processing.\n# The following items will not be processed, by default.\n# Any item listed under the `exclude:` key here will be automatically added to\n# the internal \"default list\".\n#\n# Excluded items can be processed by explicitly listing the directories or\n# their entries' file path in the `include:` list.\n#\nexclude:\n   - .sass-cache/\n   - .jekyll-cache/\n   - gemfiles/\n   - Gemfile\n   - Gemfile.lock\n   - node_modules/\n   - vendor/bundle/\n   - vendor/cache/\n   - vendor/gems/\n   - vendor/ruby/\n    # specific to the theme website:\n   - bin/\n   - lib/\n   - \"*.gemspec\"\n   - \"*.gem\"\n   - LICENSE.txt\n   - package.json\n   - package-lock.json\n   - Rakefile\n   - README.md\n   - CODE_OF_CONDUCT.md\n   - docker-compose.yml\n   - Dockerfile\n\ncallouts_level: quiet # or loud\ncallouts:\n  highlight:\n    color: yellow\n  important:\n    title: Important\n    color: blue\n  new:\n    title: New\n    color: green\n  note:\n    title: Note\n    color: purple\n  warning:\n    title: Warning\n    color: red\n\n# Footer content\n# appears at the bottom of every page's main content\n\n# Back to top link\nback_to_top: true\nback_to_top_text: \"Back to Top\"\n\nfooter_content: 'Copyright &copy; 2024 OpenNHP Open Source Project.'\n\n# Footer last edited timestamp\nlast_edit_timestamp: true # show or hide edit time - page must have `last_modified_date` defined in the frontmatter\nlast_edit_time_format: \"%b %e %Y at %I:%M %p\" # uses ruby's time format: https://ruby-doc.org/stdlib-2.7.0/libdoc/time/rdoc/Time.html\n\n# Footer \"Edit this page on GitHub\" link text\ngh_edit_link: true # show or hide edit this page link\ngh_edit_link_text: \"Edit this page on GitHub\"\ngh_edit_repository: \"https://github.com/OpenNHP/opennhp\" # the github URL for your repo\ngh_edit_branch: \"main\" # the branch that your docs is served from\ngh_edit_source: docs # the source that your files originate from\ngh_edit_view_mode: \"tree\" # \"tree\" or \"edit\" if you want the user to jump into the editor immediately\n\n# Google Analytics Tracking (optional)\n# Supports a CSV of tracking ID strings (eg. \"UA-1234567-89,G-1AB234CDE5\")\n# Note: the main Just the Docs site does *not* use Google Analytics.\n# ga_tracking: UA-2709176-10,G-5FG1HLH3XQ\n# ga_tracking_anonymize_ip: true # Use GDPR compliant Google Analytics settings (true/nil by default)\n\nkramdown:\n  syntax_highlighter_opts:\n    block:\n      line_numbers: false\n\ncompress_html:\n  clippings: all\n  comments: all\n  endings: all\n  startings: []\n  blanklines: false\n  profile: false\n  # ignore:\n  #   envs: all\n"
  },
  {
    "path": "docs/about.md",
    "content": "---\nlayout: page\ntitle: About\nnav_order: 11\npermalink: /about/\n---\n\n# About OpenNHP Project\n{: .fs-9 }\n\nOpenNHP is developed by a global community of passionate modern security enthusiasts.\n{: .fs-6 .fw-300 }\n\n[中文版](/zh-cn/about/){: .label .fs-4 }\n\n---\n\n\n"
  },
  {
    "path": "docs/agent_sdk.md",
    "content": "---\nlayout: page\ntitle: Client SDKs\nnav_order: 10\npermalink: /agent_sdk/\n---\n\n# Client SDKs\n{: .fs-9 }\n\n[中文版](/zh-cn/agent_sdk/){: .label .fs-4 }\n\n---\n\n\n\n## 1 Client Agent SDK Introduction\n### 1.1 Introduction\nThe OpenNHP Client Agent SDK is a standardized encapsulation of the OpenNHP Agent service. By integrating this SDK, applications can directly call the interface methods it provides to quickly achieve integration with OpenNHP.\nIn different runtime environments, you only need to compile the SDK program into the corresponding system's SDK file format:\n\n| Operating System | Dynamic Library File |\n| ---------------- | -------------------- |\n| Linux            | nhp-agent.so         |\n| Windows          | nhp-agent.dll        |\n| MacOS            | nhp-agent.dylib      |\n| Android          | libnhpagent.so       |\n| IOS              | nhpagent.xcframework |\n\n### 1.2 SDK Development\nOpenNHP provides sample SDK source code. The samples include methods that might be used, such as initializing the agent, starting cyclic knocking, stopping cyclic knocking, single knock, canceling a single knock, adding nhp-server services, setting client user information, and key registration. SDK developers can directly compile the SDK source code samples provided in the OpenNHP project into the corresponding SDK files for direct invocation, or refer to the SDK source code samples to complete custom SDK development.\n\nSDK Sample Source Code: ***opennhp/endpoints/agent/main/export.go***\n\n```go\npackage main\n\n/*\n#include <stdlib.h>\n*/\nimport \"C\"\n\nimport (\n\t\"encoding/base64\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"strings\"\n\t\"unsafe\"\n\n\t\"github.com/OpenNHP/opennhp/endpoints/agent\"\n\t\"github.com/OpenNHP/opennhp/nhp/common\"\n\t\"github.com/OpenNHP/opennhp/nhp/core\"\n)\n\nvar gAgentInstance *agent.UdpAgent\nvar gWorkingDir string\nvar gLogLevel int\n\nfunc deepCopyCString(c_str *C.char) string {\n\tif c_str == nil {\n\t\treturn \"\"\n\t}\n\tgoStr := C.GoString(c_str)\n\treturn strings.Clone(goStr)\n}\n\n// Release the memory of the string buffer generated by NHPSDK.\n//\n//export nhp_free_cstring\nfunc nhp_free_cstring(ptr *C.char) {\n\tC.free(unsafe.Pointer(ptr))\n}\n\n// Initialization of the nhp_agent instance working directory path:\n// The configuration files to be read are located under workingdir/etc/,\n// and log files will be generated under workingdir/logs/.\n//\n// Input:\n// workingDir: the working directory path for the agent\n// logLevel: 0: silent, 1: error, 2: info, 3: debug, 4: verbose\n//\n// Return:\n// Whether agent instance has been initialized successfully.\n//\n//export nhp_agent_init\nfunc nhp_agent_init(workingDir *C.char, logLevel C.int) bool {\n\tif gAgentInstance != nil {\n\t\treturn true\n\t}\n\n\tgAgentInstance = &agent.UdpAgent{}\n\terr := gAgentInstance.Start(deepCopyCString(workingDir), int(logLevel))\n\tif err != nil {\n\t\treturn false\n\t}\n\n\treturn true\n}\n\n// Synchronously stop and release nhp_agent.\n//\n//export nhp_agent_close\nfunc nhp_agent_close() {\n\tif gAgentInstance == nil {\n\t\treturn\n\t}\n\n\tgAgentInstance.Stop()\n\tgAgentInstance = nil\n}\n\n// Read the user information, resource information, server information,\n// and other configuration files written under workingdir/etc,\n// and asynchronously start the loop knocking thread.\n//\n// Input: None\n//\n// Return:\n// -1: Uninitialized error\n// >=0: The number of resources requested to knock by the knocking thread at the time of the call\n//\n//\t(knocking resources will be synchronized with changes in the configuration in workingdir/etc/resource.toml).\n//\n//export nhp_agent_knockloop_start\nfunc nhp_agent_knockloop_start() C.int {\n\tif gAgentInstance == nil {\n\t\treturn -1\n\t}\n\n\tcount := gAgentInstance.StartKnockLoop()\n\treturn C.int(count)\n}\n\n// Synchronously stop the loop, knock-on sub thread.\n//\n//export nhp_agent_knockloop_stop\nfunc nhp_agent_knockloop_stop() {\n\tif gAgentInstance == nil {\n\t\treturn\n\t}\n\n\tgAgentInstance.StopKnockLoop()\n}\n\n// Setting agent's represented user information\n//\n// Input:\n// userId: User identification (optional, but not recommended to be empty)\n// devId: Device identification (optional)\n// orgId: Organization or company identification (optional)\n// userData: Additional fields required to interface with backend services (json format string, optional)\n//\n// Return:\n// Whether the user information is set successfully\n//\n//export nhp_agent_set_knock_user\nfunc nhp_agent_set_knock_user(userId *C.char, devId *C.char, orgId *C.char, userData *C.char) bool {\n\tif gAgentInstance == nil {\n\t\treturn false\n\t}\n\tjsonStr := deepCopyCString(userData)\n\tvar data map[string]any\n\tif len(jsonStr) > 0 {\n\t\terr := json.Unmarshal([]byte(jsonStr), &data)\n\t\tif err != nil {\n\t\t\treturn false\n\t\t}\n\t}\n\n\tgAgentInstance.SetDeviceId(deepCopyCString(devId))\n\tgAgentInstance.SetKnockUser(deepCopyCString(userId), deepCopyCString(orgId), data)\n\treturn true\n}\n\n// Add an NHP server information to the agent for use in knocking on the door\n// (the agent can initiate different knocking requests to multiple NHP servers).\n//\n// Input:\n// pubkey: Public key of the NHP server\n// ip: IP address of the NHP server\n// host: Domain name of the NHP server (if a domain name is set, the ip item is optional)\n// port: Port number for the NHP server to operate (if set to 0, the default port 62206 will be used)\n// expire: Expiration time of the NHP server's public key (in epoch seconds, set to 0 for permanent)\n//\n// Return:\n// Whether the server information has been successfully added.\n//\n//export nhp_agent_add_server\nfunc nhp_agent_add_server(pubkey *C.char, ip *C.char, host *C.char, port C.int, expire int64) bool {\n\tif gAgentInstance == nil {\n\t\treturn false\n\t}\n\n\tif pubkey == nil || (ip == nil && host == nil) {\n\t\treturn false\n\t}\n\n\tserverPort := int(port)\n\tif serverPort == 0 {\n\t\tserverPort = 62206 // use default server listening port\n\t}\n\n\tserverPeer := &core.UdpPeer{\n\t\tType:         core.NHP_SERVER,\n\t\tPubKeyBase64: deepCopyCString(pubkey),\n\t\tIp:           deepCopyCString(ip),\n\t\tPort:         serverPort,\n\t\tHostname:     deepCopyCString(host),\n\t\tExpireTime:   expire,\n\t}\n\tgAgentInstance.AddServer(serverPeer)\n\treturn true\n}\n\n// Delete NHP server information from the agent\n//\n// Input:\n// pubkey: NHP server public key\n//\n//export nhp_agent_remove_server\nfunc nhp_agent_remove_server(pubkey *C.char) {\n\tif gAgentInstance == nil {\n\t\treturn\n\t}\n\tif pubkey == nil {\n\t\treturn\n\t}\n\n\tgAgentInstance.RemoveServer(deepCopyCString(pubkey))\n}\n\n// Please add a resource information for the agent to use for knocking on the door\n// (the agent can initiate a knock-on request for different resources)\n//\n// Input:\n// aspId: Authentication Service Provider Identifier\n// resId: Resource Identifier\n// serverIp: NHP server IP address or domain name (the NHP server managing the resource)\n// serverHostname: NHP server domain name (the NHP server managing the resource)\n// serverPort: NHP server port (the NHP server managing the resource)\n//\n// Return:\n// Whether the resource information has been added successfully\n//\n//export nhp_agent_add_resource\nfunc nhp_agent_add_resource(aspId *C.char, resId *C.char, serverIp *C.char, serverHostname *C.char, serverPort C.int) bool {\n\tif gAgentInstance == nil {\n\t\treturn false\n\t}\n\n\tif aspId == nil || resId == nil || (serverIp == nil && serverHostname == nil) {\n\t\treturn false\n\t}\n\n\tresource := &agent.KnockResource{\n\t\tAuthServiceId:  deepCopyCString(aspId),\n\t\tResourceId:     deepCopyCString(resId),\n\t\tServerIp:       deepCopyCString(serverIp),\n\t\tServerHostname: deepCopyCString(serverHostname),\n\t\tServerPort:     int(serverPort),\n\t}\n\terr := gAgentInstance.AddResource(resource)\n\treturn err == nil\n}\n\n// Delete resource information from the agent\n//\n// Input:\n// aspId: Authentication Service Provider Identifier\n// resId: Resource Identifier\n//\n//export nhp_agent_remove_resource\nfunc nhp_agent_remove_resource(aspId *C.char, resId *C.char) {\n\tif gAgentInstance == nil {\n\t\treturn\n\t}\n\n\tif aspId == nil || resId == nil {\n\t\treturn\n\t}\n\n\tgAgentInstance.RemoveResource(deepCopyCString(aspId), deepCopyCString(resId))\n}\n\n// The agent initiates a single knock on the door request to the server hosting the resource\n//\n// Input:\n// aspId: Authentication service provider identifier\n// resId: Resource identifier\n// serverIp: NHP server IP address or domain name (the NHP server managing the resource)\n// serverHostname: NHP server domain name (the NHP server managing the resource)\n// serverPort: NHP server port (the NHP server managing the resource)\n//\n// Returns:\n// The server's response message (json format string buffer pointer):\n// \"errCode\": Error code (string, \"0\" indicates success)\n// \"errMsg\": Error message (string)\n// \"resHost\": Resource server address (\"resHost\": {\"Server Name 1\":\"Server Hostname 1\", \"Server Name 2\":\"Server Hostname 2\", ...})\n// \"opnTime\": Door opening duration (integer, in seconds)\n// \"aspToken\": Token generated after authentication by the ASP (optional)\n// \"agentAddr\": Agent's IP address from the perspective of the NHP server\n// \"preActs\": Pre-connection information related to the resource (optional)\n// \"redirectUrl\": HTTP redirection link (optional)\n//\n// It is necessary to call nhp_agent_add_server before calling,\n// to add the NHP server's public key, address, and other information to the agent\n// The caller is responsible for calling nhp_free_cstring to release the returned char* pointer\n//\n//export nhp_agent_knock_resource\nfunc nhp_agent_knock_resource(aspId *C.char, resId *C.char, serverIp *C.char, serverHostname *C.char, serverPort C.int) *C.char {\n\tackMsg := &common.ServerKnockAckMsg{}\n\n\tfunc() {\n\t\tif gAgentInstance == nil {\n\t\t\tackMsg.ErrCode = common.ErrNoAgentInstance.ErrorCode()\n\t\t\tackMsg.ErrMsg = common.ErrNoAgentInstance.Error()\n\t\t\treturn\n\t\t}\n\n\t\tif aspId == nil || resId == nil || (serverIp == nil && serverHostname == nil) {\n\t\t\tackMsg.ErrCode = common.ErrInvalidInput.ErrorCode()\n\t\t\tackMsg.ErrMsg = common.ErrInvalidInput.Error()\n\t\t\treturn\n\t\t}\n\n\t\tresource := &agent.KnockResource{\n\t\t\tAuthServiceId:  deepCopyCString(aspId),\n\t\t\tResourceId:     deepCopyCString(resId),\n\t\t\tServerIp:       deepCopyCString(serverIp),\n\t\t\tServerHostname: deepCopyCString(serverHostname),\n\t\t\tServerPort:     int(serverPort),\n\t\t}\n\n\t\tpeer := gAgentInstance.FindServerPeerFromResource(resource)\n\t\tif peer == nil {\n\t\t\tackMsg.ErrCode = common.ErrKnockServerNotFound.ErrorCode()\n\t\t\tackMsg.ErrMsg = common.ErrKnockServerNotFound.Error()\n\t\t\treturn\n\t\t}\n\n\t\ttarget := &agent.KnockTarget{\n\t\t\tKnockResource: *resource,\n\t\t\tServerPeer:    peer,\n\t\t}\n\n\t\tackMsg, _ = gAgentInstance.Knock(target)\n\t}()\n\n\tbytes, _ := json.Marshal(ackMsg)\n\tret := C.CString(string(bytes))\n\n\treturn ret\n}\n\n// The agent explicitly informs the NHP server to exit its access permission to the resource.\n//\n// Input:\n// aspId: Authentication Service Provider Identifier\n// resId: Resource Identifier\n// serverIp: NHP server IP address or domain name (the NHP server managing the resource)\n// serverHostname: NHP server domain name (the NHP server managing the resource)\n// serverPort: NHP server port (the NHP server managing the resource)\n//\n// Return:\n// Whether the exit was successful\n//\n// It is necessary to call nhp_agent_add_server before calling, to add the NHP server's public key, address, and other information to the agent.\n//\n//export nhp_agent_exit_resource\nfunc nhp_agent_exit_resource(aspId *C.char, resId *C.char, serverIp *C.char, serverHostname *C.char, serverPort C.int) bool {\n\tvar err error\n\tackMsg := &common.ServerKnockAckMsg{}\n\n\tfunc() {\n\t\tif gAgentInstance == nil {\n\t\t\tackMsg.ErrCode = common.ErrNoAgentInstance.ErrorCode()\n\t\t\tackMsg.ErrMsg = common.ErrNoAgentInstance.Error()\n\t\t\terr = common.ErrNoAgentInstance\n\t\t\treturn\n\t\t}\n\n\t\tif aspId == nil || resId == nil || (serverIp == nil && serverHostname == nil) {\n\t\t\tackMsg.ErrCode = common.ErrInvalidInput.ErrorCode()\n\t\t\tackMsg.ErrMsg = common.ErrInvalidInput.Error()\n\t\t\terr = common.ErrInvalidInput\n\t\t\treturn\n\t\t}\n\n\t\tresource := &agent.KnockResource{\n\t\t\tAuthServiceId:  deepCopyCString(aspId),\n\t\t\tResourceId:     deepCopyCString(resId),\n\t\t\tServerIp:       deepCopyCString(serverIp),\n\t\t\tServerHostname: deepCopyCString(serverHostname),\n\t\t\tServerPort:     int(serverPort),\n\t\t}\n\n\t\tpeer := gAgentInstance.FindServerPeerFromResource(resource)\n\t\tif peer == nil {\n\t\t\tackMsg.ErrCode = common.ErrKnockServerNotFound.ErrorCode()\n\t\t\tackMsg.ErrMsg = common.ErrKnockServerNotFound.Error()\n\t\t\terr = common.ErrKnockServerNotFound\n\t\t\treturn\n\t\t}\n\n\t\ttarget := &agent.KnockTarget{\n\t\t\tKnockResource: *resource,\n\t\t\tServerPeer:    peer,\n\t\t}\n\n\t\tackMsg, err = gAgentInstance.ExitKnockRequest(target)\n\t}()\n\n\treturn err == nil\n}\n\n// cipherType: 0-curve25519; 1-sm2\n// result: \"privatekey\"|\"publickey\"\n// caller is responsible to free the returned char* pointer\n//\n//export nhp_generate_keys\nfunc nhp_generate_keys(cipherType C.int) *C.char {\n\tvar e core.Ecdh\n\tswitch core.EccTypeEnum(cipherType) {\n\tcase core.ECC_SM2:\n\t\te = core.NewECDH(core.ECC_SM2)\n\tcase core.ECC_CURVE25519:\n\t\tfallthrough\n\tdefault:\n\t\te = core.NewECDH(core.ECC_CURVE25519)\n\t}\n\tpub := e.PublicKeyBase64()\n\tpriv := e.PrivateKeyBase64()\n\n\tres := fmt.Sprintf(\"%s|%s\", priv, pub)\n\tpRes := C.CString(res)\n\n\treturn pRes\n}\n\n// cipherType: 0-curve25519; 1-sm2\n// privateBase64: private key in base64 format\n// result: \"publickey\"\n// caller is responsible to free the returned char* pointer\n//\n//export nhp_privkey_to_pubkey\nfunc nhp_privkey_to_pubkey(cipherType C.int, privateBase64 *C.char) *C.char {\n\tprivKey := deepCopyCString(privateBase64)\n\tprivKeyBytes, err := base64.StdEncoding.DecodeString(privKey)\n\tif err != nil {\n\t\treturn nil\n\t}\n\n\te := core.ECDHFromKey(core.EccTypeEnum(cipherType), privKeyBytes)\n\tif e == nil {\n\t\treturn nil\n\t}\n\tpub := e.PublicKeyBase64()\n\tpPub := C.CString(pub)\n\n\treturn pPub\n}\n```\n\n## 2 Client Agent SDK Adaptation\n\n### 2.1 Desktop SDK\n\n#### 2.1.1 Windows\n\n##### 2.1.1.1 Environment Preparation\n\nSet up the compilation environment for Windows by referring to the Windows section in the ***System requirement*** chapter of **Build OpenNHP Source Code**.\n\n##### 2.1.1.2 Compiling the SDK\n\n- **Method 1**：Run the *BAT* file in the code root directory\n  `build.bat`<br>\n  <small>*（Note: If an error occurs during the compilation process under windows, try this compilation method: In the Visual Studio developer command prompt for VS command window, switch to the project directory and execute the `./build.bat `command）*</small>\n\n- Method 2: Command to compile the .dll file for the SDK separately:\n\n  Navigate to the `opennhp/endpoints/agent/main/` directory and execute:\n\n  `go build -trimpath -buildmode=c-shared -ldflags '-s -w' -v -o nhp-agent.dll main.go export.go`\n\n  <small>*(Note: Because export.go does not contain a main method, main.go is included in the build command. For custom SDK code files that include a main method, the build command only needs the SDK code file and does not need to include main.go.)*</small>\n\n##### 2.1.1.3 SDK Adaptation\n\n- **java**\n\n  Java programs can call SDK methods using JNA:\n\n    - OpennhpLibrary interface loads the OpenNHP agent SDK\n\n      ```java\n      package org.example;\n          \n      import com.sun.jna.Library;\n      import com.sun.jna.Native;\n      \n      /**\n       * OpenNHP agent sdk interface\n       *\n       * @author haochangjiu\n       * @version JDK 8\n       * @className OpennhpLibrary\n       * @date 2025/10/27\n       */\n      public interface OpennhpLibrary extends Library {\n          // load OpenNHP agent sdk\n          OpennhpLibrary INSTANCE = Native.load(\"nhp-agent\", OpennhpLibrary.class);\n      \n          /**\n           * @description Initialization of the nhp_agent instance working directory path:\n           *              The configuration files to be read are located under workingdir/etc/,\n           *              and log files will be generated under workingdir/logs/.\n           * @param workingDir: the working directory path for the agent\n           * @param logLevel:   0: silent, 1: error, 2: info, 3: debug, 4: verbose\n           *                    return boolean Whether agent instance has been initialized successfully.\n           * @return boolean\n           * @author haochangjiu\n           * @date 2025/10/27\n           * {@link boolean}\n           */\n          boolean nhp_agent_init(String workingDir, int logLevel);\n      \n          /**\n           * @description Synchronously stop and release nhp_agent.\n           * @author haochangjiu\n           * @date 2025/10/27\n           */\n          void nhp_agent_close();\n          /**\n           * @description Read the user information, resource information, server information,\n           *              and other configuration files written under workingdir/etc,\n           *              and asynchronously start the loop knocking thread.\n           * @return int\n           * @author haochangjiu\n           * @date 2025/10/27\n           * {@link int}\n           */\n          int nhp_agent_knockloop_start();\n      \n          /**\n           * @description Synchronously stop the loop, knock-on sub thread\n           * @author hangchangjiu\n           * @date 2025/10/27\n           */\n          void nhp_agent_knockloop_stop();\n      }\n      ```\n    - Application main entry, calling the SDK\n\n      ```java\n      package org.example;\n          \n      import java.util.Scanner;\n      \n      /**\n       * Application for calling the OpenNHP agent SDK\n       *\n       * @author haochangjiu\n       * @version JDK 8\n       * @className App\n       * @date 2025/10/27\n       */\n      public class App {\n          public static void main(String[] args) throws Exception {\n              //        Initialize and start the OpenNHP agent SDK service\n              boolean initFlag = OpennhpLibrary.INSTANCE.nhp_agent_init(\"D:\\\\console-workspace\\\\opennhp-knock\", 3);\n              if (!initFlag) {\n                  System.out.println(\"NHP Agent init failed\");\n                  System.exit(0);\n              }\n              //        Invoke methods in the OpenNHP agent SDK via input commands\n              Scanner scanner = new Scanner(System.in);\n      \n              while (true) {\n                  System.out.print(\"> \");\n                  if (scanner.hasNextLine()) {\n                      String input = scanner.nextLine().trim();\n                      if (\"knock\".equalsIgnoreCase(input)) {\n                          System.out.println(\"start the loop knocking thread...\");\n                          OpennhpLibrary.INSTANCE.nhp_agent_knockloop_start();\n                      } else if (\"cancel\".equalsIgnoreCase(input)) {\n                          System.out.println(\"stop the loop knocking thread...\");\n                          OpennhpLibrary.INSTANCE.nhp_agent_knockloop_stop();\n                      } else if (\"exit\".equalsIgnoreCase(input)) {\n                          System.out.println(\"exit nhp agent service...\");\n                          OpennhpLibrary.INSTANCE.nhp_agent_close();\n                          break;\n                      } else {\n                          System.out.println(\"invalid input\");\n                      }\n                  }\n              }\n              scanner.close();\n          }\n      }\n      ```\n\n- **c/c++**\n\n  C/C++ programs can refer to the sample SDK calling program in the project opennhp/endpoints/agent/sdkdemo/nhp-agent-demo.c to integrate the client agent SDK.\n\n  ```c\n  #include <stdio.h>\n  #include <unistd.h>\n  #include \"nhp-agent.h\"\n  \n  int main() {\n      // Initialize nhp_agent, only one nhp_agent singleton is allowed per process.\n      nhp_agent_init(\".\", 3);\n  \n      // Set the user information for the knock-on-the-door feature.\n      nhp_agent_set_knock_user(\"zengl\", NULL, NULL, NULL);\n  \n      // Set NHP server information\n      // If there is already a configuration file for the server, the call to nhp_agent_add_server can be omitted\n      // Timestamp date is visible at https://unixtime.org/\n      nhp_agent_add_server(\"replace_with_actual_publickeybase64\", \"192.168.1.66\", NULL, 62206, 1748908471);\n  \n      // Send a request to the server to access the resource example/demo, and return information in the form of a JSON format string\n      // Note: The resource information here is an independent input, and is unrelated to the resource information saved in the configuration file\n      char *ret = nhp_agent_knock_resource(\"example\", \"demo\", \"192.168.1.66\", NULL, 62206);\n      printf(\"knock return: %s\\n\", ret);\n  \n      // Immediately close the agent's access to the example/demo resources,\n      // if not invoked, access permission will automatically close after the door opening duration has passed.\n      nhp_agent_exit_resource(\"example\", \"demo\", \"192.168.1.66\", NULL, 62206);\n  \n      // Turn off and release nhp_agent.\n      nhp_agent_close();\n      return 0;\n  }\n  ```\n\n\n\n- **python**\n\n  Use Python's standard ctypes library to integrate the SDK.\n\n  ```python\n  import ctypes\n  from time import sleep\n  \n  # Windows\n  nhp_agent = ctypes.CDLL('nhp-agent.dll')\n  # Linux\n  # mylib = ctypes.CDLL('./nhp-agent.so')\n  # macOS\n  # mylib = ctypes.CDLL('./nhp-agent.dylib')\n  \n  nhp_agent.nhp_agent_init.argtypes = [ctypes.c_char_p, ctypes.c_int]\n  nhp_agent.nhp_agent_init.restype = ctypes.c_bool\n  \n  nhp_agent.nhp_agent_init.restype = ctypes.c_int\n  \n  \n  \n  if __name__ == '__main__':\n      flag = nhp_agent.nhp_agent_init(ctypes.c_char_p(b\"D:\\\\nhpagent\"),3)\n      if flag:\n          print(\"nhp-agent init success\")\n      else:\n          print(\"nhp-agent init failed\")\n      # start the loop knocking thread\n      status = nhp_agent.nhp_agent_knockloop_start()\n      if status >= 0:\n          print(\"nhp-agent knockloop success\")\n          # Delay between calls\n          sleep(30)\n      else:\n          print(\"nhp-agent knockloop failed\")\n  \n      # stop nhp_agent\n      nhp_agent.nhp_agent_close()\n  ```\n\n- **Other Languages**\n\n  Other development languages (C#, Rust, Go, Nodejs) can adapt the SDK according to their unique methods for calling SDK files. Among them, Go can also introduce the source code of the agent part from OpenNHP to adapt to OpenNHP without developing an SDK.\n\n#### 2.1.2 Linux\n\n##### 2.1.2.1 Environment Preparation\n\nSet up the compilation environment for Linux by referring to the Linux section in the ***System requirement*** chapter of **Build OpenNHP Source Code**.\n\n##### 2.1.2.2 Compiling the SDK\n\n- Method 1: Run the script in the project root directory.\n  `make`\n\n- Method 2: Command to compile the .so file for the SDK separately:\n\n  Navigate to the `opennhp/endpoints/agent/main/` directory and execute:\n\n  `go build -trimpath -buildmode=c-shared -ldflags '-s -w' -v -o nhp-agent.so main.go export.go`\n\n  <small>*(Note: Because export.go does not contain a main method, main.go is included in the build command. For custom SDK code files that include a main method, the build command only needs the SDK code file and does not need to include main.go.)*</small>\n\n##### 2.1.2.3 SDK Adaptation\n\nThe SDK adaptation on Linux is the same as on Windows. Refer to section 2.1.1.3 for the code.\n\n<small>*(Note: Ensure the program can normally load the SDK's .so file.)*</small>\n\n#### 2.1.3 MacOS\n\n##### 2.1.3.1 Environment Preparation\n\nSet up the compilation environment for MacOS by referring to the MacOS section in the ***System requirement*** chapter of **Build OpenNHP Source Code**.\n\n##### 2.1.3.2 Compiling the SDK\n\n- Method 1: Run the script in the project root directory.\n  `make`\n\n- Method 2: Command to compile the .dylib file for the SDK separately:\n\n  Navigate to the `opennhp/endpoints/agent/main/` directory and execute the build command:\n\n  `GOOS=darwin GOARCH=arm64 CGO_ENABLED=1 go build -buildmode=c-shared -o nhp-agent.dylib main.go export.go`\n\n  <small>*(Note: Because export.go does not contain a main method, main.go is included in the build command. For custom SDK code files that include a main method, the build command only needs the SDK code file and does not need to include main.go.)*</small>\n\n##### 2.1.3.3 SDK Adaptation\nThe SDK adaptation on MacOS is the same as on Windows. Refer to section 2.1.1.3 for the code.\n\n<small>*(Note: Ensure the program can normally load the SDK's .dylib file.)*</small>\n\n### 2.2 Mobile SDK\n\n#### 2.2.1 Android\n\n##### 2.2.1.1 Environment Preparation\n\n- Compile the Android client agent SDK on Linux. Set up the compilation environment by referring to the Linux section in the ***System requirement*** chapter of **Build OpenNHP Source Code**.\n\n- Android NDK Environment:\n\n    - Download and install Android NDK.\n\n      `wget https://dl.google.com/android/repository/android-ndk-r25b-linux.zip\n      unzip android-ndk-r25b-linux.zip`\n\n    - Set environment variables.\n\n        - Edit the bashrc file.\n\n          `vim ~/.bashrc`\n\n        - Add environment variables.\n\n          ```sh\n          # Set NDK path (according to your actual installation path)\n          export ANDROID_NDK_HOME=/opt/android-ndk-r25b/\n          export TOOLCHAIN=$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64\n          ```\n\n        - Make the configuration effective.\n\n  `source ~/.bashrc`\n\n##### 2.2.1.2 Compiling the SDK\n\n- Method 1: Run the script in the project root directory.\n  `make`\n\n  <small>*(Note: The Android NDK must be installed, otherwise the Android SDK will fail to compile.)*</small>\n  \n- Method 2: Command to compile the .so file for the SDK separately:\n\n  Navigate to the `opennhp/endpoints/agent/main/` directory and execute the build command:\n\n  `GOOS=android GOARCH=arm64 CGO_ENABLED=1 CC=$TOOLCHAIN/bin/aarch64-linux-android21-clang CXX=$TOOLCHAIN/bin/aarch64-linux-android21-clang++ go build -buildmode=c-shared -o libnhpagent.so main.go export.go`\n\n  <small>*(Note: When an Android project loads .so files via JNA, it adds 'lib' to the front of the input .so file name. When compiling the SDK, the name should start with 'lib', e.g., libnhpagent.so.)*</small>\n\n##### 2.2.1.3 SDK Adaptation\n\n- **Android Configuration (Applicable for both Kotlin and Java)**:\n\n    - 1.Add the following configuration in build.gradle (app):\n\n      Add under the `android` section:\n\n      ```json\n      sourceSets {\n          main {\n              jniLibs.srcDirs = ['src/main/jniLibs', 'libs']\n          }\n      }\n      ```\n\n      Add the following dependencies under the `dependencies` section:\n\n      // Note: It is recommended for Android to use an adapted JNA version, e.g., 5.13.0 or higher.`implementation 'net.java.dev.jna:jna:5.13.0@aar'`\n\n      // Permission request framework: https://github.com/getActivity/XXPermissions\n      `implementation libs.xxpermissions`\n\n      In the libs.versions.toml file:\n      Under `[versions]`, add:\n      `xxpermissions = \"18.6\"`\n      Under `[libraries]`, add:\n      `xxpermissions = { module = \"com.github.getActivity:XXPermissions\", version.ref = \"xxpermissions\" }`\n\n    - 2.Add file storage read and write permissions in the AndroidManifest.xml file:\n\n      ```xml\n      <uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\" />\n      <uses-permission android:name=\"android.permission.READ_MEDIA_IMAGES\" />\n      <uses-permission android:name=\"android.permission.READ_MEDIA_VIDEO\" />\n      <uses-permission android:name=\"android.permission.READ_MEDIA_AUDIO\" />\n      ```\n\n- **Kotlin**\n\n  Kotlin Sample Code for Android Application SDK Adaptation\n\n  ```kotlin\n  package com.example.androidtestsoapp\n  \n  import android.os.Bundle\n  import android.os.Environment\n  import android.util.Log\n  import androidx.activity.ComponentActivity\n  import androidx.activity.compose.setContent\n  import androidx.activity.enableEdgeToEdge\n  import androidx.compose.foundation.layout.fillMaxSize\n  import androidx.compose.foundation.layout.padding\n  import androidx.compose.material3.Scaffold\n  import androidx.compose.material3.Text\n  import androidx.compose.runtime.Composable\n  import androidx.compose.ui.Modifier\n  import androidx.compose.ui.tooling.preview.Preview\n  import com.example.androidtestsoapp.ui.theme.AndroidTestSoAppTheme\n  import com.hjq.permissions.Permission\n  import com.hjq.permissions.XXPermissions\n  import java.io.File\n  \n  class MainActivity : ComponentActivity() {\n      override fun onCreate(savedInstanceState: Bundle?) {\n          super.onCreate(savedInstanceState)\n          enableEdgeToEdge()\n          setContent {\n              AndroidTestSoAppTheme {\n                  Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding ->\n                      Greeting(\n                          name = \"Android\",\n                          modifier = Modifier.padding(innerPadding)\n                      )\n                  }\n              }\n          }\n          // Request permissions - read/write\n          XXPermissions.with(this)\n              .permission(Permission.WRITE_EXTERNAL_STORAGE)\n              .permission(Permission.READ_MEDIA_IMAGES)\n              .permission(Permission.READ_MEDIA_VIDEO)\n              .permission(Permission.READ_MEDIA_AUDIO)\n              .request { permissions, allGranted ->\n                  if (allGranted) {\n                      Log.d(\"MainActivity\", \"Permissions granted\")\n                      performFileOperations()\n                  } else {\n                      Log.d(\"MainActivity\", \"Permissions not granted\")\n                  }\n              }\n      }\n  }\n  \n  /**\n   * Need to place the nhp folder containing the etc folder in the phone's download folder\n   * After reading the phone storage download directory, call OpennhpLibrary\n   */\n  private fun performFileOperations() {\n      // Read phone storage download directory\n      val appDir = Environment.getExternalStorageDirectory().toString() + File.separator + \"download\"\n      // Check if zero folder exists in download\n      val file = File(appDir)\n      if (!file.exists()) {\n          Log.d(\"MainActivity\", \"Download folder does not exist\")\n          return\n      }\n      Log.d(\"MainActivity\", \"Download folder exists\")\n      val appDir1 = Environment.getExternalStorageDirectory().toString() + File.separator + \"download\" + File.separator + \"nhp\"\n      // Check if nhp folder exists in download\n      val file1 = File(appDir1)\n      if (!file1.exists()) {\n          Log.d(\"MainActivity\", \"nhp folder does not exist\")\n          return\n      }\n      val appDir2 = Environment.getExternalStorageDirectory().toString() + File.separator + \"download\" + File.separator + \"nhp\"+ File.separator + \"etc\"\n      // Check if etc folder exists in download\n      val file2 = File(appDir2)\n      if (!file2.exists()) {\n          Log.d(\"MainActivity\", \"Etc folder does not exist\")\n          return\n      }\n  \n      val initFlag = OpennhpLibrary.INSTANCE.nhp_agent_init(appDir1, 2)\n      if (!initFlag) {\n          println(\"NHP Agent init failed\")\n          return\n      }\n      println(\"start the loop knocking thread...\")\n      val flag:Int = OpennhpLibrary.INSTANCE.nhp_agent_knockloop_start()\n      // Print result\n      if (flag > 0) {\n          println(\"NHP Agent knockloop start success\")\n      } else {\n          println(\"NHP Agent knockloop start failed\")\n      }\n  }\n  \n  @Composable\n  fun Greeting(name: String, modifier: Modifier = Modifier) {\n      Text(\n          text = \"Hello $name!\",\n          modifier = modifier\n      )\n  }\n  \n  @Preview(showBackground = true)\n  @Composable\n  fun GreetingPreview() {\n      AndroidTestSoAppTheme {\n          Greeting(\"Android\")\n      }\n  }\n  ```\n\n\n\n- **java**\n\n    - Create the OpennhpLibrary interface to load the OpenNHP agent SDK.\n\n      <small>*(Note: When introducing .so files in an Android project, 'lib' is added before the dynamic library file name. That is, the SDK name loaded in the code is 'nhpagent', but the actual SDK loaded by the program is the 'libnhpagent.so' file.)*</small>\n\n      ```java\n      package org.example;\n      \n      import com.sun.jna.Library;\n      import com.sun.jna.Native;\n      \n      /**\n       * OpenNHP agent sdk interface\n       *\n       * @author haochangjiu\n       * @version JDK 8\n       * @className OpennhpLibrary\n       * @date 2025/10/27\n       */\n      public interface OpennhpLibrary extends Library {\n          // load OpenNHP agent sdk\n          OpennhpLibrary INSTANCE = Native.load(\"nhpagent\", OpennhpLibrary.class);\n      \n          /**\n           * @description Initialization of the nhp_agent instance working directory path:\n           *              The configuration files to be read are located under workingdir/etc/,\n           *              and log files will be generated under workingdir/logs/.\n           * @param workingDir: the working directory path for the agent\n           * @param logLevel:   0: silent, 1: error, 2: info, 3: debug, 4: verbose\n           *                    return boolean Whether agent instance has been initialized successfully.\n           * @return boolean\n           * @author haochangjiu\n           * @date 2025/10/27\n           * {@link boolean}\n           */\n          boolean nhp_agent_init(String workingDir, int logLevel);\n      \n          /**\n           * @description Synchronously stop and release nhp_agent.\n           * @author haochangjiu\n           * @date 2025/10/27\n           */\n          void nhp_agent_close();\n          /**\n           * @description Read the user information, resource information, server information,\n           *              and other configuration files written under workingdir/etc,\n           *              and asynchronously start the loop knocking thread.\n           * @return int\n           * @author haochangjiu\n           * @date 2025/10/27\n           * {@link int}\n           */\n          int nhp_agent_knockloop_start();\n      \n          /**\n           * @description Synchronously stop the loop, knock-on sub thread\n           * @author hangchangjiu\n           * @date 2025/10/27\n           */\n          void nhp_agent_knockloop_stop();\n      }\n      ```\n    - Calling the SDK: In the sample, the configuration file etc folder is placed in the nhp directory under the phone's download directory.\n\n      ```java\n      package org.example;\n      \n      import android.os.Bundle;\n      import android.os.Environment;\n      import android.util.Log;\n      import androidx.appcompat.app.AppCompatActivity;\n      \n      \n      import com.OpennhpLibrary;\n      import com.fancy.zerotrust.R;\n      \n      import java.io.File;\n      \n      public class MainActivity extends AppCompatActivity {\n      \n          @Override\n          protected void onCreate(Bundle savedInstanceState) {\n              super.onCreate(savedInstanceState);\n              // Read the phone's storage download directory.\n              String appDir = Environment.getExternalStorageDirectory() + File.separator + \"download\";\n              // Does the nhp directory exist in the downloads\n              File file = new File(appDir);\n              if (!file.exists()) {\n                  Log.d(\"MainActivity\",\"download file not exist！\");\n                  return;\n              }\n              Log.d(\"MainActivity\",\"download file exist！\");\n              String appDir1 = Environment.getExternalStorageDirectory() + File.separator + \"download\"+ File.separator + \"nhp\";\n              boolean initFlag = OpennhpLibrary.INSTANCE.nhp_agent_init(appDir1, 3);\n              if (!initFlag) {\n                  System.out.println(\"NHP Agent init failed\");\n                  System.exit(0);\n              }\n              System.out.println(\"start the loop knocking thread...\");\n              OpennhpLibrary.INSTANCE.nhp_agent_knockloop_start();\n          }\n      }\n      ```\n\n\n\n#### 2.2.2 IOS\n\n##### 2.2.2.1 Environment Preparation\n\n- Compile the IOS client agent SDK on MacOS. Set up the compilation environment by referring to the MacOS section in the ***System requirement*** chapter of **Build OpenNHP Source Code**.\n\n- Ensure Xcode is installed. If not, install it from the App Store.\n\n- Install gomobile:\n\n    - Install\n\n      `go install golang.org/x/mobile/cmd/gomobile@latest`\n\n    - Initialize\n\n      `gomobile init`\n\n##### 2.2.2.2 SDK Sample\n\nWhen compiling the .xcframework file required for IOS, the names of the exported methods must start with a capital letter, and the parameter types must be standard Go language types, not C.int and C.char. Another important point is that the code cannot be under package main. Move the program to a newly created iossdk directory.\n\nModified code based on the export.go file in OpenNHP is as follows: ***opennhp/endpoints/agent/iossdk/export.go***\n\n```go\npackage iossdk\n\nimport \"C\"\nimport (\n\t\"encoding/base64\"\n\t\"encoding/json\"\n\t\"fmt\"\n\n\t\"github.com/OpenNHP/opennhp/endpoints/agent\"\n\t\"github.com/OpenNHP/opennhp/nhp/common\"\n\t\"github.com/OpenNHP/opennhp/nhp/core\"\n\t_ \"golang.org/x/mobile/bind\"\n)\n\nvar gAgentInstance *agent.UdpAgent\nvar gWorkingDir string\nvar gLogLevel int\n\n// Initialization of the nhp_agent instance working directory path:\n// The configuration files to be read are located under workingdir/etc/,\n// and log files will be generated under workingdir/logs/.\n//\n// Input:\n// workingDir: the working directory path for the agent\n// logLevel: 0: silent, 1: error, 2: info, 3: debug, 4: verbose\n//\n// Return:\n// Whether agent instance has been initialized successfully.\nfunc NhpAgentInit(workingDir string, logLevel int) bool {\n\tif gAgentInstance != nil {\n\t\treturn true\n\t}\n\n\tgAgentInstance = &agent.UdpAgent{}\n\terr := gAgentInstance.Start(workingDir, logLevel)\n\tif err != nil {\n\t\treturn false\n\t}\n\n\treturn true\n}\n\n// Synchronously stop and release nhp_\nfunc NhpAgentClose() {\n\tif gAgentInstance == nil {\n\t\treturn\n\t}\n\n\tgAgentInstance.Stop()\n\tgAgentInstance = nil\n}\n\n// Read the user information, resource information, server information,\n// and other configuration files written under workingdir/etc,\n// and asynchronously start the loop knocking thread.\n//\n// Input: None\n//\n// Return:\n// -1: Uninitialized error\n// >=0: The number of resources requested to knock by the knocking thread at the time of the call\n//\n//\t(knocking resources will be synchronized with changes in the configuration in workingdir/etc/resource.toml).\n//\n//export NhpAgentKnockloopStart\nfunc NhpAgentKnockloopStart() int {\n\tif gAgentInstance == nil {\n\t\treturn -1\n\t}\n\n\tcount := gAgentInstance.StartKnockLoop()\n\treturn count\n}\n\n// Synchronously stop the loop, knock-on sub thread.\nfunc NhpAgentKnockloopStop() {\n\tif gAgentInstance == nil {\n\t\treturn\n\t}\n\n\tgAgentInstance.StopKnockLoop()\n}\n\n// Setting agent's represented user information\n//\n// Input:\n// userId: User identification (optional, but not recommended to be empty)\n// devId: Device identification (optional)\n// orgId: Organization or company identification (optional)\n// userData: Additional fields required to interface with backend services (json format string, optional)\n//\n// Return:\n// Whether the user information is set successfully\nfunc NhpAgentSetKnockUser(userId string, devId string, orgId string, userData string) bool {\n\tif gAgentInstance == nil {\n\t\treturn false\n\t}\n\tvar data map[string]any\n\tif len(userData) > 0 {\n\t\terr := json.Unmarshal([]byte(userData), &data)\n\t\tif err != nil {\n\t\t\treturn false\n\t\t}\n\t}\n\n\tgAgentInstance.SetDeviceId(devId)\n\tgAgentInstance.SetKnockUser(userId, orgId, data)\n\treturn true\n}\n\n// Add an NHP server information to the agent for use in knocking on the door\n// (the agent can initiate different knocking requests to multiple NHP servers).\n//\n// Input:\n// pubkey: Public key of the NHP server\n// ip: IP address of the NHP server\n// host: Domain name of the NHP server (if a domain name is set, the ip item is optional)\n// port: Port number for the NHP server to operate (if set to 0, the default port 62206 will be used)\n// expire: Expiration time of the NHP server's public key (in epoch seconds, set to 0 for permanent)\n//\n// Return:\n// Whether the server information has been successfully added.\nfunc NhpAgentAddServer(pubkey string, ip string, host string, port int, expire int64) bool {\n\tif gAgentInstance == nil {\n\t\treturn false\n\t}\n\n\tif len(pubkey) == 0 || (len(ip) == 0 && len(host) == 0) {\n\t\treturn false\n\t}\n\n\tserverPort := int(port)\n\tif serverPort == 0 {\n\t\tserverPort = 62206 // use default server listening port\n\t}\n\n\tserverPeer := &core.UdpPeer{\n\t\tType:         core.NHP_SERVER,\n\t\tPubKeyBase64: pubkey,\n\t\tIp:           ip,\n\t\tPort:         serverPort,\n\t\tHostname:     host,\n\t\tExpireTime:   expire,\n\t}\n\tgAgentInstance.AddServer(serverPeer)\n\treturn true\n}\n\n// Delete NHP server information from the agent\n//\n// Input:\n// pubkey: NHP server public key\nfunc NhpAgentRemoveServer(pubkey string) {\n\tif gAgentInstance == nil {\n\t\treturn\n\t}\n\tif len(pubkey) == 0 {\n\t\treturn\n\t}\n\n\tgAgentInstance.RemoveServer(pubkey)\n}\n\n// Please add a resource information for the agent to use for knocking on the door\n// (the agent can initiate a knock-on request for different resources)\n//\n// Input:\n// aspId: Authentication Service Provider Identifier\n// resId: Resource Identifier\n// serverIp: NHP server IP address or domain name (the NHP server managing the resource)\n// serverHostname: NHP server domain name (the NHP server managing the resource)\n// serverPort: NHP server port (the NHP server managing the resource)\n//\n// Return:\n// Whether the resource information has been added successfully\nfunc NhpAgentAddResource(aspId string, resId string, serverIp string, serverHostname string, serverPort int) bool {\n\tif gAgentInstance == nil {\n\t\treturn false\n\t}\n\n\tif len(aspId) == 0 || len(resId) == 0 || (len(serverIp) == 0 && len(serverHostname) == 0) {\n\t\treturn false\n\t}\n\n\tresource := &agent.KnockResource{\n\t\tAuthServiceId:  aspId,\n\t\tResourceId:     resId,\n\t\tServerIp:       serverIp,\n\t\tServerHostname: serverHostname,\n\t\tServerPort:     serverPort,\n\t}\n\terr := gAgentInstance.AddResource(resource)\n\treturn err == nil\n}\n\n// Delete resource information from the agent\n//\n// Input:\n// aspId: Authentication Service Provider Identifier\n// resId: Resource Identifier\nfunc NhpAgentRemoveResource(aspId string, resId string) {\n\tif gAgentInstance == nil {\n\t\treturn\n\t}\n\n\tif len(aspId) == 0 || len(resId) == 0 {\n\t\treturn\n\t}\n\n\tgAgentInstance.RemoveResource(aspId, resId)\n}\n\n// The agent initiates a single knock on the door request to the server hosting the resource\n//\n// Input:\n// aspId: Authentication service provider identifier\n// resId: Resource identifier\n// serverIp: NHP server IP address or domain name (the NHP server managing the resource)\n// serverHostname: NHP server domain name (the NHP server managing the resource)\n// serverPort: NHP server port (the NHP server managing the resource)\n//\n// Returns:\n// The server's response message (json format string buffer pointer):\n// \"errCode\": Error code (string, \"0\" indicates success)\n// \"errMsg\": Error message (string)\n// \"resHost\": Resource server address (\"resHost\": {\"Server Name 1\":\"Server Hostname 1\", \"Server Name 2\":\"Server Hostname 2\", ...})\n// \"opnTime\": Door opening duration (integer, in seconds)\n// \"aspToken\": Token generated after authentication by the ASP (optional)\n// \"agentAddr\": Agent's IP address from the perspective of the NHP server\n// \"preActs\": Pre-connection information related to the resource (optional)\n// \"redirectUrl\": HTTP redirection link (optional)\n//\n// It is necessary to call NhpAgentAddServer before calling,\n// to add the NHP server's public key, address, and other information to the agent\n// The caller is responsible for calling NhpFreeCstring to release the returned char* pointer\nfunc NhpAgentKnockResource(aspId string, resId string, serverIp string, serverHostname string, serverPort int) string {\n\tackMsg := &common.ServerKnockAckMsg{}\n\n\tfunc() {\n\t\tif gAgentInstance == nil {\n\t\t\tackMsg.ErrCode = common.ErrNoAgentInstance.ErrorCode()\n\t\t\tackMsg.ErrMsg = common.ErrNoAgentInstance.Error()\n\t\t\treturn\n\t\t}\n\n\t\tif len(aspId) == 0 || len(resId) == 0 || (len(serverIp) == 0 && len(serverHostname) == 0) {\n\t\t\tackMsg.ErrCode = common.ErrInvalidInput.ErrorCode()\n\t\t\tackMsg.ErrMsg = common.ErrInvalidInput.Error()\n\t\t\treturn\n\t\t}\n\n\t\tresource := &agent.KnockResource{\n\t\t\tAuthServiceId:  aspId,\n\t\t\tResourceId:     resId,\n\t\t\tServerIp:       serverIp,\n\t\t\tServerHostname: serverHostname,\n\t\t\tServerPort:     serverPort,\n\t\t}\n\n\t\tpeer := gAgentInstance.FindServerPeerFromResource(resource)\n\t\tif peer == nil {\n\t\t\tackMsg.ErrCode = common.ErrKnockServerNotFound.ErrorCode()\n\t\t\tackMsg.ErrMsg = common.ErrKnockServerNotFound.Error()\n\t\t\treturn\n\t\t}\n\n\t\ttarget := &agent.KnockTarget{\n\t\t\tKnockResource: *resource,\n\t\t\tServerPeer:    peer,\n\t\t}\n\n\t\tackMsg, _ = gAgentInstance.Knock(target)\n\t}()\n\n\tbytes, _ := json.Marshal(ackMsg)\n\n\treturn string(bytes)\n}\n\n// The agent explicitly informs the NHP server to exit its access permission to the resource.\n//\n// Input:\n// aspId: Authentication Service Provider Identifier\n// resId: Resource Identifier\n// serverIp: NHP server IP address or domain name (the NHP server managing the resource)\n// serverHostname: NHP server domain name (the NHP server managing the resource)\n// serverPort: NHP server port (the NHP server managing the resource)\n//\n// Return:\n// Whether the exit was successful\n//\n// It is necessary to call NhpAgentAddServer before calling, to add the NHP server's public key, address, and other information to the\nfunc NhpAgentExitResource(aspId string, resId string, serverIp string, serverHostname string, serverPort int) bool {\n\tvar err error\n\tackMsg := &common.ServerKnockAckMsg{}\n\n\tfunc() {\n\t\tif gAgentInstance == nil {\n\t\t\tackMsg.ErrCode = common.ErrNoAgentInstance.ErrorCode()\n\t\t\tackMsg.ErrMsg = common.ErrNoAgentInstance.Error()\n\t\t\terr = common.ErrNoAgentInstance\n\t\t\treturn\n\t\t}\n\n\t\tif len(aspId) == 0 || len(resId) == 0 || (len(serverIp) == 0 && len(serverHostname) == 0) {\n\t\t\tackMsg.ErrCode = common.ErrInvalidInput.ErrorCode()\n\t\t\tackMsg.ErrMsg = common.ErrInvalidInput.Error()\n\t\t\terr = common.ErrInvalidInput\n\t\t\treturn\n\t\t}\n\n\t\tresource := &agent.KnockResource{\n\t\t\tAuthServiceId:  aspId,\n\t\t\tResourceId:     resId,\n\t\t\tServerIp:       serverIp,\n\t\t\tServerHostname: serverHostname,\n\t\t\tServerPort:     serverPort,\n\t\t}\n\n\t\tpeer := gAgentInstance.FindServerPeerFromResource(resource)\n\t\tif peer == nil {\n\t\t\tackMsg.ErrCode = common.ErrKnockServerNotFound.ErrorCode()\n\t\t\tackMsg.ErrMsg = common.ErrKnockServerNotFound.Error()\n\t\t\terr = common.ErrKnockServerNotFound\n\t\t\treturn\n\t\t}\n\n\t\ttarget := &agent.KnockTarget{\n\t\t\tKnockResource: *resource,\n\t\t\tServerPeer:    peer,\n\t\t}\n\n\t\tackMsg, err = gAgentInstance.ExitKnockRequest(target)\n\t}()\n\n\treturn err == nil\n}\n\n// cipherType: 0-curve25519; 1-sm2\n// result: \"privatekey\"|\"publickey\"\n// caller is responsible to free the returned char* pointer\n//\n//export NhpGenerateKeys\nfunc NhpGenerateKeys(cipherType int) string {\n\tvar e core.Ecdh\n\tswitch core.EccTypeEnum(cipherType) {\n\tcase core.ECC_SM2:\n\t\te = core.NewECDH(core.ECC_SM2)\n\tcase core.ECC_CURVE25519:\n\t\tfallthrough\n\tdefault:\n\t\te = core.NewECDH(core.ECC_CURVE25519)\n\t}\n\tpub := e.PublicKeyBase64()\n\tpriv := e.PrivateKeyBase64()\n\n\tres := fmt.Sprintf(\"%s|%s\", priv, pub)\n\n\treturn res\n}\n\n// cipherType: 0-curve25519; 1-sm2\n// privateBase64: private key in base64 format\n// result: \"publickey\"\n// caller is responsible to free the returned char* pointer\n//\n//export NhpPrivkeyToPubkey\nfunc NhpPrivkeyToPubkey(cipherType int, privateBase64 string) string {\n\tprivKey := privateBase64\n\tprivKeyBytes, err := base64.StdEncoding.DecodeString(privKey)\n\tif err != nil {\n\t\treturn \"\"\n\t}\n\n\te := core.ECDHFromKey(core.EccTypeEnum(cipherType), privKeyBytes)\n\tif e == nil {\n\t\treturn \"\"\n\t}\n\tpub := e.PublicKeyBase64()\n\n\treturn pub\n}\n```\n\n##### 2.2.2.3 Compiling the SDK\n\n- Method 1: Run the script in the project root directory.\n  `make`\n\n- Method 2: Command to compile the .xcframework file for the SDK separately:\n\n  Navigate to the `opennhp/endpoints/agent/iossdk/` directory and execute the build command.<small>*(Note: The re-edited sdk source code files are placed under opennhp/endpoints/agent/iossdk/)*</small>\n\n  `gomobile bind -target ios -o nhpagent.xcframework .`\n\n##### 2.2.2.4 SDK Adaptation\n\n- **Objective-C**\n    - FileCopyManager.h: Declares methods to copy SDK configuration files to the sandbox.\n      ```objective-c\n      //\n      //  FileCopyManager.h\n      //  TestXCFramework\n      //\n      //  Created by haochangjiu on 2025/10/30.\n      //\n      \n      #import <Foundation/Foundation.h>\n      \n      NS_ASSUME_NONNULL_BEGIN\n      \n      @interface FileCopyManager : NSObject\n      /// Copy the specified file(s) to the etc and certs directories in the application's home directory\n      + (void)copyFilesToSandboxEtc;\n      @end\n      \n      NS_ASSUME_NONNULL_END\n      ```\n    - FileCopyManager.m: Implementation of FileCopyManager.h.\n      ```objective-c\n      //\n      //  FileCopyManager.m\n      //  TestXCFramework\n      //\n      //  Created by haochangjiu on 2025/10/30.\n      //\n      \n      #import \"FileCopyManager.h\"\n      #import <Foundation/Foundation.h>\n      \n      @implementation FileCopyManager\n      \n      /// Copy the specified file(s) to the etc and certs directories in the application's home directory\n      + (void)copyFilesToSandboxEtc {\n          // 1. Retrieve the sandboxed Documents directory\n          NSArray *documentsURLs = [[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask];\n          NSURL *documentsURL = [documentsURLs firstObject];\n          if (!documentsURL) {\n              NSLog(@\"Failed to retrieve Documents directory\");\n              return;\n          }\n          \n          // 2. Define paths for etc and certs directories within the sandbox\n          NSURL *etcURL = [documentsURL URLByAppendingPathComponent:@\"etc\"];\n          NSURL *certsURL = [etcURL URLByAppendingPathComponent:@\"certs\"];\n          \n          // 3. Create etc and certs directories (if they don't exist)\n          [self createDirectoryIfNotExists:etcURL];\n          [self createDirectoryIfNotExists:certsURL];\n          \n          // 4. Copy toml files to the etc directory\n          NSArray *tomlFiles = @[@\"server.toml\", @\"config.toml\", @\"dhp.toml\", @\"resource.toml\"];\n          for (NSString *fileName in tomlFiles) {\n              [self copyFileFromBundle:fileName toDestinationURL:etcURL];\n          }\n          \n          // 5. Copy certificate files to the etc/certs directory\n          NSArray *certFiles = @[@\"server.crt\", @\"server.key\"];\n          for (NSString *fileName in certFiles) {\n              [self copyFileFromBundle:fileName toDestinationURL:certsURL];\n          }\n      }\n      \n      /// Create directory if it does not exist\n      + (void)createDirectoryIfNotExists:(NSURL *)directoryURL {\n          NSFileManager *fileManager = [NSFileManager defaultManager];\n          if (![fileManager fileExistsAtPath:directoryURL.path]) {\n              NSError *error;\n              BOOL success = [fileManager createDirectoryAtURL:directoryURL\n                                    withIntermediateDirectories:YES\n                                                     attributes:nil\n                                                          error:&error];\n              if (success) {\n                  NSLog(@\"Directory created successfully: %@\", directoryURL.path);\n              } else {\n                  NSLog(@\"Failed to create directory: %@, error: %@\", directoryURL.path, error.localizedDescription);\n              }\n          } else {\n              NSLog(@\"Directory already exists: %@\", directoryURL.path);\n          }\n      }\n      \n      /// Copy file from Bundle to destination path\n      + (void)copyFileFromBundle:(NSString *)fileName toDestinationURL:(NSURL *)destinationURL {\n          // Get the file path in the Bundle\n          NSURL *sourceURL = [[NSBundle mainBundle] URLForResource:[fileName stringByDeletingPathExtension]\n                                                      withExtension:[fileName pathExtension]];\n          if (!sourceURL) {\n              NSLog(@\"File not found in Bundle: %@\", fileName);\n              return;\n          }\n          \n          // Destination file path (destination directory + file name)\n          NSURL *destFileURL = [destinationURL URLByAppendingPathComponent:fileName];\n          \n          // Copy file (if it doesn't exist)\n          NSFileManager *fileManager = [NSFileManager defaultManager];\n          if (![fileManager fileExistsAtPath:destFileURL.path]) {\n              NSError *error;\n              BOOL success = [fileManager copyItemAtURL:sourceURL toURL:destFileURL error:&error];\n              if (success) {\n                  NSLog(@\"File copied successfully: %@ -> %@\", fileName, destFileURL.path);\n              } else {\n                  NSLog(@\"File copy failed: %@, error: %@\", fileName, error.localizedDescription);\n              }\n          } else {\n              NSLog(@\"File already exists: %@\", destFileURL.path);\n          }\n      }\n      \n      @end\n      ```\n    - ViewController.m: Program main entry, calling SDK methods.\n      ```objective-c\n      //\n      //  ViewController.m\n      //  TestXCFramework\n      //\n      //  Created by haochangjiu on 2025/10/30.\n      //\n      \n      #import \"ViewController.h\"\n      #import <Nhpagent/Nhpagent.h>\n      #import \"FileCopyManager.h\"\n      \n      @interface ViewController ()\n      \n      @end\n      \n      @implementation ViewController\n      \n      - (void)viewDidLoad {\n          [super viewDidLoad];\n          // Do any additional setup after loading the view.\n          // Invoke method to copy files from etc folder to sandbox etc directory\n          [FileCopyManager copyFilesToSandboxEtc];\n          // Retrieve the sandbox target path (Documents), which is the parent directory of the etc folder\n          NSArray *documentsURLs = [[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask];\n          NSURL *documentsURL = [documentsURLs firstObject];\n          if (!documentsURL) {\n              NSLog(@\"Error: Failed to read Documents directory\");\n          }\n          // Get the parent directory path of the etc folder\n          NSString *etcPath = documentsURL.path;\n          // SdkNhpAgentInit\n          BOOL initFlag = IossdkNhpAgentInit(etcPath, 3);\n          if (!initFlag) {\n              NSLog(@\"NHP Agent init failed\");\n              return;\n          }\n          // knockloop_start\n          long value = IossdkNhpAgentKnockloopStart();\n          NSLog(@\"SdkNhpAgentKnockloopStart value : %ld\", value);\n      }\n      \n      @end\n      ```\n\n- **Swift**\n    - FileCopyManager.swift: Methods to copy SDK configuration files to the sandbox.\n\n      ```swift\n      //\n      //  FileCopyManager.swift\n      //  TestXCFrameworkSwift\n      //\n      //  Created by haochangjiu on 2025/10/30.\n      //\n      \n      import UIKit\n      import Foundation\n      \n      class FileCopyManager {\n          \n          /// Copy specified files to the etc and certs directories in the sandbox\n          static func copyFilesToSandboxEtc() {\n              // 1. Get the Documents directory in the sandbox\n              guard let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else {\n                  print(\"Failed to get Documents directory\")\n                  return\n              }\n              \n              // 2. Define paths for etc and certs directories in the sandbox\n              let etcURL = documentsURL.appendingPathComponent(\"etc\")\n              let certsURL = etcURL.appendingPathComponent(\"certs\")\n              \n              // 3. Create etc and certs directories (if they don't exist)\n              createDirectoryIfNotExists(at: etcURL)\n              createDirectoryIfNotExists(at: certsURL)\n              \n              // 4. Copy toml files to the etc directory\n              let tomlFiles = [\"server.toml\", \"config.toml\", \"dhp.toml\", \"resource.toml\"]\n              tomlFiles.forEach { fileName in\n                  copyFileFromBundle(fileName: fileName, to: etcURL)\n              }\n              \n              // 5. Copy certificate files to the etc/certs directory\n              let certFiles = [\"server.crt\", \"server.key\"]\n              certFiles.forEach { fileName in\n                  copyFileFromBundle(fileName: fileName, to: certsURL)\n              }\n          }\n          \n          /// Create directory if it doesn't exist\n          private static func createDirectoryIfNotExists(at url: URL) {\n              let fileManager = FileManager.default\n              guard !fileManager.fileExists(atPath: url.path) else {\n                  print(\"Directory already exists: \\(url.path)\")\n                  return\n              }\n              \n              do {\n                  try fileManager.createDirectory(at: url, withIntermediateDirectories: true, attributes: nil)\n                  print(\"Directory created successfully: \\(url.path)\")\n              } catch {\n                  print(\"Failed to create directory: \\(url.path), error: \\(error.localizedDescription)\")\n              }\n          }\n          \n          /// Copy file from Bundle to destination path\n          private static func copyFileFromBundle(fileName: String, to destinationURL: URL) {\n              // Split filename and extension (handling files with extensions)\n              let fileNameWithoutExt = (fileName as NSString).deletingPathExtension\n              let fileExt = (fileName as NSString).pathExtension\n              \n              // Get the file path in the Bundle\n              guard let sourceURL = Bundle.main.url(forResource: fileNameWithoutExt, withExtension: fileExt) else {\n                  print(\"File not found in Bundle: \\(fileName)\")\n                  return\n              }\n              \n              // Destination file path (destination directory + filename)\n              let destFileURL = destinationURL.appendingPathComponent(fileName)\n              let fileManager = FileManager.default\n              \n              // Copy file (if it doesn't exist)\n              guard !fileManager.fileExists(atPath: destFileURL.path) else {\n                  print(\"File already exists: \\(destFileURL.path)\")\n                  return\n              }\n              \n              do {\n                  try fileManager.copyItem(at: sourceURL, to: destFileURL)\n                  print(\"File copied successfully: \\(fileName) -> \\(destFileURL.path)\")\n              } catch {\n                  print(\"File copy failed: \\(fileName), error: \\(error.localizedDescription)\")\n              }\n          }\n      }\n      ```\n    - ViewController.swift: Program main entry, calling SDK methods.\n      ```swift\n      //\n      //  ViewController.swift\n      //  TestXCFrameworkSwift\n      //\n      //  Created by haochangjiu on 2025/10/30.\n      //\n      \n      import UIKit\n      import Nhpagent\n      \n      class ViewController: UIViewController {\n          override func viewDidLoad() {\n              super.viewDidLoad()\n              // Do any additional setup after loading the view.\n              // Call method to copy files from etc folder to sandbox etc directory\n              FileCopyManager.copyFilesToSandboxEtc()\n              // Retrieve the sandbox target path (Documents), which is the parent directory of the etc folder\n              guard let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else {\n                  print(\"Error: Failed to read Documents directory\")\n                  return\n              }\n              // Get the parent directory path of the etc folder\n              let etcPath: String = documentsURL.path\n              // Call SdkNhpAgentInit for initialization\n              let initFlag: Bool = IossdkNhpAgentInit(etcPath, 3)\n              if !initFlag {\n                  print(\"NHP Agent init failed\")\n              }\n              // Call knockloop_start\n              let value = IossdkNhpAgentKnockloopStart()\n              print(\"SdkNhpAgentKnockloopStart value: %ld\", value)\n        }\n      }\n      ```\n\n    \n"
  },
  {
    "path": "docs/build.md",
    "content": "---\nlayout: page\ntitle: How to Build\nnav_order: 7\npermalink: /build/\n---\n\n# Build OpenNHP Source Code\n{: .fs-9 }\n\nThis article explains how to build OpenNHP from source code.\n{: .fs-6 .fw-300 }\n\n[中文版](/zh-cn/build/){: .label .fs-4 }\n\n---\n\n## 1. WSL Environment Setup\n\n**Note：** You can run Linux through the WSL subsystem on Windows 10/11. For details, see the official WSL documentation: https://learn.microsoft.com/en-us/windows/wsl/install\n\n- **【Enable the WSL function】** On Win10, you need to enable WSL first to use it for installing Linux. See the settings interface in the image below.\n\n   ![Windows 10 on WSL Settings](/images/win10wsl_en.png)\n\n- **【Install Linux on WSL】** It is recommended to install Ubuntu Linux on WSL by running the following command through PowerShell:\n\n   ```bat\n   wsl --update\n   wsl --install -d Ubuntu\n   ```\n\n   If you encounter the following problems, refer to：<https://blog.csdn.net/weixin_44293949/article/details/121863559>\n\n   ```text\n   From 'https://raw.githubusercontent.com/microsoft/WSL/master/distributions/DistributionInfo.json' to extract the distribution list. The server name or address could not be resolved\n   Error code: Wsl/WININET_E_NAME_NOT_RESOLVED\n   ```\n\n- **【IP address of the WSL environment】** In the Linux environment of WSL, run the following command to get the IP address:\n\n|        Host machine        |             Command to view the IP address              |\n| :------------------------: | :-----------------------------------------------------: |\n|     Linux hosts in WSL     |            `hostname -I \\| awk '{print $1}'`            |\n| WSL hosts the Windows host | `ip route show \\| grep -i default \\| awk '{ print $3}'` |\n\n## 2. System requirement\n\n- 2.1 'Go Language' environment: **Go 1.23** . Installation package download: <https://go.dev/dl/>\n  - **Windows and macOS**Environment, install Go through the downloaded installer.\n  - **Linux** environment can be installed directly through the management tool: `sudo apt install golang`\n  - After the installation is successful, run the command `go version`to see the Go version number.\n  - **Windows and macOS**environment，Install Go through the downloaded installer.\n  - **Linux**Environment can be installed directly through the management tool:`sudo apt install golang` Or install it manually with the following command:\n\n   ```bash\n      1. sudo apt-get update\n      2. wget https://go.dev/dl/go1.21.0.linux-amd64.tar.gz\n      3. sudo tar -xvf go1.21.0.linux-amd64.tar.gz\n      4. sudo mv go /usr/local\n      5. export GOROOT=/usr/local/go\n      6. export GOPATH=$HOME/go\n      7. export PATH=$GOPATH/bin:$GOROOT/bin:$PATH\n      8. source ~/.profile\n   ```\n\n  - After the installation is successful, run the command `go version` to see the Go version number.\n- 2.2 `GCC`environment：\n  - **Linux and macOS**：**GCC 8.0**or above。\n    - To view the GCC version of the command:`gcc -v`\n    - To install GCC: `sudo apt install build-essential`\n  - **Windows**:\n    1. Step 1: **Install mingw64**. mingw64 can be downloaded from msys2's package management tool. Installation requirements, downloads, and installation tutorials for msys2 are available at <https://www.msys2.org/>.\n\n    ![install_msys2](/images/install_msys2.png)\n\n    2. Step 2: **Install GCC**. Enter the command in msys2's console:\n\n       ```bash\n       pacman -S mingw-w64-ucrt-x86_64-gcc\n       ```\n\n    3. Step 3: **Configure GCC**. Add the GCC tool PATH to the Windows *%PATH%* environment variable. For example, if the installation path of mingw-w64-gcc is`C:\\Program Files\\MSYS2\\ `, run the command\n\n       ```bat\n       setx PATH \"%PATH%;C:\\Program Files\\MSYS2\\ucrt64\\bin\n       ```\n       After successful execution, open a new command line window and check the version number of *gcc*\n       ```bat\n       gcc --version\n       ```\n\n  - **Tip:** Under Windows can be ` WSL ` subsystem to run Linux, details please see WSL official document: < https://learn.microsoft.com/zh-cn/windows/wsl/install >\n    - It is recommended to run the latest version of Ubuntu v22 on WSL and install it by running the following command from PowerShell on Windows:\n      ```bat\n      wsl --install --distribution Ubuntu-22.04\n      ```\n\n<small>*Note: If 2.1 and 2.2 are complete, when executing the compile command `.\\build.bat `directly in the project directory, you will usually encounter` the system cannot find the specified path `or` 'lib' is not an internal or external command, nor is it a runnable program or batch file`The mistake. 2.3 Provides a solution to this problem for reference.*</small>\n\n- 2.3 `lib`environment：\n\n\n  - The lib utility is used in the compile run command, which is a tool for generating.lib files, usually for linking static libraries or exporting symbol tables (the.lib file is generated in Windows to work with the.dll file). The error message lib is not an internal or external command, indicating that the system cannot find the lib utility.\n\n  - **To solve the problem ('lib' is not an internal or external command, nor is it a runnable program or batch file) :** Install Visual Studio and Visual Studio tools.\n\n    - The lib tool is Microsoft's library management tool and is usually installed with Microsoft Build Tools for Visual Studio. Make sure you have Visual Studio installed and have selected the C++ Build Tools components, including lib.exe.\n\n    - If you do not have Visual Studio installed, you can download and install it from the official Visual Studio website: https://visualstudiomicrosoft.com/zh-hans/ when installation, select the desktop development (c + +) \"the workload, it contains the lib. Exe and other necessary tools.\n\n    - After installing Visual Studio, make sure to use the Visual Studio Developer Command Prompt to run the `build.bat` file that contains the lib command. This command line tool automatically loads environment variables for the build tool, such as lib.exe\n\n   - **To resolve the problem (the system cannot find the specified path) :** Change the path in the `build.bat` file\n\n     - Open the `build.bat` file and find it\n     ```bat\n     call \"C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Community\\VC\\Auxiliary\\Build\\vcvarsall.bat\" x64\n     ```\n\n     - Change the installation path to your own visual studio directory. For example:\n     ```bat\n     call \"F:\\develop\\visualstu\\VC\\Auxiliary\\Build\\vcvarsall.bat\" x64\n     ```\n   \n- 2.4 `clang` environment (optional):\n\n  - **Note:**\n    - Regarding the clang compiler tool, clang is only supported on Linux and not available on Windows, Windows don't need to install clang.\n    - Regarding eBPF module compilation, eBPF is not supported on Windows, eBPF is only supported on Linux with kernel version 5.6 or higher.\n  - To check clang version: `clang --version`\n  - **For Linux Ubuntu**:\n    - Install clang, llvm, and libbpf-dev: `sudo apt install clang llvm libbpf-dev`\n  - **For Linux CentOS**:\n    - Install clang, llvm, and libbpf-dev: `sudo yum install clang llvm libbpf-dev -y`\n    \n\n## 3. compile\n\n1. Pull the code repository\n\n   ```bash\n   git clone https://github.com/OpenNHP/opennhp.git\n   ```\n\n2. Go environment Settings\n\n   ```bash\n   go env -w GOPROXY=\"https://goproxy.cn,direct\"\n   ```\n\n3. Compile and build\n   - **Linux and macOS**：Run the script in the code root directory\n   `make`\n   - **Windows**：Run the *BAT* file in the code root directory\n   `build.bat`<br>\n   <small>*（Note: If an error occurs during the compilation process under windows, try this compilation method: In the Visual Studio developer command prompt for VS command window, switch to the project directory and execute the `./build.bat `command）*</small>\n   - **Compiling eBPF on Linux**: Run the script in the code root directory\n   `make ebpf`<br>\n   <small>*(Note: The command `make ebpf` will also compile the eBPF module)*</small>\n\n## 4. result\n\nCompiled binaries are in the code directory under the `release` subdirectory.\n\n- **NHP-Server** executable and configuration files: `release\\nhp-server` subdirectory\n- **NHP-AC** executable and configuration files: `release\\nhp-ac` subdirectory\n- **NHP-Agent** executable and configuration files: `release\\nhp-agent` subdirectory\n- **NHP-DB** executable and configuration files: `release\\nhp-db` subdirectory\n- **NHP-KGC** executable and configuration files: `release\\nhp-kgc` subdirectory\n- All binaries are packaged into a `tar` file: `release\\archive` subdirectory\n\n[中文版](/zh-cn/build/){: .label .fs-4 }\n\n---\n\n"
  },
  {
    "path": "docs/code.md",
    "content": "---\nlayout: page\ntitle: Understand the Code\nnav_order: 8\npermalink: /code/\n---\n\n# Understand the Source Code\n{: .fs-9 }\n\nThis article explains the architecture and structure of the OpenNHP codebase.\n{: .fs-6 .fw-300 }\n\n[中文版](/zh-cn/code/){: .label .fs-4 }\n\n---\n\n## Repository Structure\n\nOpenNHP uses a multi-module Go architecture:\n\n```\nopennhp/\n├── nhp/                 # Core protocol library (github.com/OpenNHP/opennhp/nhp)\n├── endpoints/           # Network daemons (github.com/OpenNHP/opennhp/endpoints)\n├── examples/            # Example implementations\n├── docs/                # Documentation (Jekyll)\n├── docker/              # Container configurations\n└── release/             # Build outputs\n```\n\n## Core Library (`nhp/`)\n\nThe `nhp` module contains the core NHP protocol implementation:\n\n| Directory | Purpose |\n|-----------|---------|\n| `core/` | Protocol implementation: packets, encryption, device management |\n| `common/` | Shared types, message structures, error definitions |\n| `utils/` | Helper functions: IP utilities, iptables, crypto helpers |\n| `plugins/` | Server plugin system interfaces |\n| `log/` | Async logging framework |\n| `etcd/` | etcd integration for distributed configuration |\n| `ebpf/` | eBPF programs for XDP and traffic control |\n| `test/` | Unit tests |\n\n### Key Files in `core/`\n\n- `device.go` - NHP device lifecycle and connection management\n- `packet.go` - Packet structure and header definitions\n- `crypto.go` - Cryptographic primitives (ECDH, AEAD)\n- `initiator.go` - Client-side message encryption\n- `responder.go` - Server-side message decryption\n\n## Network Daemons (`endpoints/`)\n\nThe `endpoints` module contains executable daemons:\n\n| Component | Binary | Purpose |\n|-----------|--------|---------|\n| `agent/` | `nhp-agent` | Client that sends knock requests |\n| `server/` | `nhp-server` | Central server handling knock validation |\n| `ac/` | `nhp-ac` | Access Controller managing firewall rules |\n| `db/` | `nhp-db` | Data broker for DHP (Data Hiding Protocol) |\n| `kgc/` | `nhp-kgc` | Key Generation Center for IBC keys |\n\nEach daemon follows a similar structure:\n\n```\nagent/\n├── main/           # Entry point and CLI\n│   ├── main.go     # CLI commands\n│   ├── export.go   # C FFI exports for SDK\n│   └── etc/        # Configuration files\n├── udpagent.go     # UDP transport implementation\n├── config.go       # Configuration handling\n└── msghandler.go   # Message processing\n```\n\n## Cryptographic Schemes\n\nOpenNHP supports two cipher schemes:\n\n| Scheme | Algorithms | Use Case |\n|--------|-----------|----------|\n| `CIPHER_SCHEME_CURVE` | Curve25519 + ChaCha20-Poly1305 + BLAKE2s | International |\n| `CIPHER_SCHEME_GMSM` | SM2 + SM4-GCM + SM3 | Chinese standards |\n\nSee [Cryptography](/cryptography/) for detailed protocol documentation.\n\n## Plugin System\n\nServer plugins extend NHP server functionality:\n\n```go\ntype PluginHandler interface {\n    Init(helper *NhpServerPluginHelper) error\n    Close() error\n    AuthWithNHP(req *AuthRequest) (*AuthResponse, error)\n    AuthWithHttp(req *HttpAuthRequest) (*HttpAuthResponse, error)\n}\n```\n\nSee [Server Plugin Development](/server_plugin/) for implementation guide.\n\n## SDK Architecture\n\nThe agent provides SDKs for multiple platforms:\n\n| Platform | Output | Build Target |\n|----------|--------|--------------|\n| Linux | `nhp-agent.so` | `make linuxagentsdk` |\n| macOS | `nhp-agent.dylib` | `make macosagentsdk` |\n| iOS | `nhpagent.xcframework` | `make iosagentsdk` |\n| Android | `libnhpagent.so` | `make androidagentsdk` |\n\nSee [Agent SDK](/agent_sdk/) for integration documentation.\n\n## Building from Source\n\n```bash\n# Initialize dependencies\nmake init\n\n# Build all binaries\nmake\n\n# Build specific components\nmake agentd      # nhp-agent\nmake serverd     # nhp-server\nmake acd         # nhp-ac\n\n# Development commands\nmake test        # Run tests\nmake fmt         # Format code\nmake clean       # Clean build artifacts\n```\n\n## Testing\n\nTests are located in `nhp/test/` and `endpoints/test/`:\n\n```bash\n# Run all tests\nmake test\n\n# Run with race detection\nmake test-race\n\n# Run with coverage\nmake coverage\n```\n\n## Contributing\n\nSee [CONTRIBUTING.md](https://github.com/OpenNHP/opennhp/blob/main/CONTRIBUTING.md) for development guidelines.\n"
  },
  {
    "path": "docs/comparison.md",
    "content": "---\nlayout: page\ntitle: Comparison\nnav_order: 5\npermalink: /comparison/\n---\n\n# Comparison between NHP and SPA\n{: .fs-9 }\n\nNote: The following content is extracted from the journal paper \"AHAC: Advanced Network-Hiding Access Control Framework\" published in Volume 14, Issue 13 of the journal *Applied Sciences* in 2024. It is worth noting that the AHAC framework is a key component of the NHP (OpenNHP) technology system.\n\n[中文版](/zh-cn/comparison/){: .label .fs-4 }\n\n---\n\n- [Comparison between NHP and SPA](#comparison-between-nhp-and-spa)\n- [Table Of Content:](#table-of-content)\n  - [1. Advantage Comparison](#1-advantage-comparison)\n  - [2. Performance Comparison](#2-performance-comparison)\n    - [2.1 Encryption Algorithm Overhead](#21-encryption-algorithm-overhead)\n    - [2.2 Performance Overhead](#22-performance-overhead)\n  - [3. High Availability Comparison](#3-high-availability-comparison)\n  - [4. Scalability Comparison](#4-scalability-comparison)\n    - [4.1 Integration with DNS](#41-integration-with-dns)\n    - [4.2 Integration with FIDO](#42-integration-with-fido)\n  - [5. Compatibility Comparison](#5-compatibility-comparison)\n\n## 1. Advantage Comparison\n\n&nbsp; &nbsp; &nbsp; &nbsp;NHP combines the Noise protocol, key pairs, and ECDH algorithm to provide a robust bidirectional authentication mechanism. Compared to traditional methods, NHP offers significant advantages in terms of performance, scalability, and security. It supports multiple programming languages (such as C/C++, Python, Java, and Go) and provides a highly scalable architecture that enhances device authentication, defends against replay attacks, and fully addresses IP amplification issues. NHP is particularly well-suited for scenarios requiring strong authentication and encryption, such as enterprise IAM systems and secure resource access. It optimizes performance and enhances high availability, ensuring seamless compatibility and high security in complex environments. In contrast, while SPA has certain strengths, it still cannot match NHP in security, performance, and scalability.\n\n\n|                           | SPA                                           | NHP                                           |\n| ------------------------- | --------------------------------------------- | --------------------------------------------- |\n| Development Language      | C, C++                                        | C/C++, Python, Java, Go                       |\n| Communication             | Single-packet authorization                   | Noise protocol, ECDH                          |\n| Architecture              | Complexity, encrypted packets, firewall       | Advanced, scalable, Noise protocol            |\n| Authentication            | UDP port knocking, IP amplification issue     | Device fingerprint, UDP and TCP port knocking |\n| Cryptography Framework    | RSA, AES                                      | Noise protocol, ECDH                          |\n| Performance               | Moderate overhead, efficient                  | Optimized, minimal overhead                   |\n| Network Hiding Capability | Only service/application port                 | Domain name, IP, and port                     |\n| Availability              | High load                                     | High availability, scalable clusters          |\n| Scalability               | Complex implementation                        | FIDO+NHP, highly scalable, easy integration   |\n| Compatibility             | Various systems, potential integration needed | High, cross-platform, future-oriented         |\n| Security                  | Strong encryption, key management risk        | Address hiding, mutual authentication         |\n| Use Cases                 | High-security scenarios                       | Scalable, high-security environments          |\n\n## 2. Performance Comparison\n\n### 2.1 Encryption Algorithm Overhead\n\n&nbsp; &nbsp; &nbsp; &nbsp;SPA uses the RSA encryption algorithm, while NHP utilizes ECC encryption. We compared the cost-effectiveness of RSA and ECC based on security strength and key length, as shown in the table below. Under the same security standards, the key length of ECC is significantly shorter than that of RSA. Additionally, the ciphertext generated by RSA message signatures is roughly equal to the key length. Therefore, when verifying network message identities, NHP uses shorter ECC random keys (32 bytes or 64 bytes) for ECDH exchange instead of transmitting larger RSA2048 message signatures (256 bytes) for validation. This not only reduces computational overhead but also efficiently saves valuable bandwidth resources. This strategy highlights that NHP has a significant advantage over SPA in terms of improving system efficiency and resource utilization.\n\n| Security Strength (bits) | SPA (Minimum Public Key Length (bits)) | NHP (Minimum Public Key Length (bits)) | NHP vs SPA (Key Length Ratio) | Validity Period |\n| ------------------------ | -------------------------------------- | -------------------------------------- | ----------------------------- | --------------- |\n| 80                       | 1024                                   | 160-223                                | 1:6                           | Until 2010      |\n| 112                      | 2048                                   | 224-255                                | 1:9                           | Until 2010      |\n| 128                      | 3072                                   | 256-383                                | 1:12                          | After 2031      |\n| 192                      | 7680                                   | 384-511                                | 1:20                          |                 |\n| 256                      | 15360                                  | 512+                                   | 1:30                          |                 |\n\n&nbsp; &nbsp; &nbsp; &nbsp;We measured the encryption and decryption times of RSA and ECC through experiments, with the detailed results shown in the table below. The experiments increased the number of encryption and decryption cycles to test the performance of both algorithms under different conditions. The results show that although the encryption and decryption times for both RSA and ECC increased with the number of cycles, the time overhead for ECC remained consistently much lower than that of RSA. Especially as the number of cycles increased, the advantage of ECC became more pronounced, with RSA's time overhead reaching up to 800 times that of ECC. This significant gap demonstrates that NHP is vastly superior to SPA in terms of encryption and decryption efficiency, providing strong support for selecting a more efficient encryption algorithm in practical applications.\n\n\n| Cycle Times | SPA      | NHP    |\n| ----------- | -------- | ------ |\n| 1           | 0.34s    | 687us  |\n| 10          | 2.48s    | 3.60ms |\n| 100         | 27.54s   | 0.03s  |\n| 200         | 61.18s   | 0.06s  |\n| 500         | 136.23s  | 0.16s  |\n| 1000        | 287.61s  | 0.32s  |\n| 10000       | 2832.42s | 3.81s  |\n\n### 2.2 Performance Overhead\n\n&nbsp; &nbsp; &nbsp; &nbsp;To comprehensively evaluate the performance of NHP, we set up the experimental environment shown in the figure below and conducted load performance tests for both NHP and SPA. The environment consists of two main areas: the Agent deployment area and the network stealth deployment area.\n\n![Deployment diagram](/images/Deployment_diagram.png)\n\n&nbsp; &nbsp; &nbsp; &nbsp;In the network stealth deployment area, we integrated a network stealth server and an application server as key components. To ensure the stability and consistency of the test environment, we selected three machines with identical configurations, each equipped with a 4-core CPU and 8GB of memory. In the agent deployment area, we launched `n` agent services that communicated with the network stealth server at a frequency of sending a port knocking request per second. At the same time, JMeter components were deployed on the network stealth server to simulate and monitor its performance. On the application server side, JMeter services were also deployed to track the performance resource consumption of the network stealth server in real time. With this setup, we were able to comprehensively monitor and compare the performance of NHP and SPA.\n\nWhile maintaining the consistency of the experimental environment, we selected 1, 10, 20, 30, 40, and 50 agents according to the deployment plan and conducted performance tests for NHP and SPA. The test results are shown in Table 4, where the horizontal axis represents the number of agents involved in the experiment, and the vertical axis displays the variation in CPU utilization during the test period. With this setup, we can visually observe the different performance of NHP and SPA in terms of CPU resource consumption as the number of agents increases.\n\n![CPU comparison](/images/CPU_comparison.png)\n\n&nbsp; &nbsp; &nbsp; &nbsp;The experimental results show that as the number of agents increases, the CPU load for both NHP and SPA rises. However, with further increases in the number of agents, the performance advantage of NHP becomes more pronounced, with its CPU load remaining approximately half that of SPA, demonstrating a significant improvement in efficiency.<br>\n<small>*&nbsp; &nbsp; &nbsp; &nbsp;(Note: Although theoretically NHP performance should be approximately 1000 times better than SPA, actual tests showed only about a 1-fold improvement. The primary factors contributing to this discrepancy include the significant impact of network overhead on performance, performance losses due to the garbage collection mechanism, and differences in hardware environments. Additionally, despite choosing the memory-safe Go language for code security and encryption algorithm implementation, its garbage collection mechanism also had a certain impact on performance.)*</small>\n\n## 3. High Availability Comparison\n\n&nbsp; &nbsp; &nbsp; &nbsp;NHP achieves high availability for zero trust services through a distributed architecture, ensuring that the port knocking module and the access control module are deployed on different hosts to avoid resource contention and enhance elastic scaling. Even in the event of a failure, seamless service switching can maintain system functionality and response speed. This design enhances the robustness and stability of the system, reducing the impact of service failures on the overall system, as shown in the figure below.\n\n![High availability architecture](/images/High-availability.png)\n\n&nbsp; &nbsp; &nbsp; &nbsp;NHP supports horizontal elastic scaling for port knocking verification services, allowing the number of service instances to be dynamically adjusted based on real-time load. This feature provides high flexibility and scalability, ensuring that services remain responsive and stable even under high load. Each service instance can handle port knocking requests and maintain business sessions, which not only enhances processing capacity but also improves fault tolerance, ensuring business continuity and stability. According to the test results, NHP significantly outperforms SPA in terms of high availability.\n\n![Load diagram](/images/Load_diagram.png)\n\n## 4. Scalability Comparison\n\n&nbsp; &nbsp; &nbsp; &nbsp;Although NHP is designed to provide a trusted, controllable, reliable, and verifiable foundation for data communication, it also needs to have good scalability to adapt to various customization needs due to the diversity and complexity of communication scenarios and environments. The scalability of NHP is reflected in several aspects:\n\n- Its bidirectional communication mechanism, compared to SPA's unidirectional port knocking mechanism, offers richer expansion capabilities. It can hide the true IP addresses of resources and support key exchanges before and after data communication, enhancing the security of privacy computing and data flow scenarios.\n\n- Through the Authorization Service Provider (ASP) interface, NHP can pass resource request contents to the ASP, enabling stricter identity authentication and access control.\n\n- NHP's resource identifiers support arbitrary string formats, including Chinese and English characters and symbols, providing stronger descriptive capabilities for data resources. It also has DNS resolution functionality, offering more secure, encrypted, and private domain name resolution services.\n\n&nbsp; &nbsp; &nbsp; &nbsp;Therefore, NHP's scalable architecture covers typical application scenarios such as integration with DNS and FIDO.\n\n### 4.1 Integration with DNS\n\n&nbsp; &nbsp; &nbsp; &nbsp;DNS is a crucial foundational service for internet operations, but its security has long been overlooked. Due to the use of the unreliable UDP protocol, there are numerous security vulnerabilities, such as DNS hijacking and denial-of-service attacks. Therefore, strengthening DNS security is essential. By integrating network stealth technology, DNS resolution is conducted through a bidirectional encrypted channel, ensuring confidentiality and tamper-resistance. Additionally, only authenticated users are allowed to perform resolution, effectively defending against DDoS attacks and hijacking. The specific implementation is shown in the figure below, and our approach significantly enhances DNS security, providing users with a more reliable DNS service.\n\n![DNS integration Scheme](/images/DNS_integration.png)\n\n- (1) The Agent (such as a client, browser, etc.) initiates a request to the Network-Hiding\nServer (i.e., Server) using a domain name.\n\n- (2) Once the Server receives the domain name data packet request from the Agent,\nit immediately sends an authentication query request to the application authentication\nserver to verify the legality and permissions of the request.\n\n- (3) Upon receiving the authentication request message from the Server, the authentication\nserver undergoes a strict verification process. Once the identity is confirmed to be\nauthentic and valid, it grants access permissions. Subsequently, the authentication\nserver promptly replies to the Server with an authorized access credential containing\ncritical information such as the real IP address and port number of the target resource.\n\n- (4) After successfully passing the authentication query, the Server quickly initiates an\naccess request to the access control system of the target resource. This request aims to\nensure that the Agent can access the required target resource seamlessly, facilitating\nsubsequent operations.\n\n- (5) Upon receiving the access request from the Server, the access control system immediately performs a rigorous verification procedure. This process ensures that the\nrequested target resource matches the protected resource exactly, thereby ensuring\nthe security and reliability of the system. Once verified, the AC system swiftly establishes a connection channel from the Agent to the protected resource, allowing\nunobstructed access.\n\n- (6) Once the AC system successfully grants access to the Agent, the Server promptly\nconfirms this operation and returns the IP address and port information of the target resource. These details are then quickly transmitted to the Agent, enabling it to\naccurately locate and access the protected resource (i.e., Application).\n\n- (7) After receiving the IP address and port information of the Application, the Agent\nimmediately initiates normal business access to the Application, achieving efficient\nand secure resource interaction.\n\n### 4.2 Integration with FIDO\n\n&nbsp; &nbsp; &nbsp; &nbsp;Although FIDO performs exceptionally well in web authentication, potential vulnerabilities in servers can still be exploited by hackers to bypass FIDO authentication and directly invade servers for data theft or damage. Integrating FIDO with NHP can effectively address the shortcomings of FIDO in vulnerability protection, providing a more comprehensive defense solution for internet exposure. The specific implementation is shown in the figure below, with detailed implementation steps as follows.\n\n![FIDO integration solution](/images/FIDO_integration.png)\n\n- (1) The User Agent (i.e., Agent) sends a Port Knocking packet to the Network-Hiding\nServer (i.e., Server) aiming to attempt access to sensitive resources within sessions\nthat have been authenticated but with relatively lower assurance levels.\n\n- (2) Upon receiving the Port Knocking packet, the Server forwards the resource access\nrequest to the Application Provider.\n\n- (3) The Application Provider responds and sends a reply message to the Server while\nredirecting the Port Knocking message to a trusted authentication authority to request\na higher assurance FIDO-based authentication.\n\n- (4) After receiving the Application Provider’s response, the Server passes the redirection indicator to the Agent.\n  \n- (5) Upon receiving the redirection message, the Agent directly opens the FIDO authentication page.\n  \n- (6) The Server, upon receiving the Agent’s FIDO authentication page, promptly initiates\na FIDO authentication request to the authentication authority.\n\n- (7) The FIDO server completes the FIDO request and responds after receiving the\nrequest message.\n\n- (8) The authentication authority, after a rigorous FIDO verification process, returns a\nFIDO-based authentication response to the Server.\n\n- (9) Once the FIDO identity is confirmed to be authentic and valid, and the authentication is successful, the Server requests the Access Control (i.e., AC) system to open the Application Provider’s port to accept the Agent’s connection.\n  \n- (10) The Server notifies the Agent of the successful authentication and provides the IP/port for resource access.\n  \n- (11) The AC system successfully grants access permission to the Agent.\n  \n- (12) The Agent establishes a connection with the Application Provider to access the resources.\n  \n  ## 5. Compatibility Comparison\n\n  &nbsp; &nbsp; &nbsp; &nbsp;Compared to the SPA protocol, a key goal of NHP is to ensure good compatibility with both the domestic zero trust standards and the innovation-driven environment. In terms of encryption algorithms, NHP supports international cryptographic algorithms (such as RSA, SHA256, AES) as well as national cryptographic algorithms (such as SM2, SM3, SM4), and can adjust encryption time based on the length of the packet header. Regarding hardware and software compatibility, NHP is adapted to major domestic and international CPU hardware and operating systems, including Kunpeng, x86, Loongson, and Shenwei. Additionally, NHP complies with the forthcoming national standard \"Information Security Technology - Zero Trust Reference Architecture,\" ensuring compatibility with this standard, as shown in the figure below.\n\n  ![Compatibility comparison](/images/Compatibility_comparison.png)\n\n\n\n---"
  },
  {
    "path": "docs/cryptography.md",
    "content": "---\r\nlayout: page\r\ntitle: Cryptography\r\nnav_order: 4\r\npermalink: /cryptography/\r\n---\r\n\r\n# Cryptographic Algorithms in OpenNHP\r\n{: .fs-9 }\r\n\r\nCryptography is at the heart of OpenNHP, providing robust security, excellent performance, and scalability by utilizing cutting-edge cryptographic algorithms.\r\n{: .fs-6 .fw-300 }\r\n\r\n[中文版](/zh-cn/cryptography/){: .label .fs-4 }\r\n\r\n---\r\n\r\nThis article explains how OpenNHP takes advantages of modern cryptographic algorithms in several critical areas:\r\n\r\n1. [Public Key Cryptography](#1-public-key-cryptography)\r\n2. [Key Exchange, Data Encryption and Identity Verification](#2-key-exchange-data-encryption-and-identity-verification)\r\n3. [Key Distribution and Management](#3-key-distribution-and-management)\r\n\r\n## 1) Public Key Cryptography\r\n\r\n### 1.1 Introduction\r\nIn the evolving landscape of cybersecurity, securing communications and protecting network resources are essential, especially with the increasing sophistication of cyber threats. The Network Infrastructure Hiding Protocol (NHP), a zero-trust security mechanism, stands at the forefront of efforts to address these concerns by concealing network infrastructure details from attackers and ensuring that only trusted entities can interact with network resources. A key component of NHP's security model is the use of Elliptic Curve Cryptography (ECC) for public key cryptography. In this article, we explore how ECC integrates into the NHP Zero Trust protocol to provide robust and efficient security.\r\n\r\n### 1.2 What is Elliptic Curve Cryptography?\r\n\r\nElliptic Curve Cryptography (ECC) is a modern approach to public key cryptography that provides equivalent levels of security with significantly smaller key sizes compared to traditional methods such as RSA. ECC relies on the mathematical properties of elliptic curves over finite fields, providing a powerful balance of security and performance. Due to its reduced computational overhead, ECC is particularly suitable for resource-constrained environments such as embedded systems or mobile devices.\r\n\r\nThe advantages of ECC include:\r\n\r\n- **Smaller Key Sizes**: ECC achieves a high level of security with smaller keys, which translates to faster operations, less bandwidth usage, and reduced computational requirements.\r\n- **Enhanced Security**: The underlying problem of elliptic curve discrete logarithms is computationally complex, making ECC resistant to common forms of cryptographic attack.\r\n- **Efficiency**: With less processing power needed compared to traditional methods, ECC can handle encryption and decryption more efficiently, which is crucial for zero trust environments requiring frequent cryptographic operations.\r\n\r\n\r\n### 1.3 How NHP Uses ECC for Secure Communication\r\n\r\nNHP uses ECC in key exchange, data encryption, identity verification with the Noise protocol framework, and key distribution and management with Certificateless Public Key Cryptography (CL-PKC).\r\n\r\n\r\n#### 1. **Key Exchange Mechanism**\r\n\r\nThe secure exchange of encryption keys between communicating entities is the backbone of any secure communication protocol. NHP uses Elliptic Curve Diffie-Hellman (ECDH) for its key exchange mechanism. In the ECDH key exchange, both communicating parties generate a public-private key pair using elliptic curves. The public keys are then exchanged, allowing both parties to compute a shared secret without ever having to transmit it directly over the network.\r\n\r\nThe benefit of using ECDH in NHP is twofold: first, it provides forward secrecy, meaning that even if the private key of one party is compromised in the future, previously established session keys remain secure. Secondly, because of ECC's efficiency, the key exchange process is computationally lightweight, ensuring that key establishment is performed quickly without a large computational footprint.\r\n\r\n#### 2. **Authentication with Digital Signatures**\r\n\r\nIn a zero-trust environment, authentication is paramount. NHP utilizes Elliptic Curve Digital Signature Algorithm (ECDSA) to verify the authenticity of entities attempting to access network resources. ECDSA, an ECC-based digital signature scheme, allows devices to prove their identity without revealing sensitive private keys.\r\n\r\nIn the NHP protocol, when an entity wants to communicate with the network, it must provide a digital signature generated with its private key. The receiving entity can then use the corresponding public key to verify the validity of the signature. This ensures that only legitimate entities can participate in the network, effectively implementing the zero-trust model's \"never trust, always verify\" principle.\r\n\r\n#### 3. **Encryption for Data Confidentiality**\r\n\r\nNHP employs symmetric encryption for data confidentiality during communication, but symmetric keys must be securely distributed and shared between entities. ECC plays a role in the secure distribution of these symmetric keys through ECDH, providing an encrypted communication channel where symmetric keys are exchanged securely.\r\n\r\nOnce these keys are exchanged, NHP switches to symmetric encryption for data transfer, benefiting from the speed and efficiency of symmetric encryption algorithms. ECC ensures that the symmetric key exchange is both secure and resource-efficient.\r\n\r\n#### 4. **Key Distribution and Management with Certificateless Public Key Cryptography (CL-PKC)**\r\n\r\nNHP also leverages ECC for key distribution and management using Certificateless Public Key Cryptography (CL-PKC). In traditional public key infrastructure, certificates are used to validate public keys, which introduces complexity in terms of certificate management. CL-PKC eliminates the need for certificates by allowing entities to generate partial private keys in collaboration with a trusted authority, while also generating their own key pairs independently.\r\n\r\nThis approach simplifies key management and ensures that public keys can be used securely without the overhead of certificate issuance and validation. By using ECC in CL-PKC, NHP provides a lightweight and secure means of key distribution, further enhancing the zero-trust model by removing dependencies on centralized certificate authorities.\r\n\r\n### The Advantages of Using ECC in NHP\r\n\r\nThe use of ECC within the NHP zero-trust protocol offers numerous advantages that make it well-suited to its security objectives:\r\n\r\n1. **Scalable Security**: ECC's smaller key sizes provide strong security, which scales well with the increasing computational power of adversaries. With NHP's goal of providing a zero-trust environment for diverse network deployments, ECC's scalability is a critical asset.\r\n\r\n2. **Resource Efficiency**: ECC reduces the computational burden on network devices compared to traditional public key cryptography. In environments where network resources may be constrained—such as edge devices or IoT components—this efficiency is essential for maintaining high performance without sacrificing security.\r\n\r\n3. **Improved Performance**: The combination of ECDH for key exchange, ECDSA for authentication, and efficient symmetric encryption provides a balanced solution for secure communications. This balanced approach allows NHP to achieve the goals of zero trust while keeping latency low, which is crucial in time-sensitive network applications.\r\n\r\n### Conclusion\r\n\r\nThe integration of Elliptic Curve Cryptography into the NHP Zero Trust Protocol provides a powerful means of securing network communications with minimal performance impact. By leveraging ECDH for secure key exchanges, ECDSA for robust authentication, and efficient symmetric encryption for data transfer, ECC supports the zero-trust model's goals of concealing network infrastructure, ensuring only trusted entities can access resources, and maintaining security with low overhead.\r\n\r\nAs cyber threats become more sophisticated, leveraging advanced cryptographic techniques like ECC in protocols like NHP is vital to staying ahead of attackers. The synergy between ECC and NHP not only helps protect critical network infrastructure but also ensures that security measures are both robust and efficient—a key combination for the success of any modern cybersecurity initiative.\r\n\r\n\r\n\r\n## 2) Key Exchange, Data Encryption and Identity Verification\r\n### 2.1 Introduction\r\nThe Network Infrastructure Hiding Protocol (NHP) is built around a zero-trust security model, ensuring secure communications even in the presence of potential attackers. To achieve this, NHP integrates the Noise Protocol Framework, a cryptographic framework designed for secure and flexible key exchange, data encryption, and identity verification. This combination provides robust security with minimal computational overhead.\r\n\r\n### 2.2 Key Exchange with Noise Protocol\r\nNHP utilizes the Noise Protocol's key exchange mechanism to ensure secure, authenticated communication channels between parties. The key exchange begins with a handshake phase where both communicating entities exchange Diffie-Hellman (DH) public keys. In Noise, each party generates an ephemeral key pair, and the exchanged keys are used to derive a shared secret, which is then used to encrypt the following communication.\r\n\r\nNoise allows NHP to support both long-term static keys and ephemeral keys for enhanced security. The flexibility of the Noise framework's handshake patterns enables NHP to customize how the handshake occurs based on the specific use case, providing options for mutual authentication, anonymous initiators, or encryption of the initial handshake itself. By leveraging Noise's simple yet powerful token-based handshake system, NHP can precisely control the sequence of key exchange messages while keeping identity information confidential.\r\n\r\n### 2.3 Data Encryption\r\nOnce the shared key is derived during the handshake, the Noise framework uses symmetric encryption to secure data. NHP takes advantage of the Noise CipherState and SymmetricState objects, which are core components of Noise's state machine, to manage encryption and decryption keys for the communication session.\r\n\r\nIn particular, the shared key is used to initialize a symmetric encryption key (k) along with a nonce (n) for encrypting data. Noise supports advanced encryption schemes like ChaCha20-Poly1305 or AESGCM, providing authenticated encryption with associated data (AEAD) to maintain data confidentiality and integrity. The chaining key (ck) and the handshake hash (h) are used to continuously derive fresh keys during the session, enhancing the forward secrecy and ensuring that a compromise of one key does not jeopardize other parts of the communication.\r\n\r\nNHP benefits from these cryptographic properties by providing encrypted tunnels for network data, ensuring that any intercepted data cannot be decrypted without knowledge of the derived keys, which are securely exchanged during the handshake.\r\n\r\n### 2.4 Identity Verification\r\nNoise provides mechanisms for identity verification by combining the exchange of static keys with Diffie-Hellman operations. In NHP, identity verification occurs during the handshake, where static keys are encrypted and verified through shared DH operations, effectively binding the public keys of both parties to the derived session key.\r\n\r\nDuring the handshake, Noise uses tokens such as \"s\" (static) and \"e\" (ephemeral) to indicate which keys are being exchanged and verified. This token-based approach allows NHP to selectively authenticate one or both parties depending on the specific use case. For example, the \"XX\" pattern in Noise provides mutual authentication, while the \"NK\" pattern allows for a one-sided authenticated handshake, giving NHP flexibility in how strictly identity verification is enforced.\r\n\r\nTo further protect identity information, Noise can encrypt static keys during the handshake. NHP leverages this feature to prevent an eavesdropper from discovering the identities of the participants, thus supporting the zero-trust model by ensuring that the identity of any participant is revealed only to the intended counterpart and not to third parties.\r\n\r\n### 2.5 Algorithms and Formulas\r\nThe cryptographic strength of NHP's integration with the Noise Protocol Framework is built on the use of well-defined algorithms and mathematical formulas. Here, we provide an overview of the key algorithms and their corresponding formulas that are used in NHP for key exchange, encryption, and identity verification.\r\n\r\n#### 2.5.1 Diffie-Hellman Key Exchange\r\nThe Diffie-Hellman (DH) key exchange is used to derive a shared secret between two parties, \\( A \\) and \\( B \\). Each party generates a private key (\\( a \\) for \\( A \\), \\( b \\) for \\( B \\)) and computes a public key by exponentiating a common generator \\( g \\) to their private key in a finite cyclic group of prime order \\( p \\):\r\n\r\n- \\( A \\) computes its public key: \\( A_{pub} = g^a \\mod p \\)\r\n- \\( B \\) computes its public key: \\( B_{pub} = g^b \\mod p \\)\r\n\r\nThe shared secret \\( s \\) is then computed by both parties using the other party's public key:\r\n\r\n- \\( A \\) computes: \\( s = B_{pub}^a \\mod p \\)\r\n- \\( B \\) computes: \\( s = A_{pub}^b \\mod p \\)\r\n\r\nThe resulting shared secret \\( s \\) is identical for both parties and is used to derive encryption keys.\r\n\r\n#### 2.5.2 Symmetric Encryption\r\nNHP uses symmetric encryption for data confidentiality. The key \\( k \\) and nonce \\( n \\) are used in the encryption function. For authenticated encryption with associated data (AEAD), the ChaCha20-Poly1305 algorithm is commonly used, which combines a stream cipher (ChaCha20) for encryption and a MAC (Poly1305) for authentication.\r\n\r\n- Encryption: \\( c = \text{ChaCha20}(k, n, \text{plaintext}) \\)\r\n- Authentication: \\( \text{tag} = \text{Poly1305}(k, \text{associated data} || c) \\)\r\n\r\nThe ciphertext \\( c \\) and the tag are transmitted together, ensuring both confidentiality and integrity.\r\n\r\n#### 2.5.3 Key Derivation and Hashing\r\nNoise uses a key derivation function (KDF) based on HMAC (Hash-based Message Authentication Code) to derive keys. The HKDF (HMAC-based Key Derivation Function) is used to produce multiple keys from the shared secret \\( s \\).\r\n\r\n- HKDF steps:\r\n  - \\( \text{temp\\_key} = \text{HMAC}(\text{chaining\\_key}, \text{input\\_key\\_material}) \\)\r\n  - \\( \text{output1} = \text{HMAC}(\text{temp\\_key}, 0x01) \\)\r\n  - \\( \text{output2} = \text{HMAC}(\text{temp\\_key}, \text{output1} || 0x02) \\)\r\n\r\nThe derived keys are used for encryption and maintaining the chaining key (\\( ck \\)) that evolves with each message, ensuring forward secrecy.\r\n\r\n#### 2.5.4 Identity Verification\r\nIdentity verification in NHP involves using static and ephemeral keys to authenticate parties. The Diffie-Hellman operations between static (\\( s \\)) and ephemeral (\\( e \\)) keys produce unique shared values that verify the identity of the participants.\r\n\r\n- For identity verification, a combination of DH operations is performed:\r\n  - \\( \text{ss} = DH(s_A, s_B) \\)\r\n  - \\( \text{es} = DH(e_A, s_B) \\) or \\( DH(s_A, e_B) \\)\r\n  - \\( \text{ee} = DH(e_A, e_B) \\)\r\n\r\nThese values are hashed together to derive the final session key, effectively binding the identities to the key exchange process and ensuring that only the intended parties can derive the correct session key.\r\n\r\n### 2.6 Summary\r\nNHP's implementation of the Noise Protocol Framework strengthens its zero-trust architecture by leveraging robust and well-tested cryptographic mechanisms for key exchange, data encryption, and identity verification. The modular nature of Noise allows NHP to adapt the handshake and encryption process based on the threat model, providing a high level of security against active and passive attacks. By incorporating Noise, NHP can maintain secure and authenticated communication channels while hiding the network infrastructure from attackers, achieving its goal of protecting network resources in hostile environments.\r\n\r\n## 3) Key Distribution and Management\r\n\r\n### 3.1 Introduction\r\n\r\nCertificateless Public Key Cryptography, originally introduced by Al-Riyami and Paterson in 2003, provides a hybrid solution that eliminates the need for a conventional Certificate Authority (CA) while ensuring strong cryptographic assurances. This article explores how NHP utilizes CL-PKC for efficient and secure key management without relying on certificates, which are typically seen as a vulnerability in many cryptographic systems.\r\n\r\nIn traditional Public Key Infrastructure (PKI), certificate authorities (CAs) serve as trusted third parties that issue and manage public key certificates to verify the authenticity of users' keys. While effective, this model introduces complexities and risks, such as dependency on the CA and exposure to attacks targeting these central entities. Certificateless Public Key Cryptography aims to mitigate these issues by eliminating the use of certificates while still ensuring the authenticity of public keys.\r\n\r\nIn a CL-PKC system, a trusted third party called the Key Generation Center (KGC) is responsible for generating partial private keys for users. However, unlike a CA, the KGC does not have access to the complete private keys, which makes it impossible for the KGC to impersonate users. Each user combines the partial key from the KGC with their own secret value to generate their full private key and public key. This approach reduces the trust placed on any single entity and provides an extra layer of security.\r\n\r\n### 3.2 Advantages of Using CL-PKC in NHP\r\n\r\n1. **Reduced Trust Requirements**: Unlike PKI, where trust in the CA is critical, CL-PKC reduces this trust requirement. The KGC cannot generate complete private keys on its own, meaning it cannot impersonate users or decrypt their communications.\r\n\r\n2. **Simplified Key Distribution**: There is no need for users to request or renew certificates, which eliminates many administrative burdens associated with traditional PKI.\r\n\r\n3. **Resistance to Key Compromise**: Since the user's full private key is generated in part by the user, compromising the KGC does not allow an adversary to fully recover user keys. This mitigates the impact of a successful attack on the key distribution infrastructure.\r\n\r\n4. **Scalability**: The certificateless nature of the system removes the need for managing large certificate databases, which simplifies scalability. This is particularly useful for IoT and other large-scale deployments where the overhead of certificate management would be prohibitive.\r\n\r\n### 3.3 Key Management in NHP Using Certificateless Cryptography\r\n\r\nThe NHP Zero Trust protocol integrates CL-PKC to manage the distribution and verification of keys for its secure communication framework. Below, we explain how the various mechanisms of CL-PKC contribute to the key management process in NHP.\r\n\r\n#### 3.3.1 Key Generation and Distribution\r\n\r\nIn NHP, the Key Generation Center (KGC) is responsible for creating system-wide parameters, including the master public-private key pair. The master private key is kept confidential by the KGC, while the master public key is distributed to all participants. When a new user wants to join the network, the KGC performs the following steps:\r\n\r\n1. **Partial Key Generation**: The KGC generates a partial private key for the user using their unique identifier (e.g., an email or other identity information). This ensures that each user’s partial key is bound to their identity, providing identity-based security.\r\n\r\n2. **User-Specific Key Pair Generation**: The user then selects their own secret value and combines it with the partial private key from the KGC to generate their full private key. The public key is computed from the combined secret, which means that while the KGC contributes to the key generation, it does not possess the complete private key.\r\n\r\nThis key distribution method ensures that the KGC cannot unilaterally determine a user's private key, mitigating the risks associated with compromised key generation authorities. Additionally, the lack of a need for traditional certificates means that users do not need to rely on external certificate authorities to validate keys, reducing the attack surface for man-in-the-middle (MITM) attacks.\r\n\r\n#### 3.3.2 Public Key Verification Without Certificates\r\n\r\nIn certificateless systems like the one implemented in NHP, the authenticity of public keys is verified through implicit methods, rather than relying on certificates signed by a CA. Specifically, the user's public key is computed using the system parameters, the user's identifier, and the KGC's master public key. This computation is deterministic and allows any party to verify the authenticity of a public key without needing to trust a CA or store a large database of certificates.\r\n\r\nBy removing the need for traditional certificates, NHP is able to streamline the key verification process, eliminating the need for certificate revocation lists (CRLs) and other PKI complexities. This approach not only reduces the communication overhead but also enhances the security by removing dependencies on a trusted third party that could be targeted by attackers.\r\n\r\n### 3.4 Algorithms in CL-PKC for NHP\r\n\r\nTo provide a clearer understanding of how the NHP protocol leverages Certificateless Public Key Cryptography, we describe the key algorithms involved along with their respective formulas.\r\n\r\n#### 3.4.1 System Parameter Generation\r\n\r\nThe Key Generation Center (KGC) is responsible for generating the system parameters that will be used across the network. These parameters include an elliptic curve \\( E \\) defined over a finite field \\( \\mathbb{F}_q \\), a base point \\( G \\) of prime order \\( n \\), and the master secret key \\( ms \\). The KGC computes the master public key \\( P_{pub} \\) as:\r\n\r\n\\[\r\nP_{pub} = [ms]G\r\n\\]\r\n\r\nwhere \\( [ms]G \\) denotes scalar multiplication of the base point \\( G \\) by the master secret \\( ms \\).\r\n\r\n#### 3.4.2 Partial Private Key Generation\r\n\r\nFor each user with a unique identifier \\( ID_A \\), the KGC generates a partial private key. First, the KGC computes a hash value \\( H_A \\) based on the user's identifier and system parameters:\r\n\r\n\\[\r\nH_A = H(ENTL_A \\parallel ID_A \\parallel a \\parallel b \\parallel x_G \\parallel y_G \\parallel x_{P_{pub}} \\parallel y_{P_{pub}})\r\n\\]\r\n\r\nwhere \\( ENTL_A \\) is a length value derived from the identifier, and \\( (x_G, y_G) \\) and \\( (x_{P_{pub}}, y_{P_{pub}}) \\) are the coordinates of points \\( G \\) and \\( P_{pub} \\), respectively.\r\n\r\nThe KGC then selects a random value \\( w \\in [1, n-1] \\) and computes:\r\n\r\n\\[\r\nW_A = [w]G + U_A\r\n\\]\r\n\r\nwhere \\( U_A = [d'_A]G \\) is a point generated by the user with their own secret value \\( d'_A \\).\r\n\r\nThe partial private key \\( t_A \\) is computed as:\r\n\r\n\\[\r\nt_A = (w + l \\cdot ms) \\mod n\r\n\\]\r\n\r\nwhere \\( l \\) is a hash value computed from the point \\( W_A \\) and the hash \\( H_A \\).\r\n\r\n#### 3.4.3 User Full Private Key Generation\r\n\r\nThe user generates their full private key \\( d_A \\) by combining the partial private key \\( t_A \\) with their secret value \\( d'_A \\):\r\n\r\n\\[\r\nd_A = (t_A + d'_A) \\mod n\r\n\\]\r\n\r\nThis ensures that only the user knows their complete private key.\r\n\r\n#### 3.4.4 Public Key Computation\r\n\r\nThe user’s public key \\( P_A \\) is computed as:\r\n\r\n\\[\r\nP_A = W_A + [l]P_{pub}\r\n\\]\r\n\r\nThis public key can be verified by anyone using the system parameters, the user’s identifier, and the KGC’s public key.\r\n\r\n#### 3.4.5 Signature Generation and Verification\r\n\r\nTo generate a digital signature on a message \\( M \\), the user computes a hash \\( e \\) as follows:\r\n\r\n\\[\r\ne = H(H_A \\parallel x_{W_A} \\parallel y_{W_A} \\parallel M)\r\n\\]\r\n\r\nThe signature \\( (r, s) \\) is generated using the user’s private key \\( d_A \\) and a random value \\( k \\):\r\n\r\n\\[\r\n[r]G = (x_1, y_1)\r\n\\]\r\n\\[\r\nr = x_1 \\mod n\r\n\\]\r\n\\[\r\ns = (k^{-1}(e + d_A \\cdot r)) \\mod n\r\n\\]\r\n\r\nTo verify the signature, the verifier computes \\( P_A \\) and then checks whether:\r\n\r\n\\[\r\n[r]G = [s]G + [e + r]P_A\r\n\\]\r\n\r\nIf the equality holds, the signature is valid.\r\n\r\n### 3.5 Conclusion\r\n\r\nNHP’s implementation of Certificateless Public Key Cryptography provides a powerful and efficient approach to key management in Zero Trust environments. By leveraging CL-PKC, NHP is able to mitigate the risks associated with traditional PKI, reduce the reliance on centralized trusted authorities, and simplify the key distribution process. The result is a more secure and scalable system that is well-suited for protecting critical network infrastructure in the face of evolving cyber threats.\r\n\r\nThe combination of certificateless cryptography and the Zero Trust principles of NHP makes it an attractive solution for securing network resources while minimizing the risks introduced by centralized authorities.\r\n\r\n\r\n"
  },
  {
    "path": "docs/deploy.md",
    "content": "---\nlayout: page\ntitle: How to Deploy\nnav_order: 6\npermalink: /deploy/\n---\n\n# Deploy OpenNHP Binaries\n{: .fs-9 }\n\nOpenNHP is cross-platform software that is easy to deploy.\n{: .fs-6 .fw-300 }\n\n[中文版](/zh-cn/deploy/){: .label .fs-4 }\n\n---\n\n## 1. OpenNHP Component Overview\n\nAfter following the build steps from the previous chapter, the build output is placed in the *release* directory. This directory contains three subdirectories for the three core OpenNHP components: *nhp-agent*, *nhp-server*, and *nhp-ac*.\n\n- **nhp-agent (Agent):** The module that initiates knock requests. Knock requests carry the identity and device information of the data accessor. Typically installed on end-user devices.\n\n- **nhp-server (Server):** The module that processes and validates knock requests. Usually runs as a server program. Its functions include validating knock requests, interacting with external authorization service providers for authentication, and controlling NHP-AC to open access.\n\n- **nhp-ac (Access Controller):** The access control enforcement module. Usually runs as a server program. This module enforces a default \"deny all\" security policy and ensures the protected resources remain invisible on the network. Typically located on the same host as the protected resources. Responsible for opening access to authorized NHP agents and closing access to agents that have lost authorization, executing pass-through actions based on parameters returned by the NHP server.\n\n## 2. Development/Test Environment Setup\n\n### 2.1 Environment: Windows/macOS Host + Linux Virtual Machines\n\nIf your development host runs Windows or macOS, you can create a simple OpenNHP test environment by installing a virtualization environment (such as VirtualBox) and creating two Linux virtual machines. When creating virtual machines, set the network adapter option to `\"Host-only Adapter\"` (as shown below), which places the VM IPs in the same network segment as the development host.\n\n![VirtualBox Network](/images/vbnetwork.png)\n\n**Tip:** If you need the VM to also have internet access, you can add an additional `\"NAT\"` network adapter:\n\n![VirtualBox Network NAT](/images/vbnetwork2.png)\n\nWith this setup, the three NHP components are deployed as follows:\n\n- **[nhp-server]** Runs on a Linux VM with IP address *192.168.56.101*\n- **[nhp-ac]** Runs on a Linux VM with IP address *192.168.56.102*\n- **[nhp-agent]** Runs on the Windows/macOS development host with IP address *192.168.56.1*\n\n### 2.2 Network Topology and Configuration\n\n![OpenNHP-Dev-WSL](/images/dev_wsl.png)\n\n| Server Name | IP Address | Configuration |\n|:--:|:--:|:--|\n| NHP-Server | 192.168.56.101 | **Public Key:** WqJxe+Z4+wLen3VRgZx6YnbjvJFmptz99zkONCt/7gc=<br/>**Private Key:** eHdyRHKJy/YZJsResCt5XTAZgtcwvLpSXAiZ8DBc0V4=<br/>**Hostname:** localhost<br/>**ListenPort:** 62206<br/>**aspId:** example |\n| NHP-AC | 192.168.56.102 | **Public Key:** Fr5jzZDVpNh5m9AcBDMtHGmbCAczHyPegT8IxQ3XAzE=<br/>**Private Key:** +B0RLGbe+nknJBZ0Fjt7kCBWfSTUttbUqkGteLfIp30=<br/>**ACId:** testAC-1<br/>Protected resource **resId:** test |\n| NHP-Agent | 192.168.56.1 | **Public Key:** WnJAolo88/q0x2VdLQYdmZNtKjwG2ocBd1Ozj41AKlo=<br/>**Private Key:** +Jnee2lP6Kn47qzSaqwSmWxORsBkkCV6YHsRqXCegVo=<br/>**UserId:** agent-0 |\n\n**Note:** Each component has corresponding configuration files that must be configured correctly for successful startup. See the \"Configuration Files\" sections below for each component.\n\n**Tip:** Starting from version 0.3.3, most fields in configuration files support dynamic updates. See the comments in each configuration file for details.\n\n### 2.3 NHP-Server Configuration and Deployment\n\n#### 2.3.1 NHP-Server System Requirements\n\n- Linux server or Windows\n\n#### 2.3.2 Running NHP-Server\n\nCopy the *nhp-server* directory from the *release* folder to the target machine. Configure the `toml` files in the *etc* directory (see next section for detailed parameters), then run `nhp-serverd run`.\n\n- Linux:\n\n   ```bash\n   nohup ./nhp-serverd run 2>&1 &\n   ```\n\n- Windows:\n\n   ```bat\n   nhp-serverd.exe run\n   ```\n\n*[Optional]* Hide UDP port exposure by running `iptables_default.sh`\n\n#### 2.3.3 NHP-Server Configuration Files\n\n- Base configuration: [config.toml](https://github.com/OpenNHP/opennhp/tree/main/server/main/etc/config.toml)\n- Access Controller peer list: [ac.toml](https://github.com/OpenNHP/opennhp/tree/main/server/main/etc/ac.toml)\n- Agent peer list: [agent.toml](https://github.com/OpenNHP/opennhp/tree/main/server/main/etc/agent.toml)\n- HTTP service configuration: [http.toml](https://github.com/OpenNHP/opennhp/tree/main/server/main/etc/http.toml)\n- Server plugin configuration: [resource.toml](https://github.com/OpenNHP/opennhp/tree/main/server/main/etc/resource.toml)\n- Source IP mapping list: [srcip.toml](https://github.com/OpenNHP/opennhp/tree/main/server/main/etc/srcip.toml)\n\n### 2.4 NHP-AC Configuration and Deployment\n\n#### 2.4.1 NHP-AC System Requirements\n\n- Linux server with kernel support for **ipset**. Check ipset support with:\n\n   ```bash\n   lsmod | grep ip_set\n   ```\n\n#### 2.4.2 Running NHP-AC\n\nCopy the *nhp-ac* directory from the *release* folder to the target machine. Configure the `toml` files in the *etc* directory (see next section for detailed parameters). Run `iptables_default.sh` to add firewall rules—at this point, external connections will be blocked. Then run `nhp-acd run`.\n\n**Note:** Both `nhp-acd` and `iptables_default.sh` require **root** privileges.\n\n- Linux:\n\n   ```bash\n   su\n   ./iptables_default.sh\n   nohup ./nhp-acd run 2>&1 &\n   ```\n\nTo revert the iptables changes made by `iptables_default.sh`, run:\n\n   ```bash\n   iptables -F\n   ```\n\n#### 2.4.3 NHP-AC Configuration Files\n\n- Base configuration: [config.toml](https://github.com/OpenNHP/opennhp/tree/main/ac/main/etc/config.toml)\n- Server peer list: [server.toml](https://github.com/OpenNHP/opennhp/tree/main/ac/main/etc/server.toml)\n\n### 2.5 NHP-Agent Configuration and Deployment\n\n#### 2.5.1 NHP-Agent System Requirements\n\n- All platforms: Windows, Linux, macOS, Android, iOS\n\n#### 2.5.2 Running NHP-Agent\n\nCopy the *nhp-agent* directory from the *release* folder to the target machine. Configure the `toml` files in the *etc* directory (see next section for detailed parameters), then run `nhp-agentd run`.\n\n- Linux:\n\n   ```bash\n   nohup ./nhp-agentd run 2>&1 &\n   ```\n\n- Windows:\n\n   ```bat\n   nhp-agentd.exe run\n   ```\n\n#### 2.5.3 NHP-Agent Configuration Files\n\n- Base configuration: [config.toml](https://github.com/OpenNHP/opennhp/tree/main/agent/main/etc/config.toml)\n- Knock target configuration: [resource.toml](https://github.com/OpenNHP/opennhp/tree/main/agent/main/etc/resource.toml)\n- Server peer list: [server.toml](https://github.com/OpenNHP/opennhp/tree/main/agent/main/etc/server.toml)\n\n### 2.6 Testing NHP Network Stealth\n\nTo verify NHP network stealth, perform an `nmap scan (using port 80 as an example)` from the nhp-agent host *(IP: 192.168.56.1)* against the nhp-ac host *(IP: 192.168.56.102)*. You can also perform scans from another VM (simulating an attacker) to observe the stealth effect.\n\n| Test Case | Command | Purpose | Expected Result |\n|:--:|:--:|:--:|:--:|\n| nhp-agent not running | `nmap -sS -p 80 192.168.56.102` | Test AC stealth from Agent | 80/tcp filtered |\n| nhp-agent running | `nmap -sS -p 80 192.168.56.102` | Test AC access for Agent | 80/tcp open |\n| nhp-agent running | `nmap -sS -p 80 192.168.56.102` | Test AC stealth from attacker | 80/tcp filtered |\n\n## 3. Docker Deployment (Quick Method)\n\nFor rapid setup and testing, OpenNHP provides a Docker-based deployment option.\n\n### 3.1 Prerequisites\n\n- Docker Desktop installed ([Mac](https://www.docker.com/products/docker-desktop/), [Windows](https://www.docker.com/products/docker-desktop/))\n- Git to clone the repository\n\n### 3.2 Quick Start Commands\n\n```bash\n# Clone the repository\ngit clone https://github.com/OpenNHP/opennhp.git\ncd opennhp\n\n# Build the base image\ncd docker\ndocker build --no-cache -t opennhp-base:latest -f Dockerfile.base ../..\n\n# Start all services\ndocker compose up -d\n```\n\n### 3.3 Docker Network Topology\n\n| Container | IP | Description |\n|-----------|-------------|-------------|\n| NHP-Agent | 177.7.0.8 | Runs nhp-agentd & nginx |\n| NHP-Server | 177.7.0.9 | Runs nhp-serverd on port 62206 |\n| NHP-AC | 177.7.0.10 | Runs nhp-acd & Traefik |\n| Web App | 177.7.0.11 | Protected application on port 8080 |\n\nFor detailed Docker testing scenarios and verification steps, see the [NHP Quick Start Guide](/nhp_quick_start/).\n\n## 4. Production Deployment Considerations\n\n### 4.1 Architecture Overview\n\n![Infrastructure](/images/infrastructure.jpg)\n\nFor high-availability deployments, consider:\n\n![High Availability](/images/High-availability.png)\n\n### 4.2 Security Hardening\n\n1. **Key Management**\n   - Generate unique keys for each component using `nhp-serverd keygen`, `nhp-acd keygen`, `nhp-agentd keygen`\n   - Never reuse keys across environments\n   - Rotate keys periodically and update peer configuration files\n\n2. **TLS Configuration**\n   - Enable HTTPS in `http.toml` with valid TLS certificates\n   - Configure `TLSCertFile` and `TLSKeyFile` paths\n   - Use certificates from a trusted CA for production\n\n3. **Network Security**\n   - Run `iptables_default.sh` before starting NHP-AC to ensure deny-all policy\n   - Consider eBPF/XDP mode (`FilterMode = 1`) for high-performance packet filtering\n   - Restrict management interfaces to internal networks only\n\n### 4.3 Deployment Checklist\n\n**Pre-deployment:**\n- [ ] Keys generated for all components\n- [ ] Peer public keys exchanged and configured\n- [ ] Configuration files validated\n- [ ] TLS certificates in place (for HTTPS)\n- [ ] System time synchronized across all hosts\n\n**Post-deployment:**\n- [ ] Verify NHP-Server is listening on UDP 62206\n- [ ] Verify NHP-AC iptables rules are active (`iptables -L`)\n- [ ] Test knock sequence from NHP-Agent\n- [ ] Verify stealth with nmap from unauthorized host\n- [ ] Check log files for errors\n\n### 4.4 Configuration Parameters Reference\n\nKey configuration parameters across components:\n\n| Parameter | Component | Description |\n|-----------|-----------|-------------|\n| `PrivateKeyBase64` | All | Base64-encoded private key (static, requires restart) |\n| `ListenPort` | Server | UDP listening port, default 62206 (static) |\n| `LogLevel` | All | 0=silent, 1=error, 2=info, 3=audit, 4=debug, 5=trace |\n| `DefaultCipherScheme` | All | 0=Curve25519, 1=SM2 |\n| `FilterMode` | AC | 0=IPTables, 1=eBPF/XDP |\n| `ExpireTime` | Peer configs | Epoch timestamp when peer key expires |\n\nMost configuration fields support dynamic updates without restart. See configuration file comments for details.\n\n## 5. Logging\n\n### 5.1 Log File Locations\n\nLog files are generated in each component's *logs* directory, named by date. View logs using `tail`:\n\n- NHP-Server logs:\n\n   ```bash\n   tail -f release/nhp-server/logs/server-2024-03-10.log\n   ```\n\n- NHP-AC logs:\n\n   ```bash\n   tail -f release/nhp-ac/logs/ac-2024-03-10.log\n   ```\n\n- NHP-Agent logs:\n\n   ```bash\n   tail -f release/nhp-agent/logs/agent-2024-03-10.log\n   ```\n\n### 5.2 Log Format\n\nLog format:\n```text\nTimestamp CodeLocation ComponentName [LogLevel] LogMessage\n```\n\nLog levels:\n- Error\n- Critical\n- Warning\n- Info\n- Debug\n\n## 6. Troubleshooting FAQ\n\n- **Q:** Windows build error: `running gcc failed: exec: \"gcc\": executable file not found in %PATH%`\n  **A:** GCC compiler is not installed. Follow the GCC installation steps in the build documentation.\n\n- **Q:** Log shows error: `NHP-AC [Critical] received stale packet from 192.168.56.101:62206, drop packet`\n  **Cause:** The receiver requires packets to be received within 10 minutes of being sent.\n  **Fix:** Synchronize system time between machines.\n\n- **Q:** How do I adjust the access duration after authentication? How do I restrict access to specific ports?\n  **A:** In the corresponding plugin module under `nhp-server/plugins/`, find `etc/resource.toml`. This file configures resource ports, duration, ID, etc. For nhp-agent knocking, the default plugin is `example`. For WeChat QR code knocking, use the `wxweb` plugin.\n\n- **Q:** How do I verify configuration is working?\n  **A:** Check server and AC logs. You can also run `ipset -L` on the AC to view authorized source IPs, destination ports, and durations.\n\n- **Q:** nhp-agent knock succeeds but cannot access the resource.\n  **Possible cause:** The resource target IP in the ipset record added by nhp-server to nhp-ac doesn't match the requested resource. This can occur when the resource and nhp-ac are on the same server.\n\n  Manual ipset rule for debugging:\n  ```bash\n  sudo ipset add defaultset [SourceIP],tcp:80,[ResourceIP]\n  ```\n  - *SourceIP*: The agent's public IP (verify via tcpdump or ipset list)\n  - *ResourceIP*: The resource IP from `nhp-server/plugins/example/etc/resource.toml`\n\n  If the IPs don't match, knocking succeeds but access fails.\n\n  Debug with packet capture on nhp-ac:\n  ```bash\n  tcpdump -i any port 80\n  ```\n\n  **Solution:** Configure the correct IP in `nhp-server/plugins/example/etc/resource.toml` under `Addr.Ip`.\n"
  },
  {
    "path": "docs/dhp_quick_start.md",
    "content": "---\ntitle: DHP Quick Start\nlayout: page\nnav_order: 3\npermalink: /dhp_quick_start/\n---\n\n# DHP Quick Start\n{: .fs-9 }\n\nA locally built Docker debugging environment, simulating nhp-server, nhp-db and nhp-agent. This environment can be used for:\n{: .fs-6 .fw-300 }\n\n- Quickly understanding how opendhp works\n- Basic logic validation\n{: .fs-6 .fw-300 }\n\n[中文版](/zh-cn/dhp_quick_start/){: .label .fs-4 }\n\n---\n\n## 1. Overview\n\nThe primary purpose of OpenDHP is to enforce data sovereigenty, ensure data invisibility while maintaining availability, and uphold data privacy throughout the entire data lifecycle.\n\nThis Quick Start guide helps developers rapidly set up the OpenDHP Docker environment, build the source code, and test key features of OpenDHP. The environment is designed to be lightweight and easy to use, making it ideal for developers who want to quickly test and debug OpenDHP.\n\n### 1.1 Architecture\n![Architecture](/images/OpenDHP_Arch_EN.png)\n\n#### 1.1.1 Network Topology\n\n| Container Name      | IP            | Description                                                                                               |\n| ------------------  | ------------  | --------------------------------------------------------------------------------------------------------- |\n| NHP-Agent           | 177.7.0.8     | Runs nhp-agentd. Port mapping: 443→Host: 8443                                                             |\n| NHP-Server          | 177.7.0.9     | Runs nhp-serverd with exposed port 62206                                                                  |\n| NHP-DB              | 177.7.0.12    | Runs nhp-db. Used to publish data                                                                         |\n\n### 1.2 Test Scenario\n#### 1.2.1 Scenario Description\nTo enhance the comprehensiveness and accuracy of identifying risk-involved accounts, in addition to internal risk-control identification, banks can also conduct joint verification by using the information of risk-involved accounts provided by other banks, payment institutions, public security departments, or regulatory platforms. To ensure data security and user privacy, all participating parties use confidential computing technology to collaboratively determine whether a certain account has risk-related behaviors, thus avoiding the direct exposure of user data in plaintext.\n#### 1.2.2 Scenario Architecture\n![Scenario Architecture](/images/OpenDHP_Scenario_EN.png)\n\n## 2. Installing Docker Environment\nFor this part, please refer to the corresponding chapter in [NHP Quick Start](/quick_start) for details.\n\n## 3. Running and configuring the Environment\n\nThe following startup command will build nhp-server, nhp-db, and nhp-agent images during the startup process.\n\n### 3.1 Start All Services\n\n```shell\ncd ./docker\ndocker compose -f docker-compose.dhp.yaml up -d\n```\n\n### 3.2 Start nhp-agent with DHP mode\nSince nhp-agent does not start by default, you need to start it manually.\n```shell\ndocker exec -it nhp-agent /bin/bash\n/nhp-agent/nhp-agentd dhp\n```\n\n### 3.3 Start nhp-db\nSince nhp-db does not start by default, you need to start it manually.\n```shell\ndocker exec -it nhp-db /bin/bash\n/nhp-db/nhp-db run\n```\n\n### 3.4 Configure DHP-related parameters\nSince agent and tee key is generated during the 1st startup, you need to configure agent public key in nhp-server for trustworthiness, tee public key in nhp-db for trustworthiness. In addition, you need to configure trusted execution environment in nhp-server for appraising attestation report.\n#### 3.4.1 Configure agent public key in nhp-server\nWith this default docker environment, 8443 port is exposed to host for nhp-agent. So, you can access nhp-agent http endpoints from host using https://localhost:8443. You can use below curl command to get agent public key.\n```shell\ncurl --insecure https://localhost:8443/api/v1/key/agent\n{\"publicKey\":\"f+HWVbhQ6ZR3e+INU7ZSGyn3XNls5TUdbZWlPmj/1v890WLDW7RcnnbJmqqufymK+Yb99dadX+PlhK4qFYxtOg==\"}\n```\nNext, you need to configure agent public key in nhp-server.\n```shell\ndocker exec -it nhp-server /bin/bash\nvi /nhp-server/etc/agent.toml\n# list the agent peers for the server under [[Agents]] table\n\n# PubKeyBase64: public key for the agent in base64 format.\n# ExpireTime (epoch timestamp in seconds): peer key validation will fail when it expires.\n[[Agents]]\nPubKeyBase64 = \"f+HWVbhQ6ZR3e+INU7ZSGyn3XNls5TUdbZWlPmj/1v890WLDW7RcnnbJmqqufymK+Yb99dadX+PlhK4qFYxtOg==\"\nExpireTime = 1924991999\n```\nAfter configuring the agent public key, you can check agent status with the following curl command:\n```shell\ncurl --insecure https://localhost:8443/api/v1/status/agent\n{\"attestationVerified\":false,\"running\":true,\"trustedByNHPDB\":false,\"trustedByNHPServer\":true}\n```\nYou will see that trustedByNHPServer is true which means the agent is trusted by the NHP server.\n#### 3.4.2 Configure TEE attestation in nhp-server\nYou can use below curl command to get TEE attestation report.\n\n**Notes:** The attestation report is generated according to container information in non-TEE environment, non-TEE environment is only for test purpose.\n\n```shell\ncurl --insecure https://localhost:8443/api/v1/attestation/tee\n{\"measure\":\"3460bc69b9d273ad15c91074d8fd41abc5d5ccac50730d2e0495d08558848e34\",\"serial number\":\"3460bc69b9d273ad15c91074d8fd41abc5d5ccac50730d2e0495d08558848e34\"}\n```\nNext, you need to configure attestation in nhp-server.\n```shell\ndocker exec -it nhp-server /bin/bash\nvi /nhp-server/etc/tee.toml\n# list trusted execution environments under [[TEEs]] table\n\n# Measure: cryptographic hashes that ensure the integrity of software and data within the TEE.\n# SerialNumber: unique serial number of the TEE.\n\n[[TEEs]]\nMeasure = \"19178a674248bbca705863bbf75ecaa049fcf3dfcc5ff59a80dcc5cbb60dae59\"\nSerialNumber = \"TMEX300023050201\"\n\n[[TEEs]]\nMeasure = \"3460bc69b9d273ad15c91074d8fd41abc5d5ccac50730d2e0495d08558848e34\"\nSerialNumber = \"3460bc69b9d273ad15c91074d8fd41abc5d5ccac50730d2e0495d08558848e34\"\n```\nAfter configuring the agent public key, you can check agent status with the following curl command:\n```shell\ncurl --insecure https://localhost:8443/api/v1/status/agent\n{\"attestationVerified\":true,\"running\":true,\"trustedByNHPDB\":false,\"trustedByNHPServer\":true}\n```\nYou will see that attestationVerified is true which means TEE is trusted by the NHP server.\n#### 3.4.3 Configure TEE public key in nhp-db\n You can use below curl command to get TEE public key.\n```shell\ncurl --insecure https://localhost:8443/api/v1/key/tee\n{\"publicKey\":\"pup5OzTTZjddv+WBgbUBkvHuBgJoBg0DU+I2c7Qj4lHlrVM8N/Yl9F6DEnbGFBWB89xrN6VLhYAIM4Xv+mu4KA==\"}\n```\nNext, you need to configure TEE public key in nhp-db.\n```shell\ndocker exec -it nhp-db /bin/bash\nvi /nhp-db/etc/tee.toml\n# Configuration for trusted execution environment.\n\n# TEEPublicKeyBase64: base64 encoded public key of TEE (Trusted Execution Environment).\n[[TEEs]]\nTEEPublicKeyBase64 = \"pup5OzTTZjddv+WBgbUBkvHuBgJoBg0DU+I2c7Qj4lHlrVM8N/Yl9F6DEnbGFBWB89xrN6VLhYAIM4Xv+mu4KA==\"\nExpireTime = 1924991999\n```\n## 4. Testing with risk-involved account scenario\n### 4.1 Publishing data resource\nYou can publish a data resource with the following command:\n```shell\ndocker exec -it nhp-db /bin/bash\ncd /nhp-db\n./nhp-db run --mode encrypt --data-source-type online --source ./demo/risk.involved.accounts.csv --output ./risk.involved.accounts.csv.demo.ztdo --smart-policy ./demo/smart.policy.json --metadata ./demo/metadata.json\n```\nIf the message `Successfully register or update data object which doId is <doId>.` is printed, it means the data resource has been published successfully.\n\n### 4.2 Requesting data resource\n#### 4.2.1 Write and Compile trusted application\nTo enable easy and unified communication with the trusted application, we use the Model Context Protocol (MCP). This means the trusted application is implemented as an MCP server, while the client, built into the NHP Agent, acts as the MCP client to communicate with the trusted application. Since the MCP framework is supported by almost all programming languages, implementing a trusted application in any language is easy and straightforward.\n\nFollowing is a simple example of a trusted application written in Golang, and it is used in this demonstration.\n```go\npackage main\n\nimport (\n\t\"context\"\n\t\"encoding/csv\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\n\t\"github.com/mark3labs/mcp-go/mcp\"\n\t\"github.com/mark3labs/mcp-go/server\"\n)\n\nfunc main() {\n    s := server.NewMCPServer(\"trusted application\", \"1.0.0\",\n        server.WithToolCapabilities(true),\n    )\n\n    s.AddTool(\n        mcp.NewTool(\"verify_account\",\n            mcp.WithDescription(\"Verify account to check whether there are any risk factors associated with the account\"),\n            mcp.WithString(\"path\",\n                mcp.Required(),\n                mcp.Description(\"path to file which records the account details\"),\n            ),\n            mcp.WithString(\"account_id\",\n                mcp.Description(\"account id\"),\n\t\t\t\tmcp.Required(),\n            ),\n        ),\n        verifyAccountHandler,\n    )\n\n    // Start STDIO server\n    if err := server.ServeStdio(s); err != nil {\n        fmt.Fprintf(os.Stderr, \"Server error: %v\\n\", err)\n        os.Exit(1)\n    }\n}\n\nfunc verifyAccountHandler(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {\n    path, err := req.RequireString(\"path\")\n    if err != nil {\n        return mcp.NewToolResultError(err.Error()), nil\n    }\n\n    accountId, err := req.RequireString(\"account_id\")\n    if err != nil {\n        return mcp.NewToolResultError(err.Error()), nil\n    }\n\n\tis_risk, err := findRecord(path, accountId)\n\tif err != nil {\n\t\treturn mcp.NewToolResultError(err.Error()), nil\n\t}\n\n    return mcp.NewToolResultText(fmt.Sprintf(`{\"account_id\":\"%s\",\"is_risk\": %t}`, accountId, is_risk)), nil\n}\n\nfunc findRecord(path string, accountId string) (bool, error) {\n\tf, err := os.Open(path)\n\tif err != nil {\n\t\treturn false, err\n\t}\n\tdefer f.Close()\n\n\tr := csv.NewReader(f)\n\tr.Comma = ','\n\n\tfor {\n\t\trecord, err := r.Read()\n\t\tif err != nil {\n\t\t\tif err == csv.ErrFieldCount {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tif err == io.EOF {\n\t\t\t\treturn false, nil\n\t\t\t}\n\n\t\t\treturn false, err\n\t\t}\n\n\t\tif record[0] == accountId {\n\t\t\treturn true, nil\n\t\t}\n\t}\n}\n```\nSuppose we have built it as binary which name is `ta`.\n\n#### 4.2.2 Register trusted application\nYou can use following command to register trusted application:\n```shell\ncurl --insecure --request POST --url https://localhost:8443/api/v1/ta/register --header 'content-type: multipart/form-data' --form file=@ta --form 'description=trusted application demo'\n[\n  {\n    \"method\": \"POST\",\n    \"name\": \"/api/v1/ta/ceca4572-644b-4bde-a4b6-ac6048f8fba6/verify_account\",\n    \"description\": \"Verify account to check whether there are any risk factors associated with the account\",\n    \"params\": [\n      {\n        \"name\": \"doId\",\n        \"description\": \"identifier of the data object\",\n        \"type\": \"string\"\n      },\n      {\n        \"name\": \"account_id\",\n        \"description\": \"account id\",\n        \"type\": \"string\"\n      }\n    ]\n  }\n]\n```\nAfter success registration, you can get the HTTP RESTful API which is exposed by trusted application.\n\n#### 4.2.3 Execute task\nYou can invoke those exposed RESTful API to perform privacy-preserving compututation using following curl command:\n```shell\ncurl --insecure --request POST --url https://localhost:8443/api/v1/ta/ceca4572-644b-4bde-a4b6-ac6048f8fba6/verify_account --header 'content-type: application/json' --data '{\"doId\": \"47d2b67c-ef80-45fc-814d-effd23baf788\", \"account_id\": \"62230121012345678901\"}'\n```\nAfter execution, you will get response `{\"account_id\":\"62230121012345678901\",\"is_risk\":false}` which means the account is not a risk-involved account.\n\nSince the NHP Agent, the trusted application, and the data are all protected by a Trusted Execution Environment (TEE), the data resource consumer CAN NOT access the data resource directly. Instead, all interactions with the data MUST go through controlled and verified execution within the TEE, ensuring that the data remains confidential and is only processed according to the associated smart data policy. Then entire design of DHP guarantees that the consumer can use the data without ever seeing or extracting the raw content.\n"
  },
  {
    "path": "docs/features.md",
    "content": "---\nlayout: page\ntitle: Features\nnav_order: 3\npermalink: /features/\n---\n\n# OpenNHP Feature List\n{: .fs-9 }\n\nOpenNHP offers robust security, excellent performance, and scalability to protect your network resources.\n{: .fs-6 .fw-300 }\n\n[中文版](/zh-cn/features/){: .label .fs-4 }\n\n---\n\n- **Mitigate vulnerability risk:** The openness of TCP/IP protocols leads to a \"trust by default\" connection model, allowing anyone to establish a connection to a server port that provides services. Attackers exploit this openness to target server vulnerabilities. The NHP protocol implements the zero trust principle \"never trust, always verify\" by enforcing \"deny-all\" rules by default on the server side, only allowing authorized hosts to establish connections. This effectively mitigates vulnerability exploitation, particularly zero-day exploits.\n- **Mitigate phishing attacks:** DNS hijacking is a serious threat to internet security and is used for malicious purposes such as phishing, stealing sensitive information, or spreading malware. The NHP protocol can function as an encrypted DNS resolution service to mitigate this problem. When the NHP-Agent on the client side sends a knock request to the controller component NHP-Server with the identifier (e.g., the domain name) of the protected resource, the NHP-Server will return the IP address and port number of the protected resource if the NHP-Agent is successfully authenticated. Since NHP communication is encrypted and mutually verified, the risk of DNS hijacking is effectively mitigated.\n- **Mitigate DDoS attacks:** As mentioned above, a client cannot obtain the IP address and port number of protected resources without authentication. If the protected resources are distributed across multiple locations, the NHP server may return different IP addresses to different clients, making DDoS attacks significantly more difficult and expensive to execute.\n- **Attack attribution:** The connection model of TCP/IP protocols is IP-based. With NHP, the connection model becomes identity (ID)-based. The connection initiator's identity must be authenticated before establishing the connection, making attacks much more identifiable and traceable. \n- **Default-deny access control**: All resources are hidden by default, only becoming accessible after authentication and authorization.\n- **Identity and device-based authentication**: Ensures that only known users on approved devices can gain access.\n- **Encrypted DNS resolution**: Prevents DNS hijacking and associated phishing attacks.\n- **DDoS mitigation**: Distributed infrastructure design helps protect against Distributed Denial of Service attacks.\n- **Scalable architecture**: Decoupled components allow for flexible deployment and scaling.\n- **IAM integration**: Works with your existing Identity and Access Management systems.\n- **Flexible deployment**: Supports various models including client-to-gateway, client-to-server, and more.\n- **Strong cryptography**: Utilizes modern algorithms like ECC, Noise Protocol, and IBC for robust security.\n- Mitigates vulnerability exploitation by enforcing \"deny-all\" rules by default\n- Prevents phishing attacks through encrypted DNS resolution\n- Protects against DDoS attacks by hiding infrastructure\n- Enables attack attribution through identity-based connections\n- Default-deny access control for all protected resources\n- Identity and device-based authentication before network access\n- Encrypted DNS resolution to prevent DNS hijacking\n- Distributed infrastructure to mitigate DDoS attacks\n- Scalable architecture with decoupled components\n- Integration with existing identity and access management systems\n- Support for various deployment models (client-to-gateway, client-to-server, etc)\n- Cryptographically secure using modern algorithms (ECC, Noise Protocol, IBC)\n\n"
  },
  {
    "path": "docs/index.md",
    "content": "---\ntitle: Overview\nlayout: home\nnav_order: 1\ndescription: \"OpenNHP: Zero Trust Network-infrastructure Hiding Protocol\"\npermalink: /\n---\n\n# OpenNHP Documentation\n{: .fs-9 }\n\nA lightweight cryptography-driven zero trust networking protocol at the OSI 5th layer to hide your server and data from attackers.\n{: .fs-6 .fw-300 }\n\n[中文版](/zh-cn/){: .label .fs-4 }\n\n---\n\n## 1. OpenNHP Architecture\n\nThe OpenNHP architecture is inspired by the NIST Zero Trust Architecture standard. It follows a modular design with the following core components: \n\n![OpenNHP architecture](./images/OpenNHP_Arch.png)\n\n\n### 2. OpenNHP Core Components:\n#### 2.1 NHP-Agent\n\nThe NHP-Agent is a client-side component that initiates communication and requests access to protected resources. It can be implemented as:\n\n- A standalone client application\n- An SDK integrated into existing applications\n- A browser plugin\n- A mobile app\n\nThe agent is responsible for:\n\n- Generating and sending knock requests to the NHP-Server\n- Maintaining secure communication channels\n- Handling authentication flows\n\n#### 2.2 NHP-Server\n\nThe NHP-Server is the central controller that:\n\n- Processes and validates knock requests from agents\n- Interacts with the Authorization Service Provider for policy decisions\n- Manages NHP-AC components to allow/deny access\n- Handles key management and cryptographic operations\n\nIt can be deployed in a distributed or clustered configuration for high availability and scalability.\n\n#### 2.3 NHP-AC\n\nNHP-AC (Access Control) components enforce access policies on protected resources. Key functions:\n\n- Implement default deny-all rules\n- Open/close access based on NHP-Server instructions\n- Ensure network invisibility of protected resources\n- Log access attempts\n\n### 3. Components that interact with OpenNHP: \n- **Protected Resources:** The resource provider is responsible for protecting these resources, such as API interfaces, application servers, gateways, routers, network devices, etc. In the SDP scenario, the Protected Resources are the SDP Gateway and Controller. \n- **Authorization Service Provider (ASP):** This provider validates access policies and provides the actual access addresses of Protected Resources. In the SDP Scenario, the ASP may be the SDP Controller. \n\n### 4. Workflow\n\nThe workflow of OpenNHP is illustrated as the below diagram. \n![OpenNHP Workflow](./images/nhp_workflow.png)\n\n1. `NHP-Agent` sends knock request to `NHP-Server`\n2. `NHP-Server` validates request and retrieves agent info\n3. `NHP-Server` queries Authorization Service Provider\n4. If authorized, `NHP-Server` instructs `NHP-AC` to allow access\n5. `NHP-AC` opens connection and notifies `NHP-Server`\n6. `NHP-Server` provides resource access details to `NHP-Agent`\n7. `NHP-Agent` can now access the protected resource\n8. Access is logged for auditing purposes\n"
  },
  {
    "path": "docs/nhp_quick_start.md",
    "content": "---\ntitle: NHP Quick Start\nlayout: page\nnav_order: 2\npermalink: /nhp_quick_start/\n---\n\n# NHP Quick Start\n{: .fs-9 }\n\nA locally built Docker debugging environment, simulating nhp-server, nhp-ac, traefik, web-app, etc. This environment can be used for:\n{: .fs-6 .fw-300 }\n\n- Quickly understanding how opennhp works\n- Plugin debugging\n- Basic logic validation\n- Partial performance stress testing\n{: .fs-6 .fw-300 }\n\n[中文版](/zh-cn/nhp_quick_start/){: .label .fs-4 }\n\n---\n\n## 1. Overview\n\nThis Quick Start guide helps developers rapidly set up the OpenNHP Docker environment, build the source code, and test key features of OpenNHP. Whether you’re exploring how OpenNHP makes servers “invisible” to unauthorized scans or integrating it into existing Zero Trust architectures, this guide provides the essential steps to get you up and running quickly.\n\n### 1.1 Network Topology\n\n![Workflow](https://docs.opennhp.org/images/infrastructure.jpg)\n\n| Container Name      | IP            | Description                                                                                               |\n| ------------------  | ------------  | --------------------------------------------------------------------------------------------------------- |\n| NHP-Agent           | 177.7.0.8     | Runs nhp-agentd & nginx (both disabled by default). Port mapping: 443→AC:80, 80→NHP-Server:62206          |\n| NHP-Server          | 177.7.0.9     | Runs nhp-serverd with exposed port 62206                                                                  |\n| NHP-AC              | 177.7.0.10    | Runs nhp-acd & traefik. All ports blocked by default                                                      |\n| Web App             | 177.7.0.11    | Protected web application. Only allows NHP-AC access on port 8080                                         |\n\n### 1.2 Test Scenarios\n\n| State         | Expected Result                                                                                           |\n| ------------- | --------------------------------------------------------------------------------------------------------- |\n| Scenario 1    | Invisibility (for unauthorized users), Ping or direct access to NHP-AC Server's proxied Web-app fails      |\n| Scenario 2    | After \"knocking\" via NHP-Agent, can successfully access the NHP-AC protected Web-app                      |\n| Scenario 3    | After web identity authentication \"knock\", can successfully access the NHP-AC protected Web-app            |\n\n## 2. Installing Docker Environment\n\n### 2.1 Docker Desktop for Mac\n\n```shell\nbrew install --cask docker\n```\n\nAlternative: Download the .dmg package directly from Docker's official website:\n<https://www.docker.com/products/docker-desktop/>\n\n### 2.2 Docker Desktop for Windows\n\n- System Requirements:\n  - Windows 10/11 (64-bit, Pro/Enterprise/Home editions)\n  - WSL 2 enabled (recommended) or Hyper-V\n\n- Installation Steps:\n  - Download Docker Desktop from the official website\n  - Run the installer and follow the setup wizard\n\nLaunch Docker Desktop after installation completes\n\n## 3. Building base images from Source Code\n\n### 3.1 Clone the latest code\n\n```shell\ngit clone https://github.com/OpenNHP/opennhp.git\n```\n\n### 3.2 Quick Start Script (Recommended)\n\nThe easiest way to build and manage the Docker environment is using the `quick_start.sh` script:\n\n```shell\ncd ./docker\n\n# Run the interactive menu\n./quick_start.sh\n\n# For users in China, use --china flag to enable mirrors\n./quick_start.sh --china\n```\n\nThe script provides an interactive menu with the following options:\n\n| Option | Description |\n| ------ | ----------- |\n| **1** | **Build ALL and Start (Recommended for first-time users)** |\n| 2 | Build Base Image (opennhp-base) |\n| 3 | Build NHP-Server |\n| 4 | Build NHP-AC |\n| 5 | Build NHP-Agent |\n| 6 | Build Web-App |\n| 7 | Start All Services |\n| 8 | Stop All Services |\n| 9 | Restart All Services |\n| 10-12 | View Logs (nhp-server/nhp-ac/nhp-agent) |\n| 13 | Clean Docker Images |\n| 14 | Clean ALL (images + volumes + networks) |\n| 15 | Toggle China Mirror |\n\n### 3.3 Manual Build: opennhp-base Docker Image\n\nIf you prefer manual commands:\n\n```shell\ncd ./docker\ndocker build --no-cache -t opennhp-base:latest -f Dockerfile.base ..\n```\n\n**Build Arguments:**\n\nYou can override `GO_VERSION` and `GOPROXY` by adding build arguments:\n\n```shell\n# For users in China, use goproxy.cn and mirrors.aliyun.com for faster downloads\ndocker build --build-arg GOPROXY=https://goproxy.cn,direct --build-arg APT_MIRROR=mirrors.aliyun.com --no-cache -t opennhp-base:latest -f Dockerfile.base ..\n\n# To specify a different Go version (default: 1.25.6)\ndocker build --build-arg GO_VERSION=1.25.6 --no-cache -t opennhp-base:latest -f Dockerfile.base ..\n```\n\n**Troubleshooting - BuildKit Builder Issue:**\n\nIf `docker compose build` fails with error like `pull access denied, repository does not exist`, it may be because your Docker is using a `docker-container` buildx builder which cannot access local images. Fix it by switching to the default builder:\n\n```shell\n# Check current builder\ndocker buildx ls\n\n# Switch to docker driver builder\ndocker buildx use desktop-linux\n# or\ndocker buildx use default\n```\n\n## 4. Running and Testing the Environment\n\nThe following startup command will build nhp-server, nhp-ac, web-app, and nhp-agent images during the startup process.\n\n### 4.1 Start All Services\n\n**Using quick_start.sh (Recommended):**\n\n```shell\ncd ./docker\n./quick_start.sh          # Select option [7] Start All Services\n./quick_start.sh --china  # For users in China\n```\n\n**Using docker compose directly:**\n\n```shell\ncd ./docker\ndocker compose up -d\n```\n\nFor users in China, pass `GOPROXY` and `APT_MIRROR` environment variables for faster builds:\n\n```shell\nGOPROXY=https://goproxy.cn,direct APT_MIRROR=mirrors.aliyun.com docker compose up -d\n```\n\n### 4.2 Scenario 1: Invisibility (for unauthorized users)\n\nEnter the nhp agentd container for verification\n\n```shell\ncd ./docker\ndocker exec -it nhp-agent bash\n```\n\nBy default, the following error occurs when using curl NHP-AC (under protection)\n\n```shell\nroot@68a230812459:/workdir# curl -i  http://177.7.0.10\ncurl: (28) Failed to connect to 177.7.0.10 port 80: Connection timed out\n```\n\nPort scan verification, enter the NHP Agent container and install nmap\n\n```shell\nroot@ee88ec992447:/# docker exec -it nhp-agent bash\nroot@ee88ec992447:/# apt-get update && apt-get install -y nmap\n```\n\nScanning NHP-AC through NHP-Agent cannot detect any ports\n\n```shell\nroot@ee88ec992447:/# nmap 177.7.0.10\nStarting Nmap 7.93 ( https://nmap.org ) at 2025-07-03 07:33 UTC\nNmap scan report for nhp-ac.docker_nginx (177.7.0.10)\nHost is up (0.000044s latency).\nAll 1000 scanned ports on nhp-ac.docker_nginx (177.7.0.10) are in ignored states.\nNot shown: 1000 filtered tcp ports (no-response)\nMAC Address: 12:B4:5C:EB:72:F4 (Unknown)\n\nNmap done: 1 IP address (1 host up) scanned in 21.84 seconds\n```\n\n### 4.3 Scenario 2: Using nhp-agentd service to knock on the door\n\nAfter starting the nhp agentd service with the command ```nohup /nhp-agent/nhp-agentd run 2>&1 &```, the access is normal as follows:\n\n```shell\nroot@68a230812459:/workdir# nohup /nhp-agent/nhp-agentd run 2>&1 &\nroot@6e21724b68f1:/workdir# curl -i http://177.7.0.10\nHTTP/1.1 200 OK\nContent-Length: 26\nContent-Type: application/json; charset=utf-8\nDate: Tue, 08 Jul 2025 06:21:10 GMT\n\n{\"message\":\"Hello World!\"}\n```\n\nWhen NHP agent starts, it can scan to port 80 of NHP-AC\n\n```shell\nroot@ee88ec992447:/# nmap 177.7.0.10\nStarting Nmap 7.93 ( https://nmap.org ) at 2025-07-03 07:37 UTC\nNmap scan report for nhp-ac.docker_nginx (177.7.0.10)\nHost is up (0.000094s latency).\nNot shown: 999 filtered tcp ports (no-response)\nPORT   STATE SERVICE\n80/tcp open  http\nMAC Address: 12:B4:5C:EB:72:F4 (Unknown)\n\nNmap done: 1 IP address (1 host up) scanned in 4.96 seconds\n```\n\n### 4.4 Scenario 3: Using simulated authorization service login to verify\n\nStop the nhp-agentd service and start nginx in the NHP-Agent container\n\n```shell\nroot@6e21724b68f1:/workdir# ps -aux|grep nhp-agentd\nroot        38  0.3  0.2 1974072 20448 pts/0   Sl   02:55   0:00 /nhp-agent/nhp-agentd run\nroot        51  0.0  0.0   2844  1424 pts/0    S+   02:55   0:00 grep --color=auto nhp-agentd\nroot@6e21724b68f1:/workdir# kill 38\nroot@6e21724b68f1:/workdir# nginx\n```\n\nvisit: <http://localhost/plugins/example?resid=demo&action=login>\n\n- Expected page to display normally\n- Visit before knocking on the door: <https://localhost/> Timeout (504 Gateway Time out)\n- Click login (after knocking on the door), the page will jump to normal and can be accessed normally <https://localhost/> (Note: The opening time is 15 seconds, and access is prohibited after 15 seconds)\n- In the NHP Agent container, use ```curl - i http://177.7.0.10``` Can display content normally\n- When clicking on login (after knocking on the door), you can scan to port 80 of NHP-AC\n\n```shell\nroot@ee88ec992447:/# nmap 177.7.0.10\nStarting Nmap 7.93 ( https://nmap.org ) at 2025-07-03 07:37 UTC\nNmap scan report for nhp-ac.docker_nginx (177.7.0.10)\nHost is up (0.000094s latency).\nNot shown: 999 filtered tcp ports (no-response)\nPORT   STATE SERVICE\n80/tcp open  http\nMAC Address: 12:B4:5C:EB:72:F4 (Unknown)\n\nNmap done: 1 IP address (1 host up) scanned in 4.96 seconds\n```\n\n### 4.5 Verify if the ipset rules are effective\n\n```shell\ndocker exec -it nhp-ac ipset list\n```\n\nAfter knocking on the door through nhp-agentd or authorized plugins, if the following result appears in NHP-AC's ipset, it indicates that the rule was successfully written, which means that the knocking was successful:\n***Name: defaultset Rules***\n\n```shell\nName: defaultset\nType: hash:ip,port,ip\nRevision: 5\nHeader: family inet hashsize 1024 maxelem 1000000 timeout 120 counters\nSize in memory: 656\nReferences: 7\nNumber of entries: 2\nMembers:\n177.7.0.8,udp:80,177.7.0.10 timeout 8 packets 0 bytes 0\n177.7.0.8,tcp:80,177.7.0.10 timeout 8 packets 90 bytes 14565\n\nName: defaultset_down\nType: hash:ip,port,ip\nRevision: 5\nHeader: family inet hashsize 1024 maxelem 1000000 timeout 121 counters\nSize in memory: 208\nReferences: 2\nNumber of entries: 0\nMembers:\n\nName: tempset\nType: hash:net,port\nRevision: 7\nHeader: family inet hashsize 1024 maxelem 1000000 timeout 5 counters\nSize in memory: 456\nReferences: 2\nNumber of entries: 0\nMembers:\n```\n\n## 5. Edit the Code and Rebuild\n\nAfter modifying the code, you can rebuild individual services or all services for debugging.\n\n### 5.1 Code editing\n\nYou can use your IDE (such as VSCode) to open the project and modify the OpenNHP code.\n\n### 5.2 Rebuild Using quick_start.sh (Recommended)\n\nThe `quick_start.sh` script provides the easiest way to rebuild services:\n\n```shell\ncd ./docker\n./quick_start.sh          # Interactive menu\n./quick_start.sh --china  # For users in China\n```\n\n| Option | Service | Description |\n| ------ | ------- | ----------- |\n| 3 | nhp-server | Rebuild and restart NHP-Server |\n| 4 | nhp-ac | Rebuild and restart NHP-AC |\n| 5 | nhp-agent | Rebuild and restart NHP-Agent |\n| 6 | web-app | Rebuild and restart Web-App |\n| 1 | ALL | Full rebuild including base image |\n\n### 5.3 Manual Rebuild Commands\n\nIf you prefer manual commands instead of using `quick_start.sh`:\n\n```shell\ncd ./docker\n\n# Rebuild a specific service (replace SERVICE_NAME with: nhp-server, nhp-ac, nhp-agent, or web-app)\ndocker compose build --no-cache SERVICE_NAME\ndocker stop SERVICE_NAME && docker rm SERVICE_NAME\ndocker compose up -d SERVICE_NAME\n\n# Rebuild all services\ndocker compose build --no-cache\ndocker compose down\ndocker compose up -d\n```\n\nFor users in China, add environment variables:\n\n```shell\ncd ./docker\n\n# Rebuild a specific service\nGOPROXY=https://goproxy.cn,direct APT_MIRROR=mirrors.aliyun.com docker compose build --no-cache SERVICE_NAME\ndocker stop SERVICE_NAME && docker rm SERVICE_NAME\ndocker compose up -d SERVICE_NAME\n\n# Rebuild all services\nGOPROXY=https://goproxy.cn,direct APT_MIRROR=mirrors.aliyun.com docker compose build --no-cache\ndocker compose down\ndocker compose up -d\n```\n\n### 5.4 View Logs\n\nUsing quick_start.sh (options 10-12) or docker compose:\n\n```shell\n# View nhp-server logs\ndocker compose logs -f nhp-server\n\n# View nhp-ac logs\ndocker compose logs -f nhp-ac\n\n# View nhp-agent logs\ndocker compose logs -f nhp-agent\n```\n\n### 5.5 Clean Up\n\nUsing quick_start.sh (options 13-14) or manual commands:\n\n```shell\n# Remove all OpenNHP images\ndocker rmi opennhp-base:latest opennhp-server:latest opennhp-ac:latest opennhp-agent:latest web-app:latest\n\n# Stop and remove containers, networks, volumes\ndocker compose down -v\n```\n"
  },
  {
    "path": "docs/server_plugin.md",
    "content": "---\nlayout: page\ntitle: Server Plugins\nnav_order: 9\npermalink: /server_plugin/\n---\n\n# OpenNHP Plugin Development Guide\n{: .fs-9 }\n\n[中文版](/zh-cn/server_plugin/){: .label .fs-4 }\n\n---\n\n## Table of Contents\n\n- [Introduction](#introduction)\n\n- [1. The Necessity of Applying OpenNHP Plugins](#1-the-necessity-of-applying-opennhp-plugins)\n\n    - [1.1 Protocol Compatibility and Technical Limitations](#11-protocol-compatibility-and-technical-limitations)\n\n    - [1.2 Customization Needs for Authentication](#12-customization-needs-for-authentication)\n\n- [2. How the Plugin Works](#2-how-the-plugin-works)\n\n    - [2.1 User Initiates an HTTP Request via Browser](#21-user-initiates-an-http-request-via-browser)\n\n    - [2.2 NHP Server Parses the URL and Calls the Appropriate Plugin](#22-nhp-server-parses-the-url-and-calls-the-appropriate-plugin)\n\n    - [2.3 The Plugin Executes Core Functionality](#23-the-plugin-executes-core-functionality)\n\n    - [2.4 Plugin Completes the Code Execution Process](#24-plugin-completes-the-code-execution-process)\n\n    - [2.5 NHP Server Responds to the User with the HTTP Request Results](#25-nhp-server-responds-to-the-user-with-the-http-request-results)\n\n- [3. Plugin Development Principles](#3-plugin-development-principles)\n\n    - [3.1 Environment Setup](#31-environment-setup)\n\n    - [3.2 Project Initialization](#32-project-initialization)\n\n    - [3.3 Plugin Function Design](#33-plugin-function-design)\n\n    - [3.4 Core Code Development](#34-core-code-development)\n\n    - [3.5 Plugin Compilation, Testing, and Deployment](#35-plugin-compilation-testing-and-deployment)\n\n- [Conclusion](#conclusion)\n\n## Introduction\n\nPlugins in the NHP server are modules that add specific features to the main application. They are designed to be highly modular and loosely coupled with the core application, allowing developers to add, remove, or update plugins without affecting the main functionality of the server.\n\n## 1. The Necessity of Applying OpenNHP Plugins\n\nThe development of OpenNHP plugins solves the compatibility issues between the UDP protocol and web-based HTTP requests, while also addressing the customization needs for authentication in government platforms. Developing plugins is crucial for further extending the NHP framework and adapting it to the flexible needs of government data flow applications. The reasons are as follows:\n\n### 1.1 Protocol Compatibility and Technical Limitations\n\nThe NHP standard protocol communicates over the UDP protocol, which is lightweight and fast, making it suitable for large-scale, high-frequency data transmissions. However, in certain scenarios, especially web-based interactions (e.g., HTML5 web pages), JavaScript running in a browser can only make HTTP requests and cannot directly send UDP requests. This creates a protocol incompatibility issue. Many modern government applications rely on web interactions, making plugin development essential to overcome this technical limitation.\n\nBy developing OpenNHP plugins, the NHP server can receive HTTP requests from web clients (often \"knock packets\") and convert them into the UDP protocol needed for internal communication. This mechanism ensures seamless integration between web applications based on HTTP and the NHP server, extending the NHP framework's application scope. It particularly enhances flexibility and compatibility in data transmission in scenarios involving browser-to-backend service interactions.\n\n### 1.2 Customization Needs for Authentication\n\nGovernment data flow involves highly secure identity authentication and access management. However, standard authentication protocols cannot meet the complex needs of government scenarios. Different government platforms have their own authentication mechanisms and demand highly customized authentication processes. Traditional standard protocols are too rigid to flexibly integrate with these platforms.\n\nOpenNHP plugins can interface with different government platforms by offering custom services to accommodate their authentication processes. The plugins allow developers to tailor the authentication mechanisms according to the specific requirements of different platforms, ensuring seamless integration with the NHP framework. This not only enhances authentication security but also ensures compliance and flexibility in data flow management.\n\n## 2. How the Plugin Works\n\nThe entire plugin execution process covers the complete flow from user requests, server plugin parsing, plugin logic execution, to final feedback to the user. Each step ensures that the NHP server, via the plugin, meets the demands of various request processing scenarios, especially in authentication and \"knock packet\" handling.\n\n![Plugin Workflow Diagram](/images/plugin_image2.png)\n\n***Figure 1: Plugin Workflow Diagram***\n\n### 2.1 User Initiates an HTTP Request via Browser\n\nThe user inputs a specific URL address in their browser, sending an HTTP request to the NHP server. For example, a user accesses the following URL:\n- `http://127.0.0.1:port/plugins/example?resid=demo&action=login`\n\nThis is the starting point of the entire process, typically initiated by a webpage or application request that needs to be handled by the plugin.\n\n| URL Component    | Description                                                 |\n| ---------------- | ------------------------------------------------------------|\n| `127.0.0.1:port` | The first part is the IP address of the NHP server, followed by the port number |\n| `plugins`        | Plugin directory                                             |\n| `example`        | Plugin name                                                  |\n| `resid`          | Plugin resource ID                                           |\n| `action`         | The action to be executed, used to determine which auxiliary function the plugin performs |\n\n***Table 1: URL Component Breakdown***\n\n### 2.2 NHP Server Parses the URL and Calls the Appropriate Plugin\n\nAfter the HTTP request reaches the NHP server, the server parses the URL path and parameters to determine which plugin to call. During this process, the NHP server identifies the `plugins/example` part of the URL and routes the request to the \"example\" plugin for processing.\n\n### 2.3 The Plugin Executes Core Functionality\n\nBased on the parameters in the URL (such as `resid=demo` and `action=login`), the plugin executes the corresponding functionality. The core functions of the plugin include authentication and a series of \"knock packet\" processing steps. The core functionality handles the main logic, while auxiliary functions provide support for tasks such as authentication and resource access.\n\n### 2.4 Plugin Completes the Code Execution Process\n\nAfter processing the request and completing the authentication or other custom services, the plugin finishes its code execution process. This step is key to the core functionality of the plugin, where all authentication, authorization, or other logic is executed.\n\n### 2.5 NHP Server Responds to the User with the HTTP Request Results\n\nOnce the plugin finishes its process, the result is sent back to the NHP server, which responds to the user via HTTP. The user will eventually see a feedback message in their browser, such as a confirmation message or relevant data or page update.\n\n## 3. Plugin Development Principles\n\n### 3.1 Environment Setup\n\nBefore developing OpenNHP plugins, ensure the following environment is properly set up:\n\n1. **Development Language**: Go language is used for development.\n2. **Development Tools**: IDEs like IntelliJ IDEA or VS Code are recommended.\n3. **OpenNHP source code**: Download and integrate the latest version of the OpenNHP code from GitHub into your development environment. Download URL: [https://github.com/OpenNHP/opennhp](https://github.com/OpenNHP/opennhp).\n\n### 3.2 Project Initialization\n\nFirst, create a new plugin project under the `server/plugins` directory. For example, let's create a plugin named \"example.\"\n\n![Example Plugin Directory Structure](/images/plugin_image3.png)\n\n***Figure 2: Example Plugin Parent Directory***\n\nEach plugin in the NHP server is typically structured as a separate Go package. For instance, the \"example\" plugin would be located in the `NHP/server/plugins/example` directory and would have its own `example.go` file.\n\nThe initialized project structure includes basic configuration files and the plugin framework, primarily consisting of the `etc` directory with configuration files (`config.toml`, `resource.toml`), the main program file `main.go`, and the automation build file `Makefile`. If the plugin requires integration with front-end pages, the `templates` directory and corresponding front-end HTML files can also be added.\n\nA typical plugin file, such as `example.go`, contains the following:\n\n- Necessary import statements\n- Constants and variables related to the plugin\n- Helper functions\n- Main plugin function\n\n![Example Plugin Directory Structure](/images/plugin_image4.png)\n\n***Figure 3: Example Plugin Directory Structure***\n\n| ***File/Directory Name*** | ***Purpose***                                              |\n| ------------------------- | ---------------------------------------------------------- |\n| etc                       | Contains configuration and resource files for the plugin    |\n| config.toml               | Defines configuration details for the plugin during runtime |\n| resource.toml             | Defines resource-related information for the plugin         |\n| templates                 | Stores integrated front-end page templates (optional)       |\n| main.go                   | Main program file defining core functions and helper logic  |\n| Makefile                  | Automation build file                                      |\n\n***Table 2: Plugin Directory and File Purposes***\n\n## 3.3 Plugin Function Design\n\nIn the plugin function design phase, the following core points need to be clarified:\n\n***Data Flow Scenarios***: Define the participants, permissions, and flow paths involved in the data circulation process.\n\n***Security Policies***: Establish strict access control and verification mechanisms through a zero-trust architecture.\n\n***Logging and Auditing***: Design comprehensive logging functionalities for subsequent tracing and auditing.\n\nFor example, the main functionality to be implemented by the \"example\" plugin is as follows:\n\n1. Submit a form containing user name and password on the H5 page;\n\n2. The NHP-Server server receives the form for verification. After the verification is successful, it initiates a knock on the NHP-AC server;\n\n3. After NHP-AC successfully opens the door, it returns the application server address to the client;\n\n4. Access application server resources.\n\n## 3.4 Core Code Development\n\nThe steps for developing the plugin for the NHP server are as follows:\n\n1. Create a new directory for your plugin under NHP/server/plugins. The directory name should be the name of your plugin.\n\n2. In the plugin directory, create a new Go file. The file name should be the same as the directory name. For example, for a plugin named myplugin, you would create a file named myplugin.go.\n\n3. Define your plugin functions. Your plugin should have at least one main function that executes the core functionality of the plugin. You can also define auxiliary functions as needed.\n\n4. Import your plugin in the main application. In the main application file (main.go), import your plugin package and call your plugin functions as needed.\n\nRefer to the plug-in function design for code development. Taking the \"example\" plug-in as an example, the AuthWithHttp function is designed to receive and process HTTP requests, the authRegular function verifies the user name and password and knocks on the door, the authAndShowLogin function loads login page resources, etc., and verification auxiliary functions need to be designed to implement the functions. Expansion and development can be carried out according to specific functional requirements.\n\n![Example Plugin Core Code and Auxiliary Code Function Example](/images/plugin_image6.png) \n\n![Example Plugin Core Code and Auxiliary Code Function Example](/images/plugin_image7.png) \n\n![Example Plugin Core Code and Auxiliary Code Function Example](/images/plugin_image8.png) \n\n***Figures 4, 5, 6 Example Plugin Core Code and Auxiliary Code Function Example***\n\n## 3.5 Plugin Compilation Testing and Deployment\n\nTesting and deployment of the plugin are crucial steps to ensure the completeness and stability of plugin functionality. Through local environment testing and optimization, developers can deploy the plugin in a way that ensures the correctness of its functionality. In the production environment, the plugin must be accurately configured, combined with security and operation strategies, to ensure that it meets business needs and runs stably in real applications. The specific steps are as follows:\n\n**1. Plugin Compilation**\n\nThe compilation process ensures that the plugin's code is consistent with the main project, while the task dependencies in the Makefile ensure that the plugin's build process is closely integrated with the main system's compilation, achieving an integrated build and release process. The specific steps are as follows:\n\n***Define Plugin Directory***: At the top of the Makefile, we can see a line of code defining the plugin directory, as shown in the image below:\n\n![Define Plugin Directory](/images/plugin_image11.png) \n\n***Figure 7 Define Plugin Directory***\n\nThis line of code specifies the storage location of the plugin, which is the server/plugins directory. All plugin source codes and configuration files will be placed in this directory. When starting the NHP service, to ensure the plugin loads correctly, the plugin file path needs to be configured in the NHP-Server's etc/resource.toml configuration file.\n\n![Plugin File Path Configuration](/images/plugin_image12.png) \n\n***Figure 8 Plugin File Path Configuration***\n\n***Generate Version Information and Start Build***: The generate-version-and-build task includes a series of steps to generate version numbers, commit IDs, build times, and other information. This information is helpful for tracking the version and build status of the plugin.\n\n***Plugin Compilation Logic***: In the Makefile, the plugins: task is responsible for executing the plugin compilation, as shown in the image below:\n\n![Plugin Compilation Task plugins](/images/plugin_image13.png) \n\n***Figure 9 Plugin Compilation Task plugins***\n\nPlugin Directory Check: test -d $(NHP_SERVER_PLUGINS) checks if the defined plugin directory (server/plugins) exists.\n\nExecute Compilation: If the plugin directory exists, $(MAKE) -C $(NHP_SERVER_PLUGINS) enters that directory and executes the Makefile within it, performing the compilation operation for the plugin.\n\n***Overall Compilation Process***: During the overall project build process (Linux and macOS: run the script make in the root directory; Windows: run the BAT file build.bat in the root directory), the plugins task in the Makefile will be called. If the plugin directory exists and is valid, the plugin's Makefile will be executed to complete the plugin's build. During compilation, plugin binary files or other forms of output files may be generated for use by the NHP server.\n\n**2. Local Environment Function Testing**\n\nTo test your plugin, you can write a separate _test.go file in the same directory as the plugin file to write unit tests. Go's built-in testing package (testing) can be used to write and run tests.\n\nOnce the plugin development is complete and compiled successfully, it is necessary to perform functional testing in the local environment first. This step is primarily used to verify whether the core functionality of the plugin has been correctly implemented and to ensure that all functional modules of the plugin are working correctly. You can simulate actual application scenario requests to verify whether the plugin's response meets expectations and check the logs for potential issues. Common testing steps include:\n\n1. Initiate HTTP or UDP requests to test the plugin's response;\n\n2. Verify whether the identity authentication, knocking, opening, and authorization processes in the plugin are executed as expected;\n\n3. Test the plugin's error handling and exception capture mechanisms;\n\nDuring the local testing phase, developers can use debugging tools, logging, and breakpoint debugging to thoroughly investigate and resolve potential issues in the code, ensuring the logic of the plugin is rigorous and free of major vulnerabilities.\n\n**3. Function Confirmation and Optimization**\n\nAfter local environment testing passes, developers need to confirm and optimize the plugin's functionality. Confirm whether the core functions of the plugin fully meet the description in the requirements document, and whether all expected functionalities have been correctly implemented. If certain functions of the plugin are found to be below expectations or have further optimization potential during testing, code adjustments and functionality optimizations can be made based on the test results.\n\n**4. Configuration and Deployment in Actual Application Scenarios**\n\nOnce local testing and optimization are complete, the plugin can proceed to the deployment phase in actual application scenarios. To deploy your plugin, simply build and run the main application. Your plugin will be included in the build and will be available when the server runs. During plugin deployment, it is usually necessary to configure according to the specific needs of the application scenario. The specific steps are as follows:\n\n***Deployment Environment Preparation***: Ensure that the server configuration in the production environment is consistent or close to that of the local testing environment, including the operating system, network configuration, dependency libraries, etc.\n\n***Plugin Installation and Configuration***: Deploy the tested plugin code to the production server, configuring it according to the requirements of the actual application scenario, including plugin paths, interface addresses, access control server addresses, authentication mechanisms, etc.\n\n***Logging and Monitoring Setup***: After deployment, improve log level configuration to facilitate timely detection and resolution of issues during actual application.\n\n***Start NHP Service to Check Plugin Loading Status***: Start the NHP service according to the NHP service startup process, check the plugin loading status based on the log files in the log directory, and verify whether the plugin functions normally according to the local plugin testing process.\n\n**5. Production Environment Validation and Maintenance**\n\nAfter the plugin deployment is complete, it is necessary to validate its functionality in the actual application environment to ensure that the plugin works correctly in the production environment. After the plugin goes live, regular maintenance should also be carried out to continuously monitor the plugin's performance, record operation data, and timely perform necessary updates and maintenance to ensure that the plugin remains in optimal condition during long-term use.\n\n## Conclusion\nDeveloping plugins for the NHP server can extend the server's functionality in a modular and maintainable way. By following the steps outlined above, you can create your own plugins and contribute to the NHP server project.\n\n\n\n\n\n"
  },
  {
    "path": "docs/zh-cn/about.zh-cn.md",
    "content": "---\nlayout: page\ntitle: 关于我们\nparent: 中文版\nnav_order: 11\npermalink: /zh-cn/about/\n---\n\n# 关于OpenNHP开源项目\n{: .fs-9 }\n\n[English](/about/){: .label .fs-4 }\n---\n\n\n"
  },
  {
    "path": "docs/zh-cn/agent_sdk.zh-cn.md",
    "content": "---\nlayout: page\ntitle: 客户端SDK\nparent: 中文版\nnav_order: 10\npermalink: /zh-cn/agent_sdk/\n---\n\n# 客户端SDK\n{: .fs-9 }\n\n[English](/agent_sdk/){: .label .fs-4 }\n\n---\n\n\n\n## 1 客户端代理SDK介绍\n\n### 1.1 介绍\n\nOpenNHP客户端代理SDK是对OpenNHP Agent服务的标准化封装。应用程序通过集成此SDK，可直接调用其提供的接口方法，快速实现应用程序与OpenNHP的整合。\n\n在不同的运行环境下仅需将SDK程序编译成对应系统的SDK文件格式：\n\n| 操作系统 | 动态库文件           |\n| -------- | -------------------- |\n| Linux    | nhp-agent.so         |\n| Windows  | nhp-agent.dll        |\n| MacOS    | nhp-agent.dylib      |\n| Android  | libnhpagent.so       |\n| IOS      | nhpagent.xcframework |\n\n### 1.2 SDK的开发\n\nOpenNHP中提供了SDK样例源码，样例中包含可能用到的初始化代理、循环敲门、取消循环敲门、单次敲门、取消单次敲门、增加nhp-server服务、设置客户端用户信息及密钥注册等方法。SDK开发人员可直接将OpenNHP项目中提供的SDK源码样例编程成相应的SDK文件直接进行调用，或参照SDK源码样例完成自定义的SDK开发。\n\nSDK样例源码：***opennhp/endpoints/agent/main/export.go***\n\n```go\npackage main\n\n/*\n#include <stdlib.h>\n*/\nimport \"C\"\n\nimport (\n\t\"encoding/base64\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"strings\"\n\t\"unsafe\"\n\n\t\"github.com/OpenNHP/opennhp/endpoints/agent\"\n\t\"github.com/OpenNHP/opennhp/nhp/common\"\n\t\"github.com/OpenNHP/opennhp/nhp/core\"\n)\n\nvar gAgentInstance *agent.UdpAgent\nvar gWorkingDir string\nvar gLogLevel int\n\nfunc deepCopyCString(c_str *C.char) string {\n\tif c_str == nil {\n\t\treturn \"\"\n\t}\n\tgoStr := C.GoString(c_str)\n\treturn strings.Clone(goStr)\n}\n\n// Release the memory of the string buffer generated by NHPSDK.\n//\n//export nhp_free_cstring\nfunc nhp_free_cstring(ptr *C.char) {\n\tC.free(unsafe.Pointer(ptr))\n}\n\n// Initialization of the nhp_agent instance working directory path:\n// The configuration files to be read are located under workingdir/etc/,\n// and log files will be generated under workingdir/logs/.\n//\n// Input:\n// workingDir: the working directory path for the agent\n// logLevel: 0: silent, 1: error, 2: info, 3: debug, 4: verbose\n//\n// Return:\n// Whether agent instance has been initialized successfully.\n//\n//export nhp_agent_init\nfunc nhp_agent_init(workingDir *C.char, logLevel C.int) bool {\n\tif gAgentInstance != nil {\n\t\treturn true\n\t}\n\n\tgAgentInstance = &agent.UdpAgent{}\n\terr := gAgentInstance.Start(deepCopyCString(workingDir), int(logLevel))\n\tif err != nil {\n\t\treturn false\n\t}\n\n\treturn true\n}\n\n// Synchronously stop and release nhp_agent.\n//\n//export nhp_agent_close\nfunc nhp_agent_close() {\n\tif gAgentInstance == nil {\n\t\treturn\n\t}\n\n\tgAgentInstance.Stop()\n\tgAgentInstance = nil\n}\n\n// Read the user information, resource information, server information,\n// and other configuration files written under workingdir/etc,\n// and asynchronously start the loop knocking thread.\n//\n// Input: None\n//\n// Return:\n// -1: Uninitialized error\n// >=0: The number of resources requested to knock by the knocking thread at the time of the call\n//\n//\t(knocking resources will be synchronized with changes in the configuration in workingdir/etc/resource.toml).\n//\n//export nhp_agent_knockloop_start\nfunc nhp_agent_knockloop_start() C.int {\n\tif gAgentInstance == nil {\n\t\treturn -1\n\t}\n\n\tcount := gAgentInstance.StartKnockLoop()\n\treturn C.int(count)\n}\n\n// Synchronously stop the loop, knock-on sub thread.\n//\n//export nhp_agent_knockloop_stop\nfunc nhp_agent_knockloop_stop() {\n\tif gAgentInstance == nil {\n\t\treturn\n\t}\n\n\tgAgentInstance.StopKnockLoop()\n}\n\n// Setting agent's represented user information\n//\n// Input:\n// userId: User identification (optional, but not recommended to be empty)\n// devId: Device identification (optional)\n// orgId: Organization or company identification (optional)\n// userData: Additional fields required to interface with backend services (json format string, optional)\n//\n// Return:\n// Whether the user information is set successfully\n//\n//export nhp_agent_set_knock_user\nfunc nhp_agent_set_knock_user(userId *C.char, devId *C.char, orgId *C.char, userData *C.char) bool {\n\tif gAgentInstance == nil {\n\t\treturn false\n\t}\n\tjsonStr := deepCopyCString(userData)\n\tvar data map[string]any\n\tif len(jsonStr) > 0 {\n\t\terr := json.Unmarshal([]byte(jsonStr), &data)\n\t\tif err != nil {\n\t\t\treturn false\n\t\t}\n\t}\n\n\tgAgentInstance.SetDeviceId(deepCopyCString(devId))\n\tgAgentInstance.SetKnockUser(deepCopyCString(userId), deepCopyCString(orgId), data)\n\treturn true\n}\n\n// Add an NHP server information to the agent for use in knocking on the door\n// (the agent can initiate different knocking requests to multiple NHP servers).\n//\n// Input:\n// pubkey: Public key of the NHP server\n// ip: IP address of the NHP server\n// host: Domain name of the NHP server (if a domain name is set, the ip item is optional)\n// port: Port number for the NHP server to operate (if set to 0, the default port 62206 will be used)\n// expire: Expiration time of the NHP server's public key (in epoch seconds, set to 0 for permanent)\n//\n// Return:\n// Whether the server information has been successfully added.\n//\n//export nhp_agent_add_server\nfunc nhp_agent_add_server(pubkey *C.char, ip *C.char, host *C.char, port C.int, expire int64) bool {\n\tif gAgentInstance == nil {\n\t\treturn false\n\t}\n\n\tif pubkey == nil || (ip == nil && host == nil) {\n\t\treturn false\n\t}\n\n\tserverPort := int(port)\n\tif serverPort == 0 {\n\t\tserverPort = 62206 // use default server listening port\n\t}\n\n\tserverPeer := &core.UdpPeer{\n\t\tType:         core.NHP_SERVER,\n\t\tPubKeyBase64: deepCopyCString(pubkey),\n\t\tIp:           deepCopyCString(ip),\n\t\tPort:         serverPort,\n\t\tHostname:     deepCopyCString(host),\n\t\tExpireTime:   expire,\n\t}\n\tgAgentInstance.AddServer(serverPeer)\n\treturn true\n}\n\n// Delete NHP server information from the agent\n//\n// Input:\n// pubkey: NHP server public key\n//\n//export nhp_agent_remove_server\nfunc nhp_agent_remove_server(pubkey *C.char) {\n\tif gAgentInstance == nil {\n\t\treturn\n\t}\n\tif pubkey == nil {\n\t\treturn\n\t}\n\n\tgAgentInstance.RemoveServer(deepCopyCString(pubkey))\n}\n\n// Please add a resource information for the agent to use for knocking on the door\n// (the agent can initiate a knock-on request for different resources)\n//\n// Input:\n// aspId: Authentication Service Provider Identifier\n// resId: Resource Identifier\n// serverIp: NHP server IP address or domain name (the NHP server managing the resource)\n// serverHostname: NHP server domain name (the NHP server managing the resource)\n// serverPort: NHP server port (the NHP server managing the resource)\n//\n// Return:\n// Whether the resource information has been added successfully\n//\n//export nhp_agent_add_resource\nfunc nhp_agent_add_resource(aspId *C.char, resId *C.char, serverIp *C.char, serverHostname *C.char, serverPort C.int) bool {\n\tif gAgentInstance == nil {\n\t\treturn false\n\t}\n\n\tif aspId == nil || resId == nil || (serverIp == nil && serverHostname == nil) {\n\t\treturn false\n\t}\n\n\tresource := &agent.KnockResource{\n\t\tAuthServiceId:  deepCopyCString(aspId),\n\t\tResourceId:     deepCopyCString(resId),\n\t\tServerIp:       deepCopyCString(serverIp),\n\t\tServerHostname: deepCopyCString(serverHostname),\n\t\tServerPort:     int(serverPort),\n\t}\n\terr := gAgentInstance.AddResource(resource)\n\treturn err == nil\n}\n\n// Delete resource information from the agent\n//\n// Input:\n// aspId: Authentication Service Provider Identifier\n// resId: Resource Identifier\n//\n//export nhp_agent_remove_resource\nfunc nhp_agent_remove_resource(aspId *C.char, resId *C.char) {\n\tif gAgentInstance == nil {\n\t\treturn\n\t}\n\n\tif aspId == nil || resId == nil {\n\t\treturn\n\t}\n\n\tgAgentInstance.RemoveResource(deepCopyCString(aspId), deepCopyCString(resId))\n}\n\n// The agent initiates a single knock on the door request to the server hosting the resource\n//\n// Input:\n// aspId: Authentication service provider identifier\n// resId: Resource identifier\n// serverIp: NHP server IP address or domain name (the NHP server managing the resource)\n// serverHostname: NHP server domain name (the NHP server managing the resource)\n// serverPort: NHP server port (the NHP server managing the resource)\n//\n// Returns:\n// The server's response message (json format string buffer pointer):\n// \"errCode\": Error code (string, \"0\" indicates success)\n// \"errMsg\": Error message (string)\n// \"resHost\": Resource server address (\"resHost\": {\"Server Name 1\":\"Server Hostname 1\", \"Server Name 2\":\"Server Hostname 2\", ...})\n// \"opnTime\": Door opening duration (integer, in seconds)\n// \"aspToken\": Token generated after authentication by the ASP (optional)\n// \"agentAddr\": Agent's IP address from the perspective of the NHP server\n// \"preActs\": Pre-connection information related to the resource (optional)\n// \"redirectUrl\": HTTP redirection link (optional)\n//\n// It is necessary to call nhp_agent_add_server before calling,\n// to add the NHP server's public key, address, and other information to the agent\n// The caller is responsible for calling nhp_free_cstring to release the returned char* pointer\n//\n//export nhp_agent_knock_resource\nfunc nhp_agent_knock_resource(aspId *C.char, resId *C.char, serverIp *C.char, serverHostname *C.char, serverPort C.int) *C.char {\n\tackMsg := &common.ServerKnockAckMsg{}\n\n\tfunc() {\n\t\tif gAgentInstance == nil {\n\t\t\tackMsg.ErrCode = common.ErrNoAgentInstance.ErrorCode()\n\t\t\tackMsg.ErrMsg = common.ErrNoAgentInstance.Error()\n\t\t\treturn\n\t\t}\n\n\t\tif aspId == nil || resId == nil || (serverIp == nil && serverHostname == nil) {\n\t\t\tackMsg.ErrCode = common.ErrInvalidInput.ErrorCode()\n\t\t\tackMsg.ErrMsg = common.ErrInvalidInput.Error()\n\t\t\treturn\n\t\t}\n\n\t\tresource := &agent.KnockResource{\n\t\t\tAuthServiceId:  deepCopyCString(aspId),\n\t\t\tResourceId:     deepCopyCString(resId),\n\t\t\tServerIp:       deepCopyCString(serverIp),\n\t\t\tServerHostname: deepCopyCString(serverHostname),\n\t\t\tServerPort:     int(serverPort),\n\t\t}\n\n\t\tpeer := gAgentInstance.FindServerPeerFromResource(resource)\n\t\tif peer == nil {\n\t\t\tackMsg.ErrCode = common.ErrKnockServerNotFound.ErrorCode()\n\t\t\tackMsg.ErrMsg = common.ErrKnockServerNotFound.Error()\n\t\t\treturn\n\t\t}\n\n\t\ttarget := &agent.KnockTarget{\n\t\t\tKnockResource: *resource,\n\t\t\tServerPeer:    peer,\n\t\t}\n\n\t\tackMsg, _ = gAgentInstance.Knock(target)\n\t}()\n\n\tbytes, _ := json.Marshal(ackMsg)\n\tret := C.CString(string(bytes))\n\n\treturn ret\n}\n\n// The agent explicitly informs the NHP server to exit its access permission to the resource.\n//\n// Input:\n// aspId: Authentication Service Provider Identifier\n// resId: Resource Identifier\n// serverIp: NHP server IP address or domain name (the NHP server managing the resource)\n// serverHostname: NHP server domain name (the NHP server managing the resource)\n// serverPort: NHP server port (the NHP server managing the resource)\n//\n// Return:\n// Whether the exit was successful\n//\n// It is necessary to call nhp_agent_add_server before calling, to add the NHP server's public key, address, and other information to the agent.\n//\n//export nhp_agent_exit_resource\nfunc nhp_agent_exit_resource(aspId *C.char, resId *C.char, serverIp *C.char, serverHostname *C.char, serverPort C.int) bool {\n\tvar err error\n\tackMsg := &common.ServerKnockAckMsg{}\n\n\tfunc() {\n\t\tif gAgentInstance == nil {\n\t\t\tackMsg.ErrCode = common.ErrNoAgentInstance.ErrorCode()\n\t\t\tackMsg.ErrMsg = common.ErrNoAgentInstance.Error()\n\t\t\terr = common.ErrNoAgentInstance\n\t\t\treturn\n\t\t}\n\n\t\tif aspId == nil || resId == nil || (serverIp == nil && serverHostname == nil) {\n\t\t\tackMsg.ErrCode = common.ErrInvalidInput.ErrorCode()\n\t\t\tackMsg.ErrMsg = common.ErrInvalidInput.Error()\n\t\t\terr = common.ErrInvalidInput\n\t\t\treturn\n\t\t}\n\n\t\tresource := &agent.KnockResource{\n\t\t\tAuthServiceId:  deepCopyCString(aspId),\n\t\t\tResourceId:     deepCopyCString(resId),\n\t\t\tServerIp:       deepCopyCString(serverIp),\n\t\t\tServerHostname: deepCopyCString(serverHostname),\n\t\t\tServerPort:     int(serverPort),\n\t\t}\n\n\t\tpeer := gAgentInstance.FindServerPeerFromResource(resource)\n\t\tif peer == nil {\n\t\t\tackMsg.ErrCode = common.ErrKnockServerNotFound.ErrorCode()\n\t\t\tackMsg.ErrMsg = common.ErrKnockServerNotFound.Error()\n\t\t\terr = common.ErrKnockServerNotFound\n\t\t\treturn\n\t\t}\n\n\t\ttarget := &agent.KnockTarget{\n\t\t\tKnockResource: *resource,\n\t\t\tServerPeer:    peer,\n\t\t}\n\n\t\tackMsg, err = gAgentInstance.ExitKnockRequest(target)\n\t}()\n\n\treturn err == nil\n}\n\n// cipherType: 0-curve25519; 1-sm2\n// result: \"privatekey\"|\"publickey\"\n// caller is responsible to free the returned char* pointer\n//\n//export nhp_generate_keys\nfunc nhp_generate_keys(cipherType C.int) *C.char {\n\tvar e core.Ecdh\n\tswitch core.EccTypeEnum(cipherType) {\n\tcase core.ECC_SM2:\n\t\te = core.NewECDH(core.ECC_SM2)\n\tcase core.ECC_CURVE25519:\n\t\tfallthrough\n\tdefault:\n\t\te = core.NewECDH(core.ECC_CURVE25519)\n\t}\n\tpub := e.PublicKeyBase64()\n\tpriv := e.PrivateKeyBase64()\n\n\tres := fmt.Sprintf(\"%s|%s\", priv, pub)\n\tpRes := C.CString(res)\n\n\treturn pRes\n}\n\n// cipherType: 0-curve25519; 1-sm2\n// privateBase64: private key in base64 format\n// result: \"publickey\"\n// caller is responsible to free the returned char* pointer\n//\n//export nhp_privkey_to_pubkey\nfunc nhp_privkey_to_pubkey(cipherType C.int, privateBase64 *C.char) *C.char {\n\tprivKey := deepCopyCString(privateBase64)\n\tprivKeyBytes, err := base64.StdEncoding.DecodeString(privKey)\n\tif err != nil {\n\t\treturn nil\n\t}\n\n\te := core.ECDHFromKey(core.EccTypeEnum(cipherType), privKeyBytes)\n\tif e == nil {\n\t\treturn nil\n\t}\n\tpub := e.PublicKeyBase64()\n\tpPub := C.CString(pub)\n\n\treturn pPub\n}\n```\n\n\n\n## 2 客户端代理SDK的适配\n\n### 2.1 桌面版SDK\n\n#### 2.1.1 Windows\n\n##### 2.1.1.1 环境准备\n\nWindows下的编译环境参照**编译源代码**中***系统需求***章节windows部分完成编译环境的搭建。\n\n##### 2.1.1.2 编译SDK\n\n- 方法一：运行代码根目录下*BAT*文件，该方法可在编译整个OpenNHP执行文件的同时完成SDK样例的编译\n  `build.bat`<br>\n  <small>*（注：如果在windows下编译过程中出现错误，请尝试此编译方法：在Visual Studio的developer command prompt for VS命令窗口中，切换到项目目录，执行`./build.bat`命令）*</small>\n\n- 方法二：单独编译SDK的.dll文件指令：\n\n  在`opennhp/endpoints/agent/main/`目录下执行\n\n  `go build -trimpath -buildmode=c-shared -ldflags '-s -w' -v -o nhp-agent.dll main.go export.go`\n\n  <small>*（注：因为export.go文件中没有main方法，所有编译命令中加入了main.go，自定义的SDK代码文件中在加入main方法后，在编译时编译指令只需要SDK代码文件，不需要在引入main.go文件）*</small>\n\n##### 2.1.1.3 SDK适配\n\n- **java**\n\n  java程序可以通过jna来完成对SDK的方法调用：\n\n    - OpennhpLibrary接口加载OpenNHP agent SDK\n\n      ```java\n      package org.example;\n      \n      import com.sun.jna.Library;\n      import com.sun.jna.Native;\n      \n      /**\n       * OpenNHP agent sdk interface\n       *\n       * @author haochangjiu\n       * @version JDK 8\n       * @className OpennhpLibrary\n       * @date 2025/10/27\n       */\n      public interface OpennhpLibrary extends Library {\n          // load OpenNHP agent sdk\n          OpennhpLibrary INSTANCE = Native.load(\"nhp-agent\", OpennhpLibrary.class);\n      \n          /**\n           * @description Initialization of the nhp_agent instance working directory path:\n           *              The configuration files to be read are located under workingdir/etc/,\n           *              and log files will be generated under workingdir/logs/.\n           * @param workingDir: the working directory path for the agent\n           * @param logLevel:   0: silent, 1: error, 2: info, 3: debug, 4: verbose\n           *                    return boolean Whether agent instance has been initialized successfully.\n           * @return boolean\n           * @author haochangjiu\n           * @date 2025/10/27\n           * {@link boolean}\n           */\n          boolean nhp_agent_init(String workingDir, int logLevel);\n      \n          /**\n           * @description Synchronously stop and release nhp_agent.\n           * @author haochangjiu\n           * @date 2025/10/27\n           */\n          void nhp_agent_close();\n          /**\n           * @description Read the user information, resource information, server information,\n           *              and other configuration files written under workingdir/etc,\n           *              and asynchronously start the loop knocking thread.\n           * @return int\n           * @author haochangjiu\n           * @date 2025/10/27\n           * {@link int}\n           */\n          int nhp_agent_knockloop_start();\n      \n          /**\n           * @description Synchronously stop the loop, knock-on sub thread\n           * @author hangchangjiu\n           * @date 2025/10/27\n           */\n          void nhp_agent_knockloop_stop();\n      }\n      ```\n\n    - 程序主入口，调用SDK\n\n      ```java\n      package org.example;\n      \n      import java.util.Scanner;\n      \n      /**\n       * Application for calling the OpenNHP agent SDK\n       *\n       * @author haochangjiu\n       * @version JDK 8\n       * @className App\n       * @date 2025/10/27\n       */\n      public class App {\n          public static void main(String[] args) throws Exception {\n      //        Initialize and start the OpenNHP agent SDK service\n              boolean initFlag = OpennhpLibrary.INSTANCE.nhp_agent_init(\"D:\\\\console-workspace\\\\opennhp-knock\", 3);\n              if (!initFlag) {\n                  System.out.println(\"NHP Agent init failed\");\n                  System.exit(0);\n              }\n      //        Invoke methods in the OpenNHP agent SDK via input commands\n              Scanner scanner = new Scanner(System.in);\n      \n              while (true) {\n                  System.out.print(\"> \");\n                  if (scanner.hasNextLine()) {\n                      String input = scanner.nextLine().trim();\n                      if (\"knock\".equalsIgnoreCase(input)) {\n                          System.out.println(\"start the loop knocking thread...\");\n                          OpennhpLibrary.INSTANCE.nhp_agent_knockloop_start();\n                      } else if (\"cancel\".equalsIgnoreCase(input)) {\n                          System.out.println(\"stop the loop knocking thread...\");\n                          OpennhpLibrary.INSTANCE.nhp_agent_knockloop_stop();\n                      } else if (\"exit\".equalsIgnoreCase(input)) {\n                          System.out.println(\"exit nhp agent service...\");\n                          OpennhpLibrary.INSTANCE.nhp_agent_close();\n                          break;\n                      } else {\n                          System.out.println(\"invalid input\");\n                      }\n                  }\n              }\n              scanner.close();\n          }\n      }\n      ```\n\n\n\n- **c/c++**\n\n  c/c++程序参照项目中SDK调用样例程序***opennhp/endpoints/agent/sdkdemo/nhp-agent-demo.c***来完成对客户端代理SDK的整合\n\n  ```c\n  #include <stdio.h>\n  #include <unistd.h>\n  #include \"nhp-agent.h\"\n  \n  int main() {\n      // Initialize nhp_agent, only one nhp_agent singleton is allowed per process.\n      nhp_agent_init(\".\", 3);\n  \n      // Set the user information for the knock-on-the-door feature.\n      nhp_agent_set_knock_user(\"zengl\", NULL, NULL, NULL);\n  \n      // Set NHP server information\n      // If there is already a configuration file for the server, the call to nhp_agent_add_server can be omitted\n      // Timestamp date is visible at https://unixtime.org/\n      nhp_agent_add_server(\"replace_with_actual_publickeybase64\", \"192.168.1.66\", NULL, 62206, 1748908471);\n  \n      // Send a request to the server to access the resource example/demo, and return information in the form of a JSON format string\n      // Note: The resource information here is an independent input, and is unrelated to the resource information saved in the configuration file\n      char *ret = nhp_agent_knock_resource(\"example\", \"demo\", \"192.168.1.66\", NULL, 62206);\n      printf(\"knock return: %s\\n\", ret);\n  \n      // Immediately close the agent's access to the example/demo resources,\n      // if not invoked, access permission will automatically close after the door opening duration has passed.\n      nhp_agent_exit_resource(\"example\", \"demo\", \"192.168.1.66\", NULL, 62206);\n  \n      // Turn off and release nhp_agent.\n      nhp_agent_close();\n      return 0;\n  }\n  ```\n\n- **python**\n\n  使用Python标准库中的ctypes完成对SDK的整合\n\n  ```py\n  import ctypes\n  from time import sleep\n  \n  # Windows\n  nhp_agent = ctypes.CDLL('nhp-agent.dll')\n  # Linux\n  # mylib = ctypes.CDLL('./nhp-agent.so')\n  # macOS\n  # mylib = ctypes.CDLL('./nhp-agent.dylib')\n  \n  nhp_agent.nhp_agent_init.argtypes = [ctypes.c_char_p, ctypes.c_int]\n  nhp_agent.nhp_agent_init.restype = ctypes.c_bool\n  \n  nhp_agent.nhp_agent_init.restype = ctypes.c_int\n  \n  \n  \n  if __name__ == '__main__':\n      flag = nhp_agent.nhp_agent_init(ctypes.c_char_p(b\"D:\\\\nhpagent\"),3)\n      if flag:\n          print(\"nhp-agent init success\")\n      else:\n          print(\"nhp-agent init failed\")\n      # start the loop knocking thread\n      status = nhp_agent.nhp_agent_knockloop_start()\n      if status >= 0:\n          print(\"nhp-agent knockloop success\")\n          # Delay between calls\n          sleep(30)\n      else:\n          print(\"nhp-agent knockloop failed\")\n  \n      # stop nhp_agent\n      nhp_agent.nhp_agent_close()\n  ```\n\n- **其他语言**\n\n  其他开发语言（C#、Rust、Go、Nodejs）可根据各语言独有的对SDK文件调用方法来完成SDK适配，其中Go也可以引入OpenNHP中agent部分源码，来完成对OpenNHP的适配，不需要开发SDK。\n\n#### 2.1.2 Linux\n\n##### 2.1.2.1 环境准备\n\nLinux下的编译环境参照**编译源代码**中***系统需求***章节Linux部分完成编译环境的搭建。\n\n##### 2.1.2.2 编译SDK\n\n- 方法一：运行代码根目录下脚本\n  `make`\n\n- 方法二：单独编译SDK的.so文件指令：\n\n  在`opennhp/endpoints/agent/main/`目录下执行\n\n  `go build -trimpath -buildmode=c-shared -ldflags '-s -w' -v -o nhp-agent.so main.go export.go`\n\n  <small>*（注：因为export.go文件中没有main方法，所有编译命令中加入了main.go，自定义的SDK代码文件中在加入main方法后，在编译时编译指令只需要SDK代码文件，不需要在引入main.go文件）*</small>\n\n##### 2.1.2.3 SDK适配\n\nLinux下对SDK的适配与Windows一致，代码参照章节**2.1.1.3**\n\n<small>*（注：需确保程序能正常加载到SDK的.so文件）*</small>\n\n#### 2.1.3 MacOS\n\n##### 2.1.3.1 环境准备\n\nMacOS下的编译环境参照**编译源代码**中***系统需求***章节MacOS部分完成编译环境的搭建。\n\n##### 2.1.3.2 编译SDK\n\n- 方法一：运行代码根目录下脚本\n  `make`\n\n- 方法二：单独编译SDK的.dylib文件指令：\n\n  在`opennhp/endpoints/agent/main/`目录下执行编译指令\n\n  `GOOS=darwin GOARCH=arm64 CGO_ENABLED=1 go build -buildmode=c-shared -o nhp-agent.dylib main.go export.go`\n\n  <small>*（注：因为export.go文件中没有main方法，所有编译命令中加入了main.go，自定义的SDK代码文件中在加入main方法后，在编译时编译指令只需要SDK代码文件，不需要在引入main.go文件）*</small>\n\n##### 2.1.3.3 SDK适配\n\nMacOS下对SDK的适配与Windows一致，代码参照章节**2.1.1.3**\n\n<small>*（注：需确保程序能正常加载到SDK的.dylib文件）*</small>\n\n### 2.2 移动版SDK\n\n#### 2.2.1 Android\n\n##### 2.2.1.1 环境准备\n\n- 在Linux上完成Android的客户端代理SDK编译，需要参照**编译源代码**中***系统需求***章节Linux部分完成编译环境的搭建。\n\n- Android NDK环境：\n\n    - 下载并安装Android NDK\n\n      `wget https://dl.google.com/android/repository/android-ndk-r25b-linux.zip`\n\n      `unzip android-ndk-r25b-linux.zip`\n\n    - 设置环境变量\n\n        - 编辑bashrc文件\n\n          `vim ~/.bashrc`\n\n        - 增加环境变量\n\n          ```sh\n          #设置 NDK 路径（根据你的实际安装路径）\n          export ANDROID_NDK_HOME=/opt/android-ndk-r25b/\n          export TOOLCHAIN=$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64\n          ```\n\n        - 使配置生效\n\n          `source ~/.bashrc`\n\n##### 2.2.1.2 编译SDK\n\n- 方法一：运行代码根目录下脚本\n  `make`\n\n  <small>*（注：确保Android NDK已安装,如果没有安装,Android SDK将不会编译）*</small>\n  \n- 方法二：单独编译SDK的.so文件指令：\n\n  在`opennhp/endpoints/agent/main/`目录下执行编译指令\n\n  `GOOS=android GOARCH=arm64 CGO_ENABLED=1 CC=$TOOLCHAIN/bin/aarch64-linux-android21-clang CXX=$TOOLCHAIN/bin/aarch64-linux-android21-clang++ go build -buildmode=c-shared -o libnhpagent.so main.go export.go`\n\n  <small>*（注：Android项目在通过jna加载.so文件时会在输入的.so文件名称前增加lib，在编译SDK时名称应以lib开头，例如：libnhpagent.so）*</small>\n\n##### 2.2.1.3 SDK适配\n\n- **Android配置（Kotlin和java通用）**：\n\n    - 1、在build.gradle(app)中加入如下配置：\n      在android下加入\n\n      ``` json\n      sourceSets {\n              main {\n                  jniLibs.srcDirs = ['src/main/jniLibs', 'libs']\n              }\n          }\n      ```\n\n      dependencies 下加入如下依赖\n      // 注意：安卓推荐使用适配的 JNA 版本，如 5.13.0 及以上\n      `implementation 'net.java.dev.jna:jna:5.13.0@aar'`\n      // 权限请求框架：https://github.com/getActivity/XXPermissions\n      `implementation libs.xxpermissions`\n\n      libs.versions.toml文件\n      [versions]下加入\n      `xxpermissions = \"18.6\"`\n      [libraries]下加入\n      `xxpermissions = { module = \"com.github.getActivity:XXPermissions\", version.ref = \"xxpermissions\" }`\n\n    - 2、AndroidManifest.xml文件加入文件存储读写权限\n\n      ```xml\n      <uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\" />\n      <uses-permission android:name=\"android.permission.READ_MEDIA_IMAGES\" />\n      <uses-permission android:name=\"android.permission.READ_MEDIA_VIDEO\" />\n      <uses-permission android:name=\"android.permission.READ_MEDIA_AUDIO\" />\n      ```\n\n- **Kotlin**\n\n  Kotlin开发Android应用适配SDK样例\n\n    ```kotlin\n    package com.example.androidtestsoapp\n    \n    import android.os.Bundle\n    import android.os.Environment\n    import android.util.Log\n    import androidx.activity.ComponentActivity\n    import androidx.activity.compose.setContent\n    import androidx.activity.enableEdgeToEdge\n    import androidx.compose.foundation.layout.fillMaxSize\n    import androidx.compose.foundation.layout.padding\n    import androidx.compose.material3.Scaffold\n    import androidx.compose.material3.Text\n    import androidx.compose.runtime.Composable\n    import androidx.compose.ui.Modifier\n    import androidx.compose.ui.tooling.preview.Preview\n    import com.example.androidtestsoapp.ui.theme.AndroidTestSoAppTheme\n    import com.hjq.permissions.Permission\n    import com.hjq.permissions.XXPermissions\n    import java.io.File\n    \n    class MainActivity : ComponentActivity() {\n        override fun onCreate(savedInstanceState: Bundle?) {\n            super.onCreate(savedInstanceState)\n            enableEdgeToEdge()\n            setContent {\n                AndroidTestSoAppTheme {\n                    Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding ->\n                        Greeting(\n                            name = \"Android\",\n                            modifier = Modifier.padding(innerPadding)\n                        )\n                    }\n                }\n            }\n            // Request permissions - read/write\n            XXPermissions.with(this)\n                .permission(Permission.WRITE_EXTERNAL_STORAGE)\n                .permission(Permission.READ_MEDIA_IMAGES)\n                .permission(Permission.READ_MEDIA_VIDEO)\n                .permission(Permission.READ_MEDIA_AUDIO)\n                .request { permissions, allGranted ->\n                    if (allGranted) {\n                        Log.d(\"MainActivity\", \"Permissions granted\")\n                        performFileOperations()\n                    } else {\n                        Log.d(\"MainActivity\", \"Permissions not granted\")\n                    }\n                }\n        }\n    }\n    \n    /**\n     * Need to place the nhp folder containing the etc folder in the phone's download folder\n     * After reading the phone storage download directory, call OpennhpLibrary\n     */\n    private fun performFileOperations() {\n        // Read phone storage download directory\n        val appDir = Environment.getExternalStorageDirectory().toString() + File.separator + \"download\"\n        // Check if zero folder exists in download\n        val file = File(appDir)\n        if (!file.exists()) {\n            Log.d(\"MainActivity\", \"Download folder does not exist\")\n            return\n        }\n        Log.d(\"MainActivity\", \"Download folder exists\")\n        val appDir1 = Environment.getExternalStorageDirectory().toString() + File.separator + \"download\" + File.separator + \"nhp\"\n        // Check if nhp folder exists in download\n        val file1 = File(appDir1)\n        if (!file1.exists()) {\n            Log.d(\"MainActivity\", \"nhp folder does not exist\")\n            return\n        }\n        val appDir2 = Environment.getExternalStorageDirectory().toString() + File.separator + \"download\" + File.separator + \"nhp\"+ File.separator + \"etc\"\n        // Check if etc folder exists in download\n        val file2 = File(appDir2)\n        if (!file2.exists()) {\n            Log.d(\"MainActivity\", \"Etc folder does not exist\")\n            return\n        }\n    \n        val initFlag = OpennhpLibrary.INSTANCE.nhp_agent_init(appDir1, 2)\n        if (!initFlag) {\n            println(\"NHP Agent init failed\")\n            return\n        }\n        println(\"start the loop knocking thread...\")\n        val flag:Int = OpennhpLibrary.INSTANCE.nhp_agent_knockloop_start()\n        // Print result\n        if (flag > 0) {\n            println(\"NHP Agent knockloop start success\")\n        } else {\n            println(\"NHP Agent knockloop start failed\")\n        }\n    }\n    \n    @Composable\n    fun Greeting(name: String, modifier: Modifier = Modifier) {\n        Text(\n            text = \"Hello $name!\",\n            modifier = modifier\n        )\n    }\n    \n    @Preview(showBackground = true)\n    @Composable\n    fun GreetingPreview() {\n        AndroidTestSoAppTheme {\n            Greeting(\"Android\")\n        }\n    }\n    ```\n\n- **java**\n\n    - 创建OpennhpLibrary接口来加载OpenNHP agent SDK。\n      <small>*（注：Android项目在引入.so文件时，会在动态库文件前加入lib，即代码中加载的SDK名称为nhpagent，实际程序加载的SDK为libnhpagent.so文件）*</small>\n\n      ```java\n      package org.example;\n      \n      import com.sun.jna.Library;\n      import com.sun.jna.Native;\n      \n      /**\n       * OpenNHP agent sdk interface\n       *\n       * @author haochangjiu\n       * @version JDK 8\n       * @className OpennhpLibrary\n       * @date 2025/10/27\n       */\n      public interface OpennhpLibrary extends Library {\n          // load OpenNHP agent sdk\n          OpennhpLibrary INSTANCE = Native.load(\"nhpagent\", OpennhpLibrary.class);\n      \n          /**\n           * @description Initialization of the nhp_agent instance working directory path:\n           *              The configuration files to be read are located under workingdir/etc/,\n           *              and log files will be generated under workingdir/logs/.\n           * @param workingDir: the working directory path for the agent\n           * @param logLevel:   0: silent, 1: error, 2: info, 3: debug, 4: verbose\n           *                    return boolean Whether agent instance has been initialized successfully.\n           * @return boolean\n           * @author haochangjiu\n           * @date 2025/10/27\n           * {@link boolean}\n           */\n          boolean nhp_agent_init(String workingDir, int logLevel);\n      \n          /**\n           * @description Synchronously stop and release nhp_agent.\n           * @author haochangjiu\n           * @date 2025/10/27\n           */\n          void nhp_agent_close();\n          /**\n           * @description Read the user information, resource information, server information,\n           *              and other configuration files written under workingdir/etc,\n           *              and asynchronously start the loop knocking thread.\n           * @return int\n           * @author haochangjiu\n           * @date 2025/10/27\n           * {@link int}\n           */\n          int nhp_agent_knockloop_start();\n      \n          /**\n           * @description Synchronously stop the loop, knock-on sub thread\n           * @author hangchangjiu\n           * @date 2025/10/27\n           */\n          void nhp_agent_knockloop_stop();\n      }\n      ```\n\n    - 调用SDK：样例中将配置文件的etc文件夹放在手机下载目录的nhp目录下\n\n      ```java\n      package org.example;\n      \n      import android.os.Bundle;\n      import android.os.Environment;\n      import android.util.Log;\n      import androidx.appcompat.app.AppCompatActivity;\n      \n      \n      import com.OpennhpLibrary;\n      import com.fancy.zerotrust.R;\n      \n      import java.io.File;\n      \n      public class MainActivity extends AppCompatActivity {\n      \n          @Override\n          protected void onCreate(Bundle savedInstanceState) {\n              super.onCreate(savedInstanceState);\n              // Read the phone's storage download directory.\n              String appDir = Environment.getExternalStorageDirectory() + File.separator + \"download\";\n              // Does the nhp directory exist in the downloads\n              File file = new File(appDir);\n              if (!file.exists()) {\n                  Log.d(\"MainActivity\",\"download file not exist！\");\n                  return;\n              }\n              Log.d(\"MainActivity\",\"download file exist！\");\n              String appDir1 = Environment.getExternalStorageDirectory() + File.separator + \"download\"+ File.separator + \"nhp\";\n              boolean initFlag = OpennhpLibrary.INSTANCE.nhp_agent_init(appDir1, 3);\n              if (!initFlag) {\n                  System.out.println(\"NHP Agent init failed\");\n                  System.exit(0);\n              }\n              System.out.println(\"start the loop knocking thread...\");\n              OpennhpLibrary.INSTANCE.nhp_agent_knockloop_start();\n          }\n      }\n      ```\n\n#### 2.2.2 IOS\n\n##### 2.2.2.1 环境准备\n\n- 在MacOS上完成IOS的客户端代理SDK编译，需要参照**编译源代码**中***系统需求***章节MacOS部分完成编译环境的搭建。\n\n- 确保已完成Xcode，如未安装Xcode需去App Store下载安装。\n\n- 安装gomobile：\n\n    - 安装gomobile\n\n      `go install golang.org/x/mobile/cmd/gomobile@latest`\n\n    - 初始化gomobile\n\n      `gomobile init`\n\n##### 2.2.2.2 SDK样例\n\n在编译IOS所需的.xcframework文件时，需要导出的方法名称必须大写开头，同时参数类型为标准的Go语言类型，不能是C.int和C.char。另外一点需要注意的是代码不能在**package main**下，将程序移动到新建的iossdk目录下。\n\n根据OpenNHP中的export.go文件进行修改如下：***opennhp/endpoints/agent/iossdk/export.go***\n\n```go\npackage iossdk\n\nimport \"C\"\nimport (\n\t\"encoding/base64\"\n\t\"encoding/json\"\n\t\"fmt\"\n\n\t\"github.com/OpenNHP/opennhp/endpoints/agent\"\n\t\"github.com/OpenNHP/opennhp/nhp/common\"\n\t\"github.com/OpenNHP/opennhp/nhp/core\"\n\t_ \"golang.org/x/mobile/bind\"\n)\n\nvar gAgentInstance *agent.UdpAgent\nvar gWorkingDir string\nvar gLogLevel int\n\n// Initialization of the nhp_agent instance working directory path:\n// The configuration files to be read are located under workingdir/etc/,\n// and log files will be generated under workingdir/logs/.\n//\n// Input:\n// workingDir: the working directory path for the agent\n// logLevel: 0: silent, 1: error, 2: info, 3: debug, 4: verbose\n//\n// Return:\n// Whether agent instance has been initialized successfully.\nfunc NhpAgentInit(workingDir string, logLevel int) bool {\n\tif gAgentInstance != nil {\n\t\treturn true\n\t}\n\n\tgAgentInstance = &agent.UdpAgent{}\n\terr := gAgentInstance.Start(workingDir, logLevel)\n\tif err != nil {\n\t\treturn false\n\t}\n\n\treturn true\n}\n\n// Synchronously stop and release nhp_\nfunc NhpAgentClose() {\n\tif gAgentInstance == nil {\n\t\treturn\n\t}\n\n\tgAgentInstance.Stop()\n\tgAgentInstance = nil\n}\n\n// Read the user information, resource information, server information,\n// and other configuration files written under workingdir/etc,\n// and asynchronously start the loop knocking thread.\n//\n// Input: None\n//\n// Return:\n// -1: Uninitialized error\n// >=0: The number of resources requested to knock by the knocking thread at the time of the call\n//\n//\t(knocking resources will be synchronized with changes in the configuration in workingdir/etc/resource.toml).\n//\n//export NhpAgentKnockloopStart\nfunc NhpAgentKnockloopStart() int {\n\tif gAgentInstance == nil {\n\t\treturn -1\n\t}\n\n\tcount := gAgentInstance.StartKnockLoop()\n\treturn count\n}\n\n// Synchronously stop the loop, knock-on sub thread.\nfunc NhpAgentKnockloopStop() {\n\tif gAgentInstance == nil {\n\t\treturn\n\t}\n\n\tgAgentInstance.StopKnockLoop()\n}\n\n// Setting agent's represented user information\n//\n// Input:\n// userId: User identification (optional, but not recommended to be empty)\n// devId: Device identification (optional)\n// orgId: Organization or company identification (optional)\n// userData: Additional fields required to interface with backend services (json format string, optional)\n//\n// Return:\n// Whether the user information is set successfully\nfunc NhpAgentSetKnockUser(userId string, devId string, orgId string, userData string) bool {\n\tif gAgentInstance == nil {\n\t\treturn false\n\t}\n\tvar data map[string]any\n\tif len(userData) > 0 {\n\t\terr := json.Unmarshal([]byte(userData), &data)\n\t\tif err != nil {\n\t\t\treturn false\n\t\t}\n\t}\n\n\tgAgentInstance.SetDeviceId(devId)\n\tgAgentInstance.SetKnockUser(userId, orgId, data)\n\treturn true\n}\n\n// Add an NHP server information to the agent for use in knocking on the door\n// (the agent can initiate different knocking requests to multiple NHP servers).\n//\n// Input:\n// pubkey: Public key of the NHP server\n// ip: IP address of the NHP server\n// host: Domain name of the NHP server (if a domain name is set, the ip item is optional)\n// port: Port number for the NHP server to operate (if set to 0, the default port 62206 will be used)\n// expire: Expiration time of the NHP server's public key (in epoch seconds, set to 0 for permanent)\n//\n// Return:\n// Whether the server information has been successfully added.\nfunc NhpAgentAddServer(pubkey string, ip string, host string, port int, expire int64) bool {\n\tif gAgentInstance == nil {\n\t\treturn false\n\t}\n\n\tif len(pubkey) == 0 || (len(ip) == 0 && len(host) == 0) {\n\t\treturn false\n\t}\n\n\tserverPort := int(port)\n\tif serverPort == 0 {\n\t\tserverPort = 62206 // use default server listening port\n\t}\n\n\tserverPeer := &core.UdpPeer{\n\t\tType:         core.NHP_SERVER,\n\t\tPubKeyBase64: pubkey,\n\t\tIp:           ip,\n\t\tPort:         serverPort,\n\t\tHostname:     host,\n\t\tExpireTime:   expire,\n\t}\n\tgAgentInstance.AddServer(serverPeer)\n\treturn true\n}\n\n// Delete NHP server information from the agent\n//\n// Input:\n// pubkey: NHP server public key\nfunc NhpAgentRemoveServer(pubkey string) {\n\tif gAgentInstance == nil {\n\t\treturn\n\t}\n\tif len(pubkey) == 0 {\n\t\treturn\n\t}\n\n\tgAgentInstance.RemoveServer(pubkey)\n}\n\n// Please add a resource information for the agent to use for knocking on the door\n// (the agent can initiate a knock-on request for different resources)\n//\n// Input:\n// aspId: Authentication Service Provider Identifier\n// resId: Resource Identifier\n// serverIp: NHP server IP address or domain name (the NHP server managing the resource)\n// serverHostname: NHP server domain name (the NHP server managing the resource)\n// serverPort: NHP server port (the NHP server managing the resource)\n//\n// Return:\n// Whether the resource information has been added successfully\nfunc NhpAgentAddResource(aspId string, resId string, serverIp string, serverHostname string, serverPort int) bool {\n\tif gAgentInstance == nil {\n\t\treturn false\n\t}\n\n\tif len(aspId) == 0 || len(resId) == 0 || (len(serverIp) == 0 && len(serverHostname) == 0) {\n\t\treturn false\n\t}\n\n\tresource := &agent.KnockResource{\n\t\tAuthServiceId:  aspId,\n\t\tResourceId:     resId,\n\t\tServerIp:       serverIp,\n\t\tServerHostname: serverHostname,\n\t\tServerPort:     serverPort,\n\t}\n\terr := gAgentInstance.AddResource(resource)\n\treturn err == nil\n}\n\n// Delete resource information from the agent\n//\n// Input:\n// aspId: Authentication Service Provider Identifier\n// resId: Resource Identifier\nfunc NhpAgentRemoveResource(aspId string, resId string) {\n\tif gAgentInstance == nil {\n\t\treturn\n\t}\n\n\tif len(aspId) == 0 || len(resId) == 0 {\n\t\treturn\n\t}\n\n\tgAgentInstance.RemoveResource(aspId, resId)\n}\n\n// The agent initiates a single knock on the door request to the server hosting the resource\n//\n// Input:\n// aspId: Authentication service provider identifier\n// resId: Resource identifier\n// serverIp: NHP server IP address or domain name (the NHP server managing the resource)\n// serverHostname: NHP server domain name (the NHP server managing the resource)\n// serverPort: NHP server port (the NHP server managing the resource)\n//\n// Returns:\n// The server's response message (json format string buffer pointer):\n// \"errCode\": Error code (string, \"0\" indicates success)\n// \"errMsg\": Error message (string)\n// \"resHost\": Resource server address (\"resHost\": {\"Server Name 1\":\"Server Hostname 1\", \"Server Name 2\":\"Server Hostname 2\", ...})\n// \"opnTime\": Door opening duration (integer, in seconds)\n// \"aspToken\": Token generated after authentication by the ASP (optional)\n// \"agentAddr\": Agent's IP address from the perspective of the NHP server\n// \"preActs\": Pre-connection information related to the resource (optional)\n// \"redirectUrl\": HTTP redirection link (optional)\n//\n// It is necessary to call NhpAgentAddServer before calling,\n// to add the NHP server's public key, address, and other information to the agent\n// The caller is responsible for calling NhpFreeCstring to release the returned char* pointer\nfunc NhpAgentKnockResource(aspId string, resId string, serverIp string, serverHostname string, serverPort int) string {\n\tackMsg := &common.ServerKnockAckMsg{}\n\n\tfunc() {\n\t\tif gAgentInstance == nil {\n\t\t\tackMsg.ErrCode = common.ErrNoAgentInstance.ErrorCode()\n\t\t\tackMsg.ErrMsg = common.ErrNoAgentInstance.Error()\n\t\t\treturn\n\t\t}\n\n\t\tif len(aspId) == 0 || len(resId) == 0 || (len(serverIp) == 0 && len(serverHostname) == 0) {\n\t\t\tackMsg.ErrCode = common.ErrInvalidInput.ErrorCode()\n\t\t\tackMsg.ErrMsg = common.ErrInvalidInput.Error()\n\t\t\treturn\n\t\t}\n\n\t\tresource := &agent.KnockResource{\n\t\t\tAuthServiceId:  aspId,\n\t\t\tResourceId:     resId,\n\t\t\tServerIp:       serverIp,\n\t\t\tServerHostname: serverHostname,\n\t\t\tServerPort:     serverPort,\n\t\t}\n\n\t\tpeer := gAgentInstance.FindServerPeerFromResource(resource)\n\t\tif peer == nil {\n\t\t\tackMsg.ErrCode = common.ErrKnockServerNotFound.ErrorCode()\n\t\t\tackMsg.ErrMsg = common.ErrKnockServerNotFound.Error()\n\t\t\treturn\n\t\t}\n\n\t\ttarget := &agent.KnockTarget{\n\t\t\tKnockResource: *resource,\n\t\t\tServerPeer:    peer,\n\t\t}\n\n\t\tackMsg, _ = gAgentInstance.Knock(target)\n\t}()\n\n\tbytes, _ := json.Marshal(ackMsg)\n\n\treturn string(bytes)\n}\n\n// The agent explicitly informs the NHP server to exit its access permission to the resource.\n//\n// Input:\n// aspId: Authentication Service Provider Identifier\n// resId: Resource Identifier\n// serverIp: NHP server IP address or domain name (the NHP server managing the resource)\n// serverHostname: NHP server domain name (the NHP server managing the resource)\n// serverPort: NHP server port (the NHP server managing the resource)\n//\n// Return:\n// Whether the exit was successful\n//\n// It is necessary to call NhpAgentAddServer before calling, to add the NHP server's public key, address, and other information to the\nfunc NhpAgentExitResource(aspId string, resId string, serverIp string, serverHostname string, serverPort int) bool {\n\tvar err error\n\tackMsg := &common.ServerKnockAckMsg{}\n\n\tfunc() {\n\t\tif gAgentInstance == nil {\n\t\t\tackMsg.ErrCode = common.ErrNoAgentInstance.ErrorCode()\n\t\t\tackMsg.ErrMsg = common.ErrNoAgentInstance.Error()\n\t\t\terr = common.ErrNoAgentInstance\n\t\t\treturn\n\t\t}\n\n\t\tif len(aspId) == 0 || len(resId) == 0 || (len(serverIp) == 0 && len(serverHostname) == 0) {\n\t\t\tackMsg.ErrCode = common.ErrInvalidInput.ErrorCode()\n\t\t\tackMsg.ErrMsg = common.ErrInvalidInput.Error()\n\t\t\terr = common.ErrInvalidInput\n\t\t\treturn\n\t\t}\n\n\t\tresource := &agent.KnockResource{\n\t\t\tAuthServiceId:  aspId,\n\t\t\tResourceId:     resId,\n\t\t\tServerIp:       serverIp,\n\t\t\tServerHostname: serverHostname,\n\t\t\tServerPort:     serverPort,\n\t\t}\n\n\t\tpeer := gAgentInstance.FindServerPeerFromResource(resource)\n\t\tif peer == nil {\n\t\t\tackMsg.ErrCode = common.ErrKnockServerNotFound.ErrorCode()\n\t\t\tackMsg.ErrMsg = common.ErrKnockServerNotFound.Error()\n\t\t\terr = common.ErrKnockServerNotFound\n\t\t\treturn\n\t\t}\n\n\t\ttarget := &agent.KnockTarget{\n\t\t\tKnockResource: *resource,\n\t\t\tServerPeer:    peer,\n\t\t}\n\n\t\tackMsg, err = gAgentInstance.ExitKnockRequest(target)\n\t}()\n\n\treturn err == nil\n}\n\n// cipherType: 0-curve25519; 1-sm2\n// result: \"privatekey\"|\"publickey\"\n// caller is responsible to free the returned char* pointer\n//\n//export NhpGenerateKeys\nfunc NhpGenerateKeys(cipherType int) string {\n\tvar e core.Ecdh\n\tswitch core.EccTypeEnum(cipherType) {\n\tcase core.ECC_SM2:\n\t\te = core.NewECDH(core.ECC_SM2)\n\tcase core.ECC_CURVE25519:\n\t\tfallthrough\n\tdefault:\n\t\te = core.NewECDH(core.ECC_CURVE25519)\n\t}\n\tpub := e.PublicKeyBase64()\n\tpriv := e.PrivateKeyBase64()\n\n\tres := fmt.Sprintf(\"%s|%s\", priv, pub)\n\n\treturn res\n}\n\n// cipherType: 0-curve25519; 1-sm2\n// privateBase64: private key in base64 format\n// result: \"publickey\"\n// caller is responsible to free the returned char* pointer\n//\n//export NhpPrivkeyToPubkey\nfunc NhpPrivkeyToPubkey(cipherType int, privateBase64 string) string {\n\tprivKey := privateBase64\n\tprivKeyBytes, err := base64.StdEncoding.DecodeString(privKey)\n\tif err != nil {\n\t\treturn \"\"\n\t}\n\n\te := core.ECDHFromKey(core.EccTypeEnum(cipherType), privKeyBytes)\n\tif e == nil {\n\t\treturn \"\"\n\t}\n\tpub := e.PublicKeyBase64()\n\n\treturn pub\n}\n\n```\n\n##### 2.2.2.3 编译SDK\n\n- 方法一：运行代码根目录下脚本\n  `make`\n\n- 方法二：单独编译SDK的.xcframework文件指令：\n\n  在`opennhp/endpoints/agent/sdk/`目录下执行编译指令<small>*（注：重新编辑的sdk源码文件放在了opennhp/endpoints/agent/sdk/下）*</small>\n\n  ` gomobile bind -target ios -o nhpagent.xcframework .`\n\n##### 2.2.2.4 SDK适配\n\n- **Objective-C**\n\n    - FileCopyManager.h：声明将SDK所需配置文件拷贝到沙盒方法\n\n      ```objective-c\n      //\n      //  FileCopyManager.h\n      //  TestXCFramework\n      //\n      //  Created by haochangjiu on 2025/10/30.\n      //\n      \n      #import <Foundation/Foundation.h>\n      \n      NS_ASSUME_NONNULL_BEGIN\n      \n      @interface FileCopyManager : NSObject\n      /// Copy the specified file(s) to the etc and certs directories in the application's home directory\n      + (void)copyFilesToSandboxEtc;\n      @end\n      \n      NS_ASSUME_NONNULL_END\n      \n      ```\n    - FileCopyManager.m：FileCopyManager.h的实现\n\n      ```objective-c\n      //\n      //  FileCopyManager.m\n      //  TestXCFramework\n      //\n      //  Created by haochangjiu on 2025/10/30.\n      //\n      \n      #import \"FileCopyManager.h\"\n      #import <Foundation/Foundation.h>\n      \n      @implementation FileCopyManager\n      \n      /// Copy the specified file(s) to the etc and certs directories in the application's home directory\n      + (void)copyFilesToSandboxEtc {\n          // 1. Retrieve the sandboxed Documents directory\n          NSArray *documentsURLs = [[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask];\n          NSURL *documentsURL = [documentsURLs firstObject];\n          if (!documentsURL) {\n              NSLog(@\"Failed to retrieve Documents directory\");\n              return;\n          }\n          \n          // 2. Define paths for etc and certs directories within the sandbox\n          NSURL *etcURL = [documentsURL URLByAppendingPathComponent:@\"etc\"];\n          NSURL *certsURL = [etcURL URLByAppendingPathComponent:@\"certs\"];\n          \n          // 3. Create etc and certs directories (if they don't exist)\n          [self createDirectoryIfNotExists:etcURL];\n          [self createDirectoryIfNotExists:certsURL];\n          \n          // 4. Copy toml files to the etc directory\n          NSArray *tomlFiles = @[@\"server.toml\", @\"config.toml\", @\"dhp.toml\", @\"resource.toml\"];\n          for (NSString *fileName in tomlFiles) {\n              [self copyFileFromBundle:fileName toDestinationURL:etcURL];\n          }\n          \n          // 5. Copy certificate files to the etc/certs directory\n          NSArray *certFiles = @[@\"server.crt\", @\"server.key\"];\n          for (NSString *fileName in certFiles) {\n              [self copyFileFromBundle:fileName toDestinationURL:certsURL];\n          }\n      }\n      \n      /// Create directory if it does not exist\n      + (void)createDirectoryIfNotExists:(NSURL *)directoryURL {\n          NSFileManager *fileManager = [NSFileManager defaultManager];\n          if (![fileManager fileExistsAtPath:directoryURL.path]) {\n              NSError *error;\n              BOOL success = [fileManager createDirectoryAtURL:directoryURL\n                                    withIntermediateDirectories:YES\n                                                     attributes:nil\n                                                          error:&error];\n              if (success) {\n                  NSLog(@\"Directory created successfully: %@\", directoryURL.path);\n              } else {\n                  NSLog(@\"Failed to create directory: %@, error: %@\", directoryURL.path, error.localizedDescription);\n              }\n          } else {\n              NSLog(@\"Directory already exists: %@\", directoryURL.path);\n          }\n      }\n      \n      /// Copy file from Bundle to destination path\n      + (void)copyFileFromBundle:(NSString *)fileName toDestinationURL:(NSURL *)destinationURL {\n          // Get the file path in the Bundle\n          NSURL *sourceURL = [[NSBundle mainBundle] URLForResource:[fileName stringByDeletingPathExtension]\n                                                      withExtension:[fileName pathExtension]];\n          if (!sourceURL) {\n              NSLog(@\"File not found in Bundle: %@\", fileName);\n              return;\n          }\n          \n          // Destination file path (destination directory + file name)\n          NSURL *destFileURL = [destinationURL URLByAppendingPathComponent:fileName];\n          \n          // Copy file (if it doesn't exist)\n          NSFileManager *fileManager = [NSFileManager defaultManager];\n          if (![fileManager fileExistsAtPath:destFileURL.path]) {\n              NSError *error;\n              BOOL success = [fileManager copyItemAtURL:sourceURL toURL:destFileURL error:&error];\n              if (success) {\n                  NSLog(@\"File copied successfully: %@ -> %@\", fileName, destFileURL.path);\n              } else {\n                  NSLog(@\"File copy failed: %@, error: %@\", fileName, error.localizedDescription);\n              }\n          } else {\n              NSLog(@\"File already exists: %@\", destFileURL.path);\n          }\n      }\n      \n      @end\n      \n      ```\n    - ViewController.m：程序主入口，进行SDK方法调用\n\n      ```objective-c\n      //\n      //  ViewController.m\n      //  TestXCFramework\n      //\n      //  Created by haochangjiu on 2025/10/30.\n      //\n      \n      #import \"ViewController.h\"\n      #import <Nhpagent/Nhpagent.h>\n      #import \"FileCopyManager.h\"\n      \n      @interface ViewController ()\n      \n      @end\n      \n      @implementation ViewController\n      \n      - (void)viewDidLoad {\n          [super viewDidLoad];\n          // Do any additional setup after loading the view.\n          // Invoke method to copy files from etc folder to sandbox etc directory\n          [FileCopyManager copyFilesToSandboxEtc];\n          // Retrieve the sandbox target path (Documents), which is the parent directory of the etc folder\n          NSArray *documentsURLs = [[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask];\n          NSURL *documentsURL = [documentsURLs firstObject];\n          if (!documentsURL) {\n              NSLog(@\"Error: Failed to read Documents directory\");\n          }\n          // Get the parent directory path of the etc folder\n          NSString *etcPath = documentsURL.path;\n          // SdkNhpAgentInit\n          BOOL initFlag = IossdkNhpAgentInit(etcPath, 3);\n          if (!initFlag) {\n              NSLog(@\"NHP Agent init failed\");\n              return;\n          }\n          // knockloop_start\n          long value = IossdkNhpAgentKnockloopStart();\n          NSLog(@\"SdkNhpAgentKnockloopStart value : %ld\", value);\n      }\n      \n      @end\n      \n      ```\n\n- **Swift**\n    - FileCopyManager.swift：将SDK所需配置文件拷贝到沙盒方法\n\n      ```sw\n      //\n      //  FileCopyManager.swift\n      //  TestXCFrameworkSwift\n      //\n      //  Created by haochangjiu on 2025/10/30.\n      //\n      \n      import UIKit\n      import Foundation\n      \n      class FileCopyManager {\n          \n          /// Copy specified files to the etc and certs directories in the sandbox\n          static func copyFilesToSandboxEtc() {\n              // 1. Get the Documents directory in the sandbox\n              guard let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else {\n                  print(\"Failed to get Documents directory\")\n                  return\n              }\n              \n              // 2. Define paths for etc and certs directories in the sandbox\n              let etcURL = documentsURL.appendingPathComponent(\"etc\")\n              let certsURL = etcURL.appendingPathComponent(\"certs\")\n              \n              // 3. Create etc and certs directories (if they don't exist)\n              createDirectoryIfNotExists(at: etcURL)\n              createDirectoryIfNotExists(at: certsURL)\n              \n              // 4. Copy toml files to the etc directory\n              let tomlFiles = [\"server.toml\", \"config.toml\", \"dhp.toml\", \"resource.toml\"]\n              tomlFiles.forEach { fileName in\n                  copyFileFromBundle(fileName: fileName, to: etcURL)\n              }\n              \n              // 5. Copy certificate files to the etc/certs directory\n              let certFiles = [\"server.crt\", \"server.key\"]\n              certFiles.forEach { fileName in\n                  copyFileFromBundle(fileName: fileName, to: certsURL)\n              }\n          }\n          \n          /// Create directory if it doesn't exist\n          private static func createDirectoryIfNotExists(at url: URL) {\n              let fileManager = FileManager.default\n              guard !fileManager.fileExists(atPath: url.path) else {\n                  print(\"Directory already exists: \\(url.path)\")\n                  return\n              }\n              \n              do {\n                  try fileManager.createDirectory(at: url, withIntermediateDirectories: true, attributes: nil)\n                  print(\"Directory created successfully: \\(url.path)\")\n              } catch {\n                  print(\"Failed to create directory: \\(url.path), error: \\(error.localizedDescription)\")\n              }\n          }\n          \n          /// Copy file from Bundle to destination path\n          private static func copyFileFromBundle(fileName: String, to destinationURL: URL) {\n              // Split filename and extension (handling files with extensions)\n              let fileNameWithoutExt = (fileName as NSString).deletingPathExtension\n              let fileExt = (fileName as NSString).pathExtension\n              \n              // Get the file path in the Bundle\n              guard let sourceURL = Bundle.main.url(forResource: fileNameWithoutExt, withExtension: fileExt) else {\n                  print(\"File not found in Bundle: \\(fileName)\")\n                  return\n              }\n              \n              // Destination file path (destination directory + filename)\n              let destFileURL = destinationURL.appendingPathComponent(fileName)\n              let fileManager = FileManager.default\n              \n              // Copy file (if it doesn't exist)\n              guard !fileManager.fileExists(atPath: destFileURL.path) else {\n                  print(\"File already exists: \\(destFileURL.path)\")\n                  return\n              }\n              \n              do {\n                  try fileManager.copyItem(at: sourceURL, to: destFileURL)\n                  print(\"File copied successfully: \\(fileName) -> \\(destFileURL.path)\")\n              } catch {\n                  print(\"File copy failed: \\(fileName), error: \\(error.localizedDescription)\")\n              }\n          }\n      }\n      \n      ```\n    - ViewController.swift：程序主入口，进行SDK方法调用\n\n      ```swift\n      //\n      //  ViewController.swift\n      //  TestXCFrameworkSwift\n      //\n      //  Created by haochangjiu on 2025/10/30.\n      //\n      \n      import UIKit\n      import Nhpagent\n      \n      class ViewController: UIViewController {\n          override func viewDidLoad() {\n              super.viewDidLoad()\n              // Do any additional setup after loading the view.\n              // Call method to copy files from etc folder to sandbox etc directory\n              FileCopyManager.copyFilesToSandboxEtc()\n              // Retrieve the sandbox target path (Documents), which is the parent directory of the etc folder\n              guard let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else {\n                  print(\"Error: Failed to read Documents directory\")\n                  return\n              }\n              // Get the parent directory path of the etc folder\n              let etcPath: String = documentsURL.path\n              // Call SdkNhpAgentInit for initialization\n              let initFlag: Bool = IossdkNhpAgentInit(etcPath, 3)\n              if !initFlag {\n                  print(\"NHP Agent init failed\")\n              }\n              // Call knockloop_start\n              let value = IossdkNhpAgentKnockloopStart()\n              print(\"SdkNhpAgentKnockloopStart value: %ld\", value)\n        }\n      }\n      ```\n    \n    \n"
  },
  {
    "path": "docs/zh-cn/build.zh-cn.md",
    "content": "---\r\nlayout: page\r\ntitle: 编译源代码\r\nparent: 中文版\r\nnav_order: 7\r\npermalink: /zh-cn/build/\r\n---\r\n\r\n# 编译OpenNHP\r\n{: .fs-9 }\r\n\r\n[English](/build/){: .label .fs-4 }\r\n\r\n---\r\n\r\n## 1. WSL环境准备\r\n\r\n**提示：** Windows 10/11下可以通过`WSL`子系统来运行Linux，详细请见WSL官方文档：<https://learn.microsoft.com/zh-cn/windows/wsl/install>\r\n\r\n- **【开启WSL功能】** 在Win10上，需要首先开启WSL才能使用WSL安装Linux，设置界面请见下图。\r\n   ![Win10上WSL设置](/images/win10wsl.png)\r\n- **【WSL上安装Linux】** 推荐在WSL上安装Ubuntu Linux，通过PowerShell运行以下命令安装：\r\n\r\n   ```bat\r\n   wsl --update\r\n   wsl --install -d Ubuntu\r\n   ```\r\n\r\n   如果遇到以下问题，参考：<https://blog.csdn.net/weixin_44293949/article/details/121863559>\r\n\r\n   ```text\r\n   无法从 'https://raw.githubusercontent.com/microsoft/WSL/master/distributions/DistributionInfo.json’提取列表分发。无法解析服务器的名称或地址\r\n   Error code: Wsl/WININET_E_NAME_NOT_RESOLVED\r\n   ```\r\n\r\n- **【WSL环境的IP地址】** 在WSL的Linux环境中，运行以下命令获取IP地址：\r\n\r\n|        主机        |                    查看IP地址的命令                     |\r\n| :----------------: | :-----------------------------------------------------: |\r\n|   WSL中Linux主机   |            `hostname -I \\| awk '{print $1}'`            |\r\n| WSL宿主Windows主机 | `ip route show \\| grep -i default \\| awk '{ print $3}'` |\r\n\r\n## 2. 系统需求\r\n\r\n- 2.1 `Go语言`环境：**Go 1.23** 。安装包下载地址: <https://go.dev/dl/>\r\n  - **Windows与macOS**环境下，通过下载的安装程序来安装Go。\r\n  - **Linux**环境下可以直接通过管理工具安装： `sudo apt install golang `\r\n  - 安装成功后，运行命令`go version` 来查看Go版本号。\r\n  - **Windows与macOS**环境下，通过下载的安装程序来安装Go。\r\n  - **Linux**环境下可以直接通过管理工具安装：`sudo apt install golang` 或者通过以下命令手动安装：\r\n\r\n   ```bash\r\n      1. sudo apt-get update\r\n      2. wget https://go.dev/dl/go1.21.0.linux-amd64.tar.gz\r\n      3. sudo tar -xvf go1.21.0.linux-amd64.tar.gz\r\n      4. sudo mv go /usr/local\r\n      5. export GOROOT=/usr/local/go\r\n      6. export GOPATH=$HOME/go\r\n      7. export PATH=$GOPATH/bin:$GOROOT/bin:$PATH\r\n      8. source ~/.profile\r\n   ```\r\n\r\n  - 安装成功后，运行命令`go version` 来查看Go版本号。\r\n- 2.2 `GCC`环境：\r\n  - **Linux与macOS**：**GCC 8.0**或以上。\r\n    - 查看GCC版本的命令：`gcc -v`\r\n    - 安装GCC： `sudo apt install build-essential`\r\n  - **Windows**:\r\n    1. 第一步：**安装mingw64**。mingw64可以通过msys2的包管理工具进行下载。安装msys2系统要求、下载与安装教程见：<https://www.msys2.org/>。\r\n    ![install_msys2](/images/install_msys2.png)\r\n\r\n    2. 第二步：**安装GCC**。在msys2的控制台输入命令：\r\n\r\n       ```bash\r\n       pacman -S mingw-w64-ucrt-x86_64-gcc\r\n       ```\r\n\r\n    3. 第三步：**配置GCC**。将GCC工具路径加入Windows的 *%PATH%* 环境变量。例如：mingw-w64-gcc的安装路径为`C:\\Program Files\\MSYS2\\`， 则需要运行命令\r\n\r\n       ```bat\r\n       setx PATH \"%PATH%;C:\\Program Files\\MSYS2\\ucrt64\\bin\r\n       ```\r\n       执行成功之后，打开新的命令行窗口，检查*gcc*的版本号\r\n       ```bat\r\n       gcc --version\r\n       ```\r\n\r\n  - **提示：** Windows下可以通过`WSL`子系统来运行Linux，详细请见WSL官方文档：<https://learn.microsoft.com/zh-cn/windows/wsl/install>\r\n    - 推荐在WSL上运行Ubuntu最新版v22，在Windows上的PowerShell运行以下命令安装：\r\n      ```bat\r\n      wsl --install --distribution Ubuntu-22.04\r\n      ```\r\n\r\n<small>*注：如果 2.1 和 2.2 已完成，直接在项目目录下执行编译命令 `.\\build.bat` 时，通常会遇到 `系统找不到指定的路径`或 ` 'lib' 不是内部或外部命令，也不是可运行的程序或批处理文件。` 的错误。2.3 提供了解决该问题的方法，供参考使用。*</small>\r\n\r\n- 2.3 `lib`环境：\r\n\r\n\r\n  - 在编译运行的命令中使用了 lib 工具，这是用于生成 .lib 文件的工具，通常用于链接静态库或导出符号表（在 Windows 中生成 .lib 文件以便与 .dll 文件配合使用）。遇到的错误提示 lib 不是内部或外部命令，表示系统找不到 lib 工具。\r\n\r\n  - **解决（'lib' 不是内部或外部命令，也不是可运行的程序或批处理文件）问题 ：** 安装 Visual Studio 和 Visual Studio tools。\r\n\r\n    - lib 工具是微软的库管理工具，通常随 Visual Studio 的 Microsoft Build Tools 安装。确保你已安装 Visual Studio，并且选择了 C++ 生成工具（C++ Build Tools）组件，其中包括 lib.exe。\r\n\r\n    - 如果还没有安装 Visual Studio，可以从 Visual Studio 官方网站下载安装：https://visualstudiomicrosoft.com/zh-hans/ 安装时，选择“桌面开发(C++)”工作负载，它包含 lib.exe 及其他必要的工具。\r\n\r\n    - 安装 Visual Studio 后，确保使用 Visual Studio 开发者命令行（Developer Command Prompt） 来运行包含 lib 命令的 `build.bat `文件。这个命令行工具会自动加载构建工具的环境变量，如 lib.exe\r\n\r\n   - **解决（系统找不到指定路径的错误）问题 ：** 更改`bulid.bat`文件中的路径\r\n\r\n     - 打开 `build.bat` 文件，找到\r\n     ```bat\r\n     call \"C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Community\\VC\\Auxiliary\\Build\\vcvarsall.bat\" x64\r\n     ```\r\n\r\n     - 修改为你自己的 visual studio目录下安装路径。比如：\r\n     ```bat\r\n     call \"F:\\develop\\visualstu\\VC\\Auxiliary\\Build\\vcvarsall.bat\" x64\r\n     ```\r\n\r\n- 2.4 `clang`编译环境(可选):\r\n\r\n  - **提示：**\r\n    - 关于clang编译工具，clang 只支持Linux，不支持windows，windows下无需安装clang。\r\n    - 关于eBPF模块编译，eBPF不支持windows，eBPF只支持Linux及内核5.6版本以上。\r\n  - 查看clang版本的命令：`clang --version`\r\n  - **Linux Ubuntu**:\r\n    - 安装clang llvm libbpf-dev：`sudo apt install clang llvm libbpf-dev`\r\n  - **Linux Centos**:\r\n    - 安装clang llvm libbpf-dev：`sudo yum install clang llvm libbpf-dev -y`\r\n\r\n\r\n## 3. 编译\r\n\r\n1. 拉取代码仓库\r\n\r\n   ```bash\r\n   git clone https://github.com/OpenNHP/opennhp.git\r\n   ```\r\n\r\n2. Go环境\r\n\r\n   ```bash\r\n   go env -w GOPROXY=\"https://goproxy.cn,direct\"\r\n   ```\r\n\r\n3. 编译构建\r\n   - **Linux与macOS**：运行代码根目录下脚本\r\n   `make`\r\n   - **Windows**：运行代码根目录下*BAT*文件\r\n   `build.bat`<br>\r\n   <small>*（注：如果在windows下编译过程中出现错误，请尝试此编译方法：在Visual Studio的developer command prompt for VS命令窗口中，切换到项目目录，执行`./build.bat`命令）*</small>\r\n   - **Linux下编译eBPF**: 运行代码根目录下脚本\r\n   `make ebpf`<br>\r\n   <small>*（注：命令 `make ebpf`，会连带编译ebpf模块）*</small>\r\n\r\n## 4. 结果\r\n\r\n编译出来的二进制文件都在代码目录下的`release`子目录下。\r\n\r\n- **NHP-Server**的可执行文件和配置文件： `release\\nhp-server` 子目录下\r\n- **NHP-AC**的可执行文件和配置文件： `release\\nhp-ac` 子目录下\r\n- **NHP-Agent**的可执行文件和配置文件： `release\\nhp-agent` 子目录下\r\n- **NHP-DB**的可执行文件和配置文件： `release\\nhp-db` 子目录下\r\n- **NHP-KGC**的可执行文件和配置文件： `release\\nhp-kgc` 子目录下\r\n- 所有二进制文件打包成一个`tar`文件:  `release\\archive` 子目录下\r\n\r\n---\r\n"
  },
  {
    "path": "docs/zh-cn/code.zh-cn.md",
    "content": "---\nlayout: page\ntitle: 源代码解读\nparent: 中文版\nnav_order: 8\npermalink: /zh-cn/code/\n---\n\n# OpeNHP代码解读\n{: .fs-9 }\n\n[English](/code/){: .label .fs-4 }\n\n---\n\n## 1. 层级架构\n\n1. 上层逻辑组件层负责UDP的连接建立、维护与断开\n2. Device层负责：1.将上层的消息明文转为NHP报文并发送到连接；2.将从连接收到的NHP报文转化为消息明文并提供上层处理\n3. 上层逻辑组件提供\n![avatar](/images/provide.png)\n\n## 2. 连接管理\n\n1. 上层逻辑组件可以建立并维护多个连接UdpConn，根据实际需求创建所需对象成员。每一个UdpConn起一个线程进行收发包操作。\n2. 每一个UdpConn需要建立一个Device层的ConnData，并向Device ConnData传递实际连接中的远端地址，报文收发通道，cookie等。\n3. 每一个UdpConn允许进行多次双向的transaction或单向发包。（agent除外，原则上agent每次请求都创建一个新的连接）\n4. 每一个transaction都建立一个自身的线程和通道用于维持交互操作，超时后自行销毁。Local transaction（本地创建的交互）由device统一管理，Remote transaction（远端创建的交互）由远端连接管理，transaction的回应在收发包时需要找出相应的transaction线程进行后续操作。\n\n## 3. 对象命名\n\n1. 上层逻辑组件在收发方向上可能具有多重身份，Device层中使用initiator和responder表示发起方和接收方。\n\n## 4. 报文缓冲区的创建与销毁（回收）\n\n1. 为了提高吞吐率，报文缓冲区不采用自动垃圾回收机制而采用waitpool分配回收机制。\n2. 接收：device创建报文缓冲区接收网络数据，根据NHP包头对报文进行解析与校验。解析结果存储在ResponderSessionParams结构中（名称不好理解，可能会改变）。明文消息仍然会使用报文缓冲区。缓冲区的销毁分两种情况，单向通信的结构体在上层应用获取明文消息后销毁。transaction接收缓冲区在transaction结束后销毁。\n3. 发送：device创建报文缓冲区，填充包头并对消息进行加密后存储在InitiatorSessionParams结构中并发送。transaction发送在未收到对端回应时会重试发送。缓冲区的销毁分两种情况，单向通信的结构体在发送后销毁。transaction发送的缓冲区在transaction结束后销毁。\n\n**消息的加密与解密：**\n连接中接收到的UDP原始数据会被device解析并放入device的MsgToPacketQueue队列中，等待后端处理。\n发送消息到连接时，需构建initiatorsessionstarter结构传入消息信息与连接信息，放入device的MsgToPacketQueue队列中，device会将消息进行加密发出。\n\n## 5. NHP-Device 架构设计\n\n1. Device负责NHP报文与消息的转换。Device初始化时需要指定类型和私钥。Device视自身类型只对相应的包进行处理。\n\n2. 用于承载发送和接收报文的buffer比较大，所以由Device的内存Pool统一发放并回收（如果依赖于Go后台垃圾回收，高并发时会造成大量内存开销）。所以在开发时一定要注意buffer的分配**Device.AllocatePoolPacket\\(\\)** 和回收**Device.ReleasePoolPacket\\(\\)**。\n\n   - 报文buffer回收点位于\n     - 发送报文被发送后（本地transaction除外）\n     - 接收报文解析完毕时（远程transaction除外）\n     - 本地或远程transaction线程停止时\n\n3. 上层逻辑调用接口**SendMsgToPacket**将消息转换成加密报文并发送到连接。\n\n4. 上层逻辑调用接口**RecvPacketToMsg**将加密报文解析成消息后放入**DecryptedMsgQueue**队列并等待处理（通常情况）。\n\n   - 特殊情况：如果请求发起方已指定接收通道，解析后的消息会被送到请求方指定的消息通道**ResponseMsgCh**，而不放进常规消息队列进行排队。\n\n5. 交互（**transaction**）：一次请求需要等待一次回复的操作称为交互。一次由Device发起的交互请求为本地交互（**LocalTransaction**），一次由Device接收到的交互请求为远程交互（**RemoteTransaction**）。由于回应报文需要继承请求报文生成的**ChainKey**，所以所有的交互分发由Device进行管理。\n\n6. 连接上下文（**ConnectionData**）：由上层逻辑传入的与连接相关的所有信息，Device在加密消息后将报文发送到连接。一个连接可以进行多个**transaction**。\n\n7. 在建立发送请求时，需要创建**MsgAssembler**结构体。\n\n   - Agent和AC必须填写消息类型**HeaderType**、对端**RemoteAddr**、对端公钥**PeerPk**和消息明文**Message**（如无特殊情况都采用消息压缩）。将填写好的**MsgAssembler**发给各自的**sendMessageRoutine\\(\\)** 即可进行新连接的建立或寻找已存在连接并进行转换后报文的发送。\n\n   - Server必须填写消息类型**HeaderType**、连接上下文**ConnData**、对端公钥**PeerPk**和消息明文**Message**（如无特殊情况都采用消息压缩）。将填写好的**MsgAssembler**发给**Device.SendMsgToPacket\\(\\)** 即可进行转换后报文的发送。\n\n   - 如果存在交互，可以直接使用上一条获得的 **\\*PacketParserData**填入**MsgAssembler**结构体的**PrevParserData**字段，从而可以省略填写**RemoteAddr**、**ConnData**、**PeerPk**。\n\n   - 如果请求期待回复数据，需要创建一个接收**PacketParserData**的通道，并对**MsgAssembler**结构体的**ResponseMsgCh**字段赋值。\n\n## 6. NHP-Server\n\n### 6.1 NHP-Server 架构设计\n\n\n1. Server启动时监听特定端口，等待Agent和AC进行连接。并由Agent或AC主动触发向Server的通信。不存在Server向Agent或AC主动建立连接的情况，通常情况下这种连接会跨防火墙或NAT导致不能建立。\n   - 特殊情况：Server在收到Agent发起的敲门处理时，鉴权后需要主动向AC发起开门请求，并等待回应。\n\n2. 发送消息时，向**sendMsgCh**发送创建好的**MsgAssembler**（必须从已有连接中指定**ConnData**）。**MsgAssembler**经过加密后会从此连接发出\n\n3. 接收到报文时，会将报文进行解密获取明文消息。由**msghandler**分别进行处理。\n\n### 6.2 NHP-Server 配置文件\n\n`etc/config.json`\n\n```json\n{\n  // (mandatory) private key in base64 format\n  \"privateKey\": \"eHdyRHKJy/YZJsResCt5XTAZgtcwvLpSXAiZ8DBc0V4=\",\n  // (mandatory) specify the udp listening port\n  \"listenPort\": 62206,\n  // whether to validate peer's public key when receiving NHP packet from agent. If true, server must have a pre-recorded public key pool (in \"agents\" field) of all allowed agents. If false, server skip public key validation, so it reduces secure level.\n  \"disableAgentValidation\": false,\n  // list of preset allowed AC peers. only public key and expire time are needed. It has the same effect as AddACPeer()\n  \"acs\": [\n    {\n      // type: NHP-AC\n      \"type\": 3,\n      // public key in base64 format\n      \"pubKeyBase64\": \"Fr5jzZDVpNh5m9AcBDMtHGmbCAczHyPegT8IxQ3XAzE=\",\n      // expire time for the public key (seconds from epoch)\n      \"expireTime\": 1716345064\n    }\n  ],\n  // list of preset allowed agent peers. only public key and expire time are needed. It has the same effect as AddAgentPeer()\n  \"agents\": [\n    {\n      // type: NHP-Agent\n      \"type\": 1,\n      // public key in base64 format\n      \"pubKeyBase64\": \"WnJAolo88/q0x2VdLQYdmZNtKjwG2ocBd1Ozj41AKlo=\",\n      // expire time for the public key (seconds from epoch)\n      \"expireTime\": 1716345064\n    }\n  ],\n  // (optional) placeholder of preset url for possible authorization service provider\n  \"asps\": {\n    \"abc.com\": {\n      \"aspId\": \"abc.com\",\n      \"urlAddr\": \"http://120.92.16.228:30088\",\n      \"urlOTP\": \"/nhp/api/v1/preAuth\",\n      \"urlReg\": \"/nhp/api/v1/registerAgent\",\n      \"urlAuth\": \"/nhp/api/v1/verifyAuth\",\n      \"urlList\": \"/nhp/api/v1/resourceList\"\n    }\n  },\n  // (optional) specify other source IP addresses to be opened by the ac that may come along with certain agent IP address \n  \"srcAsscAddrs\": {\n    \"192.168.2.27\": [\n      {\n        \"ip\": \"192.168.2.26\",\n        \"port\": 54222\n      },\n      {\n        \"ip\": \"192.168.2.28\",\n        \"port\": 54223\n      }\n    ]\n  },\n  // preset resources for udp knocking\n  \"udpRess\": {\n    // ID of authorization service provider\n    \"abc_group\": {\n      // ID of resource group\n      \"app_resource_group_000\": {\n        // skip service provider authorization and use this preset resource group\n        \"skipAuth\": true,\n        // set the desired open time for this resource group (in second)\n        \"opnTime\": 120,\n         \"resInfo\": {\n          // name of resource\n          \"apiServer\": {\n            // (optional) hostname overrides addr.ip at knock feedback\n            \"host\": \"api.abc.com\",\n            // (mandatory) request ac to open which layer 4 address and protocol of this resource\n            \"addr\": {\n              // (mandatory) request ac to open traffic destinated to the public IP address of this resource\n              \"ip\": \"12.34.56.78\",\n              // (optional) request ac to open traffic destinated to the port number where this resource hosts on. empty or 0 means open all port numbers.\n              \"port\": 443,\n              // (optional) protocol, \"tcp\": request ac to open only tcp traffic, \"udp\": request ac to open only udp traffic, empty: request ac to open tcp + udp + icmp echo traffic\n              \"proto\": \"tcp\"\n            },\n          }\n         }\n      }\n    }\n  },\n  // preset resources for http knocking\n  \"httpRess\": {\n    // ID of authorization service provider\n    \"abc_group\": {\n      // ID of the resource group, usually it means AppId\n      \"app_resource_group_001\": {\n        // set the desired open time for this resource group (in second)\n        \"opnTime\": 120,\n        // contains multiple resources\n        \"resInfo\": {\n          // name of resource\n          \"apiServer\": {\n            // (optional) hostname overrides addr.ip at knock feedback\n            \"host\": \"api.abc.com\",\n            // (mandatory) request ac to open which layer 4 address and protocol of this resource\n            \"addr\": {\n              // (mandatory) request ac to open traffic destinated to the public IP address of this resource\n              \"ip\": \"12.34.56.78\",\n              // (optional) request ac to open traffic destinated to the port number where this resource hosts on. empty or 0 means open all port numbers.\n              \"port\": 443,\n              // (optional) protocol, \"tcp\": request ac to open only tcp traffic, \"udp\": request ac to open only udp traffic, empty: request ac to open tcp + udp + icmp echo traffic\n              \"proto\": \"tcp\"\n            },\n            // (optional) the private layer 4 address of the ac. In some network, server may communicate with ac using private addresses. \n            \"acAddr\": {\n              \"ip\": \"172.16.1.2\",\n              \"port\": 443\n            },\n            // whether to append \":port\" at the end of hostname/ip at knock feedback. For example, set this field to false if this resource use https and requesting ac to open port 443.\n            \"portSuffix\": false\n          },\n          // another resource\n           \"webServer\": {\n            \"host\": \"www.abc.com\",\n            \"addr\": {\n              \"ip\": \"23.45.67.89\",\n              \"port\": 8080,\n              \"proto\": \"\"\n            },\n            \"portSuffix\": true\n          }\n        },\n        // (optional) additional key info for server calling further authroization APIs\n        \"accessKey\": \"b3458c581ef0efb7b669\",\n        \"secretKey\": \"f21c2a02c09a641a11cf\"\n      }\n    },\n    // another authorization service provider\n    \"xyz_org\": {\n      \"abcd1234\": {\n        \"opnTime\": 120,\n        \"resInfo\": {\n          \"udpServer\": {\n            \"host\": \"server.xyz.net\",\n            \"addr\": {\n              \"ip\": \"1.2.3.4\",\n              \"port\": 443,\n              \"proto\": \"udp\"\n            },\n            \"portSuffix\": false\n          }\n        },\n        // (optional) additional key info for server calling further authroization APIs\n        \"appKey\": \"demo-l2T0J3U3mQZ3\",\n        \"appSecret\": \"hVqd8eOqCFg5cc1D2ouACs3q\"\n      }\n    }\n  }\n}\n```\n\n## 7. NHP-AC\n\n### 7.1 NHP-AC 架构设计\n\n1. AC支持与多台Server互相进行通信。所有连接均为AC主动向Server发起。AC通过发送心跳包和NHP-AOL包维持与Server的连接。\n\n2. AC与Server通信失效后，将尝试重新建立连接，如果一直无法与任何一台Server建立连接，则进入失效状态。\n\n3. AC在启动后即开始与预设的服务器周期性建立连接并保持连接（AC很有可能在内网，所以不能由服务器先发连接）。连接时发送NHP_DOL消息，在收到服务器的回应后确认连接。连接期间视情况进行发送NHP_KPL消息保持连接。由**maintainServerConnectionRoutine**实现。\n\n4. AC处理服务器发送过来的NHP_DOP消息，判断请求方的serviceId, appId是否匹配并进行IPSET操作，完成后返回NHP_DRT消息。\n\n5. 发送消息时，向**sendMsgCh**发送创建好的**MsgAssembler**（必须指定**RemoteAddr**）。如果连接没有建立，AC会尝试建立并记录该连接。同时对此连接开启接收线程。**MsgAssembler**经过加密后会从此连接发出\n\n6. 接收到报文时，会将报文进行解密获取明文消息。由**msghandler**分别进行处理。\n\n### 7.2 NHP-AC IP放行模式\n\nIP放行模式分为两种：\n\n1. ipPassMode为0（默认）时为立即放行模式，门禁开门时将以敲门来源IP地址为准。\n\n2. ipPassMode为1时为预访问模式，门禁开门前将先开启对应协议的临时端口并返回server临时端口和临时访问token，在短时间内需由agent携带临时访问token进行临时连接，如果临时连接有效，则开门时放行将以此次临时连接的来源IP为准。\n\n### 7.3 NHP-AC 配置文件\n\n`etc/config.toml`\n\n```toml\n[AC]\n  # (optional) assign an unique id for this ac\n  ACId = \"abc_group_ac_001\"\n  # (mandatory) specify the private key in base64 format\n  ACPrivateKey = \"+B0RLGbe+nknJBZ0Fjt7kCBWfSTUttbUqkGteLfIp30=\"\n  # 0: default, passing the knock source IP\n  # 1: use pre-access procedure to determine the passing source IP\n  IpPassMode = 0\n  # (optional) ID of authorization service provider this ac belongs to\n  AuthServiceId = \"abc_group\" \n  # (optional) ID of resources controlled by this ac\n  ResourceIds = [\"abc_group_web_server\", \"abc_group_api_server\"]\n  # (optional) ID of organization\n  OrganizationId = \"5f3e36149fa95c0414408ad4\"\n\n# server peers list\n[[Servers]]\n  # (optional) the server's hostname. Its resolved address overrides the \"Ip\" field\n  Host = \"\"\n  # IP address of the server peer\n  Ip = \"192.168.80.35\"\n  # listening port for the server peer\n  Port = 62206\n  # type: NHP-Server\n  Type = 2\n  # specify the server peer's public key in base64 format\n  PublicKey = \"WqJxe+Z4+wLen3VRgZx6YnbjvJFmptz99zkONCt/7gc=\"\n  # expire timestamp of the public key (seconds from epoch)\n  ExpireTime = 1716345064\n\n# another server\n#[[Servers]]\n#  Ip = \"192.168.135.1\"\n#  Port = 7776\n#  Type = 2\n#  PublicKey = \"dstv1KlD2oVXiwgOxWtgZd+YmrOhU46W3emTGrHRADk=\"\n#  ExpireTime = 1716345064\n\n```\n\n## 8. NHP-Agent\n\n### 8.1 NHP-Agent 架构设计\n\n1. Agent只与Server之间进行通信。Agent主动向Server发起短连接。不存在Agent在未建立连接时被动接收Server消息的情况。\n\n2. 发送消息时，向**sendMsgCh**发送创建好的**MsgAssembler**（必须指定**RemoteAddr**）。如果连接没有建立，agent会尝试建立并记录该连接。同时对此连接开启接收线程。**MsgAssembler**经过加密后会从此连接发出\n\n3. 接收到报文时，会将报文进行解密获取明文消息。由**msghandler**分别进行处理。\n\n### 8.2 NHP-Agent 配置文件\n\n`etc/config.json`\n\n```json\n{\n  // (mandatory) specify the private key in base64 format\n  \"privateKey\": \"+Jnee2lP6Kn47qzSaqwSmWxORsBkkCV6YHsRqXCegVo=\",\n  // (optional) ID of authorization service provider this agent belongs to\n  \"aspId\": \"abc_group\",\n  // (mandatory) an user object is necessary to carry out knock requests\n  \"user\": {\n    \"userId\": \"zengl\",\n    \"devId\": \"0123456789abcdef\",\n    \"orgId\": \"abc.com.cn\"\n  },\n  // preset resources to begin knock after start\n  \"knockRess\": [\n    {\n      \"aspId\": \"abc_group\",\n      \"resId\": \"app_resource_group_001\",\n      \"serverKey\": \"WqJxe+Z4+wLen3VRgZx6YnbjvJFmptz99zkONCt/7gc=\"\n    }\n  ],\n  // list of preset allowed server peers to send knock request. It has the same effect as AddServer()\n  \"servers\": [\n    {\n      // (optional) the server's hostname. Its resolved address overrides the \"Ip\" field\n      \"host\": \"\",\n      // IP address of the server peer\n      \"ip\": \"192.168.80.35\",\n      // listening port for the server peer\n      \"port\": 62206,\n      // type: NHP-Server\n      \"type\": 2,\n      // public key in base64 format\n      \"pubKeyBase64\": \"WqJxe+Z4+wLen3VRgZx6YnbjvJFmptz99zkONCt/7gc=\",\n      /// expire time for the public key (seconds from epoch)\n      \"expireTime\": 1716345064\n    }\n  ]\n}\n```\n\n## 9. Log 设计\n\n日志log设计为异步写入，相比同步日志写入，在调用时不会立即进行写入日志文件的I/O操作而影响正常业务逻辑，在高并发时可以聚合多条日志并合并为一次文件写入，大幅减少文件I/O操作次数。\n\nLogger对象可以单独创建使用（**NewLogger()**），也可以在应用程序启动时指定Package全局变量**glbLogger**，供整个工程使用。\n\n注意：应用程序结束前，需调用Logger.Close()，确保最后缓存的日志能够写入文件。\n"
  },
  {
    "path": "docs/zh-cn/comparison.zh-cn.md",
    "content": "---\nlayout: page\ntitle: 对比NHP与SPA\nparent: 中文版\nnav_order: 5\npermalink: /zh-cn/comparison/\n---\n\n# 对比NHP与SPA\n{: .fs-9 }\n\n注: 以下内容摘自《Applied Sciences》杂志2024年第14卷第13期的期刊论文《AHAC: Advanced Network-Hiding Access Control Framework》论文，值得特别指出的是，AHAC框架是NHP（OpenNHP）技术体系中的一个关键组成部分。\n\n[English](/comparison/){: .label .fs-4 }\n\n---\n\n- [NHP与SPA的对比](#nhp与spa的对比)\n- [目录：](#目录)\n  - [1. 优势对比](#1-优势对比)\n  - [2. 性能对比](#2-性能对比)\n    - [2.1 加密算法开销](#21-加密算法开销)\n    - [2.2 性能开销](#22-性能开销)\n  - [](#)\n  - [3. 高可用性对比](#3-高可用性对比)\n  - [4. 扩展性对比](#4-扩展性对比)\n    - [4.1 与DNS集成](#41-与dns集成)\n    - [4.2 与FIDO集成](#42-与fido集成)\n  - [5. 兼容性对比](#5-兼容性对比)\n  \n## 1. 优势对比\n\nNHP通过结合噪声协议、密钥对和ECDH算法，提供强大的双向认证机制。与传统方法相比，NHP在性能、可扩展性和安全性上有显著优势。它支持多种编程语言（如C/C++、Python、Java和Go），并提供高度可扩展的架构，增强设备验证能力，防御重放攻击，彻底解决IP放大问题。NHP特别适合企业IAM系统和安全资源访问等需要强认证和加密的场景，优化了性能并提升了高可用性，确保在复杂环境中的无缝兼容性和高安全性。相比之下，SPA虽然具有一定优势，但在安全性、性能和可扩展性方面仍无法与NHP媲美。\n\n|              | SPA                            | NHP                            |\n| ------------ | ------------------------------ | ------------------------------ |\n| 开发语言     | C , C++                        | C/C++ , Python , Java , Go     |\n| 通信         | 单包授权                       | 噪声协议 , ECDH                |\n| 体系架构     | 复杂性 , 加密的数据包 , 防火墙 | 先进性 , 可扩展性 , 噪声协议   |\n| 认证         | UDP 敲门 ，IP 放大问题         | 设备指纹，UDP 和 TCP 敲门      |\n| 密码框架     | RSA , AES                      | 噪声协议 , ECDH                |\n| 性能         | 中等开销 ，高效                | 优化 ，最小化开销              |\n| 隐藏网络能力 | 仅服务/应用的端口              | 域名 、IP和端口                |\n| 可用性       | 高负载                         | 高可用性 ，可扩展集群          |\n| 可扩展性     | 复杂实现                       | FIDO+NHP，高度可扩展，易于集成 |\n| 兼容性       | 各种系统，可能需要集成         | 较高，跨平台，面向未来         |\n| 安全性       | 强加密，密钥管理风险           | 地址隐藏，相互认证             |\n| 应用场景     | 高安全性场景                   | 可扩展的，高安全环境           |\n\n## 2. 性能对比\n\n### 2.1 加密算法开销\n\nSPA 采用的是 RSA 加密算法，而 NHP 采用的是 ECC 加密算法。我们根据安全强度和密钥长度比较了 RSA 和 ECC 的性价比，如下表所示。在相同的安全标准下，ECC 算法的密钥长度显著短于 RSA 算法。此外，RSA 消息签名生成的密文大小大致等于密钥长度。因此，在验证网络消息身份时，NHP 使用更短的 ECC 随机密钥（32 字节或 64 字节）进行 ECDH 交换，而不是传输较大的 RSA2048 消息签名（256 字节）进行验证，不仅降低了计算开销，还更加高效地节省了宝贵的带宽资源。这一策略表明，NHP 在提高系统效率和资源利用率方面相较于 SPA 具有显著优势。\n\n\n| 安全强度（比特） | SPA (最小值公钥长度（位）) | NHP(最小值公钥长度（位）) | NHP vs SPA(密钥长度比) | 有效期     |\n| ---------------- | -------------------------- | ------------------------- | ---------------------- | ---------- |\n| 80               | 1024                       | 160-223                   | 1：6                   | 直到2010年 |\n| 112              | 2048                       | 224-255                   | 1：9                   | 直到2010年 |\n| 128              | 3072                       | 256-383                   | 1：12                  | 2031年以后 |\n| 192              | 7680                       | 384-511                   | 1：20                  |            |\n| 256              | 15360                      | 512+                      | 1：30                  |            |\n\n\n我们通过实验测量了 RSA 和 ECC 的加解密时间，具体结果见下表。实验增加了加密和解密的循环次数，测试两种算法在不同情况下的性能。结果显示，尽管 RSA 和 ECC 的加解密时间随着循环次数的增加而上升，但 ECC 的时间开销始终远低于 RSA。尤其在循环次数增多时，ECC 的优势更加明显，RSA 的时间开销最高达到 ECC 的约 800 倍。这一显著差距表明，NHP 在加解密效率上明显优于 SPA，为实际应用中选择更高效的加密算法提供了有力的依据。\n\n| 循环次数（次） | SPA      | NHP    |\n| -------------- | -------- | ------ |\n| 1              | 0.34s    | 687us  |\n| 10             | 2.48s    | 3.60ms |\n| 100            | 27.54s   | 0.03s  |\n| 200            | 61.18s   | 0.06s  |\n| 500            | 136.23s  | 0.16s  |\n| 1000           | 287.61s  | 0.32s  |\n| 10000          | 2832.42s | 3.81s  |\n\n\n### 2.2 性能开销\n\n为了全面评估 NHP 的性能表现，我们搭建了一个下图所示的实验环境，针对 NHP 和 SPA 进行了负载性能测试。该环境由两个主要区域组成：Agent 部署区域和网络隐身部署区域。\n\n![部署图](/images/Deploment_diagram.png)\n\n\n在网络隐身部署区域，我们集成了网络隐身服务器和应用服务器作为关键组件。为了确保测试环境的稳定性和一致性，我们选用了三台配置相同的机器，每台配备 4 核 CPU 和 8G 内存。在 agent 部署区域，我们启动了 n 个 agent 服务，这些服务以每秒发送一次敲门请求的频率与网络隐身服务器通信。同时，在网络隐身服务器上部署了 JMeter 组件，用于模拟和监控其性能表现。应用服务器端同样部署了 JMeter 服务，实时跟踪网络隐身服务器的性能资源消耗情况。通过这种设置，我们能够全面监控和比较 NHP 与 SPA 的性能表现。\n\n在保持实验环境一致性的前提下，我们按照部署方案分别选取了1、10、20、30、40、50个agent，对NHP和SPA进行了性能测试。测试结果如表4所示，其中横轴表示参与实验的agent数量，纵轴则显示测试期间的CPU占用率变化。通过这种设置，我们能够直观地观察到随着agent数量的增加，NHP和SPA在CPU资源消耗方面的不同表现。\n\n![CPU对比](/images/CPU_compare.png)\n\n实验结果显示，随着 Agent 数量的增加，NHP 和 SPA 的 CPU 负载均呈现上升趋势。然而，随着 Agent 数量的进一步增加，NHP 的性能优势逐渐凸显，其 CPU 负载大约维持在 SPA 的一半左右，展现出显著的效率提升。\n> 注:尽管理论上 NHP 的性能应较 SPA 提升约 1000 倍，但实际测试中仅提升约 1 倍。分析原因，主要因素包括网络开销对性能的显著影响、垃圾回收机制导致的性能损失，以及硬件环境差异。此外，尽管出于代码安全性和加密算法实现的考虑，我们选择了内存安全的 Go 语言开发，但其垃圾回收机制也对性能产生了一定影响。\n\n## 3. 高可用性对比\n\nNHP 通过分布式架构实现零信任服务的高可用性，确保敲门模块和门禁模块在不同主机上部署，以避免资源占用和提升弹性扩展。即使发生故障，也能无缝切换服务，维持系统功能和响应速度。这种设计增强了系统的稳健性和稳定性，降低了服务故障对整体系统的影响，如下图所示。\n\n![高可用架构](/images/High-availability.png)\n\nNHP 支持敲门验证服务的横向弹性扩展，能够根据实时负载动态调整服务实例数。这一功能提供了极高的弹性和可扩展性，确保在高负载下服务依然快速响应且稳定。每个服务实例均能处理敲门请求并维持业务会话，这种设计不仅提升了处理能力，还增强了容错性，保证了业务连续性和稳定性。从测试结果来看，NHP 在高可用性方面相较于 SPA 显著提升\n\n![负载图](/images/Load_diagram.png)\n\n\n## 4. 扩展性对比\n\n尽管NHP设计为数据通信提供了可信、可控、可靠和可证的基础保障，但考虑到通信场景和环境的多样性和复杂性，NHP还需具备良好的扩展性以适应不同的定制需求。NHP的扩展性体现在几个方面：\n\n- 其双向通信机制相比SPA的单向敲门机制，提供了更丰富的扩展能力，可以隐藏资源的真实IP地址并支持数据通信前后的密钥交换，增强隐私计算和数据流通场景的安全性。\n\n- 通过授权服务提供商（ASP）接口，NHP能够将资源请求方的请求内容透传给ASP，实现更严格的身份认证与权限控制。\n\n- NHP的资源标识支持任意字符串形式，包括中英文及符号，为数据资源提供更强的描述性，并具备DNS解析功能，提供更安全、加密和隐私的域名解析服务。\n\n因此，NHP的扩展性架构涵盖了与DNS和FIDO的集成等典型应用场景。\n\n### 4.1 与DNS集成\n\nDNS作为互联网基础服务在网站运行中至关重要，但其安全性长期未被重视，且因使用不可靠的UDP协议，存在诸多安全漏洞，如DNS劫持和拒绝服务攻击。因此，加强DNS安全至关重要。通过集成网络隐身技术，DNS解析通过双向加密通道进行，确保了保密性和防篡改能力，同时只有经过身份认证的用户才能解析，从而有效防御DDoS攻击和劫持。具体实现方案如下图所示，我们的方法能够显著提升了DNS的安全性，为用户提供了更可靠的DNS服务。\n\n![DNS集成方案](/images/DNS_integration.png)\n\n- 步骤1：网络隐身代理（如客户端、浏览器等）通过域名与网络隐身服务器发起请求。\n\n- 步骤2：一旦网络隐身服务器接收到来自网络隐身代理的域名数据包请求，它会随即向应用认证服务器发起查询认证请求，以验证该请求的合法性和权限。\n\n- 步骤3：认证服务器在接收到网络隐身服务器发出的认证请求消息后，经过严格的验证流程，一旦确认其身份真实有效，便会授予其访问权限。随后，认证服务器会迅速向网络隐身服务器回复一份包含目标资源真实IP地址、端口号等关键信息的授权访问凭据。\n\n- 步骤4：在成功通过授权查询之后，网络隐身服务器会迅速向目标资源所在的门禁系统发起开门请求。这一请求旨在确保网络隐身代理能够畅通无阻地访问到所需的目标资源，从而顺利完成后续操作。\n\n- 步骤5：门禁系统在接收到网络隐身服务器发出的开门请求后，会立即执行严格的验证程序。这一验证过程旨在确保所请求的目标资源与被保护资源完全吻合，以确保系统的安全性和可靠性。一旦验证通过，门禁系统将迅速开通从网络隐身代理到被保护资源的连接通道，从而允许其进行无障碍的访问。\n\n- 步骤6：一旦门禁系统成功为网络隐身代理开启了访问权限，网络隐身服务器会迅速确认这一操作，并返回目标资源的IP地址和端口信息。随后，这些信息将被迅速传递给网络隐身代理，以便其能够准确地定位并访问目标资源。\n\n- 步骤7：网络隐身代理在接收到被保护资源的IP地址和端口信息后，随即启动对目标资源的正常业务访问权限，确保访问过程顺畅无阻，实现高效且安全的资源交互。 \n\n### 4.2 与FIDO集成\n\n尽管FIDO在Web身份认证方面表现出色，但服务器的潜在漏洞仍可能被黑客利用，从而绕过FIDO的认证，直接入侵服务器进行数据盗窃或破坏。将FIDO与NHP集成，可以有效弥补FIDO在漏洞防护方面的不足，为互联网暴露面提供更全面的防御方案。具体实现方案如下图所示，详细实现步骤如下。\n\n![FIDO集成方案](/images/FIDO_integration.png)\n\n- (1) 用户代理（即代理）向网络隐身服务器（即服务器）发送一个端口敲门数据包，旨在尝试访问会话中已认证但保证水平相对较低的敏感资源。\n\n- (2) 服务器在接收到端口敲门数据包后，将资源访问请求转发给应用提供商。\n\n- (3) 应用提供商响应并将回复消息发送给服务器，同时将端口敲门消息重定向到可信的认证机构请求更高保证级别的基于FIDO的认证。\n\n- (4) 服务器在收到应用提供商的响应后，将重定向指示器传递给代理。\n\n- (5) 代理在收到重定向消息后，直接打开FIDO认证页面。\n\n- (6) 服务器在接收到代理的FIDO认证页面后，迅速向认证机构发起FIDO认证请求。\n\n- (7) FIDO服务器在收到请求消息后完成FIDO请求并响应。\n\n- (8) 认证机构在经过严格的FIDO验证过程后，向服务器返回基于FIDO的认证响应。\n\n- (9) 一旦FIDO身份确认真实有效且认证成功，服务器请求访问控制（即AC）系统打开应用提供商的端口以接受代理的连接。\n\n- (10) 服务器通知代理认证成功，并提供资源访问的IP/端口。\n\n- (11) AC系统成功授予代理访问权限。\n\n- (12) 代理与应用提供商建立连接以访问资源。\n\n## 5. 兼容性对比\n\n与SPA协议相比，NHP的一个关键目标是对信创环境以及国内零信任标准体系的良好兼容性。在加密算法方面，NHP支持国际密码算法（如RSA、SHA256、AES）和国密算法（如SM2、SM3、SM4），并能根据数据包头的长度调整加密时间。在软硬件兼容性方面，NHP适配了国内外主流的CPU硬件和操作系统，包括鲲鹏、x86、龙芯、申威等。此外，NHP符合即将颁布的国家标准《信息安全技术零信任参考体系架构》的规范要求，确保了与该标准的兼容性，如下图所示。\n\n![兼容性对比](/images/Compatibility_comparison.png)\n\n- [英文版](/docs/comparison.md){: .label .fs-4 }\n\n---\n\n"
  },
  {
    "path": "docs/zh-cn/cryptography.zh-cn.md",
    "content": "---\r\nlayout: page\r\ntitle: 加密算法\r\nparent: 中文版\r\nnav_order: 4\r\npermalink: /zh-cn/cryptography/\r\n---\r\n\r\n# 加密算法\r\n{: .fs-9 }\r\n\r\n加密是 OpenNHP 的核心，通过利用尖端的加密算法提供强大的安全性、卓越的性能和可扩展性。\r\n{: .fs-6 .fw-300 }\r\n\r\n[English](/cryptography/){: .label .fs-4 }\r\n\r\n---\r\n\r\n本文解释了 OpenNHP 如何在多个关键领域中利用现代加密算法的优势：\r\n\r\n1. [公私钥加密算法](#1-%E5%85%AC%E7%A7%81%E9%92%A5%E5%8A%A0%E5%AF%86%E7%AE%97%E6%B3%95)\r\n2. [密钥交换、数据加密和身份认证](#2%E5%AF%86%E9%92%A5%E4%BA%A4%E6%8D%A2%E6%95%B0%E6%8D%AE%E5%8A%A0%E5%AF%86%E5%92%8C%E8%BA%AB%E4%BB%BD%E8%AE%A4%E8%AF%81)\r\n3. [密钥分发和管理](#3-%E5%AF%86%E9%92%A5%E7%AE%A1%E7%90%86%E4%B8%8E%E5%88%86%E5%8F%91)\r\n\r\n\r\n## 1) 公私钥加密算法\r\n### 1.1 简介\r\n在不断变化的网络安全环境中，保护通信和网络资源至关重要，特别是在网络威胁日益复杂的情况下。网络基础设施隐藏协议（NHP），作为一种零信任安全机制，致力于通过隐藏网络基础设施细节来防止攻击者入侵，并确保只有受信任的实体能够与网络资源交互。NHP 安全模型的关键组件是椭圆曲线加密（ECC）用于公钥加密。在本文中，我们将探讨 ECC 如何集成到 NHP 零信任协议中，以提供强大且高效的安全性。\r\n\r\n椭圆曲线加密（ECC）是一种现代公钥加密方法，相较于传统方法如 RSA，它能在显著更小的密钥尺寸下提供相同级别的安全性。ECC 依赖于有限域上椭圆曲线的数学特性，提供了安全性与性能之间的良好平衡。由于其降低了计算开销，ECC 特别适用于资源受限的环境，如嵌入式系统或移动设备。公钥加密是基于非对称密钥对的加密方法，通常包括一个公开的公钥和一个私密的私钥。通过公钥加密，可以实现安全的数据传输、身份验证和数字签名等功能，从而确保通信双方的数据安全性和身份真实性。\r\n\r\n### 1.2 什么是椭圆曲线加密？\r\n\r\n椭圆曲线加密（ECC）是一种基于椭圆曲线数学理论的公钥加密技术。它通过椭圆曲线方程上的点运算，提供与传统方法（如 RSA）相同的安全性，但密钥尺寸更小，计算效率更高。ECC 的安全性源于椭圆曲线离散对数问题，其计算复杂度使得破解难度极大。\r\n\r\n在 ECC 中，参与方通过生成公私钥对，利用椭圆曲线 Diffie-Hellman（ECDH）协议来交换密钥。ECC 的数学基础是使用有限域上的椭圆曲线方程：\r\n\r\ny^2 = x^3 + ax + b\r\n\r\n其中 a 和 b 是定义曲线特性的常数，曲线上的点集具有特定的加法运算规则。\r\n\r\nECC 的主要优势包括：\r\n- **更小的密钥尺寸**：ECC 能在更小的密钥长度下实现相同的安全性，从而降低了存储和计算的负担。\r\n- **增强的安全性**：ECC 基于椭圆曲线离散对数问题，其数学复杂性使其非常难以破解。\r\n- **高效性**：相比传统加密方法如 RSA，ECC 的加密和解密操作速度更快，适用于资源受限的设备（如嵌入式系统和移动设备）。\r\n\r\nNHP 使用 ECC 进行密钥交换、数据加密和身份验证，以及通过无证书公钥加密（CL-PKC）进行密钥分发和管理。\r\n\r\n### 1.3 安全通信中的 ECC\r\n\r\n#### 1.3.1 密钥交换机制\r\n\r\n加密密钥的安全交换是任何安全通信协议的核心。NHP 使用椭圆曲线 Diffie-Hellman（ECDH）作为其密钥交换机制。在 ECDH 密钥交换中，通信双方使用椭圆曲线生成公私密钥对，然后交换公钥，以便双方计算出共享密钥，而无需直接在网络上传递。\r\n\r\n使用 ECDH 的好处有两个方面：首先，它提供了前向安全性，即使在未来某一方的私钥被泄露，先前建立的会话密钥仍然是安全的。其次，由于 ECC 的高效性，密钥交换过程计算负担较轻，确保密钥建立过程快速完成且计算成本低。\r\n\r\n#### 1.3.2 数字签名身份验证\r\n\r\n在零信任环境中，身份验证至关重要。NHP 使用椭圆曲线数字签名算法（ECDSA）来验证试图访问网络资源的实体的身份。ECDSA 是一种基于 ECC 的数字签名方案，它允许设备在不暴露敏感私钥的情况下证明其身份。\r\n\r\n在 NHP 协议中，当某个实体希望与网络通信时，它必须使用其私钥生成数字签名，接收方可以使用相应的公钥来验证签名的有效性。这确保了只有合法的实体可以参与网络，从而有效地实施零信任模型的 \"永不信任，始终验证\" 原则。\r\n\r\n#### 1.3.3 数据保密加密\r\n\r\nNHP 在通信过程中使用对称加密来确保数据的保密性，但对称密钥必须在实体之间安全地分发和共享。ECC 通过 ECDH 提供安全的对称密钥分发渠道，确保对称密钥可以安全地交换。\r\n\r\n一旦这些密钥交换完成，NHP 就会切换到对称加密进行数据传输，从中受益于对称加密算法的速度和效率。ECC 确保对称密钥交换既安全又高效。\r\n\r\n#### 1.3.4 无证书公钥加密中的密钥管理与分发\r\n\r\nNHP 还通过无证书公钥加密（CL-PKC）使用 ECC 进行密钥管理和分发。在传统的公钥基础设施中，证书被用来验证公钥，这在证书管理方面引入了复杂性。CL-PKC 通过允许实体与受信任的中心合作生成部分私钥，同时独立生成自己的密钥对，从而消除了证书的需要。\r\n\r\n这种方法简化了密钥管理，确保公钥可以在没有证书颁发和验证的情况下安全使用。通过在 CL-PKC 中使用 ECC，NHP 提供了一种轻量级且安全的密钥分发方式，通过消除对集中式证书机构的依赖，进一步增强了零信任模型。\r\n\r\n### 1.4 使用 ECC 的优势\r\n\r\nNHP 零信任协议中使用 ECC 提供了众多符合其安全目标的优势：\r\n\r\n- **可扩展安全性**：ECC 较小的密钥尺寸提供了强大的安全性，能很好地适应对抗对手计算能力不断增强的情况。随着 NHP 致力于为多样化的网络部署提供零信任环境，ECC 的可扩展性是一项关键资产。\r\n- **资源效率**：相比传统公钥加密，ECC 减少了网络设备的计算负担。在网络资源可能受限的环境中——如边缘设备或物联网组件——这种高效性对于在不牺牲安全性的情况下保持高性能至关重要。\r\n- **性能提升**：结合 ECDH 的密钥交换、ECDSA 的身份验证以及高效的对称加密提供了一个平衡的安全通信解决方案。这种平衡的方法使得 NHP 能够实现零信任的目标，同时保持较低的延迟，这对时间敏感的网络应用尤为关键。\r\n\r\n### 1.5 结论\r\n\r\n将椭圆曲线加密集成到 NHP 零信任协议中，提供了一种在最小性能影响下保护网络通信的强大手段。通过利用 ECDH 进行安全的密钥交换、ECDSA 进行可靠的身份验证，以及高效的对称加密进行数据传输，ECC 支持零信任模型的目标，即隐藏网络基础设施，确保只有受信任的实体可以访问资源，并以低开销保持安全性。\r\n\r\n随着网络威胁变得越来越复杂，像 ECC 这样的先进加密技术在 NHP 协议中的应用对于保持对攻击者的优势至关重要。ECC 和 NHP 之间的协同作用不仅有助于保护关键的网络基础设施，还确保安全措施既强大又高效——这是任何现代网络安全项目成功的关键组合。\r\n\r\n网络基础设施隐藏协议（NHP）基于零信任安全模型构建，确保即使在潜在攻击者的存在下也能实现安全通信。为此，NHP 集成了 Noise 协议框架，这是一个用于安全且灵活的密钥交换、数据加密和身份验证的加密框架。该组合以最小的计算开销提供了强大的安全性。\r\n\r\n## 2）密钥交换、数据加密和身份认证\r\n\r\n### 2.1 简介\r\n\r\n#### 2.1.1. 密钥交换机制\r\n\r\nNHP 利用 Noise 协议的密钥交换机制来确保通信双方之间的安全认证通道。密钥交换从握手阶段开始，双方交换 Diffie-Hellman (DH) 公钥。在 Noise 中，每一方生成一个临时密钥对，并使用交换的公钥派生出共享密钥，该共享密钥随后用于加密后续通信。\r\n\r\nNoise 允许 NHP 支持长期静态密钥和临时密钥以增强安全性。Noise 框架的握手模式的灵活性使得 NHP 能够根据特定使用场景定制握手过程，提供相互认证、匿名发起者或初始握手本身加密的选项。通过利用 Noise 的基于令牌的握手系统，NHP 可以精确控制密钥交换消息的顺序，同时保持身份信息的机密性。\r\n\r\n#### 2.1.2 数据加密\r\n\r\n共享密钥在握手期间派生出来后，Noise 框架使用对称加密来保护数据。NHP 利用 Noise 的 CipherState 和 SymmetricState 对象，这些是 Noise 状态机的核心组件，用于管理通信会话的加密和解密密钥。\r\n\r\n特别地，握手期间派生的共享密钥用于初始化对称加密密钥（k）和随机数（n），用于数据加密。Noise 支持高级加密方案，如 ChaCha20-Poly1305 或 AES-GCM，提供带有附加数据认证加密（AEAD），以维护数据的保密性和完整性。链式密钥（ck）和握手散列（h）用于在会话过程中不断派生新的密钥，增强前向安全性，确保一个密钥的泄露不会危及通信的其他部分。\r\n\r\nNHP 通过这些加密属性提供网络数据的加密通道，确保任何被拦截的数据在没有派生密钥的情况下无法被解密。\r\n\r\n#### 2.1.3 身份验证\r\n\r\nNoise 通过将静态密钥的交换与 Diffie-Hellman 操作相结合来实现身份验证。在 NHP 中，身份验证发生在握手期间，其中静态密钥被加密并通过共享的 DH 操作进行验证，有效地将双方的公钥绑定到派生的会话密钥上。\r\n\r\n在握手过程中，Noise 使用诸如 \"s\"（静态）和 \"e\"（临时）等令牌来指示正在交换和验证哪些密钥。这种基于令牌的方法使得 NHP 能够根据具体的使用场景选择性地认证单方或双方。例如，Noise 中的 \"XX\" 模式提供相互认证，而 \"NK\" 模式允许单方认证的握手，赋予 NHP 在身份验证严格性方面的灵活性。\r\n\r\n为了进一步保护身份信息，Noise 可以在握手期间加密静态密钥。NHP 利用这一特性来防止窃听者发现参与者的身份，从而支持零信任模型，确保参与者的身份只对预期的对方可见，而不对第三方泄露。\r\n\r\n### 2.2 算法和公式\r\n\r\n#### 2.2.1 Diffie-Hellman 密钥交换\r\n\r\nDiffie-Hellman（DH）密钥交换用于在两方之间派生共享密钥，每一方生成一个私钥（a 对于 A，b 对于 B）并计算公共密钥：\r\n\r\n- A 计算其公钥：A_pub = g^a mod p\r\n- B 计算其公钥：B_pub = g^b mod p\r\n\r\n共享密钥 s 通过以下方式计算：\r\n\r\n- A 计算：s = B_pub^a mod p\r\n- B 计算：s = A_pub^b mod p\r\n\r\n该共享密钥 s 对于双方是相同的，用于派生加密密钥。\r\n\r\n#### 2.2.2 对称加密\r\n\r\nNHP 使用对称加密确保数据机密性。密钥（k）和随机数（n）用于加密函数。对于带有附加数据认证加密（AEAD），通常使用 ChaCha20-Poly1305 算法，该算法结合了流密码（ChaCha20）和消息验证码（Poly1305）。\r\n\r\n- 加密：c = ChaCha20(k, n, plaintext)\r\n- 认证：tag = Poly1305(k, associated data || c)\r\n\r\n密文（c）和标签一起传输，确保数据的机密性和完整性。\r\n\r\n#### 2.2.3 密钥派生和散列\r\n\r\nNoise 使用基于 HMAC 的密钥派生函数（KDF）来派生密钥。HKDF（基于 HMAC 的密钥派生函数）用于从共享密钥（s）生成多个密钥。\r\n\r\nHKDF 步骤：\r\n\r\n- temp_key = HMAC(chaining_key, input_key_material)\r\n- output1 = HMAC(temp_key, 0x01)\r\n- output2 = HMAC(temp_key, output1 || 0x02)\r\n\r\n派生的密钥用于加密和维护链式密钥（ck），以确保前向安全性。\r\n\r\n#### 2.2.4 身份认证\r\n\r\n身份验证在 NHP 中涉及静态和临时密钥的交换，以验证参与方。静态（s）和临时（e）密钥之间的 Diffie-Hellman 操作产生唯一的共享值，用于验证参与方的身份。\r\n\r\n身份验证操作包括：\r\n\r\n- ss = DH(s_A, s_B)\r\n- es = DH(e_A, s_B) 或 DH(s_A, e_B)\r\n- ee = DH(e_A, e_B)\r\n\r\n这些值通过散列结合起来派生最终的会话密钥，有效地将身份绑定到密钥交换过程中，确保只有预期的参与方能够派生出正确的会话密钥。\r\n\r\n### 2.3 结论\r\n\r\nNoise 协议框架为 NHP 提供了灵活且强大的加密机制，确保了通信的安全性和参与方身份的验证。通过支持多种握手模式和加密方案，Noise 框架增强了网络的前向安全性和身份保护能力，有效支持了零信任环境下的安全通信需求。结合 Diffie-Hellman 密钥交换、对称加密和基于令牌的身份验证，Noise 框架为 NHP 提供了实现其零信任目标的强大工具。\r\n\r\n## 3) 密钥管理与分发\r\n\r\n### 3.1 简介\r\n\r\n无证书公钥加密（Certificateless Public Key Cryptography，CL-PKC），最初由 Al-Riyami 和 Paterson 在 2003 年提出，提供了一种混合解决方案，在不依赖传统证书机构（CA）的情况下确保强加密保证。本文探讨了 NHP 如何利用 CL-PKC 在不依赖证书的情况下实现高效且安全的密钥管理。\r\n\r\n在传统的公钥基础设施（PKI）中，证书机构（CAs）作为可信的第三方，负责签发和管理公钥证书以验证用户密钥的真实性。虽然这种模型有效，但它引入了复杂性和风险，例如对 CA 的依赖以及 CA 受到攻击时的风险。无证书公钥加密旨在通过消除证书的使用来缓解这些问题，同时确保公钥的真实性。\r\n\r\n在 CL-PKC 系统中，一个称为密钥生成中心（KGC）的可信第三方负责为用户生成部分私钥。然而，与 CA 不同的是，KGC 无法访问完整的私钥，因此不可能冒充用户。每个用户将 KGC 提供的部分私钥与他们自己的秘密值结合起来，生成完整的私钥和公钥。这种方法减少了对任何单一实体的信任，并提供了额外的安全层。\r\n\r\nNHP 零信任协议集成了 CL-PKC 来管理其安全通信框架的密钥分发和验证。下面，我们解释 CL-PKC 的各种机制如何为 NHP 的密钥管理过程做出贡献。\r\n\r\n#### 3.1.1. 部分密钥生成\r\n\r\nKGC 负责创建系统范围的参数，包括主公私钥对。主私钥由 KGC 保密，而主公钥则分发给所有参与者。当新用户希望加入网络时，KGC 执行以下步骤：\r\n\r\n- 生成用户的部分私钥，使用他们的唯一标识符（例如电子邮件或其他身份信息）。这确保每个用户的部分密钥与其身份绑定，提供基于身份的安全性。\r\n\r\n##### 3.1.2 用户特定密钥对生成\r\n\r\n用户随后选择自己的秘密值，并将其与 KGC 提供的部分私钥结合起来，生成完整的私钥。具体步骤如下：\r\n\r\n- 用户选择一个秘密值 (d'\\_A)，并使用它来生成一个点 U\\_A：\r\n\r\n  U\\_A = [d'\\_A]G\r\n\r\n- 用户将 KGC 提供的部分私钥 (t\\_A) 与自己的秘密值 (d'\\_A) 相结合，计算出完整的私钥 (d\\_A)：\r\n\r\n  d\\_A = (t\\_A + d'\\_A) mod n\r\n\r\n- 用户使用完整的私钥生成相应的公钥 (P\\_A)：\r\n\r\n  P\\_A = W\\_A + [l]P\\_pub\r\n\r\n用户随后选择自己的秘密值，并将其与 KGC 提供的部分私钥结合起来，生成完整的私钥。用户的公钥也相应生成。\r\n\r\n这种密钥分发方法确保 KGC 无法单方面确定用户的私钥，从而降低了密钥生成中心被攻破的风险。此外，不需要传统证书意味着用户无需依赖外部证书机构来验证密钥，从而减少了中间人（MITM）攻击的攻击面。\r\n\r\n在像 NHP 实施的这种无证书系统中，公钥的真实性通过隐式的方法而不是依赖 CA 签发的证书来验证。具体来说，用户的公钥是使用系统参数、用户标识符和 KGC 的主公钥计算出来的。该计算是确定性的，允许任何一方在无需信任 CA 或存储大量证书数据库的情况下验证公钥的真实性。\r\n\r\n通过消除传统证书的需要，NHP 能够简化密钥验证过程，消除证书吊销列表（CRLs）和其他 PKI 复杂性。这种方法不仅减少了通信开销，还通过消除对可信第三方的依赖增强了安全性，因为这些第三方可能成为攻击者的目标。\r\n\r\n\r\n### 3.2 算法和公式\r\n\r\n#### 3.2.1 系统参数生成\r\n\r\n密钥生成中心（KGC）负责生成系统参数，这些参数包括椭圆曲线 (E) 定义在有限域 (ℚ_q) 上，基点 (G) 的素数阶 (n)，以及主私钥 (ms)。KGC 计算主公钥 (P_pub) 如下：\r\n\r\nP_pub = [ms]G\r\n\r\n其中 [ms]G 表示基点 G 与主私钥 ms 的标量乘法。\r\n\r\n#### 3.2.2 部分私钥生成\r\n\r\n对于每个用户（标识符为 ID_A），KGC 生成部分私钥。首先，KGC 根据用户的标识符和系统参数计算哈希值 (H_A)：\r\n\r\nH_A = H(ENTL_A || ID_A || a || b || x_G || y_G || x_P_pub || y_P_pub)\r\n\r\n其中 (ENTL_A) 是由标识符派生的长度值，(x_G, y_G) 和 (x_P_pub, y_P_pub) 分别是点 G 和 P_pub 的坐标。\r\n\r\nKGC 选择一个随机值 (w ∈ [1, n-1]) 并计算：\r\n\r\nW_A = [w]G + U_A\r\n\r\n其中 (U_A = [d'_A]G) 是用户使用其自身的秘密值 (d'_A) 生成的点。\r\n\r\n部分私钥 (t_A) 计算如下：\r\n\r\nt_A = (w + l · ms) mod n\r\n\r\n其中 (l) 是根据点 (W_A) 和哈希 (H_A) 计算的值。\r\n\r\n#### 3.2.3 用户完整私钥生成\r\n\r\n用户通过将部分私钥 (t_A) 与其秘密值 (d'_A) 结合生成完整的私钥：\r\n\r\nd_A = (t_A + d'_A) mod n\r\n\r\n这确保只有用户自己知道其完整的私钥。\r\n\r\n#### 3.2.4 公钥计算\r\n\r\n用户的公钥 (P_A) 计算如下：\r\n\r\nP_A = W_A + [l]P_pub\r\n\r\n任何人可以使用系统参数、用户标识符和 KGC 的公钥验证该公钥。\r\n\r\n#### 3.2.5 签名生成与验证\r\n\r\n用户对消息 (M) 生成数字签名时，计算哈希 (e) 如下：\r\n\r\ne = H(H_A || x_W_A || y_W_A || M)\r\n\r\n签名 (r, s) 使用用户私钥 (d_A) 和一个随机值 (k) 生成：\r\n\r\n[r]G = (x_1, y_1)\r\nr = x_1 mod n\r\ns = (k^{-1}(e + d_A · r)) mod n\r\n\r\n验证签名时，验证者计算 (P_A)，然后检查是否满足：\r\n\r\n[r]G = [s]G + [e + r]P_A\r\n\r\n如果等式成立，签名即为有效。\r\n\r\n\r\n### 3.3 结论\r\n\r\nNHP 实施的无证书公钥加密为零信任环境中的密钥管理提供了一种强大且高效的方法。通过利用 CL-PKC，NHP 能够缓解传统 PKI 相关的风险，减少对集中可信机构的依赖，并简化密钥分发过程。结果是一个更安全且可扩展的系统，适合在面对不断发展的网络威胁时保护关键网络基础设施。\r\n\r\n将无证书加密与 NHP 的零信任原则相结合，使其成为在最小化集中机构引入的风险的同时保护网络资源的理想解决方案。\r\n\r\nCopyright © 2024 OpenNHP Open Source Project.\r\n\r\n\r\n"
  },
  {
    "path": "docs/zh-cn/deploy.zh-cn.md",
    "content": "---\nlayout: page\ntitle: 部署OpenNHP\nparent: 中文版\nnav_order: 6\npermalink: /zh-cn/deploy/\n---\n\n# 部署OpenNHP\n{: .fs-9 }\n\n[English](/deploy/){: .label .fs-4 }\n\n---\n\n## 1. OpenNHP组件说明\n\n根据上一章中的构建步骤，构建结果将输出到 *release* 目录下，该目录下的三个子目录分别包含OpenNHP的三大核心组件：*nhp-agent*、*nhp-server*和*nhp-ac*。\n\n- **nhp-agent代理：** 发起敲门请求的模块，敲门请求中带有数据访问者的身份和设备信息，通常安装在用户终端的设备上。\n- **nhp-server服务器:** 处理并验证敲门请求的模块，通常是服务器程序。其功能包括验证敲门请求并与外部授权服务提供商进行交互实现鉴权操作，以及控制NHP门禁进行开门动作。\n- **nhp-ac门禁：** 访问控制的执行模块，通常是服务器程序。该模块执行默认“拒绝一切”（deny all）的安全策略并确保被保护资源的网络隐身状态，通常位于被保护资源所在的同一主机上。负责向已授权的NHP代理开放访问权限或向已失去授权的NHP代理关闭访问权限，并根据NHP服务器返回参数执行针对NHP代理的放行动作。\n\n## 2. OpenNHP开发测试环境搭建\n\n### 2.1 开发测试环境：Windows/MacOS开发主机 + Linux虚拟机\n\n假设开发主机为Windows或者macOS，可通过安装虚拟机环境（如VirualBox）并创建两台Linux虚拟机来搭建简单的OpenNHP测试环境。在创建虚拟机时，请将网卡选项设置为`\"Host-only Adapter\"`（如下图），可使虚拟机的IP与开发主机IP在同一个网段。\n\n ![VirualBox Network](/images/vbnetwork.png)\n\n **提示：** 如需该虚拟机同时具备访问互联网能力，可以另外增加一个`\"NAT\"`网卡：\n ![VirualBox Network](/images/vbnetwork2.png)\n\n至此，NHP三大组件的环境搭建如下：\n\n- 【nhp-server】 运行在Linux虚拟主机上，IP地址为*192.168.56.101*\n- 【nhp-ac】 运行在Linux虚拟主机上，IP地址为*192.168.56.102*\n- 【nhp-agent】 运行在Windows/macOS开发主机上，IP地址为*192.168.56.1*\n\n### 2.2 开发测试环境的网络拓扑与基础信息\n\n ![OpenNHP-Dev-WSL](/images/dev_wsl.png)\n\n| 服务器名称 | IP地址 | 基础配置信息  |\n|:--:|:--:|:--:|\n| NHP-Server | 192.168.56.101  | **公钥:** WqJxe+Z4+wLen3VRgZx6YnbjvJFmptz99zkONCt/7gc=<br/>**私钥:** eHdyRHKJy/YZJsResCt5XTAZgtcwvLpSXAiZ8DBc0V4= <br/> **Hostname:** localhost <br/> **ListenPort:** 62206 <br/> **aspId:** example |\n| NHP-AC | 192.168.56.102  | **公钥:** Fr5jzZDVpNh5m9AcBDMtHGmbCAczHyPegT8IxQ3XAzE=<br/>**私钥:** +B0RLGbe+nknJBZ0Fjt7kCBWfSTUttbUqkGteLfIp30=<br/>**ACId:** testAC-1 <br/> 被保护资源的 **resId:** test |\n| NHP-Agent | 192.168.56.1  | **公钥:** WnJAolo88/q0x2VdLQYdmZNtKjwG2ocBd1Ozj41AKlo=<br/>**私钥:** +Jnee2lP6Kn47qzSaqwSmWxORsBkkCV6YHsRqXCegVo= <br/> **UserId:** agent-0 |\n\n**【注意】** 每个组件都有对应的配置文件，需要配置正确才能成功启动。关于配置文件的格式，请见下文中各个组件的“配置文件”相关信息。\n\n**【提示】** 从0.3.3版本起，各组件配置文件中的大多数字段都支持动态更新，详见各配置文件注释说明。\n\n### 2.3 NHP-Server的配置与运行\n\n#### 2.3.1 NHP-Server系统要求\n\n- Linux服务器或者Windows\n\n#### 2.3.2 NHP-Server运行\n\n将*release*目录下*nhp-server*目录复制到目标机器上。配置好*etc*目录下 `toml`文件(详细参数见下一节)，运行`nhp-serverd run`。\n\n- Linux环境：\n\n   ```bash\n   nohup ./nhp-serverd run 2>&1 &\n   ```\n\n- Windows环境：\n\n   ```bat\n   nhp-serverd.exe run\n   ```\n\n*【可选项】* 禁止UDP端口暴露：运行`iptables_default.sh`\n\n#### 2.3.3 NHP-Server服务器的配置文件\n\n- 基础配置：[config.toml](https://github.com/OpenNHP/opennhp/tree/main/server/main/etc/config.toml)  \n- 门禁peer列表配置：[ac.toml](https://github.com/OpenNHP/opennhp/tree/main/server/main/etc/ac.toml)  \n- 客户端peer列表配置：[agent.toml](https://github.com/OpenNHP/opennhp/tree/main/server/main/etc/agent.toml)  \n- http服务配置：[http.toml](https://github.com/OpenNHP/opennhp/tree/main/server/main/etc/http.toml)  \n- 服务器插件读取配置：[resource.toml](https://github.com/OpenNHP/opennhp/tree/main/server/main/etc/resource.toml)  \n- 源地址关联列表：[srcip.toml](https://github.com/OpenNHP/opennhp/tree/main/server/main/etc/srcip.toml)  \n- 服务器插件资源配置：[resource.toml](https://github.com/OpenNHP/opennhp/tree/main/server/main/etc/resource.toml)  \n\n### 2.4 NHP-AC的配置与运行\n\n#### 2.4.1 NHP-AC系统要求\n\n- Linux服务器，内核需支持**ipset**。可通过以下命令查看ipset支持情况\n\n   ```bash\n   lsmod | grep ip_set \n   ```\n\n#### 2.4.2 NHP-AC运行\n\n将*release*目录下*nhp-ac*目录复制到目标机器上。配置好*etc*目录下 `toml`文件(详细参数见下一章)，运行`iptables_default.sh`，添加防火墙规则，此时外部连接将无法建立。再运行`nhp-acd run`。\n\n**【注意】** `nhp-acd` 以及 `iptables_default.sh` 需要在**root**权限下运行。\n\n- Linux环境：\n\n   ```bash\n   su\n   ./iptables_default.sh\n   nohup ./nhp-acd run 2>&1 &\n   ```\n\n如果想恢复`iptables_default.sh`对iptables的改动，可以运行以下命令来清除：\n\n   ```bash\n   iptables -F\n   ```\n\n#### 2.4.3 NHP-AC门禁配置文件\n\n- 基础配置：[config.toml](https://github.com/OpenNHP/opennhp/tree/main/ac/main/etc/config.toml)  \n- 服务器peer列表：[server.toml](https://github.com/OpenNHP/opennhp/tree/main/ac/main/etc/server.toml)  \n\n### 2.5 NHP-Agent的配置与运行\n\n#### 2.5.1 NHP-Agent系统要求\n\n- 所有平台：Windows、Linux、macOS、Android、iOS\n\n#### 2.5.2 NHP-Agent运行\n\n将*release*目录下*nhp-agent*目录复制到目标机器上。配置好*etc*目录下 `toml`文件(详细参数见下一章)，运行`nhp-agentd run`。\n\n- Linux环境：\n\n   ```bash\n   nohup ./nhp-agentd run 2>&1 &\n   ```\n\n- Windows环境：\n\n   ```bat\n   nhp-agentd.exe run\n   ```\n\n#### 2.5.3 NHP-Agent的配置文件\n\n- 基础配置：[config.toml](https://github.com/OpenNHP/opennhp/tree/main/agent/main/etc/config.toml)  \n- 敲门目标配置：[resource.toml](https://github.com/OpenNHP/opennhp/tree/main/agent/main/etc/resource.toml)  \n- 服务器peer列表：[server.toml](https://github.com/OpenNHP/opennhp/tree/main/agent/main/etc/server.toml)  \n\n### 2.6 测试NHP网络隐身效果\n\n验证NHP网络隐身效果，可以通过nhp-agent主机 *（IP：192.168.56.1）*进行`nmap扫描（以80端口为例）` nhp-ac主机 *（IP：192.168.56.102）*来测试。此外，可以在另外一台虚拟机（模拟黑客扫描攻击），扫描nhp-ac 主机查看效果。\n\n| 测试用例 | 测试命令 | 测试目的  | 预期结果  |\n|:--:|:--:|:--:|:--:|\n| nhp-agent未运行 |`nmap -sS -p 80 192.168.56.102` | 测试AC对Agent隐身 | 80/tcp filtered  |\n| nhp-agent已运行 |`nmap -sS -p 80 192.168.56.102` | 测试AC对Agent开放 | 80/tcp open  |\n| nhp-agent已运行 |`nmap -sS -p 80 192.168.56.102` | 测试AC对黑客隐身 | 80/tcp filtered  |\n\n## 3. 日志说明\n\n### 3.1 日志文件位置\n\n日志文件生成于每个组件各自的*logs*目录下，以日期作为文件名，可通过`tail`命令查看。\n\n- 查看nhp-server的日志\n\n   ```bash\n   tail -f release/nhp-server/logs/server-2024-03-10.log\n   ```\n\n- 查看nhp-ac的日志\n\n   ```bash\n   tail -f release/nhp-ac/logs/ac-2024-03-10.log\n   ```\n\n- 查看nhp-agent的日志\n\n   ```bash\n   tail -f release/nhp-agent/logs/agent-2024-03-10.log\n   ```\n\n### 3.2 日志文件格式\n\n日志的格式如下：\n\n   ```text\n   时间戳 代码位置 NHP组件名 [日志权重] 日志消息\n   ```\n\n日志权重分成以下几个级别：\n\n- Error\n- Critical\n- Warning\n- Info\n- Debug\n\n## 4. 附录A：常见问题FAQ\n\n- **Q：** Windows平台上编译错误：`running gcc failed: exec: \"gcc\": executable file not found in %PATH%` \n  **A：** 原因是没有安装`gcc`编译工具。请按照上文中3.1.3中步骤安装GCC。\n\n- 日志中显示错误：`NHP-AC [Critical] received stale packet from 192.168.56.101:62206, drop packet` 。 \n   【原因】接收方对包的接收时间有要求，数据包发送时间不能早于接收方10分钟以上。\n   【修复】两台机器的时间同步\n\n- 怎么调整一次认证后开通的时间？  怎么限制只开放指定的端口？\n   【方法】在nhp-server/plugins/下对应的插件模块中，找到etc/resource.toml文件，里面能配置资源的端口、时长、id等信息；如果用的是nhp-agent敲门，则默认是example插件。如果是微信扫码敲门，用的是wxweb插件。\n\n- 如何检查配置是否生效？\n   【方法】server和ac的日志里有记录。也可以在ac的系统里输入ipset -L命令查看授权的源ip目的端口和时长。\n\n- nhp-agent 敲门成功，但访问不通可能的原因。\n\n   问题原因：***可能原因是 nhp-server 下发到 nhp-ac 进行 ipset，所添加记录中的 resource 目标没和请求中对应的 resource 目标的 IP 对上***，这种情况可能出现在 resource 与 nhp-ac 在同一台服务器上的情况。可以先手动配置 ipset 规则：\n   ``` shell\n   sudo ipset add defaultset [SourceIP],tcp:80,[ResourceIP]\n   ```\n   ***SourceIP 来源IP，即 Agent 的公有 IP，可通过 tcpdump 或 ipset list 确认***\n   ***ResourceIP 请求资源的 IP*** 该IP 对应 nhp-server 中 ./plugins/example/etc/resource.toml，<span style=\"color:red\">如果与请求对应不上，则会出现敲门成功但无法请求问题。</span>\n\n   抓包调试：在 ```nhp-ac``` 侧 ```tcpdump -i any port 80```(根据具体情况调整)\n\n   解决方案：将可用的 IP 配置在 nhp-server 的 ```./plugins/example/etc/resource.toml``` 配置中的 ```Addr.Ip = \"\"```\n"
  },
  {
    "path": "docs/zh-cn/dhp_quick_start.zh-cn.md",
    "content": "---\nlayout: page\ntitle: DHP快速开始\nparent: 中文版\nnav_order: 3\npermalink: /zh-cn/dhp_quick_start/\n---\n\n# DHP快速开始\n{: .fs-9 }\n\n一个本地搭建的 Docker 调试环境，模拟 nhp-server、nhp-db和nhp-agent。此环境可用于：\n{: .fs-6 .fw-300 }\n\n- 快速理解 opendhp 的运作方式\n- 基本逻辑验证\n{: .fs-6 .fw-300 }\n\n[English](/dhp_quick_start/){: .label .fs-4 }\n\n---\n\n## 1. 概述\n\nOpenDHP的主要目的是加强数据主权，在保持数据可用性的同时确保数据不可见性，并在整个数据生命周期中维护数据隐私。\n\n本快速入门指南帮助开发人员快速搭建OpenDHP Docker环境、构建源代码并测试OpenDHP的关键功能。该环境设计得轻量且易于使用，非常适合希望快速测试和调试OpenDHP的开发人员。\n\n### 1.1 架构\n![Architecture](/images/OpenDHP_Arch_CN.png)\n\n#### 1.1.1 网络拓扑\n\n| 容器名              | IP            | 说明                                                                                                       |\n| ------------------  | ------------  | --------------------------------------------------------------------------------------------------------- |\n| NHP-Agent           | 177.7.0.8     | nhp-agentd， 端口映射: 443→Host: 8443                                                                       |\n| NHP-Server          | 177.7.0.9     | nhp-serverd， 开放端口 62206                                                                               |\n| NHP-DB              | 177.7.0.12    | nhp-db， 用来发布数据                                                                                       |\n\n### 1.2 测试场景\n#### 1.2.1 场景描述\n为提升涉险账户识别的全面性与准确性，银行在内部风控识别基础上，还可通过与其他银行、支付机构、公安或监管平台提供的涉险账户信息联合验证。为保障数据安全与用户隐私，各参与方通过机密计算技术协同判断某账户是否存在风险行为，避免直接明文暴露用户数据。\n\n#### 1.2.2 场景架构\n![Scenario Architecture](/images/OpenDHP_Scenario_CN.png)\n\n## 2. 安装Docker环境\n关于这部分，请参考[NHP快速开始](/zh-cn/quick_start/)的相应章节。\n\n## 3. 运行和配置环境\n\n以下启动命令，在启动过程会相应的构建 nhp-server、nhp-db和nhp-agent镜像。\n\n### 3.1 启动所有服务\n\n```shell\ncd ./docker\ndocker compose -f docker-compose.dhp.yaml up -d\n```\n\n### 3.2 以DHP模式启动nhp-agent\n由于 `nhp-agent` 默认不会自动启动，因此需要手动启动它。\n\n```shell\ndocker exec -it nhp-agent /bin/bash\n/nhp-agent/nhp-agentd dhp\n```\n\n### 3.3 启动nhp-db\n由于 `nhp-db` 默认不会自动启动，因此需要手动启动它。\n\n```shell\ndocker exec -it nhp-db /bin/bash\n/nhp-db/nhp-db run\n```\n\n### 3.4 配置DHP相关的参数\n由于代理和 TEE 密钥在首次启动时生成，因此需要在nhp-server中配置代理公钥以建立信任，在nhp-db中配置TEE公钥以建立信任。此外，还需要在nhp-server中配置受信任的执行环境，用于评估远程证明报告。\n\n#### 3.4.1 配置agent公钥到nhp-server\n在此默认的 Docker 环境中，8443端口已为nhp-agent映射到主机，因此可以通过https://localhost:8443从主机访问nhp-agent的 HTTP 接口。你可以使用以下curl命令获取代理的公钥。\n\n```shell\ncurl --insecure https://localhost:8443/api/v1/key/agent\n{\"publicKey\":\"f+HWVbhQ6ZR3e+INU7ZSGyn3XNls5TUdbZWlPmj/1v890WLDW7RcnnbJmqqufymK+Yb99dadX+PlhK4qFYxtOg==\"}\n```\n接下来，配置agent公钥在nhp-server中。\n```shell\ndocker exec -it nhp-server /bin/bash\nvi /nhp-server/etc/agent.toml\n# list the agent peers for the server under [[Agents]] table\n\n# PubKeyBase64: public key for the agent in base64 format.\n# ExpireTime (epoch timestamp in seconds): peer key validation will fail when it expires.\n[[Agents]]\nPubKeyBase64 = \"f+HWVbhQ6ZR3e+INU7ZSGyn3XNls5TUdbZWlPmj/1v890WLDW7RcnnbJmqqufymK+Yb99dadX+PlhK4qFYxtOg==\"\nExpireTime = 1924991999\n```\n配置完代理公钥后，你可以使用以下curl命令检查代理状态：\n```shell\ncurl --insecure https://localhost:8443/api/v1/status/agent\n{\"attestationVerified\":false,\"running\":true,\"trustedByNHPDB\":false,\"trustedByNHPServer\":true}\n```\n你将看到`trustedByNHPServer`为`true`，这表示该代理已被 NHP 服务器信任。\n#### 3.4.2 配置TEE证明到nhp-server\n你可以使用以下curl命令获取 TEE 远程证明报告。\n\n**注意：**该远程证明报告是在非 TEE 环境下根据容器信息生成，非TEE环境仅用于测试目的。\n\n```shell\ncurl --insecure https://localhost:8443/api/v1/attestation/tee\n{\"measure\":\"3460bc69b9d273ad15c91074d8fd41abc5d5ccac50730d2e0495d08558848e34\",\"serial number\":\"3460bc69b9d273ad15c91074d8fd41abc5d5ccac50730d2e0495d08558848e34\"}\n```\n接下来，你需要在nhp-server中配置远程证明信息。\n```shell\ndocker exec -it nhp-server /bin/bash\nvi /nhp-server/etc/tee.toml\n# list trusted execution environments under [[TEEs]] table\n\n# Measure: cryptographic hashes that ensure the integrity of software and data within the TEE.\n# SerialNumber: unique serial number of the TEE.\n\n[[TEEs]]\nMeasure = \"19178a674248bbca705863bbf75ecaa049fcf3dfcc5ff59a80dcc5cbb60dae59\"\nSerialNumber = \"TMEX300023050201\"\n\n[[TEEs]]\nMeasure = \"3460bc69b9d273ad15c91074d8fd41abc5d5ccac50730d2e0495d08558848e34\"\nSerialNumber = \"3460bc69b9d273ad15c91074d8fd41abc5d5ccac50730d2e0495d08558848e34\"\n```\n配置代理公钥后，你可以使用以下curl命令检查代理状态：\n```shell\ncurl --insecure https://localhost:8443/api/v1/status/agent\n{\"attestationVerified\":true,\"running\":true,\"trustedByNHPDB\":false,\"trustedByNHPServer\":true}\n```\n你将看到`attestationVerified`为`true`，这表示TEE已被NHP服务器信任。\n#### 3.4.3 配置TEE公钥到nhp-db\n你可以使用以下curl命令获取TEE公钥。\n```shell\ncurl --insecure https://localhost:8443/api/v1/key/tee\n{\"publicKey\":\"pup5OzTTZjddv+WBgbUBkvHuBgJoBg0DU+I2c7Qj4lHlrVM8N/Yl9F6DEnbGFBWB89xrN6VLhYAIM4Xv+mu4KA==\"}\n```\n接下来，你需要在nhp-db中配置TEE公钥。\n```shell\ndocker exec -it nhp-db /bin/bash\nvi /nhp-db/etc/tee.toml\n# Configuration for trusted execution environment.\n\n# TEEPublicKeyBase64: base64 encoded public key of TEE (Trusted Execution Environment).\n[[TEEs]]\nTEEPublicKeyBase64 = \"pup5OzTTZjddv+WBgbUBkvHuBgJoBg0DU+I2c7Qj4lHlrVM8N/Yl9F6DEnbGFBWB89xrN6VLhYAIM4Xv+mu4KA==\"\nExpireTime = 1924991999\n```\n## 4. 测试银行涉险账户场景\n### 4.1 发布数据资源\n你可以使用以下命令发布数据资源：\n```shell\ndocker exec -it nhp-db /bin/bash\ncd /nhp-db\n./nhp-db run --mode encrypt --data-source-type online --source ./demo/risk.involved.accounts.csv --output ./risk.involved.accounts.csv.demo.ztdo --smart-policy ./demo/smart.policy.json --metadata ./demo/metadata.json\n```\n如果出现信息`Successfully register or update data object which doId is <doId>.`，表示数据资源已成功发布。\n\n### 4.2 请求数据资源\n#### 4.2.1 编写和编译可信应用\n为了实现与可信应用的简便且统一的通信，我们采用了模型上下文协议（Model Context Protocol，简称 MCP）。这意味着可信应用被实现为MCP服务器，而内置于NHP Agent中的客户端则作为MCP客户端与可信应用进行通信。由于MCP框架几乎支持所有编程语言，因此使用任何语言实现可信应用都十分简单和直接。\n\n以下是一个用 Golang 编写的简单可信应用示例，该示例在本演示中使用。\n```go\npackage main\n\nimport (\n\t\"context\"\n\t\"encoding/csv\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\n\t\"github.com/mark3labs/mcp-go/mcp\"\n\t\"github.com/mark3labs/mcp-go/server\"\n)\n\nfunc main() {\n    s := server.NewMCPServer(\"trusted application\", \"1.0.0\",\n        server.WithToolCapabilities(true),\n    )\n\n    s.AddTool(\n        mcp.NewTool(\"verify_account\",\n            mcp.WithDescription(\"Verify account to check whether there are any risk factors associated with the account\"),\n            mcp.WithString(\"path\",\n                mcp.Required(),\n                mcp.Description(\"path to file which records the account details\"),\n            ),\n            mcp.WithString(\"account_id\",\n                mcp.Description(\"account id\"),\n\t\t\t\tmcp.Required(),\n            ),\n        ),\n        verifyAccountHandler,\n    )\n\n    // Start STDIO server\n    if err := server.ServeStdio(s); err != nil {\n        fmt.Fprintf(os.Stderr, \"Server error: %v\\n\", err)\n        os.Exit(1)\n    }\n}\n\nfunc verifyAccountHandler(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {\n    path, err := req.RequireString(\"path\")\n    if err != nil {\n        return mcp.NewToolResultError(err.Error()), nil\n    }\n\n    accountId, err := req.RequireString(\"account_id\")\n    if err != nil {\n        return mcp.NewToolResultError(err.Error()), nil\n    }\n\n\tis_risk, err := findRecord(path, accountId)\n\tif err != nil {\n\t\treturn mcp.NewToolResultError(err.Error()), nil\n\t}\n\n    return mcp.NewToolResultText(fmt.Sprintf(`{\"account_id\":\"%s\",\"is_risk\": %t}`, accountId, is_risk)), nil\n}\n\nfunc findRecord(path string, accountId string) (bool, error) {\n\tf, err := os.Open(path)\n\tif err != nil {\n\t\treturn false, err\n\t}\n\tdefer f.Close()\n\n\tr := csv.NewReader(f)\n\tr.Comma = ','\n\n\tfor {\n\t\trecord, err := r.Read()\n\t\tif err != nil {\n\t\t\tif err == csv.ErrFieldCount {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tif err == io.EOF {\n\t\t\t\treturn false, nil\n\t\t\t}\n\n\t\t\treturn false, err\n\t\t}\n\n\t\tif record[0] == accountId {\n\t\t\treturn true, nil\n\t\t}\n\t}\n}\n```\n假设我们已将其编译为名为 `ta` 的二进制文件。\n\n#### 4.2.2 注册可信应用\n你可以使用以下命令来注册可信应用：\n```shell\ncurl --insecure --request POST --url https://localhost:8443/api/v1/ta/register --header 'content-type: multipart/form-data' --form file=@ta --form 'description=trusted application demo'\n[\n  {\n    \"method\": \"POST\",\n    \"name\": \"/api/v1/ta/ceca4572-644b-4bde-a4b6-ac6048f8fba6/verify_account\",\n    \"description\": \"Verify account to check whether there are any risk factors associated with the account\",\n    \"params\": [\n      {\n        \"name\": \"doId\",\n        \"description\": \"identifier of the data object\",\n        \"type\": \"string\"\n      },\n      {\n        \"name\": \"account_id\",\n        \"description\": \"account id\",\n        \"type\": \"string\"\n      }\n    ]\n  }\n]\n```\n注册成功后，你可以访问由可信应用暴露的HTTP RESTful API。\n\n#### 4.2.3 执行任务\n你可以使用以下curl命令调用这些暴露的RESTful API来执行隐私保护计算：\n```shell\ncurl --insecure --request POST --url https://localhost:8443/api/v1/ta/ceca4572-644b-4bde-a4b6-ac6048f8fba6/verify_account --header 'content-type: application/json' --data '{\"doId\": \"47d2b67c-ef80-45fc-814d-effd23baf788\", \"account_id\": \"62230121012345678901\"}'\n```\n执行后，你将收到响应 `{\"account_id\":\"62230121012345678901\",\"is_risk\":false}`，表示该账户不是涉险账户。\n\n由于NHP Agent、可信应用和数据均受可信执行环境（TEE）保护，数据资源消费者无法直接访问数据资源。所有对数据的操作必须通过TEE内部受控且经过验证的执行流程进行，确保数据始终保持机密性，并且按照关联的智能数据策略进行处理。整个DHP设计保证了消费者能够使用数据，却永远无法查看或提取数据的原始内容。\n"
  },
  {
    "path": "docs/zh-cn/features.zh-cn.md",
    "content": "---\nlayout: page\ntitle: 功能列表\nparent: 中文版\nnav_order: 3\npermalink: /zh-cn/features/\n---\n\n# OpenNHP功能列表\n{: .fs-9 }\n\n[English](/features/){: .label .fs-4 }\n\n---\n\n\n"
  },
  {
    "path": "docs/zh-cn/index.zh-cn.md",
    "content": "---\ntitle: 中文版\nnav_order: 12\nlayout: page\nhas_children: true\nhas_toc: true\npermalink: /zh-cn/\n---\n\n# OpenNHP中文版文档\n{: .fs-9 }\n\n[English](/){: .label .fs-4 }\n\n---\n"
  },
  {
    "path": "docs/zh-cn/nhp_quick_start.zh-cn.md",
    "content": "---\nlayout: page\ntitle: NHP快速开始\nparent: 中文版\nnav_order: 2\npermalink: /zh-cn/nhp_quick_start/\n---\n\n# NHP快速开始\n{: .fs-9 }\n\n一个本地搭建的 Docker 调试环境，模拟 nhp-server、nhp-ac、traefik、web-app 等。此环境可用于：\n{: .fs-6 .fw-300 }\n\n- 快速理解 opennhp 的运作方式\n- 插件调试\n- 基本逻辑验证\n- 局部性能压力测试\n{: .fs-6 .fw-300 }\n\n[English](/nhp_quick_start/){: .label .fs-4 }\n\n---\n\n## 1. 概述\n\n快速入门指南帮助开发人员快速设置 OpenNHP Docker 环境，构建源代码，并测试 OpenNHP 的关键功能。无论您是在探索 OpenNHP 如何使服务器对未经授权的扫描“不可见”，还是将其集成到现有的零信任架构中，本指南都提供了快速启动和运行的基本步骤。\n\n### 1.1 网络拓扑\n\n![Workflow](https://docs.opennhp.org/images/infrastructure.jpg)\n\n| 容器名      | IP           | 说明                                                              |\n| ---------- | ------------ | --------------------------------------------------------------- |\n| NHP-Agent  | 177.7.0.8    | nhp-agentd & nginx（默认均不运行），443->AC:80, 80-> NHP-Server:62206 |\n| NHP-Server | 177.7.0.9    | nhp-serverd，开放端口 62206                                         |\n| NHP-AC     | 177.7.0.10   | nhp-acd & traefik，禁止任何端口访问                                  |\n| Web app    | 177.7.0.11   | 被保护的 Web app，只允许 NHP-AC 访问 8080 端口                        |\n\n### 1.2 测试场景\n\n| 场景        | 状态                     | 期望结果                                       |\n| ---------- | ------------------------ | --------------------------------------------- |\n| 场景一      | 隐身（对于未授权的用户）   | ping 或者访问 NHP-AC Server 代理的 Web-app 失败 |\n| 场景二      | 通过 NHP-Agent 敲门后    | 能正常访问通过 NHP-AC 防护的 Web-app            |\n| 场景三      | 通过 web 身份认证敲门后   | 能正常访问通过 NHP-AC 防护的 Web-app            |\n\n## 2. 安装 Docker 环境\n\n### 2.1 Docker Desktop for Mac\n\n```shell\nbrew install --cask docker\n```\n\n或者从 Docker 官网下载 .dmg 文件手动安装：\n<https://www.docker.com/products/docker-desktop/>\n\n### 2.2 Docker Desktop for Windows\n\n- 系统要求：\n  - Windows 10/11（64 位，专业版/企业版/家庭版）\n  - 启用 WSL 2（推荐）或 Hyper-V\n- 安装步骤\n  - 下载 Docker Desktop：官网下载\n  - 运行安装程序，按提示完成安装。\n\n安装完成后，启动 Docker Desktop。\n\n## 3. 根据最新代码构建基础镜像\n\n### 3.1 获取最新代码\n\n```shell\ngit clone https://github.com/OpenNHP/opennhp.git\n```\n\n### 3.2 构建 opennhp-base 镜像\n\n***注意: 先进入到 docker 目录(cd ./docker)***\n\n```shell\ncd ./docker\ndocker build --no-cache -t opennhp-base:latest -f Dockerfile.base ../..\n```\n\n## 4. 运行与测试\n\n以下启动命令，在启动过程会相应的构建 nhp-server、nhp-ac、web-app、nhp-agent 镜像，在实际调试过程中，可使用 ``` docker compose build [container_name] ```（如：```docker compose build nhp-ac``` 编译 nhp-ac）对服务单独编译\n\n### 4.1 启动所有服务\n\n***注意: 先进入到 docker 目录(cd ./docker)***\n\n```shell\ncd ./docker\ndocker compose up -d\n```\n\n### 4.2 场景一: 隐身（对于未授权的用户）\n\n进入 nhp-agentd 容器进行验证\n***注意: 先进入到 docker 目录(cd ./docker)***\n\n```shell\ncd ./docker\ndocker exec -it nhp-agent bash\n```\n\n默认情况下，通过 curl NHP-AC 会出现以下错误（保护中）\n\n```shell\nroot@68a230812459:/workdir# curl -i  http://177.7.0.10\ncurl: (28) Failed to connect to 177.7.0.10 port 80: Connection timed out\n```\n\n端口扫描验证，进入 NHP-Agent 容器 并安装 nmap\n\n```shell\nroot@ee88ec992447:/# docker exec -it nhp-agent bash\nroot@ee88ec992447:/# apt-get update && apt-get install -y nmap\n```\n\n通过 NHP-Agent 扫描 NHP-AC 扫描不到任何端口\n\n```shell\nroot@ee88ec992447:/# nmap 177.7.0.10\nStarting Nmap 7.93 ( https://nmap.org ) at 2025-07-03 07:33 UTC\nNmap scan report for nhp-ac.docker_nginx (177.7.0.10)\nHost is up (0.000044s latency).\nAll 1000 scanned ports on nhp-ac.docker_nginx (177.7.0.10) are in ignored states.\nNot shown: 1000 filtered tcp ports (no-response)\nMAC Address: 12:B4:5C:EB:72:F4 (Unknown)\n\nNmap done: 1 IP address (1 host up) scanned in 21.84 seconds\n```\n\n### 4.3 场景二: 使用 nhp-agentd 服务来敲门\n\n通过``` nohup /nhp-agent/nhp-agentd run 2>&1 & ``` 命令来启动 nhp-agentd 服务后，访问正常，如下：\n\n```shell\nroot@68a230812459:/workdir# nohup /nhp-agent/nhp-agentd run 2>&1 &\nroot@6e21724b68f1:/workdir# curl -i http://177.7.0.10\nHTTP/1.1 200 OK\nContent-Length: 26\nContent-Type: application/json; charset=utf-8\nDate: Tue, 08 Jul 2025 06:21:10 GMT\n\n{\"message\":\"Hello World!\"}\n```\n\n当 nhp-agent 启动，可以扫描到 NHP-AC 的 80 端口\n\n```shell\nroot@ee88ec992447:/# nmap 177.7.0.10\nStarting Nmap 7.93 ( https://nmap.org ) at 2025-07-03 07:37 UTC\nNmap scan report for nhp-ac.docker_nginx (177.7.0.10)\nHost is up (0.000094s latency).\nNot shown: 999 filtered tcp ports (no-response)\nPORT   STATE SERVICE\n80/tcp open  http\nMAC Address: 12:B4:5C:EB:72:F4 (Unknown)\n\nNmap done: 1 IP address (1 host up) scanned in 4.96 seconds\n```\n\n### 4.4 场景三: 使用模拟授权服务的登录来验证\n\n停止 nhp-agentd 服务，并启动 NHP-Agent 容器中的 nginx\n\n```shell\nroot@6e21724b68f1:/workdir# ps -aux|grep nhp-agentd\nroot        38  0.3  0.2 1974072 20448 pts/0   Sl   02:55   0:00 /nhp-agent/nhp-agentd run\nroot        51  0.0  0.0   2844  1424 pts/0    S+   02:55   0:00 grep --color=auto nhp-agentd\nroot@6e21724b68f1:/workdir# kill 38\nroot@6e21724b68f1:/workdir# nginx\n```\n\n访问：<http://localhost/plugins/example?resid=demo&action=login>\n\n- 预期页面正常显示\n- 敲门前访问：<https://localhost/> 超时（504 Gateway Time-out）\n- 点击登录（敲门后），页面正常跳转，并能正常访问 <https://localhost/> （注：开门时间为 15s，15s后禁止访问）\n- 在 NHP-Agent 容器内，通过 ```curl -i  http://177.7.0.10``` 能正常显示内容\n- 当点击登录（敲门后），可以扫描到 NHP-AC 的 80 端口\n\n```shell\nroot@ee88ec992447:/# nmap 177.7.0.10\nStarting Nmap 7.93 ( https://nmap.org ) at 2025-07-03 07:37 UTC\nNmap scan report for nhp-ac.docker_nginx (177.7.0.10)\nHost is up (0.000094s latency).\nNot shown: 999 filtered tcp ports (no-response)\nPORT   STATE SERVICE\n80/tcp open  http\nMAC Address: 12:B4:5C:EB:72:F4 (Unknown)\n\nNmap done: 1 IP address (1 host up) scanned in 4.96 seconds\n```\n\n### 4.5 验证 ipset 规则是否生效\n\n```shell\ndocker exec -it nhp-ac ipset list\n```\n\n通过 nhp-agentd 或 授权插件敲门后，如果 NHP-AC 的 ipset 中出现以下结果，则表示规则写入成功，这意味着敲门成功：\n***Name: defaultset Rules***\n\n```shell\nName: defaultset\nType: hash:ip,port,ip\nRevision: 5\nHeader: family inet hashsize 1024 maxelem 1000000 timeout 120 counters\nSize in memory: 656\nReferences: 7\nNumber of entries: 2\nMembers:\n177.7.0.8,udp:80,177.7.0.10 timeout 8 packets 0 bytes 0\n177.7.0.8,tcp:80,177.7.0.10 timeout 8 packets 90 bytes 14565\n\nName: defaultset_down\nType: hash:ip,port,ip\nRevision: 5\nHeader: family inet hashsize 1024 maxelem 1000000 timeout 121 counters\nSize in memory: 208\nReferences: 2\nNumber of entries: 0\nMembers:\n\nName: tempset\nType: hash:net,port\nRevision: 7\nHeader: family inet hashsize 1024 maxelem 1000000 timeout 5 counters\nSize in memory: 456\nReferences: 2\nNumber of entries: 0\nMembers:\n```\n\n## 5. 修改代码重新构建镜像并调试\n\n在实际的调试中，修改完代码后，可以使用 ```docker compose build [container_name]``` (如：``` docker compose build nhp-ac ``` 构建 nhp-ac 镜像) 来重新构建相应的服务来进行调试\n\n### 5.1 代码修改\n\n用 IDE 打开项目（如：vscode）并修改 OpenNHP 源代码。\n\n### 5.2 重新构建服务并调试\n\n采用以下方式对相应修改的服务进行重新构建并调试\n\n### 5.2.1 重新构建 nhp-server 并启动\n\n```shell\ncd ./docker\ndocker compose build nhp-server\ndocker stop nhp-server && docker rm nhp-server\ndocker compose up -d\n```\n\n### 5.2.2 重新构建 nhp-ac 并启动\n\n```shell\ncd ./docker\ndocker compose build nhp-ac\ndocker stop nhp-ac && docker rm nhp-ac\ndocker compose up -d\n```\n"
  },
  {
    "path": "docs/zh-cn/overview.zh-cn.md",
    "content": "---\nlayout: page\ntitle: OpenNHP简介\nparent: 中文版\nnav_order: 1\ndescription: \"OpenNHP: 零信任网络隐身协议\"\npermalink: /zh-cn/overview/\n---\n\n# OpenNHP：零信任网络隐身协议\n{: .fs-9 }\n\n[English](/){: .label .fs-4 }\n\n---\n\n## 第一章：导读\n\n**NHP**是由中国计算机学会CCF发布的零信任网络隐身协议，对比零信任SDP（软件定义边界）中的**单包授权协议SPA**，具有更好的隐身性、更强的性能和可靠性、更灵活的扩展性、以及良好的信创兼容性。\n\n**OpenNHP**是基于NHP标准的开发的开源软件项目。在上手OpenNHP项目前，建议阅读以下文章：\n\n关于OpenNHP的代码结构与技术详解，请阅读：\n\n- [《OpenNHP代码解读文档》](../code/)\n\n## 第二章：OpenNHP的兼容性\n\nOpenNHP具备良好的兼容性，尤其是对信创生态的支持，以下是OpenNHP兼容的密码算法和软硬件。\n\n### 2.1 密码算法\n\n| 国产密码算法 |  *SM2、SM3、SM4*  |  \n|---|---|\n| **国际密码算法**   |  ***Curve25519、AES、SHA256***  |\n\n### 2.2 操作系统\n\n| 操作系统 |  兼容性  |\n|---|:---:|\n| Windows   |  ✅ |\n| 苹果MacOS   |  ✅ |\n| 统信UOS   |  ✅ |\n| 麒麟KylinOS   |  ✅ |\n| 中电科普华OS   |  ✅ |  \n| 苹果iOS   |  ✅ |\n| 安卓Android   |  ✅ |\n\n### 2.3 CPU指令集\n\n| CPU类型 |  兼容性  |\n|---|:---:|\n| x86   |  ✅ |\n| ARM华为鲲鹏   |  ✅ |\n|  LoongArch龙芯   |  ✅ |\n|  SW申威   |  ✅ |\n\n"
  },
  {
    "path": "docs/zh-cn/remo_config.zh-cn.md",
    "content": "# OpenNHP远端配置\n\n## 1 OpenNHP远端配置说明\n\n为方便统一管理OpenNHP配置信息，OpenNHP使用etcd作为统一远端配置中心。\n\nOpenNHP三大核心组件对配置文件的支持方式：\n\n| 组件       | 远端配置                        | 本地配置                        |\n| ---------- | ------------------------------- | ------------------------------- |\n| nhp server | <font color=\"green\">支持</font> | <font color=\"green\">支持</font> |\n| nhp ac     | <font color=\"green\">支持</font> | <font color=\"green\">支持</font> |\n| nhp agent  | <font color=\"red\">不支持</font> | <font color=\"green\">支持</font> |\n\n## 2 etcd环境部署\n\n### 2.1 etcd部署\n\n- etcd下载地址：https://github.com/etcd-io/etcd/releases/\n- 下载对应服务器环境的etcd版本\n- etcd服务部署与启动参数安装包中的README.md文件\n\n### 2.2 etcd可视化配置工具\n\n- 启动etcd服务后，可以通过etcd的可视化工具来进行OpenNHP的配置信息的编辑，本文以工具etcdkeeper为例来配置etcd客户化配置环境\n\n- 将etcdkeeper下载到etcd部署服务器上，下载方法：\n\n  ```sh\n  wget https://github.com/evildecay/etcdkeeper/releases/download/v0.7.6/etcdkeeper-v0.7.6-linux_x86_64.zip\n  unzip etcdkeeper-v0.7.6-linux_x86_64.zip\n  ```\n\n- etcdkeeper启动方法：\n\n  - IP设置为服务器实际IP\n  - 端口设置为实际方法端口\n  - 启动成功后可通过浏览器访问，访问地址如：http://192.168.32.30:8800\n\n  ```sh\n  cd etcdkeeper\n  chmod +x etcdkeeper\n  ./etcdkeeper -h 192.168.32.30 -p 8800 \n  ```\n\n## 3 nhp server远端配置\n\n### 3.1 远端配置访问配置\n\netc目录下的remote.toml为nhp server服务访问远端配置中心ETCD的配置信息\n\n- Endpoints：etcd访问地址\n- Key：nhp server获取本服务器的key\n\n```toml\n# NHP-Server remote config\n# field with (-) does not support dynamic update\n# If the file remote.toml exists, NHP-Server will obtain remote configuration information through the etcd client\n\n# Endpoints: ETCD service access address.\n# Key: NHP-Server obtain the configuration information through this key.\n# Username: The account of the NHP-Server accessing ETCD.\n# Password: The password for NHP-Server to access ETCD.\n\nEndpoints = [\"172.16.3.53:2379\"]\nKey = \"openserver-1\"\n```\n\n\n### 3.2 启用远端配置\n\n确保配置文件./nhp-server/etc/remote.toml文件存在，并确保Endpoints和Key正确配置，在nhp server服务启动时会加载remote.toml文件并去获取文件中Key对应的配置内容。\n\n\n\n如想继续使用本地文件的配置方式，移除remote.toml文件或将remote.toml中的Endpoints或Key的内容置为空，服务将会使用本地配置文件来启动。\n\n\n\n### 3.3 远端配置内容\n\nnhp server远端配置内容分为如下七部分：\n\n- [BaseConfig]部分内容对应本地配置文件config.toml\n- [HttpConfig]部分内容对应本地配置文件http.toml\n- [[ACs]]部分内容对应本地配置文件ac.toml\n- [[Agents]]部分内容对应本地配置文件agent.toml\n- [[DBs]]部分内容对应本地配置文件db.toml\n- [[AuthServiceId]]部分内容对应本地配置文件resource.toml\n- [[SrcIps]]部分内容对应本地配置文件srcip.toml\n\n远端配置信息如下：\n\n```toml\n# NHP-Server base config\n# field with (-) does not support dynamic update\n\n# PrivateKeyBase64 (-): server private key in base64 format.\n# DefaultCipherScheme: 0: gmsm, 1: curve25519.\n# ListenIp (-): udp listening address.\n# ListenPort (-): udp listening port.\n# Hostname (-): server domain name.\n# LogLevel: 0: silent, 1: error, 2: info, 3: audit, 4: debug, 5: trace.\n# DisableAgentValidation: whether for the server to skip the agent's public key validation.\n[BaseConfig]\nPrivateKeyBase64 = \"SFhGcTlhYlU4dTJMemNsaWM5TFZ2NzZDQjJNd2VGZ2Q=\"\nDefaultCipherScheme = 0\nListenIp = \"\"    # empty for ipv4 + ipv6, \"0.0.0.0\" for ipv4 only\nListenPort = 62206\nHostname = \"localhost\" # the hostname of NHP-Server\nLogLevel = 4\nDisableAgentValidation = false\n\n\n# http server config\n\n# EnableHttp: true: turn on http server, false: shutdown http server.\n# EnableTLS: whether to use TLS certificates for hosting https server.\n# TLSCertFile: certificate file path.\n# TLSKeyFile: key file path.\n# to update http changes, you need to restart the http server by changing \"EnableHttp\" to \"false\" and then switch it back to \"true\".\n[HttpConfig]\nEnableHttp = true\nEnableTLS = true\nHttpListenIp = \"0.0.0.0\"    # empty for ipv4 + ipv6, \"0.0.0.0\" for ipv4 only, \"127.0.0.1\" for local ipv4 access only\nTLSCertFile = \"cert/cert.pem\"\nTLSKeyFile = \"cert/cert.key\"\n\n# list the AC peers for the server under [[ACs]] table\n\n# PubKeyBase64: public key for the AC in base64 format.\n# ExpireTime (epoch timestamp in seconds): peer key validation will fail when it expires.\n[[ACs]]\nPubKeyBase64 = \"3wDnLkZ3ccK3Ezi3pdG003rFbX4riMIOKfvFlu4t5yKhijSdIkAx8C6mVMFxygfZ0ijt8IDAS2RdTnfZpUCbZA==\"\nExpireTime = 1924991999\n\n# list the agent peers for the server under [[Agents]] table\n\n# PubKeyBase64: public key for the agent in base64 format.\n# ExpireTime (epoch timestamp in seconds): peer key validation will fail when it expires.\n[[Agents]]\nPubKeyBase64 = \"WnJAolo88/q0x2VdLQYdmZNtKjwG2ocBd1Ozj41AKlo=\"\nExpireTime = 1924991999\n\n# list the device peers for the server under [[Devices]] table\n\n# PubKeyBase64: public key for the device in base64 format.\n# ExpireTime (epoch timestamp in seconds): peer key validation will fail when it expires.\n[[DBs]]\nPubKeyBase64 = \"CtxNuy7lJ1mJgjqWplcwN8dZhXhSNPhECja1A0OWKa+2wtI7xuB3jPcamogGZGBBfQ4SqnoPGLA7zRQaAotoxg==\"\nExpireTime = 1924991999\n\n\n\n# List resources and their sub-fields here\n\n# syntax [\"{AuthServiceId}\"]\n# AuthSvcId: id of the authentication and authorization service provider.\n# PluginPath: path of plugin to implement auth logic.\n[[AuthServiceId]]\nAuthSvcId=\"default\"\nPluginPath = \"default\"\n\n[[AuthServiceId]]\nAuthSvcId=\"product-sdp\"\nPluginPath = \"product-sdp1\"\n\n\n# list additional source addresses to be passed along with the agent address\n\n# syntax [[\"{SrcIps}\"]]\n# SrcIp: specify the agent source ip. Each source ip can have multiple side source ips.\n# Ip: specify a side source ip address to be also passed after successful knock.\n[[SrcIps]]\nSrcIp = \"192.168.2.27\"\nIp = [\"192.168.2.26\",\"192.168.2.28\"]\n\n[[SrcIps]]\nSrcIp = \"192.168.3.27\"\nIp = [\"192.168.3.28\"]\n```\n\n\n\n本地文件支持动态变更的内容在远端配置环境下同样支持动态变更。\n\n## 4 nhp ac远端配置\n\n### 4.1 远端配置访问配置\n\n参照章节3.1\n\n### 4.2 启用远端配置\n\n参照章节3.2\n\n\n\n### 4.3 远端配置内容\n\nnhp ac远端配置内容分为如下三部分：\n\n- [BaseConfig]部分内容对应本地配置文件config.toml\n- [HttpConfig]部分内容对应本地配置文件http.toml\n- [[Servers]]部分内容对应本地配置文件server.toml\n\n远端配置信息如下：\n\n```toml\n# NHP-AC base config\n# field with (-) does not support dynamic update\n\n# ACId (-): specify the id of this AC.\n# PrivateKeyBase64 (-): AC private key in base64 format.\n# DefaultCipherScheme: 0: gmsm, 1: curve25519.\n# IpPassMode:\n#  0: (default) immediately pass traffic with the agent source ip,\n#  2: process pre-access to determine actual agent source ip then pass.\n# FilterMode: \n#  0: iptables (default)\n#  1: ebpf xdp (requires Linux kernel >= 5.6 and XDP-capable network interface)\n# LogLevel: 0: silent, 1: error, 2: info, 3: audit, 4: debug, 5: trace.\n# AuthServiceId (-): id for authentication and authorization service provider this AC belongs to.\n# ResourceIds (-): resource group ids that this AC protects.\n[BaseConfig]\nACId = \"testAC-346\"\nDefaultIp = \"172.16.3.52\"\nPrivateKeyBase64 = \"N1o4c1BsSHZXQ1hsUFQyUzQ2QkJ2YlhQSGxYbDVmcU0=\"\nDefaultCipherScheme = 0\nIpPassMode = 0\nLogLevel = 4\nAuthServiceId = \"example\"\nResourceIds = [\"demo\"]\nFilterMode = 0\n\n# http server config\n\n# EnableHttp: true: turn on http server, false: shutdown http server.\n# EnableTLS: whether to use TLS certificates for hosting https server.\n# TLSCertFile: certificate file path.\n# TLSKeyFile: key file path.\n# to update http changes, you need to restart the http server by changing \"EnableHttp\" to \"false\" and then switch it back to \"true\".\n[HttpConfig]\nEnableHttp = true\nEnableTLS = true\nHttpListenPort = 62206\nTLSCertFile = \"cert/cert.pem\"\nTLSKeyFile = \"cert/cert.key\"\n\n\n# list the server peers for the AC under [[Servers]] table\n\n# Hostname: the domain of the server peer. If specified, it overrides the \"Ip\" field with its first resolved address.\n# Ip: specify the ip address of the server peer\n# Port: specify the port number of this server peer is listening\n# PubKeyBase64: public key of the server peer in base64 format\n# ExpireTime (epoch timestamp in seconds): peer key validation will fail when it expires.\n[[Servers]]\nHostname = \"\"\nIp = \"172.16.2.15\"\nPort = 62206\nPubKeyBase64 = \"vfAyhQfS1Z+gE7aKSqMCw8GJlZOnw7G7OEG6dHxowtPORn9vqCPp3RqKuyBDZeVqWAMFaCjBUlfu9TpQeN1/uA==\"\nExpireTime = 1924991999\n```\n\n本地文件支持动态变更的内容在远端配置环境下同样支持动态变更。\n"
  },
  {
    "path": "docs/zh-cn/server_plugin.zh-cn.md",
    "content": "---\nlayout: page\ntitle: 服务器插件开发\nparent: 中文版\nnav_order: 9\npermalink: /zh-cn/server_plugin/\n---\n\n# OpenNHP插件开发教程\n{: .fs-9 }\n\n[English](/server_plugin/){: .label .fs-4 }\n\n---\n\n- [简介\t](#简介 )\n\n- [1. 应用OpenNHP插件的必要性\t](#1-应用opennhp插件的必要性 )\n\n    - [1.1 协议兼容性与技术限制\t](#11-协议兼容性与技术限制 )\n\n    - [1.2 身份认证的定制化需求\t](#12-身份认证的定制化需求 )\n\n- [2. 插件工作原理\t](#2-插件工作原理 )\n\n    - [2.1 用户通过浏览器发起HTTP请求\t](#21-用户通过浏览器发起http请求 )\n\n    - [2.2 NHP服务器解析URL并调用对应插件\t](#22-nhp服务器解析url并调用对应插件 )\n\n    - [2.3 插件程序执行核心功能\t](#23-插件程序执行核心功能 )\n\n    - [2.4 插件完成代码执行流程\t](#24-插件完成代码执行流程 )\n\n    - [2.5 NHP服务器向用户响应HTTP请求\t](#25-nhp服务器向用户响应http请求 )\n\n- [3. 插件开发原理\t](#3-插件开发原理 )\n\n    - [3.1 环境准备\t](#31-环境准备 )\n\n    - [3.2 初始化项目\t](#32-初始化项目 )\n\n    - [3.3 插件功能设计\t](#33-插件功能设计 )\n\n    - [3.4 核心代码开发\t](#34-核心代码开发 )\n\n    - [3.5 插件的编译测试与部署\t](#35-插件的编译测试与部署 )\n\n- [结论\t](#结论 )\n\n# 简介\nNHP服务器中的插件是添加特定功能到主应用程序的模块。它们被设计为高度模块化，与主应用程序松散耦合，允许开发人员添加、删除或更新插件，而不影响服务器的核心功能。\n\n## 1. 应用OpenNHP插件的必要性\n\nOpenNHP插件的开发一方面解决了UDP协议与网页端HTTP请求之间的兼容性问题，另一方面通过定制化身份认证服务满足了政务平台多样化的需求。插件的开发是NHP框架进一步扩展和灵活适应政务数据流通应用的关键步骤。具体原因如下：\n\n### 1.1 协议兼容性与技术限制\n\nNHP标准协议基于UDP协议进行通信，UDP具有轻量、快速的特点，适合大规模、高频次的数据传输。然而，在某些应用场景中，尤其是基于网页的应用，如HTML5网页，浏览器中的JavaScript只能发起HTTP请求，无法直接发送UDP请求。这就带来了协议不兼容的问题。由于很多现代政务应用通过网页端进行操作和数据交互，插件的开发变得非常必要，以弥补这个技术差距。\n\n通过开发OpenNHP插件，NHP服务器能够接收来自网页端的HTTP请求（通常是网页中的敲门包），并转换为UDP协议进行内部通信。这种机制确保了基于HTTP请求的网页应用与NHP服务器的无缝对接，从而拓展了NHP框架的应用范围，特别是在依赖浏览器与后台服务交互的场景中，提升了数据传输的灵活性和兼容性。\n\n### 1.2 身份认证的定制化需求\n\n政务数据流通涉及到高度安全的身份认证与权限管理。然而，标准的身份认证协议无法满足政务场景中的复杂需求。不同的政务平台有各自的认证机制，它们的身份认证流程具有很高的定制化需求。传统的标准协议在应对这些平台时显得过于僵化，无法灵活对接各自的认证系统。\n\nOpenNHP插件可以通过定制化服务来对接不同的政务平台，根据具体平台的要求，灵活适配其身份认证流程。插件提供了定制化开发的能力，允许开发者根据不同政务平台的需求对身份认证机制进行调整，使NHP框架能够与不同平台无缝集成。这不仅提高了身份认证的安全性，还确保了数据流通的合规性和灵活性。\n\n## 2. 插件工作原理\n\n整个插件的执行流程涵盖了从用户发起请求、服务器解析插件、插件执行逻辑再到最终反馈给用户的完整过程。每一步都起着关键作用，确保了NHP服务器能够通过插件来满足不同场景下的请求处理需求，特别是在身份验证和敲门包机制上。\n\n![插件工作原理架构图](/images/plugin_image2.png) \n\n***图一 插件工作原理架构图***\n\n### 2.1 用户通过浏览器发起HTTP请求\n\n用户在浏览器中输入指定的URL地址，向NHP服务器发送HTTP请求。例如，用户访问URL：\n- http://127.0.0.1:port/plugins/example?resid=demo&action=login.\n\n这是整个流程的起点，通常由网页或应用发出的请求，需要通过插件来处理。\n\n| URL组成部分    | 说明                                                      |\n| -------------- | --------------------------------------------------------- |\n| 127.0.0.1:port | 前半部分为NHP-Server服务器IP地址，后半部分为NHP服务端口号 |\n| plugin         | 插件目录                                                  |\n| example        | 插件名称                                                  |\n| resid          | 插件资源id                                                |\n| action         | 执行的动作，用于在插件程序代码中判断所要执行的辅助函数    |\n\n***表一 URL组成部分说明***\n\n### 2.2 NHP服务器解析URL并调用对应插件\n\nNHP服务器接收到来自浏览器的HTTP请求后，会根据请求的URL路径和参数解析出需要调用的插件。在这个过程中，NHP服务器识别出plugins/example部分，并将请求导入到名为“example”的插件中进行进一步处理。\n\n### 2.3 插件程序执行核心功能\n\n插件程序根据URL中的参数（如resid=demo和action=login），执行相应的功能。插件的核心功能包括身份认证和一系列的“敲门包”（Knock）请求处理步骤。具体流程可以是根据这些参数执行一系列函数，核心函数处理主逻辑，辅助函数则提供支持，以完成身份验证、资源访问等任务。\n\n### 2.4 插件完成代码执行流程\n\n插件在处理请求时，经过身份验证或其他定制化服务的逻辑后，插件的代码流程执行完成。这一步是插件实现其核心功能的关键，所有的认证、授权或其他逻辑在此步完成。\n\n### 2.5 NHP服务器向用户响应HTTP请求\n\n插件处理完毕后，将结果反馈给NHP服务器，NHP服务器则通过HTTP协议将处理结果响应给用户。用户最终会在浏览器端接收到返回的内容，可能是操作成功的确认信息，或是相关数据、页面更新等内容。\n\n## 3. 插件开发原理\n\n### 3.1 环境准备\n\n在开发OpenNHP插件之前，确保以下开发环境已经搭建完成：\n\n**1.开发语言**：选择Golang语言进行开发。\n\n**2.开发工具**：推荐使用IDEA、VS Code等集成开发环境。\n\n**3.OpenNHP源码**：从GitHub下载最新版本的opennhp代码，并集成至开发环境。下载地址：https://github.com/OpenNHP/opennhp。\n\n### 3.2 初始化项目\n\n首先在server/plugins目录下创建新的插件项目，例如现在我需要创建一个名为”example”的插件项目。\n\n![example插件上级目录](/images/plugin_image3.png) \n\n***图二 example插件上级目录***\n\nNHP 服务器中的每个插件通常都结构化为一个单独的 Go 包。例如，example 插件位于 NHP/server/plugins/example 目录下，并且有自己的 example.go 文件。\n\n初始化后的项目结构包括基础的配置文件和插件框架，主体包括etc目录及该目录下的配置文件(config.toml、resource.toml)、主程序文件main.go、自动化编译文件Makefile等。如果待开发插件需要集成前端页面，则可添加templates目录及该目录下的前端html页面.\n\n典型的插件文件，如 example.go，包含以下内容：\n\n- 必要包的导入语句\n- 与插件相关的常量和变量\n- 辅助函数\n- 主插件函数\n\n![example插件目录结构示例](/images/plugin_image4.png) \n\n***图三 example插件目录结构示例***\n\n| ***文件（夹）名称*** | ***作用***                                         |\n| ------------------------ | ------------------------------------------------------ |\n| etc                      | 目录下包含插件配置文件和资源文件                       |\n| config.toml              | 定义了插件代码运行过程中的一些配置文件信息             |\n| resource.toml            | 定义了插件资源信息                                     |\n| templates                | 存放集成的前端页面模版，如不需要可忽略                 |\n| main.go                  | 插件主程序文件，定义了核心主函数和一系列辅助函数的功能 |\n| Makefile                 | 自动化编译文件                                         |\n\n***表二 插件目录及文件作用***\n\n### 3.3 插件功能设计\n\n在插件功能设计阶段，需明确以下几个核心点：\n\n***数据流通场景***：定义数据流通过程中的参与者、权限及流转路径。\n\n***安全策略***：通过零信任架构设置严格的访问控制和验证机制。\n\n***日志与审计***：设计完善的日志记录功能，以便后续追溯和审计。\n\n例如“example”插件所要实现的功能主体为：\n\n1. 在H5页面提交包含用户名、密码的表单；\n\n2. NHP-Server服务器接收表单进行验证，验证成功后向NHP-AC服务器发起敲门；\n\n3. NHP-AC开门成功后返回应用服务器地址给客户端；\n\n4. 访问应用服务器资源。\n\n### 3.4 核心代码开发\n\n以下是为 NHP 服务器开发插件的步骤：\n\n1. 在 NHP/server/plugins 下创建您的插件的新目录。目录名称应为您的插件名称。\n\n2. 在插件目录中创建一个新的 Go 文件。文件名应与目录名称相同。例如，对于名为 myplugin 的插件，您将创建一个名为 myplugin.go 的文件。\n\n3. 定义您的插件函数。您的插件应至少有一个执行插件核心功能的主要函数。您还可以根据需要定义辅助函数。\n\n4. 在主应用程序中导入您的插件。在主应用程序文件 (main.go) 中，导入您的插件包并根据需要调用您的插件函数。\n\n参照插件功能设计进行代码开发，以“example”插件为例，设计AuthWithHttp函数接收处理HTTP请求，authRegular函数验证用户名密码并进行敲门，authAndShowLogin函数加载登录页面资源等，并且需要设计验辅助函数来实现功能。按照具体功能要求可进行拓展开发。\n\n![example插件核心代码以及辅助代码函数示例](/images/plugin_image6.png) \n\n![example插件核心代码以及辅助代码函数示例](/images/plugin_image7.png) \n\n![example插件核心代码以及辅助代码函数示例](/images/plugin_image8.png) \n\n***图四、五、六 example插件核心代码以及辅助代码函数示例***\n\n### 3.5 插件的编译测试与部署\n\n插件的测试与部署是确保插件功能完备、性能稳定的关键步骤。通过本地环境测试和优化，开发者可以在保证插件功能正确性的基础上进行实际部署。在生产环境中，需对插件进行精确配置，并结合安全与运维策略，确保插件在实际应用中能够满足业务需求并长期稳定运行。具体步骤如下：\n\n**1.插件的编译**\n\n 编译过程确保插件的代码与主项目保持一致，同时通过 Makefile 中的任务依赖关系，保证了插件的构建流程和主系统的编译紧密结合，实现一体化的构建与发布流程。具体步骤如下：\n\n***定义插件目录***: 在 Makefile 的顶部，我们可以看到一行定义插件目录的代码,如下图所示：\n\n![定义插件目录](/images/plugin_image11.png) \n\n***图七 定义插件目录***\n\n这行代码指定了插件的存放位置，即 server/plugins 目录。所有插件的源码和配置文件将会放在这个目录下，在启动NHP服务时，要确保插件能够正常加载，需要在NHP-Server的etc/resource.toml配置文件中配置插件文件路径。\n\n![插件文件路径配置](/images/plugin_image12.png) \n\n***图八 插件文件路径配置***\n\n***生成版本信息并开始构建***: 在 generate-version-and-build 任务中，包含了一系列步骤用于生成版本号、提交 ID、构建时间等信息。这些信息有助于跟踪插件的版本和构建状态。\n\n***插件的编译逻辑***: 在 Makefile 中的 plugins: 任务负责执行插件的编译，如下图：\n\n![插件编译任务plugins](/images/plugin_image13.png) \n\n***图九 插件编译任务plugins***\n\n插件目录检查: test -d $(NHP_SERVER_PLUGINS) 用于检查是否存在定义好的插件目录 (server/plugins)。\n\n执行编译: 如果插件目录存在，$(MAKE) -C $(NHP_SERVER_PLUGINS) 会进入该目录并执行其中的 Makefile，即在插件目录内执行插件的编译操作。\n\n***整体编译过程***：在整体项目构建过程中（Linux与macOS：运行代码根目录下脚本 make; Windows：运行代码根目录下BAT文件 build.bat），Makefile 中的 plugins 任务会被调用。如果插件目录存在且有效，插件的 Makefile 会被执行以完成插件的构建。在编译的过程中，可能会生成插件的二进制文件或其他形式的输出文件，以供 NHP 服务器使用。\n\n**2.本地环境功能测试**\n\n要测试您的插件，您可以在与插件文件相同的目录中编写一个单独的 _test.go 文件来编写单元测试。Go 的内置测试包 (testing) 可用于编写和运行测试。\n\n插件开发完成，且编译成功后，首先需要在本地环境进行功能测试。这一步主要用于验证插件的核心功能是否正确实现，确保插件的所有功能模块能够正常工作。可以通过模拟实际应用场景的请求，验证插件的响应是否符合预期，并观察日志记录以查找可能存在的问题。常见的测试步骤包括：\n\n1. 发起HTTP请求或UDP请求，测试插件的响应情况；\n\n2. 验证插件中的身份认证、敲门、开门、授权流程是否按预期执行；\n\n3. 测试插件的错误处理和异常捕获机制；\n\n在本地测试阶段，开发者可以通过调试工具、日志记录以及断点调试来细致排查和解决代码中的潜在问题，确保插件的逻辑严谨且无重大漏洞。\n\n**3.功能确认与优化**\n\n在本地环境测试通过后，开发者需要对插件的功能进行确认与优化。确认插件的核心功能是否完全符合需求文档的描述，是否所有预期的功能都得到了正确的实现。如果在测试中发现插件的某些功能未达预期或有进一步优化空间，此时可以根据测试结果进行相应的代码调整和功能优化。\n\n**4.实际应用场景的配置与部署**\n\n本地测试和优化完成后，插件即可进入实际应用场景的部署阶段。要部署您的插件，只需构建并运行主应用程序。您的插件将包含在构建中，并在服务器运行时可用。在部署插件时，通常需要根据应用场景的具体需求进行配置。具体步骤如下：\n\n***部署环境准备***：确保生产环境的服务器配置与本地测试环境一致或接近，包括操作系统、网络配置、依赖库等。\n\n***插件安装与配置***：将经过测试的插件代码部署到生产服务器上，按照实际应用场景的要求进行相应的配置，包括配置插件路径、接口地址、门禁服务器地址、身份认证机制等。\n\n***日志与监控设置***：在部署完成后，完善日志等级配置，便于在实际应用中及时发现和解决问题。\n\n***启动NHP服务查看插件加载情况***：按照NHP服务启动流程启动NHP服务，根据log目录下的日志文件查看插件的加载情况，并且按照本地插件测试流程验证插件功能是否正常。\n\n**5. 生产环境验证与运维**\n\n插件部署完成后，需要在实际应用环境中对其进行功能验证，确保在生产环境下插件能够正常工作。在插件上线后，还应定期进行运维，持续监控插件的表现，记录运行数据，并及时进行必要的更新和维护，确保插件在长期使用中保持最佳状态。\n\n# 结论\n为 NHP 服务器开发插件可以以一种模块化和可维护的方式扩展服务器的功能。通过遵循上述步骤，您可以创建自己的插件并为 NHP 服务器项目做出贡献。"
  },
  {
    "path": "endpoints/ac/config.go",
    "content": "package ac\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\n\t\"github.com/OpenNHP/opennhp/nhp/etcd\"\n\n\ttoml \"github.com/pelletier/go-toml/v2\"\n\n\t\"github.com/OpenNHP/opennhp/nhp/core\"\n\t\"github.com/OpenNHP/opennhp/nhp/log\"\n\t\"github.com/OpenNHP/opennhp/nhp/utils\"\n)\n\nvar (\n\tbaseConfigWatch io.Closer\n\thttpConfigWatch io.Closer\n\tserverPeerWatch io.Closer\n\n\terrLoadConfig = fmt.Errorf(\"config load error\")\n)\n\nconst (\n\tFilterMode_IPTABLES = iota // 0\n\tFilterMode_EBPFXDP         // 1\n)\n\ntype ACEtcdConfig struct {\n\tBaseConfig Config\n\tHttpConfig HttpConfig\n\tServers    []*core.UdpPeer\n}\n\ntype Config struct {\n\tPrivateKeyBase64    string          `json:\"privateKey\"`\n\tACId                string          `json:\"acId\"`\n\tDefaultIp           string          `json:\"defaultIp\"`\n\tAuthServiceId       string          `json:\"aspId\"`\n\tResourceIds         []string        `json:\"resIds\"`\n\tServers             []*core.UdpPeer `json:\"servers\"`\n\tIpPassMode          int             `json:\"ipPassMode\"` // 0: pass the knock source IP, 1: use pre-access mode and release the access source IP\n\tLogLevel            int             `json:\"logLevel\"`\n\tDefaultCipherScheme int             `json:\"defaultCipherScheme\"`\n\tFilterMode          int             `json:\"filterMode\"`\n}\n\ntype RemoteConfig struct {\n\tProvider  string\n\tKey       string\n\tEndpoints []string\n\tUsername  string\n\tPassword  string\n}\n\ntype HttpConfig struct {\n\tEnableHttp     bool\n\tEnableTLS      bool\n\tHttpListenPort int\n\tTLSCertFile    string\n\tTLSKeyFile     string\n}\n\ntype Peers struct {\n\tServers []*core.UdpPeer\n}\n\nfunc (a *UdpAC) loadBaseConfig() error {\n\t// config.toml\n\tfileName := filepath.Join(ExeDirPath, \"etc\", \"config.toml\")\n\tcontent, err := os.ReadFile(fileName)\n\tif err != nil {\n\t\tlog.Error(\"failed to read base config: %v\", err)\n\t}\n\n\tvar conf Config\n\tif unmarshalErr := toml.Unmarshal(content, &conf); unmarshalErr != nil {\n\t\tlog.Error(\"failed to unmarshal base config: %v\", unmarshalErr)\n\t}\n\tif updateErr := a.updateBaseConfig(conf); updateErr != nil {\n\t\t// report base config error\n\t\treturn updateErr\n\t}\n\n\tbaseConfigWatch = utils.WatchFile(fileName, func() {\n\t\tlog.Info(\"base config: %s has been updated\", fileName)\n\t\tif content, err = a.loadConfigFile(fileName); err == nil {\n\t\t\tif err = toml.Unmarshal(content, &conf); err == nil {\n\t\t\t\t_ = a.updateBaseConfig(conf)\n\t\t\t}\n\n\t\t}\n\t})\n\treturn nil\n}\n\nfunc (a *UdpAC) loadHttpConfig() error {\n\t// http.toml\n\tfileName := filepath.Join(ExeDirPath, \"etc\", \"http.toml\")\n\tcontent, err := os.ReadFile(fileName)\n\tif err != nil {\n\t\tlog.Error(\"failed to read http config: %v\", err)\n\t}\n\n\tvar httpConf HttpConfig\n\tif unmarshalErr := toml.Unmarshal(content, &httpConf); unmarshalErr != nil {\n\t\tlog.Error(\"failed to unmarshal http config: %v\", unmarshalErr)\n\t}\n\tif updateErr := a.updateHttpConfig(httpConf); updateErr != nil {\n\t\t// ignore error\n\t\t_ = updateErr\n\t}\n\n\thttpConfigWatch = utils.WatchFile(fileName, func() {\n\t\tlog.Info(\"http config: %s has been updated\", fileName)\n\t\tif content, err = a.loadConfigFile(fileName); err == nil {\n\t\t\tif err = toml.Unmarshal(content, &httpConf); err == nil {\n\t\t\t\t_ = a.updateHttpConfig(httpConf)\n\t\t\t}\n\t\t}\n\t})\n\treturn nil\n}\n\nfunc (a *UdpAC) loadPeers() error {\n\t// server.toml\n\tfileName := filepath.Join(ExeDirPath, \"etc\", \"server.toml\")\n\tcontent, err := os.ReadFile(fileName)\n\tif err != nil {\n\t\tlog.Error(\"failed to read server peer config: %v\", err)\n\t}\n\n\t// update\n\tvar peers Peers\n\tif unmarshalErr := toml.Unmarshal(content, &peers); unmarshalErr != nil {\n\t\tlog.Error(\"failed to unmarshal server peer config: %v\", unmarshalErr)\n\t}\n\tif updateErr := a.updateServerPeers(peers.Servers); updateErr != nil {\n\t\t// ignore error\n\t\t_ = updateErr\n\t}\n\n\tserverPeerWatch = utils.WatchFile(fileName, func() {\n\t\tlog.Info(\"server peer config: %s has been updated\", fileName)\n\t\tif content, err = a.loadConfigFile(fileName); err == nil {\n\t\t\tif err = toml.Unmarshal(content, &peers); err == nil {\n\t\t\t\t_ = a.updateServerPeers(peers.Servers)\n\t\t\t}\n\t\t}\n\t})\n\n\treturn nil\n}\n\nfunc (a *UdpAC) updateBaseConfig(conf Config) (err error) {\n\tutils.CatchPanicThenRun(func() {\n\t\terr = errLoadConfig\n\t})\n\n\tif a.config == nil {\n\t\ta.config = &conf\n\t\ta.log.SetLogLevel(conf.LogLevel)\n\t\treturn err\n\t}\n\n\t// update\n\tif a.config.LogLevel != conf.LogLevel {\n\t\tlog.Info(\"set base log level to %d\", conf.LogLevel)\n\t\ta.log.SetLogLevel(conf.LogLevel)\n\t\ta.config.LogLevel = conf.LogLevel\n\t}\n\n\tif a.config.DefaultIp != conf.DefaultIp {\n\t\tlog.Info(\"set default ip mode to %s\", conf.DefaultIp)\n\t\ta.config.DefaultIp = conf.DefaultIp\n\t}\n\n\tif a.config.IpPassMode != conf.IpPassMode {\n\t\tlog.Info(\"set ip pass mode to %d\", conf.IpPassMode)\n\t\ta.config.IpPassMode = conf.IpPassMode\n\t}\n\n\tif a.config.DefaultCipherScheme != conf.DefaultCipherScheme {\n\t\tlog.Info(\"set default cipher scheme to %d\", conf.DefaultCipherScheme)\n\t\ta.config.DefaultCipherScheme = conf.DefaultCipherScheme\n\t}\n\n\treturn err\n}\n\nfunc (a *UdpAC) updateHttpConfig(httpConf HttpConfig) (err error) {\n\tutils.CatchPanicThenRun(func() {\n\t\terr = errLoadConfig\n\t})\n\n\t// update\n\tif httpConf.EnableHttp {\n\t\t// start http server\n\t\tif a.httpServer == nil || !a.httpServer.IsRunning() {\n\t\t\tif a.httpServer != nil {\n\t\t\t\t// stop old http server\n\t\t\t\tgo a.httpServer.Stop()\n\t\t\t}\n\t\t\ths := &HttpAC{}\n\t\t\ta.httpServer = hs\n\t\t\terr = hs.Start(a, &httpConf)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// stop http server\n\t\tif a.httpServer != nil && a.httpServer.IsRunning() {\n\t\t\tgo a.httpServer.Stop()\n\t\t\ta.httpServer = nil\n\t\t}\n\t}\n\n\ta.httpConfig = &httpConf\n\treturn err\n}\n\nfunc (a *UdpAC) updateServerPeers(peers []*core.UdpPeer) (err error) {\n\tutils.CatchPanicThenRun(func() {\n\t\terr = errLoadConfig\n\t})\n\n\tserverPeerMap := make(map[string]*core.UdpPeer)\n\tfor _, p := range peers {\n\t\tp.Type = core.NHP_SERVER\n\t\ta.device.AddPeer(p)\n\t\tserverPeerMap[p.PublicKeyBase64()] = p\n\t}\n\ta.config.Servers = peers\n\n\t// remove old peers from device\n\ta.serverPeerMutex.Lock()\n\tdefer a.serverPeerMutex.Unlock()\n\tfor pubKey := range a.serverPeerMap {\n\t\tif _, found := serverPeerMap[pubKey]; !found {\n\t\t\ta.device.RemovePeer(pubKey)\n\t\t}\n\t}\n\ta.serverPeerMap = serverPeerMap\n\n\treturn err\n}\nfunc (a *UdpAC) loadConfigFile(file string) (content []byte, err error) {\n\tutils.CatchPanicThenRun(func() {\n\t\terr = errLoadConfig\n\t})\n\tcontent, err = os.ReadFile(file)\n\tif err != nil {\n\t\tlog.Error(\"failed to read base config: %v\", err)\n\t}\n\treturn\n}\nfunc (a *UdpAC) initRemoteConn() error {\n\t// remote.toml\n\tfileName := filepath.Join(ExeDirPath, \"etc\", \"remote.toml\")\n\n\t_, e := os.Stat(fileName)\n\tif os.IsNotExist(e) {\n\t\t//remote.toml file not found,use local config\n\t\treturn nil\n\t}\n\n\tcontent, err := os.ReadFile(fileName)\n\tif err != nil {\n\t\tlog.Error(\"failed to read remote config: %v\", err)\n\t\treturn err\n\t}\n\n\tvar conf RemoteConfig\n\tif err = toml.Unmarshal(content, &conf); err != nil {\n\t\tlog.Error(\"failed to unmarshal remote config: %v\", err)\n\t\treturn err\n\t}\n\n\tif strings.EqualFold(conf.Provider, \"etcd\") {\n\t\tif len(conf.Endpoints) == 0 {\n\t\t\tlog.Error(\"remote config has no endpoints,open nhp server will startup with local configuration\")\n\t\t\treturn nil\n\t\t}\n\n\t\tif len(conf.Key) == 0 {\n\t\t\tlog.Error(\"remote config has no key,open nhp server will startup with local configuration\")\n\t\t\treturn nil\n\t\t}\n\n\t\ta.etcdConn = &etcd.EtcdConn{\n\t\t\tEndpoints: conf.Endpoints,\n\t\t\tUsername:  conf.Username,\n\t\t\tPassword:  conf.Password,\n\t\t\tKey:       conf.Key,\n\t\t}\n\n\t\terr = a.etcdConn.InitClient()\n\t\treturn err\n\t} else {\n\t\treturn errors.New(\"unknown remote provider\")\n\t}\n\n}\n\nfunc (a *UdpAC) loadRemoteConfig() error {\n\tvalue, err := a.etcdConn.GetValue()\n\tif err != nil {\n\t\treturn err\n\t}\n\t//base config has been loaded and no secondary loading is required\n\tif err = a.updateEtcdConfig(value, false); err != nil {\n\t\treturn err\n\t}\n\n\tgo a.etcdConn.WatchValue(func(val []byte) {\n\t\ta.remoteConfigUpdateMutex.Lock()\n\t\tdefer a.remoteConfigUpdateMutex.Unlock()\n\t\t_ = a.updateEtcdConfig(val, true)\n\t})\n\n\treturn nil\n}\n\nfunc (a *UdpAC) loadRemoteBaseConfig() error {\n\tvar acEtcdConfig ACEtcdConfig\n\tvalue, err := a.etcdConn.GetValue()\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err = toml.Unmarshal(value, &acEtcdConfig); err != nil {\n\t\tlog.Error(\"failed to unmarshal remote config: %v\", err)\n\t\treturn err\n\t}\n\n\terr = a.updateBaseConfig(acEtcdConfig.BaseConfig)\n\treturn err\n}\n\nfunc (a *UdpAC) updateEtcdConfig(content []byte, baseLoad bool) (err error) {\n\tvar acEtcdConfig ACEtcdConfig\n\tif err = toml.Unmarshal(content, &acEtcdConfig); err != nil {\n\t\tlog.Error(\"failed to unmarshal remote config: %v\", err)\n\t\treturn err\n\t}\n\n\tif baseLoad {\n\t\t_ = a.updateBaseConfig(acEtcdConfig.BaseConfig)\n\t}\n\n\t_ = a.updateHttpConfig(acEtcdConfig.HttpConfig)\n\t_ = a.updateServerPeers(acEtcdConfig.Servers)\n\treturn\n}\n\nfunc (a *UdpAC) IpPassMode() int {\n\treturn a.config.IpPassMode\n}\n\nfunc (a *UdpAC) StopConfigWatch() {\n\tif baseConfigWatch != nil {\n\t\tbaseConfigWatch.Close()\n\t}\n\tif httpConfigWatch != nil {\n\t\thttpConfigWatch.Close()\n\t}\n\tif serverPeerWatch != nil {\n\t\tserverPeerWatch.Close()\n\t}\n}\n"
  },
  {
    "path": "endpoints/ac/constants.go",
    "content": "package ac\n\nimport \"github.com/OpenNHP/opennhp/nhp/common\"\n\nconst (\n\tMaxConcurrentConnection      = 256\n\tDefaultConnectionTimeoutMs   = common.ServerSideConnectionTimeoutMs\n\tPacketQueueSizePerConnection = 256\n\n\tReportToServerInterval         = common.ReportToServerInterval\n\tMinialServerDiscoveryInterval  = common.MinimalServerDiscoveryInterval\n\tServerKeepaliveInterval        = common.ServerKeepaliveInterval\n\tServerDiscoveryRetryBeforeFail = common.ServerDiscoveryRetryBeforeFail\n\n\tTokenStoreRefreshInterval = common.TokenStoreRefreshInterval\n\tTempPortOpenTime          = 30\n\n\tIPSET_DEFAULT_NAME      = \"defaultset\"\n\tIPSET_DEFAULT_DOWN_NAME = \"defaultset_down\"\n)\n"
  },
  {
    "path": "endpoints/ac/ebpf/ebpf_other.go",
    "content": "//go:build !linux\n\npackage ebpf\n\nimport (\n\t// \"log\"\n\n\t\"fmt\"\n\n\t\"github.com/OpenNHP/opennhp/nhp/log\"\n)\n\nvar ErrEBPFSupportedOnlyOnLinux = fmt.Errorf(\"eBPF functionality is only supported on Linux, current platform is not Linux\")\nvar (\n\tDenyLogger *log.Logger\n\tAcLogger   *log.Logger\n)\n\nfunc EbpfEngineLoad(dirPath string, logLevel int, acId string) error {\n\tlog.Info(\"eBPF function must be compiled on Linux OS\")\n\treturn ErrEBPFSupportedOnlyOnLinux\n}\n\n// clean eBPF map file\nfunc CleanupBPFFiles() {\n\tlog.Info(\"ebpf func must be compile based linux os\")\n}\n"
  },
  {
    "path": "endpoints/ac/ebpf/ebpfegine.go",
    "content": "//go:build linux\n\npackage ebpf\n\nimport (\n\t// \"log\"\n\n\t\"encoding/binary\"\n\t\"fmt\"\n\t\"net\"\n\t\"os\"\n\t\"os/exec\"\n\t\"path/filepath\"\n\t\"regexp\"\n\t\"syscall\"\n\t\"time\"\n\n\tstdlog \"log\"\n\n\t\"github.com/cilium/ebpf\"\n\t\"github.com/cilium/ebpf/link\"\n\t\"github.com/cilium/ebpf/perf\"\n\t\"github.com/cilium/ebpf/rlimit\"\n\n\t\"github.com/OpenNHP/opennhp/nhp/log\"\n)\n\ntype bpfObjects struct {\n\tXdpProg       *ebpf.Program `ebpf:\"xdp_white_prog\"`\n\tWhitelist     *ebpf.Map     `ebpf:\"spp\"`\n\tIcmpwhitelist *ebpf.Map     `ebpf:\"icmpwhitelist\"`\n\tSdwhitelist   *ebpf.Map     `ebpf:\"sdwhitelist\"`\n\tSrcportlist   *ebpf.Map     `ebpf:\"src_port\"`\n\tPortlist      *ebpf.Map     `ebpf:\"port_list\"`\n\tProtocolport  *ebpf.Map     `ebpf:\"protocol_port\"`\n\tConntrack     *ebpf.Map     `ebpf:\"conn_track\"`\n\tEvents        *ebpf.Map     `ebpf:\"events\"`\n}\n\ntype tcBpfObjects struct {\n\tTcEgressProg *ebpf.Program `ebpf:\"tc_egress_prog\"`\n\tWhitelist    *ebpf.Map     `ebpf:\"spp\"`\n}\n\nvar (\n\tDenyLogger *log.Logger\n\tAcLogger   *log.Logger\n)\n\ntype Event struct {\n\tTimestamp  uint64 `ebpf:\"timestamp\"`\n\tAction     uint8  `ebpf:\"action\"`\n\tSrcIP      uint32 `ebpf:\"src_ip\"`\n\tDstIP      uint32 `ebpf:\"dst_ip\"`\n\tSrcPort    uint16 `ebpf:\"src_port\"`\n\tDstPort    uint16 `ebpf:\"dst_port\"`\n\tProtocol   uint8  `ebpf:\"protocol\"`\n\tPayloadLen uint16 `ebpf:\"payload_len\"`\n}\n\nvar xdpLink link.Link\nvar tcLink link.Link\nvar bootTime time.Time\n\nfunc init() {\n\tvar info syscall.Sysinfo_t\n\tif err := syscall.Sysinfo(&info); err != nil {\n\t\tpanic(\"Failed to get the system running time: \" + err.Error())\n\t}\n\n\tnow := time.Now()\n\tbootTime = now.Add(-time.Duration(info.Uptime) * time.Second)\n\tlog.Info(\"​​System boot time: %v\", bootTime)\n}\n\nfunc EbpfEngineLoad(dirPath string, logLevel int, acId string) error {\n\tCleanupBPFFiles()\n\tif err := rlimit.RemoveMemlock(); err != nil {\n\t\tlog.Error(\"Failed to remove memlock limit\")\n\t}\n\n\tconst ebpfenginename string = \"nhp_ebpf_xdp.o\"\n\tconst tcObjName string = \"tc_egress.o\"\n\t//ebpf nhp_ebpf_xdp.o save to etc/ after clang compile\n\tbpfDir := \"etc\"\n\tspecPath := filepath.Join(bpfDir, ebpfenginename)\n\ttcSpecPath := filepath.Join(bpfDir, tcObjName)\n\n\tif _, err := os.Stat(specPath); os.IsNotExist(err) {\n\t\tlog.Error(\"eBPF object file not found \")\n\t\treturn err\n\t}\n\tif _, err := os.Stat(tcSpecPath); os.IsNotExist(err) {\n\t\tlog.Error(\"tc eBPF object file not found \")\n\t\treturn err\n\t}\n\n\tspec, err := ebpf.LoadCollectionSpec(specPath)\n\tif err != nil {\n\t\tlog.Error(\"failed to load eBPF object\")\n\t\treturn err\n\t}\n\t// Load tc eBPF object\n\ttcSpec, err := ebpf.LoadCollectionSpec(tcSpecPath)\n\tif err != nil {\n\t\tlog.Error(\"failed to load tc eBPF object\")\n\t\treturn err\n\t}\n\n\tvar objs bpfObjects\n\tif err := spec.LoadAndAssign(&objs, &ebpf.CollectionOptions{\n\t\tMaps: ebpf.MapOptions{\n\t\t\tPinPath: \"/sys/fs/bpf/\", // automatically mounted to\n\t\t},\n\t}); err != nil {\n\t\tlog.Error(\"Failed to load and assign eBPF objects\")\n\t\treturn err\n\t}\n\n\tvar tcObjs tcBpfObjects\n\tif err := tcSpec.LoadAndAssign(&tcObjs, &ebpf.CollectionOptions{\n\t\tMaps: ebpf.MapOptions{\n\t\t\tPinPath: \"/sys/fs/bpf/\", // automatically mounted to\n\t\t},\n\t}); err != nil {\n\t\tlog.Error(\"Failed to load and assign tc eBPF objects\")\n\t\treturn err\n\t}\n\n\tif err := objs.XdpProg.Pin(\"/sys/fs/bpf/xdp_white_prog\"); err != nil {\n\t\tlog.Error(\"failed to pin XDP program xdp_white_prog to /sys/fs/bpf/\")\n\t\treturn err\n\t}\n\tif err := tcObjs.TcEgressProg.Pin(\"/sys/fs/bpf/tc_egress_prog\"); err != nil {\n\t\tlog.Error(\"failed to pin TC egress program tc_egress_prog to /sys/fs/bpf/\")\n\t\treturn err\n\t}\n\n\tifaceName, err := getDefaultRouteInterface()\n\tif err != nil {\n\t\tlog.Error(\"failed to get default route interface\")\n\t\treturn err\n\t}\n\tlog.Info(\"Default route interface: %s\\n\", ifaceName)\n\tiface, err := net.InterfaceByName(ifaceName)\n\tif err != nil {\n\t\tlog.Error(\"failed to find interface %s\", ifaceName)\n\t\tos.Exit(1)\n\t}\n\t//load ebpf nhp_ebpf_xdp.o to net interface which default route exit\n\txdpLink, err = link.AttachXDP(link.XDPOptions{\n\t\tProgram:   objs.XdpProg,\n\t\tInterface: iface.Index,\n\t\tFlags:     link.XDPGenericMode, // XDPGenericMode and XDPDriverMode\n\t})\n\tif err != nil {\n\t\tlog.Error(\"failed to attach XDP program to interface: %s\", ifaceName)\n\t\treturn err\n\t}\n\t//load tc eBPF tc_egress.o to net interface which default route exit\n\ttcLink, err = link.AttachTCX(link.TCXOptions{\n\t\tProgram:   tcObjs.TcEgressProg,\n\t\tInterface: iface.Index,\n\t\tAttach:    ebpf.AttachTCXEgress,\n\t})\n\tif err != nil {\n\t\tlog.Error(\"failed to attach TC egress program to interface: %s\", ifaceName)\n\t\treturn err\n\t}\n\n\t// Accessing the Perf Buffer Map named \"events\" defined in eBPF.\n\teventsMap := objs.Events\n\tif eventsMap == nil {\n\t\tlog.Error(\"failed to load 'events' map from eBPF object (nil)\")\n\t\treturn fmt.Errorf(\"'events' map not found\")\n\t}\n\n\tExeDirPath := dirPath\n\t//Set up the DENY logger\n\tDenyLogger = log.NewLoggerDefine(\n\t\t\"\",\n\t\tlogLevel,\n\t\tfilepath.Join(ExeDirPath, \"logs\"),\n\t\t\"nhp_deny\",\n\t)\n\tDenyLogger.SetFlags(stdlog.Lmsgprefix)\n\t// Set up the ACCEPT logger\n\tAcLogger = log.NewLoggerDefine(\n\t\t\"\",\n\t\tlogLevel,\n\t\tfilepath.Join(ExeDirPath, \"logs\"),\n\t\t\"nhp_accept\",\n\t)\n\tAcLogger.SetFlags(stdlog.Lmsgprefix)\n\t// Start a goroutine to monitor Perf Buffer events\n\tgo func() {\n\t\tperfReader, err := perf.NewReader(eventsMap, os.Getpagesize())\n\t\tif err != nil {\n\t\t\tlog.Error(\"failed to create perf reader: %v\", err)\n\t\t\treturn\n\t\t}\n\t\tdefer perfReader.Close()\n\n\t\tlog.Info(\"Start listening for eBPF events (PERF BUFFER)\")\n\n\t\tfor {\n\t\t\trecord, err := perfReader.Read()\n\t\t\tif err != nil {\n\t\t\t\tlog.Error(\"Error reading eBPF event: %v\", err)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\taction := record.RawSample[8]\n\t\t\tvar actionStr string\n\t\t\tswitch action {\n\t\t\tcase 0:\n\t\t\t\tactionStr = \"DENY\"\n\t\t\tcase 1:\n\t\t\t\tactionStr = \"ACCEPT\"\n\t\t\tdefault:\n\t\t\t\tactionStr = \"UNKNOWN\"\n\t\t\t}\n\t\t\ttimestamp := binary.LittleEndian.Uint64(record.RawSample[0:8])\n\t\t\tsrcIP := binary.BigEndian.Uint32(record.RawSample[9:13])\n\t\t\tdstIP := binary.BigEndian.Uint32(record.RawSample[13:17])\n\t\t\tsrcPort := binary.BigEndian.Uint16(record.RawSample[17:19])\n\t\t\tdstPort := binary.BigEndian.Uint16(record.RawSample[19:21])\n\t\t\tprotocol := record.RawSample[21]\n\t\t\tpayloadLen := binary.BigEndian.Uint16(record.RawSample[22:24])\n\n\t\t\tsrcIPStr := uint32ToIPv4(srcIP)\n\t\t\tdstIPStr := uint32ToIPv4(dstIP)\n\t\t\teventTime := bootTime.Add(time.Duration(timestamp))\n\t\t\tprotoName := protoToString(protocol)\n\n\t\t\tlogMsg := fmt.Sprintf(\"%s %s [NHP-%s] SRC=%s DST=%s LEN=%d PROTO=%s SPT=%d DPT=%d\",\n\t\t\t\teventTime.Format(\"15:04:05\"),\n\t\t\t\tacId,\n\t\t\t\tactionStr,\n\t\t\t\tsrcIPStr,\n\t\t\t\tdstIPStr,\n\t\t\t\tpayloadLen,\n\t\t\t\tprotoName,\n\t\t\t\tsrcPort,\n\t\t\t\tdstPort,\n\t\t\t)\n\n\t\t\tif action == 0 { // DENY\n\t\t\t\tDenyLogger.Info(\"%s\", logMsg)\n\t\t\t} else { // ACCEPT\n\t\t\t\tAcLogger.Info(\"%s\", logMsg)\n\t\t\t}\n\n\t\t}\n\t}()\n\n\treturn nil\n}\n\nfunc uint32ToIPv4(ip uint32) string {\n\treturn fmt.Sprintf(\"%d.%d.%d.%d\",\n\t\t(ip>>24)&0xff,\n\t\t(ip>>16)&0xff,\n\t\t(ip>>8)&0xff,\n\t\tip&0xff)\n}\n\nfunc ipUint32ToString(ip uint32) string {\n\treturn fmt.Sprintf(\"%d.%d.%d.%d\",\n\t\tip&0xFF,\n\t\t(ip>>8)&0xFF,\n\t\t(ip>>16)&0xFF,\n\t\t(ip>>24)&0xFF)\n}\n\nfunc getDefaultRouteInterface() (string, error) {\n\tcmd := exec.Command(\"ip\", \"route\")\n\toutput, err := cmd.Output()\n\tif err != nil {\n\t\tlog.Error(\"failed to get running ip route:\")\n\t\treturn \"\", err\n\t}\n\n\tre := regexp.MustCompile(`default via (\\S+) dev (\\S+)`)\n\tmatches := re.FindStringSubmatch(string(output))\n\tif len(matches) < 3 {\n\t\tlog.Error(\"failed to parse default route\")\n\t\treturn \"\", fmt.Errorf(\"failed to parse default route\")\n\t}\n\tinterfaceName := matches[2]\n\treturn interfaceName, nil\n}\n\n// clean eBPF map file\nfunc CleanupBPFFiles() {\n\tbpfFiles := []string{\n\t\t\"/sys/fs/bpf/xdp_white_prog\",\n\t\t\"/sys/fs/bpf/conn_track\",\n\t\t\"/sys/fs/bpf/icmpwhitelist\",\n\t\t\"/sys/fs/bpf/port_list\",\n\t\t\"/sys/fs/bpf/protocol_port\",\n\t\t\"/sys/fs/bpf/sdwhitelist\",\n\t\t\"/sys/fs/bpf/src_port\",\n\t\t\"/sys/fs/bpf/spp\",\n\t\t\"/sys/fs/bpf/tc_egress_prog\",\n\t}\n\n\tfor _, file := range bpfFiles {\n\t\tif err := os.Remove(file); err != nil {\n\t\t\tif !os.IsNotExist(err) {\n\t\t\t\tlog.Error(\"Failed to remove BPF file %s: %v\", file, err)\n\t\t\t}\n\t\t} else {\n\t\t\tlog.Info(\"Successfully removed BPF file: %s\", file)\n\t\t}\n\t}\n\tif xdpLink != nil {\n\t\txdpLink.Close()\n\t\tlog.Info(\"XDP link detached and closed\")\n\t}\n\tif tcLink != nil {\n\t\ttcLink.Close()\n\t\tlog.Info(\"TCX link detached and closed\")\n\t}\n}\n\nfunc protoToString(proto uint8) string {\n\tswitch proto {\n\tcase 6:\n\t\treturn \"TCP\"\n\tcase 17:\n\t\treturn \"UDP\"\n\tcase 1:\n\t\treturn \"ICMP\"\n\tcase 2:\n\t\treturn \"IGMP\"\n\tcase 41:\n\t\treturn \"IPv6\"\n\tcase 47:\n\t\treturn \"GRE\"\n\tcase 50:\n\t\treturn \"ESP\"\n\tcase 51:\n\t\treturn \"AH\"\n\tcase 88:\n\t\treturn \"EIGRP\"\n\tcase 89:\n\t\treturn \"OSPF\"\n\tcase 112:\n\t\treturn \"VRRP\"\n\tdefault:\n\t\treturn fmt.Sprintf(\"PROTO-%d\", proto)\n\t}\n}\n"
  },
  {
    "path": "endpoints/ac/httpac.go",
    "content": "package ac\n\nimport (\n\t\"context\"\n\t\"encoding/base64\"\n\t\"net\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\t\"sync/atomic\"\n\t\"time\"\n\n\t\"github.com/gin-gonic/gin\"\n\n\t\"github.com/OpenNHP/opennhp/nhp/common\"\n\t\"github.com/OpenNHP/opennhp/nhp/log\"\n)\n\ntype HttpAC struct {\n\tid         string\n\tua         *UdpAC\n\thttpServer *http.Server\n\tginEngine  *gin.Engine\n\tlistenAddr *net.TCPAddr\n\n\twg      sync.WaitGroup\n\trunning atomic.Bool\n\n\t// signals\n\tsignals struct {\n\t\tstop chan struct{}\n\t}\n}\n\n// Note HttpServer must be started after starting UdpAC, when log and config have been setup\nfunc (hs *HttpAC) Start(uac *UdpAC, hc *HttpConfig) error {\n\ths.id = time.Now().Format(\"2006-01-02 15:04:05\")\n\tlog.Info(\"==================================================\")\n\tlog.Info(\"===  HttpServer (%s) started  ===\", hs.id)\n\tlog.Info(\"==================================================\")\n\n\ths.ua = uac\n\n\tport := hc.HttpListenPort\n\tif hc.HttpListenPort == 0 {\n\t\tport = 62206\n\t}\n\t// only listen to localhost for security reason.\n\ths.listenAddr = &net.TCPAddr{\n\t\tIP:   net.IPv4(127, 0, 0, 1),\n\t\tPort: port,\n\t}\n\n\ths.signals.stop = make(chan struct{})\n\n\tgin.SetMode(gin.ReleaseMode)\n\ths.ginEngine = gin.New()\n\ths.ginEngine.Use(gin.LoggerWithWriter(uac.log.Writer()))\n\ths.ginEngine.Use(gin.Recovery())\n\n\ths.initRouter()\n\n\ths.httpServer = &http.Server{\n\t\tAddr:         hs.listenAddr.String(),\n\t\tHandler:      hs.ginEngine,\n\t\tReadTimeout:  4500 * time.Millisecond,\n\t\tWriteTimeout: 4000 * time.Millisecond,\n\t\tIdleTimeout:  5000 * time.Millisecond,\n\t}\n\n\ths.wg.Add(1)\n\tif hc.EnableTLS {\n\t\tcertFilePath := filepath.Join(ExeDirPath, hc.TLSCertFile)\n\t\tkeyFilePath := filepath.Join(ExeDirPath, hc.TLSKeyFile)\n\t\t_, err1 := os.Stat(certFilePath)\n\t\t_, err2 := os.Stat(keyFilePath)\n\t\tif err1 == nil && err2 == nil {\n\t\t\tgo func() {\n\t\t\t\tdefer hs.wg.Done()\n\t\t\t\tlog.Info(\"Listening https on %s\", hs.listenAddr.String())\n\t\t\t\tvar err = hs.httpServer.ListenAndServeTLS(certFilePath, keyFilePath)\n\t\t\t\tif err != nil && err != http.ErrServerClosed {\n\t\t\t\t\tlog.Error(\"https server close error: %v\\n\", err)\n\t\t\t\t\t//panic(err)\n\t\t\t\t}\n\t\t\t}()\n\n\t\t\treturn nil\n\t\t}\n\t}\n\n\tgo func() {\n\t\tdefer hs.wg.Done()\n\t\tlog.Info(\"Listening http on %s\", hs.listenAddr.String())\n\t\tvar err = hs.httpServer.ListenAndServe()\n\t\tif err != nil && err != http.ErrServerClosed {\n\t\t\tlog.Error(\"http server close error: %v\\n\", err)\n\t\t\t//panic(err)\n\t\t}\n\t}()\n\n\ths.running.Store(true)\n\treturn nil\n}\n\n// Stop stops the HttpServer by setting the running flag to false,\n// closing the stop channel, shutting down the underlying http server,\n// waiting for all goroutines to finish, and logging a message indicating\n// that the HttpServer has been stopped.\nfunc (hs *HttpAC) Stop() {\n\tif !hs.running.Load() {\n\t\t// already stopped, do nothing\n\t\treturn\n\t}\n\n\ths.running.Store(false)\n\tclose(hs.signals.stop)\n\tctx, cancel := context.WithTimeout(context.Background(), 5500*time.Millisecond)\n\t_ = hs.httpServer.Shutdown(ctx)\n\n\ths.wg.Wait()\n\tcancel()\n\tcancel = nil\n\tlog.Info(\"==================================================\")\n\tlog.Info(\"===  HttpServer (%s) stopped  ===\", hs.id)\n\tlog.Info(\"==================================================\")\n}\n\nfunc (hs *HttpAC) IsRunning() bool {\n\treturn hs.running.Load()\n}\n\n// init gin engine. Must be called at initialization\nfunc (ha *HttpAC) initRouter() {\n\tg := ha.ginEngine\n\n\trefreshGrp := g.Group(\"refresh\")\n\trefreshGrp.GET(\"/:token\", func(ctx *gin.Context) {\n\t\tvar err error\n\t\ttoken := ctx.Param(\"token\")\n\t\tlog.Info(\"get refresh request. token: %s, query: %v\", token, ctx.Request.URL.RawQuery)\n\n\t\tif len(token) == 0 {\n\t\t\terr = common.ErrUrlPathInvalid\n\t\t\tlog.Error(\"path error: %v\", err)\n\t\t\tctx.String(http.StatusOK, \"{\\\"errMsg\\\": \\\"path error: %v\\\"}\", err)\n\t\t\treturn\n\t\t}\n\n\t\tif token, err = url.QueryUnescape(token); err != nil {\n\t\t\terr = common.ErrUrlPathInvalid\n\t\t\tlog.Error(\"token error: %v\", err)\n\t\t\tctx.String(http.StatusOK, \"{\\\"errMsg\\\": \\\"token error: %v\\\"}\", err)\n\t\t\treturn\n\t\t}\n\n\t\treq := &common.HttpRefreshRequest{\n\t\t\tToken: token,\n\t\t\tSrcIp: ctx.Query(\"srcip\"),\n\t\t}\n\n\t\tha.HandleHttpRefreshOperations(ctx, req)\n\t})\n}\n\nfunc (ha *HttpAC) HandleHttpRefreshOperations(c *gin.Context, req *common.HttpRefreshRequest) {\n\tif len(req.SrcIp) == 0 {\n\t\tlog.Error(\"empty source ip\")\n\t\tc.String(http.StatusOK, \"{\\\"errMsg\\\": \\\"empty source ip\\\"}\")\n\t\treturn\n\t}\n\n\tnetIp := net.ParseIP(req.SrcIp)\n\tif netIp == nil {\n\t\tlog.Error(\"invalid source ip\")\n\t\tc.String(http.StatusOK, \"{\\\"errMsg\\\": \\\"invalid source ip\\\"}\")\n\t\treturn\n\t}\n\n\tbuf, err := base64.StdEncoding.DecodeString(req.Token)\n\tif err != nil || len(buf) != 32 {\n\t\tlog.Error(\"invalid token format\")\n\t\tc.String(http.StatusOK, \"{\\\"errMsg\\\": \\\"invalid token format\\\"}\")\n\t\treturn\n\t}\n\n\tentry := ha.ua.VerifyAccessToken(req.Token)\n\tif entry == nil {\n\t\tlog.Error(\"token verification failed\")\n\t\tc.String(http.StatusOK, \"{\\\"errMsg\\\": \\\"token verification failed\\\"}\")\n\t\treturn\n\t}\n\n\tvar found bool\n\tvar newSrcAddr *common.NetAddress\n\tfor _, addr := range entry.SrcAddrs {\n\t\tif addr.Ip == req.SrcIp {\n\t\t\tfound = true\n\t\t\tbreak\n\t\t}\n\t}\n\tif !found {\n\t\tnewSrcAddr = &common.NetAddress{\n\t\t\tIp:       req.SrcIp,\n\t\t\tPort:     entry.SrcAddrs[0].Port,\n\t\t\tProtocol: entry.SrcAddrs[0].Protocol,\n\t\t}\n\t\tentry.SrcAddrs = append(entry.SrcAddrs, newSrcAddr)\n\t}\n\n\t_, err = ha.ua.HandleAccessControl(entry.User, entry.SrcAddrs, entry.DstAddrs, entry.OpenTime, nil)\n\tif err != nil {\n\t\tlog.Error(\"HandleAccessControl failed: %v\", err)\n\t\tc.String(http.StatusOK, \"{\\\"errMsg\\\": \\\"%s\\\"}\", err)\n\t\treturn\n\t}\n\n\tc.JSON(http.StatusOK, entry)\n}\n"
  },
  {
    "path": "endpoints/ac/main/etc/config.toml",
    "content": "# NHP-AC base config\r\n# field with (-) does not support dynamic update\r\n\r\n# ACId (-): specify the id of this AC.\r\n# PrivateKeyBase64 (-): AC private key in base64 format.\r\n# DefaultCipherScheme: 0: curve25519, 1: gmsm.\r\n# MIGRATION: Values changed in v2.x. If upgrading: old 0(gmsm)->new 1, old 1(curve)->new 0.\r\n# IpPassMode:\r\n#  0: (default) immediately pass traffic with the agent source ip,\r\n#  1: process pre-access to determine actual agent source ip then pass.\r\n# FilterMode: \r\n#  0: iptables (default)\r\n#  1: ebpf xdp (requires Linux kernel >= 5.6 and XDP-capable network interface)\r\n# LogLevel: 0: silent, 1: error, 2: info, 3: audit, 4: debug, 5: trace.\r\n# AuthServiceId (-): id for authentication and authorization service provider this AC belongs to.\r\n# ResourceIds (-): resource group ids that this AC protects.\r\nACId = \"testAC-346\"\r\nDefaultIp = \"172.16.3.46\"\r\nPrivateKeyBase64 = \"6++hr1lJkvbCVBCbTm4OpXusFJI0wmDi/RR3WpTz3tk=\"\r\nDefaultCipherScheme = 0\r\nIpPassMode = 0\r\nLogLevel = 4\r\nAuthServiceId = \"example\"\r\nResourceIds = [\"demo\"]\r\nFilterMode = 0"
  },
  {
    "path": "endpoints/ac/main/etc/http.toml",
    "content": "# http server config\r\n\r\n# EnableHttp: true: turn on http server, false: shutdown http server.\r\n# EnableTLS: whether to use TLS certificates for hosting https server.\r\n# TLSCertFile: certificate file path.\r\n# TLSKeyFile: key file path.\r\n# to update http changes, you need to restart the http server by changing \"EnableHttp\" to \"false\" and then switch it back to \"true\".\r\nEnableHttp = true\r\nEnableTLS = true\r\nHttpListenPort = 62206\r\nTLSCertFile = \"cert/cert.pem\"\r\nTLSKeyFile = \"cert/cert.key\"\r\n"
  },
  {
    "path": "endpoints/ac/main/etc/remote.toml",
    "content": "# NHP-AC remote config\n# field with (-) does not support dynamic update\n# If the file remote.toml exists, NHP-AC will obtain remote configuration information through the etcd client.\n\n# Provider: Remote configuration provider type. Currently only etcd supported\n# Endpoints: ETCD service access address.\n# Key: NHP-AC obtain the configuration information through this key.\n# Username: The account of the NHP-Server accessing ETCD.\n# Password: The password for NHP-Server to access ETCD.\n\nProvider = \"etcd\"\nEndpoints = [\"172.16.3.53:2379\"]\nKey = \"openac-1\"\n"
  },
  {
    "path": "endpoints/ac/main/etc/server.toml",
    "content": "# list the server peers for the AC under [[Servers]] table\r\n\r\n# Hostname: the domain of the server peer. If specified, it overrides the \"Ip\" field with its first resolved address.\r\n# Ip: specify the ip address of the server peer\r\n# Port: specify the port number of this server peer is listening\r\n# PubKeyBase64: public key of the server peer in base64 format\r\n# ExpireTime (epoch timestamp in seconds): peer key validation will fail when it expires.\r\n[[Servers]]\r\nHostname = \"\"\r\nIp = \"192.168.80.35\"\r\nPort = 62206\r\nPubKeyBase64 = \"WqJxe+Z4+wLen3VRgZx6YnbjvJFmptz99zkONCt/7gc=\"\r\nExpireTime = 1924991999\r\n\r\n"
  },
  {
    "path": "endpoints/ac/main/main.go",
    "content": "package main\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"os\"\n\t\"os/signal\"\n\t\"path/filepath\"\n\t\"runtime\"\n\t\"syscall\"\n\t\"time\"\n\n\t\"github.com/urfave/cli/v2\"\n\n\t\"github.com/OpenNHP/opennhp/endpoints/ac\"\n\t\"github.com/OpenNHP/opennhp/endpoints/ac/ebpf\"\n\t\"github.com/OpenNHP/opennhp/nhp/core\"\n\t\"github.com/OpenNHP/opennhp/nhp/version\"\n)\n\n// ANSI color codes\nconst (\n\tcolorReset  = \"\\033[0m\"\n\tcolorCyan   = \"\\033[36m\"\n\tcolorGreen  = \"\\033[32m\"\n\tcolorYellow = \"\\033[33m\"\n\tcolorBlue   = \"\\033[34m\"\n\tcolorPurple = \"\\033[35m\"\n\tcolorBold   = \"\\033[1m\"\n\tcolorDim    = \"\\033[2m\"\n)\n\nfunc main() {\n\tapp := cli.NewApp()\n\tapp.Name = \"nhp-ac\"\n\tapp.Usage = \"ac entity for NHP protocol\"\n\tapp.Version = version.Version\n\n\trunCmd := &cli.Command{\n\t\tName:  \"run\",\n\t\tUsage: \"create and run ac process for NHP protocol\",\n\t\tAction: func(c *cli.Context) error {\n\t\t\treturn runApp()\n\t\t},\n\t}\n\n\tkeygenCmd := &cli.Command{\n\t\tName:  \"keygen\",\n\t\tUsage: \"generate key pairs for NHP devices\",\n\t\tFlags: []cli.Flag{\n\t\t\t&cli.BoolFlag{Name: \"curve\", Value: false, DisableDefaultText: true, Usage: \"generate curve25519 keys\"},\n\t\t\t&cli.BoolFlag{Name: \"sm2\", Value: false, DisableDefaultText: true, Usage: \"generate sm2 keys (default)\"},\n\t\t\t&cli.BoolFlag{Name: \"json\", Value: false, DisableDefaultText: true, Usage: \"output in JSON format\"},\n\t\t},\n\t\tAction: func(c *cli.Context) error {\n\t\t\tvar e core.Ecdh\n\t\t\teccType := core.ECC_SM2\n\t\t\tif c.Bool(\"curve\") {\n\t\t\t\teccType = core.ECC_CURVE25519\n\t\t\t}\n\t\t\te = core.NewECDH(eccType)\n\t\t\tpub := e.PublicKeyBase64()\n\t\t\tpriv := e.PrivateKeyBase64()\n\t\t\tif c.Bool(\"json\") {\n\t\t\t\toutput := map[string]string{\n\t\t\t\t\t\"privateKey\": priv,\n\t\t\t\t\t\"publicKey\":  pub,\n\t\t\t\t}\n\t\t\t\tjson.NewEncoder(os.Stdout).Encode(output)\n\t\t\t} else {\n\t\t\t\tfmt.Println(\"Private key: \", priv)\n\t\t\t\tfmt.Println(\"Public key: \", pub)\n\t\t\t}\n\t\t\treturn nil\n\t\t},\n\t}\n\n\tapp.Commands = []*cli.Command{\n\t\trunCmd,\n\t\tkeygenCmd,\n\t}\n\tif err := app.Run(os.Args); err != nil {\n\t\tpanic(err)\n\t}\n}\n\nfunc printBanner() {\n\tbanner := `\n` + colorCyan + colorBold + `\n   ____                   _   _ _   _ ____\n  / __ \\                 | \\ | | | | |  _ \\\n | |  | |_ __   ___ _ __ |  \\| | |_| | |_) |\n | |  | | '_ \\ / _ \\ '_ \\| . ' |  _  |  __/\n | |__| | |_) |  __/ | | | |\\  | | | | |\n  \\____/| .__/ \\___|_| |_|_| \\_|_| |_|_|\n        | |\n        |_|  ` + colorReset + colorDim + `Network-infrastructure Hiding Protocol` + colorReset + `\n` + colorPurple + `\n  ⭐ GitHub: ` + colorReset + `https://github.com/OpenNHP/opennhp\n` + colorYellow + `  💡 Star us & Join the community! Contributors welcome!` + colorReset + `\n\n`\n\tfmt.Print(banner)\n}\n\nfunc getFilterModeName(mode int) string {\n\tswitch mode {\n\tcase ac.FilterMode_IPTABLES:\n\t\treturn \"IPTables\"\n\tcase ac.FilterMode_EBPFXDP:\n\t\treturn \"eBPF/XDP\"\n\tdefault:\n\t\treturn \"Unknown\"\n\t}\n}\n\nfunc printACInfo(cfg *ac.Config) {\n\t// Safely get commit ID (first 12 chars or full if shorter)\n\tcommitId := version.CommitId\n\tif len(commitId) > 12 {\n\t\tcommitId = commitId[:12]\n\t}\n\n\tfmt.Println(colorGreen + \"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\" + colorReset)\n\tfmt.Println()\n\tfmt.Printf(\"  %s🛡️  NHP-AC%s (Access Controller) is running!\\n\", colorBold, colorReset)\n\tfmt.Println()\n\tfmt.Printf(\"  %sVersion:%s    %s\\n\", colorYellow, colorReset, version.Version)\n\tfmt.Printf(\"  %sCommit:%s     %s\\n\", colorYellow, colorReset, commitId)\n\tfmt.Printf(\"  %sBuild:%s      %s\\n\", colorYellow, colorReset, version.BuildTime)\n\tfmt.Printf(\"  %sPlatform:%s   %s/%s\\n\", colorYellow, colorReset, runtime.GOOS, runtime.GOARCH)\n\tfmt.Println()\n\tfmt.Printf(\"  %sFilter:%s     %s%s%s\\n\", colorBlue, colorReset, colorCyan, getFilterModeName(cfg.FilterMode), colorReset)\n\tif cfg.ACId != \"\" {\n\t\tfmt.Printf(\"  %sAC ID:%s      %s\\n\", colorBlue, colorReset, cfg.ACId)\n\t}\n\tfmt.Printf(\"  %sStarted:%s    %s\\n\", colorBlue, colorReset, time.Now().Format(\"2006-01-02 15:04:05\"))\n\tfmt.Println()\n\tfmt.Println(colorGreen + \"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\" + colorReset)\n\tfmt.Println()\n\tfmt.Printf(\"  %sPress Ctrl+C to stop the access controller%s\\n\", colorDim, colorReset)\n\tfmt.Println()\n}\n\nfunc runApp() error {\n\texeFilePath, err := os.Executable()\n\tif err != nil {\n\t\treturn err\n\t}\n\texeDirPath := filepath.Dir(exeFilePath)\n\n\t// Print banner before starting\n\tprintBanner()\n\n\td := &ac.UdpAC{}\n\terr = d.Start(exeDirPath, 4)\n\tif err != nil {\n\t\tfmt.Printf(\"\\n  %s❌ Failed to start AC:%s %v\\n\\n\", colorYellow, colorReset, err)\n\t\treturn err\n\t}\n\tcfg := d.GetConfig()\n\n\t// Print AC info after successful start\n\tprintACInfo(cfg)\n\n\t// react to terminate signals\n\ttermCh := make(chan os.Signal, 1)\n\tsignal.Notify(termCh, syscall.SIGTERM, os.Interrupt, syscall.SIGABRT)\n\tif cfg.FilterMode == ac.FilterMode_EBPFXDP {\n\t\tdefer ebpf.CleanupBPFFiles()\n\t}\n\t// block until terminated\n\t<-termCh\n\n\tfmt.Printf(\"\\n  %s🛑 Shutting down access controller...%s\\n\", colorYellow, colorReset)\n\td.Stop()\n\tfmt.Printf(\"  %s✅ Access controller stopped gracefully%s\\n\\n\", colorGreen, colorReset)\n\n\treturn nil\n}\n"
  },
  {
    "path": "endpoints/ac/msghandler.go",
    "content": "package ac\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"net\"\n\t\"strconv\"\n\t\"time\"\n\n\t\"github.com/OpenNHP/opennhp/nhp/common\"\n\t\"github.com/OpenNHP/opennhp/nhp/core\"\n\t\"github.com/OpenNHP/opennhp/nhp/log\"\n\t\"github.com/OpenNHP/opennhp/nhp/utils\"\n\t\"github.com/OpenNHP/opennhp/nhp/utils/ebpf\"\n)\n\n// IP pass mode\nconst (\n\tPASS_KNOCK_IP = iota\n\tPASS_KNOCKIP_WITH_RANGE\n\tPASS_PRE_ACCESS_IP\n)\n\nfunc (a *UdpAC) HandleUdpACOperations(ppd *core.PacketParserData) (err error) {\n\tdefer a.wg.Done()\n\n\tacId := a.config.ACId\n\tdopMsg := &common.ServerACOpsMsg{}\n\tartMsg := &common.ACOpsResultMsg{}\n\ttransactionId := ppd.SenderTrxId\n\n\terr = json.Unmarshal(ppd.BodyMessage, dopMsg)\n\tif err != nil {\n\t\tlog.Error(\"ac(%s#%d)[HandleUdpACOperations] failed to parse %s message: %v\", acId, transactionId, core.HeaderTypeToString(ppd.HeaderType), err)\n\t\tartMsg.ErrCode = common.ErrJsonParseFailed.ErrorCode()\n\t\tartMsg.ErrMsg = err.Error()\n\t\treturn\n\t}\n\n\tsrcAddrs := dopMsg.SourceAddrs\n\tdstAddrs := dopMsg.DestinationAddrs\n\topenTimeSec := int(dopMsg.OpenTime)\n\tagentUser := &common.AgentUser{\n\t\tUserId:         dopMsg.UserId,\n\t\tDeviceId:       dopMsg.DeviceId,\n\t\tOrganizationId: dopMsg.OrganizationId,\n\t\tAuthServiceId:  dopMsg.AuthServiceId,\n\t}\n\tartMsg, err = a.HandleAccessControl(agentUser, srcAddrs, dstAddrs, openTimeSec, artMsg)\n\tif err != nil {\n\t\tlog.Error(\"ac(%s#%d)[HandleUdpACOperations] HandleAccessControl failed, err: %v\", acId, transactionId, err)\n\t}\n\n\t// generate ac token and save user and access information\n\tentry := &AccessEntry{\n\t\tUser:     agentUser,\n\t\tSrcAddrs: srcAddrs,\n\t\tDstAddrs: dstAddrs,\n\t\tOpenTime: openTimeSec,\n\t}\n\tartMsg.ACToken = a.GenerateAccessToken(entry)\n\t//log.Info(\"generate knock token: %s\", artMsg.ACToken)\n\n\t// send ac result\n\tartBytes, _ := json.Marshal(artMsg)\n\tmd := &core.MsgData{\n\t\tHeaderType:     core.NHP_ART,\n\t\tTransactionId:  transactionId,\n\t\tCompress:       true,\n\t\tPrevParserData: ppd,\n\t\tMessage:        artBytes,\n\t}\n\t//log.Info(\"ART result: %s\", string(artBytes))\n\n\t// forward to a specific transaction\n\ttransaction := ppd.ConnData.FindRemoteTransaction(transactionId)\n\tif transaction == nil {\n\t\tlog.Error(\"ac(%s#%d)[HandleUdpACOperations] transaction is not available\", acId, transactionId)\n\t\terr = common.ErrTransactionIdNotFound\n\t\treturn err\n\t}\n\n\ttransaction.NextMsgCh <- md\n\n\treturn err\n}\n\nfunc (a *UdpAC) HandleAccessControl(au *common.AgentUser, srcAddrs []*common.NetAddress, dstAddrs []*common.NetAddress, openTimeSec int, artMsgIn *common.ACOpsResultMsg) (artMsg *common.ACOpsResultMsg, err error) {\n\tif artMsgIn == nil {\n\t\tartMsg = &common.ACOpsResultMsg{}\n\t} else {\n\t\tartMsg = artMsgIn\n\t}\n\t// process ac operation\n\ttempOpenTimeSec := TempPortOpenTime\n\t// 1 sec timeout means exit defaultset access, so exit tempset too\n\tif openTimeSec == 1 {\n\t\ttempOpenTimeSec = 1\n\t}\n\n\t// check empty src address\n\tif len(srcAddrs) == 0 || len(dstAddrs) == 0 {\n\t\tlog.Error(\"[HandleAccessControl] no source or destination address specified\")\n\t\terr = common.ErrACEmptyPassAddress\n\t\tartMsg.ErrCode = common.ErrACEmptyPassAddress.ErrorCode()\n\t\tartMsg.ErrMsg = err.Error()\n\t\treturn\n\t}\n\n\t// ac ipset operations\n\tif a.config.FilterMode == FilterMode_IPTABLES {\n\t\tif a.ipset == nil {\n\t\t\tlog.Error(\"[HandleAccessControl] ipset is nil\")\n\t\t\terr = common.ErrACIPSetNotFound\n\t\t\tartMsg.ErrCode = common.ErrACIPSetNotFound.ErrorCode()\n\t\t\tartMsg.ErrMsg = err.Error()\n\t\t\treturn\n\t\t}\n\t}\n\n\t// use ac default ip to override empty destination ip\n\tif len(a.config.DefaultIp) > 0 {\n\t\tfor _, addr := range dstAddrs {\n\t\t\tif len(addr.Ip) == 0 {\n\t\t\t\taddr.Ip = a.config.DefaultIp\n\t\t\t}\n\t\t}\n\t}\n\n\tipPassMode := a.IpPassMode()\n\tswitch ipPassMode {\n\t// pass the knock ip immediately\n\tcase PASS_KNOCKIP_WITH_RANGE:\n\t\tfallthrough\n\tcase PASS_KNOCK_IP:\n\t\tfallthrough\n\tdefault:\n\t\tfor _, srcAddr := range srcAddrs {\n\t\t\tvar ipNet *net.IPNet\n\n\t\t\t// Detect IP type using proper parsing instead of string matching\n\t\t\tipType, ipErr := utils.DetectIPType(srcAddr.Ip)\n\t\t\tif ipErr != nil {\n\t\t\t\tlog.Error(\"[HandleAccessControl] invalid source IP: %s, error: %v\", srcAddr.Ip, ipErr)\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// Use appropriate CIDR mask based on IP type and pass mode\n\t\t\trangeMode := ipPassMode == PASS_KNOCKIP_WITH_RANGE\n\t\t\tcidrMask := utils.GetCIDRMask(ipType, rangeMode)\n\t\t\t_, ipNet, _ = net.ParseCIDR(srcAddr.Ip + cidrMask)\n\t\t\tlog.Debug(\"src ip is %s, net range is %s\", srcAddr, ipNet.String())\n\n\t\t\tfor _, dstAddr := range dstAddrs {\n\t\t\t\t// for tcp\n\t\t\t\tif len(dstAddr.Protocol) == 0 || dstAddr.Protocol == \"tcp\" || dstAddr.Protocol == \"any\" {\n\t\t\t\t\tipHashStr := fmt.Sprintf(\"%s,%d,%s\", srcAddr.Ip, dstAddr.Port, dstAddr.Ip)\n\t\t\t\t\tif dstAddr.Port == 0 {\n\t\t\t\t\t\tipHashStr = fmt.Sprintf(\"%s,1-65535,%s\", srcAddr.Ip, dstAddr.Ip)\n\t\t\t\t\t}\n\n\t\t\t\t\tswitch a.config.FilterMode {\n\t\t\t\t\tcase FilterMode_IPTABLES:\n\t\t\t\t\t\t_, err = a.ipset.Add(ipType, 1, openTimeSec, ipHashStr)\n\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\tlog.Error(\"[HandleAccessControl] add ipset %s error: %v\", ipHashStr, err)\n\t\t\t\t\t\t\terr = common.ErrACIPSetOperationFailed\n\t\t\t\t\t\t\tartMsg.ErrCode = common.ErrACIPSetOperationFailed.ErrorCode()\n\t\t\t\t\t\t\tartMsg.ErrMsg = err.Error()\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\t\t\t\t\t//ebpf knock\n\t\t\t\t\tcase FilterMode_EBPFXDP:\n\t\t\t\t\t\tif len(dstAddr.Protocol) == 0 || dstAddr.Protocol == \"any\" {\n\t\t\t\t\t\t\tebpfHashStr := ebpf.EbpfRuleParams{\n\t\t\t\t\t\t\t\tSrcIP: srcAddr.Ip,\n\t\t\t\t\t\t\t\tDstIP: dstAddr.Ip,\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\terr = ebpf.EbpfRuleAdd(2, ebpfHashStr, openTimeSec)\n\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\tlog.Error(\"[EbpfRuleAdd] add ebpf src: %s dst: %s, error: %v\", ebpfHashStr.SrcIP, ebpfHashStr.DstIP, err)\n\t\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif dstAddr.Protocol == \"tcp\" {\n\t\t\t\t\t\t\tebpfHashStr := ebpf.EbpfRuleParams{\n\t\t\t\t\t\t\t\tSrcIP:    srcAddr.Ip,\n\t\t\t\t\t\t\t\tDstIP:    dstAddr.Ip,\n\t\t\t\t\t\t\t\tDstPort:  dstAddr.Port,\n\t\t\t\t\t\t\t\tProtocol: dstAddr.Protocol,\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\terr = ebpf.EbpfRuleAdd(1, ebpfHashStr, openTimeSec)\n\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\tlog.Error(\"[EbpfRuleAdd] add ebpf tcp failed src: %s dst: %s, error: %v, protocol: %s, dstport: %d\", ebpfHashStr.SrcIP, ebpfHashStr.DstIP, err, ebpfHashStr.Protocol, ebpfHashStr.DstPort)\n\t\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tlog.Error(\"[HandleAccessControl] unsupported FilterMode: %d (expected 0=IPTABLES or 1=EBPFXDP)\", a.config.FilterMode)\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// for udp\n\t\t\t\tif len(dstAddr.Protocol) == 0 || dstAddr.Protocol == \"udp\" || dstAddr.Protocol == \"any\" {\n\t\t\t\t\tipHashStr := fmt.Sprintf(\"%s,udp:%d,%s\", srcAddr.Ip, dstAddr.Port, dstAddr.Ip)\n\t\t\t\t\tif dstAddr.Port == 0 {\n\t\t\t\t\t\tipHashStr = fmt.Sprintf(\"%s,udp:1-65535,%s\", srcAddr.Ip, dstAddr.Ip)\n\t\t\t\t\t}\n\n\t\t\t\t\tswitch a.config.FilterMode {\n\t\t\t\t\tcase FilterMode_IPTABLES:\n\t\t\t\t\t\t_, err = a.ipset.Add(ipType, 1, openTimeSec, ipHashStr)\n\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\tlog.Error(\"[HandleAccessControl] add ipset %s error: %v\", ipHashStr, err)\n\t\t\t\t\t\t\terr = common.ErrACIPSetOperationFailed\n\t\t\t\t\t\t\tartMsg.ErrCode = common.ErrACIPSetOperationFailed.ErrorCode()\n\t\t\t\t\t\t\tartMsg.ErrMsg = err.Error()\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\t\t\t\t\tcase FilterMode_EBPFXDP:\n\t\t\t\t\t\tif len(dstAddr.Protocol) == 0 || dstAddr.Protocol == \"any\" {\n\t\t\t\t\t\t\tebpfHashStr := ebpf.EbpfRuleParams{\n\t\t\t\t\t\t\t\tSrcIP: srcAddr.Ip,\n\t\t\t\t\t\t\t\tDstIP: dstAddr.Ip,\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\terr = ebpf.EbpfRuleAdd(2, ebpfHashStr, openTimeSec)\n\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\tlog.Error(\"[EbpfRuleAdd] add ebpf src: %s dst: %s, error: %v\", ebpfHashStr.SrcIP, ebpfHashStr.DstIP, err)\n\t\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif dstAddr.Protocol == \"udp\" {\n\t\t\t\t\t\t\tebpfHashStr := ebpf.EbpfRuleParams{\n\t\t\t\t\t\t\t\tSrcIP:    srcAddr.Ip,\n\t\t\t\t\t\t\t\tDstIP:    dstAddr.Ip,\n\t\t\t\t\t\t\t\tDstPort:  dstAddr.Port,\n\t\t\t\t\t\t\t\tProtocol: dstAddr.Protocol,\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\terr = ebpf.EbpfRuleAdd(1, ebpfHashStr, openTimeSec)\n\n\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\tlog.Error(\"[EbpfRuleAdd] add ebpf udp failed src: %s dst: %s, error: %v, protocol: %s, dstport: %d\", ebpfHashStr.SrcIP, ebpfHashStr.DstIP, err, ebpfHashStr.Protocol, ebpfHashStr.DstPort)\n\t\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tlog.Error(\"[HandleAccessControl] unsupported FilterMode: %d (expected 0=IPTABLES or 1=EBPFXDP)\", a.config.FilterMode)\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// for icmp ping\n\t\t\t\tif dstAddr.Port == 0 && (len(dstAddr.Protocol) == 0 || dstAddr.Protocol == \"any\") {\n\t\t\t\t\tfor _, dstAddr := range dstAddrs {\n\t\t\t\t\t\t// ICMPv4 Echo Request = type 8, ICMPv6 Echo Request = type 128\n\t\t\t\t\t\ticmpType := \"icmp:8/0\"\n\t\t\t\t\t\tif ipType == utils.IPV6 {\n\t\t\t\t\t\t\ticmpType = \"icmpv6:128/0\"\n\t\t\t\t\t\t}\n\t\t\t\t\t\tipHashStr := fmt.Sprintf(\"%s,%s,%s\", srcAddr.Ip, icmpType, dstAddr.Ip)\n\t\t\t\t\t\tswitch a.config.FilterMode {\n\t\t\t\t\t\tcase FilterMode_IPTABLES:\n\t\t\t\t\t\t\t_, err = a.ipset.Add(ipType, 1, openTimeSec, ipHashStr)\n\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\tlog.Error(\"[HandleAccessControl] add ipset %s error: %v\", ipHashStr, err)\n\t\t\t\t\t\t\t\terr = common.ErrACIPSetOperationFailed\n\t\t\t\t\t\t\t\tartMsg.ErrCode = common.ErrACIPSetOperationFailed.ErrorCode()\n\t\t\t\t\t\t\t\tartMsg.ErrMsg = err.Error()\n\t\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\tcase FilterMode_EBPFXDP:\n\t\t\t\t\t\t\tebpfHashStr := ebpf.EbpfRuleParams{\n\t\t\t\t\t\t\t\tSrcIP: srcAddr.Ip,\n\t\t\t\t\t\t\t\tDstIP: dstAddr.Ip,\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\terr = ebpf.EbpfRuleAdd(3, ebpfHashStr, openTimeSec)\n\t\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\t\tlog.Error(\"[EbpfRuleAdd] add ebpf src: %s dst: %s, error: %v\", ebpfHashStr.SrcIP, ebpfHashStr.DstIP, err)\n\t\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tlog.Error(\"[HandleAccessControl] unsupported FilterMode: %d (expected 0=IPTABLES or 1=EBPFXDP)\", a.config.FilterMode)\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// add tempset for the adjacent 128 (25bit netmask ipv4, 121bit netmask ipv6) addresses derived from the target IP address\n\t\t\t\tif ipPassMode == PASS_KNOCKIP_WITH_RANGE && ipNet != nil {\n\t\t\t\t\tnetStr := ipNet.String()\n\t\t\t\t\tswitch a.config.FilterMode {\n\t\t\t\t\tcase FilterMode_IPTABLES:\n\t\t\t\t\t\tif len(dstAddr.Protocol) == 0 || dstAddr.Protocol == \"tcp\" || dstAddr.Protocol == \"any\" {\n\t\t\t\t\t\t\tnetHashStr := fmt.Sprintf(\"%s,%d\", netStr, dstAddr.Port)\n\t\t\t\t\t\t\tif dstAddr.Port == 0 {\n\t\t\t\t\t\t\t\tnetHashStr = fmt.Sprintf(\"%s,1-65535\", netStr)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t_, addErr := a.ipset.Add(ipType, 4, tempOpenTimeSec, netHashStr)\n\t\t\t\t\t\t\tif addErr != nil {\n\t\t\t\t\t\t\t\tlog.Warning(\"[HandleAccessControl] failed to add tempset entry %s: %v\", netHashStr, addErr)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif len(dstAddr.Protocol) == 0 || dstAddr.Protocol == \"udp\" || dstAddr.Protocol == \"any\" {\n\t\t\t\t\t\t\tnetHashStr := fmt.Sprintf(\"%s,udp:%d\", netStr, dstAddr.Port)\n\t\t\t\t\t\t\tif dstAddr.Port == 0 {\n\t\t\t\t\t\t\t\tnetHashStr = fmt.Sprintf(\"%s,udp:1-65535\", netStr)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t_, addErr := a.ipset.Add(ipType, 4, tempOpenTimeSec, netHashStr)\n\t\t\t\t\t\t\tif addErr != nil {\n\t\t\t\t\t\t\t\tlog.Warning(\"[HandleAccessControl] failed to add tempset entry %s: %v\", netHashStr, addErr)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif dstAddr.Port == 0 && (len(dstAddr.Protocol) == 0 || dstAddr.Protocol == \"any\") {\n\t\t\t\t\t\t\t// ICMPv4 Echo Request = type 8, ICMPv6 Echo Request = type 128\n\t\t\t\t\t\t\ticmpType := \"icmp:8/0\"\n\t\t\t\t\t\t\tif ipType == utils.IPV6 {\n\t\t\t\t\t\t\t\ticmpType = \"icmpv6:128/0\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tnetHashStr := fmt.Sprintf(\"%s,%s\", netStr, icmpType)\n\t\t\t\t\t\t\t_, addErr := a.ipset.Add(ipType, 4, tempOpenTimeSec, netHashStr)\n\t\t\t\t\t\t\tif addErr != nil {\n\t\t\t\t\t\t\t\tlog.Warning(\"[HandleAccessControl] failed to add tempset entry %s: %v\", netHashStr, addErr)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\tcase FilterMode_EBPFXDP:\n\t\t\t\t\t\tcidrIP, ipnet, cidrErr := net.ParseCIDR(netStr)\n\t\t\t\t\t\tif cidrErr != nil {\n\t\t\t\t\t\t\tlog.Error(\"[HandleAccessControl] failed to parse CIDR %s: %v\", netStr, cidrErr)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif len(dstAddr.Protocol) == 0 || dstAddr.Protocol == \"tcp\" || dstAddr.Protocol == \"any\" {\n\t\t\t\t\t\t\tfor iterIP := cidrIP.Mask(ipnet.Mask); ipnet.Contains(iterIP); incrementIP(iterIP) {\n\t\t\t\t\t\t\t\tsrcIpStr := iterIP.String()\n\t\t\t\t\t\t\t\tif dstAddr.Port != 0 {\n\t\t\t\t\t\t\t\t\tebpfHashStr := ebpf.EbpfRuleParams{\n\t\t\t\t\t\t\t\t\t\tSrcIP:   srcIpStr,\n\t\t\t\t\t\t\t\t\t\tDstPort: dstAddr.Port,\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\taddErr := ebpf.EbpfRuleAdd(4, ebpfHashStr, tempOpenTimeSec)\n\t\t\t\t\t\t\t\t\tif addErr != nil {\n\t\t\t\t\t\t\t\t\t\tlog.Error(\"[EbpfRuleAdd] add ebpf for tcp dst port src: %s, dstport: %d, error: %v\", ebpfHashStr.SrcIP, ebpfHashStr.DstPort, addErr)\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tebpfHashStr := ebpf.EbpfRuleParams{\n\t\t\t\t\t\t\t\t\t\tSrcIP:        srcIpStr,\n\t\t\t\t\t\t\t\t\t\tDstPortStart: 1,\n\t\t\t\t\t\t\t\t\t\tDstPortEnd:   65535,\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\taddErr := ebpf.EbpfRuleAdd(5, ebpfHashStr, tempOpenTimeSec)\n\t\t\t\t\t\t\t\t\tif addErr != nil {\n\t\t\t\t\t\t\t\t\t\tlog.Error(\"[EbpfRuleAdd] add ebpf src: %s dstportstart: %d, dstportend: %d, error: %v\", ebpfHashStr.SrcIP, ebpfHashStr.DstPortStart, ebpfHashStr.DstPortEnd, addErr)\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif len(dstAddr.Protocol) == 0 || dstAddr.Protocol == \"udp\" || dstAddr.Protocol == \"any\" {\n\t\t\t\t\t\t\tfor iterIP := cidrIP.Mask(ipnet.Mask); ipnet.Contains(iterIP); incrementIP(iterIP) {\n\t\t\t\t\t\t\t\tsrcIpStr := iterIP.String()\n\n\t\t\t\t\t\t\t\tif dstAddr.Port != 0 {\n\t\t\t\t\t\t\t\t\tebpfHashStr := ebpf.EbpfRuleParams{\n\t\t\t\t\t\t\t\t\t\tSrcIP:   srcIpStr,\n\t\t\t\t\t\t\t\t\t\tDstPort: dstAddr.Port,\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\taddErr := ebpf.EbpfRuleAdd(4, ebpfHashStr, tempOpenTimeSec)\n\t\t\t\t\t\t\t\t\tif addErr != nil {\n\t\t\t\t\t\t\t\t\t\tlog.Error(\"[EbpfRuleAdd] add ebpf for udp dst port src: %s, dstport: %d, error: %v\", ebpfHashStr.SrcIP, ebpfHashStr.DstPort, addErr)\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tebpfHashStr := ebpf.EbpfRuleParams{\n\t\t\t\t\t\t\t\t\t\tSrcIP:        srcIpStr,\n\t\t\t\t\t\t\t\t\t\tDstPortStart: 1,\n\t\t\t\t\t\t\t\t\t\tDstPortEnd:   65535,\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\taddErr := ebpf.EbpfRuleAdd(5, ebpfHashStr, tempOpenTimeSec)\n\t\t\t\t\t\t\t\t\tif addErr != nil {\n\t\t\t\t\t\t\t\t\t\tlog.Error(\"[EbpfRuleAdd] add ebpf src: %s dstportstart: %d, dstportend: %d, error: %v\", ebpfHashStr.SrcIP, ebpfHashStr.DstPortStart, ebpfHashStr.DstPortEnd, addErr)\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif dstAddr.Port == 0 && (len(dstAddr.Protocol) == 0 || dstAddr.Protocol == \"any\") {\n\t\t\t\t\t\t\tfor iterIP := cidrIP.Mask(ipnet.Mask); ipnet.Contains(iterIP); incrementIP(iterIP) {\n\t\t\t\t\t\t\t\tsrcIpStr := iterIP.String()\n\t\t\t\t\t\t\t\tebpfHashStr := ebpf.EbpfRuleParams{\n\t\t\t\t\t\t\t\t\tSrcIP: srcIpStr,\n\t\t\t\t\t\t\t\t\tDstIP: dstAddr.Ip,\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\taddErr := ebpf.EbpfRuleAdd(3, ebpfHashStr, openTimeSec)\n\t\t\t\t\t\t\t\tif addErr != nil {\n\t\t\t\t\t\t\t\t\tlog.Error(\"[EbpfRuleAdd] add ebpf src: %s dst: %s, error: %v\", ebpfHashStr.SrcIP, ebpfHashStr.DstIP, addErr)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tlog.Error(\"[HandleAccessControl] unsupported FilterMode: %d (expected 0=IPTABLES or 1=EBPFXDP)\", a.config.FilterMode)\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// return temporary listened port(s) and nhp access token, then pass the real ip when agent sends access message\n\tcase PASS_PRE_ACCESS_IP:\n\t\t// ac open a temporary tcp or udp port for access\n\t\tdstIp := net.ParseIP(dstAddrs[0].Ip)\n\t\tif dstIp == nil {\n\t\t\tlog.Error(\"[HandleAccessControl] destination IP %s is invalid\", dstAddrs[0].Ip)\n\t\t\terr = common.ErrInvalidIpAddress\n\t\t\tartMsg.ErrCode = common.ErrInvalidIpAddress.ErrorCode()\n\t\t\tartMsg.ErrMsg = err.Error()\n\t\t\treturn\n\t\t}\n\n\t\tvar ipType utils.IPTYPE\n\t\tvar netStr string\n\t\tvar netStr1 string\n\t\tvar pickedPort int\n\t\tvar tcpListener *net.TCPListener\n\t\tvar udpListener *net.UDPConn\n\n\t\t// Detect IP type using proper parsing instead of string matching\n\t\tipType, ipErr := utils.DetectIPType(dstAddrs[0].Ip)\n\t\tif ipErr != nil {\n\t\t\tlog.Error(\"[HandleAccessControl] invalid destination IP for PASS_PRE_ACCESS_IP: %s\", dstAddrs[0].Ip)\n\t\t\terr = common.ErrInvalidIpAddress\n\t\t\tartMsg.ErrCode = common.ErrInvalidIpAddress.ErrorCode()\n\t\t\tartMsg.ErrMsg = err.Error()\n\t\t\treturn\n\t\t}\n\t\tif ipType == utils.IPV6 {\n\t\t\tnetStr = \"::/0\" // Canonical IPv6 \"any\" notation\n\t\t} else {\n\t\t\t// since ipset does not allow full ip range 0.0.0.0/0, we use two ip ranges\n\t\t\tnetStr = \"0.0.0.0/1\"\n\t\t\tnetStr1 = \"128.0.0.0/1\"\n\t\t}\n\n\t\t// openning temp tcp access\n\t\ttcpListener, err = net.ListenTCP(\"tcp\", &net.TCPAddr{\n\t\t\tIP:   dstIp,\n\t\t\tPort: 0, // ephemeral port\n\t\t})\n\n\t\tif err != nil {\n\t\t\tlog.Error(\"[HandleAccessControl] temporary tcp listening error: %v\", err)\n\t\t\terr = common.ErrACTempPortListenFailed\n\t\t\tartMsg.ErrCode = common.ErrACTempPortListenFailed.ErrorCode()\n\t\t\tartMsg.ErrMsg = err.Error()\n\t\t\treturn\n\t\t}\n\n\t\t// retrieve local port\n\t\ttladdr := tcpListener.Addr()\n\t\ttlocalAddr, locErr := net.ResolveTCPAddr(tladdr.Network(), tladdr.String())\n\t\tif locErr != nil {\n\t\t\tlog.Error(\"[HandleAccessControl] resolve local TCPAddr error: %v\", locErr)\n\t\t\terr = common.ErrACResolveTempPortFailed\n\t\t\tartMsg.ErrCode = common.ErrACResolveTempPortFailed.ErrorCode()\n\t\t\tartMsg.ErrMsg = err.Error()\n\t\t\treturn\n\t\t}\n\n\t\tlog.Debug(\"open temporary tcp port %s\", tlocalAddr.String())\n\t\tswitch a.config.FilterMode {\n\t\tcase FilterMode_IPTABLES:\n\t\t\tportHashStr := fmt.Sprintf(\"%s,%d\", netStr, tlocalAddr.Port)\n\t\t\t_, err = a.ipset.Add(ipType, 4, tempOpenTimeSec, portHashStr)\n\n\t\t\tif err != nil {\n\t\t\t\tlog.Error(\"[HandleAccessControl] add ipset %s error: %v\", portHashStr, err)\n\t\t\t\terr = common.ErrACIPSetOperationFailed\n\t\t\t\tartMsg.ErrCode = common.ErrACIPSetOperationFailed.ErrorCode()\n\t\t\t\tartMsg.ErrMsg = err.Error()\n\t\t\t\treturn\n\t\t\t}\n\t\t\t// IPv4 requires two ranges (0.0.0.0/1 and 128.0.0.0/1) since ipset doesn't allow 0.0.0.0/0\n\t\t\t// IPv6 uses ::/0 directly, so netStr1 is empty for IPv6\n\t\t\tif netStr1 != \"\" {\n\t\t\t\tportHashStr = fmt.Sprintf(\"%s,%d\", netStr1, tlocalAddr.Port)\n\t\t\t\t_, err = a.ipset.Add(ipType, 4, tempOpenTimeSec, portHashStr)\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Error(\"[HandleAccessControl] add ipset %s error: %v\", portHashStr, err)\n\t\t\t\t\terr = common.ErrACIPSetOperationFailed\n\t\t\t\t\tartMsg.ErrCode = common.ErrACIPSetOperationFailed.ErrorCode()\n\t\t\t\t\tartMsg.ErrMsg = err.Error()\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\t\tcase FilterMode_EBPFXDP:\n\t\t\tebpfHashStr := ebpf.EbpfRuleParams{\n\t\t\t\tProtocol: \"tcp\",\n\t\t\t\tDstPort:  tlocalAddr.Port,\n\t\t\t}\n\t\t\terr = ebpf.EbpfRuleAdd(6, ebpfHashStr, tempOpenTimeSec)\n\t\t\tif err != nil {\n\t\t\t\tlog.Error(\"[EbpfRuleAdd] add ebpf type 6 protocol: %s, dstport :%d, %v\", ebpfHashStr.Protocol, ebpfHashStr.DstPort, err)\n\t\t\t\treturn\n\t\t\t}\n\t\tdefault:\n\t\t\tlog.Error(\"[HandleAccessControl] unsupported FilterMode: %d (expected 0=IPTABLES or 1=EBPFXDP)\", a.config.FilterMode)\n\t\t\treturn\n\t\t}\n\n\t\tpickedPort = tlocalAddr.Port\n\t\tlog.Info(\"[HandleAccessControl] open temporary tcp port on %s\", tladdr.String())\n\n\t\t// for temp udp access\n\t\tudpListener, err = net.ListenUDP(\"udp\", &net.UDPAddr{\n\t\t\tIP:   dstIp,\n\t\t\tPort: pickedPort, // ephemeral port(0) or continue with previously picked tcp port\n\t\t})\n\t\tif err != nil {\n\t\t\tlog.Error(\"[HandleAccessControl] temporary udp listening error: %v\", err)\n\t\t\terr = common.ErrACTempPortListenFailed\n\t\t\tartMsg.ErrCode = common.ErrACTempPortListenFailed.ErrorCode()\n\t\t\tartMsg.ErrMsg = err.Error()\n\t\t\treturn\n\t\t}\n\n\t\t// retrieve local port\n\t\tuladdr := udpListener.LocalAddr()\n\t\t_, locErr = net.ResolveUDPAddr(uladdr.Network(), uladdr.String())\n\t\tif locErr != nil {\n\t\t\tlog.Error(\"[HandleAccessControl] resolve local UDPAddr error: %v\", locErr)\n\t\t\terr = common.ErrACResolveTempPortFailed\n\t\t\tartMsg.ErrCode = common.ErrACResolveTempPortFailed.ErrorCode()\n\t\t\tartMsg.ErrMsg = err.Error()\n\t\t\treturn\n\t\t}\n\n\t\tlog.Debug(\"open temporary udp port %s\", tlocalAddr.String())\n\t\tpickedPort = tlocalAddr.Port\n\n\t\tswitch a.config.FilterMode {\n\t\tcase FilterMode_IPTABLES:\n\t\t\tportHashStr := fmt.Sprintf(\"%s,udp:%d\", netStr, tlocalAddr.Port)\n\t\t\t_, err = a.ipset.Add(ipType, 4, tempOpenTimeSec, portHashStr)\n\t\t\tif err != nil {\n\t\t\t\tlog.Error(\"[HandleAccessControl] add ipset %s error: %v\", portHashStr, err)\n\t\t\t\terr = common.ErrACIPSetOperationFailed\n\t\t\t\tartMsg.ErrCode = common.ErrACIPSetOperationFailed.ErrorCode()\n\t\t\t\tartMsg.ErrMsg = err.Error()\n\t\t\t\treturn\n\t\t\t}\n\t\t\t// IPv4 requires two ranges (0.0.0.0/1 and 128.0.0.0/1) since ipset doesn't allow 0.0.0.0/0\n\t\t\t// IPv6 uses ::/0 directly, so netStr1 is empty for IPv6\n\t\t\tif netStr1 != \"\" {\n\t\t\t\tportHashStr = fmt.Sprintf(\"%s,udp:%d\", netStr1, tlocalAddr.Port)\n\t\t\t\t_, err = a.ipset.Add(ipType, 4, tempOpenTimeSec, portHashStr)\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Error(\"[HandleAccessControl] add ipset %s error: %v\", portHashStr, err)\n\t\t\t\t\terr = common.ErrACIPSetOperationFailed\n\t\t\t\t\tartMsg.ErrCode = common.ErrACIPSetOperationFailed.ErrorCode()\n\t\t\t\t\tartMsg.ErrMsg = err.Error()\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\t\tcase FilterMode_EBPFXDP:\n\t\t\tebpfHashStr := ebpf.EbpfRuleParams{\n\t\t\t\tProtocol: \"udp\",\n\t\t\t\tDstPort:  tlocalAddr.Port,\n\t\t\t}\n\t\t\terr = ebpf.EbpfRuleAdd(6, ebpfHashStr, tempOpenTimeSec)\n\t\t\tif err != nil {\n\t\t\t\tlog.Error(\"[EbpfRuleAdd] add ebpf type 6 protocol: %s, dstport :%d, %v\", ebpfHashStr.Protocol, ebpfHashStr.DstPort, err)\n\t\t\t\treturn\n\t\t\t}\n\t\tdefault:\n\t\t\tlog.Error(\"[HandleAccessControl] unsupported FilterMode: %d (expected 0=IPTABLES or 1=EBPFXDP)\", a.config.FilterMode)\n\t\t\treturn\n\t\t}\n\t\tlog.Info(\"[HandleAccessControl] open temporary udp port on %s\", tladdr.String())\n\n\t\ttempEntry := &AccessEntry{\n\t\t\tUser:     au,\n\t\t\tSrcAddrs: srcAddrs,\n\t\t\tDstAddrs: dstAddrs,\n\t\t\tOpenTime: tempOpenTimeSec,\n\t\t}\n\t\tartMsg.PreAccessAction = &common.PreAccessInfo{\n\t\t\tAccessPort:     strconv.Itoa(pickedPort),\n\t\t\tACPubKey:       a.device.PublicKeyExBase64(),\n\t\t\tACToken:        a.GenerateAccessToken(tempEntry),\n\t\t\tACCipherScheme: a.config.DefaultCipherScheme,\n\t\t}\n\n\t\tif tcpListener != nil {\n\t\t\ta.wg.Add(1)\n\t\t\tgo a.tcpTempAccessHandler(tcpListener, tempOpenTimeSec, dstAddrs, openTimeSec)\n\t\t}\n\n\t\tif udpListener != nil {\n\t\t\ta.wg.Add(1)\n\t\t\tgo a.udpTempAccessHandler(udpListener, tempOpenTimeSec, dstAddrs, openTimeSec)\n\t\t}\n\t}\n\n\tlog.Info(\"[HandleAccessControl] succeed\")\n\n\tartMsg.ErrCode = common.ErrSuccess.ErrorCode()\n\tartMsg.OpenTime = uint32(openTimeSec)\n\n\treturn\n}\n\nfunc (a *UdpAC) tcpTempAccessHandler(listener *net.TCPListener, timeoutSec int, dstAddrs []*common.NetAddress, openTimeSec int) {\n\tdefer a.wg.Done()\n\tdefer listener.Close()\n\n\t// accept only the first incoming tcp connection\n\tstartTime := time.Now()\n\tdeadlineTime := startTime.Add(time.Duration(timeoutSec) * time.Second)\n\tlocalAddrStr := listener.Addr().String()\n\terr := listener.SetDeadline(deadlineTime)\n\tif err != nil {\n\t\tlog.Error(\"[tcpTempAccessHandler] temporary port on %s failed to set tcp listen timeout\", localAddrStr)\n\t\treturn\n\t}\n\tconn, err := listener.Accept()\n\tif err != nil {\n\t\tlog.Error(\"[tcpTempAccessHandler] temporary port on %s tcp listen timeout\", localAddrStr)\n\t\treturn\n\t}\n\n\tdefer conn.Close()\n\terr = conn.SetDeadline(deadlineTime)\n\tif err != nil {\n\t\tlog.Error(\"[tcpTempAccessHandler] temporary port on %s failed to set tcp conn timeout\", localAddrStr)\n\t\treturn\n\t}\n\n\tremoteAddrStr := conn.RemoteAddr().String()\n\tpkt := a.device.AllocatePoolPacket()\n\tdefer a.device.ReleasePoolPacket(pkt)\n\n\t// monitor stop signals and quit connection earlier\n\tctx, ctxCancel := context.WithDeadline(context.Background(), deadlineTime)\n\tdefer ctxCancel()\n\tgo a.tempConnTerminator(conn, ctx)\n\n\t// tcp recv common header first\n\tn, err := conn.Read(pkt.Buf[:core.HeaderCommonSize])\n\tif err != nil || n < core.HeaderCommonSize {\n\t\tlog.Error(\"[tcpTempAccessHandler] failed to receive tcp packet header from remote address %s (%v)\", remoteAddrStr, err)\n\t\treturn\n\t}\n\n\tpkt.Content = pkt.Buf[:n]\n\t// check type and payload size\n\tmsgType, msgSize := pkt.HeaderTypeAndSize()\n\tif msgType != core.NHP_ACC {\n\t\tlog.Error(\"[tcpTempAccessHandler] message type is not %s, close connection\", core.HeaderTypeToString(core.NHP_ACC))\n\t\treturn\n\t}\n\n\tpacketSize := pkt.Header().Size() + msgSize\n\tremainingSize := packetSize - n\n\tn, err = conn.Read(pkt.Buf[n:packetSize])\n\tif err != nil || n < remainingSize {\n\t\tlog.Error(\"[tcpTempAccessHandler] failed to receive tcp message body from remote address %s (%v)\", remoteAddrStr, err)\n\t\treturn\n\t}\n\n\tpkt.Content = pkt.Buf[:packetSize]\n\t//log.Trace(\"[tcpTempAccessHandler]receive tcp access packet (%s -> %s): %+v\", remoteAddrStr, localAddrStr, pkt.Content)\n\tlog.Info(\"[tcpTempAccessHandler] receive tcp access message (%s -> %s)\", remoteAddrStr, localAddrStr)\n\n\tpd := &core.PacketData{\n\t\tBasePacket:     pkt,\n\t\tConnData:       &core.ConnectionData{},\n\t\tInitTime:       time.Now().UnixNano(),\n\t\tDecryptedMsgCh: make(chan *core.PacketParserData),\n\t}\n\n\tif !a.IsRunning() {\n\t\tlog.Error(\"[tcpTempAccessHandler] PacketData channel closed or being closed, skip decrypting\")\n\t\treturn\n\t}\n\n\t// start message decryption\n\ta.device.RecvPacketToMsg(pd)\n\n\t// waiting for message decryption\n\taccPpd := <-pd.DecryptedMsgCh\n\tclose(pd.DecryptedMsgCh)\n\n\tif accPpd.Error != nil {\n\t\tlog.Error(\"[tcpTempAccessHandler] failed to decrypt tcp access message: %v\", accPpd.Error)\n\t\treturn\n\t}\n\n\taccMsg := &common.AgentAccessMsg{}\n\terr = json.Unmarshal(accPpd.BodyMessage, accMsg)\n\tif err != nil {\n\t\tlog.Error(\"[tcpTempAccessHandler] failed to parse %s message: %v\", core.HeaderTypeToString(accPpd.HeaderType), err)\n\t\treturn\n\t}\n\n\tif a.VerifyAccessToken(accMsg.ACToken) != nil {\n\t\tremoteAddr, _ := net.ResolveTCPAddr(conn.RemoteAddr().Network(), conn.RemoteAddr().String())\n\t\tsrcAddrIp := remoteAddr.IP.String()\n\n\t\t// Detect IP type using proper parsing instead of string matching\n\t\tipType, ipErr := utils.DetectIPType(dstAddrs[0].Ip)\n\t\tif ipErr != nil {\n\t\t\tlog.Error(\"[tcpTempAccessHandler] invalid destination IP: %s\", dstAddrs[0].Ip)\n\t\t\treturn\n\t\t}\n\n\t\tfor _, dstAddr := range dstAddrs {\n\t\t\tipHashStr := fmt.Sprintf(\"%s,%d,%s\", srcAddrIp, dstAddr.Port, dstAddr.Ip)\n\t\t\tif dstAddr.Port == 0 {\n\t\t\t\tipHashStr = fmt.Sprintf(\"%s,1-65535,%s\", srcAddrIp, dstAddr.Ip)\n\t\t\t}\n\t\t\tswitch a.config.FilterMode {\n\t\t\tcase FilterMode_IPTABLES:\n\t\t\t\t_, err = a.ipset.Add(ipType, 1, openTimeSec, ipHashStr)\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Error(\"[tcpTempAccessHandler] add ipset %s error: %v\", ipHashStr, err)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\tcase FilterMode_EBPFXDP:\n\t\t\t\tebpfHashStr := ebpf.EbpfRuleParams{\n\t\t\t\t\tSrcIP: srcAddrIp,\n\t\t\t\t\tDstIP: dstAddr.Ip,\n\t\t\t\t}\n\t\t\t\terr = ebpf.EbpfRuleAdd(2, ebpfHashStr, openTimeSec)\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Error(\"[EbpfRuleAdd] add ebpf src: %s dst: %s, error: %v\", ebpfHashStr.SrcIP, ebpfHashStr.DstIP, err)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\tdefault:\n\t\t\t\tlog.Error(\"[HandleAccessControl] unsupported FilterMode: %d (expected 0=IPTABLES or 1=EBPFXDP)\", a.config.FilterMode)\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc (a *UdpAC) udpTempAccessHandler(conn *net.UDPConn, timeoutSec int, dstAddrs []*common.NetAddress, openTimeSec int) {\n\tdefer a.wg.Done()\n\tdefer conn.Close()\n\t// listen to accept and handle only one incoming connection\n\tstartTime := time.Now()\n\tdeadlineTime := startTime.Add(time.Duration(timeoutSec) * time.Second)\n\tlocalAddrStr := conn.LocalAddr().String()\n\terr := conn.SetDeadline(deadlineTime)\n\tif err != nil {\n\t\tlog.Error(\"[udpTempAccessHandler] temporary port on %s failed to set udp conn timeout\", localAddrStr)\n\t\treturn\n\t}\n\n\tpkt := a.device.AllocatePoolPacket()\n\tdefer a.device.ReleasePoolPacket(pkt)\n\n\t// monitor stop signals and quit connection earlier\n\tctx, ctxCancel := context.WithDeadline(context.Background(), deadlineTime)\n\tdefer ctxCancel()\n\tgo a.tempConnTerminator(conn, ctx)\n\n\t// udp recv, blocking until packet arrives or deadline reaches\n\tn, remoteAddr, err := conn.ReadFromUDP(pkt.Buf[:])\n\tif err != nil || n < core.HeaderCommonSize {\n\t\tlog.Error(\"[udpTempAccessHandler] failed to receive udp packet (%v)\", err)\n\t\treturn\n\t}\n\n\tremoteAddrStr := remoteAddr.String()\n\tpkt.Content = pkt.Buf[:n]\n\n\t// check type and payload size\n\tmsgType, msgSize := pkt.HeaderTypeAndSize()\n\tif msgType != core.NHP_ACC {\n\t\tlog.Error(\"[udpTempAccessHandler] message type is not %s, close connection\", core.HeaderTypeToString(core.NHP_ACC))\n\t\treturn\n\t}\n\n\tpacketSize := pkt.Header().Size() + msgSize\n\n\tif n != packetSize {\n\t\tlog.Error(\"[udpTempAccessHandler] udp packet size incorrect from remote address %s\", remoteAddrStr)\n\t\treturn\n\t}\n\n\tlog.Trace(\"receive udp access packet (%s -> %s): %+v\", remoteAddrStr, localAddrStr, pkt.Content)\n\tlog.Info(\"[udpTempAccessHandler] receive udp access message (%s -> %s)\", remoteAddrStr, localAddrStr)\n\n\tpd := &core.PacketData{\n\t\tBasePacket:     pkt,\n\t\tConnData:       &core.ConnectionData{},\n\t\tInitTime:       time.Now().UnixNano(),\n\t\tDecryptedMsgCh: make(chan *core.PacketParserData),\n\t}\n\n\tif !a.IsRunning() {\n\t\tlog.Error(\"[udpTempAccessHandler] PacketData channel closed or being closed, skip decrypting\")\n\t\treturn\n\t}\n\n\t// start packet decryption\n\ta.device.RecvPacketToMsg(pd)\n\n\t// waiting for packet decryption\n\taccPpd := <-pd.DecryptedMsgCh\n\tclose(pd.DecryptedMsgCh)\n\n\tif accPpd.Error != nil {\n\t\tlog.Error(\"[udpTempAccessHandler] failed to decrypt udp access message: %v\", accPpd.Error)\n\t\treturn\n\t}\n\n\taccMsg := &common.AgentAccessMsg{}\n\terr = json.Unmarshal(accPpd.BodyMessage, accMsg)\n\tif err != nil {\n\t\tlog.Error(\"[udpTempAccessHandler] failed to parse %s message: %v\", core.HeaderTypeToString(accPpd.HeaderType), err)\n\t\treturn\n\t}\n\n\tif a.VerifyAccessToken(accMsg.ACToken) != nil {\n\t\tsrcAddrIp := remoteAddr.IP.String()\n\n\t\t// Detect IP type using proper parsing instead of string matching\n\t\tipType, ipErr := utils.DetectIPType(dstAddrs[0].Ip)\n\t\tif ipErr != nil {\n\t\t\tlog.Error(\"[udpTempAccessHandler] invalid destination IP: %s\", dstAddrs[0].Ip)\n\t\t\treturn\n\t\t}\n\n\t\tfor _, dstAddr := range dstAddrs {\n\t\t\tif len(dstAddr.Protocol) == 0 || dstAddr.Protocol == \"udp\" || dstAddr.Protocol == \"any\" {\n\t\t\t\tipHashStr := fmt.Sprintf(\"%s,udp:%d,%s\", srcAddrIp, dstAddr.Port, dstAddr.Ip)\n\t\t\t\tif dstAddr.Port == 0 {\n\t\t\t\t\tipHashStr = fmt.Sprintf(\"%s,udp:1-65535,%s\", srcAddrIp, dstAddr.Ip)\n\t\t\t\t}\n\t\t\t\tswitch a.config.FilterMode {\n\t\t\t\tcase FilterMode_IPTABLES:\n\t\t\t\t\t_, err = a.ipset.Add(ipType, 1, openTimeSec, ipHashStr)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tlog.Error(\"[udpTempAccessHandler] add ipset %s error: %v\", ipHashStr, err)\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\tcase FilterMode_EBPFXDP:\n\t\t\t\t\tif len(dstAddr.Protocol) == 0 || dstAddr.Protocol == \"any\" {\n\t\t\t\t\t\tebpfHashStr := ebpf.EbpfRuleParams{\n\t\t\t\t\t\t\tSrcIP: srcAddrIp,\n\t\t\t\t\t\t\tDstIP: dstAddr.Ip,\n\t\t\t\t\t\t}\n\t\t\t\t\t\terr = ebpf.EbpfRuleAdd(2, ebpfHashStr, openTimeSec)\n\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\tlog.Error(\"[EbpfRuleAdd] add ebpf src: %s dst: %s, error: %v\", ebpfHashStr.SrcIP, ebpfHashStr.DstIP, err)\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif dstAddr.Protocol == \"udp\" {\n\t\t\t\t\t\tebpfHashStr := ebpf.EbpfRuleParams{\n\t\t\t\t\t\t\tSrcIP:    srcAddrIp,\n\t\t\t\t\t\t\tDstIP:    dstAddr.Ip,\n\t\t\t\t\t\t\tDstPort:  dstAddr.Port,\n\t\t\t\t\t\t\tProtocol: dstAddr.Protocol,\n\t\t\t\t\t\t}\n\t\t\t\t\t\terr = ebpf.EbpfRuleAdd(1, ebpfHashStr, openTimeSec)\n\n\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\tlog.Error(\"[EbpfRuleAdd] add ebpf udp failed src: %s dst: %s, error: %v, protocol: %s, dstport: %d\", ebpfHashStr.SrcIP, ebpfHashStr.DstIP, err, ebpfHashStr.Protocol, ebpfHashStr.DstPort)\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\tlog.Error(\"[HandleAccessControl] unsupported FilterMode: %d (expected 0=IPTABLES or 1=EBPFXDP)\", a.config.FilterMode)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\t\t\t// for ping\n\t\t\tif dstAddr.Port == 0 && (len(dstAddr.Protocol) == 0 || dstAddr.Protocol == \"any\") {\n\n\t\t\t\tswitch a.config.FilterMode {\n\t\t\t\tcase FilterMode_IPTABLES:\n\t\t\t\t\t// ICMPv4 Echo Request = type 8, ICMPv6 Echo Request = type 128\n\t\t\t\t\ticmpType := \"icmp:8/0\"\n\t\t\t\t\tif ipType == utils.IPV6 {\n\t\t\t\t\t\ticmpType = \"icmpv6:128/0\"\n\t\t\t\t\t}\n\t\t\t\t\tipHashStr := fmt.Sprintf(\"%s,%s,%s\", remoteAddr.IP.String(), icmpType, dstAddr.Ip)\n\t\t\t\t\t_, _ = a.ipset.Add(ipType, 1, openTimeSec, ipHashStr)\n\t\t\t\tcase FilterMode_EBPFXDP:\n\t\t\t\t\tebpfHashStr := ebpf.EbpfRuleParams{\n\t\t\t\t\t\tSrcIP: remoteAddr.IP.String(),\n\t\t\t\t\t\tDstIP: dstAddr.Ip,\n\t\t\t\t\t}\n\t\t\t\t\terr = ebpf.EbpfRuleAdd(3, ebpfHashStr, openTimeSec)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tlog.Error(\"[EbpfRuleAdd] add ebpf icmp src: %s dst: %s, error: %v\", ebpfHashStr.SrcIP, ebpfHashStr.DstIP, err)\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\tlog.Error(\"[HandleAccessControl] unsupported FilterMode: %d (expected 0=IPTABLES or 1=EBPFXDP)\", a.config.FilterMode)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc (a *UdpAC) tempConnTerminator(conn net.Conn, ctx context.Context) {\n\tselect {\n\tcase <-a.signals.stop:\n\t\tconn.Close()\n\t\treturn\n\n\tcase <-ctx.Done():\n\t\treturn\n\t}\n}\n\nfunc incrementIP(ip net.IP) {\n\tfor j := len(ip) - 1; j >= 0; j-- {\n\t\tip[j]++\n\t\tif ip[j] > 0 {\n\t\t\tbreak\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "endpoints/ac/tokenstore.go",
    "content": "package ac\n\nimport (\n\t\"encoding/base64\"\n\t\"encoding/binary\"\n\t\"time\"\n\n\t\"github.com/emmansun/gmsm/sm3\"\n\n\t\"github.com/OpenNHP/opennhp/nhp/common\"\n)\n\n// AccessEntry represents an access token entry with user and access information.\ntype AccessEntry struct {\n\tUser       *common.AgentUser\n\tSrcAddrs   []*common.NetAddress\n\tDstAddrs   []*common.NetAddress\n\tOpenTime   int\n\tExpireTime time.Time\n}\n\n// GetExpireTime implements the common.TokenEntry interface.\nfunc (e *AccessEntry) GetExpireTime() time.Time {\n\treturn e.ExpireTime\n}\n\n// GenerateAccessToken creates a new access token for the given entry.\n// The token is stored with an additional 5-second buffer to handle late requests.\nfunc (a *UdpAC) GenerateAccessToken(entry *AccessEntry) string {\n\tvar tsBytes [8]byte\n\tcurrTime := time.Now().UnixNano()\n\n\thash := sm3.New()\n\tbinary.BigEndian.PutUint64(tsBytes[:], uint64(currTime))\n\tau := entry.User\n\thash.Write([]byte(a.config.ACId + au.UserId + au.DeviceId + au.OrganizationId + au.AuthServiceId))\n\thash.Write(tsBytes[:])\n\ttoken := base64.StdEncoding.EncodeToString(hash.Sum(nil))\n\thash.Reset()\n\n\t// Keep token for additional 5 seconds in case a request is received late\n\tentry.ExpireTime = time.Now().Add(time.Duration(entry.OpenTime+5) * time.Second)\n\ta.tokenStore.Store(token, entry)\n\n\treturn token\n}\n\n// VerifyAccessToken validates a token and extends its expiry time if valid.\n// Returns the AccessEntry if found, nil otherwise.\nfunc (a *UdpAC) VerifyAccessToken(token string) *AccessEntry {\n\tentry, found := a.tokenStore.Load(token)\n\tif found {\n\t\t// Extend expiry time on successful verification\n\t\tentry.ExpireTime = entry.ExpireTime.Add(time.Duration(entry.OpenTime) * time.Second)\n\t\treturn entry\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "endpoints/ac/udpac.go",
    "content": "package ac\n\nimport (\n\t\"encoding/base64\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"net\"\n\t\"path/filepath\"\n\t\"sync\"\n\t\"sync/atomic\"\n\t\"time\"\n\n\t\"github.com/OpenNHP/opennhp/nhp/etcd\"\n\n\tebpflocal \"github.com/OpenNHP/opennhp/endpoints/ac/ebpf\"\n\t\"github.com/OpenNHP/opennhp/nhp/common\"\n\t\"github.com/OpenNHP/opennhp/nhp/core\"\n\t\"github.com/OpenNHP/opennhp/nhp/log\"\n\t\"github.com/OpenNHP/opennhp/nhp/utils\"\n\t\"github.com/OpenNHP/opennhp/nhp/utils/ebpf\"\n\t\"github.com/OpenNHP/opennhp/nhp/version\"\n)\n\nvar (\n\tExeDirPath string\n)\n\ntype UdpAC struct {\n\tconfig     *Config\n\thttpConfig *HttpConfig\n\tiptables   *utils.IPTables\n\tipset      *utils.IPSet\n\n\tstats struct {\n\t\ttotalRecvBytes uint64\n\t\ttotalSendBytes uint64\n\t}\n\n\tlog *log.Logger\n\n\tremoteConnectionMutex sync.Mutex\n\tremoteConnectionMap   map[string]*UdpConn // indexed by remote UDP address\n\n\tserverPeerMutex sync.Mutex\n\tserverPeerMap   map[string]*core.UdpPeer // indexed by server's public key\n\n\ttokenStore *common.TokenStore[*AccessEntry]\n\n\tdevice     *core.Device\n\thttpServer *HttpAC\n\twg         sync.WaitGroup\n\trunning    atomic.Bool\n\n\tsignals struct {\n\t\tstop             chan struct{}\n\t\tserverMapUpdated chan struct{}\n\t}\n\n\trecvMsgCh <-chan *core.PacketParserData\n\tsendMsgCh chan *core.MsgData\n\t// etcd client\n\tetcdConn                *etcd.EtcdConn\n\tremoteConfigUpdateMutex sync.Mutex\n}\n\ntype UdpConn struct {\n\tConnData     *core.ConnectionData\n\tnetConn      *net.UDPConn\n\tconnected    atomic.Bool\n\texternalAddr string\n}\n\nfunc (c *UdpConn) Close() {\n\tif c.netConn != nil {\n\t\tc.netConn.Close()\n\t\tc.ConnData.Close()\n\t}\n}\n\n/*\ndirPath: the path of app or shared library entry point\nlogLevel: 0: silent, 1: error, 2: info, 3: debug, 4: verbose\n*/\nfunc (a *UdpAC) Start(dirPath string, logLevel int) (err error) {\n\tcommon.ExeDirPath = dirPath\n\tExeDirPath = dirPath\n\t// init logger\n\ta.log = log.NewLogger(\"NHP-AC\", logLevel, filepath.Join(ExeDirPath, \"logs\"), \"ac\")\n\tlog.SetGlobalLogger(a.log)\n\n\tlog.Info(\"=========================================================\")\n\tlog.Info(\"=== NHP-AC %s started                              ===\", version.Version)\n\tlog.Info(\"=== REVISION %s ===\", version.CommitId)\n\tlog.Info(\"=== RELEASE %s                       ===\", version.BuildTime)\n\tlog.Info(\"=========================================================\")\n\n\t// load remote config,init etcd client\n\terr = a.initRemoteConn()\n\tif err == nil && a.etcdConn == nil {\n\t\t// init config\n\t\terr = a.loadBaseConfig()\n\t} else {\n\t\t// nhp ac base config must be loaded first.\n\t\terr = a.loadRemoteBaseConfig()\n\t}\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tswitch a.config.FilterMode {\n\tcase FilterMode_IPTABLES:\n\t\ta.iptables, err = utils.NewIPTables()\n\t\tif err != nil {\n\t\t\tlog.Error(\"iptables command not found\")\n\t\t\treturn\n\t\t}\n\n\t\ta.ipset, err = utils.NewIPSet(false)\n\t\tif err != nil {\n\t\t\tlog.Error(\"ipset command not found\")\n\t\t\treturn\n\t\t}\n\tcase FilterMode_EBPFXDP:\n\t\terr = ebpflocal.EbpfEngineLoad(dirPath, logLevel, a.config.ACId)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\tdefault:\n\t\tlog.Error(\"[HandleAccessControl] unsupported FilterMode: %d (expected 0=IPTABLES or 1=EBPFXDP)\", a.config.FilterMode)\n\t\treturn\n\t}\n\n\tprk, err := base64.StdEncoding.DecodeString(a.config.PrivateKeyBase64)\n\tif err != nil {\n\t\tlog.Error(\"private key parse error %v\\n\", err)\n\t\treturn fmt.Errorf(\"private key parse error %v\", err)\n\t}\n\n\ta.device = core.NewDevice(core.NHP_AC, prk, nil)\n\tif a.device == nil {\n\t\tlog.Critical(\"failed to create device %v\\n\", err)\n\t\treturn fmt.Errorf(\"failed to create device %v\", err)\n\t}\n\n\ta.remoteConnectionMap = make(map[string]*UdpConn)\n\ta.serverPeerMap = make(map[string]*core.UdpPeer)\n\ta.tokenStore = common.NewTokenStore[*AccessEntry]()\n\n\tif a.etcdConn != nil {\n\t\t_ = a.loadRemoteConfig()\n\t} else {\n\t\t// load http config and turn on http server if needed\n\t\t_ = a.loadHttpConfig()\n\n\t\t// load peers\n\t\t_ = a.loadPeers()\n\t}\n\n\tif a.config.FilterMode == FilterMode_EBPFXDP {\n\t\tfor _, server := range a.config.Servers {\n\t\t\tebpfHashStr := ebpf.EbpfRuleParams{\n\t\t\t\tSrcIP: server.Ip,\n\t\t\t\tDstIP: a.config.DefaultIp,\n\t\t\t}\n\t\t\tlog.Info(\"server ip is %s\", server.Ip)\n\t\t\terr = ebpf.EbpfRuleAdd(2, ebpfHashStr, 31536000)\n\t\t\tif err != nil {\n\t\t\t\tlog.Error(\"[EbpfRuleAdd] add ebpf src: %s dst: %s, error: %v\", ebpfHashStr.SrcIP, ebpfHashStr.DstIP, err)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\t}\n\n\ta.signals.stop = make(chan struct{})\n\ta.signals.serverMapUpdated = make(chan struct{}, 1)\n\n\ta.recvMsgCh = a.device.DecryptedMsgQueue\n\ta.sendMsgCh = make(chan *core.MsgData, core.SendQueueSize)\n\n\t// start device routines\n\ta.device.Start()\n\n\t// start ac routines\n\ta.wg.Add(4)\n\tgo a.tokenStore.RunRefreshRoutine(&a.wg, a.signals.stop, TokenStoreRefreshInterval)\n\tgo a.sendMessageRoutine()\n\tgo a.recvMessageRoutine()\n\tgo a.maintainServerConnectionRoutine()\n\n\ta.running.Store(true)\n\treturn nil\n}\n\nfunc (ac *UdpAC) Stop() {\n\tac.running.Store(false)\n\tclose(ac.signals.stop)\n\tif ac.etcdConn != nil {\n\t\tac.etcdConn.Close()\n\t}\n\tac.device.Stop()\n\tac.StopConfigWatch()\n\tac.wg.Wait()\n\tclose(ac.sendMsgCh)\n\tclose(ac.signals.serverMapUpdated)\n\n\tlog.Info(\"==========================\")\n\tlog.Info(\"=== NHP-AC stopped ===\")\n\tlog.Info(\"==========================\")\n\tac.log.Close()\n\tif ebpflocal.DenyLogger != nil {\n\t\tebpflocal.DenyLogger.Close()\n\t}\n\tif ebpflocal.AcLogger != nil {\n\t\tebpflocal.AcLogger.Close()\n\t}\n}\n\nfunc (a *UdpAC) IsRunning() bool {\n\treturn a.running.Load()\n}\n\nfunc (a *UdpAC) newConnection(addr *net.UDPAddr) (conn *UdpConn) {\n\tconn = &UdpConn{}\n\tvar err error\n\t// unlike tcp, udp dial is fast (just socket bind), so no need to run in a thread\n\tconn.netConn, err = net.DialUDP(\"udp\", nil, addr)\n\tif err != nil {\n\t\tlog.Error(\"could not connect to remote addr %s\", addr.String())\n\t\treturn nil\n\t}\n\n\t// retrieve local port\n\tladdr := conn.netConn.LocalAddr()\n\tlocalAddr, err := net.ResolveUDPAddr(laddr.Network(), laddr.String())\n\tif err != nil {\n\t\tlog.Error(\"resolve local UDPAddr error %v\\n\", err)\n\t\treturn nil\n\t}\n\n\tlog.Info(\"Dial up new UDP connection from %s to %s\", localAddr.String(), addr.String())\n\n\tconn.ConnData = &core.ConnectionData{\n\t\tDevice:               a.device,\n\t\tCookieStore:          &core.CookieStore{},\n\t\tRemoteTransactionMap: make(map[uint64]*core.RemoteTransaction),\n\t\tLocalAddr:            localAddr,\n\t\tRemoteAddr:           addr,\n\t\tTimeoutMs:            DefaultConnectionTimeoutMs,\n\t\tSendQueue:            make(chan *core.Packet, PacketQueueSizePerConnection),\n\t\tRecvQueue:            make(chan *core.Packet, PacketQueueSizePerConnection),\n\t\tBlockSignal:          make(chan struct{}),\n\t\tSetTimeoutSignal:     make(chan struct{}),\n\t\tStopSignal:           make(chan struct{}),\n\t}\n\n\t// start connection receive routine\n\tconn.ConnData.Add(1)\n\tgo a.recvPacketRoutine(conn)\n\n\treturn conn\n}\n\nfunc (a *UdpAC) sendMessageRoutine() {\n\tdefer a.wg.Done()\n\tdefer log.Info(\"sendMessageRoutine stopped\")\n\n\tlog.Info(\"sendMessageRoutine started\")\n\n\tfor {\n\t\tselect {\n\t\tcase <-a.signals.stop:\n\t\t\treturn\n\n\t\tcase md, ok := <-a.sendMsgCh:\n\t\t\tif !ok {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif md == nil || md.RemoteAddr == nil {\n\t\t\t\tlog.Warning(\"Invalid initiator session starter\")\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\taddrStr := md.RemoteAddr.String()\n\n\t\t\ta.remoteConnectionMutex.Lock()\n\t\t\tconn, found := a.remoteConnectionMap[addrStr]\n\t\t\ta.remoteConnectionMutex.Unlock()\n\n\t\t\tif found {\n\t\t\t\tmd.ConnData = conn.ConnData\n\t\t\t} else {\n\t\t\t\tconn = a.newConnection(md.RemoteAddr)\n\t\t\t\tif conn == nil {\n\t\t\t\t\tlog.Error(\"Failed to dial to remote address: %s\", addrStr)\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\ta.remoteConnectionMutex.Lock()\n\t\t\t\ta.remoteConnectionMap[addrStr] = conn\n\t\t\t\ta.remoteConnectionMutex.Unlock()\n\n\t\t\t\tmd.ConnData = conn.ConnData\n\n\t\t\t\t// launch connection routine\n\t\t\t\ta.wg.Add(1)\n\t\t\t\tgo a.connectionRoutine(conn)\n\t\t\t}\n\n\t\t\ta.device.SendMsgToPacket(md)\n\t\t}\n\t}\n}\n\nfunc (a *UdpAC) SendPacket(pkt *core.Packet, conn *UdpConn) (n int, err error) {\n\tdefer func() {\n\t\tatomic.AddUint64(&a.stats.totalSendBytes, uint64(n))\n\t\tatomic.StoreInt64(&conn.ConnData.LastLocalSendTime, time.Now().UnixNano())\n\n\t\tif !pkt.KeepAfterSend {\n\t\t\ta.device.ReleasePoolPacket(pkt)\n\t\t}\n\t}()\n\n\tpktType := core.HeaderTypeToString(pkt.HeaderType)\n\t//log.Debug(\"Send [%s] packet (%s -> %s): %+v\", pktType, conn.ConnData.LocalAddr.String(), conn.ConnData.RemoteAddr.String(), pkt.Content)\n\tlog.Info(\"Send [%s] packet (%s -> %s), %d bytes\", pktType, conn.ConnData.LocalAddr.String(), conn.ConnData.RemoteAddr.String(), len(pkt.Content))\n\tlog.Evaluate(\"Send [%s] packet (%s -> %s, %d bytes)\", pktType, conn.ConnData.LocalAddr.String(), conn.ConnData.RemoteAddr.String(), len(pkt.Content))\n\treturn conn.netConn.Write(pkt.Content)\n}\n\nfunc (a *UdpAC) recvPacketRoutine(conn *UdpConn) {\n\taddrStr := conn.ConnData.RemoteAddr.String()\n\n\tdefer conn.ConnData.Done()\n\tdefer log.Debug(\"recvPacketRoutine for %s stopped\", addrStr)\n\n\tlog.Debug(\"recvPacketRoutine for %s started\", addrStr)\n\n\tfor {\n\t\tselect {\n\t\tcase <-conn.ConnData.StopSignal:\n\t\t\treturn\n\n\t\tdefault:\n\t\t}\n\n\t\t// udp recv, blocking until packet arrives or netConn.Close()\n\t\tpkt := a.device.AllocatePoolPacket()\n\t\tn, err := conn.netConn.Read(pkt.Buf[:])\n\t\tif err != nil {\n\t\t\ta.device.ReleasePoolPacket(pkt)\n\t\t\tif n == 0 {\n\t\t\t\t// udp connection closed, it is not an error\n\t\t\t\treturn\n\t\t\t}\n\t\t\tlog.Error(\"Failed to receive from remote address %s (%v)\", addrStr, err)\n\t\t\tcontinue\n\t\t}\n\n\t\t// add total recv bytes\n\t\tatomic.AddUint64(&a.stats.totalRecvBytes, uint64(n))\n\n\t\t// check minimal length\n\t\tif n < pkt.MinimalLength() {\n\t\t\ta.device.ReleasePoolPacket(pkt)\n\t\t\tlog.Error(\"Received UDP packet from %s is too short, discard\", addrStr)\n\t\t\tcontinue\n\t\t}\n\n\t\tpkt.Content = pkt.Buf[:n]\n\t\t//log.Trace(\"receive udp packet (%s -> %s): %+v\", conn.ConnData.RemoteAddr.String(), conn.ConnData.LocalAddr.String(), pkt.Content)\n\n\t\ttyp, _, err := a.device.RecvPrecheck(pkt)\n\t\tmsgType := core.HeaderTypeToString(typ)\n\t\tlog.Info(\"Receive [%s] packet (%s -> %s), %d bytes\", msgType, addrStr, conn.ConnData.LocalAddr.String(), n)\n\t\tlog.Evaluate(\"Receive [%s] packet (%s -> %s), %d bytes\", msgType, addrStr, conn.ConnData.LocalAddr.String(), n)\n\t\tif err != nil {\n\t\t\ta.device.ReleasePoolPacket(pkt)\n\t\t\tlog.Warning(\"Receive [%s] packet (%s -> %s), precheck error: %v\", msgType, addrStr, conn.ConnData.LocalAddr.String(), err)\n\t\t\tlog.Evaluate(\"Receive [%s] packet (%s -> %s) precheck error: %v\", msgType, addrStr, conn.ConnData.LocalAddr.String(), err)\n\t\t\tcontinue\n\t\t}\n\n\t\tatomic.StoreInt64(&conn.ConnData.LastLocalRecvTime, time.Now().UnixNano())\n\n\t\tconn.ConnData.ForwardInboundPacket(pkt)\n\t}\n}\n\nfunc (a *UdpAC) connectionRoutine(conn *UdpConn) {\n\taddrStr := conn.ConnData.RemoteAddr.String()\n\n\tdefer a.wg.Done()\n\tdefer log.Debug(\"Connection routine: %s stopped\", addrStr)\n\n\tlog.Debug(\"Connection routine: %s started\", addrStr)\n\n\t// stop receiving packets and clean up\n\tdefer func() {\n\t\ta.remoteConnectionMutex.Lock()\n\t\tdelete(a.remoteConnectionMap, addrStr)\n\t\ta.remoteConnectionMutex.Unlock()\n\n\t\tconn.Close()\n\t}()\n\n\tfor {\n\t\tselect {\n\t\tcase <-a.signals.stop:\n\t\t\treturn\n\n\t\tcase <-conn.ConnData.SetTimeoutSignal:\n\t\t\tif conn.ConnData.TimeoutMs <= 0 {\n\t\t\t\tlog.Debug(\"Connection routine closed immediately\")\n\t\t\t\treturn\n\t\t\t}\n\n\t\tcase <-time.After(time.Duration(conn.ConnData.TimeoutMs) * time.Millisecond):\n\t\t\t// timeout, quit routine\n\t\t\tlog.Debug(\"Connection routine idle timeout\")\n\t\t\treturn\n\n\t\tcase pkt, ok := <-conn.ConnData.SendQueue:\n\t\t\tif !ok {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif pkt == nil {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\t_, _ = a.SendPacket(pkt, conn)\n\n\t\tcase pkt, ok := <-conn.ConnData.RecvQueue:\n\t\t\tif !ok {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif pkt == nil {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tlog.Debug(\"Received udp packet len [%d] from addr: %s\\n\", len(pkt.Content), addrStr)\n\n\t\t\tif pkt.HeaderType == core.NHP_KPL {\n\t\t\t\ta.device.ReleasePoolPacket(pkt)\n\t\t\t\tlog.Info(\"Receive [NHP_KPL] message (%s -> %s)\", addrStr, conn.ConnData.LocalAddr.String())\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tif a.device.IsTransactionResponse(pkt.HeaderType) {\n\t\t\t\t// forward to a specific transaction\n\t\t\t\ttransactionId := pkt.Counter()\n\t\t\t\ttransaction := a.device.FindLocalTransaction(transactionId)\n\t\t\t\tif transaction != nil {\n\t\t\t\t\ttransaction.NextPacketCh <- pkt\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tpd := &core.PacketData{\n\t\t\t\tBasePacket: pkt,\n\t\t\t\tConnData:   conn.ConnData,\n\t\t\t\tInitTime:   atomic.LoadInt64(&conn.ConnData.LastLocalRecvTime),\n\t\t\t}\n\t\t\t// generic receive\n\t\t\ta.device.RecvPacketToMsg(pd)\n\n\t\tcase <-conn.ConnData.BlockSignal:\n\t\t\tlog.Critical(\"blocking address %s\", addrStr)\n\t\t\treturn\n\t\t}\n\t}\n}\n\nfunc (a *UdpAC) recvMessageRoutine() {\n\tdefer a.wg.Done()\n\tdefer log.Info(\"recvMessageRoutine stopped\")\n\n\tlog.Info(\"recvMessageRoutine started\")\n\n\tfor {\n\t\tselect {\n\t\tcase <-a.signals.stop:\n\t\t\treturn\n\n\t\tcase ppd, ok := <-a.recvMsgCh:\n\t\t\tif !ok {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif ppd == nil {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tswitch ppd.HeaderType {\n\t\t\tcase core.NHP_AOP:\n\t\t\t\t// deal with NHP_AOP message\n\t\t\t\ta.wg.Add(1)\n\t\t\t\tgo func(p *core.PacketParserData) {\n\t\t\t\t\t_ = a.HandleUdpACOperations(p)\n\t\t\t\t}(ppd)\n\t\t\t}\n\t\t}\n\t}\n}\n\n// keep interaction between ac and server in certain time interval to keep outwards ip path active\nfunc (a *UdpAC) maintainServerConnectionRoutine() {\n\tdefer a.wg.Done()\n\tdefer log.Info(\"maintainServerConnectionRoutine stopped\")\n\n\tlog.Info(\"maintainServerConnectionRoutine started\")\n\n\t// reset iptables before exiting\n\tif a.config.FilterMode == FilterMode_IPTABLES {\n\t\tdefer a.iptables.ResetAllInput()\n\t}\n\n\tvar discoveryRoutineWg sync.WaitGroup\n\tdefer discoveryRoutineWg.Wait()\n\n\tfor {\n\t\t// make a local copy of servers then iterate because next operations are time consuming (too long to use locked iteration)\n\t\ta.serverPeerMutex.Lock()\n\t\tvar serverCount int32 = int32(len(a.serverPeerMap))\n\t\tdiscoveryQuitArr := make([]chan struct{}, 0, serverCount)\n\t\tdiscoveryFailStatusArr := make([]*int32, 0, serverCount)\n\n\t\tfor _, server := range a.serverPeerMap {\n\t\t\t// launch discovery routine for each server\n\t\t\tfail := new(int32)\n\t\t\tdiscoveryFailStatusArr = append(discoveryFailStatusArr, fail)\n\t\t\tquit := make(chan struct{})\n\t\t\tdiscoveryQuitArr = append(discoveryQuitArr, quit)\n\n\t\t\tdiscoveryRoutineWg.Add(1)\n\t\t\tgo a.serverDiscovery(server, &discoveryRoutineWg, fail, quit)\n\t\t}\n\t\ta.serverPeerMutex.Unlock()\n\n\t\t// check whether all server discovery failed.\n\t\t// If so, open all blocked input\n\t\tquitCheck := make(chan struct{})\n\t\tdiscoveryQuitArr = append(discoveryQuitArr, quitCheck)\n\t\tdiscoveryRoutineWg.Add(1)\n\t\tgo func() {\n\t\t\tdefer discoveryRoutineWg.Done()\n\n\t\t\tfor {\n\t\t\t\tselect {\n\t\t\t\tcase <-a.signals.stop:\n\t\t\t\t\treturn\n\t\t\t\tcase <-quitCheck:\n\t\t\t\t\treturn\n\t\t\t\tcase <-time.After(MinialServerDiscoveryInterval * time.Second):\n\t\t\t\t\tvar totalFail int32\n\t\t\t\t\tfor _, status := range discoveryFailStatusArr {\n\t\t\t\t\t\ttotalFail += atomic.LoadInt32(status)\n\t\t\t\t\t}\n\n\t\t\t\t\tif totalFail < int32(len(discoveryFailStatusArr)) {\n\t\t\t\t\t\tif a.config.FilterMode == FilterMode_IPTABLES {\n\t\t\t\t\t\t\ta.iptables.ResetAllInput()\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif a.config.FilterMode == FilterMode_IPTABLES {\n\t\t\t\t\t\t\ta.iptables.AcceptAllInput()\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}()\n\n\t\tselect {\n\t\tcase <-a.signals.stop:\n\t\t\treturn\n\t\tcase _, ok := <-a.signals.serverMapUpdated:\n\t\t\tif !ok {\n\t\t\t\treturn\n\t\t\t}\n\t\t\t// stop all current discovery routines\n\t\t\tfor _, q := range discoveryQuitArr {\n\t\t\t\tclose(q)\n\t\t\t}\n\t\t\t// continue and restart with new server discovery cycle\n\t\t}\n\t}\n}\n\nfunc (a *UdpAC) serverDiscovery(server *core.UdpPeer, discoveryRoutineWg *sync.WaitGroup, serverFailCount *int32, quit <-chan struct{}) {\n\tdefer discoveryRoutineWg.Done()\n\n\tacId := a.config.ACId\n\tsendAddr := server.SendAddr()\n\tif sendAddr == nil {\n\t\tlog.Error(\"Cannot connect to nil server address\")\n\t\treturn\n\t}\n\n\taddrStr := sendAddr.String()\n\n\tdefer log.Info(\"server discovery sub-routine at %s stopped\", addrStr)\n\tlog.Info(\"server discovery sub-routine at %s started\", addrStr)\n\n\tvar failCount int\n\n\tfor {\n\t\tvar lastSendTime int64\n\t\tvar lastRecvTime int64\n\t\tvar connected bool\n\n\t\t// find whether connection is already connected\n\t\ta.remoteConnectionMutex.Lock()\n\t\tconn, found := a.remoteConnectionMap[addrStr]\n\t\ta.remoteConnectionMutex.Unlock()\n\n\t\tif found {\n\t\t\t// connection based timing\n\t\t\tlastSendTime = atomic.LoadInt64(&conn.ConnData.LastLocalSendTime)\n\t\t\tlastRecvTime = atomic.LoadInt64(&conn.ConnData.LastLocalRecvTime)\n\t\t\tconnected = conn.connected.Load()\n\t\t} else {\n\t\t\t// peer based timing\n\t\t\tconn = nil\n\t\t\tlastSendTime = server.LastSendTime()\n\t\t\tlastRecvTime = server.LastRecvTime()\n\t\t}\n\n\t\tcurrTime := time.Now().UnixNano()\n\t\tpeerPbk := server.PublicKey()\n\n\t\t// when a server is not connected, try to connect in every ACLocalTransactionResponseTimeoutMs\n\t\t// when a server is connected when ServerConnectionInterval is reached since last receive, try resend NHP_AOL for maintaining server connection\n\t\tif !connected || (currTime-lastRecvTime) > int64(ReportToServerInterval*time.Second) {\n\t\t\t// send NHP_AOL message to server\n\t\t\taolMsg := &common.ACOnlineMsg{\n\t\t\t\tACId:          acId,\n\t\t\t\tAuthServiceId: a.config.AuthServiceId,\n\t\t\t\tResourceIds:   a.config.ResourceIds,\n\t\t\t}\n\t\t\taolBytes, _ := json.Marshal(aolMsg)\n\n\t\t\taolMd := &core.MsgData{\n\t\t\t\tRemoteAddr:    sendAddr.(*net.UDPAddr),\n\t\t\t\tHeaderType:    core.NHP_AOL,\n\t\t\t\tCipherScheme:  a.config.DefaultCipherScheme,\n\t\t\t\tTransactionId: a.device.NextCounterIndex(),\n\t\t\t\tCompress:      true,\n\t\t\t\tPeerPk:        peerPbk,\n\t\t\t\tMessage:       aolBytes,\n\t\t\t\tResponseMsgCh: make(chan *core.PacketParserData),\n\t\t\t}\n\n\t\t\tif !a.IsRunning() {\n\t\t\t\tlog.Error(\"ac(%s#%d)[ACOnline] MsgData channel closed or being closed, skip sending\", acId, aolMd.TransactionId)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\ta.sendMsgCh <- aolMd // create new connection\n\t\t\tserver.UpdateSend(currTime)\n\n\t\t\t// block until transaction completes or timeouts\n\t\t\tppd := <-aolMd.ResponseMsgCh\n\t\t\tclose(aolMd.ResponseMsgCh)\n\n\t\t\tvar err error\n\t\t\tfunc() {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tif conn != nil {\n\t\t\t\t\t\t\tconn.connected.Store(false)\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfailCount += 1\n\t\t\t\t\t\tif failCount%ServerDiscoveryRetryBeforeFail == 0 {\n\t\t\t\t\t\t\tatomic.StoreInt32(serverFailCount, 1)\n\t\t\t\t\t\t\t// remove failed connection\n\t\t\t\t\t\t\ta.remoteConnectionMutex.Lock()\n\t\t\t\t\t\t\tconn = a.remoteConnectionMap[addrStr]\n\t\t\t\t\t\t\tif conn != nil {\n\t\t\t\t\t\t\t\tlog.Info(\"server discovery failed, close local connection: %s\", conn.ConnData.LocalAddr.String())\n\t\t\t\t\t\t\t\tdelete(a.remoteConnectionMap, addrStr)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\ta.remoteConnectionMutex.Unlock()\n\t\t\t\t\t\t\tconn.Close()\n\t\t\t\t\t\t}\n\t\t\t\t\t\tlog.Error(\"ac(%s#%d)[ACOnline] reporting to server %s failed\", acId, aolMd.TransactionId, addrStr)\n\t\t\t\t\t}\n\n\t\t\t\t}()\n\n\t\t\t\tif ppd.Error != nil {\n\t\t\t\t\tlog.Error(\"ac(%s#%d)[ACOnline] failed to receive response from server %s: %v\", acId, aolMd.TransactionId, addrStr, ppd.Error)\n\t\t\t\t\terr = ppd.Error\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif ppd.HeaderType != core.NHP_AAK {\n\t\t\t\t\tlog.Error(\"ac(%s#%d)[ACOnline] response from server %s has wrong type: %s\", acId, aolMd.TransactionId, addrStr, core.HeaderTypeToString(ppd.HeaderType))\n\t\t\t\t\terr = common.ErrTransactionRepliedWithWrongType\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\taakMsg := &common.ServerACAckMsg{}\n\t\t\t\terr = json.Unmarshal(ppd.BodyMessage, aakMsg)\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Error(\"ac(%s#%d)[HandleACAck] failed to parse %s message: %v\", acId, ppd.SenderTrxId, core.HeaderTypeToString(ppd.HeaderType), err)\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t// server discovery succeeded\n\t\t\t\tfailCount = 0\n\t\t\t\tatomic.StoreInt32(serverFailCount, 0)\n\t\t\t\ta.remoteConnectionMutex.Lock()\n\t\t\t\tconn = a.remoteConnectionMap[addrStr] // conn must be available at this point\n\t\t\t\tconn.connected.Store(true)\n\t\t\t\tconn.externalAddr = aakMsg.ACAddr\n\t\t\t\ta.remoteConnectionMutex.Unlock()\n\t\t\t\tlog.Info(\"ac(%s#%d)[ACOnline] succeed. ac external address is %s, replied by server %s\", acId, aolMd.TransactionId, aakMsg.ACAddr, addrStr)\n\t\t\t}()\n\n\t\t} else if connected {\n\t\t\tif (currTime - lastSendTime) > int64(ServerKeepaliveInterval*time.Second) {\n\t\t\t\t// send NHP_KPL to server if no send happens within ServerKeepaliveInterval\n\t\t\t\tmd := &core.MsgData{\n\t\t\t\t\tRemoteAddr:   sendAddr.(*net.UDPAddr),\n\t\t\t\t\tHeaderType:   core.NHP_KPL,\n\t\t\t\t\tCipherScheme: a.config.DefaultCipherScheme,\n\t\t\t\t\t//PeerPk:        peerPbk, // pubkey not needed\n\t\t\t\t\tTransactionId: a.device.NextCounterIndex(),\n\t\t\t\t}\n\n\t\t\t\ta.sendMsgCh <- md // send NHP_KPL to server via existing connection\n\t\t\t\tserver.UpdateSend(currTime)\n\t\t\t}\n\t\t}\n\n\t\tselect {\n\t\tcase <-a.signals.stop:\n\t\t\treturn\n\t\tcase <-quit:\n\t\t\treturn\n\t\tcase <-time.After(MinialServerDiscoveryInterval * time.Second):\n\t\t\t// wait for ServerConnectionDiscoveryInterval\n\t\t}\n\t}\n}\n\nfunc (a *UdpAC) AddServerPeer(server *core.UdpPeer) {\n\tif server.DeviceType() == core.NHP_SERVER {\n\t\ta.device.AddPeer(server)\n\n\t\ta.serverPeerMutex.Lock()\n\t\ta.serverPeerMap[server.PublicKeyBase64()] = server\n\t\ta.serverPeerMutex.Unlock()\n\n\t\t// renew server connection cycle\n\t\tif len(a.signals.serverMapUpdated) == 0 {\n\t\t\ta.signals.serverMapUpdated <- struct{}{}\n\t\t}\n\t}\n}\n\nfunc (a *UdpAC) RemoveServerPeer(serverKey string) {\n\ta.serverPeerMutex.Lock()\n\tbeforeSize := len(a.serverPeerMap)\n\tdelete(a.serverPeerMap, serverKey)\n\tafterSize := len(a.serverPeerMap)\n\ta.serverPeerMutex.Unlock()\n\n\tif beforeSize != afterSize {\n\t\t// renew server connection cycle\n\t\tif len(a.signals.serverMapUpdated) == 0 {\n\t\t\ta.signals.serverMapUpdated <- struct{}{}\n\t\t}\n\t}\n}\n\nfunc (a *UdpAC) GetConfig() *Config {\n\treturn a.config // return  config\n}\n"
  },
  {
    "path": "endpoints/agent/config.go",
    "content": "package agent\n\nimport (\n\t\"encoding/base64\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"path/filepath\"\n\n\ttoml \"github.com/pelletier/go-toml/v2\"\n\n\t\"github.com/OpenNHP/opennhp/nhp/common\"\n\t\"github.com/OpenNHP/opennhp/nhp/core\"\n\t\"github.com/OpenNHP/opennhp/nhp/log\"\n\t\"github.com/OpenNHP/opennhp/nhp/utils\"\n)\n\nvar (\n\tbaseConfigWatch     io.Closer\n\tdhpConfigWatch      io.Closer\n\tserverConfigWatch   io.Closer\n\tresourceConfigWatch io.Closer\n\n\terrLoadConfig = fmt.Errorf(\"config load error\")\n\n\tsecretCreated = \"/var/run/secret.created\"\n)\n\ntype Config struct {\n\tLogLevel            int    `json:\"logLevel\"`\n\tDefaultCipherScheme int    `json:\"defaultCipherScheme\"`\n\tPrivateKeyBase64    string `json:\"privateKey\"`\n\tKnockUser           `mapstructure:\",squash\"`\n\t*DHPConfig\n}\n\ntype DHPConfig struct {\n\tTEEPrivateKeyBase64 string `json:\"teePrivateKeyBase64\"`\n}\n\nfunc (c *Config) GetAgentEcdh() core.Ecdh {\n\teccType := core.ECC_SM2\n\tif c.DefaultCipherScheme == common.CIPHER_SCHEME_CURVE {\n\t\teccType = core.ECC_CURVE25519\n\t}\n\tteePrk, _ := base64.StdEncoding.DecodeString(c.PrivateKeyBase64)\n\treturn core.ECDHFromKey(eccType, teePrk)\n}\n\nfunc (c *Config) GetTeeEcdh() core.Ecdh {\n\teccType := core.ECC_SM2\n\tif c.DefaultCipherScheme == common.CIPHER_SCHEME_CURVE {\n\t\teccType = core.ECC_CURVE25519\n\t}\n\tteePrk, _ := base64.StdEncoding.DecodeString(c.TEEPrivateKeyBase64)\n\treturn core.ECDHFromKey(eccType, teePrk)\n}\n\nfunc (c *Config) GetEccType() core.EccTypeEnum {\n\teccType := core.ECC_SM2\n\tif c.DefaultCipherScheme == common.CIPHER_SCHEME_CURVE {\n\t\teccType = core.ECC_CURVE25519\n\t}\n\treturn eccType\n}\n\ntype Peers struct {\n\tServers []*core.UdpPeer\n}\n\ntype Resources struct {\n\tResources []*KnockResource\n}\n\nfunc (a *UdpAgent) loadBaseConfig() error {\n\t// config.toml\n\tfileName := filepath.Join(ExeDirPath, \"etc\", \"config.toml\")\n\tif err := a.updateBaseConfig(fileName); err != nil {\n\t\t// report base config error\n\t\treturn err\n\t}\n\n\tbaseConfigWatch = utils.WatchFile(fileName, func() {\n\t\tlog.Info(\"base config: %s has been updated\", fileName)\n\t\t_ = a.updateBaseConfig(fileName)\n\t})\n\treturn nil\n}\n\nfunc (a *UdpAgent) loadDHPConfig() error {\n\t// dhp.toml\n\tfileName := filepath.Join(ExeDirPath, \"etc\", \"dhp.toml\")\n\tif err := a.updateDHPConfig(fileName); err != nil {\n\t\t// ignore error\n\t\t_ = err\n\t}\n\n\tdhpConfigWatch = utils.WatchFile(fileName, func() {\n\t\tlog.Info(\"DHP config: %s has been updated\", fileName)\n\t\t_ = a.updateDHPConfig(fileName)\n\t})\n\n\treturn nil\n}\n\nfunc (a *UdpAgent) loadPeers() error {\n\t// server.toml\n\tfileName := filepath.Join(ExeDirPath, \"etc\", \"server.toml\")\n\tif err := a.updateServerPeers(fileName); err != nil {\n\t\t// ignore error\n\t\t_ = err\n\t}\n\n\tserverConfigWatch = utils.WatchFile(fileName, func() {\n\t\tlog.Info(\"server peer config: %s has been updated\", fileName)\n\t\t_ = a.updateServerPeers(fileName)\n\t})\n\n\treturn nil\n}\n\nfunc (a *UdpAgent) loadResources() error {\n\t// resource.toml\n\tfileName := filepath.Join(ExeDirPath, \"etc\", \"resource.toml\")\n\tif err := a.updateResources(fileName); err != nil {\n\t\t// ignore error\n\t\t_ = err\n\t}\n\n\tresourceConfigWatch = utils.WatchFile(fileName, func() {\n\t\tlog.Info(\"resource config: %s has been updated\", fileName)\n\t\t_ = a.updateResources(fileName)\n\t})\n\n\treturn nil\n}\n\nfunc (a *UdpAgent) updateBaseConfig(file string) (err error) {\n\tutils.CatchPanicThenRun(func() {\n\t\terr = errLoadConfig\n\t})\n\n\tcontent, err := os.ReadFile(file)\n\tif err != nil {\n\t\tlog.Error(\"failed to read base config: %v\", err)\n\t}\n\n\tvar conf Config\n\tif err := toml.Unmarshal(content, &conf); err != nil {\n\t\tlog.Error(\"failed to unmarshal base config: %v\", err)\n\t}\n\n\ta.knockUserMutex.Lock()\n\ta.knockUser = &KnockUser{\n\t\tUserId:         conf.UserId,\n\t\tOrganizationId: conf.OrganizationId,\n\t\tUserData:       conf.UserData,\n\t}\n\ta.knockUserMutex.Unlock()\n\n\tif a.config == nil {\n\t\ta.config = &conf\n\t\ta.log.SetLogLevel(conf.LogLevel)\n\t\treturn err\n\t}\n\n\t// update\n\tif a.config.LogLevel != conf.LogLevel {\n\t\tlog.Info(\"set base log level to %d\", conf.LogLevel)\n\t\ta.log.SetLogLevel(conf.LogLevel)\n\t\ta.config.LogLevel = conf.LogLevel\n\t}\n\n\tif a.config.DefaultCipherScheme != conf.DefaultCipherScheme {\n\t\tlog.Info(\"set default cipher scheme to %d\", conf.DefaultCipherScheme)\n\t\ta.config.DefaultCipherScheme = conf.DefaultCipherScheme\n\t}\n\n\treturn err\n}\n\nfunc (a *UdpAgent) updateDHPConfig(file string) (err error) {\n\tutils.CatchPanicThenRun(func() {\n\t\terr = errLoadConfig\n\t})\n\n\tcontent, err := os.ReadFile(file)\n\tif err != nil {\n\t\tlog.Error(\"failed to read DHP config: %v\", err)\n\t}\n\n\tvar conf DHPConfig\n\tif err := toml.Unmarshal(content, &conf); err != nil {\n\t\tlog.Error(\"failed to unmarshal DHP config: %v\", err)\n\t}\n\n\tif a.config.DHPConfig == nil {\n\t\ta.config.DHPConfig = &conf\n\t\treturn err\n\t}\n\n\treturn err\n}\n\nfunc (a *UdpAgent) updateServerPeers(file string) (err error) {\n\tutils.CatchPanicThenRun(func() {\n\t\terr = errLoadConfig\n\t})\n\n\tcontent, err := os.ReadFile(file)\n\tif err != nil {\n\t\tlog.Error(\"failed to read server peer config: %v\", err)\n\t}\n\n\t// update\n\tvar peers Peers\n\tserverPeerMap := make(map[string]*core.UdpPeer)\n\tif err := toml.Unmarshal(content, &peers); err != nil {\n\t\tlog.Error(\"failed to unmarshal server config: %v\", err)\n\t}\n\tfor _, p := range peers.Servers {\n\t\tp.Type = core.NHP_SERVER\n\t\ta.device.AddPeer(p)\n\t\tserverPeerMap[p.PublicKeyBase64()] = p\n\t}\n\n\t// remove old peers from device\n\ta.serverPeerMutex.Lock()\n\tdefer a.serverPeerMutex.Unlock()\n\tfor pubKey := range a.serverPeerMap {\n\t\tif _, found := serverPeerMap[pubKey]; !found {\n\t\t\ta.device.RemovePeer(pubKey)\n\t\t}\n\t}\n\ta.serverPeerMap = serverPeerMap\n\n\treturn err\n}\n\nfunc (a *UdpAgent) updateResources(file string) (err error) {\n\tutils.CatchPanicThenRun(func() {\n\t\terr = errLoadConfig\n\t})\n\n\tcontent, err := os.ReadFile(file)\n\tif err != nil {\n\t\tlog.Error(\"failed to read resource config: %v\", err)\n\t}\n\n\tvar resources Resources\n\ttargetMap := make(map[string]*KnockTarget)\n\tif err := toml.Unmarshal(content, &resources); err != nil {\n\t\tlog.Error(\"failed to unmarshal resource config: %v\", err)\n\t}\n\tfor _, res := range resources.Resources {\n\t\tpeer := a.FindServerPeerFromResource(res)\n\t\tif peer == nil {\n\t\t\tlog.Error(\"failed to find corresponding server peer for resource %s\", res.Id())\n\t\t\tcontinue\n\t\t}\n\t\ttargetMap[res.Id()] = &KnockTarget{\n\t\t\tKnockResource: *res,\n\t\t\tServerPeer:    peer,\n\t\t}\n\t}\n\n\tif a.knockTargetMap == nil {\n\t\ta.knockTargetMap = targetMap\n\t\treturn err\n\t}\n\n\t// update\n\ta.knockTargetMapMutex.Lock()\n\ta.knockTargetMap = targetMap\n\ta.knockTargetMapMutex.Unlock()\n\n\t// renew knock cycle\n\tif len(a.signals.knockTargetMapUpdated) == 0 {\n\t\ta.signals.knockTargetMapUpdated <- struct{}{}\n\t}\n\n\treturn err\n}\n\nfunc (a *UdpAgent) StopConfigWatch() {\n\tif baseConfigWatch != nil {\n\t\tbaseConfigWatch.Close()\n\t}\n\tif dhpConfigWatch != nil {\n\t\tdhpConfigWatch.Close()\n\t}\n\tif serverConfigWatch != nil {\n\t\tserverConfigWatch.Close()\n\t}\n\tif resourceConfigWatch != nil {\n\t\tresourceConfigWatch.Close()\n\t}\n}\n\nfunc (a *UdpAgent) NewEcdhFromConfigFile() (core.Ecdh, error) {\n\tfileName := filepath.Join(ExeDirPath, \"etc\", \"config.toml\")\n\n\tcontent, err := os.ReadFile(fileName)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar conf Config\n\tif err := toml.Unmarshal(content, &conf); err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn core.NewECDH(conf.GetEccType()), nil\n}\n\nfunc (a *UdpAgent) RotateTeeKey() error {\n\tfileName := filepath.Join(ExeDirPath, \"etc\", \"dhp.toml\")\n\n\tecdh, err := a.NewEcdhFromConfigFile()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif err := utils.UpdateTomlConfig(fileName, \"TEEPrivateKeyBase64\", ecdh.PrivateKeyBase64()); err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\nfunc (a *UdpAgent) RotateAgentKey() error {\n\tfileName := filepath.Join(ExeDirPath, \"etc\", \"config.toml\")\n\n\tecdh, err := a.NewEcdhFromConfigFile()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif err := utils.UpdateTomlConfig(fileName, \"PrivateKeyBase64\", ecdh.PrivateKeyBase64()); err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\nfunc (a *UdpAgent) InitializeSecret() error {\n\tif _, err := os.Stat(secretCreated); os.IsNotExist(err) {\n\t\terr := a.RotateAgentKey()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\terr = a.RotateTeeKey()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\t_, err = os.Create(secretCreated)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "endpoints/agent/constants.go",
    "content": "package agent\n\nimport \"github.com/OpenNHP/opennhp/nhp/common\"\n\nconst (\n\tMaxConcurrentConnection      = 256\n\tDefaultConnectionTimeoutMs   = common.ClientSideConnectionTimeoutMs\n\tPacketQueueSizePerConnection = 64 // nhp agent does not need large transactions\n)\n"
  },
  {
    "path": "endpoints/agent/iossdk/export.go",
    "content": "package iossdk\n\nimport \"C\"\nimport (\n\t\"encoding/base64\"\n\t\"encoding/json\"\n\t\"fmt\"\n\n\t_ \"golang.org/x/mobile/bind\"\n\n\t\"github.com/OpenNHP/opennhp/endpoints/agent\"\n\t\"github.com/OpenNHP/opennhp/nhp/common\"\n\t\"github.com/OpenNHP/opennhp/nhp/core\"\n)\n\nvar gAgentInstance *agent.UdpAgent\nvar gWorkingDir string\nvar gLogLevel int\n\n// Initialization of the nhp_agent instance working directory path:\n// The configuration files to be read are located under workingdir/etc/,\n// and log files will be generated under workingdir/logs/.\n//\n// Input:\n// workingDir: the working directory path for the agent\n// logLevel: 0: silent, 1: error, 2: info, 3: debug, 4: verbose\n//\n// Return:\n// Whether agent instance has been initialized successfully.\nfunc NhpAgentInit(workingDir string, logLevel int) bool {\n\tif gAgentInstance != nil {\n\t\treturn true\n\t}\n\n\tgAgentInstance = &agent.UdpAgent{}\n\terr := gAgentInstance.Start(workingDir, logLevel)\n\tif err != nil {\n\t\treturn false\n\t}\n\n\treturn true\n}\n\n// Synchronously stop and release nhp_\nfunc NhpAgentClose() {\n\tif gAgentInstance == nil {\n\t\treturn\n\t}\n\n\tgAgentInstance.Stop()\n\tgAgentInstance = nil\n}\n\n// Read the user information, resource information, server information,\n// and other configuration files written under workingdir/etc,\n// and asynchronously start the loop knocking thread.\n//\n// Input: None\n//\n// Return:\n// -1: Uninitialized error\n// >=0: The number of resources requested to knock by the knocking thread at the time of the call\n//\n//\t(knocking resources will be synchronized with changes in the configuration in workingdir/etc/resource.toml).\n//\n//export NhpAgentKnockloopStart\nfunc NhpAgentKnockloopStart() int {\n\tif gAgentInstance == nil {\n\t\treturn -1\n\t}\n\n\tcount := gAgentInstance.StartKnockLoop()\n\treturn count\n}\n\n// Synchronously stop the loop, knock-on sub thread.\nfunc NhpAgentKnockloopStop() {\n\tif gAgentInstance == nil {\n\t\treturn\n\t}\n\n\tgAgentInstance.StopKnockLoop()\n}\n\n// Setting agent's represented user information\n//\n// Input:\n// userId: User identification (optional, but not recommended to be empty)\n// devId: Device identification (optional)\n// orgId: Organization or company identification (optional)\n// userData: Additional fields required to interface with backend services (json format string, optional)\n//\n// Return:\n// Whether the user information is set successfully\nfunc NhpAgentSetKnockUser(userId string, devId string, orgId string, userData string) bool {\n\tif gAgentInstance == nil {\n\t\treturn false\n\t}\n\tvar data map[string]any\n\tif len(userData) > 0 {\n\t\terr := json.Unmarshal([]byte(userData), &data)\n\t\tif err != nil {\n\t\t\treturn false\n\t\t}\n\t}\n\n\tgAgentInstance.SetDeviceId(devId)\n\tgAgentInstance.SetKnockUser(userId, orgId, data)\n\treturn true\n}\n\n// Add an NHP server information to the agent for use in knocking on the door\n// (the agent can initiate different knocking requests to multiple NHP servers).\n//\n// Input:\n// pubkey: Public key of the NHP server\n// ip: IP address of the NHP server\n// host: Domain name of the NHP server (if a domain name is set, the ip item is optional)\n// port: Port number for the NHP server to operate (if set to 0, the default port 62206 will be used)\n// expire: Expiration time of the NHP server's public key (in epoch seconds, set to 0 for permanent)\n//\n// Return:\n// Whether the server information has been successfully added.\nfunc NhpAgentAddServer(pubkey string, ip string, host string, port int, expire int64) bool {\n\tif gAgentInstance == nil {\n\t\treturn false\n\t}\n\n\tif len(pubkey) == 0 || (len(ip) == 0 && len(host) == 0) {\n\t\treturn false\n\t}\n\n\tserverPort := port\n\tif serverPort == 0 {\n\t\tserverPort = 62206 // use default server listening port\n\t}\n\n\tserverPeer := &core.UdpPeer{\n\t\tType:         core.NHP_SERVER,\n\t\tPubKeyBase64: pubkey,\n\t\tIp:           ip,\n\t\tPort:         serverPort,\n\t\tHostname:     host,\n\t\tExpireTime:   expire,\n\t}\n\tgAgentInstance.AddServer(serverPeer)\n\treturn true\n}\n\n// Delete NHP server information from the agent\n//\n// Input:\n// pubkey: NHP server public key\nfunc NhpAgentRemoveServer(pubkey string) {\n\tif gAgentInstance == nil {\n\t\treturn\n\t}\n\tif len(pubkey) == 0 {\n\t\treturn\n\t}\n\n\tgAgentInstance.RemoveServer(pubkey)\n}\n\n// Please add a resource information for the agent to use for knocking on the door\n// (the agent can initiate a knock-on request for different resources)\n//\n// Input:\n// aspId: Authentication Service Provider Identifier\n// resId: Resource Identifier\n// serverIp: NHP server IP address or domain name (the NHP server managing the resource)\n// serverHostname: NHP server domain name (the NHP server managing the resource)\n// serverPort: NHP server port (the NHP server managing the resource)\n//\n// Return:\n// Whether the resource information has been added successfully\nfunc NhpAgentAddResource(aspId string, resId string, serverIp string, serverHostname string, serverPort int) bool {\n\tif gAgentInstance == nil {\n\t\treturn false\n\t}\n\n\tif len(aspId) == 0 || len(resId) == 0 || (len(serverIp) == 0 && len(serverHostname) == 0) {\n\t\treturn false\n\t}\n\n\tresource := &agent.KnockResource{\n\t\tAuthServiceId:  aspId,\n\t\tResourceId:     resId,\n\t\tServerIp:       serverIp,\n\t\tServerHostname: serverHostname,\n\t\tServerPort:     serverPort,\n\t}\n\terr := gAgentInstance.AddResource(resource)\n\treturn err == nil\n}\n\n// Delete resource information from the agent\n//\n// Input:\n// aspId: Authentication Service Provider Identifier\n// resId: Resource Identifier\nfunc NhpAgentRemoveResource(aspId string, resId string) {\n\tif gAgentInstance == nil {\n\t\treturn\n\t}\n\n\tif len(aspId) == 0 || len(resId) == 0 {\n\t\treturn\n\t}\n\n\tgAgentInstance.RemoveResource(aspId, resId)\n}\n\n// The agent initiates a single knock on the door request to the server hosting the resource\n//\n// Input:\n// aspId: Authentication service provider identifier\n// resId: Resource identifier\n// serverIp: NHP server IP address or domain name (the NHP server managing the resource)\n// serverHostname: NHP server domain name (the NHP server managing the resource)\n// serverPort: NHP server port (the NHP server managing the resource)\n//\n// Returns:\n// The server's response message (json format string buffer pointer):\n// \"errCode\": Error code (string, \"0\" indicates success)\n// \"errMsg\": Error message (string)\n// \"resHost\": Resource server address (\"resHost\": {\"Server Name 1\":\"Server Hostname 1\", \"Server Name 2\":\"Server Hostname 2\", ...})\n// \"opnTime\": Door opening duration (integer, in seconds)\n// \"aspToken\": Token generated after authentication by the ASP (optional)\n// \"agentAddr\": Agent's IP address from the perspective of the NHP server\n// \"preActs\": Pre-connection information related to the resource (optional)\n// \"redirectUrl\": HTTP redirection link (optional)\n//\n// It is necessary to call NhpAgentAddServer before calling,\n// to add the NHP server's public key, address, and other information to the agent\n// The caller is responsible for calling NhpFreeCstring to release the returned char* pointer\nfunc NhpAgentKnockResource(aspId string, resId string, serverIp string, serverHostname string, serverPort int) string {\n\tackMsg := &common.ServerKnockAckMsg{}\n\n\tfunc() {\n\t\tif gAgentInstance == nil {\n\t\t\tackMsg.ErrCode = common.ErrNoAgentInstance.ErrorCode()\n\t\t\tackMsg.ErrMsg = common.ErrNoAgentInstance.Error()\n\t\t\treturn\n\t\t}\n\n\t\tif len(aspId) == 0 || len(resId) == 0 || (len(serverIp) == 0 && len(serverHostname) == 0) {\n\t\t\tackMsg.ErrCode = common.ErrInvalidInput.ErrorCode()\n\t\t\tackMsg.ErrMsg = common.ErrInvalidInput.Error()\n\t\t\treturn\n\t\t}\n\n\t\tresource := &agent.KnockResource{\n\t\t\tAuthServiceId:  aspId,\n\t\t\tResourceId:     resId,\n\t\t\tServerIp:       serverIp,\n\t\t\tServerHostname: serverHostname,\n\t\t\tServerPort:     serverPort,\n\t\t}\n\n\t\tpeer := gAgentInstance.FindServerPeerFromResource(resource)\n\t\tif peer == nil {\n\t\t\tackMsg.ErrCode = common.ErrKnockServerNotFound.ErrorCode()\n\t\t\tackMsg.ErrMsg = common.ErrKnockServerNotFound.Error()\n\t\t\treturn\n\t\t}\n\n\t\ttarget := &agent.KnockTarget{\n\t\t\tKnockResource: *resource,\n\t\t\tServerPeer:    peer,\n\t\t}\n\n\t\tackMsg, _ = gAgentInstance.Knock(target)\n\t}()\n\n\tbytes, _ := json.Marshal(ackMsg)\n\n\treturn string(bytes)\n}\n\n// The agent explicitly informs the NHP server to exit its access permission to the resource.\n//\n// Input:\n// aspId: Authentication Service Provider Identifier\n// resId: Resource Identifier\n// serverIp: NHP server IP address or domain name (the NHP server managing the resource)\n// serverHostname: NHP server domain name (the NHP server managing the resource)\n// serverPort: NHP server port (the NHP server managing the resource)\n//\n// Return:\n// Whether the exit was successful\n//\n// It is necessary to call NhpAgentAddServer before calling, to add the NHP server's public key, address, and other information to the\nfunc NhpAgentExitResource(aspId string, resId string, serverIp string, serverHostname string, serverPort int) bool {\n\tvar err error\n\tackMsg := &common.ServerKnockAckMsg{}\n\n\tfunc() {\n\t\tif gAgentInstance == nil {\n\t\t\tackMsg.ErrCode = common.ErrNoAgentInstance.ErrorCode()\n\t\t\tackMsg.ErrMsg = common.ErrNoAgentInstance.Error()\n\t\t\terr = common.ErrNoAgentInstance\n\t\t\treturn\n\t\t}\n\n\t\tif len(aspId) == 0 || len(resId) == 0 || (len(serverIp) == 0 && len(serverHostname) == 0) {\n\t\t\tackMsg.ErrCode = common.ErrInvalidInput.ErrorCode()\n\t\t\tackMsg.ErrMsg = common.ErrInvalidInput.Error()\n\t\t\terr = common.ErrInvalidInput\n\t\t\treturn\n\t\t}\n\n\t\tresource := &agent.KnockResource{\n\t\t\tAuthServiceId:  aspId,\n\t\t\tResourceId:     resId,\n\t\t\tServerIp:       serverIp,\n\t\t\tServerHostname: serverHostname,\n\t\t\tServerPort:     serverPort,\n\t\t}\n\n\t\tpeer := gAgentInstance.FindServerPeerFromResource(resource)\n\t\tif peer == nil {\n\t\t\tackMsg.ErrCode = common.ErrKnockServerNotFound.ErrorCode()\n\t\t\tackMsg.ErrMsg = common.ErrKnockServerNotFound.Error()\n\t\t\terr = common.ErrKnockServerNotFound\n\t\t\treturn\n\t\t}\n\n\t\ttarget := &agent.KnockTarget{\n\t\t\tKnockResource: *resource,\n\t\t\tServerPeer:    peer,\n\t\t}\n\n\t\tackMsg, err = gAgentInstance.ExitKnockRequest(target)\n\t}()\n\n\treturn err == nil\n}\n\n// cipherType: 0-curve25519; 1-sm2\n// result: \"privatekey\"|\"publickey\"\n// caller is responsible to free the returned char* pointer\n//\n//export NhpGenerateKeys\nfunc NhpGenerateKeys(cipherType int) string {\n\tvar e core.Ecdh\n\tswitch core.EccTypeEnum(cipherType) {\n\tcase core.ECC_SM2:\n\t\te = core.NewECDH(core.ECC_SM2)\n\tcase core.ECC_CURVE25519:\n\t\tfallthrough\n\tdefault:\n\t\te = core.NewECDH(core.ECC_CURVE25519)\n\t}\n\tpub := e.PublicKeyBase64()\n\tpriv := e.PrivateKeyBase64()\n\n\tres := fmt.Sprintf(\"%s|%s\", priv, pub)\n\n\treturn res\n}\n\n// cipherType: 0-curve25519; 1-sm2\n// privateBase64: private key in base64 format\n// result: \"publickey\"\n// caller is responsible to free the returned char* pointer\n//\n//export NhpPrivkeyToPubkey\nfunc NhpPrivkeyToPubkey(cipherType int, privateBase64 string) string {\n\tprivKey := privateBase64\n\tprivKeyBytes, err := base64.StdEncoding.DecodeString(privKey)\n\tif err != nil {\n\t\treturn \"\"\n\t}\n\n\te := core.ECDHFromKey(core.EccTypeEnum(cipherType), privKeyBytes)\n\tif e == nil {\n\t\treturn \"\"\n\t}\n\tpub := e.PublicKeyBase64()\n\n\treturn pub\n}\n"
  },
  {
    "path": "endpoints/agent/knock.go",
    "content": "package agent\n\nimport (\n\t\"encoding/json\"\n\t\"net\"\n\t\"strconv\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/OpenNHP/opennhp/nhp/common\"\n\t\"github.com/OpenNHP/opennhp/nhp/core\"\n\twasmEngine \"github.com/OpenNHP/opennhp/nhp/core/wasm/engine\"\n\t\"github.com/OpenNHP/opennhp/nhp/log\"\n)\n\nfunc (a *UdpAgent) Knock(res *KnockTarget) (ackMsg *common.ServerKnockAckMsg, err error) {\n\tdefer a.wg.Done()\n\ta.wg.Add(1)\n\n\terrWaitTime := (core.AgentLocalTransactionResponseTimeoutMs - 100) * time.Millisecond\n\tstartTime := time.Now()\n\n\tackMsg, err = a.knockRequest(res, false)\n\tif err == common.ErrKnockTerminatedByCookie {\n\t\t// if cookie is required by server, use cookie to knock\n\t\t// Note: don't use recursive calling method, it may get too deep if cookie message is kept sending\n\t\t// use flat calling\n\t\tackMsg, err = a.knockRequest(res, true)\n\t}\n\tif ackMsg.ErrCode == common.ErrPacketEncryptionFailed.ErrorCode() {\n\t\t// local failure, packet not sent\n\t\treturn ackMsg, err\n\t}\n\tif err != nil {\n\t\t// if local error happens, wait some time to return\n\t\telapsedTime := time.Since(startTime)\n\t\tif elapsedTime < errWaitTime {\n\t\t\ttime.Sleep(errWaitTime - elapsedTime)\n\t\t}\n\t\treturn ackMsg, err\n\t}\n\n\t// deal with ac PASS_ACCESS_IP mode\n\tif len(ackMsg.PreAccessActions) > 0 {\n\t\tif err := a.preAccessRequest(ackMsg); err != nil {\n\t\t\tlog.Warning(\"agent(%s)[KnockRequest] pre-access request failed: %v\", a.knockUser.UserId, err)\n\t\t}\n\t}\n\tres.LastKnockSuccessTime = time.Now()\n\n\tlog.Info(\"agent(%s)[KnockRequest] knock for %s:%s success, duration %d seconds\", a.knockUser.UserId, res.AuthServiceId, res.ResourceId, ackMsg.OpenTime)\n\treturn ackMsg, err\n}\n\nfunc (a *UdpAgent) knockRequest(res *KnockTarget, useCookie bool) (ackMsg *common.ServerKnockAckMsg, err error) {\n\tserverPeer := res.GetServerPeer()\n\tif serverPeer == nil {\n\t\tlog.Critical(\"agent(%s)[KnockRequest] knock server is not assigned\", a.knockUser.UserId)\n\t\treturn nil, common.ErrKnockServerNotFound\n\t}\n\n\tsendAddr := serverPeer.SendAddr()\n\tif sendAddr == nil {\n\t\tlog.Critical(\"agent(%s)[KnockRequest] knock server IP cannot be parsed\", a.knockUser.UserId)\n\t\treturn nil, common.ErrKnockServerNotFound\n\t}\n\taddrStr := sendAddr.String()\n\n\ta.knockUserMutex.RLock()\n\tknkMsg := &common.AgentKnockMsg{\n\t\tUserId:         a.knockUser.UserId,\n\t\tDeviceId:       a.deviceId,\n\t\tOrganizationId: a.knockUser.OrganizationId,\n\t\tAuthServiceId:  res.AuthServiceId,\n\t\tResourceId:     res.ResourceId,\n\t\tCheckResults:   a.checkResults,\n\t\tUserData:       a.knockUser.UserData,\n\t}\n\ta.knockUserMutex.RUnlock()\n\n\tknkBytes, _ := json.Marshal(knkMsg)\n\tknkMd := &core.MsgData{\n\t\tRemoteAddr:    sendAddr.(*net.UDPAddr),\n\t\tHeaderType:    core.NHP_KNK,\n\t\tCipherScheme:  a.config.DefaultCipherScheme,\n\t\tTransactionId: a.device.NextCounterIndex(),\n\t\tCompress:      true,\n\t\tMessage:       knkBytes,\n\t\tPeerPk:        serverPeer.PublicKey(),\n\t\tResponseMsgCh: make(chan *core.PacketParserData),\n\t}\n\tif useCookie {\n\t\tknkMd.HeaderType = core.NHP_RKN\n\t}\n\n\tackMsg = &common.ServerKnockAckMsg{}\n\tif !a.IsRunning() {\n\t\tlog.Error(\"agent(%s#%d)[KnockRequest] MsgData channel closed or being closed, skip sending\", knkMsg.UserId, knkMd.TransactionId)\n\t\terr = common.ErrPacketToMessageRoutineStopped\n\t\tackMsg.ErrCode = common.ErrPacketToMessageRoutineStopped.ErrorCode()\n\t\tackMsg.ErrMsg = err.Error()\n\t\treturn ackMsg, err\n\t}\n\n\t// device will create or find existing connection and sends the MsgAssembler via that connection\n\ta.sendMsgCh <- knkMd\n\n\t// block until transaction completes\n\tserverPpd := <-knkMd.ResponseMsgCh\n\tclose(knkMd.ResponseMsgCh)\n\n\tif serverPpd.Error != nil {\n\t\tlog.Error(\"agent(%s#%d)[KnockRequest] failed to receive response from server %s: %v\", knkMsg.UserId, knkMd.TransactionId, addrStr, serverPpd.Error)\n\t\terr = serverPpd.Error\n\t\tackMsg.ErrCode = common.ErrPacketEncryptionFailed.ErrorCode()\n\t\tackMsg.ErrMsg = serverPpd.Error.Error()\n\t\treturn ackMsg, err\n\t}\n\n\tif serverPpd.HeaderType == core.NHP_COK {\n\t\tlog.Error(\"agent(%s#%d)[KnockRequest] terminated by server's cookie message\", knkMsg.UserId, knkMd.TransactionId)\n\t\terr = common.ErrKnockTerminatedByCookie\n\t\tackMsg.ErrCode = common.ErrKnockTerminatedByCookie.ErrorCode()\n\t\tackMsg.ErrMsg = err.Error()\n\t\treturn ackMsg, err\n\t}\n\n\tif serverPpd.HeaderType != core.NHP_ACK {\n\t\tlog.Error(\"agent(%s#%d)[KnockRequest] response has wrong type: %s\", knkMsg.UserId, knkMd.TransactionId, core.HeaderTypeToString(serverPpd.HeaderType))\n\t\terr = common.ErrTransactionRepliedWithWrongType\n\t\tackMsg.ErrCode = common.ErrTransactionRepliedWithWrongType.ErrorCode()\n\t\tackMsg.ErrMsg = err.Error()\n\t\treturn ackMsg, err\n\t}\n\n\terr = json.Unmarshal(serverPpd.BodyMessage, ackMsg)\n\tif err != nil {\n\t\tlog.Error(\"agent(%s#%d)[KnockRequest] failed to parse %s message: %v\", knkMsg.UserId, knkMd.TransactionId, core.HeaderTypeToString(serverPpd.HeaderType), err)\n\t\tackMsg.ErrCode = common.ErrJsonParseFailed.ErrorCode()\n\t\tackMsg.ErrMsg = err.Error()\n\t\treturn ackMsg, err\n\t}\n\n\tif ackMsg.ErrCode != common.ErrSuccess.ErrorCode() {\n\t\tlog.Error(\"agent(%s#%d)[KnockRequest] response error: %s\", knkMsg.UserId, knkMd.TransactionId, ackMsg.ErrMsg)\n\t\terr = common.ErrorCodeToError(ackMsg.ErrCode)\n\t\treturn ackMsg, err\n\t}\n\n\tlog.Info(\"agent(%s#%d)[KnockRequest] succeed\", knkMsg.UserId, knkMd.TransactionId)\n\treturn ackMsg, nil\n}\n\nfunc (a *UdpAgent) ExitKnockRequest(res *KnockTarget) (ackMsg *common.ServerKnockAckMsg, err error) {\n\tserverPeer := res.GetServerPeer()\n\tif serverPeer == nil {\n\t\tlog.Critical(\"agent(%s)[ExitKnockRequest] knock server is not assigned\", a.knockUser.UserId)\n\t\treturn nil, common.ErrKnockServerNotFound\n\t}\n\n\tsendAddr := serverPeer.SendAddr()\n\tif sendAddr == nil {\n\t\tlog.Critical(\"agent(%s)[ExitKnockRequest] knock server IP cannot be parsed\", a.knockUser.UserId)\n\t\treturn nil, common.ErrKnockServerNotFound\n\t}\n\taddrStr := sendAddr.String()\n\n\ta.knockUserMutex.RLock()\n\tknkMsg := &common.AgentKnockMsg{\n\t\tUserId:         a.knockUser.UserId,\n\t\tDeviceId:       a.deviceId,\n\t\tOrganizationId: a.knockUser.OrganizationId,\n\t\tAuthServiceId:  res.AuthServiceId,\n\t\tResourceId:     res.ResourceId,\n\t\tCheckResults:   a.checkResults,\n\t\tUserData:       a.knockUser.UserData,\n\t}\n\ta.knockUserMutex.RUnlock()\n\n\tknkBytes, _ := json.Marshal(knkMsg)\n\tknkMd := &core.MsgData{\n\t\tRemoteAddr:    sendAddr.(*net.UDPAddr),\n\t\tHeaderType:    core.NHP_EXT,\n\t\tCipherScheme:  a.config.DefaultCipherScheme,\n\t\tTransactionId: a.device.NextCounterIndex(),\n\t\tCompress:      true,\n\t\tMessage:       knkBytes,\n\t\tPeerPk:        serverPeer.PublicKey(),\n\t\tResponseMsgCh: make(chan *core.PacketParserData),\n\t}\n\n\tackMsg = &common.ServerKnockAckMsg{}\n\tif !a.IsRunning() {\n\t\tlog.Error(\"agent(%s#%d)[ExitKnockRequest] MsgData channel closed or being closed, skip sending\", knkMsg.UserId, knkMd.TransactionId)\n\t\terr = common.ErrPacketToMessageRoutineStopped\n\t\tackMsg.ErrCode = common.ErrPacketToMessageRoutineStopped.ErrorCode()\n\t\tackMsg.ErrMsg = err.Error()\n\t\treturn ackMsg, err\n\t}\n\n\t// device will create or find existing connection and sends the MsgAssembler via that connection\n\ta.sendMsgCh <- knkMd\n\n\t// block until transaction completes\n\tserverPpd := <-knkMd.ResponseMsgCh\n\tclose(knkMd.ResponseMsgCh)\n\n\tif serverPpd.Error != nil {\n\t\tlog.Error(\"agent(%s#%d)[ExitKnockRequest] failed to receive response from server %s: %v\", knkMsg.UserId, knkMd.TransactionId, addrStr, serverPpd.Error)\n\t\terr = serverPpd.Error\n\t\tackMsg.ErrCode = common.ErrTransactionFailedByTimeout.ErrorCode()\n\t\tackMsg.ErrMsg = serverPpd.Error.Error()\n\t\treturn ackMsg, err\n\t}\n\n\tif serverPpd.HeaderType == core.NHP_COK {\n\t\tlog.Error(\"agent(%s#%d)[ExitKnockRequest] terminated by server's cookie message\", knkMsg.UserId, knkMd.TransactionId)\n\t\terr = common.ErrKnockTerminatedByCookie\n\t\tackMsg.ErrCode = common.ErrKnockTerminatedByCookie.ErrorCode()\n\t\tackMsg.ErrMsg = err.Error()\n\t\treturn ackMsg, err\n\t}\n\n\tif serverPpd.HeaderType != core.NHP_ACK {\n\t\tlog.Error(\"agent(%s#%d)[ExitKnockRequest] response has wrong type: %s\", knkMsg.UserId, knkMd.TransactionId, core.HeaderTypeToString(serverPpd.HeaderType))\n\t\terr = common.ErrTransactionRepliedWithWrongType\n\t\tackMsg.ErrCode = common.ErrTransactionRepliedWithWrongType.ErrorCode()\n\t\tackMsg.ErrMsg = err.Error()\n\t\treturn ackMsg, err\n\t}\n\n\terr = json.Unmarshal(serverPpd.BodyMessage, ackMsg)\n\tif err != nil {\n\t\tlog.Error(\"agent(%s#%d)[ExitKnockRequest] failed to parse %s message: %v\", knkMsg.UserId, knkMd.TransactionId, core.HeaderTypeToString(serverPpd.HeaderType), err)\n\t\tackMsg.ErrCode = common.ErrJsonParseFailed.ErrorCode()\n\t\tackMsg.ErrMsg = err.Error()\n\t\treturn ackMsg, err\n\t}\n\n\tif ackMsg.ErrCode != common.ErrSuccess.ErrorCode() {\n\t\tlog.Error(\"agent(%s#%d)[ExitKnockRequest] response error: %s\", knkMsg.UserId, knkMd.TransactionId, ackMsg.ErrMsg)\n\t\terr = common.ErrorCodeToError(ackMsg.ErrCode)\n\t\treturn ackMsg, err\n\t}\n\n\tlog.Info(\"agent(%s#%d)[ExitKnockRequest] succeed\", knkMsg.UserId, knkMd.TransactionId)\n\treturn ackMsg, nil\n}\n\n// agent -> ac, pre-access\nfunc (a *UdpAgent) preAccessRequest(ackMsg *common.ServerKnockAckMsg) (err error) {\n\ta.knockUserMutex.RLock()\n\tif len(a.knockUser.UserId) == 0 {\n\t\ta.knockUserMutex.RUnlock()\n\t\treturn common.ErrKnockUserNotSpecified\n\t}\n\ta.knockUserMutex.RUnlock()\n\n\tvar acWg sync.WaitGroup\n\tfor _, action := range ackMsg.PreAccessActions {\n\t\tacWg.Add(1)\n\t\tgo func(info *common.PreAccessInfo) {\n\t\t\tdefer acWg.Done()\n\t\t\tif info != nil {\n\t\t\t\t_ = a.processPreAccessAction(info)\n\t\t\t}\n\t\t}(action)\n\t}\n\tacWg.Wait()\n\n\treturn nil\n}\n\nfunc (a *UdpAgent) processPreAccessAction(info *common.PreAccessInfo) error {\n\tacIp := net.ParseIP(info.AccessIp)\n\tif acIp == nil {\n\t\treturn common.ErrInvalidIpAddress\n\t}\n\n\tacPort, _ := strconv.Atoi(info.AccessPort)\n\tif acPort <= 0 {\n\t\treturn common.ErrInvalidIpAddress\n\t}\n\n\tudpACAddr := &net.UDPAddr{\n\t\tIP:   acIp,\n\t\tPort: acPort,\n\t}\n\ttcpACAddr := &net.TCPAddr{\n\t\tIP:   acIp,\n\t\tPort: acPort,\n\t}\n\tacPeer := &core.UdpPeer{\n\t\tPubKeyBase64: info.ACPubKey,\n\t\tIp:           info.AccessIp,\n\t\tPort:         acPort,\n\t}\n\tacPk := acPeer.PublicKey()\n\ta.device.AddPeer(acPeer)\n\n\ta.knockUserMutex.RLock()\n\taccMsg := &common.AgentAccessMsg{\n\t\tUserId:         a.knockUser.UserId,\n\t\tDeviceId:       a.deviceId,\n\t\tOrganizationId: a.knockUser.OrganizationId,\n\t\tACToken:        info.ACToken,\n\t\tUserData:       a.knockUser.UserData,\n\t}\n\ta.knockUserMutex.RUnlock()\n\taccBytes, _ := json.Marshal(accMsg)\n\n\taccMd := &core.MsgData{\n\t\tRemoteAddr:     udpACAddr,\n\t\tHeaderType:     core.NHP_ACC,\n\t\tCipherScheme:   a.config.DefaultCipherScheme,\n\t\tTransactionId:  a.device.NextCounterIndex(),\n\t\tCompress:       true,\n\t\tMessage:        accBytes,\n\t\tPeerPk:         acPk,\n\t\tEncryptedPktCh: make(chan *core.MsgAssemblerData),\n\t}\n\n\tif !a.IsRunning() {\n\t\tlog.Error(\"agent(%s)[PreAccessRequest] MsgData channel closed or being closed, skip sending\", accMsg.UserId)\n\t\treturn common.ErrPacketToMessageRoutineStopped\n\t}\n\n\t// start message encryption\n\ta.device.SendMsgToPacket(accMd)\n\n\t// waiting for message encryption\n\taccMad := <-accMd.EncryptedPktCh\n\tclose(accMd.EncryptedPktCh)\n\n\tif accMad.Error != nil {\n\t\tlog.Error(\"agent(%s)[PreAccessRequest] failed to encrypt access message: %v\", accMsg.UserId, accMad.Error)\n\t\treturn accMad.Error\n\t}\n\n\t// copy the packet for GC recycling and release the original packet buffer\n\tpacketBytes := make([]byte, len(accMad.BasePacket.Content))\n\tcopy(packetBytes, accMad.BasePacket.Content)\n\taccMad.Destroy()\n\n\t// open new routine(s) to send access packet to ac's temporary port\n\tgo func(packet []byte, tcpAddr *net.TCPAddr) {\n\t\t// dial tcp connection and send accMad packet\n\t\tconn, err := net.DialTCP(\"tcp\", nil, tcpAddr)\n\t\tif err != nil {\n\t\t\tlog.Error(\"agent(%s)[PreAccessRequest] failed to connect to temporary tcp access port: %v\", accMsg.UserId, err)\n\t\t\treturn\n\t\t}\n\t\tdefer conn.Close()\n\n\t\t_, err = conn.Write(packet)\n\t\tif err != nil {\n\t\t\tlog.Error(\"agent(%s)[PreAccessRequest] failed to send tcp access packet: %v\", accMsg.UserId, err)\n\t\t} else {\n\t\t\tlog.Info(\"agent(%s)[PreAccessRequest] send tcp access message succeed\", accMsg.UserId)\n\t\t}\n\n\t}(packetBytes, tcpACAddr)\n\n\tgo func(packet []byte, udpAddr *net.UDPAddr) {\n\t\t// dial udp connection and send accMad packet\n\t\tconn, err := net.DialUDP(\"udp\", nil, udpAddr)\n\t\tif err != nil {\n\t\t\tlog.Error(\"agent(%s)[PreAccessRequest] failed to connect to temporary udp access port: %v\", accMsg.UserId, err)\n\t\t\treturn\n\t\t}\n\t\tdefer conn.Close()\n\n\t\t_, err = conn.Write(packet)\n\t\tif err != nil {\n\t\t\tlog.Error(\"agent(%s)[PreAccessRequest] failed to send udp access packet: %v\", accMsg.UserId, err)\n\t\t} else {\n\t\t\tlog.Info(\"agent(%s)[PreAccessRequest] send udp access message succeed\", accMsg.UserId)\n\t\t}\n\n\t}(packetBytes, udpACAddr)\n\n\treturn nil\n}\n\nfunc (a *UdpAgent) KnockDHP() (ackMsg *common.ServerDHPKnockAckMsg, err error) {\n\tserverPeer := a.GetFirstServerPeer()\n\tif serverPeer == nil {\n\t\tlog.Critical(\"agent(%s)[KnockDHP] knock server is not assigned\", a.knockUser.UserId)\n\t\treturn nil, common.ErrKnockServerNotFound\n\t}\n\n\tsendAddr := serverPeer.SendAddr()\n\tif sendAddr == nil {\n\t\tlog.Critical(\"agent(%s)[KnockDHP] knock server IP cannot be parsed\", a.knockUser.UserId)\n\t\treturn nil, common.ErrKnockServerNotFound\n\t}\n\taddrStr := sendAddr.String()\n\n\tevidence, err := wasmEngine.GetEvidence()\n\tif err != nil {\n\t\tlog.Error(\"agent(%s)[KnockDHP] cannot get evidence: %s\", a.knockUser.UserId, err)\n\t\treturn nil, common.ErrEvidenceGetFailed\n\t}\n\n\ta.knockUserMutex.RLock()\n\tknkMsg := &common.DHPKnockMsg{\n\t\tUserId:         a.knockUser.UserId,\n\t\tDeviceId:       a.deviceId,\n\t\tOrganizationId: a.knockUser.OrganizationId,\n\t\tUserData:       a.knockUser.UserData,\n\t\tEvidence:       evidence,\n\t}\n\ta.knockUserMutex.RUnlock()\n\n\tknkBytes, _ := json.Marshal(knkMsg)\n\tknkMd := &core.MsgData{\n\t\tRemoteAddr:    sendAddr.(*net.UDPAddr),\n\t\tHeaderType:    core.DHP_KNK,\n\t\tCipherScheme:  a.config.DefaultCipherScheme,\n\t\tTransactionId: a.device.NextCounterIndex(),\n\t\tCompress:      true,\n\t\tMessage:       knkBytes,\n\t\tPeerPk:        serverPeer.PublicKey(),\n\t\tResponseMsgCh: make(chan *core.PacketParserData),\n\t}\n\n\tackMsg = &common.ServerDHPKnockAckMsg{}\n\tif !a.IsRunning() {\n\t\tlog.Error(\"agent(%s#%d)[KnockDHP] MsgData channel closed or being closed, skip sending\", knkMsg.UserId, knkMd.TransactionId)\n\t\terr = common.ErrPacketToMessageRoutineStopped\n\t\tackMsg.ErrCode = common.ErrPacketToMessageRoutineStopped.ErrorCode()\n\t\tackMsg.ErrMsg = err.Error()\n\t\treturn ackMsg, err\n\t}\n\n\t// device will create or find existing connection and sends the MsgAssembler via that connection\n\ta.sendMsgCh <- knkMd\n\n\t// block until transaction completes\n\tserverPpd := <-knkMd.ResponseMsgCh\n\tclose(knkMd.ResponseMsgCh)\n\n\tif serverPpd.Error != nil {\n\t\tlog.Error(\"agent(%s#%d)[KnockDHP] failed to receive response from server %s: %v\", knkMsg.UserId, knkMd.TransactionId, addrStr, serverPpd.Error)\n\t\ta.trustedByNHPServer.Store(false) // in this case, need to check local server configuration and remote agent public key configuration\n\t\terr = serverPpd.Error\n\t\tackMsg.ErrCode = common.ErrPacketEncryptionFailed.ErrorCode()\n\t\tackMsg.ErrMsg = serverPpd.Error.Error()\n\t\treturn ackMsg, err\n\t} else { // In case that peer validation is enabled, agent public key has been configured correctly in server\n\t\ta.trustedByNHPServer.Store(true)\n\t}\n\n\tif serverPpd.HeaderType != core.NHP_ACK {\n\t\tlog.Error(\"agent(%s#%d)[KnockDHP] response has wrong type: %s\", knkMsg.UserId, knkMd.TransactionId, core.HeaderTypeToString(serverPpd.HeaderType))\n\t\terr = common.ErrTransactionRepliedWithWrongType\n\t\tackMsg.ErrCode = common.ErrTransactionRepliedWithWrongType.ErrorCode()\n\t\tackMsg.ErrMsg = err.Error()\n\t\treturn ackMsg, err\n\t}\n\n\terr = json.Unmarshal(serverPpd.BodyMessage, ackMsg)\n\tif err != nil {\n\t\tlog.Error(\"agent(%s#%d)[KnockDHP] failed to parse %s message: %v\", knkMsg.UserId, knkMd.TransactionId, core.HeaderTypeToString(serverPpd.HeaderType), err)\n\t\tackMsg.ErrCode = common.ErrJsonParseFailed.ErrorCode()\n\t\tackMsg.ErrMsg = err.Error()\n\t\treturn ackMsg, err\n\t}\n\n\tif ackMsg.ErrCode != common.ErrSuccess.ErrorCode() {\n\t\tlog.Error(\"agent(%s#%d)[KnockDHP] response error: %s\", knkMsg.UserId, knkMd.TransactionId, ackMsg.ErrMsg)\n\t\terr = common.ErrorCodeToError(ackMsg.ErrCode)\n\t\treturn ackMsg, err\n\t}\n\n\tlog.Info(\"agent(%s#%d)[KnockDHP] succeed\", knkMsg.UserId, knkMd.TransactionId)\n\treturn ackMsg, nil\n}\n"
  },
  {
    "path": "endpoints/agent/main/etc/certs/server.crt",
    "content": "-----BEGIN CERTIFICATE-----\r\nMIIDKzCCAhMCFCl+W8SPu1590nfwXgANK1STySQ0MA0GCSqGSIb3DQEBCwUAMFIx\r\nCzAJBgNVBAYTAkNOMRMwEQYDVQQIDApaaGFuZ0ppYW5nMQswCQYDVQQHDAJIWjEL\r\nMAkGA1UECgwCWFMxFDASBgNVBAMMC3Rlc3RAeHMuY29tMB4XDTI1MDcxNTA4MDEx\r\nNVoXDTI2MDcxNTA4MDExNVowUjELMAkGA1UEBhMCQ04xEzARBgNVBAgMClpoYW5n\r\nSmlhbmcxCzAJBgNVBAcMAkhaMQswCQYDVQQKDAJYUzEUMBIGA1UEAwwLdGVzdEB4\r\ncy5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQD4O/9vxs1dGFKJ\r\nL+IjwrRIOJDHuoEzTtJQ7fsyAoow9siv+qvIXDJ42+ReJiehDcvtpPosyyScD6rx\r\nihWH2I+9su29iz7qyE2aeEwDWOkrNcMGfInhCDmT9BvfveKIgh2CJeh5MwJ5zqnL\r\nQAs8t+2OHlBwxCfTzPe4CGsGX0Ry0324ysqkybHVG3k7BCEpk4oebvbWw1Wemq5d\r\n1yHFbwJFcAuPSaM/Jqi1QO1breQu7azFBHq3PexReKxeshgOqrYR3vFE2XpYLR5/\r\nd45S5eK5Vk1fT0F/UoFCM9P8HrOhir1Di0pKNbhp1etTz3wHsWBo62wliP+2D/Cy\r\n7ux3TC3pAgMBAAEwDQYJKoZIhvcNAQELBQADggEBALWM3eqlFuQzkzF1NIwnCxQ0\r\nRZmXhTtsDnqCwgdTzUT7NyXMiLcDQTQusJAi87L+yc5DMaRqPcr+gCHes8YJQ9Cc\r\nFtqAi15TUiyIdKqt82A6vS5Mr5yHcI3EO4WtAArTj9UUdX4X5unig9KHLb1AyQFk\r\nPJoalnmWy+vnxMBhGemo8ousLZrDOWpPRylW/wnafjvGMxNAF03b32MvtggKKT9m\r\nS0XgmHi7eo/FGYCwKSrgsfAWfitZ/izv4KVw9T4g8m7rSoleTo/0lWKbt1K2U2YR\r\nFoeYltvDOVfgmf1MPlGvyn5llwW4Z1PyR3/mReELJEh79O01KwLc+nJ1oAsbJ8g=\r\n-----END CERTIFICATE-----\r\n"
  },
  {
    "path": "endpoints/agent/main/etc/certs/server.key",
    "content": "-----BEGIN PRIVATE KEY-----\r\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQD4O/9vxs1dGFKJ\r\nL+IjwrRIOJDHuoEzTtJQ7fsyAoow9siv+qvIXDJ42+ReJiehDcvtpPosyyScD6rx\r\nihWH2I+9su29iz7qyE2aeEwDWOkrNcMGfInhCDmT9BvfveKIgh2CJeh5MwJ5zqnL\r\nQAs8t+2OHlBwxCfTzPe4CGsGX0Ry0324ysqkybHVG3k7BCEpk4oebvbWw1Wemq5d\r\n1yHFbwJFcAuPSaM/Jqi1QO1breQu7azFBHq3PexReKxeshgOqrYR3vFE2XpYLR5/\r\nd45S5eK5Vk1fT0F/UoFCM9P8HrOhir1Di0pKNbhp1etTz3wHsWBo62wliP+2D/Cy\r\n7ux3TC3pAgMBAAECggEABX3ASA74BoXt93pvcHaTaeCUdVKfHo0xEli9XI0ZVP10\r\nkY4ERE2j0TAeFGYYLNQjDXn/jcOdpvUixS6WjNeB0IK3hyCgLu3o55CfL9jE6a+K\r\nBaf2HdwCeA8nmbK34uir8e/YPWwfMyYa8/PR+9EeyGzLvz7bmbAYT8Ih6fVsDHUt\r\nlNyPNuhi1GigAv3fRyQOSB4MrIrS5NfQzyArL3S/Se/g9PJ4TJFKL+SjlC75Yyt8\r\nmt20wrcBC52tbx6XvKq6JdZAxbi9NAgsq/mcWITdH0j+BAF8NvmNuUiGMs0DnMgJ\r\nD+gLb3SH/kM/BdFNQJZf9n/02wuOtaRhXFQ4WsaEIQKBgQD8KFt0CD8InK5E34z1\r\nuOsSz2REWZ5fYXC4FsOyITtF94j8tATI7CqDXYN31KEhFlQnN4cCb/Y7Vg3dDezl\r\n7vBYtPTBHIxvuN0aioy7nmqueyniZOXpBNmL+ercFXQh2LPri+8sHHwN87Xc2lJ6\r\noww+ka0Yw0+FKQyT4PYDzNVm0QKBgQD8BFYS2pevqGM930KtW6yV069PA0JJKLAB\r\nUwsU8ccYI35Gd2y3h+ZWT95liLfQRSoup/d3O59+uSjY+Z9M1I3xXyO8DyLOto4B\r\nBEYxHAJ8N8vc1HI5XORI94sOtgZGa4iTqKt23fXNG6D0jMRJxGsdtpcKJVz4jRXn\r\nOUIzwhrLmQKBgQDr/3WAhotAKywrR7Ls85IHe9US53GDQXY2xQ+JMvL/y+oI4Q8t\r\nYWN0qVv3FilsBzLhtWWFkXY6GJNHFdZnaRbHXy1HY8nIcpN1WMDYhC7CeIE940MO\r\nsLxO9quqKeYUG3Zg+QnzFgHBKRxHxIm3P8yg7sS7zWgqb73W1ZBLBDWiUQKBgGca\r\nbwxvmbcnsNJTULgT1VvGquYscyXzG26vRs1ezRE3FCZIHZZIZxfQvS/U6z6tzUAh\r\nP8DsB6iUn/2EwoNwQlIJllkN6DOhxB7uXLkiuHGRcjn6QHDvbAXeIGn4VkDhJZMj\r\nYmLTFAjB0Ou722JClYAmf0yLVKnrLpbWehsqwkOhAoGALAnJKXacPKtWETMh12Ce\r\nppQOAYvyhYjc7JD2bbOqqy1SrzP7Ikm/DoahTQW3A4jaSboZDYs8gICG5vywVHF2\r\nrOE3n2pb1YM/SkS6CK9n/TdKqlKhl5uzTY11cr2WNV1Dab/Tk89QbYz7gX7c3+X7\r\noHimTjCCO4pQO36V48Bd6EM=\r\n-----END PRIVATE KEY-----\r\n"
  },
  {
    "path": "endpoints/agent/main/etc/config.toml",
    "content": "# NHP-Agent base config\r\n# field with (-) does not support dynamic update\r\n\r\n# PrivateKeyBase64 (-): agent private key in base64 format.\r\n# TEEPrivateKeyBase64 (-): TEE private key in base64 format.\r\n# DefaultCipherScheme: 0: curve25519, 1: gmsm.\r\n# MIGRATION: Values changed in v2.x. If upgrading: old 0(gmsm)->new 1, old 1(curve)->new 0.\r\n# UserId: specify the user id this agent represents.\r\n# OrganizationId: specify the organization id this agent represents.\r\n# LogLevel: 0: silent, 1: error, 2: info, 3: audit, 4: debug, 5: trace.\r\nPrivateKeyBase64 = \"+Jnee2lP6Kn47qzSaqwSmWxORsBkkCV6YHsRqXCegVo=\"\r\nDefaultCipherScheme = 0\r\nUserId = \"agent-0\"\r\nOrganizationId = \"opennhp.org\"\r\nLogLevel = 4\r\n# UserData: a customized user entry for flexibility.\r\n# Its key-value pairs will be send to server along with knock message.\r\n[UserData]\r\n\"ExampleKey0\" = \"StringValue\"\r\n\"ExampleKey1\" = 1\r\n\"ExampleKey2\" = true\r\n"
  },
  {
    "path": "endpoints/agent/main/etc/dhp.toml",
    "content": "# Configuration that is related to data object hiding protocol in agent side.\n\n# TEEPrivateKeyBase64: base64 encoded private key of TEE (Trusted Execution Environment).\nTEEPrivateKeyBase64 = \"j20JfF3rjoRtz2m+KP+agYjDBPdQwC9Dwfcasn83yAQ=\"\n"
  },
  {
    "path": "endpoints/agent/main/etc/resource.toml",
    "content": "# List resources for the agent to knock automatically after launch\r\n\r\n# AuthServiceId: id of the authentication and authorization service provider the resource belongs to.\r\n# ResourceId: id of the resource group.\r\n# ServerHostname: host name of the NHP server that manages this resource group.\r\n# ServerIp: ip address of the NHP server  that manages this resource group.\r\n# ServerPort: port of the NHP server that manages this resource group.\r\n# NOTE: ServerHostname, ServerIp and ServerPort must match with the Hostname, Ip and Port of the server defined\r\n# in server.toml in order for the program to locate the correct server peer\r\n[[Resources]]\r\nAuthServiceId = \"example\"\r\nResourceId = \"demo\"\r\nServerHostname = \"\"\r\nServerIp = \"192.168.56.101\"\r\nServerPort = 62206\r\n"
  },
  {
    "path": "endpoints/agent/main/etc/server.toml",
    "content": "# list the server peers for the agent under [[Servers]] table\r\n\r\n# Hostname: the domain of the server peer. If specified, it overrides the \"Ip\" field with its first resolved address.\r\n# Ip: specify the ip address of the server peer\r\n# Port: specify the port number of this server peer is listening\r\n# PubKeyBase64: public key of the server peer in base64 format\r\n# ExpireTime (epoch timestamp in seconds): peer key validation will fail when it expires.\r\n[[Servers]]\r\nHostname = \"\"\r\nIp = \"192.168.80.35\"\r\nPort = 62206\r\nPubKeyBase64 = \"WqJxe+Z4+wLen3VRgZx6YnbjvJFmptz99zkONCt/7gc=\"\r\nExpireTime = 1924991999\r\n"
  },
  {
    "path": "endpoints/agent/main/export.go",
    "content": "package main\n\n/*\n#include <stdlib.h>\n*/\nimport \"C\"\n\nimport (\n\t\"encoding/base64\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"strings\"\n\t\"unsafe\"\n\n\t\"github.com/OpenNHP/opennhp/endpoints/agent\"\n\t\"github.com/OpenNHP/opennhp/nhp/common\"\n\t\"github.com/OpenNHP/opennhp/nhp/core\"\n)\n\nvar gAgentInstance *agent.UdpAgent\nvar gWorkingDir string\nvar gLogLevel int\n\nfunc deepCopyCString(c_str *C.char) string {\n\tif c_str == nil {\n\t\treturn \"\"\n\t}\n\tgoStr := C.GoString(c_str)\n\treturn strings.Clone(goStr)\n}\n\n// Release the memory of the string buffer generated by NHPSDK.\n//\n//export nhp_free_cstring\nfunc nhp_free_cstring(ptr *C.char) {\n\tC.free(unsafe.Pointer(ptr))\n}\n\n// Initialization of the nhp_agent instance working directory path:\n// The configuration files to be read are located under workingdir/etc/,\n// and log files will be generated under workingdir/logs/.\n//\n// Input:\n// workingDir: the working directory path for the agent\n// logLevel: 0: silent, 1: error, 2: info, 3: debug, 4: verbose\n//\n// Return:\n// Whether agent instance has been initialized successfully.\n//\n//export nhp_agent_init\nfunc nhp_agent_init(workingDir *C.char, logLevel C.int) bool {\n\tif gAgentInstance != nil {\n\t\treturn true\n\t}\n\n\tgAgentInstance = &agent.UdpAgent{}\n\terr := gAgentInstance.Start(deepCopyCString(workingDir), int(logLevel))\n\tif err != nil {\n\t\treturn false\n\t}\n\n\treturn true\n}\n\n// Synchronously stop and release nhp_agent.\n//\n//export nhp_agent_close\nfunc nhp_agent_close() {\n\tif gAgentInstance == nil {\n\t\treturn\n\t}\n\n\tgAgentInstance.Stop()\n\tgAgentInstance = nil\n}\n\n// Read the user information, resource information, server information,\n// and other configuration files written under workingdir/etc,\n// and asynchronously start the loop knocking thread.\n//\n// Input: None\n//\n// Return:\n// -1: Uninitialized error\n// >=0: The number of resources requested to knock by the knocking thread at the time of the call\n//\n//\t(knocking resources will be synchronized with changes in the configuration in workingdir/etc/resource.toml).\n//\n//export nhp_agent_knockloop_start\nfunc nhp_agent_knockloop_start() C.int {\n\tif gAgentInstance == nil {\n\t\treturn -1\n\t}\n\n\tcount := gAgentInstance.StartKnockLoop()\n\treturn C.int(count)\n}\n\n// Synchronously stop the loop, knock-on sub thread.\n//\n//export nhp_agent_knockloop_stop\nfunc nhp_agent_knockloop_stop() {\n\tif gAgentInstance == nil {\n\t\treturn\n\t}\n\n\tgAgentInstance.StopKnockLoop()\n}\n\n// Setting agent's represented user information\n//\n// Input:\n// userId: User identification (optional, but not recommended to be empty)\n// devId: Device identification (optional)\n// orgId: Organization or company identification (optional)\n// userData: Additional fields required to interface with backend services (json format string, optional)\n//\n// Return:\n// Whether the user information is set successfully\n//\n//export nhp_agent_set_knock_user\nfunc nhp_agent_set_knock_user(userId *C.char, devId *C.char, orgId *C.char, userData *C.char) bool {\n\tif gAgentInstance == nil {\n\t\treturn false\n\t}\n\tjsonStr := deepCopyCString(userData)\n\tvar data map[string]any\n\tif len(jsonStr) > 0 {\n\t\terr := json.Unmarshal([]byte(jsonStr), &data)\n\t\tif err != nil {\n\t\t\treturn false\n\t\t}\n\t}\n\n\tgAgentInstance.SetDeviceId(deepCopyCString(devId))\n\tgAgentInstance.SetKnockUser(deepCopyCString(userId), deepCopyCString(orgId), data)\n\treturn true\n}\n\n// Add an NHP server information to the agent for use in knocking on the door\n// (the agent can initiate different knocking requests to multiple NHP servers).\n//\n// Input:\n// pubkey: Public key of the NHP server\n// ip: IP address of the NHP server\n// host: Domain name of the NHP server (if a domain name is set, the ip item is optional)\n// port: Port number for the NHP server to operate (if set to 0, the default port 62206 will be used)\n// expire: Expiration time of the NHP server's public key (in epoch seconds, set to 0 for permanent)\n//\n// Return:\n// Whether the server information has been successfully added.\n//\n//export nhp_agent_add_server\nfunc nhp_agent_add_server(pubkey *C.char, ip *C.char, host *C.char, port C.int, expire int64) bool {\n\tif gAgentInstance == nil {\n\t\treturn false\n\t}\n\n\tif pubkey == nil || (ip == nil && host == nil) {\n\t\treturn false\n\t}\n\n\tserverPort := int(port)\n\tif serverPort == 0 {\n\t\tserverPort = 62206 // use default server listening port\n\t}\n\n\tserverPeer := &core.UdpPeer{\n\t\tType:         core.NHP_SERVER,\n\t\tPubKeyBase64: deepCopyCString(pubkey),\n\t\tIp:           deepCopyCString(ip),\n\t\tPort:         serverPort,\n\t\tHostname:     deepCopyCString(host),\n\t\tExpireTime:   expire,\n\t}\n\tgAgentInstance.AddServer(serverPeer)\n\treturn true\n}\n\n// Delete NHP server information from the agent\n//\n// Input:\n// pubkey: NHP server public key\n//\n//export nhp_agent_remove_server\nfunc nhp_agent_remove_server(pubkey *C.char) {\n\tif gAgentInstance == nil {\n\t\treturn\n\t}\n\tif pubkey == nil {\n\t\treturn\n\t}\n\n\tgAgentInstance.RemoveServer(deepCopyCString(pubkey))\n}\n\n// Please add a resource information for the agent to use for knocking on the door\n// (the agent can initiate a knock-on request for different resources)\n//\n// Input:\n// aspId: Authentication Service Provider Identifier\n// resId: Resource Identifier\n// serverIp: NHP server IP address or domain name (the NHP server managing the resource)\n// serverHostname: NHP server domain name (the NHP server managing the resource)\n// serverPort: NHP server port (the NHP server managing the resource)\n//\n// Return:\n// Whether the resource information has been added successfully\n//\n//export nhp_agent_add_resource\nfunc nhp_agent_add_resource(aspId *C.char, resId *C.char, serverIp *C.char, serverHostname *C.char, serverPort C.int) bool {\n\tif gAgentInstance == nil {\n\t\treturn false\n\t}\n\n\tif aspId == nil || resId == nil || (serverIp == nil && serverHostname == nil) {\n\t\treturn false\n\t}\n\n\tresource := &agent.KnockResource{\n\t\tAuthServiceId:  deepCopyCString(aspId),\n\t\tResourceId:     deepCopyCString(resId),\n\t\tServerIp:       deepCopyCString(serverIp),\n\t\tServerHostname: deepCopyCString(serverHostname),\n\t\tServerPort:     int(serverPort),\n\t}\n\terr := gAgentInstance.AddResource(resource)\n\treturn err == nil\n}\n\n// Delete resource information from the agent\n//\n// Input:\n// aspId: Authentication Service Provider Identifier\n// resId: Resource Identifier\n//\n//export nhp_agent_remove_resource\nfunc nhp_agent_remove_resource(aspId *C.char, resId *C.char) {\n\tif gAgentInstance == nil {\n\t\treturn\n\t}\n\n\tif aspId == nil || resId == nil {\n\t\treturn\n\t}\n\n\tgAgentInstance.RemoveResource(deepCopyCString(aspId), deepCopyCString(resId))\n}\n\n// The agent initiates a single knock on the door request to the server hosting the resource\n//\n// Input:\n// aspId: Authentication service provider identifier\n// resId: Resource identifier\n// serverIp: NHP server IP address or domain name (the NHP server managing the resource)\n// serverHostname: NHP server domain name (the NHP server managing the resource)\n// serverPort: NHP server port (the NHP server managing the resource)\n//\n// Returns:\n// The server's response message (json format string buffer pointer):\n// \"errCode\": Error code (string, \"0\" indicates success)\n// \"errMsg\": Error message (string)\n// \"resHost\": Resource server address (\"resHost\": {\"Server Name 1\":\"Server Hostname 1\", \"Server Name 2\":\"Server Hostname 2\", ...})\n// \"opnTime\": Door opening duration (integer, in seconds)\n// \"aspToken\": Token generated after authentication by the ASP (optional)\n// \"agentAddr\": Agent's IP address from the perspective of the NHP server\n// \"preActs\": Pre-connection information related to the resource (optional)\n// \"redirectUrl\": HTTP redirection link (optional)\n//\n// It is necessary to call nhp_agent_add_server before calling,\n// to add the NHP server's public key, address, and other information to the agent\n// The caller is responsible for calling nhp_free_cstring to release the returned char* pointer\n//\n//export nhp_agent_knock_resource\nfunc nhp_agent_knock_resource(aspId *C.char, resId *C.char, serverIp *C.char, serverHostname *C.char, serverPort C.int) *C.char {\n\tackMsg := &common.ServerKnockAckMsg{}\n\n\tfunc() {\n\t\tif gAgentInstance == nil {\n\t\t\tackMsg.ErrCode = common.ErrNoAgentInstance.ErrorCode()\n\t\t\tackMsg.ErrMsg = common.ErrNoAgentInstance.Error()\n\t\t\treturn\n\t\t}\n\n\t\tif aspId == nil || resId == nil || (serverIp == nil && serverHostname == nil) {\n\t\t\tackMsg.ErrCode = common.ErrInvalidInput.ErrorCode()\n\t\t\tackMsg.ErrMsg = common.ErrInvalidInput.Error()\n\t\t\treturn\n\t\t}\n\n\t\tresource := &agent.KnockResource{\n\t\t\tAuthServiceId:  deepCopyCString(aspId),\n\t\t\tResourceId:     deepCopyCString(resId),\n\t\t\tServerIp:       deepCopyCString(serverIp),\n\t\t\tServerHostname: deepCopyCString(serverHostname),\n\t\t\tServerPort:     int(serverPort),\n\t\t}\n\n\t\tpeer := gAgentInstance.FindServerPeerFromResource(resource)\n\t\tif peer == nil {\n\t\t\tackMsg.ErrCode = common.ErrKnockServerNotFound.ErrorCode()\n\t\t\tackMsg.ErrMsg = common.ErrKnockServerNotFound.Error()\n\t\t\treturn\n\t\t}\n\n\t\ttarget := &agent.KnockTarget{\n\t\t\tKnockResource: *resource,\n\t\t\tServerPeer:    peer,\n\t\t}\n\n\t\tackMsg, _ = gAgentInstance.Knock(target)\n\t}()\n\n\tbytes, _ := json.Marshal(ackMsg)\n\tret := C.CString(string(bytes))\n\n\treturn ret\n}\n\n// The agent explicitly informs the NHP server to exit its access permission to the resource.\n//\n// Input:\n// aspId: Authentication Service Provider Identifier\n// resId: Resource Identifier\n// serverIp: NHP server IP address or domain name (the NHP server managing the resource)\n// serverHostname: NHP server domain name (the NHP server managing the resource)\n// serverPort: NHP server port (the NHP server managing the resource)\n//\n// Return:\n// Whether the exit was successful\n//\n// It is necessary to call nhp_agent_add_server before calling, to add the NHP server's public key, address, and other information to the agent.\n//\n//export nhp_agent_exit_resource\nfunc nhp_agent_exit_resource(aspId *C.char, resId *C.char, serverIp *C.char, serverHostname *C.char, serverPort C.int) bool {\n\tvar err error\n\tackMsg := &common.ServerKnockAckMsg{}\n\n\tfunc() {\n\t\tif gAgentInstance == nil {\n\t\t\tackMsg.ErrCode = common.ErrNoAgentInstance.ErrorCode()\n\t\t\tackMsg.ErrMsg = common.ErrNoAgentInstance.Error()\n\t\t\terr = common.ErrNoAgentInstance\n\t\t\treturn\n\t\t}\n\n\t\tif aspId == nil || resId == nil || (serverIp == nil && serverHostname == nil) {\n\t\t\tackMsg.ErrCode = common.ErrInvalidInput.ErrorCode()\n\t\t\tackMsg.ErrMsg = common.ErrInvalidInput.Error()\n\t\t\terr = common.ErrInvalidInput\n\t\t\treturn\n\t\t}\n\n\t\tresource := &agent.KnockResource{\n\t\t\tAuthServiceId:  deepCopyCString(aspId),\n\t\t\tResourceId:     deepCopyCString(resId),\n\t\t\tServerIp:       deepCopyCString(serverIp),\n\t\t\tServerHostname: deepCopyCString(serverHostname),\n\t\t\tServerPort:     int(serverPort),\n\t\t}\n\n\t\tpeer := gAgentInstance.FindServerPeerFromResource(resource)\n\t\tif peer == nil {\n\t\t\tackMsg.ErrCode = common.ErrKnockServerNotFound.ErrorCode()\n\t\t\tackMsg.ErrMsg = common.ErrKnockServerNotFound.Error()\n\t\t\terr = common.ErrKnockServerNotFound\n\t\t\treturn\n\t\t}\n\n\t\ttarget := &agent.KnockTarget{\n\t\t\tKnockResource: *resource,\n\t\t\tServerPeer:    peer,\n\t\t}\n\n\t\tackMsg, err = gAgentInstance.ExitKnockRequest(target)\n\t}()\n\n\treturn err == nil\n}\n\n// cipherType: 0-curve25519; 1-sm2\n// result: \"privatekey\"|\"publickey\"\n// caller is responsible to free the returned char* pointer\n//\n//export nhp_generate_keys\nfunc nhp_generate_keys(cipherType C.int) *C.char {\n\tvar e core.Ecdh\n\tswitch core.EccTypeEnum(cipherType) {\n\tcase core.ECC_SM2:\n\t\te = core.NewECDH(core.ECC_SM2)\n\tcase core.ECC_CURVE25519:\n\t\tfallthrough\n\tdefault:\n\t\te = core.NewECDH(core.ECC_CURVE25519)\n\t}\n\tpub := e.PublicKeyBase64()\n\tpriv := e.PrivateKeyBase64()\n\n\tres := fmt.Sprintf(\"%s|%s\", priv, pub)\n\tpRes := C.CString(res)\n\n\treturn pRes\n}\n\n// cipherType: 0-curve25519; 1-sm2\n// privateBase64: private key in base64 format\n// result: \"publickey\"\n// caller is responsible to free the returned char* pointer\n//\n//export nhp_privkey_to_pubkey\nfunc nhp_privkey_to_pubkey(cipherType C.int, privateBase64 *C.char) *C.char {\n\tprivKey := deepCopyCString(privateBase64)\n\tprivKeyBytes, err := base64.StdEncoding.DecodeString(privKey)\n\tif err != nil {\n\t\treturn nil\n\t}\n\n\te := core.ECDHFromKey(core.EccTypeEnum(cipherType), privKeyBytes)\n\tif e == nil {\n\t\treturn nil\n\t}\n\tpub := e.PublicKeyBase64()\n\tpPub := C.CString(pub)\n\n\treturn pPub\n}\n"
  },
  {
    "path": "endpoints/agent/main/main.go",
    "content": "package main\n\nimport (\n\t\"encoding/base64\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"os\"\n\t\"os/signal\"\n\t\"path/filepath\"\n\t\"runtime\"\n\t\"syscall\"\n\t\"time\"\n\n\t\"github.com/urfave/cli/v2\"\n\n\t\"github.com/OpenNHP/opennhp/endpoints/agent\"\n\t\"github.com/OpenNHP/opennhp/nhp/common\"\n\t\"github.com/OpenNHP/opennhp/nhp/core\"\n\t\"github.com/OpenNHP/opennhp/nhp/version\"\n)\n\n// ANSI color codes\nconst (\n\tcolorReset  = \"\\033[0m\"\n\tcolorCyan   = \"\\033[36m\"\n\tcolorGreen  = \"\\033[32m\"\n\tcolorYellow = \"\\033[33m\"\n\tcolorBlue   = \"\\033[34m\"\n\tcolorPurple = \"\\033[35m\"\n\tcolorBold   = \"\\033[1m\"\n\tcolorDim    = \"\\033[2m\"\n)\n\nfunc main() {\n\tapp := cli.NewApp()\n\tapp.Name = \"nhp-agent\"\n\tapp.Usage = \"agent entity for NHP protocol\"\n\tapp.Version = version.Version\n\n\trunCmd := &cli.Command{\n\t\tName:  \"run\",\n\t\tUsage: \"create and run agent process for NHP protocol\",\n\t\tAction: func(c *cli.Context) error {\n\t\t\treturn runApp()\n\t\t},\n\t}\n\tkeygenCmd := &cli.Command{\n\t\tName:  \"keygen\",\n\t\tUsage: \"generate key pairs for NHP devices\",\n\t\tFlags: []cli.Flag{\n\t\t\t&cli.BoolFlag{Name: \"curve\", Value: false, DisableDefaultText: true, Usage: \"generate curve25519 keys\"},\n\t\t\t&cli.BoolFlag{Name: \"sm2\", Value: false, DisableDefaultText: true, Usage: \"generate sm2 keys\"},\n\t\t\t&cli.BoolFlag{Name: \"json\", Value: false, DisableDefaultText: true, Usage: \"output in JSON format\"},\n\t\t},\n\t\tAction: func(c *cli.Context) error {\n\t\t\tvar e core.Ecdh\n\t\t\teccType := core.ECC_SM2\n\t\t\tif c.Bool(\"curve\") {\n\t\t\t\teccType = core.ECC_CURVE25519\n\t\t\t}\n\t\t\te = core.NewECDH(eccType)\n\t\t\tpub := e.PublicKeyBase64()\n\t\t\tpriv := e.PrivateKeyBase64()\n\t\t\tif c.Bool(\"json\") {\n\t\t\t\toutput := map[string]string{\n\t\t\t\t\t\"privateKey\": priv,\n\t\t\t\t\t\"publicKey\":  pub,\n\t\t\t\t}\n\t\t\t\tjson.NewEncoder(os.Stdout).Encode(output)\n\t\t\t} else {\n\t\t\t\tfmt.Println(\"Private key: \", priv)\n\t\t\t\tfmt.Println(\"Public key: \", pub)\n\t\t\t}\n\t\t\treturn nil\n\t\t},\n\t}\n\n\tpubkeyCmd := &cli.Command{\n\t\tName:  \"pubkey\",\n\t\tUsage: \"get public key from private key\",\n\t\tFlags: []cli.Flag{\n\t\t\t&cli.BoolFlag{Name: \"curve\", Value: false, DisableDefaultText: true, Usage: \"get curve25519 key\"},\n\t\t\t&cli.BoolFlag{Name: \"sm2\", Value: false, DisableDefaultText: true, Usage: \"get sm2 key (default)\"},\n\t\t\t&cli.BoolFlag{Name: \"json\", Value: false, DisableDefaultText: true, Usage: \"output in JSON format\"},\n\t\t},\n\t\tAction: func(c *cli.Context) error {\n\t\t\tprivKey, err := base64.StdEncoding.DecodeString(c.Args().First())\n\t\t\tif err != nil {\n\t\t\t\tif c.Bool(\"json\") {\n\t\t\t\t\tjson.NewEncoder(os.Stdout).Encode(map[string]interface{}{\n\t\t\t\t\t\t\"error\": err.Error(),\n\t\t\t\t\t})\n\t\t\t\t\treturn nil\n\t\t\t\t}\n\t\t\t\treturn err\n\t\t\t}\n\t\t\teccType := core.ECC_SM2\n\t\t\tif c.Bool(\"curve\") {\n\t\t\t\teccType = core.ECC_CURVE25519\n\t\t\t}\n\t\t\te := core.ECDHFromKey(eccType, privKey)\n\t\t\tif e == nil {\n\t\t\t\terr := fmt.Errorf(\"invalid input key\")\n\t\t\t\tif c.Bool(\"json\") {\n\t\t\t\t\tjson.NewEncoder(os.Stdout).Encode(map[string]interface{}{\n\t\t\t\t\t\t\"error\": err.Error(),\n\t\t\t\t\t})\n\t\t\t\t\treturn nil\n\t\t\t\t}\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tpub := e.PublicKeyBase64()\n\t\t\tif c.Bool(\"json\") {\n\t\t\t\tjson.NewEncoder(os.Stdout).Encode(map[string]string{\n\t\t\t\t\t\"publicKey\": pub,\n\t\t\t\t})\n\t\t\t} else {\n\t\t\t\tfmt.Println(\"Public key: \", pub)\n\t\t\t}\n\t\t\treturn nil\n\t\t},\n\t}\n\tdhpCmd := &cli.Command{\n\t\tName:  \"dhp\",\n\t\tUsage: \"create dhp agent process for NHP protocol\",\n\t\tAction: func(c *cli.Context) error {\n\t\t\treturn runDHPApp()\n\t\t},\n\t}\n\n\tapp.Commands = []*cli.Command{\n\t\trunCmd,\n\t\tkeygenCmd,\n\t\tpubkeyCmd,\n\t\tdhpCmd,\n\t}\n\n\tif err := app.Run(os.Args); err != nil {\n\t\tfmt.Fprintln(os.Stderr, err)\n\t}\n}\n\nfunc printBanner() {\n\tbanner := `\n` + colorCyan + colorBold + `\n   ____                   _   _ _   _ ____  \n  / __ \\                 | \\ | | | | |  _ \\ \n | |  | |_ __   ___ _ __ |  \\| | |_| | |_) |\n | |  | | '_ \\ / _ \\ '_ \\| . ' |  _  |  __/ \n | |__| | |_) |  __/ | | | |\\  | | | | |    \n  \\____/| .__/ \\___|_| |_|_| \\_|_| |_|_|    \n        | |                                  \n        |_|  ` + colorReset + colorDim + `Network-infrastructure Hiding Protocol` + colorReset + `\n` + colorPurple + `\n  ⭐ GitHub: ` + colorReset + `https://github.com/OpenNHP/opennhp\n` + colorYellow + `  💡 Star us & Join the community! Contributors welcome!` + colorReset + `\n\n`\n\tfmt.Print(banner)\n}\n\nfunc printAgentInfo() {\n\t// Safely get commit ID (first 12 chars or full if shorter)\n\tcommitId := version.CommitId\n\tif len(commitId) > 12 {\n\t\tcommitId = commitId[:12]\n\t}\n\n\tfmt.Println(colorGreen + \"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\" + colorReset)\n\tfmt.Println()\n\tfmt.Printf(\"  %s🔐 NHP-Agent%s is running!\\n\", colorBold, colorReset)\n\tfmt.Println()\n\tfmt.Printf(\"  %sVersion:%s    %s\\n\", colorYellow, colorReset, version.Version)\n\tfmt.Printf(\"  %sCommit:%s     %s\\n\", colorYellow, colorReset, commitId)\n\tfmt.Printf(\"  %sBuild:%s      %s\\n\", colorYellow, colorReset, version.BuildTime)\n\tfmt.Printf(\"  %sPlatform:%s   %s/%s\\n\", colorYellow, colorReset, runtime.GOOS, runtime.GOARCH)\n\tfmt.Println()\n\tfmt.Printf(\"  %sMode:%s       %sKnock Client%s\\n\", colorBlue, colorReset, colorCyan, colorReset)\n\tfmt.Printf(\"  %sStarted:%s    %s\\n\", colorBlue, colorReset, time.Now().Format(\"2006-01-02 15:04:05\"))\n\tfmt.Println()\n\tfmt.Println(colorGreen + \"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\" + colorReset)\n\tfmt.Println()\n\tfmt.Printf(\"  %sPress Ctrl+C to stop the agent%s\\n\", colorDim, colorReset)\n\tfmt.Println()\n}\n\nfunc runApp() error {\n\texeFilePath, err := os.Executable()\n\tif err != nil {\n\t\treturn err\n\t}\n\texeDirPath := filepath.Dir(exeFilePath)\n\n\t// Print banner before starting\n\tprintBanner()\n\n\ta := &agent.UdpAgent{}\n\n\terr = a.Start(exeDirPath, 4)\n\tif err != nil {\n\t\tfmt.Printf(\"\\n  %s❌ Failed to start agent:%s %v\\n\\n\", colorYellow, colorReset, err)\n\t\treturn err\n\t}\n\n\t// Print agent info after successful start\n\tprintAgentInfo()\n\n\ta.StartKnockLoop()\n\t// react to terminate signals\n\ttermCh := make(chan os.Signal, 1)\n\tsignal.Notify(termCh, syscall.SIGTERM, os.Interrupt, syscall.SIGABRT)\n\n\t// block until terminated\n\t<-termCh\n\n\tfmt.Printf(\"\\n  %s🛑 Shutting down agent...%s\\n\", colorYellow, colorReset)\n\ta.Stop()\n\tfmt.Printf(\"  %s✅ Agent stopped gracefully%s\\n\\n\", colorGreen, colorReset)\n\n\treturn nil\n}\n\nfunc printDHPAgentInfo() {\n\t// Safely get commit ID (first 12 chars or full if shorter)\n\tcommitId := version.CommitId\n\tif len(commitId) > 12 {\n\t\tcommitId = commitId[:12]\n\t}\n\n\tfmt.Println(colorGreen + \"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\" + colorReset)\n\tfmt.Println()\n\tfmt.Printf(\"  %s🛡️  NHP-Agent (DHP Mode)%s is running!\\n\", colorBold, colorReset)\n\tfmt.Println()\n\tfmt.Printf(\"  %sVersion:%s    %s\\n\", colorYellow, colorReset, version.Version)\n\tfmt.Printf(\"  %sCommit:%s     %s\\n\", colorYellow, colorReset, commitId)\n\tfmt.Printf(\"  %sBuild:%s      %s\\n\", colorYellow, colorReset, version.BuildTime)\n\tfmt.Printf(\"  %sPlatform:%s   %s/%s\\n\", colorYellow, colorReset, runtime.GOOS, runtime.GOARCH)\n\tfmt.Println()\n\tfmt.Printf(\"  %sMode:%s       %sDHP (Data Hiding Protocol)%s\\n\", colorBlue, colorReset, colorCyan, colorReset)\n\tfmt.Printf(\"  %sStarted:%s    %s\\n\", colorBlue, colorReset, time.Now().Format(\"2006-01-02 15:04:05\"))\n\tfmt.Println()\n\tfmt.Println(colorGreen + \"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\" + colorReset)\n\tfmt.Println()\n\tfmt.Printf(\"  %sPress Ctrl+C to stop the agent%s\\n\", colorDim, colorReset)\n\tfmt.Println()\n}\n\nfunc runDHPApp() error {\n\texeFilePath, err := os.Executable()\n\tif err != nil {\n\t\treturn err\n\t}\n\texeDirPath := filepath.Dir(exeFilePath)\n\n\tcommon.ExeDirPath = exeDirPath\n\tagent.ExeDirPath = exeDirPath\n\n\t// Print banner before starting\n\tprintBanner()\n\n\ta := &agent.UdpAgent{}\n\n\terr = a.InitializeSecret()\n\tif err != nil {\n\t\tfmt.Printf(\"\\n  %s❌ Failed to initialize secret:%s %v\\n\\n\", colorYellow, colorReset, err)\n\t\treturn err\n\t}\n\n\terr = a.Start(exeDirPath, 4)\n\tif err != nil {\n\t\tfmt.Printf(\"\\n  %s❌ Failed to start DHP agent:%s %v\\n\\n\", colorYellow, colorReset, err)\n\t\treturn err\n\t}\n\n\t// Print DHP agent info after successful start\n\tprintDHPAgentInfo()\n\n\ta.CreateDHPWebConsole()\n\ta.StartDHPKnockLoop()\n\n\t// react to terminate signals\n\ttermCh := make(chan os.Signal, 1)\n\tsignal.Notify(termCh, syscall.SIGTERM, os.Interrupt, syscall.SIGABRT)\n\n\t// block until terminated\n\t<-termCh\n\n\tfmt.Printf(\"\\n  %s🛑 Shutting down DHP agent...%s\\n\", colorYellow, colorReset)\n\ta.Stop()\n\tfmt.Printf(\"  %s✅ DHP Agent stopped gracefully%s\\n\\n\", colorGreen, colorReset)\n\n\treturn nil\n}\n"
  },
  {
    "path": "endpoints/agent/msghandler.go",
    "content": "package agent\n\nimport (\n\t\"encoding/base64\"\n\t\"encoding/json\"\n\n\t\"github.com/OpenNHP/opennhp/nhp/common\"\n\t\"github.com/OpenNHP/opennhp/nhp/core\"\n\t\"github.com/OpenNHP/opennhp/nhp/log\"\n)\n\nfunc (a *UdpAgent) HandleCookieMessage(ppd *core.PacketParserData) bool {\n\tdefer a.wg.Done()\n\ta.wg.Add(1)\n\n\t// redirect cookie response message to original knock request\n\tcokMsg := &common.ServerCookieMsg{}\n\terr := json.Unmarshal(ppd.BodyMessage, cokMsg)\n\n\tif err != nil {\n\t\tlog.Error(\"agent[HandleCookieMessage] failed to parse %s message: %v\", core.HeaderTypeToString(ppd.HeaderType), err)\n\t\treturn false\n\t}\n\n\t// update cookie\n\tcokBytes, _ := base64.StdEncoding.DecodeString(cokMsg.Cookie)\n\tcopy(ppd.ConnData.CookieStore.CurrCookie[:], cokBytes)\n\n\ttransactionId := cokMsg.TransactionId // note this transaction id is in message structure, not the one in packet\n\ttransaction := a.device.FindLocalTransaction(transactionId)\n\tif transaction == nil {\n\t\tlog.Error(\"agent(#%d)[HandleCookieMessage] transaction is not available\", transactionId)\n\t\treturn false\n\t}\n\n\tlog.Info(\"agent(#%d)[HandleCookieMessage] redirect cookie message to original knock transaction\", transactionId)\n\ttransaction.ExternalMsgCh <- ppd\n\treturn true\n}\n"
  },
  {
    "path": "endpoints/agent/request.go",
    "content": "package agent\n\nimport (\n\t\"encoding/json\"\n\t\"net\"\n\n\t\"github.com/OpenNHP/opennhp/nhp/common\"\n\t\"github.com/OpenNHP/opennhp/nhp/core\"\n\t\"github.com/OpenNHP/opennhp/nhp/log\"\n)\n\n// note: code in request.go is for nhp-agent to send request to nhp-server.\n\nfunc (a *UdpAgent) RequestOtp(target *KnockTarget) error {\n\ta.knockUserMutex.RLock()\n\totpMsg := &common.AgentOTPMsg{\n\t\tUserId:         a.knockUser.UserId,\n\t\tDeviceId:       a.deviceId,\n\t\tOrganizationId: a.knockUser.OrganizationId,\n\t\tAuthServiceId:  target.AuthServiceId,\n\t\tUserData:       a.knockUser.UserData,\n\t}\n\ta.knockUserMutex.RUnlock()\n\totpBytes, _ := json.Marshal(otpMsg)\n\n\tserverPeer := target.GetServerPeer()\n\tif serverPeer == nil {\n\t\tlog.Critical(\"agent(%s)[RequestOtp] server is not assigned\", otpMsg.UserId)\n\t\treturn common.ErrKnockServerNotFound\n\t}\n\n\tsendAddr := serverPeer.SendAddr()\n\tif sendAddr == nil {\n\t\tlog.Critical(\"agent(%s)[RequestOtp] server IP cannot be parsed\", otpMsg.UserId)\n\t\treturn common.ErrKnockServerNotFound\n\t}\n\n\totpMd := &core.MsgData{\n\t\tRemoteAddr:    sendAddr.(*net.UDPAddr),\n\t\tHeaderType:    core.NHP_OTP,\n\t\tCipherScheme:  a.config.DefaultCipherScheme,\n\t\tTransactionId: a.device.NextCounterIndex(),\n\t\tCompress:      true,\n\t\tMessage:       otpBytes,\n\t\tPeerPk:        serverPeer.PublicKey(),\n\t}\n\n\tif !a.IsRunning() {\n\t\tlog.Error(\"agent(%s#%d)[RequestOtp] MsgData channel closed or being closed, skip sending\", otpMsg.UserId, otpMd.TransactionId)\n\t\treturn common.ErrPacketToMessageRoutineStopped\n\t}\n\n\t// device will create or find existing connection and sends the MsgAssembler via that connection\n\ta.sendMsgCh <- otpMd\n\n\tlog.Info(\"agent(%s#%d)[RequestOtp] sending otp request\", otpMsg.UserId, otpMd.TransactionId)\n\treturn nil\n}\n\nfunc (a *UdpAgent) RegisterPublicKey(otp string, target *KnockTarget) (rakMsg *common.ServerRegisterAckMsg, err error) {\n\ta.knockUserMutex.RLock()\n\tregMsg := &common.AgentRegisterMsg{\n\t\tUserId:         a.knockUser.UserId,\n\t\tDeviceId:       a.deviceId,\n\t\tOrganizationId: a.knockUser.OrganizationId,\n\t\tAuthServiceId:  target.AuthServiceId,\n\t\tOTP:            otp,\n\t\tUserData:       a.knockUser.UserData,\n\t}\n\ta.knockUserMutex.RUnlock()\n\tregBytes, _ := json.Marshal(regMsg)\n\n\tserverPeer := target.GetServerPeer()\n\tif serverPeer == nil {\n\t\tlog.Critical(\"agent(%s)[RegisterPublicKey] server is not assigned\", regMsg.UserId)\n\t\treturn nil, common.ErrKnockServerNotFound\n\t}\n\n\tsendAddr := serverPeer.SendAddr()\n\tif sendAddr == nil {\n\t\tlog.Critical(\"agent(%s)[RegisterPublicKey] server IP cannot be parsed\", regMsg.UserId)\n\t\treturn nil, common.ErrKnockServerNotFound\n\t}\n\taddrStr := sendAddr.String()\n\n\tregMd := &core.MsgData{\n\t\tRemoteAddr:    sendAddr.(*net.UDPAddr),\n\t\tHeaderType:    core.NHP_REG,\n\t\tCipherScheme:  a.config.DefaultCipherScheme,\n\t\tTransactionId: a.device.NextCounterIndex(),\n\t\tCompress:      true,\n\t\tMessage:       regBytes,\n\t\tPeerPk:        serverPeer.PublicKey(),\n\t\tResponseMsgCh: make(chan *core.PacketParserData),\n\t}\n\n\tif !a.IsRunning() {\n\t\tlog.Error(\"agent(%s#%d)[RegisterPublicKey] MsgData channel closed or being closed, skip sending\", regMsg.UserId, regMd.TransactionId)\n\t\treturn nil, common.ErrPacketToMessageRoutineStopped\n\t}\n\n\t// device will create or find existing connection and sends the MsgAssembler via that connection\n\ta.sendMsgCh <- regMd\n\n\t// block until transaction completes\n\tserverPpd := <-regMd.ResponseMsgCh\n\tclose(regMd.ResponseMsgCh)\n\n\tif serverPpd.Error != nil {\n\t\tlog.Error(\"agent(%s#%d)[RegisterPublicKey] failed to receive response from server %s: %v\", regMsg.UserId, regMd.TransactionId, addrStr, serverPpd.Error)\n\t\terr = serverPpd.Error\n\t\treturn nil, err\n\t}\n\n\tif serverPpd.HeaderType != core.NHP_RAK {\n\t\tlog.Error(\"agent(%s#%d)[RegisterPublicKey] response has wrong type: %s\", regMsg.UserId, regMd.TransactionId, core.HeaderTypeToString(serverPpd.HeaderType))\n\t\terr = common.ErrTransactionRepliedWithWrongType\n\t\treturn nil, err\n\t}\n\n\trakMsg = &common.ServerRegisterAckMsg{}\n\terr = json.Unmarshal(serverPpd.BodyMessage, rakMsg)\n\tif err != nil {\n\t\tlog.Error(\"agent(%s#%d)[RegisterPublicKey] failed to parse %s message: %v\", regMsg.UserId, regMd.TransactionId, core.HeaderTypeToString(serverPpd.HeaderType), err)\n\t\treturn nil, err\n\t}\n\n\tif rakMsg.ErrCode != common.ErrSuccess.ErrorCode() {\n\t\tlog.Error(\"agent(%s#%d)[RegisterPublicKey] response error: %s\", regMsg.UserId, regMd.TransactionId, rakMsg.ErrMsg)\n\t\terr = common.ErrorCodeToError(rakMsg.ErrCode)\n\t\treturn rakMsg, err\n\t}\n\n\tlog.Info(\"agent(%s#%d)[RegisterPublicKey] succeed\", regMsg.UserId, regMd.TransactionId)\n\treturn rakMsg, nil\n}\n\nfunc (a *UdpAgent) ListResource(target *KnockTarget) (lrtMsg *common.ServerListResultMsg, err error) {\n\ta.knockUserMutex.RLock()\n\tlstMsg := &common.AgentListMsg{\n\t\tUserId:         a.knockUser.UserId,\n\t\tDeviceId:       a.deviceId,\n\t\tOrganizationId: a.knockUser.OrganizationId,\n\t\tAuthServiceId:  target.AuthServiceId,\n\t\tUserData:       a.knockUser.UserData,\n\t}\n\ta.knockUserMutex.RUnlock()\n\tlstBytes, _ := json.Marshal(lstMsg)\n\n\tserverPeer := target.GetServerPeer()\n\tif serverPeer == nil {\n\t\tlog.Critical(\"agent(%s)[ListResource] server is not assigned\", lstMsg.UserId)\n\t\treturn nil, common.ErrKnockServerNotFound\n\t}\n\n\tsendAddr := serverPeer.SendAddr()\n\tif sendAddr == nil {\n\t\tlog.Critical(\"agent(%s)[ListResource] server IP cannot be parsed\", lstMsg.UserId)\n\t\treturn nil, common.ErrKnockServerNotFound\n\t}\n\taddrStr := sendAddr.String()\n\n\tlstMd := &core.MsgData{\n\t\tRemoteAddr:    sendAddr.(*net.UDPAddr),\n\t\tHeaderType:    core.NHP_LST,\n\t\tCipherScheme:  a.config.DefaultCipherScheme,\n\t\tTransactionId: a.device.NextCounterIndex(),\n\t\tCompress:      true,\n\t\tMessage:       lstBytes,\n\t\tPeerPk:        serverPeer.PublicKey(),\n\t\tResponseMsgCh: make(chan *core.PacketParserData),\n\t}\n\n\tif !a.IsRunning() {\n\t\tlog.Error(\"agent(%s#%d)[ListResource] MsgData channel closed or being closed, skip sending\", lstMsg.UserId, lstMd.TransactionId)\n\t\treturn nil, common.ErrPacketToMessageRoutineStopped\n\t}\n\n\t// device will create or find existing connection and sends the MsgAssembler via that connection\n\ta.sendMsgCh <- lstMd\n\n\t// block until transaction completes\n\tserverPpd := <-lstMd.ResponseMsgCh\n\tclose(lstMd.ResponseMsgCh)\n\n\tif serverPpd.Error != nil {\n\t\tlog.Error(\"agent(%s#%d)[ListResource] failed to receive response from server %s: %v\", lstMsg.UserId, lstMd.TransactionId, addrStr, serverPpd.Error)\n\t\terr = serverPpd.Error\n\t\treturn nil, err\n\t}\n\n\tif serverPpd.HeaderType != core.NHP_LRT {\n\t\tlog.Error(\"agent(%s#%d)[ListResource] response has wrong type: %s\", lstMsg.UserId, lstMd.TransactionId, core.HeaderTypeToString(serverPpd.HeaderType))\n\t\terr = common.ErrTransactionRepliedWithWrongType\n\t\treturn nil, err\n\t}\n\n\tlrtMsg = &common.ServerListResultMsg{}\n\terr = json.Unmarshal(serverPpd.BodyMessage, lrtMsg)\n\tif err != nil {\n\t\tlog.Error(\"agent(%s#%d)[ListResource] failed to parse %s message: %v\", lstMsg.UserId, lstMd.TransactionId, core.HeaderTypeToString(serverPpd.HeaderType), err)\n\t\treturn nil, err\n\t}\n\n\tif lrtMsg.ErrCode != common.ErrSuccess.ErrorCode() {\n\t\tlog.Error(\"agent(%s#%d)[ListResource] list response error: %s\", lstMsg.UserId, lstMd.TransactionId, lrtMsg.ErrMsg)\n\t\terr = common.ErrorCodeToError(lrtMsg.ErrCode)\n\t\treturn lrtMsg, err\n\t}\n\n\tlog.Info(\"agent(%s#%d)[ListResource] succeed\", lstMsg.UserId, lstMd.TransactionId)\n\treturn lrtMsg, nil\n}\n"
  },
  {
    "path": "endpoints/agent/service.go",
    "content": "package agent\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/gin-gonic/gin\"\n\ttoml \"github.com/pelletier/go-toml/v2\"\n\n\t\"github.com/OpenNHP/opennhp/nhp/common\"\n\t\"github.com/OpenNHP/opennhp/nhp/core/verifier\"\n\twasmEngine \"github.com/OpenNHP/opennhp/nhp/core/wasm/engine\"\n\t\"github.com/OpenNHP/opennhp/nhp/log\"\n\tutils \"github.com/OpenNHP/opennhp/nhp/utils\"\n)\n\nvar (\n\troutes = struct {\n\t\tsync.RWMutex\n\t\tm map[string]map[string]gin.HandlerFunc // method -> path -> handler\n\t}{m: make(map[string]map[string]gin.HandlerFunc)}\n\n\tserviceApiPrefix = \"/api/v1\"\n)\n\nfunc (a *UdpAgent) CheckAgentSafeOrNot(targetPaths ...string) gin.HandlerFunc {\n\treturn func(c *gin.Context) {\n\t\tpath := c.Request.URL.Path\n\t\tfor _, target := range targetPaths {\n\t\t\tif strings.HasPrefix(path, target) {\n\t\t\t\tif !a.safeTee.Load() {\n\t\t\t\t\tc.JSON(http.StatusForbidden, gin.H{\"error\": \"TEE in which is Agent is not safe\"})\n\t\t\t\t\tc.Abort()\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc (a *UdpAgent) CreateDHPWebConsole() {\n\tgin.SetMode(gin.ReleaseMode)\n\trouter := gin.Default()\n\n\trouter.Use(a.CheckAgentSafeOrNot(taApiPrefix))\n\n\trouter.POST(fmt.Sprintf(\"%s/%s\", serviceApiPrefix, \"config/server\"), a.configServer)\n\trouter.GET(fmt.Sprintf(\"%s/%s\", serviceApiPrefix, \"config/server\"), a.getServerConfig)\n\n\trouter.GET(fmt.Sprintf(\"%s/%s\", serviceApiPrefix, \"key/agent\"), a.getAgentPublicKey)\n\trouter.GET(fmt.Sprintf(\"%s/%s\", serviceApiPrefix, \"key/tee\"), a.getTeePublicKey)\n\trouter.POST(fmt.Sprintf(\"%s/%s\", serviceApiPrefix, \"key/agent/rotate\"), a.rotateAgentKey)\n\trouter.POST(fmt.Sprintf(\"%s/%s\", serviceApiPrefix, \"key/tee/rotate\"), a.rotateTeeKey)\n\n\trouter.GET(fmt.Sprintf(\"%s/%s\", serviceApiPrefix, \"agent/restart\"), a.restartAgent)\n\n\trouter.GET(fmt.Sprintf(\"%s/%s\", serviceApiPrefix, \"status/agent\"), a.getTeeStatus)\n\n\trouter.GET(fmt.Sprintf(\"%s/%s\", serviceApiPrefix, \"attestation/tee\"), a.getTeeAttestation)\n\n\trouter.POST(fmt.Sprintf(\"%s/%s\", taApiPrefix, \"register\"), a.registerTAService)\n\n\t// Dynamic route handler - this catches all requests and checks our dynamic routes\n\trouter.NoRoute(func(c *gin.Context) {\n\t\tmethod := c.Request.Method\n\t\tpath := c.Request.URL.Path\n\n\t\troutes.RLock()\n\t\tdefer routes.RUnlock()\n\n\t\t// Check if we have a handler for this method and path\n\t\tif methodRoutes, ok := routes.m[method]; ok {\n\t\t\tif handler, ok := methodRoutes[path]; ok {\n\t\t\t\thandler(c)\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\n\t\t// If no dynamic route found, return 404\n\t\tc.JSON(http.StatusNotFound, gin.H{\"error\": \"Route not found\"})\n\t})\n\n\tgo func() {\n\t\tid := time.Now().Format(\"2006-01-02 15:04:05\")\n\t\tlog.Info(\"==================================================\")\n\t\tlog.Info(\"===  DHP Web Console (%s) started  ===\", id)\n\t\tlog.Info(\"==================================================\")\n\n\t\tif err := router.RunTLS(\n\t\t\t\":443\", filepath.Join(common.ExeDirPath, \"etc\", \"certs\", \"server.crt\"), filepath.Join(common.ExeDirPath, \"etc\", \"certs\", \"server.key\"),\n\t\t); err != nil {\n\t\t\tpanic(err)\n\t\t}\n\t}()\n}\n\nfunc (a *UdpAgent) registerTAService(c *gin.Context) {\n\tdescription := c.PostForm(\"description\")\n\tlanguage := c.PostForm(\"language\")\n\tentry := c.PostForm(\"entry\")\n\ttaName := c.PostForm(\"name\")\n\n\tif taName == \"\" || description == \"\" || language == \"\" || entry == \"\" {\n\t\tc.JSON(http.StatusBadRequest, gin.H{\"error\": \"Invalid parameters, ta name, description, language, entry are required\"})\n\t\treturn\n\t}\n\n\tfile, err := c.FormFile(\"file\")\n\tif err != nil {\n\t\tc.JSON(http.StatusBadRequest, gin.H{\"error\": err.Error()})\n\t\treturn\n\t}\n\n\ttaDir := filepath.Join(ExeDirPath, \"etc\", \"ta\")\n\tif err := os.MkdirAll(taDir, 0755); err != nil {\n\t\tc.JSON(http.StatusInternalServerError, gin.H{\"error\": err.Error()})\n\t\treturn\n\t}\n\n\tfileUuid, err := utils.GenerateUUIDv4()\n\tif err != nil {\n\t\tc.JSON(http.StatusInternalServerError, gin.H{\"error\": err.Error()})\n\t\treturn\n\t}\n\n\tfullFilePath := filepath.Join(taDir, fileUuid, file.Filename)\n\tif err := c.SaveUploadedFile(file, fullFilePath); err != nil {\n\t\tc.JSON(http.StatusInternalServerError, gin.H{\"error\": err.Error()})\n\t\treturn\n\t}\n\n\tif err := os.Chmod(fullFilePath, 0755); err != nil {\n\t\tc.JSON(http.StatusInternalServerError, gin.H{\"error\": err.Error()})\n\t\treturn\n\t}\n\n\t// calculate the md5sum of the file\n\tmd5sum, err := utils.Md5sum(fullFilePath)\n\tif err != nil {\n\t\tc.JSON(http.StatusInternalServerError, gin.H{\"error\": err.Error()})\n\t\treturn\n\t}\n\n\t_, err = os.Stat(filepath.Join(taDir, md5sum))\n\tif err == nil { // corresponding trusted application has been uploaded.\n\t\tos.Remove(fullFilePath)\n\t\tos.Remove(filepath.Join(taDir, fileUuid))\n\n\t\tfileInfo, err := utils.LoadJsonFileAsStruct(filepath.Join(taDir, md5sum))\n\t\tif err != nil {\n\t\t\tc.JSON(http.StatusInternalServerError, gin.H{\"error\": err.Error()})\n\t\t\treturn\n\t\t}\n\t\tfileUuid = fileInfo.(map[string]any)[\"uuid\"].(string)\n\t}\n\n\t// save file information into the file which name is md5sum, no matter the file exists or not.\n\tif err := utils.SaveStructAsJsonFile(filepath.Join(taDir, md5sum), map[string]any{\n\t\t\"fileName\":    file.Filename,\n\t\t\"name\":        taName,\n\t\t\"uuid\":        fileUuid,\n\t\t\"size\":        file.Size,\n\t\t\"description\": description,\n\t\t\"language\":    language,\n\t\t\"entry\":       entry,\n\t}); err != nil {\n\t\tc.JSON(http.StatusInternalServerError, gin.H{\"error\": err.Error()})\n\t\treturn\n\t}\n\n\tta, err := NewTrustApplication(fileUuid, language, filepath.Join(taDir, fileUuid, file.Filename))\n\tif err != nil {\n\t\tc.JSON(http.StatusInternalServerError, gin.H{\"error\": err.Error()})\n\t\treturn\n\t}\n\n\ta.addTARoute(ta)\n\n\tc.JSON(http.StatusOK, ta.GetSupportedFunctions())\n}\n\nfunc (a *UdpAgent) addTARoute(ta *TrustedApplication) {\n\troutes.Lock()\n\tfor _, function := range ta.Functions {\n\t\tif _, exists := routes.m[function.Method]; !exists {\n\t\t\troutes.m[function.Method] = make(map[string]gin.HandlerFunc)\n\t\t}\n\n\t\tif _, exists := routes.m[function.Method][function.Name]; !exists {\n\t\t\troutes.m[function.Method][function.Name] = a.callFunction\n\t\t}\n\t}\n\troutes.Unlock()\n}\n\nfunc (a *UdpAgent) callFunction(c *gin.Context) {\n\tpath := c.Request.URL.Path\n\n\tvar body map[string]any\n\n\tif err := c.BindJSON(&body); err != nil {\n\t\tc.JSON(http.StatusBadRequest, gin.H{\"error\": err.Error()})\n\t\treturn\n\t}\n\n\tif _, exist := body[\"doId\"]; !exist {\n\t\tc.JSON(http.StatusBadRequest, gin.H{\"error\": \"doId is missing\"})\n\t\treturn\n\t}\n\n\tparts := strings.Split(path, \"/\")\n\n\t// url example: /api/v1/ta/<taId>/<function>\n\tfunction := parts[len(parts)-1]\n\ttaId := parts[len(parts)-2]\n\n\tccRes, err := a.StartConfidentialComputing(body[\"doId\"].(string), taId, function, body)\n\tif err != nil {\n\t\tc.JSON(http.StatusInternalServerError, gin.H{\"error\": err.Error()})\n\t\treturn\n\t}\n\n\tc.JSON(http.StatusOK, ccRes)\n}\n\nfunc (a *UdpAgent) getAgentPublicKey(c *gin.Context) {\n\tc.JSON(http.StatusOK, gin.H{\"publicKey\": a.config.GetAgentEcdh().PublicKeyBase64()})\n}\n\nfunc (a *UdpAgent) getTeePublicKey(c *gin.Context) {\n\tc.JSON(http.StatusOK, gin.H{\"publicKey\": a.config.GetTeeEcdh().PublicKeyBase64()})\n}\n\nfunc (a *UdpAgent) configServer(c *gin.Context) {\n\tvar peers Peers\n\n\tif err := c.BindJSON(&peers); err != nil {\n\t\tc.JSON(http.StatusBadRequest, gin.H{\"error\": err.Error()})\n\t\treturn\n\t}\n\n\tfileName := filepath.Join(ExeDirPath, \"etc\", \"server.toml\")\n\n\tfile, err := os.Create(fileName)\n\tif err != nil {\n\t\tc.JSON(http.StatusInternalServerError, gin.H{\"error\": err.Error()})\n\t\treturn\n\t}\n\tdefer file.Close()\n\n\tencoder := toml.NewEncoder(file)\n\tif err := encoder.Encode(peers); err != nil {\n\t\tc.JSON(http.StatusInternalServerError, gin.H{\"error\": err.Error()})\n\t\treturn\n\t}\n\n\tc.JSON(http.StatusOK, gin.H{\"msg\": \"successfully configure nhp server info in agent\"})\n}\n\nfunc (a *UdpAgent) getServerConfig(c *gin.Context) {\n\tvar peers Peers\n\n\tfileName := filepath.Join(ExeDirPath, \"etc\", \"server.toml\")\n\tcontent, err := os.ReadFile(fileName)\n\tif err != nil {\n\t\tc.JSON(http.StatusInternalServerError, gin.H{\"error\": err.Error()})\n\t\treturn\n\t}\n\n\terr = toml.Unmarshal(content, &peers)\n\tif err != nil {\n\t\tc.JSON(http.StatusInternalServerError, gin.H{\"error\": err.Error()})\n\t\treturn\n\t}\n\n\tc.JSON(http.StatusOK, peers)\n}\n\nfunc (a *UdpAgent) restartAgent(c *gin.Context) {\n\terr := a.RestartAgent()\n\tif err != nil {\n\t\tc.JSON(http.StatusInternalServerError, gin.H{\"error\": err.Error()})\n\t}\n\n\tc.JSON(http.StatusOK, gin.H{\"msg\": \"successfully restart agent\"})\n}\n\nfunc (a *UdpAgent) getTeeStatus(c *gin.Context) {\n\tc.JSON(http.StatusOK, gin.H{\n\t\t\"running\":             a.IsRunning(),\n\t\t\"attestationVerified\": a.safeTee.Load(),\n\t\t\"trustedByNHPServer\":  a.trustedByNHPServer.Load(),\n\t\t\"trustedByNHPDB\":      a.trustedByNHPDB.Load(),\n\t})\n}\n\nfunc (a *UdpAgent) getTeeAttestation(c *gin.Context) {\n\tevidence, err := wasmEngine.GetEvidence()\n\tif err != nil {\n\t\tc.JSON(http.StatusInternalServerError, gin.H{\"error\": err.Error()})\n\t\treturn\n\t}\n\n\tattestationVerifier, err := verifier.NewVerifier(evidence)\n\tif err != nil {\n\t\tc.JSON(http.StatusInternalServerError, gin.H{\"error\": err.Error()})\n\t\treturn\n\t}\n\n\tmeasure := attestationVerifier.GetMeasure()\n\tsn := attestationVerifier.GetSerialNumber()\n\n\tc.JSON(http.StatusOK, gin.H{\n\t\t\"measure\": measure,\n\t\t\"sn\":      sn,\n\t})\n}\n\nfunc (a *UdpAgent) rotateAgentKey(c *gin.Context) {\n\tif err := a.RotateAgentKey(); err != nil {\n\t\tc.JSON(http.StatusInternalServerError, gin.H{\"error\": err.Error()})\n\t\treturn\n\t}\n\n\tif err := a.RestartAgent(); err != nil {\n\t\tc.JSON(http.StatusInternalServerError, gin.H{\"error\": err.Error()})\n\t\treturn\n\t}\n\n\tc.JSON(http.StatusOK, gin.H{\"msg\": \"successfully rotate agent key\"})\n}\n\nfunc (a *UdpAgent) rotateTeeKey(c *gin.Context) {\n\tif err := a.RotateTeeKey(); err != nil {\n\t\tc.JSON(http.StatusInternalServerError, gin.H{\"error\": err.Error()})\n\t\treturn\n\t}\n\n\tif err := a.RestartAgent(); err != nil {\n\t\tc.JSON(http.StatusInternalServerError, gin.H{\"error\": err.Error()})\n\t\treturn\n\t}\n\n\tc.JSON(http.StatusOK, gin.H{\"msg\": \"successfully rotate TEE key\"})\n}\n"
  },
  {
    "path": "endpoints/agent/ta.go",
    "content": "package agent\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"sync\"\n\n\t\"github.com/mark3labs/mcp-go/client\"\n\t\"github.com/mark3labs/mcp-go/client/transport\"\n\t\"github.com/mark3labs/mcp-go/mcp\"\n\n\t\"github.com/OpenNHP/opennhp/nhp/log\"\n)\n\nvar (\n\ttaApiPrefix    = fmt.Sprintf(\"%s/ta\", serviceApiPrefix)\n\tbufferedTaMap  = make(map[string]*TrustedApplication)\n\tbufferedTaLock sync.Mutex\n)\n\ntype TAFunctionParam struct {\n\tName        string `json:\"name\"`\n\tDescription string `json:\"description\"`\n\tType        string `json:\"type\"`\n}\n\ntype TAFunction struct {\n\tMethod      string            `json:\"method\"`\n\tName        string            `json:\"name\"`\n\tDescription string            `json:\"description\"`\n\tParams      []TAFunctionParam `json:\"params\"`\n}\n\ntype TrustedApplication struct {\n\tId        string\n\tFunctions []TAFunction\n\tCtx       context.Context\n\tCancel    context.CancelFunc\n\tClient    *client.Client\n}\n\nfunc NewTrustApplication(tadId string, language string, entry string) (*TrustedApplication, error) {\n\tbufferedTaLock.Lock()\n\tdefer bufferedTaLock.Unlock()\n\tif _, exists := bufferedTaMap[tadId]; exists {\n\t\treturn bufferedTaMap[tadId], nil\n\t}\n\n\tta := &TrustedApplication{\n\t\tId:        tadId,\n\t\tFunctions: []TAFunction{},\n\t}\n\n\tctx, cancel := context.WithCancel(context.Background())\n\n\tvar c *client.Client\n\tvar err error\n\n\tstdioTransport := transport.NewStdio(entry, nil)\n\tc = client.NewClient(stdioTransport)\n\n\tif err := c.Start(ctx); err != nil {\n\t\tlog.Error(\"Failed to start trusted application: %v\", err)\n\t\tcancel()\n\t\treturn nil, err\n\t}\n\n\tinitRequest := mcp.InitializeRequest{}\n\tinitRequest.Params.ProtocolVersion = mcp.LATEST_PROTOCOL_VERSION\n\tinitRequest.Params.ClientInfo = mcp.Implementation{\n\t\tName:    \"Trusted Application Executor\",\n\t\tVersion: \"1.0.0\",\n\t}\n\tinitRequest.Params.Capabilities = mcp.ClientCapabilities{}\n\n\t_, err = c.Initialize(ctx, initRequest)\n\tif err != nil {\n\t\tlog.Error(\"Failed to initialize: %v\", err)\n\t\tcancel()\n\t\treturn nil, err\n\t}\n\n\ttoolsRequest := mcp.ListToolsRequest{}\n\ttoolsResult, err := c.ListTools(ctx, toolsRequest)\n\tif err != nil {\n\t\tlog.Error(\"Failed to list functions which are supported in trusted application: %v\", err)\n\t\tcancel()\n\t\treturn nil, err\n\t} else {\n\t\tfor _, tool := range toolsResult.Tools {\n\t\t\ttaFunc := TAFunction{\n\t\t\t\tMethod:      \"POST\",\n\t\t\t\tName:        fmt.Sprintf(\"%s/%s/%s\", taApiPrefix, ta.Id, tool.Name),\n\t\t\t\tDescription: tool.Description,\n\t\t\t\tParams: []TAFunctionParam{\n\t\t\t\t\t{\n\t\t\t\t\t\tName:        \"doId\",\n\t\t\t\t\t\tDescription: \"identifier of the data object\",\n\t\t\t\t\t\tType:        \"string\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t}\n\n\t\t\tschema := tool.InputSchema\n\t\t\tfor name, propSchema := range schema.Properties {\n\t\t\t\tif name == \"path\" { // path is injected by nhp agent\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tprop, _ := propSchema.(map[string]any)\n\t\t\t\ttaFuncParam := TAFunctionParam{\n\t\t\t\t\tName:        name,\n\t\t\t\t\tDescription: prop[\"description\"].(string),\n\t\t\t\t\tType:        prop[\"type\"].(string),\n\t\t\t\t}\n\t\t\t\ttaFunc.Params = append(taFunc.Params, taFuncParam)\n\t\t\t}\n\t\t\tta.Functions = append(ta.Functions, taFunc)\n\t\t}\n\t}\n\n\tta.Ctx = ctx\n\tta.Cancel = cancel\n\tta.Client = c\n\n\tif _, exists := bufferedTaMap[tadId]; !exists {\n\t\tbufferedTaMap[tadId] = ta\n\t}\n\n\treturn ta, nil\n}\n\nfunc GetTrustedApplication(trustedAppUuid string) (*TrustedApplication, error) {\n\tbufferedTaLock.Lock()\n\tdefer bufferedTaLock.Unlock()\n\n\tif ta, exists := bufferedTaMap[trustedAppUuid]; exists {\n\t\treturn ta, nil\n\t} else {\n\t\treturn nil, fmt.Errorf(\"TrustedApplication not found, please register first\")\n\t}\n}\n\nfunc (ta *TrustedApplication) GetSupportedFunctions() []TAFunction {\n\treturn ta.Functions\n}\n\nfunc (ta *TrustedApplication) CallFunction(function string, params map[string]any) (string, error) {\n\tcallRequest := mcp.CallToolRequest{\n\t\tParams: mcp.CallToolParams{\n\t\t\tName:      function,\n\t\t\tArguments: params,\n\t\t},\n\t}\n\n\tcallResponse, err := ta.Client.CallTool(ta.Ctx, callRequest)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\t// check the type of content\n\tswitch firstContent := callResponse.Content[0].(type) {\n\tcase mcp.TextContent:\n\t\treturn firstContent.Text, nil\n\tdefault:\n\t\treturn \"\", fmt.Errorf(\"unexpected content type: %T\", callResponse.Content[0])\n\t}\n}\n"
  },
  {
    "path": "endpoints/agent/udpagent.go",
    "content": "package agent\n\nimport (\n\t\"encoding/base64\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"net\"\n\t\"path/filepath\"\n\t\"strconv\"\n\t\"sync\"\n\t\"sync/atomic\"\n\t\"time\"\n\n\t\"github.com/OpenNHP/opennhp/nhp/common\"\n\t\"github.com/OpenNHP/opennhp/nhp/core\"\n\twasmEngine \"github.com/OpenNHP/opennhp/nhp/core/wasm/engine\"\n\tztdolib \"github.com/OpenNHP/opennhp/nhp/core/ztdo\"\n\t\"github.com/OpenNHP/opennhp/nhp/log\"\n\tutils \"github.com/OpenNHP/opennhp/nhp/utils\"\n\t\"github.com/OpenNHP/opennhp/nhp/version\"\n)\n\nvar (\n\tExeDirPath                 string\n\tSmartDataPolicyRefreshTime = 15 * int64(time.Second)\n)\n\ntype KnockUser struct {\n\tUserId         string\n\tOrganizationId string\n\tUserData       map[string]any\n}\n\ntype KnockResource struct {\n\tAuthServiceId  string `json:\"aspId\"`\n\tResourceId     string `json:\"resId\"`\n\tServerHostname string `json:\"serverHostname\"`\n\tServerIp       string `json:\"serverIp\"`\n\tServerPort     int    `json:\"serverPort\"`\n}\n\nfunc (res *KnockResource) Id() string {\n\treturn res.AuthServiceId + \"/\" + res.ResourceId\n}\n\nfunc (res *KnockResource) ServerHost() string {\n\thostAddr := res.ServerIp\n\tif len(res.ServerHostname) > 0 {\n\t\thostAddr = res.ServerHostname\n\t}\n\tif res.ServerPort == 0 {\n\t\treturn hostAddr\n\t}\n\treturn fmt.Sprintf(\"%s:%d\", hostAddr, res.ServerPort)\n}\n\ntype KnockTarget struct {\n\tsync.Mutex\n\tKnockResource\n\tServerPeer           *core.UdpPeer\n\tLastKnockSuccessTime time.Time\n}\n\nfunc (kt *KnockTarget) SetResource(res *KnockResource) {\n\tkt.Lock()\n\tdefer kt.Unlock()\n\n\tkt.KnockResource = *res\n}\n\nfunc (kt *KnockTarget) SetServerPeer(peer *core.UdpPeer) {\n\tkt.Lock()\n\tdefer kt.Unlock()\n\n\tkt.ServerPeer = peer\n}\n\nfunc (kt *KnockTarget) GetServerPeer() *core.UdpPeer {\n\tkt.Lock()\n\tdefer kt.Unlock()\n\n\treturn kt.ServerPeer\n}\n\ntype UdpAgent struct {\n\tstats struct {\n\t\ttotalRecvBytes uint64\n\t\ttotalSendBytes uint64\n\t}\n\n\tconfig *Config\n\tlog    *log.Logger\n\n\tremoteConnectionMutex sync.Mutex\n\tremoteConnectionMap   map[string]*UdpConn // indexed by remote UDP address\n\n\tknockTargetMapMutex sync.Mutex\n\tknockTargetMap      map[string]*KnockTarget // indexed by aspId + resId\n\n\tserverPeerMutex sync.Mutex\n\tserverPeerMap   map[string]*core.UdpPeer // indexed by server's public key\n\n\tdevice  *core.Device\n\twg      sync.WaitGroup\n\trunning atomic.Bool\n\n\tsignals struct {\n\t\tstop                  chan struct{}\n\t\tknockTargetStop       chan struct{}\n\t\tknockTargetMapUpdated chan struct{}\n\t}\n\n\trecvMsgCh <-chan *core.PacketParserData\n\tsendMsgCh chan *core.MsgData\n\n\t// one agent should serve only one specific user at a time\n\tknockUserMutex sync.RWMutex\n\tknockUser      *KnockUser\n\tdeviceId       string\n\tcheckResults   map[string]any\n\n\t// dhp\n\tsmartPolicyEngine          map[string]*wasmEngine.Engine // index by smart data policy identifier\n\tdecryptedZtdoRecord        map[string]string             // index by data object id\n\tsmartPolicyIdentifier      map[string]string             // index by data object id\n\tsmartDataPolicyRefreshTime map[string]int64              // indexed by data object id, use to record the refresh time of smart data policy, the unit of time is UnixNano\n\tdataAccessRefreshMutex     sync.Mutex\n\n\tsafeTee            atomic.Bool\n\ttrustedByNHPServer atomic.Bool\n\ttrustedByNHPDB     atomic.Bool\n}\n\ntype UdpConn struct {\n\tConnData *core.ConnectionData\n\tnetConn  *net.UDPConn\n}\n\nfunc (c *UdpConn) Close() {\n\tc.netConn.Close()\n\tc.ConnData.Close()\n}\n\n/*\ndirPath: the path of app or shared library entry point\nlogLevel: 0: silent, 1: error, 2: info, 3: debug, 4: verbose\n*/\nfunc (a *UdpAgent) Start(dirPath string, logLevel int) (err error) {\n\tcommon.ExeDirPath = dirPath\n\tExeDirPath = dirPath\n\t// init logger\n\ta.log = log.NewLogger(\"NHP-Agent\", logLevel, filepath.Join(ExeDirPath, \"logs\"), \"agent\")\n\tlog.SetGlobalLogger(a.log)\n\n\tlog.Info(\"=========================================================\")\n\tlog.Info(\"=== NHP-Agent %s started                           ===\", version.Version)\n\tlog.Info(\"=== REVISION %s ===\", version.CommitId)\n\tlog.Info(\"=== RELEASE %s                       ===\", version.BuildTime)\n\tlog.Info(\"=========================================================\")\n\terr = a.loadBaseConfig()\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = a.loadDHPConfig()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tprk, err := base64.StdEncoding.DecodeString(a.config.PrivateKeyBase64)\n\tif err != nil {\n\t\tlog.Error(\"private key parse error %v\\n\", err)\n\t\treturn fmt.Errorf(\"private key parse error %v\", err)\n\t}\n\n\ta.device = core.NewDevice(core.NHP_AGENT, prk, nil)\n\tif a.device == nil {\n\t\tlog.Critical(\"failed to create device %v\\n\", err)\n\t\treturn fmt.Errorf(\"failed to create device %v\", err)\n\t}\n\n\t// start device routines\n\ta.device.Start()\n\n\t// load peers\n\t_ = a.loadPeers()\n\n\ta.remoteConnectionMap = make(map[string]*UdpConn)\n\n\ta.signals.stop = make(chan struct{})\n\ta.signals.knockTargetStop = make(chan struct{})\n\ta.signals.knockTargetMapUpdated = make(chan struct{}, 1)\n\n\t// load knock resources\n\t_ = a.loadResources()\n\n\ta.recvMsgCh = a.device.DecryptedMsgQueue\n\ta.sendMsgCh = make(chan *core.MsgData, core.SendQueueSize)\n\n\t// initialize dhp related stuff\n\ta.smartPolicyEngine = make(map[string]*wasmEngine.Engine)\n\ta.decryptedZtdoRecord = make(map[string]string)\n\ta.smartDataPolicyRefreshTime = make(map[string]int64)\n\ta.smartPolicyIdentifier = make(map[string]string)\n\ta.trustedByNHPServer.Store(false)\n\ta.trustedByNHPDB.Store(false)\n\n\t// start agent routines\n\ta.wg.Add(2)\n\tgo a.sendMessageRoutine()\n\tgo a.recvMessageRoutine()\n\n\ta.running.Store(true)\n\ta.safeTee.Store(false)\n\n\ttime.Sleep(1000 * time.Millisecond)\n\n\treturn nil\n}\n\nfunc (a *UdpAgent) RestartAgent() error {\n\ta.Stop()\n\ta.config = nil // re-load config\n\terr := a.Start(common.ExeDirPath, 4)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\ta.StartDHPKnockLoop()\n\treturn nil\n}\n\nfunc (a *UdpAgent) StartKnockLoop() int {\n\ta.knockTargetMapMutex.Lock()\n\tsize := len(a.knockTargetMap)\n\ta.knockTargetMapMutex.Unlock()\n\t// start knock preset resources\n\ta.wg.Add(1)\n\tgo a.knockResourceRoutine()\n\n\treturn size\n}\n\nfunc (a *UdpAgent) StartDHPKnockLoop() {\n\ta.wg.Add(1)\n\tgo a.dhpKnockResourceRoutine()\n}\n\nfunc (a *UdpAgent) StopKnockLoop() {\n\tclose(a.signals.knockTargetStop)\n}\n\nfunc (a *UdpAgent) SetKnockUser(usrId string, orgId string, userData map[string]any) {\n\ta.knockUserMutex.Lock()\n\ta.knockUser.UserId = usrId\n\ta.knockUser.OrganizationId = orgId\n\ta.knockUser.UserData = userData\n\ta.knockUserMutex.Unlock()\n}\n\nfunc (a *UdpAgent) SetDeviceId(devId string) {\n\ta.deviceId = devId\n}\n\nfunc (a *UdpAgent) SetCheckResults(results map[string]any) {\n\ta.checkResults = results\n}\n\n// export Stop\nfunc (a *UdpAgent) Stop() {\n\ta.running.Store(false)\n\tclose(a.signals.knockTargetStop)\n\tclose(a.signals.stop)\n\ta.device.Stop()\n\ta.StopConfigWatch()\n\ta.wg.Wait()\n\tclose(a.sendMsgCh)\n\tclose(a.signals.knockTargetMapUpdated)\n\n\tlog.Info(\"=========================\")\n\tlog.Info(\"=== NHP-Agent stopped ===\")\n\tlog.Info(\"=========================\")\n\ta.log.Close()\n}\n\nfunc (a *UdpAgent) IsRunning() bool {\n\treturn a.running.Load()\n}\n\nfunc (a *UdpAgent) newConnection(addr *net.UDPAddr) (conn *UdpConn) {\n\tconn = &UdpConn{}\n\tvar err error\n\t// unlike tcp, udp dial is fast (just socket bind), so no need to run in a thread\n\tconn.netConn, err = net.DialUDP(\"udp\", nil, addr)\n\tif err != nil {\n\t\tlog.Error(\"could not connect to remote addr %s\", addr.String())\n\t\treturn nil\n\t}\n\n\t// retrieve local port\n\tladdr := conn.netConn.LocalAddr()\n\tlocalAddr, err := net.ResolveUDPAddr(laddr.Network(), laddr.String())\n\tif err != nil {\n\t\tlog.Error(\"resolve local UDPAddr error %v\\n\", err)\n\t\treturn nil\n\t}\n\n\tlog.Info(\"Dial up new UDP connection from %s to %s\", localAddr.String(), addr.String())\n\n\tconn.ConnData = &core.ConnectionData{\n\t\tDevice:               a.device,\n\t\tCookieStore:          &core.CookieStore{},\n\t\tRemoteTransactionMap: make(map[uint64]*core.RemoteTransaction),\n\t\tLocalAddr:            localAddr,\n\t\tRemoteAddr:           addr,\n\t\tTimeoutMs:            DefaultConnectionTimeoutMs,\n\t\tSendQueue:            make(chan *core.Packet, PacketQueueSizePerConnection),\n\t\tRecvQueue:            make(chan *core.Packet, PacketQueueSizePerConnection),\n\t\tBlockSignal:          make(chan struct{}),\n\t\tSetTimeoutSignal:     make(chan struct{}),\n\t\tStopSignal:           make(chan struct{}),\n\t}\n\n\tconn.ConnData.Add(1)\n\tgo a.recvPacketRoutine(conn)\n\n\treturn conn\n}\n\nfunc (a *UdpAgent) sendMessageRoutine() {\n\tdefer a.wg.Done()\n\tdefer log.Info(\"sendMessageRoutine stopped\")\n\n\tlog.Info(\"sendMessageRoutine started\")\n\n\tfor {\n\t\tselect {\n\t\tcase <-a.signals.stop:\n\t\t\treturn\n\n\t\tcase md, ok := <-a.sendMsgCh:\n\t\t\tif !ok {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif md == nil || md.RemoteAddr == nil {\n\t\t\t\tlog.Warning(\"Invalid initiator session starter\")\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\taddrStr := md.RemoteAddr.String()\n\n\t\t\ta.remoteConnectionMutex.Lock()\n\t\t\tconn, found := a.remoteConnectionMap[addrStr]\n\t\t\ta.remoteConnectionMutex.Unlock()\n\n\t\t\tif found {\n\t\t\t\tmd.ConnData = conn.ConnData\n\t\t\t} else {\n\t\t\t\tconn = a.newConnection(md.RemoteAddr)\n\t\t\t\tif conn == nil {\n\t\t\t\t\tlog.Error(\"Failed to dial to remote address: %s\", addrStr)\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\ta.remoteConnectionMutex.Lock()\n\t\t\t\ta.remoteConnectionMap[addrStr] = conn\n\t\t\t\ta.remoteConnectionMutex.Unlock()\n\n\t\t\t\tmd.ConnData = conn.ConnData\n\n\t\t\t\t// launch connection routine\n\t\t\t\ta.wg.Add(1)\n\t\t\t\tgo a.connectionRoutine(conn)\n\t\t\t}\n\n\t\t\ta.device.SendMsgToPacket(md)\n\t\t}\n\t}\n\n}\n\nfunc (a *UdpAgent) SendPacket(pkt *core.Packet, conn *UdpConn) (n int, err error) {\n\tdefer func() {\n\t\tatomic.AddUint64(&a.stats.totalSendBytes, uint64(n))\n\t\tatomic.StoreInt64(&conn.ConnData.LastLocalSendTime, time.Now().UnixNano())\n\n\t\tif !pkt.KeepAfterSend {\n\t\t\ta.device.ReleasePoolPacket(pkt)\n\t\t}\n\t}()\n\n\tpktType := core.HeaderTypeToString(pkt.HeaderType)\n\t//log.Debug(\"Send [%s] packet (%s -> %s): %+v\", pktType, conn.ConnData.LocalAddr.String(), conn.ConnData.RemoteAddr.String(), pkt.Content)\n\tlog.Info(\"Send [%s] packet (%s -> %s), %d bytes\", pktType, conn.ConnData.LocalAddr.String(), conn.ConnData.RemoteAddr.String(), len(pkt.Content))\n\tlog.Evaluate(\"Send [%s] packet (%s -> %s), %d bytes\", pktType, conn.ConnData.LocalAddr.String(), conn.ConnData.RemoteAddr.String(), len(pkt.Content))\n\treturn conn.netConn.Write(pkt.Content)\n}\n\nfunc (a *UdpAgent) recvPacketRoutine(conn *UdpConn) {\n\taddrStr := conn.ConnData.RemoteAddr.String()\n\n\tdefer conn.ConnData.Done()\n\tdefer log.Debug(\"recvPacketRoutine for %s stopped\", addrStr)\n\n\tlog.Debug(\"recvPacketRoutine for %s started\", addrStr)\n\n\tfor {\n\t\tselect {\n\t\tcase <-conn.ConnData.StopSignal:\n\t\t\treturn\n\n\t\tdefault:\n\t\t}\n\n\t\t// udp recv, blocking until packet arrives or netConn.Close()\n\t\tpkt := a.device.AllocatePoolPacket()\n\t\tn, err := conn.netConn.Read(pkt.Buf[:])\n\t\tif err != nil {\n\t\t\ta.device.ReleasePoolPacket(pkt)\n\t\t\tif n == 0 {\n\t\t\t\t// udp connection closed, it is not an error\n\t\t\t\treturn\n\t\t\t}\n\t\t\tlog.Error(\"Failed to receive from remote address %s (%v)\", addrStr, err)\n\t\t\tcontinue\n\t\t}\n\n\t\t// add total recv bytes\n\t\tatomic.AddUint64(&a.stats.totalRecvBytes, uint64(n))\n\n\t\t// check minimal length\n\t\tif n < pkt.MinimalLength() {\n\t\t\ta.device.ReleasePoolPacket(pkt)\n\t\t\tlog.Error(\"Received UDP packet from %s is too short, discard\", addrStr)\n\t\t\tcontinue\n\t\t}\n\n\t\tpkt.Content = pkt.Buf[:n]\n\t\t//log.Trace(\"receive udp packet (%s -> %s): %+v\", conn.ConnData.RemoteAddr.String(), conn.ConnData.LocalAddr.String(), pkt.Content)\n\n\t\ttyp, _, err := a.device.RecvPrecheck(pkt)\n\t\tmsgType := core.HeaderTypeToString(typ)\n\t\tlog.Info(\"Receive [%s] packet (%s -> %s), %d bytes\", msgType, addrStr, conn.ConnData.LocalAddr.String(), n)\n\t\tlog.Evaluate(\"Receive [%s] packet (%s -> %s), %d bytes\", msgType, addrStr, conn.ConnData.LocalAddr.String(), n)\n\t\tif err != nil {\n\t\t\ta.device.ReleasePoolPacket(pkt)\n\t\t\tlog.Warning(\"Receive [%s] packet (%s -> %s), precheck error: %v\", msgType, addrStr, conn.ConnData.LocalAddr.String(), err)\n\t\t\tlog.Evaluate(\"Receive [%s] packet (%s -> %s) precheck error: %v\", msgType, addrStr, conn.ConnData.LocalAddr.String(), err)\n\t\t\tcontinue\n\t\t}\n\n\t\tatomic.StoreInt64(&conn.ConnData.LastLocalRecvTime, time.Now().UnixNano())\n\n\t\tconn.ConnData.ForwardInboundPacket(pkt)\n\t}\n}\n\nfunc (a *UdpAgent) connectionRoutine(conn *UdpConn) {\n\taddrStr := conn.ConnData.RemoteAddr.String()\n\n\tdefer a.wg.Done()\n\tdefer log.Debug(\"Connection routine: %s stopped\", addrStr)\n\n\tlog.Debug(\"Connection routine: %s started\", addrStr)\n\n\t// stop receiving packets and clean up\n\tdefer func() {\n\t\ta.remoteConnectionMutex.Lock()\n\t\tdelete(a.remoteConnectionMap, addrStr)\n\t\ta.remoteConnectionMutex.Unlock()\n\n\t\tconn.Close()\n\t}()\n\n\tfor {\n\t\tselect {\n\t\tcase <-a.signals.stop:\n\t\t\treturn\n\n\t\tcase <-conn.ConnData.SetTimeoutSignal:\n\t\t\tif conn.ConnData.TimeoutMs <= 0 {\n\t\t\t\tlog.Debug(\"Connection routine closed immediately\")\n\t\t\t\treturn\n\t\t\t}\n\n\t\tcase <-time.After(time.Duration(conn.ConnData.TimeoutMs) * time.Millisecond):\n\t\t\t// timeout, quit routine\n\t\t\tlog.Debug(\"Connection routine idle timeout\")\n\t\t\treturn\n\n\t\tcase pkt, ok := <-conn.ConnData.SendQueue:\n\t\t\tif !ok {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif pkt == nil {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\t_, _ = a.SendPacket(pkt, conn)\n\n\t\tcase pkt, ok := <-conn.ConnData.RecvQueue:\n\t\t\tif !ok {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif pkt == nil {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tlog.Debug(\"Received udp packet len [%d] from addr: %s\\n\", len(pkt.Content), addrStr)\n\n\t\t\t// process keepalive packet\n\t\t\tif pkt.HeaderType == core.NHP_KPL {\n\t\t\t\ta.device.ReleasePoolPacket(pkt)\n\t\t\t\tlog.Info(\"Receive [NHP_KPL] message (%s -> %s)\", addrStr, conn.ConnData.LocalAddr.String())\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tif a.device.IsTransactionResponse(pkt.HeaderType) {\n\t\t\t\t// forward to a specific transaction\n\t\t\t\ttransactionId := pkt.Counter()\n\t\t\t\ttransaction := a.device.FindLocalTransaction(transactionId)\n\t\t\t\tif transaction != nil {\n\t\t\t\t\ttransaction.NextPacketCh <- pkt\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tpd := &core.PacketData{\n\t\t\t\tBasePacket: pkt,\n\t\t\t\tConnData:   conn.ConnData,\n\t\t\t\tInitTime:   atomic.LoadInt64(&conn.ConnData.LastLocalRecvTime),\n\t\t\t}\n\t\t\t// generic receive\n\t\t\ta.device.RecvPacketToMsg(pd)\n\n\t\tcase <-conn.ConnData.BlockSignal:\n\t\t\tlog.Critical(\"blocking address %s\", addrStr)\n\t\t\treturn\n\t\t}\n\t}\n}\n\nfunc (a *UdpAgent) recvMessageRoutine() {\n\tdefer a.wg.Done()\n\tdefer log.Info(\"recvMessageRoutine stopped\")\n\n\tlog.Info(\"recvMessageRoutine started\")\n\n\tfor {\n\t\tselect {\n\t\tcase <-a.signals.stop:\n\t\t\treturn\n\n\t\tcase ppd, ok := <-a.recvMsgCh:\n\t\t\tif !ok {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif ppd == nil {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tswitch ppd.HeaderType {\n\t\t\tcase core.NHP_COK:\n\t\t\t\t// synchronously block and deal with cookie message to ensure future messages will be correctly processed. note cookie is not handled as a transaction, so it arrives in here\n\t\t\t\ta.HandleCookieMessage(ppd)\n\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc (a *UdpAgent) knockResourceRoutine() {\n\tdefer a.wg.Done()\n\tdefer log.Info(\"knockResourceRoutine stopped\")\n\n\tlog.Info(\"knockResourceRoutine started\")\n\n\tvar knockRoutineWg sync.WaitGroup\n\tdefer knockRoutineWg.Wait()\n\n\tfor {\n\t\ta.knockTargetMapMutex.Lock()\n\t\ttargetSize := len(a.knockTargetMap)\n\t\ttargetQuitArr := make([]chan struct{}, 0, targetSize)\n\n\t\tfor k, r := range a.knockTargetMap {\n\t\t\t// launch knock routine for each knock target\n\t\t\tq := make(chan struct{})\n\t\t\ttargetQuitArr = append(targetQuitArr, q)\n\n\t\t\tknockRoutineWg.Add(1)\n\t\t\tgo func(knockStr string, res *KnockTarget, quit <-chan struct{}) {\n\t\t\t\tdefer knockRoutineWg.Done()\n\t\t\t\tdefer log.Info(\"knock %s sub-routine stopped\", knockStr)\n\t\t\t\tdefer func() {\n\t\t\t\t\t_, _ = a.ExitKnockRequest(res)\n\t\t\t\t}()\n\n\t\t\t\tlog.Info(\"knock %s sub-routine started\", knockStr)\n\n\t\t\t\tfor {\n\t\t\t\t\tselect {\n\t\t\t\t\tcase <-a.signals.knockTargetStop:\n\t\t\t\t\t\treturn\n\t\t\t\t\tcase <-quit:\n\t\t\t\t\t\treturn\n\t\t\t\t\tdefault:\n\t\t\t\t\t}\n\n\t\t\t\t\tackMsg, err := a.Knock(res) // timeout in AgentLocalTransactionTimeoutMs\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t// if error happens wait some time (total AgentLocalTransactionResponseTimeoutMs) to retry\n\t\t\t\t\t\tlog.Error(\"failed to knock %s, error: %v\", knockStr, err)\n\t\t\t\t\t\tcontinue // retry knock\n\t\t\t\t\t}\n\n\t\t\t\t\tlog.Info(\"knock %s succeeded, next knock in %d seconds\", knockStr, ackMsg.OpenTime)\n\t\t\t\t\tselect {\n\t\t\t\t\tcase <-a.signals.knockTargetStop:\n\t\t\t\t\t\treturn\n\t\t\t\t\tcase <-quit:\n\t\t\t\t\t\treturn\n\t\t\t\t\tcase <-time.After(time.Second * time.Duration(ackMsg.OpenTime)):\n\t\t\t\t\t\t// continue knock\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}(k, r, q)\n\t\t}\n\t\ta.knockTargetMapMutex.Unlock()\n\n\t\t// block until knockTargetMap is updated\n\t\tselect {\n\t\tcase <-a.signals.knockTargetStop:\n\t\t\treturn\n\t\tcase <-a.signals.knockTargetMapUpdated:\n\t\t\t// stop all current knock routines\n\t\t\tfor _, q := range targetQuitArr {\n\t\t\t\tclose(q)\n\t\t\t}\n\t\t\tlog.Info(\"restart knock cycle with updated targets\")\n\t\t\t// continue and restart with new knock targets\n\t\t}\n\t}\n}\n\nfunc (a *UdpAgent) dhpKnockResourceRoutine() {\n\tdefer a.wg.Done()\n\tdefer log.Info(\"dhpKnockResourceRoutine stopped\")\n\n\tlog.Info(\"dhpKnockResourceRoutine started\")\n\n\tfor {\n\t\tselect {\n\t\tcase <-a.signals.stop:\n\t\t\treturn\n\t\tdefault: // don't block for knock failure\n\t\t}\n\t\tackMsg, err := a.KnockDHP()\n\n\t\tif err != nil {\n\t\t\ta.safeTee.Store(false)\n\n\t\t\t// if error happens wait some time (total AgentLocalTransactionResponseTimeoutMs) to retry\n\t\t\tlog.Error(\"failed to knock, error: %v\", err)\n\t\t\t// avoid flood attack from server side\n\t\t\ttime.Sleep(core.FailureRetryInterval * time.Second)\n\t\t\tcontinue // retry knock\n\t\t}\n\n\t\tlog.Info(\"knock succeeded, next knock in %d seconds\", ackMsg.OpenTime)\n\t\ta.safeTee.Store(true)\n\n\t\tselect {\n\t\tcase <-a.signals.stop:\n\t\t\treturn\n\t\tcase <-time.After(time.Second * time.Duration(ackMsg.OpenTime)):\n\t\t\t// continue knock\n\t\t}\n\t}\n}\n\nfunc (a *UdpAgent) AddServer(server *core.UdpPeer) {\n\tif server.DeviceType() == core.NHP_SERVER {\n\t\ta.device.AddPeer(server)\n\t\ta.serverPeerMutex.Lock()\n\t\ta.serverPeerMap[server.PublicKeyBase64()] = server\n\t\ta.serverPeerMutex.Unlock()\n\t}\n}\n\nfunc (a *UdpAgent) RemoveServer(serverKey string) {\n\ta.serverPeerMutex.Lock()\n\tdelete(a.serverPeerMap, serverKey)\n\ta.serverPeerMutex.Unlock()\n}\n\nfunc (a *UdpAgent) AddResource(res *KnockResource) error {\n\tpeer := a.FindServerPeerFromResource(res)\n\tif peer == nil {\n\t\tlog.Error(\"failed to find corresponding server peer for resource %s\", res.Id())\n\t\treturn common.ErrKnockServerNotFound\n\t}\n\n\tupdated := false\n\ta.knockTargetMapMutex.Lock()\n\ttarget, found := a.knockTargetMap[res.Id()]\n\tif found {\n\t\ttarget.SetResource(res)\n\t\ttarget.SetServerPeer(peer)\n\t} else {\n\t\ta.knockTargetMap[res.Id()] = &KnockTarget{\n\t\t\tKnockResource: *res,\n\t\t\tServerPeer:    peer,\n\t\t}\n\t\tupdated = true\n\t}\n\ta.knockTargetMapMutex.Unlock()\n\n\tif updated {\n\t\t// renew knock cycle\n\t\tif len(a.signals.knockTargetMapUpdated) == 0 {\n\t\t\ta.signals.knockTargetMapUpdated <- struct{}{}\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc (a *UdpAgent) RemoveResource(aspId string, resId string) {\n\tres := &KnockResource{\n\t\tAuthServiceId: aspId,\n\t\tResourceId:    resId,\n\t}\n\n\ta.knockTargetMapMutex.Lock()\n\tbeforeSize := len(a.knockTargetMap)\n\tdelete(a.knockTargetMap, res.Id())\n\tafterSize := len(a.knockTargetMap)\n\ta.knockTargetMapMutex.Unlock()\n\n\tif beforeSize != afterSize {\n\t\t// renew knock cycle\n\t\tif len(a.signals.knockTargetMapUpdated) == 0 {\n\t\t\ta.signals.knockTargetMapUpdated <- struct{}{}\n\t\t}\n\t}\n}\n\nfunc (a *UdpAgent) FindServerPeerFromResource(res *KnockResource) *core.UdpPeer {\n\ta.serverPeerMutex.Lock()\n\tdefer a.serverPeerMutex.Unlock()\n\tfor _, peer := range a.serverPeerMap {\n\t\tif peer.Host() == res.ServerHost() {\n\t\t\treturn peer\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc (a *UdpAgent) StartConfidentialComputing(ztdoId string, taId string, function string, params map[string]any) (any, error) {\n\tvar err error\n\tvar policyId string\n\n\toutput, refreshSdp, decrypted := a.PreCheckDataAccess(ztdoId)\n\n\tif refreshSdp {\n\t\ta.dataAccessRefreshMutex.Lock()\n\t\tdefer a.dataAccessRefreshMutex.Unlock()\n\n\t\t// secondly check again\n\t\toutput, refreshSdp, decrypted = a.PreCheckDataAccess(ztdoId)\n\n\t\tif refreshSdp {\n\t\t\toutput, err = a.RefreshDataAccess(ztdoId, decrypted, output)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, fmt.Errorf(\"Failed to refresh SDP: %s\", err.Error())\n\t\t\t}\n\t\t}\n\t}\n\n\t// inject data path to params\n\tparams[\"path\"] = output\n\n\tvar exist bool\n\tif policyId, exist = a.smartPolicyIdentifier[ztdoId]; !exist {\n\t\treturn nil, fmt.Errorf(\"Error: fail to find policyId for ztdoId %s.\\n\", ztdoId)\n\t}\n\n\ttaRes, err := a.CallTrustedApplication(taId, function, params, policyId)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"fail to call trusted application with error: %s\\n\", err.Error())\n\t} else {\n\t\tvar structResult map[string]any\n\n\t\terr := json.Unmarshal([]byte(taRes), &structResult)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"fail to unmarshal confidential computing result: %s\\n\", err.Error())\n\t\t}\n\n\t\treturn structResult, nil\n\t}\n}\n\nfunc (a *UdpAgent) PreCheckDataAccess(ztdoId string) (output string, refreshSdp bool, decrypted bool) {\n\toutput = \"\"\n\n\t// Check whether the smart data policy needs to be refreshed\n\tif sdpRefreshTime, exist := a.smartDataPolicyRefreshTime[ztdoId]; exist {\n\t\tif time.Now().UnixNano()-sdpRefreshTime > SmartDataPolicyRefreshTime {\n\t\t\trefreshSdp = true\n\t\t}\n\t} else {\n\t\trefreshSdp = true\n\t}\n\n\t// Check whether the ZTDO has been decrypted\n\tif plaintextPath, exist := a.decryptedZtdoRecord[ztdoId]; exist {\n\t\toutput = plaintextPath\n\t\tdecrypted = true\n\t} else {\n\t\tdecrypted = false\n\t\trefreshSdp = true\n\t}\n\n\treturn output, refreshSdp, decrypted\n}\n\nfunc (a *UdpAgent) RefreshDataAccess(ztdoId string, decrypted bool, decryptedOutput string) (output string, err error) {\n\tztdo := ztdolib.NewZtdo()\n\n\tconsumerEphemeralEcdh := core.NewECDH(a.config.GetEccType())\n\tteeEcdh := a.config.GetTeeEcdh()\n\n\tdarMsg := common.DARMsg{\n\t\tDoId:                       ztdoId,\n\t\tUserId:                     a.config.UserId,\n\t\tTeePublicKey:               teeEcdh.PublicKeyBase64(),\n\t\tConsumerEphemeralPublicKey: consumerEphemeralEcdh.PublicKeyBase64(),\n\t}\n\tserverPeer := a.GetFirstServerPeer()\n\tresult, dagMsg := a.SendDARMsgToServer(serverPeer, darMsg)\n\tif result {\n\t\ta.trustedByNHPDB.Store(true) // agent has been trusted by NHP DB\n\n\t\t// update smart data policy refresh time\n\t\ta.smartDataPolicyRefreshTime[ztdoId] = time.Now().UnixNano()\n\n\t\tlog.Info(\"[StartConfidentialComputing] Refresh smart data policy for data object which id is %s\", ztdoId)\n\n\t\tif !decrypted {\n\t\t\toutput, err = utils.GenerateTempFilePath(\"plaintext-*\")\n\t\t\tif err != nil {\n\t\t\t\treturn \"\", fmt.Errorf(\"Error: fail to generating temporary file path: %w\", err)\n\t\t\t}\n\n\t\t\tdataPrkWrapping := ztdolib.DataPrivateKeyWrapping{}\n\n\t\t\tif err := json.Unmarshal([]byte(dagMsg.Kao.WrappedDataKey), &dataPrkWrapping); err != nil {\n\t\t\t\tlog.Error(\"failed to unmarshal data private key wrapping: %v\\n\", err)\n\t\t\t\treturn \"\", fmt.Errorf(\"failed to unmarshal data private key wrapping: %v\", err)\n\t\t\t}\n\n\t\t\tproviderPbk, _ := base64.StdEncoding.DecodeString(dataPrkWrapping.ProviderPublicKeyBase64)\n\n\t\t\tif dagMsg.AccessUrl == \"\" {\n\t\t\t\tlog.Error(\"access url is empty, please check with data provider\")\n\t\t\t\treturn \"\", fmt.Errorf(\"access url is empty, please check with data provider\")\n\t\t\t}\n\n\t\t\tvar err error\n\t\t\tztdoPath, err := utils.DownloadFileToTemp(dagMsg.AccessUrl, \"ztdo-\")\n\t\t\tif err != nil {\n\t\t\t\tlog.Error(\"failed to download ztdo: %v\\n\", err)\n\t\t\t\treturn \"\", fmt.Errorf(\"failed to download ztdo: %v\", err)\n\t\t\t}\n\n\t\t\tif err := ztdo.ParseHeader(ztdoPath); err != nil {\n\t\t\t\tfmt.Printf(\"Error: failed to parse ztdo header:%s\\n\", err)\n\t\t\t\treturn \"\", fmt.Errorf(\"failed to parse ztdo header:%s\", err)\n\t\t\t}\n\n\t\t\tif ztdoId != ztdo.GetObjectID() {\n\t\t\t\tfmt.Printf(\"Error: ztdo id mismatch, please check with data provider\\n\")\n\t\t\t\treturn \"\", fmt.Errorf(\"ztdo id mismatch, please check with data provider\")\n\t\t\t}\n\n\t\t\t// decrypt data private key\n\t\t\tsaDataPrk := ztdolib.NewSymmetricAgreement(ztdo.GetECCMode(), false)\n\t\t\tsaDataPrk.SetMessagePatterns(ztdolib.DataPrivateKeyWrappingPatterns)\n\t\t\tsaDataPrk.SetPsk([]byte(ztdolib.InitialDHPKeyWrappingString))\n\t\t\tsaDataPrk.SetStaticKeyPair(teeEcdh)\n\t\t\tsaDataPrk.SetEphemeralKeyPair(consumerEphemeralEcdh)\n\t\t\tsaDataPrk.SetRemoteStaticPublicKey(providerPbk)\n\n\t\t\tgcmKey, ad := saDataPrk.AgreeSymmetricKey()\n\n\t\t\tdataPrkBase64, err := dataPrkWrapping.Unwrap(gcmKey[:], ad)\n\t\t\tif err != nil {\n\t\t\t\treturn \"\", fmt.Errorf(\"failed to unwrap data private key: %s\", err)\n\t\t\t}\n\n\t\t\tif ztdoPath == \"\" || output == \"\" {\n\t\t\t\treturn \"\", fmt.Errorf(\"ztdo path or output is empty\")\n\t\t\t}\n\n\t\t\t// decrypt data\n\t\t\tdataKeyPairEccMode := ztdo.GetECCMode()\n\n\t\t\tdataMsgPattern := [][]ztdolib.MessagePattern{\n\t\t\t\t{ztdolib.MessagePatternS, ztdolib.MessagePatternDHSS},\n\t\t\t\t{ztdolib.MessagePatternRS, ztdolib.MessagePatternDHSS},\n\t\t\t}\n\n\t\t\tdataPrk, _ := base64.StdEncoding.DecodeString(dataPrkBase64)\n\t\t\tsaData := ztdolib.NewSymmetricAgreement(dataKeyPairEccMode, false)\n\t\t\tsaData.SetMessagePatterns(dataMsgPattern)\n\t\t\tsaData.SetStaticKeyPair(core.ECDHFromKey(dataKeyPairEccMode.ToEccType(), dataPrk))\n\n\t\t\tproviderPublicKey, _ := base64.StdEncoding.DecodeString(dataPrkWrapping.ProviderPublicKeyBase64)\n\t\t\tsaData.SetRemoteStaticPublicKey(providerPublicKey)\n\n\t\t\tgcmKey, ad = saData.AgreeSymmetricKey()\n\n\t\t\tif err := ztdo.DecryptZtdoFile(ztdoPath, output, gcmKey[:], ad); err != nil {\n\t\t\t\treturn \"\", fmt.Errorf(\"Failed to decrypt ztdo file: %v\", err)\n\t\t\t} else {\n\t\t\t\ta.decryptedZtdoRecord[ztdoId] = output\n\t\t\t}\n\t\t} else {\n\t\t\toutput = decryptedOutput\n\t\t}\n\t} else {\n\t\tteeNotAuthorizedCode, _ := strconv.Atoi(common.ErrTEENotAuthorized.ErrorCode())\n\t\tif dagMsg.ErrCode == teeNotAuthorizedCode {\n\t\t\ta.trustedByNHPDB.Store(false)\n\t\t}\n\n\t\treturn \"\", fmt.Errorf(\"Error: fail to request ztdo with error: %s.\", dagMsg.ErrMsg)\n\t}\n\treturn output, nil\n}\n\nfunc (a *UdpAgent) GetFirstServerPeer() (serverPeer *core.UdpPeer) {\n\tfor _, value := range a.serverPeerMap {\n\t\tserverPeer = value\n\t\treturn serverPeer\n\t}\n\treturn nil\n}\n\nfunc (a *UdpAgent) SendDARMsgToServer(server *core.UdpPeer, msg common.DARMsg) (bool, *common.DAGMsg) {\n\tresult := false\n\tsendAddr := server.SendAddr()\n\tif sendAddr == nil {\n\t\tlog.Critical(\"device(%v)[SendDARMsgToServer] register server IP cannot be parsed\", a)\n\t}\n\tdrgMsg := msg\n\tdrgBytes, _ := json.Marshal(drgMsg)\n\tdrgMd := &core.MsgData{\n\t\tRemoteAddr:    sendAddr.(*net.UDPAddr),\n\t\tHeaderType:    core.NHP_DAR,\n\t\tTransactionId: a.device.NextCounterIndex(),\n\t\tCompress:      true,\n\t\tMessage:       drgBytes,\n\t\tPeerPk:        server.PublicKey(),\n\t\tResponseMsgCh: make(chan *core.PacketParserData),\n\t}\n\n\tcurrTime := time.Now().UnixNano()\n\tif !a.IsRunning() {\n\t\tlog.Error(\"server-agentMsgData channel closed or being closed, skip sending\")\n\t\treturn result, nil\n\t}\n\t// device will create or find existing connection and sends the MsgAssembler via that connection\n\ta.sendMsgCh <- drgMd\n\tserver.UpdateSend(currTime)\n\t// block until transaction completes\n\tserverPpd := <-drgMd.ResponseMsgCh\n\tclose(drgMd.ResponseMsgCh)\n\n\t//Wait for NHP-Server response and implement reception and processing within the func() function below.\n\tvar err error\n\tresult, dsaMsg := func() (bool, *common.DSAMsg) {\n\t\tdsaMsg := &common.DSAMsg{}\n\t\tif serverPpd.Error != nil {\n\t\t\tlog.Error(\"Agent(%s#%d)[SendDARMsgToServer] failed to receive response from server %s: %v\", drgMsg.DoId, drgMd.TransactionId, server.Ip, serverPpd.Error)\n\t\t\terr = serverPpd.Error\n\t\t\treturn false, dsaMsg\n\t\t}\n\n\t\tif serverPpd.HeaderType != core.NHP_DSA {\n\t\t\tlog.Error(\"DB(%s#%d)[SendDARMsgToServer] response from server %s has wrong type: %s\", drgMsg.DoId, drgMd.TransactionId, server.Ip, core.HeaderTypeToString(serverPpd.HeaderType))\n\t\t\terr = common.ErrTransactionRepliedWithWrongType\n\t\t\treturn false, dsaMsg\n\t\t}\n\t\t//message []byte to DSAMSg Object\n\t\terr = json.Unmarshal(serverPpd.BodyMessage, dsaMsg)\n\t\tif err != nil {\n\t\t\tlog.Error(\"Agent(%s#%d)[HandleDHPDAGMessage] failed to parse %s message: %v\", drgMsg.DoId, serverPpd.SenderTrxId, core.HeaderTypeToString(serverPpd.HeaderType), err)\n\t\t\treturn false, dsaMsg\n\t\t}\n\t\tdsaMsgString, err := json.Marshal(dsaMsg)\n\t\tif err != nil {\n\t\t\tlog.Error(\"Agent(%s) DSAMsg failed to parse message: %v\", dsaMsg.DoId, err)\n\t\t\treturn false, dsaMsg\n\t\t}\n\t\tlog.Info(\"SendDARMsgToServer response result: %v\", dsaMsgString)\n\t\tif dsaMsg.ErrCode != 0 {\n\t\t\tlog.Error(\"SendDARMsgToServer send failed, error: %s\", dsaMsg.ErrMsg)\n\t\t\treturn false, dsaMsg\n\t\t}\n\t\treturn true, dsaMsg\n\t}()\n\n\tif result {\n\t\t// clear related resources when load new smart data policy\n\t\tif spoId, exist := a.smartPolicyIdentifier[dsaMsg.DoId]; exist {\n\t\t\tif _, exist := a.smartPolicyEngine[spoId]; exist {\n\t\t\t\ta.smartPolicyEngine[spoId].Close()\n\t\t\t\tdelete(a.smartPolicyEngine, spoId)\n\t\t\t}\n\t\t\tdelete(a.smartPolicyIdentifier, dsaMsg.DoId)\n\t\t}\n\t\ta.smartPolicyIdentifier[dsaMsg.DoId] = dsaMsg.Spo.PolicyId\n\n\t\t// Collect attestation proofs with smart policy\n\t\tevidence, err := a.onAttestationCollect(dsaMsg.Spo)\n\t\tif err != nil {\n\t\t\tdagMsg := &common.DAGMsg{}\n\t\t\tdagMsg.DoId = dsaMsg.DoId\n\t\t\tdagMsg.ErrCode = 1\n\t\t\tdagMsg.ErrMsg = err.Error()\n\n\t\t\treturn false, dagMsg\n\t\t}\n\n\t\t// avoid flood attack from server side\n\t\ttime.Sleep(core.MinimalRecvIntervalMs * time.Millisecond)\n\n\t\tdavMsg := common.DAVMsg{\n\t\t\tDoId:     msg.DoId,\n\t\t\tSpoId:    dsaMsg.SpoId,\n\t\t\tEvidence: evidence,\n\t\t}\n\n\t\treturn a.SendDAVMsgToServer(server, davMsg)\n\t} else {\n\t\tdagMsg := &common.DAGMsg{}\n\t\tdagMsg.DoId = dsaMsg.DoId\n\t\tdagMsg.ErrCode = dsaMsg.ErrCode\n\t\tdagMsg.ErrMsg = dsaMsg.ErrMsg\n\n\t\treturn result, dagMsg\n\t}\n}\n\nfunc (a *UdpAgent) SendDAVMsgToServer(server *core.UdpPeer, msg common.DAVMsg) (bool, *common.DAGMsg) {\n\tresult := false\n\tsendAddr := server.SendAddr()\n\tif sendAddr == nil {\n\t\tlog.Critical(\"device(%v)[SendDAVMsgToServer] register server IP cannot be parsed\", a)\n\t}\n\tdavMsg := msg\n\tdavBytes, _ := json.Marshal(davMsg)\n\tdavMd := &core.MsgData{\n\t\tRemoteAddr:    sendAddr.(*net.UDPAddr),\n\t\tHeaderType:    core.NHP_DAV,\n\t\tTransactionId: a.device.NextCounterIndex(),\n\t\tCompress:      true,\n\t\tMessage:       davBytes,\n\t\tPeerPk:        server.PublicKey(),\n\t\tResponseMsgCh: make(chan *core.PacketParserData),\n\t}\n\n\tcurrTime := time.Now().UnixNano()\n\tif !a.IsRunning() {\n\t\tlog.Error(\"server-agentMsgData channel closed or being closed, skip sending\")\n\t\treturn result, nil\n\t}\n\t// device will create or find existing connection and sends the MsgAssembler via that connection\n\ta.sendMsgCh <- davMd\n\tserver.UpdateSend(currTime)\n\t// block until transaction completes\n\tserverPpd := <-davMd.ResponseMsgCh\n\tclose(davMd.ResponseMsgCh)\n\n\t//Wait for NHP-Server response and implement reception and processing within the func() function below.\n\tvar err error\n\tresult, dagMsg := func() (bool, *common.DAGMsg) {\n\t\tdagMsg := &common.DAGMsg{}\n\t\tif serverPpd.Error != nil {\n\t\t\tlog.Error(\"Agent(%s#%d)[SendDAVMsgToServer] failed to receive response from server %s: %v\", davMsg.DoId, davMd.TransactionId, server.Ip, serverPpd.Error)\n\t\t\terr = serverPpd.Error\n\t\t\treturn false, dagMsg\n\t\t}\n\n\t\tif serverPpd.HeaderType != core.NHP_DAG {\n\t\t\tlog.Error(\"DB(%s#%d)[SendDAVMsgToServer] response from server %s has wrong type: %s\", davMsg.DoId, davMd.TransactionId, server.Ip, core.HeaderTypeToString(serverPpd.HeaderType))\n\t\t\terr = common.ErrTransactionRepliedWithWrongType\n\t\t\treturn false, dagMsg\n\t\t}\n\t\t//message []byte to DAGMSg Object\n\t\terr = json.Unmarshal(serverPpd.BodyMessage, dagMsg)\n\t\tif err != nil {\n\t\t\tlog.Error(\"Agent(%s#%d)[HandleDHPDAVMessage] failed to parse %s message: %v\", davMsg.DoId, serverPpd.SenderTrxId, core.HeaderTypeToString(serverPpd.HeaderType), err)\n\t\t\treturn false, dagMsg\n\t\t}\n\t\tdagMsgString, err := json.Marshal(dagMsg)\n\t\tif err != nil {\n\t\t\tlog.Error(\"Agent(%s) DAKMsg failed to parse message: %v\", dagMsg.DoId, err)\n\t\t\treturn false, dagMsg\n\t\t}\n\t\tlog.Info(\"SendDAVMsgToServer response result: %v\", dagMsgString)\n\t\tif dagMsg.ErrCode != 0 {\n\t\t\tlog.Error(\"SendDAVMsgToServer send failed, error: %s\", dagMsg.ErrMsg)\n\t\t\treturn false, dagMsg\n\t\t}\n\t\treturn true, dagMsg\n\t}()\n\treturn result, dagMsg\n}\n\nfunc (s *UdpAgent) onAttestationCollect(spo *common.SmartPolicy) (string, error) {\n\tif spo.Policy == \"\" {\n\t\treturn \"\", nil\n\t}\n\n\twasmBytes, err := spo.GetPolicy()\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\tengine := wasmEngine.NewEngine()\n\terr = engine.LoadWasm(wasmBytes)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\ts.smartPolicyEngine[spo.PolicyId] = engine\n\n\tattestation := engine.OnAttestationCollect()\n\n\treturn attestation, nil\n}\n\nfunc (a *UdpAgent) CallTrustedApplication(taId string, function string, params map[string]any, spoId string) (string, error) {\n\tta, err := GetTrustedApplication(taId)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\ttaRes, err := ta.CallFunction(function, params)\n\tif err != nil {\n\t\treturn \"\", err\n\t} else {\n\t\tif spEngine, exist := a.smartPolicyEngine[spoId]; exist {\n\t\t\tresultWithPostProcess := spEngine.OnDataPostprocess(taRes)\n\t\t\treturn resultWithPostProcess, nil\n\t\t} else {\n\t\t\treturn taRes, nil\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "endpoints/db/config.go",
    "content": "package db\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"path/filepath\"\n\n\ttoml \"github.com/pelletier/go-toml/v2\"\n\n\t\"github.com/OpenNHP/opennhp/nhp/core\"\n\t\"github.com/OpenNHP/opennhp/nhp/log\"\n\t\"github.com/OpenNHP/opennhp/nhp/utils\"\n)\n\nvar (\n\tbaseConfigWatch     io.Closer\n\tserverConfigWatch   io.Closer\n\tteesConfigWatch     io.Closer\n\tresourceConfigWatch io.Closer\n\n\terrLoadConfig = fmt.Errorf(\"config load error\")\n)\n\ntype Config struct {\n\tLogLevel            int\n\tPrivateKeyBase64    string\n\tDefaultCipherScheme int    `json:\"defaultCipherScheme\"`\n\tSymmetricCipherMode string `json:\"symmetricCipherMode\"`\n\tDbId                string `json:\"dbId\"`\n}\n\ntype Peers struct {\n\tServers []*core.UdpPeer\n}\n\ntype Resources struct {\n\tResources []*KnockResource\n}\n\ntype TEE struct {\n\tTEEPublicKeyBase64 string `json:\"teePublicKeyBase64\"`\n\tExpireTime         int64  `json:\"expireTime\"`\n}\n\ntype TEEs struct {\n\tTEEs []*TEE\n}\n\nfunc (a *UdpDevice) loadBaseConfig() error {\n\t// config.toml\n\tfileName := filepath.Join(ExeDirPath, \"etc\", \"config.toml\")\n\tif err := a.updateBaseConfig(fileName); err != nil {\n\t\t// report base config error\n\t\treturn err\n\t}\n\n\tbaseConfigWatch = utils.WatchFile(fileName, func() {\n\t\tlog.Info(\"base config: %s has been updated\", fileName)\n\t\t_ = a.updateBaseConfig(fileName)\n\t})\n\treturn nil\n}\n\nfunc (a *UdpDevice) loadPeers() error {\n\t// server.toml\n\tfileName := filepath.Join(ExeDirPath, \"etc\", \"server.toml\")\n\tif err := a.updateServerPeers(fileName); err != nil {\n\t\t// ignore error\n\t\t_ = err\n\t}\n\n\tserverConfigWatch = utils.WatchFile(fileName, func() {\n\t\tlog.Info(\"server peer config: %s has been updated\", fileName)\n\t\t_ = a.updateServerPeers(fileName)\n\t})\n\n\treturn nil\n}\n\nfunc (a *UdpDevice) loadTEEs() error {\n\t// consumer.toml\n\tfileName := filepath.Join(ExeDirPath, \"etc\", \"tee.toml\")\n\tif err := a.updateTEEConfig(fileName); err != nil {\n\t\t// ignore error\n\t\t_ = err\n\t}\n\n\tteesConfigWatch = utils.WatchFile(fileName, func() {\n\t\tlog.Info(\"tee peer config: %s has been updated\", fileName)\n\t\t_ = a.updateTEEConfig(fileName)\n\t})\n\n\treturn nil\n}\n\nfunc (a *UdpDevice) updateBaseConfig(file string) (err error) {\n\tutils.CatchPanicThenRun(func() {\n\t\terr = errLoadConfig\n\t})\n\n\tcontent, err := os.ReadFile(file)\n\tif err != nil {\n\t\tlog.Error(\"failed to read base config: %v\", err)\n\t}\n\n\tvar conf Config\n\tif err := toml.Unmarshal(content, &conf); err != nil {\n\t\tlog.Error(\"failed to unmarshal base config: %v\", err)\n\t}\n\tif a.config == nil {\n\t\ta.config = &conf\n\t\ta.log.SetLogLevel(conf.LogLevel)\n\t\treturn err\n\t}\n\n\t// update\n\tif a.config.LogLevel != conf.LogLevel {\n\t\tlog.Info(\"set base log level to %d\", conf.LogLevel)\n\t\ta.log.SetLogLevel(conf.LogLevel)\n\t\ta.config.LogLevel = conf.LogLevel\n\t}\n\n\tif a.config.DefaultCipherScheme != conf.DefaultCipherScheme {\n\t\tlog.Info(\"set default cipher scheme to %d\", conf.DefaultCipherScheme)\n\t\ta.config.DefaultCipherScheme = conf.DefaultCipherScheme\n\t}\n\n\treturn err\n}\n\nfunc (a *UdpDevice) updateServerPeers(file string) (err error) {\n\tutils.CatchPanicThenRun(func() {\n\t\terr = errLoadConfig\n\t})\n\n\tcontent, err := os.ReadFile(file)\n\tif err != nil {\n\t\tlog.Error(\"failed to read server peer config: %v\", err)\n\t}\n\n\t// update\n\tvar peers Peers\n\tserverPeerMap := make(map[string]*core.UdpPeer)\n\tif err := toml.Unmarshal(content, &peers); err != nil {\n\t\tlog.Error(\"failed to unmarshal server config: %v\", err)\n\t}\n\tfor _, p := range peers.Servers {\n\t\tp.Type = core.NHP_DB\n\t\ta.device.AddPeer(p)\n\t\tserverPeerMap[p.PublicKeyBase64()] = p\n\t}\n\n\t// remove old peers from device\n\ta.serverPeerMutex.Lock()\n\tdefer a.serverPeerMutex.Unlock()\n\tfor pubKey := range a.serverPeerMap {\n\t\tif _, found := serverPeerMap[pubKey]; !found {\n\t\t\ta.device.RemovePeer(pubKey)\n\t\t}\n\t}\n\ta.serverPeerMap = serverPeerMap\n\n\treturn err\n}\n\nfunc (a *UdpDevice) updateTEEConfig(file string) (err error) {\n\tutils.CatchPanicThenRun(func() {\n\t\terr = errLoadConfig\n\t})\n\n\tcontent, err := os.ReadFile(file)\n\tif err != nil {\n\t\tlog.Error(\"failed to read TEE config: %v\", err)\n\t}\n\n\tvar tees TEEs\n\tif err := toml.Unmarshal(content, &tees); err != nil {\n\t\tlog.Error(\"failed to unmarshal TEE config: %v\", err)\n\t}\n\n\tteeMap := make(map[string]*TEE)\n\tfor _, tee := range tees.TEEs {\n\t\tteeMap[tee.TEEPublicKeyBase64] = tee\n\t}\n\n\ta.teeMutex.Lock()\n\tdefer a.teeMutex.Unlock()\n\ta.teeMap = teeMap\n\n\treturn nil\n}\n\nfunc (a *UdpDevice) StopConfigWatch() {\n\tif baseConfigWatch != nil {\n\t\tbaseConfigWatch.Close()\n\t}\n\tif serverConfigWatch != nil {\n\t\tserverConfigWatch.Close()\n\t}\n\tif resourceConfigWatch != nil {\n\t\tresourceConfigWatch.Close()\n\t}\n\tif teesConfigWatch != nil {\n\t\tteesConfigWatch.Close()\n\t}\n}\n"
  },
  {
    "path": "endpoints/db/constants.go",
    "content": "package db\n\nimport \"github.com/OpenNHP/opennhp/nhp/common\"\n\nconst (\n\tMaxConcurrentConnection      = 256\n\tDefaultConnectionTimeoutMs   = common.ClientSideConnectionTimeoutMs\n\tPacketQueueSizePerConnection = 64     // nhp db does not need large transactions\n\tDoType_Default               = \"ZTDO\" // The DHP protocol enforces encryption by default, and its core data unit is the Zero Trust Data Object (ZTDO)\n\tDoType_Other                 = \"OTHER\"\n\n\tReportToServerInterval         = common.ReportToServerInterval\n\tMinialServerDiscoveryInterval  = common.MinimalServerDiscoveryInterval\n\tServerKeepaliveInterval        = common.ServerKeepaliveInterval\n\tServerDiscoveryRetryBeforeFail = common.ServerDiscoveryRetryBeforeFail\n)\n"
  },
  {
    "path": "endpoints/db/main/etc/config.toml",
    "content": "# NHP-Db base config\n# field with (-) does not support dynamic update\n\n# PrivateKeyBase64 (-): db private key in base64 format.\n# SymmetricCipherMode: default mode is AES-256-GCM-128, supported modes:\n#   AES-256-GCM-64, AES-256-GCM-96, AES-256-GCM-104, AES-256-GCM-112, AES-256-GCM-120, AES-256-GCM-128, SM4-GCM-64, SM4-GCM-128.\n# UserId: specify the user id this agent represents.\n# OrganizationId: specify the organization id this agent represents.\n# LogLevel: 0: silent, 1: error, 2: info, 3: audit, 4: debug, 5: trace.\nPrivateKeyBase64 = \"WAb4iFVXHnF5yMpacue1HKTa6nyOebx7BPNn++0ix1c=\"\nDefaultCipherScheme = 0\nSymmetricCipherMode = \"AES-256-GCM-128\"\nDbId = \"device-0\"\nOrganizationId = \"opennhp.org\"\nLogLevel = 4\n\n# UserData: a customized user entry for flexibility.\n# Its key-value pairs will be send to server along with knock message.\n[UserData]\n"
  },
  {
    "path": "endpoints/db/main/etc/server.toml",
    "content": "# list the server peers for the device under [[Servers]] table\n\n# Hostname: the domain of the server peer. If specified, it overrides the \"Ip\" field with its first resolved address.\n# Ip: specify the ip address of the server peer\n# Port: specify the port number of this server peer is listening\n# PubKeyBase64: public key of the server peer in base64 format\n# ExpireTime (epoch timestamp in seconds): peer key validation will fail when it expires.\n[[Servers]]\nHostname = \"\"\nIp = \"192.168.50.39\"\nPort = 62206\nPubKeyBase64 = \"WqJxe+Z4+wLen3VRgZx6YnbjvJFmptz99zkONCt/7gc=\"\nExpireTime = 1924991999"
  },
  {
    "path": "endpoints/db/main/etc/tee.toml",
    "content": "# Configuration for trusted execution environment.\n\n# TEEPublicKeyBase64: base64 encoded public key of TEE (Trusted Execution Environment).\n[[TEEs]]\nTEEPublicKeyBase64 = \"dvUq+7AvmsS8owkUiTFppamfoyU2DkheTICjPVTU+KU/KRUqlZ0cShNvgj2xTHnH/RNTdaOt8KxQd/d/z3BGrQ==\"\nExpireTime = 1924991999\n"
  },
  {
    "path": "endpoints/db/main/main.go",
    "content": "package main\n\nimport (\n\t\"encoding/base64\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"os\"\n\t\"os/signal\"\n\t\"path/filepath\"\n\t\"slices\"\n\t\"strings\"\n\t\"syscall\"\n\n\t\"github.com/urfave/cli/v2\"\n\n\t\"github.com/OpenNHP/opennhp/endpoints/db\"\n\t\"github.com/OpenNHP/opennhp/nhp/common\"\n\t\"github.com/OpenNHP/opennhp/nhp/core\"\n\tztdolib \"github.com/OpenNHP/opennhp/nhp/core/ztdo\"\n\t\"github.com/OpenNHP/opennhp/nhp/log\"\n\t\"github.com/OpenNHP/opennhp/nhp/version\"\n)\n\nfunc main() {\n\tinitApp()\n}\nfunc initApp() {\n\tapp := cli.NewApp()\n\tapp.Name = \"nhp-device\"\n\tapp.Usage = \"device entity for NHP protocol\"\n\tapp.Version = version.Version\n\n\trunCmd := &cli.Command{\n\t\tName:  \"run\",\n\t\tUsage: \"create and run device process for NHP protocol\",\n\t\tFlags: []cli.Flag{\n\t\t\t&cli.StringFlag{Name: \"mode\", Value: \"none\", Usage: \"encrypt;decrypt\"},\n\t\t\t&cli.StringFlag{Name: \"source\", Value: \"\", Usage: \"source file to be encrypted, this is not required for streaming mode\"},\n\t\t\t&cli.StringFlag{Name: \"data-source-type\", Value: \"\", Usage: \"type of data source, the default value is online, supported values are online, offline and stream\"},\n\t\t\t&cli.StringFlag{Name: \"smart-policy\", Value: \"\", Usage: \"The wasm policy file\"},\n\t\t\t&cli.StringFlag{Name: \"metadata\", Value: \"\", Usage: \"metadata file\"},\n\t\t\t&cli.StringFlag{Name: \"output\", Value: \"\", Usage: \"Save path of the ztdo file or decrypted file\"},\n\t\t\t&cli.StringFlag{Name: \"access-url\", Value: \"\", Usage: \"ZTDO access url for online or offline mode or API url for streaming mode\"},\n\t\t\t&cli.StringFlag{Name: \"ztdo\", Value: \"\", Usage: \"path to the ztdo file\"},\n\t\t\t&cli.StringFlag{Name: \"ztdo-id\", Value: \"\", Usage: \"identifier of the ztdo file\"},\n\t\t\t&cli.StringFlag{Name: \"data-private-key\", Value: \"\", Usage: \"data private key with base64 format\"},\n\t\t\t&cli.StringFlag{Name: \"provider-public-key\", Value: \"\", Usage: \"provider public key with base64 format\"},\n\t\t},\n\t\tBefore: func(c *cli.Context) error {\n\t\t\tif c.String(\"mode\") == \"encrypt\" {\n\t\t\t\tif c.String(\"data-source-type\") != \"\" {\n\t\t\t\t\tif !slices.Contains([]string{\"online\", \"offline\", \"stream\"}, c.String(\"data-source-type\")) {\n\t\t\t\t\t\treturn fmt.Errorf(\"invalid --data-source-type, allowed values are online, offline and stream\")\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif c.String(\"ztdo-id\") != \"\" { // update ztdo\n\t\t\t\t\tif c.String(\"source\") != \"\" || c.String(\"output\") != \"\" || c.String(\"metadata\") != \"\" || c.String(\"data-source-type\") != \"\" {\n\t\t\t\t\t\treturn fmt.Errorf(\"--source, --output, --data-source-type and --metadata are not allowed when --ztdo-id is specified\")\n\t\t\t\t\t}\n\t\t\t\t} else { // create ztdo\n\t\t\t\t\tif c.String(\"data-source-type\") != \"stream\" {\n\t\t\t\t\t\tif c.String(\"source\") == \"\" {\n\t\t\t\t\t\t\treturn fmt.Errorf(\"--source is required when --data-source-type is not stream and --ztdo-id is not specified\")\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif c.String(\"access-url\") == \"\" {\n\t\t\t\t\t\t\treturn fmt.Errorf(\"--access-url is required when --data-source-type is stream\")\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif c.String(\"smart-policy\") == \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"--smart-policy is required in encrypt mode\")\n\t\t\t\t}\n\n\t\t\t\t// only be available in decrypt mode\n\t\t\t\tif c.String(\"ztdo\") != \"\" || c.String(\"data-private-key\") != \"\" || c.String(\"provider-public-key\") != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"--ztdo, --data-private-key and --provider-public-key are only allowed in decrypt mode\")\n\t\t\t\t}\n\t\t\t} else if c.String(\"mode\") == \"decrypt\" {\n\t\t\t\tif c.String(\"source\") != \"\" || c.String(\"smart-policy\") != \"\" || c.String(\"access-url\") != \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"--source, --smart-policy and --access-url are only allowed in encrypt mode\")\n\t\t\t\t}\n\n\t\t\t\t// only be available in encrypt mode\n\t\t\t\tif c.String(\"ztdo\") == \"\" || c.String(\"output\") == \"\" || c.String(\"data-private-key\") == \"\" || c.String(\"provider-public-key\") == \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"--ztdo, --output, --data-private-key and --provider-public-key are required in decrypt mode\")\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\treturn nil\n\t\t\t}\n\n\t\t\treturn nil\n\t\t},\n\t\tAction: func(c *cli.Context) error {\n\t\t\tmode := c.String(\"mode\")\n\t\t\tsource := c.String(\"source\")\n\t\t\tdsType := c.String(\"data-source-type\")\n\t\t\tsmartPolicy := c.String(\"smart-policy\")\n\t\t\tmetadata := c.String(\"metadata\")\n\t\t\toutput := c.String(\"output\")\n\t\t\tztdo := c.String(\"ztdo\")\n\t\t\tztdoId := c.String(\"ztdo-id\")\n\t\t\tdataPrivateKey := c.String(\"data-private-key\")\n\t\t\taccessUrl := c.String(\"access-url\")\n\t\t\tproviderPublicKeyBase64 := c.String(\"provider-public-key\")\n\n\t\t\tparams := db.AppParams{\n\t\t\t\tMode:                    mode,\n\t\t\t\tSource:                  source,\n\t\t\t\tDsType:                  dsType,\n\t\t\t\tSmartPolicy:             smartPolicy,\n\t\t\t\tMetadata:                metadata,\n\t\t\t\tOutput:                  output,\n\t\t\t\tZtdoFilePath:            ztdo,\n\t\t\t\tZtdoId:                  ztdoId,\n\t\t\t\tDataPrivateKeyBase64:    dataPrivateKey,\n\t\t\t\tAccessUrl:               accessUrl,\n\t\t\t\tProviderPublicKeyBase64: providerPublicKeyBase64,\n\t\t\t}\n\n\t\t\treturn runApp(params)\n\t\t},\n\t}\n\n\tkeygenCmd := &cli.Command{\n\t\tName:  \"keygen\",\n\t\tUsage: \"generate key pairs for NHP devices\",\n\t\tFlags: []cli.Flag{\n\t\t\t&cli.BoolFlag{Name: \"curve\", Value: false, DisableDefaultText: true, Usage: \"generate curve25519 keys\"},\n\t\t\t&cli.BoolFlag{Name: \"sm2\", Value: false, DisableDefaultText: true, Usage: \"generate sm2 keys\"},\n\t\t\t&cli.BoolFlag{Name: \"json\", Value: false, DisableDefaultText: true, Usage: \"output in JSON format\"},\n\t\t},\n\t\tAction: func(c *cli.Context) error {\n\t\t\tvar e core.Ecdh\n\t\t\teccType := core.ECC_SM2\n\t\t\tif c.Bool(\"curve\") {\n\t\t\t\teccType = core.ECC_CURVE25519\n\t\t\t}\n\t\t\te = core.NewECDH(eccType)\n\t\t\tpub := e.PublicKeyBase64()\n\t\t\tpriv := e.PrivateKeyBase64()\n\t\t\tif c.Bool(\"json\") {\n\t\t\t\toutput := map[string]string{\n\t\t\t\t\t\"privateKey\": priv,\n\t\t\t\t\t\"publicKey\":  pub,\n\t\t\t\t}\n\t\t\t\tjson.NewEncoder(os.Stdout).Encode(output)\n\t\t\t} else {\n\t\t\t\tfmt.Println(\"Private key: \", priv)\n\t\t\t\tfmt.Println(\"Public key: \", pub)\n\t\t\t}\n\t\t\treturn nil\n\t\t},\n\t}\n\n\tpubkeyCmd := &cli.Command{\n\t\tName:  \"pubkey\",\n\t\tUsage: \"get public key from private key\",\n\t\tFlags: []cli.Flag{\n\t\t\t&cli.BoolFlag{Name: \"curve\", Value: false, DisableDefaultText: true, Usage: \"get curve25519 key\"},\n\t\t\t&cli.BoolFlag{Name: \"sm2\", Value: false, DisableDefaultText: true, Usage: \"get sm2 key\"},\n\t\t\t&cli.BoolFlag{Name: \"json\", Value: false, DisableDefaultText: true, Usage: \"output in JSON format\"},\n\t\t},\n\t\tAction: func(c *cli.Context) error {\n\t\t\tprivKey, err := base64.StdEncoding.DecodeString(c.Args().First())\n\t\t\tif err != nil {\n\t\t\t\tif c.Bool(\"json\") {\n\t\t\t\t\tjson.NewEncoder(os.Stdout).Encode(map[string]interface{}{\n\t\t\t\t\t\t\"error\": err.Error(),\n\t\t\t\t\t})\n\t\t\t\t\treturn nil\n\t\t\t\t}\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tcipherType := core.ECC_SM2\n\t\t\tif c.Bool(\"curve\") {\n\t\t\t\tcipherType = core.ECC_CURVE25519\n\t\t\t}\n\t\t\te := core.ECDHFromKey(cipherType, privKey)\n\t\t\tif e == nil {\n\t\t\t\terr := fmt.Errorf(\"invalid input key\")\n\t\t\t\tif c.Bool(\"json\") {\n\t\t\t\t\tjson.NewEncoder(os.Stdout).Encode(map[string]interface{}{\n\t\t\t\t\t\t\"error\": err.Error(),\n\t\t\t\t\t})\n\t\t\t\t\treturn nil\n\t\t\t\t}\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tpub := e.PublicKeyBase64()\n\t\t\tif c.Bool(\"json\") {\n\t\t\t\tjson.NewEncoder(os.Stdout).Encode(map[string]string{\n\t\t\t\t\t\"publicKey\": pub,\n\t\t\t\t})\n\t\t\t} else {\n\t\t\t\tfmt.Println(\"Public key: \", pub)\n\t\t\t}\n\t\t\treturn nil\n\t\t},\n\t}\n\n\tapp.Commands = []*cli.Command{\n\t\trunCmd,\n\t\tkeygenCmd,\n\t\tpubkeyCmd,\n\t}\n\n\tif err := app.Run(os.Args); err != nil {\n\t\tfmt.Fprintln(os.Stderr, err)\n\t}\n}\n\nfunc runApp(params db.AppParams) error {\n\texeFilePath, err := os.Executable()\n\tif err != nil {\n\t\treturn err\n\t}\n\texeDirPath := filepath.Dir(exeFilePath)\n\ta := &db.UdpDevice{}\n\tif params.Mode == \"none\" {\n\t\ta.EnableOnlineReport = true\n\t}\n\terr = a.Start(exeDirPath, 4)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif params.Mode == \"none\" {\n\t\ttermCh := make(chan os.Signal, 1)\n\t\tsignal.Notify(termCh, syscall.SIGTERM, os.Interrupt, syscall.SIGABRT)\n\n\t\t// block until terminated\n\t\t<-termCh\n\t\ta.Stop()\n\n\t\treturn nil\n\t}\n\n\tztdo := ztdolib.NewZtdo()\n\tdataMsgPattern := [][]ztdolib.MessagePattern{\n\t\t{ztdolib.MessagePatternS, ztdolib.MessagePatternDHSS},\n\t\t{ztdolib.MessagePatternRS, ztdolib.MessagePatternDHSS},\n\t}\n\n\tdataKeyPairEccMode := ztdolib.CURVE25519\n\tif a.GetCipherSchema() == 0 {\n\t\tdataKeyPairEccMode = ztdolib.SM2\n\t}\n\n\tswitch params.Mode {\n\tcase \"encrypt\":\n\t\toutputFilePath := params.Output\n\t\tsmartPolicy, err := params.NewSmartPolicy()\n\t\tif err != nil {\n\t\t\tlog.Error(\"failed to read policy file:%s\\n\", err)\n\t\t\treturn err\n\t\t}\n\t\tif strings.HasPrefix(smartPolicy.Policy, \"file://\") {\n\t\t\tsmartPolicyDir := filepath.Dir(params.SmartPolicy)\n\t\t\tpolicyPath := smartPolicy.Policy[7:]\n\t\t\tif !filepath.IsAbs(policyPath) {\n\t\t\t\tpolicyPath = filepath.Join(smartPolicyDir, policyPath)\n\t\t\t}\n\n\t\t\tsmartPolicy.Policy, err = a.UploadFileToNHPServer(policyPath)\n\t\t\tif err != nil {\n\t\t\t\tlog.Error(\"failed to upload policy file:%s\\n\", err)\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\n\t\tztdoId := params.ZtdoId\n\n\t\tif ztdoId == \"\" {\n\t\t\tztdoId = ztdo.GetObjectID()\n\n\t\t\tvar metadata string\n\n\t\t\tif smartPolicy.Embedded {\n\t\t\t\tstructMetadata, err := params.LoadMetadataAsStruct()\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Error(\"failed to load metadata:%s\\n\", err)\n\t\t\t\t\treturn err\n\t\t\t\t}\n\n\t\t\t\twasmBytes, err := smartPolicy.GetPolicy()\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Error(\"failed to get policy:%s\\n\", err)\n\t\t\t\t\treturn err\n\t\t\t\t}\n\n\t\t\t\tstructMetadata[\"smartPolicy\"] = base64.StdEncoding.EncodeToString(wasmBytes)\n\n\t\t\t\tmetadataBytes, err := json.Marshal(structMetadata)\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Error(\"failed to marshal metadata:%s\\n\", err)\n\t\t\t\t\treturn err\n\t\t\t\t}\n\n\t\t\t\tmetadata = string(metadataBytes)\n\t\t\t} else {\n\t\t\t\tmetadata, err = params.GetMetadata()\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Error(\"failed to read metadata file:%s\\n\", err)\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t_ = ztdo.SetMetadata(metadata)\n\n\t\t\t// generate data private key\n\t\t\tdataPrkStore := db.NewDataPrivateKeyStore(a.GetOwnEcdh().PublicKeyBase64())\n\t\t\tdataPrk := dataPrkStore.Generate(dataKeyPairEccMode)\n\n\t\t\tif !(params.DsType == \"stream\") { // generate ztdo file\n\t\t\t\tif params.DsType == \"online\" {\n\t\t\t\t\t_ = ztdo.SetNhpServer(a.GetServerPeer().SendAddr().String())\n\t\t\t\t} else { // offline\n\t\t\t\t\t_ = ztdo.SetNhpServer(\"\")\n\t\t\t\t}\n\n\t\t\t\tdataPbk := core.ECDHFromKey(dataKeyPairEccMode.ToEccType(), dataPrk).PublicKey()\n\t\t\t\tsa := ztdolib.NewSymmetricAgreement(dataKeyPairEccMode, true)\n\t\t\t\tsa.SetMessagePatterns(dataMsgPattern)\n\n\t\t\t\tsa.SetStaticKeyPair(a.GetOwnEcdh())\n\t\t\t\tsa.SetRemoteStaticPublicKey(dataPbk)\n\n\t\t\t\tgcmKey, ad := sa.AgreeSymmetricKey()\n\n\t\t\t\tsymmetricCipherMode, err := ztdolib.NewSymmetricCipherMode(a.GetSymmetricCipherMode())\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Error(\"failed to create symmetric cipher mode:%s\\n\", err)\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tztdo.SetCipherConfig(true, symmetricCipherMode, dataKeyPairEccMode)\n\n\t\t\t\tlog.Info(\"Encrypt ztdo file(file name: %s and ztdo id: %s) with cipher settings: ECC mode(%s) and Symmetric Cipher Mode(%s)\\n\", params.Source, ztdoId, dataKeyPairEccMode, symmetricCipherMode)\n\n\t\t\t\tif err := ztdo.EncryptZtdoFile(params.Source, outputFilePath, gcmKey[:], ad); err != nil {\n\t\t\t\t\tlog.Error(\"failed to encrypt ztdo file: %s\\n\", err)\n\t\t\t\t\treturn err\n\t\t\t\t}\n\n\t\t\t\tif params.AccessUrl == \"\" {\n\t\t\t\t\t// upload ztdo to nhp server\n\t\t\t\t\tparams.AccessUrl, err = a.UploadFileToNHPServer(outputFilePath)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tlog.Error(\"failed to upload ztdo file:%s\\n\", err)\n\t\t\t\t\t\treturn err\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Save data private key after success encryption\n\t\t\tif err := dataPrkStore.Save(ztdoId); err != nil {\n\t\t\t\tlog.Error(\"failed to save data private key: %s\\n\", err)\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\n\t\tif params.DsType != \"offline\" {\n\t\t\tdrgMsg := common.DRGMsg{\n\t\t\t\tDoType:         db.DoType_Default,\n\t\t\t\tDoId:           ztdoId,\n\t\t\t\tDbId:           a.GetDataBrokerId(),\n\t\t\t\tDataSourceType: params.DsType,\n\t\t\t\tAccessUrl:      params.AccessUrl,\n\t\t\t\tAccessByNHP:    false,\n\t\t\t\tSpo:            smartPolicy,\n\t\t\t}\n\n\t\t\ta.SendDHPRegister(drgMsg)\n\t\t}\n\n\t\tos.Exit(0)\n\tcase \"decrypt\":\n\t\tif err := ztdo.ParseHeader(params.ZtdoFilePath); err != nil {\n\t\t\tlog.Error(\"failed to parse ztdo header:%s\\n\", err)\n\t\t\tfmt.Printf(\"Error: failed to parse ztdo header:%s.\\n\", err)\n\t\t\tos.Exit(1)\n\t\t}\n\n\t\tdataKeyPairEccMode := ztdo.GetECCMode()\n\n\t\tdataPrk, _ := base64.StdEncoding.DecodeString(params.DataPrivateKeyBase64)\n\t\tsa := ztdolib.NewSymmetricAgreement(dataKeyPairEccMode, false)\n\t\tsa.SetMessagePatterns(dataMsgPattern)\n\t\tsa.SetStaticKeyPair(core.ECDHFromKey(dataKeyPairEccMode.ToEccType(), dataPrk))\n\n\t\tproviderPublicKey, _ := base64.StdEncoding.DecodeString(params.ProviderPublicKeyBase64)\n\t\tsa.SetRemoteStaticPublicKey(providerPublicKey)\n\n\t\tgcmKey, ad := sa.AgreeSymmetricKey()\n\n\t\tlog.Info(\"Decrypting ztdo file(file name: %s and ztdo id: %s) with cipher settings: ECC mode(%s) and Symmetric Cipher Mode(%s)\\n\", params.ZtdoFilePath, ztdo.GetObjectID(), dataKeyPairEccMode, ztdo.GetCipherMode())\n\n\t\tif err := ztdo.DecryptZtdoFile(params.ZtdoFilePath, params.Output, gcmKey[:], ad); err != nil {\n\t\t\tlog.Error(\"failed to decrypt ztdo file:%s\\n\", err)\n\t\t\tfmt.Printf(\"Error: failed to decrypt ztdo file:%s.\\n\", err)\n\t\t\tos.Exit(1)\n\t\t} else {\n\t\t\tlog.Info(\"Decrypt ztdo file successfully\\n\")\n\t\t\tfmt.Printf(\"Successfully decrypt ztdo file.\\n\")\n\t\t}\n\n\t\tos.Exit(0)\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "endpoints/db/udpdevice.go",
    "content": "package db\n\nimport (\n\t\"encoding/base64\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"net\"\n\t\"path/filepath\"\n\t\"strconv\"\n\t\"sync\"\n\t\"sync/atomic\"\n\t\"time\"\n\n\t\"github.com/OpenNHP/opennhp/nhp/common\"\n\t\"github.com/OpenNHP/opennhp/nhp/core\"\n\tztdolib \"github.com/OpenNHP/opennhp/nhp/core/ztdo\"\n\t\"github.com/OpenNHP/opennhp/nhp/log\"\n\t\"github.com/OpenNHP/opennhp/nhp/version\"\n)\n\nvar (\n\tExeDirPath string\n)\n\ntype KnockUser struct {\n\tUserId         string\n\tOrganizationId string\n\tUserData       map[string]any\n}\n\ntype KnockResource struct {\n\tAuthServiceId string `json:\"aspId\"`\n\tResourceId    string `json:\"resId\"`\n\tServerAddr    string `json:\"serverAddr\"`\n}\n\nfunc (res *KnockResource) Id() string {\n\treturn res.AuthServiceId + \"/\" + res.ResourceId\n}\n\ntype KnockTarget struct {\n\tsync.Mutex\n\tKnockResource\n\tServerPeer           *core.UdpPeer\n\tLastKnockSuccessTime time.Time\n}\n\nfunc (kt *KnockTarget) SetResource(res *KnockResource) {\n\tkt.Lock()\n\tdefer kt.Unlock()\n\n\tkt.KnockResource = *res\n}\n\nfunc (kt *KnockTarget) SetServer(peer *core.UdpPeer) {\n\tkt.Lock()\n\tdefer kt.Unlock()\n\n\tkt.ServerPeer = peer\n}\n\nfunc (kt *KnockTarget) Server() *core.UdpPeer {\n\tkt.Lock()\n\tdefer kt.Unlock()\n\n\treturn kt.ServerPeer\n}\n\ntype UdpDevice struct {\n\tstats struct {\n\t\ttotalRecvBytes uint64\n\t\ttotalSendBytes uint64\n\t}\n\n\tconfig *Config\n\tlog    *log.Logger\n\n\tremoteConnectionMutex sync.Mutex\n\tremoteConnectionMap   map[string]*UdpConn // indexed by remote UDP address\n\n\tserverPeerMutex sync.Mutex\n\tserverPeerMap   map[string]*core.UdpPeer // indexed by server's public key\n\n\tteeMutex sync.Mutex\n\tteeMap   map[string]*TEE // indexed by tee's public key\n\n\tdevice  *core.Device\n\twg      sync.WaitGroup\n\trunning atomic.Bool\n\n\tsignals struct {\n\t\tstop             chan struct{}\n\t\tserverMapUpdated chan struct{}\n\t}\n\n\trecvMsgCh <-chan *core.PacketParserData\n\tsendMsgCh chan *core.MsgData\n\n\tEnableOnlineReport bool\n}\n\ntype UdpConn struct {\n\tConnData     *core.ConnectionData\n\tnetConn      *net.UDPConn\n\tconnected    atomic.Bool\n\texternalAddr string\n}\n\nfunc (c *UdpConn) Close() {\n\tc.netConn.Close()\n\tc.ConnData.Close()\n}\n\n/*\ndirPath: the path of app or shared library entry point\nlogLevel: 0: silent, 1: error, 2: info, 3: debug, 4: verbose\n*/\nfunc (a *UdpDevice) Start(dirPath string, logLevel int) (err error) {\n\tcommon.ExeDirPath = dirPath\n\tExeDirPath = dirPath\n\t// init logger\n\ta.log = log.NewLogger(\"NHP-DB\", logLevel, filepath.Join(ExeDirPath, \"logs\"), \"device\")\n\tlog.SetGlobalLogger(a.log)\n\n\tlog.Info(\"=========================================================\")\n\tlog.Info(\"=== NHP-DB %s started                           ===\", version.Version)\n\tlog.Info(\"=== REVISION %s ===\", version.CommitId)\n\tlog.Info(\"=== RELEASE %s                       ===\", version.BuildTime)\n\tlog.Info(\"=========================================================\")\n\n\terr = a.loadBaseConfig()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tprk, err := base64.StdEncoding.DecodeString(a.config.PrivateKeyBase64)\n\tif err != nil {\n\t\tlog.Error(\"private key parse error %v\\n\", err)\n\t\treturn fmt.Errorf(\"private key parse error %v\", err)\n\t}\n\n\ta.device = core.NewDevice(core.NHP_DB, prk, nil)\n\tif a.device == nil {\n\t\tlog.Critical(\"failed to create device %v\\n\", err)\n\t\treturn fmt.Errorf(\"failed to create device %v\", err)\n\t}\n\n\ta.remoteConnectionMap = make(map[string]*UdpConn)\n\ta.serverPeerMap = make(map[string]*core.UdpPeer)\n\n\t// load peers\n\t_ = a.loadPeers()\n\n\t// load TEEs\n\t_ = a.loadTEEs()\n\n\ta.signals.stop = make(chan struct{})\n\ta.signals.serverMapUpdated = make(chan struct{}, 1)\n\ta.recvMsgCh = a.device.DecryptedMsgQueue\n\ta.sendMsgCh = make(chan *core.MsgData, core.SendQueueSize)\n\n\t// start device routines\n\ta.device.Start()\n\n\t// start device routines\n\ta.wg.Add(2)\n\n\tgo a.sendMessageRoutine()\n\tgo a.recvMessageRoutine()\n\tif a.EnableOnlineReport {\n\t\ta.wg.Add(1)\n\t\tgo a.maintainServerConnectionRoutine()\n\t}\n\ta.running.Store(true)\n\t// time.Sleep(1000 * time.Millisecond)\n\treturn nil\n}\n\n// export Stop\nfunc (a *UdpDevice) Stop() {\n\ta.running.Store(false)\n\tclose(a.signals.stop)\n\ta.device.Stop()\n\ta.StopConfigWatch()\n\ta.wg.Wait()\n\tclose(a.sendMsgCh)\n\tclose(a.signals.serverMapUpdated)\n\n\tlog.Info(\"=========================\")\n\tlog.Info(\"=== NHP-Device stopped ===\")\n\tlog.Info(\"=========================\")\n\ta.log.Close()\n}\n\nfunc (a *UdpDevice) IsRunning() bool {\n\treturn a.running.Load()\n}\n\nfunc (a *UdpDevice) newConnection(addr *net.UDPAddr) (conn *UdpConn) {\n\tconn = &UdpConn{}\n\tvar err error\n\t// unlike tcp, udp dial is fast (just socket bind), so no need to run in a thread\n\tconn.netConn, err = net.DialUDP(\"udp\", nil, addr)\n\tif err != nil {\n\t\tlog.Error(\"could not connect to remote addr %s\", addr.String())\n\t\treturn nil\n\t}\n\n\t// retrieve local port\n\tladdr := conn.netConn.LocalAddr()\n\tlocalAddr, err := net.ResolveUDPAddr(laddr.Network(), laddr.String())\n\tif err != nil {\n\t\tlog.Error(\"resolve local UDPAddr error %v\\n\", err)\n\t\treturn nil\n\t}\n\n\tlog.Info(\"Dial up new UDP connection from %s to %s\", localAddr.String(), addr.String())\n\n\tconn.ConnData = &core.ConnectionData{\n\t\tDevice:               a.device,\n\t\tCookieStore:          &core.CookieStore{},\n\t\tRemoteTransactionMap: make(map[uint64]*core.RemoteTransaction),\n\t\tLocalAddr:            localAddr,\n\t\tRemoteAddr:           addr,\n\t\tTimeoutMs:            DefaultConnectionTimeoutMs,\n\t\tSendQueue:            make(chan *core.Packet, PacketQueueSizePerConnection),\n\t\tRecvQueue:            make(chan *core.Packet, PacketQueueSizePerConnection),\n\t\tBlockSignal:          make(chan struct{}),\n\t\tSetTimeoutSignal:     make(chan struct{}),\n\t\tStopSignal:           make(chan struct{}),\n\t}\n\n\tconn.ConnData.Add(1)\n\tgo a.recvPacketRoutine(conn)\n\n\treturn conn\n}\n\nfunc (a *UdpDevice) sendMessageRoutine() {\n\tdefer a.wg.Done()\n\tdefer log.Info(\"sendMessageRoutine stopped\")\n\n\tlog.Info(\"sendMessageRoutine started\")\n\n\tfor {\n\t\tselect {\n\t\tcase <-a.signals.stop:\n\t\t\treturn\n\n\t\tcase md, ok := <-a.sendMsgCh:\n\t\t\tif !ok {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif md == nil || md.RemoteAddr == nil {\n\t\t\t\tlog.Warning(\"Invalid initiator session starter\")\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\taddrStr := md.RemoteAddr.String()\n\n\t\t\ta.remoteConnectionMutex.Lock()\n\t\t\tconn, found := a.remoteConnectionMap[addrStr]\n\t\t\ta.remoteConnectionMutex.Unlock()\n\n\t\t\tif found {\n\t\t\t\tmd.ConnData = conn.ConnData\n\t\t\t} else {\n\t\t\t\tconn = a.newConnection(md.RemoteAddr)\n\t\t\t\tif conn == nil {\n\t\t\t\t\tlog.Error(\"Failed to dial to remote address: %s\", addrStr)\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\ta.remoteConnectionMutex.Lock()\n\t\t\t\ta.remoteConnectionMap[addrStr] = conn\n\t\t\t\ta.remoteConnectionMutex.Unlock()\n\n\t\t\t\tmd.ConnData = conn.ConnData\n\n\t\t\t\t// launch connection routine\n\t\t\t\ta.wg.Add(1)\n\t\t\t\tgo a.connectionRoutine(conn)\n\t\t\t}\n\n\t\t\ta.device.SendMsgToPacket(md)\n\t\t}\n\t}\n\n}\n\nfunc (a *UdpDevice) SendPacket(pkt *core.Packet, conn *UdpConn) (n int, err error) {\n\tdefer func() {\n\t\tatomic.AddUint64(&a.stats.totalSendBytes, uint64(n))\n\t\tatomic.StoreInt64(&conn.ConnData.LastLocalSendTime, time.Now().UnixNano())\n\n\t\tif !pkt.KeepAfterSend {\n\t\t\ta.device.ReleasePoolPacket(pkt)\n\t\t}\n\t}()\n\n\tpktType := core.HeaderTypeToString(pkt.HeaderType)\n\t//log.Debug(\"Send [%s] packet (%s -> %s): %+v\", pktType, conn.ConnData.LocalAddr.String(), conn.ConnData.RemoteAddr.String(), pkt.Content)\n\tlog.Info(\"Send [%s] packet (%s -> %s), %d bytes\", pktType, conn.ConnData.LocalAddr.String(), conn.ConnData.RemoteAddr.String(), len(pkt.Content))\n\tlog.Evaluate(\"Send [%s] packet (%s -> %s), %d bytes\", pktType, conn.ConnData.LocalAddr.String(), conn.ConnData.RemoteAddr.String(), len(pkt.Content))\n\treturn conn.netConn.Write(pkt.Content)\n}\n\nfunc (a *UdpDevice) recvPacketRoutine(conn *UdpConn) {\n\taddrStr := conn.ConnData.RemoteAddr.String()\n\n\tdefer conn.ConnData.Done()\n\tdefer log.Debug(\"recvPacketRoutine for %s stopped\", addrStr)\n\n\tlog.Debug(\"recvPacketRoutine for %s started\", addrStr)\n\n\tfor {\n\t\tselect {\n\t\tcase <-conn.ConnData.StopSignal:\n\t\t\treturn\n\n\t\tdefault:\n\t\t}\n\n\t\t// udp recv, blocking until packet arrives or netConn.Close()\n\t\tpkt := a.device.AllocatePoolPacket()\n\t\tn, err := conn.netConn.Read(pkt.Buf[:])\n\t\tif err != nil {\n\t\t\ta.device.ReleasePoolPacket(pkt)\n\t\t\tif n == 0 {\n\t\t\t\t// udp connection closed, it is not an error\n\t\t\t\treturn\n\t\t\t}\n\t\t\tlog.Error(\"Failed to receive from remote address %s (%v)\", addrStr, err)\n\t\t\tcontinue\n\t\t}\n\n\t\t// add total recv bytes\n\t\tatomic.AddUint64(&a.stats.totalRecvBytes, uint64(n))\n\n\t\t// check minimal length\n\t\tif n < pkt.MinimalLength() {\n\t\t\ta.device.ReleasePoolPacket(pkt)\n\t\t\tlog.Error(\"Received UDP packet from %s is too short, discard\", addrStr)\n\t\t\tcontinue\n\t\t}\n\n\t\tpkt.Content = pkt.Buf[:n]\n\t\t//log.Trace(\"receive udp packet (%s -> %s): %+v\", conn.ConnData.RemoteAddr.String(), conn.ConnData.LocalAddr.String(), pkt.Content)\n\n\t\ttyp, _, err := a.device.RecvPrecheck(pkt)\n\t\tmsgType := core.HeaderTypeToString(typ)\n\t\tlog.Info(\"Receive [%s] packet (%s -> %s), %d bytes\", msgType, addrStr, conn.ConnData.LocalAddr.String(), n)\n\t\tlog.Evaluate(\"Receive [%s] packet (%s -> %s), %d bytes\", msgType, addrStr, conn.ConnData.LocalAddr.String(), n)\n\t\tif err != nil {\n\t\t\ta.device.ReleasePoolPacket(pkt)\n\t\t\tlog.Warning(\"Receive [%s] packet (%s -> %s), precheck error: %v\", msgType, addrStr, conn.ConnData.LocalAddr.String(), err)\n\t\t\tlog.Evaluate(\"Receive [%s] packet (%s -> %s) precheck error: %v\", msgType, addrStr, conn.ConnData.LocalAddr.String(), err)\n\t\t\tcontinue\n\t\t}\n\n\t\tatomic.StoreInt64(&conn.ConnData.LastLocalRecvTime, time.Now().UnixNano())\n\n\t\tconn.ConnData.ForwardInboundPacket(pkt)\n\t}\n}\n\nfunc (a *UdpDevice) connectionRoutine(conn *UdpConn) {\n\taddrStr := conn.ConnData.RemoteAddr.String()\n\n\tdefer a.wg.Done()\n\tdefer log.Debug(\"Connection routine: %s stopped\", addrStr)\n\n\tlog.Debug(\"Connection routine: %s started\", addrStr)\n\n\t// stop receiving packets and clean up\n\tdefer func() {\n\t\ta.remoteConnectionMutex.Lock()\n\t\tdelete(a.remoteConnectionMap, addrStr)\n\t\ta.remoteConnectionMutex.Unlock()\n\n\t\tconn.Close()\n\t}()\n\n\tfor {\n\t\tselect {\n\t\tcase <-a.signals.stop:\n\t\t\treturn\n\n\t\tcase <-conn.ConnData.SetTimeoutSignal:\n\t\t\tif conn.ConnData.TimeoutMs <= 0 {\n\t\t\t\tlog.Debug(\"Connection routine closed immediately\")\n\t\t\t\treturn\n\t\t\t}\n\n\t\tcase <-time.After(time.Duration(conn.ConnData.TimeoutMs) * time.Millisecond):\n\t\t\t// timeout, quit routine\n\t\t\tlog.Debug(\"Connection routine idle timeout\")\n\t\t\treturn\n\n\t\tcase pkt, ok := <-conn.ConnData.SendQueue:\n\t\t\tif !ok {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif pkt == nil {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\t_, _ = a.SendPacket(pkt, conn)\n\n\t\tcase pkt, ok := <-conn.ConnData.RecvQueue:\n\t\t\tif !ok {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif pkt == nil {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tlog.Debug(\"Received udp packet len [%d] from addr: %s\\n\", len(pkt.Content), addrStr)\n\t\t\t// process keepalive packet\n\t\t\tif pkt.HeaderType == core.NHP_KPL {\n\t\t\t\ta.device.ReleasePoolPacket(pkt)\n\t\t\t\tlog.Info(\"Receive [NHP_KPL] message (%s -> %s)\", addrStr, conn.ConnData.LocalAddr.String())\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif a.device.IsTransactionResponse(pkt.HeaderType) {\n\t\t\t\t// forward to a specific transaction\n\t\t\t\ttransactionId := pkt.Counter()\n\t\t\t\ttransaction := a.device.FindLocalTransaction(transactionId)\n\t\t\t\tif transaction != nil {\n\t\t\t\t\ttransaction.NextPacketCh <- pkt\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tpd := &core.PacketData{\n\t\t\t\tBasePacket: pkt,\n\t\t\t\tConnData:   conn.ConnData,\n\t\t\t\tInitTime:   atomic.LoadInt64(&conn.ConnData.LastLocalRecvTime),\n\t\t\t}\n\t\t\t// generic receive\n\t\t\ta.device.RecvPacketToMsg(pd)\n\n\t\tcase <-conn.ConnData.BlockSignal:\n\t\t\tlog.Critical(\"blocking address %s\", addrStr)\n\t\t\treturn\n\t\t}\n\t}\n}\n\nfunc (a *UdpDevice) recvMessageRoutine() {\n\tdefer a.wg.Done()\n\tdefer log.Info(\"recvMessageRoutine stopped\")\n\n\tlog.Info(\"recvMessageRoutine started\")\n\n\tfor {\n\t\tselect {\n\t\tcase <-a.signals.stop:\n\t\t\treturn\n\t\tcase ppd, ok := <-a.recvMsgCh:\n\t\t\tlog.Debug(\"recvMessageRoutine ppd.HeaderType:%d\", ppd.HeaderType)\n\t\t\tif !ok {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif ppd == nil {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tswitch ppd.HeaderType {\n\t\t\tcase core.NHP_DWR:\n\t\t\t\t// deal with NHP_AOP message\n\t\t\t\ta.wg.Add(1)\n\t\t\t\tgo func(p *core.PacketParserData) {\n\t\t\t\t\t_ = a.HandleUdpDataKeyWrappingOperations(p)\n\t\t\t\t}(ppd)\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc (a *UdpDevice) maintainServerConnectionRoutine() {\n\tdefer a.wg.Done()\n\tdefer log.Info(\"maintainServerConnectionRoutine stopped\")\n\n\tlog.Info(\"maintainServerConnectionRoutine started\")\n\n\tvar discoveryRoutineWg sync.WaitGroup\n\tdefer discoveryRoutineWg.Wait()\n\n\tfor {\n\t\t// make a local copy of servers then iterate because next operations are time consuming (too long to use locked iteration)\n\t\ta.serverPeerMutex.Lock()\n\t\tvar serverCount int32 = int32(len(a.serverPeerMap))\n\t\tdiscoveryQuitArr := make([]chan struct{}, 0, serverCount)\n\n\t\tfor _, server := range a.serverPeerMap {\n\t\t\t// launch discovery routine for each server\n\t\t\tfail := new(int32)\n\t\t\tquit := make(chan struct{})\n\t\t\tdiscoveryQuitArr = append(discoveryQuitArr, quit)\n\n\t\t\tdiscoveryRoutineWg.Add(1)\n\t\t\tgo a.serverDiscovery(server, &discoveryRoutineWg, fail, quit)\n\t\t}\n\t\ta.serverPeerMutex.Unlock()\n\n\t\tselect {\n\t\tcase <-a.signals.stop:\n\t\t\tlog.Info(\"maintainServerConnectionRoutine receives stop signal\")\n\t\t\treturn\n\t\tcase _, ok := <-a.signals.serverMapUpdated:\n\t\t\tif !ok {\n\t\t\t\treturn\n\t\t\t}\n\t\t\t// stop all current discovery routines\n\t\t\tfor _, q := range discoveryQuitArr {\n\t\t\t\tclose(q)\n\t\t\t}\n\t\t\t// continue and restart with new server discovery cycle\n\t\t}\n\t}\n}\n\nfunc (a *UdpDevice) serverDiscovery(server *core.UdpPeer, discoveryRoutineWg *sync.WaitGroup, serverFailCount *int32, quit <-chan struct{}) {\n\tdefer discoveryRoutineWg.Done()\n\n\tdbId := a.config.DbId\n\tsendAddr := server.SendAddr()\n\tif sendAddr == nil {\n\t\tlog.Error(\"Cannot connect to nil server address\")\n\t\treturn\n\t}\n\n\taddrStr := sendAddr.String()\n\n\tdefer log.Info(\"server discovery sub-routine at %s stopped\", addrStr)\n\tlog.Info(\"server discovery sub-routine at %s started\", addrStr)\n\n\tvar failCount int\n\n\tfor {\n\t\tvar lastSendTime int64\n\t\tvar lastRecvTime int64\n\t\tvar connected bool\n\n\t\t// find whether connection is already connected\n\t\ta.remoteConnectionMutex.Lock()\n\t\tconn, found := a.remoteConnectionMap[addrStr]\n\t\ta.remoteConnectionMutex.Unlock()\n\n\t\tif found {\n\t\t\t// connection based timing\n\t\t\tlastSendTime = atomic.LoadInt64(&conn.ConnData.LastLocalSendTime)\n\t\t\tlastRecvTime = atomic.LoadInt64(&conn.ConnData.LastLocalRecvTime)\n\t\t\tconnected = conn.connected.Load()\n\t\t} else {\n\t\t\t// peer based timing\n\t\t\tconn = nil\n\t\t\tlastSendTime = server.LastSendTime()\n\t\t\tlastRecvTime = server.LastRecvTime()\n\t\t}\n\n\t\tcurrTime := time.Now().UnixNano()\n\t\tpeerPbk := server.PublicKey()\n\n\t\t// when a server is not connected, try to connect in every ACLocalTransactionResponseTimeoutMs\n\t\t// when a server is connected when ServerConnectionInterval is reached since last receive, try resend NHP_AOL for maintaining server connection\n\t\tif !connected || (currTime-lastRecvTime) > int64(ReportToServerInterval*time.Second) {\n\t\t\t// send NHP_AOL message to server\n\t\t\taolMsg := &common.DBOnlineMsg{\n\t\t\t\tDBId: dbId,\n\t\t\t}\n\t\t\taolBytes, _ := json.Marshal(aolMsg)\n\n\t\t\taolMd := &core.MsgData{\n\t\t\t\tRemoteAddr:    sendAddr.(*net.UDPAddr),\n\t\t\t\tHeaderType:    core.NHP_DOL,\n\t\t\t\tCipherScheme:  a.config.DefaultCipherScheme,\n\t\t\t\tTransactionId: a.device.NextCounterIndex(),\n\t\t\t\tCompress:      true,\n\t\t\t\tPeerPk:        peerPbk,\n\t\t\t\tMessage:       aolBytes,\n\t\t\t\tResponseMsgCh: make(chan *core.PacketParserData),\n\t\t\t}\n\n\t\t\tif !a.IsRunning() {\n\t\t\t\tlog.Error(\"db(%s#%d)[DBOnline] MsgData channel closed or being closed, skip sending\", dbId, aolMd.TransactionId)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\ta.sendMsgCh <- aolMd // create new connection\n\t\t\tserver.UpdateSend(currTime)\n\n\t\t\t// block until transaction completes or timeouts\n\t\t\tppd := <-aolMd.ResponseMsgCh\n\t\t\tclose(aolMd.ResponseMsgCh)\n\n\t\t\tvar err error\n\t\t\tfunc() {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tif conn != nil {\n\t\t\t\t\t\t\tconn.connected.Store(false)\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfailCount += 1\n\t\t\t\t\t\tif failCount%ServerDiscoveryRetryBeforeFail == 0 {\n\t\t\t\t\t\t\tatomic.StoreInt32(serverFailCount, 1)\n\t\t\t\t\t\t\t// remove failed connection\n\t\t\t\t\t\t\ta.remoteConnectionMutex.Lock()\n\t\t\t\t\t\t\tconn = a.remoteConnectionMap[addrStr]\n\t\t\t\t\t\t\tif conn != nil {\n\t\t\t\t\t\t\t\tlog.Info(\"server discovery failed, close local connection: %s\", conn.ConnData.LocalAddr.String())\n\t\t\t\t\t\t\t\tdelete(a.remoteConnectionMap, addrStr)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\ta.remoteConnectionMutex.Unlock()\n\t\t\t\t\t\t\tconn.Close()\n\t\t\t\t\t\t}\n\t\t\t\t\t\tlog.Error(\"db(%s#%d)[DBOnline] reporting to server %s failed\", dbId, aolMd.TransactionId, addrStr)\n\t\t\t\t\t}\n\t\t\t\t}()\n\n\t\t\t\tif ppd.Error != nil {\n\t\t\t\t\tlog.Error(\"db(%s#%d)[DBOnline] failed to receive response from server %s: %v\", dbId, aolMd.TransactionId, addrStr, ppd.Error)\n\t\t\t\t\terr = ppd.Error\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif ppd.HeaderType != core.NHP_DBA {\n\t\t\t\t\tlog.Error(\"db(%s#%d)[DBOnline] response from server %s has wrong type: %s\", dbId, aolMd.TransactionId, addrStr, core.HeaderTypeToString(ppd.HeaderType))\n\t\t\t\t\terr = common.ErrTransactionRepliedWithWrongType\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\taakMsg := &common.ServerDBAckMsg{}\n\t\t\t\terr = json.Unmarshal(ppd.BodyMessage, aakMsg)\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Error(\"db(%s#%d)[HandleDBAck] failed to parse %s message: %v\", dbId, ppd.SenderTrxId, core.HeaderTypeToString(ppd.HeaderType), err)\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t// server discovery succeeded\n\t\t\t\tfailCount = 0\n\t\t\t\tatomic.StoreInt32(serverFailCount, 0)\n\t\t\t\ta.remoteConnectionMutex.Lock()\n\t\t\t\tconn = a.remoteConnectionMap[addrStr] // conn must be available at this point\n\t\t\t\tconn.connected.Store(true)\n\t\t\t\tconn.externalAddr = aakMsg.DBAddr\n\t\t\t\ta.remoteConnectionMutex.Unlock()\n\t\t\t\tlog.Info(\"db(%s#%d)[DBOnline] succeed. db external address is %s, replied by server %s\", dbId, aolMd.TransactionId, aakMsg.DBAddr, addrStr)\n\t\t\t}()\n\n\t\t} else if connected {\n\t\t\tif (currTime - lastSendTime) > int64(ServerKeepaliveInterval*time.Second) {\n\t\t\t\t// send NHP_KPL to server if no send happens within ServerKeepaliveInterval\n\t\t\t\tmd := &core.MsgData{\n\t\t\t\t\tRemoteAddr:   sendAddr.(*net.UDPAddr),\n\t\t\t\t\tHeaderType:   core.NHP_KPL,\n\t\t\t\t\tCipherScheme: a.config.DefaultCipherScheme,\n\t\t\t\t\t//PeerPk:        peerPbk, // pubkey not needed\n\t\t\t\t\tTransactionId: a.device.NextCounterIndex(),\n\t\t\t\t}\n\n\t\t\t\ta.sendMsgCh <- md // send NHP_KPL to server via existing connection\n\t\t\t\tserver.UpdateSend(currTime)\n\t\t\t}\n\t\t}\n\n\t\tselect {\n\t\tcase <-a.signals.stop:\n\t\t\tlog.Info(\"server discovery sub-routine at %s receives stop signal\", addrStr)\n\t\t\treturn\n\t\tcase <-quit:\n\t\t\treturn\n\t\tcase <-time.After(MinialServerDiscoveryInterval * time.Second):\n\t\t\t// wait for ServerConnectionDiscoveryInterval\n\t\t}\n\t}\n}\n\nfunc (a *UdpDevice) AddServer(server *core.UdpPeer) {\n\tif server.DeviceType() == core.NHP_SERVER {\n\t\ta.device.AddPeer(server)\n\t\ta.serverPeerMutex.Lock()\n\t\ta.serverPeerMap[server.PublicKeyBase64()] = server\n\t\ta.serverPeerMutex.Unlock()\n\t}\n}\n\nfunc (a *UdpDevice) RemoveServer(serverKey string) {\n\ta.serverPeerMutex.Lock()\n\tdelete(a.serverPeerMap, serverKey)\n\ta.serverPeerMutex.Unlock()\n}\n\n// get first server\nfunc (a *UdpDevice) GetServerPeer() (serverPeer *core.UdpPeer) {\n\tfor _, value := range a.serverPeerMap {\n\t\tserverPeer = value\n\t\treturn serverPeer\n\t}\n\treturn nil\n}\nfunc (a *UdpDevice) SendDHPRegister(msg common.DRGMsg) {\n\tlog.Debug(\"DHP started\")\n\tserverPeer := a.GetServerPeer()\n\n\tlog.Debug(\"serverPeer:%v\", serverPeer)\n\tresult := a.SendNHPDRG(serverPeer, msg)\n\tif result {\n\t\tfmt.Printf(\"Successfully register or update data object which doId is %s.\\n\", msg.DoId)\n\t} else {\n\t\tfmt.Printf(\"Error: fail to register or update data object.\\n\")\n\t}\n}\n\n// send NHP_DRG to NHP-Server\nfunc (a *UdpDevice) SendNHPDRG(server *core.UdpPeer, msg common.DRGMsg) bool {\n\n\tresult := false\n\tsendAddr := server.SendAddr()\n\tif sendAddr == nil {\n\t\tlog.Critical(\"device(%v)[SendNHPDRG] register server IP cannot be parsed\", a)\n\t}\n\tdrgMsg := msg\n\tdrgBytes, _ := json.Marshal(drgMsg)\n\tdrgMd := &core.MsgData{\n\t\tRemoteAddr:    sendAddr.(*net.UDPAddr),\n\t\tHeaderType:    core.NHP_DRG,\n\t\tCipherScheme:  a.config.DefaultCipherScheme,\n\t\tTransactionId: a.device.NextCounterIndex(),\n\t\tCompress:      true,\n\t\tMessage:       drgBytes,\n\t\tPeerPk:        server.PublicKey(),\n\t\tResponseMsgCh: make(chan *core.PacketParserData),\n\t}\n\tcurrTime := time.Now().UnixNano()\n\tif !a.IsRunning() {\n\t\tlog.Error(\"server-deviceMsgData channel closed or being closed, skip sending\")\n\t\treturn result\n\t}\n\t// device will create or find existing connection and sends the MsgAssembler via that connection\n\ta.sendMsgCh <- drgMd\n\tserver.UpdateSend(currTime)\n\t// block until transaction completes\n\tserverPpd := <-drgMd.ResponseMsgCh\n\tclose(drgMd.ResponseMsgCh)\n\n\t//Awaiting response from NHP-Server and processing it in the `func()` function below\n\tvar err error\n\tresult = func() bool {\n\n\t\tif serverPpd.Error != nil {\n\t\t\tlog.Error(\"DB(%s#%d)[SendNHPDRG] failed to receive response from server %s: %v\", drgMsg.DoId, drgMd.TransactionId, server.Ip, serverPpd.Error)\n\t\t\terr = serverPpd.Error\n\t\t\treturn false\n\t\t}\n\n\t\tif serverPpd.HeaderType != core.NHP_DAK {\n\t\t\tlog.Error(\"DB(%s#%d)[SendNHPDRG] response from server %s has wrong type: %s\", drgMsg.DoId, drgMd.TransactionId, server.Ip, core.HeaderTypeToString(serverPpd.HeaderType))\n\t\t\terr = common.ErrTransactionRepliedWithWrongType\n\t\t\treturn false\n\t\t}\n\n\t\tdakMsg := &common.DAKMsg{}\n\t\t//json string to DAKMsg Object\n\t\terr = json.Unmarshal(serverPpd.BodyMessage, dakMsg)\n\t\tif err != nil {\n\t\t\tlog.Error(\"DB(%s#%d)[HandleDHPDRGMessage] failed to parse %s message: %v\", drgMsg.DoId, serverPpd.SenderTrxId, core.HeaderTypeToString(serverPpd.HeaderType), err)\n\t\t\treturn false\n\t\t}\n\t\tdakMsgString, err := json.Marshal(dakMsg)\n\t\tif err != nil {\n\t\t\tlog.Error(\"DB(%s) DAKMsg failed to parse message: %v\", dakMsg.DoId, err)\n\t\t\treturn false\n\t\t}\n\t\tlog.Info(\"SendNHPDRG result：%v\", string(dakMsgString))\n\t\tif dakMsg.ErrCode != 0 {\n\t\t\tlog.Error(\"SendNHPDRG send failed, error: %s\", dakMsg.ErrMsg)\n\t\t\treturn false\n\t\t}\n\t\treturn true\n\t}()\n\tlog.Info(\"SendNHPDRG sent successfully | Returned result:%v\", result)\n\treturn result\n}\n\nfunc (a *UdpDevice) GetCipherSchema() int {\n\treturn a.config.DefaultCipherScheme\n}\n\nfunc (a *UdpDevice) GetSymmetricCipherMode() string {\n\treturn a.config.SymmetricCipherMode\n}\n\nfunc (a *UdpDevice) GetDataBrokerId() string {\n\treturn a.config.DbId\n}\n\nfunc (a *UdpDevice) GetOwnEcdh() core.Ecdh {\n\tprk, _ := base64.StdEncoding.DecodeString(a.config.PrivateKeyBase64)\n\teccMode := core.ECC_CURVE25519\n\tif a.config.DefaultCipherScheme == 0 {\n\t\teccMode = core.ECC_SM2\n\t}\n\n\treturn core.ECDHFromKey(eccMode, prk)\n}\n\nfunc (a *UdpDevice) isTEEAuthorized(teePbkBase64 string) bool {\n\ta.teeMutex.Lock()\n\tdefer a.teeMutex.Unlock()\n\tif tee, found := a.teeMap[teePbkBase64]; found {\n\t\treturn tee.ExpireTime > 0 && time.Now().UnixMilli() < tee.ExpireTime*1000\n\t}\n\n\treturn false\n}\n\nfunc (a *UdpDevice) HandleUdpDataKeyWrappingOperations(ppd *core.PacketParserData) (err error) {\n\tdefer a.wg.Done()\n\n\tdbId := a.config.DbId\n\n\tdwrMsg := &common.DWRMsg{}\n\tdwaMsg := &common.DWAMsg{}\n\n\ttransactionId := ppd.SenderTrxId\n\terr = json.Unmarshal(ppd.BodyMessage, dwrMsg)\n\tif err == nil {\n\t\tif !a.isTEEAuthorized(dwrMsg.TeePublicKey) {\n\t\t\terrCode, _ := strconv.Atoi(common.ErrTEENotAuthorized.ErrorCode())\n\t\t\tdwaMsg.ErrCode = errCode\n\t\t\tdwaMsg.ErrMsg = common.ErrTEENotAuthorized.Error()\n\t\t} else {\n\t\t\tdataPrkStore, err := NewDataPrivateKeyStoreWith(dwrMsg.DoId)\n\t\t\tif err != nil {\n\t\t\t\terrCode, _ := strconv.Atoi(common.ErrDataPrivateKeyStore.ErrorCode())\n\t\t\t\tdwaMsg.ErrCode = errCode\n\t\t\t\tdwaMsg.ErrMsg = common.ErrDataPrivateKeyStore.Error()\n\t\t\t} else {\n\t\t\t\tdataKeyPairEccMode := ztdolib.SM2\n\t\t\t\tif a.config.DefaultCipherScheme == common.CIPHER_SCHEME_CURVE {\n\t\t\t\t\tdataKeyPairEccMode = ztdolib.CURVE25519\n\t\t\t\t}\n\n\t\t\t\tteePbk, _ := base64.StdEncoding.DecodeString(dwrMsg.TeePublicKey)\n\t\t\t\tconsumerEPbk, _ := base64.StdEncoding.DecodeString(dwrMsg.ConsumerEphemeralPublicKey)\n\n\t\t\t\tsa := ztdolib.NewSymmetricAgreement(dataKeyPairEccMode, true)\n\t\t\t\tsa.SetMessagePatterns(ztdolib.DataPrivateKeyWrappingPatterns)\n\t\t\t\tsa.SetPsk([]byte(ztdolib.InitialDHPKeyWrappingString))\n\t\t\t\tsa.SetStaticKeyPair(a.GetOwnEcdh())\n\t\t\t\tsa.SetRemoteStaticPublicKey(teePbk)\n\t\t\t\tsa.SetRemoteEphemeralPublicKey(consumerEPbk)\n\n\t\t\t\tgcmKey, ad := sa.AgreeSymmetricKey()\n\n\t\t\t\tdataPrkWrapping := ztdolib.NewDataPrivateKeyWrapping(dataPrkStore.ProviderPublicKeyBase64, dataPrkStore.DataPrivateKeyBase64, gcmKey[:], ad)\n\n\t\t\t\tdataPrkWrappingJson, _ := json.Marshal(dataPrkWrapping)\n\n\t\t\t\tkao := common.KeyAccessObject{\n\t\t\t\t\tWrappedDataKey: string(dataPrkWrappingJson),\n\t\t\t\t}\n\t\t\t\tdwaMsg.Kao = &kao\n\t\t\t\tdwaMsg.DoId = dwrMsg.DoId\n\t\t\t}\n\t\t}\n\t} else {\n\t\tlog.Error(\"db(%s#%d)[HandleUdpDataKeyWrappingOperations] failed to parse %s message: %v\", dbId, transactionId, core.HeaderTypeToString(ppd.HeaderType), err)\n\t\terrCode, _ := strconv.Atoi(common.ErrJsonParseFailed.ErrorCode())\n\t\tdwaMsg.ErrCode = errCode\n\t\tdwaMsg.ErrMsg = err.Error()\n\t}\n\n\tdwaBytes, _ := json.Marshal(dwaMsg)\n\tmd := &core.MsgData{\n\t\tHeaderType:     core.NHP_DWA,\n\t\tTransactionId:  transactionId,\n\t\tCompress:       true,\n\t\tPrevParserData: ppd,\n\t\tMessage:        dwaBytes,\n\t}\n\n\t// forward to a specific transaction\n\ttransaction := ppd.ConnData.FindRemoteTransaction(transactionId)\n\tif transaction == nil {\n\t\tlog.Error(\"db(%s#%d)[HandleUdpDataKeyWrappingOperations] transaction is not available\", dbId, transactionId)\n\t\terr = common.ErrTransactionIdNotFound\n\t\treturn err\n\t}\n\n\ttransaction.NextMsgCh <- md\n\n\treturn err\n}\n"
  },
  {
    "path": "endpoints/db/utils.go",
    "content": "package db\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io\"\n\t\"mime/multipart\"\n\t\"net/http\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"time\"\n\n\t\"github.com/OpenNHP/opennhp/nhp/common\"\n\t\"github.com/OpenNHP/opennhp/nhp/core\"\n\tztdolib \"github.com/OpenNHP/opennhp/nhp/core/ztdo\"\n\t\"github.com/OpenNHP/opennhp/nhp/utils\"\n)\n\ntype DataPrivateKeyStore struct {\n\tDataPrivateKeyBase64    string `json:\"dataPrivateKeyBase64\"`\n\tProviderPublicKeyBase64 string `json:\"providerPublicKeyBase64\"`\n}\n\n// NewDataPrivateKeyStore create a new DataPrivateKeyStore\nfunc NewDataPrivateKeyStore(providerPublicKeyBase64 string) *DataPrivateKeyStore {\n\treturn &DataPrivateKeyStore{\n\t\tProviderPublicKeyBase64: providerPublicKeyBase64,\n\t}\n}\n\n// NewDataPrivateKeyStoreWith create a new DataPrivateKeyStore with doId\nfunc NewDataPrivateKeyStoreWith(doId string) (d *DataPrivateKeyStore, err error) {\n\tetcDir := \"etc/ztdo\"\n\tfileName := \"data-key-\" + doId + \".json\"\n\n\tfullPath := filepath.Join(common.ExeDirPath, etcDir, fileName)\n\n\t// open and read all the content in file\n\tfile, err := os.Open(fullPath)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to open file: %v\", err)\n\t}\n\n\tfileContentByte, err := io.ReadAll(file)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"error reading file: %v\", err)\n\t}\n\n\td = &DataPrivateKeyStore{}\n\t_ = d.fromJson(fileContentByte)\n\n\treturn\n}\n\nfunc (d *DataPrivateKeyStore) Generate(mode ztdolib.DataKeyPairECCMode) (privateKey []byte) {\n\tecdh := core.NewECDH(mode.ToEccType())\n\td.DataPrivateKeyBase64 = ecdh.PrivateKeyBase64()\n\treturn ecdh.PrivateKey()\n}\n\n// Save saves the dataPrivateKeyBase64 to a file, the format of file name is data-<doId>.json\n// Notes: this default way to store data private key is not safe. In the wild environment, need to use a secure way to store data private key.\nfunc (d *DataPrivateKeyStore) Save(doId string) error {\n\t// Make sure the etc directory exists\n\tetcDir := \"etc/ztdo\"\n\tif err := os.MkdirAll(etcDir, 0755); err != nil {\n\t\treturn fmt.Errorf(\"failed to create etc directory: %v\", err)\n\t}\n\n\tfileName := \"data-key-\" + doId + \".json\"\n\tfullPath := filepath.Join(common.ExeDirPath, etcDir, fileName)\n\tif _, err := os.Stat(fullPath); err == nil {\n\t\treturn fmt.Errorf(\"%v already exists, please delete it first\", fullPath)\n\t}\n\n\tfile, err := os.Create(fullPath)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to create file: %v\", err)\n\t}\n\tdefer file.Close()\n\n\t_, err = file.Write(d.toJson())\n\treturn err\n}\n\nfunc (d *DataPrivateKeyStore) Delete(doId string) error {\n\tetcDir := \"etc/ztdo\"\n\tfileName := \"data-key-\" + doId + \".json\"\n\tfullPath := filepath.Join(common.ExeDirPath, etcDir, fileName)\n\n\t// delete the file\n\terr := os.Remove(fullPath)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to delete file: %v\", err)\n\t}\n\treturn nil\n}\n\nfunc (d *DataPrivateKeyStore) toJson() []byte {\n\tdataPrkStoreJson, err := json.Marshal(d)\n\tif err != nil {\n\t\treturn []byte(\"{}\")\n\t} else {\n\t\treturn dataPrkStoreJson\n\t}\n}\n\nfunc (d *DataPrivateKeyStore) fromJson(jsonData []byte) error {\n\terr := json.Unmarshal(jsonData, d)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"json parsing error: %s\", err)\n\t}\n\treturn nil\n}\n\ntype AppParams struct {\n\tMode                    string // the mode of operation: none, encrypt and decrypt\n\tSource                  string // the path of plaintext data\n\tDsType                  string // the type of data source: stream, online and offline\n\tOutput                  string // path of output file\n\tSmartPolicy             string // path of smart policy\n\tMetadata                string // path of metadata\n\tZtdoFilePath            string // path of ztdo file when mode is decrypt\n\tZtdoId                  string // identifier of ztdo file\n\tDataPrivateKeyBase64    string\n\tAccessUrl               string // path of access url of ztdo\n\tProviderPublicKeyBase64 string\n}\n\nfunc (a *AppParams) NewSmartPolicy() (common.SmartPolicy, error) {\n\tfile, err := os.Open(a.SmartPolicy)\n\tif err != nil {\n\t\treturn common.SmartPolicy{}, fmt.Errorf(\"could not open file: %v\", err)\n\t}\n\tdefer file.Close()\n\n\tfileContentByte, err := io.ReadAll(file)\n\tif err != nil {\n\t\treturn common.SmartPolicy{}, fmt.Errorf(\"error reading file: %v\", err)\n\t}\n\n\tvar config common.SmartPolicy\n\n\terr = json.Unmarshal(fileContentByte, &config)\n\tif err != nil {\n\t\treturn common.SmartPolicy{}, fmt.Errorf(\"json parsing error: %s\", err)\n\t}\n\n\tspoId, err := utils.GenerateUUIDv4()\n\tif err != nil {\n\t\treturn common.SmartPolicy{}, fmt.Errorf(\"error generating spoId: %v\", err)\n\t}\n\n\tconfig.PolicyId = spoId\n\n\treturn config, nil\n}\n\nfunc (a *AppParams) GetMetadata() (string, error) {\n\tif a.Metadata == \"\" {\n\t\treturn \"\", nil\n\t}\n\n\tcontent, err := os.ReadFile(a.Metadata)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\treturn string(content), nil\n}\n\nfunc (a *AppParams) LoadMetadataAsStruct() (map[string]any, error) {\n\tvar metadata map[string]any\n\n\tif a.Metadata == \"\" {\n\t\treturn metadata, nil\n\t}\n\n\tcontent, err := os.ReadFile(a.Metadata)\n\tif err != nil {\n\t\treturn metadata, nil\n\t}\n\n\terr = json.Unmarshal(content, &metadata)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn metadata, nil\n}\n\nfunc (a *UdpDevice) UploadFileToNHPServer(filePath string) (string, error) {\n\thttpHost := fmt.Sprintf(\"http://%s/\", a.GetServerPeer().Host())\n\ttestReq, err := http.Get(httpHost) //nolint:gosec // G107: URL constructed from configured server peer\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\tif testReq.StatusCode == http.StatusBadRequest {\n\t\thttpHost = fmt.Sprintf(\"https://%s/\", a.GetServerPeer().Host())\n\t}\n\n\tfile, err := os.Open(filePath)\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"could not open file: %v\", err)\n\t}\n\tdefer file.Close()\n\n\tfileInfo, err := file.Stat()\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"could not get file info: %v\", err)\n\t}\n\n\t// create upload progress\n\tprogress := &UploadProgress{\n\t\tTotalSize: fileInfo.Size(),\n\t}\n\n\tstartTime := time.Now()\n\n\tbody := &bytes.Buffer{}\n\twriter := multipart.NewWriter(body)\n\n\tpart, err := writer.CreateFormFile(\"file\", filepath.Base(filePath))\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"could not create form file: %v\", err)\n\t}\n\n\tprogressReader := &ProgressReader{\n\t\tReader:   file,\n\t\tProgress: progress,\n\t}\n\n\t_, err = io.Copy(part, progressReader)\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"could not copy file to server: %v\", err)\n\t}\n\n\terr = writer.Close()\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"could not close writer: %v\", err)\n\t}\n\n\tuploadUrl := httpHost + \"storage/upload\"\n\n\treq, err := http.NewRequest(\"POST\", uploadUrl, body)\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"could not create request: %v\", err)\n\t}\n\n\treq.Header.Set(\"Content-Type\", writer.FormDataContentType())\n\n\tclient := &http.Client{\n\t\tTimeout: 120 * time.Minute,\n\t}\n\n\tresp, err := client.Do(req)\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"could not send https request: %v\", err)\n\t}\n\tdefer resp.Body.Close()\n\n\tif resp.StatusCode != http.StatusOK {\n\t\tbodyBytes, _ := io.ReadAll(resp.Body)\n\n\t\treturn \"\", fmt.Errorf(\"unexpected status code: %d, content: %s\", resp.StatusCode, string(bodyBytes))\n\t}\n\n\t// read response body\n\tbodyBytes, err := io.ReadAll(resp.Body)\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"could not read response body: %v\", err)\n\t}\n\n\t// parse response body\n\tvar respBody ServerResponse\n\n\terr = json.Unmarshal(bodyBytes, &respBody)\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"could not parse response body: %v\", err)\n\t}\n\n\tduration := time.Since(startTime)\n\tspeed := float64(progress.TotalSize) / duration.Seconds() / (1024 * 1024)\n\n\t// change the chinese to english\n\tfmt.Printf(\"\\nUpload %s to %s success! (time: %.2fs, speed: %.2fMB/s)\\n\",\n\t\tfilePath, httpHost+respBody.FileURI, duration.Seconds(), speed)\n\n\treturn httpHost + respBody.FileURI, nil\n}\n\ntype UploadProgress struct {\n\tTotalSize   int64\n\tBytesRead   int64\n\tUploadID    string\n\tLastPercent int\n}\n\ntype ServerResponse struct {\n\tMessage string `json:\"message\"`\n\tFileURI string `json:\"file_uri\"`\n\tUUID    string `json:\"uuid\"`\n\tMD5     string `json:\"md5\"`\n}\n\ntype ProgressReader struct {\n\tReader   io.Reader\n\tProgress *UploadProgress\n}\n\nfunc (pr *ProgressReader) Read(p []byte) (n int, err error) {\n\tn, err = pr.Reader.Read(p)\n\tif err == nil {\n\t\tpr.Progress.BytesRead += int64(n)\n\n\t\t// calculate percent of upload progress\n\t\tpercent := int(float64(pr.Progress.BytesRead) / float64(pr.Progress.TotalSize) * 100)\n\t\tif percent > pr.Progress.LastPercent && percent%5 == 0 {\n\t\t\tpr.Progress.LastPercent = percent\n\t\t\tpr.displayProgress(percent)\n\t\t}\n\t}\n\treturn\n}\n\n// displayProgress\nfunc (pr *ProgressReader) displayProgress(percent int) {\n\t// barLength is the length of progress bar\n\tconst barLength = 50\n\tcompleted := int(float64(barLength) * float64(percent) / 100)\n\n\t// create progress bar string\n\tbar := make([]byte, barLength)\n\tfor i := 0; i < barLength; i++ {\n\t\tif i < completed {\n\t\t\tbar[i] = '='\n\t\t} else if i == completed {\n\t\t\tbar[i] = '>'\n\t\t} else {\n\t\t\tbar[i] = ' '\n\t\t}\n\t}\n\n\t// calculate uploaded MB and total MB\n\tuploadedMB := float64(pr.Progress.BytesRead) / (1024 * 1024)\n\ttotalMB := float64(pr.Progress.TotalSize) / (1024 * 1024)\n\n\tfmt.Printf(\"\\r[%s] %3d%%  %.2f/%.2f MB\",\n\t\tstring(bar), percent, uploadedMB, totalMB)\n}\n"
  },
  {
    "path": "endpoints/go.mod",
    "content": "module github.com/OpenNHP/opennhp/endpoints\n\ngo 1.25.6\n\nrequire (\n\tgithub.com/OpenNHP/opennhp/nhp v0.6.0\n\tgithub.com/cilium/ebpf v0.21.0\n\tgithub.com/emmansun/gmsm v0.41.1\n\tgithub.com/fsnotify/fsnotify v1.9.0\n\tgithub.com/gin-contrib/sessions v1.0.4\n\tgithub.com/gin-gonic/gin v1.12.0\n\tgithub.com/golang-jwt/jwt/v5 v5.3.1\n\tgithub.com/google/uuid v1.6.0\n\tgithub.com/mark3labs/mcp-go v0.45.0\n\tgithub.com/pelletier/go-toml/v2 v2.2.4\n\tgithub.com/pion/webrtc/v4 v4.2.9\n\tgithub.com/sigstore/cosign/v2 v2.6.2\n\tgithub.com/spf13/viper v1.21.0\n\tgithub.com/urfave/cli/v2 v2.27.7\n\tgolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028\n)\n\nrequire (\n\tgithub.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c // indirect\n\tgithub.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect\n\tgithub.com/bahlo/generic-list-go v0.2.0 // indirect\n\tgithub.com/blang/semver v3.5.1+incompatible // indirect\n\tgithub.com/buger/jsonparser v1.1.1 // indirect\n\tgithub.com/bytedance/gopkg v0.1.3 // indirect\n\tgithub.com/bytedance/sonic v1.15.0 // indirect\n\tgithub.com/bytedance/sonic/loader v0.5.0 // indirect\n\tgithub.com/cenkalti/backoff/v5 v5.0.3 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.3.0 // indirect\n\tgithub.com/cloudwego/base64x v0.1.6 // indirect\n\tgithub.com/containerd/stargz-snapshotter/estargz v0.18.1 // indirect\n\tgithub.com/coocood/freecache v1.2.5 // indirect\n\tgithub.com/coreos/go-oidc/v3 v3.17.0 // indirect\n\tgithub.com/coreos/go-semver v0.3.1 // indirect\n\tgithub.com/coreos/go-systemd/v22 v22.6.0 // indirect\n\tgithub.com/cpuguy83/go-md2man/v2 v2.0.7 // indirect\n\tgithub.com/cyberphone/json-canonicalization v0.0.0-20241213102144-19d51d7fe467 // indirect\n\tgithub.com/digitorus/pkcs7 v0.0.0-20230818184609-3a137a874352 // indirect\n\tgithub.com/digitorus/timestamp v0.0.0-20231217203849-220c5c2851b7 // indirect\n\tgithub.com/docker/cli v29.2.0+incompatible // indirect\n\tgithub.com/docker/distribution v2.8.3+incompatible // indirect\n\tgithub.com/docker/docker-credential-helpers v0.9.3 // indirect\n\tgithub.com/dustin/go-humanize v1.0.1 // indirect\n\tgithub.com/gabriel-vasile/mimetype v1.4.12 // indirect\n\tgithub.com/gin-contrib/sse v1.1.0 // indirect\n\tgithub.com/go-chi/chi/v5 v5.2.4 // indirect\n\tgithub.com/go-jose/go-jose/v4 v4.1.3 // indirect\n\tgithub.com/go-logr/logr v1.4.3 // indirect\n\tgithub.com/go-logr/stdr v1.2.2 // indirect\n\tgithub.com/go-openapi/analysis v0.24.1 // indirect\n\tgithub.com/go-openapi/errors v0.22.6 // indirect\n\tgithub.com/go-openapi/jsonpointer v0.22.4 // indirect\n\tgithub.com/go-openapi/jsonreference v0.21.4 // indirect\n\tgithub.com/go-openapi/loads v0.23.2 // indirect\n\tgithub.com/go-openapi/runtime v0.29.2 // indirect\n\tgithub.com/go-openapi/spec v0.22.3 // indirect\n\tgithub.com/go-openapi/strfmt v0.25.0 // indirect\n\tgithub.com/go-openapi/swag v0.25.4 // indirect\n\tgithub.com/go-openapi/swag/cmdutils v0.25.4 // indirect\n\tgithub.com/go-openapi/swag/conv v0.25.4 // indirect\n\tgithub.com/go-openapi/swag/fileutils v0.25.4 // indirect\n\tgithub.com/go-openapi/swag/jsonname v0.25.4 // indirect\n\tgithub.com/go-openapi/swag/jsonutils v0.25.4 // indirect\n\tgithub.com/go-openapi/swag/loading v0.25.4 // indirect\n\tgithub.com/go-openapi/swag/mangling v0.25.4 // indirect\n\tgithub.com/go-openapi/swag/netutils v0.25.4 // indirect\n\tgithub.com/go-openapi/swag/stringutils v0.25.4 // indirect\n\tgithub.com/go-openapi/swag/typeutils v0.25.4 // indirect\n\tgithub.com/go-openapi/swag/yamlutils v0.25.4 // indirect\n\tgithub.com/go-openapi/validate v0.25.1 // indirect\n\tgithub.com/go-playground/locales v0.14.1 // indirect\n\tgithub.com/go-playground/universal-translator v0.18.1 // indirect\n\tgithub.com/go-playground/validator/v10 v10.30.1 // indirect\n\tgithub.com/go-viper/mapstructure/v2 v2.4.0 // indirect\n\tgithub.com/goccy/go-json v0.10.5 // indirect\n\tgithub.com/goccy/go-yaml v1.19.2 // indirect\n\tgithub.com/gogo/protobuf v1.3.2 // indirect\n\tgithub.com/golang/protobuf v1.5.4 // indirect\n\tgithub.com/golang/snappy v1.0.0 // indirect\n\tgithub.com/google/certificate-transparency-go v1.3.2 // indirect\n\tgithub.com/google/go-containerregistry v0.20.7 // indirect\n\tgithub.com/gorilla/context v1.1.2 // indirect\n\tgithub.com/gorilla/securecookie v1.1.2 // indirect\n\tgithub.com/gorilla/sessions v1.4.0 // indirect\n\tgithub.com/grpc-ecosystem/grpc-gateway/v2 v2.27.4 // indirect\n\tgithub.com/hashicorp/go-cleanhttp v0.5.2 // indirect\n\tgithub.com/hashicorp/go-retryablehttp v0.7.8 // indirect\n\tgithub.com/in-toto/attestation v1.1.2 // indirect\n\tgithub.com/in-toto/in-toto-golang v0.9.0 // indirect\n\tgithub.com/inconshreveable/mousetrap v1.1.0 // indirect\n\tgithub.com/invopop/jsonschema v0.13.0 // indirect\n\tgithub.com/jedisct1/go-minisign v0.0.0-20230811132847-661be99b8267 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/compress v1.18.1 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.3.0 // indirect\n\tgithub.com/leodido/go-urn v1.4.0 // indirect\n\tgithub.com/letsencrypt/boulder v0.20251110.0 // indirect\n\tgithub.com/mailru/easyjson v0.9.0 // indirect\n\tgithub.com/mattn/go-isatty v0.0.20 // indirect\n\tgithub.com/mitchellh/go-homedir v1.1.0 // indirect\n\tgithub.com/moby/term v0.5.2 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect\n\tgithub.com/nozzle/throttler v0.0.0-20180817012639-2ea982251481 // indirect\n\tgithub.com/oklog/ulid v1.3.1 // indirect\n\tgithub.com/opencontainers/go-digest v1.0.0 // indirect\n\tgithub.com/opencontainers/image-spec v1.1.1 // indirect\n\tgithub.com/pion/datachannel v1.6.0 // indirect\n\tgithub.com/pion/dtls/v3 v3.1.2 // indirect\n\tgithub.com/pion/ice/v4 v4.2.1 // indirect\n\tgithub.com/pion/interceptor v0.1.44 // indirect\n\tgithub.com/pion/logging v0.2.4 // indirect\n\tgithub.com/pion/mdns/v2 v2.1.0 // indirect\n\tgithub.com/pion/randutil v0.1.0 // indirect\n\tgithub.com/pion/rtcp v1.2.16 // indirect\n\tgithub.com/pion/rtp v1.10.1 // indirect\n\tgithub.com/pion/sctp v1.9.2 // indirect\n\tgithub.com/pion/sdp/v3 v3.0.18 // indirect\n\tgithub.com/pion/srtp/v3 v3.0.10 // indirect\n\tgithub.com/pion/stun/v3 v3.1.1 // indirect\n\tgithub.com/pion/transport/v4 v4.0.1 // indirect\n\tgithub.com/pion/turn/v4 v4.1.4 // indirect\n\tgithub.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect\n\tgithub.com/pkg/errors v0.9.1 // indirect\n\tgithub.com/quic-go/qpack v0.6.0 // indirect\n\tgithub.com/quic-go/quic-go v0.59.0 // indirect\n\tgithub.com/russross/blackfriday/v2 v2.1.0 // indirect\n\tgithub.com/sagikazarmark/locafero v0.11.0 // indirect\n\tgithub.com/sassoftware/relic v7.2.1+incompatible // indirect\n\tgithub.com/secure-systems-lab/go-securesystemslib v0.10.0 // indirect\n\tgithub.com/shibumi/go-pathspec v1.3.0 // indirect\n\tgithub.com/sigstore/protobuf-specs v0.5.0 // indirect\n\tgithub.com/sigstore/rekor v1.5.0 // indirect\n\tgithub.com/sigstore/rekor-tiles/v2 v2.0.1 // indirect\n\tgithub.com/sigstore/sigstore v1.10.4 // indirect\n\tgithub.com/sigstore/sigstore-go v1.1.4 // indirect\n\tgithub.com/sigstore/timestamp-authority/v2 v2.0.3 // indirect\n\tgithub.com/sirupsen/logrus v1.9.3 // indirect\n\tgithub.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8 // indirect\n\tgithub.com/spf13/afero v1.15.0 // indirect\n\tgithub.com/spf13/cast v1.10.0 // indirect\n\tgithub.com/spf13/cobra v1.10.2 // indirect\n\tgithub.com/spf13/pflag v1.0.10 // indirect\n\tgithub.com/subosito/gotenv v1.6.0 // indirect\n\tgithub.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect\n\tgithub.com/tetratelabs/wazero v1.11.0 // indirect\n\tgithub.com/theupdateframework/go-tuf v0.7.0 // indirect\n\tgithub.com/theupdateframework/go-tuf/v2 v2.4.1 // indirect\n\tgithub.com/titanous/rocacheck v0.0.0-20171023193734-afe73141d399 // indirect\n\tgithub.com/transparency-dev/formats v0.0.0-20251017110053-404c0d5b696c // indirect\n\tgithub.com/transparency-dev/merkle v0.0.2 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgithub.com/ugorji/go/codec v1.3.1 // indirect\n\tgithub.com/vbatts/tar-split v0.12.2 // indirect\n\tgithub.com/wk8/go-ordered-map/v2 v2.1.8 // indirect\n\tgithub.com/wlynxg/anet v0.0.5 // indirect\n\tgithub.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 // indirect\n\tgithub.com/yosida95/uritemplate/v3 v3.0.2 // indirect\n\tgo.etcd.io/etcd/api/v3 v3.6.8 // indirect\n\tgo.etcd.io/etcd/client/pkg/v3 v3.6.8 // indirect\n\tgo.etcd.io/etcd/client/v3 v3.6.8 // indirect\n\tgo.mongodb.org/mongo-driver v1.17.6 // indirect\n\tgo.mongodb.org/mongo-driver/v2 v2.5.0 // indirect\n\tgo.opentelemetry.io/auto/sdk v1.2.1 // indirect\n\tgo.opentelemetry.io/otel v1.38.0 // indirect\n\tgo.opentelemetry.io/otel/metric v1.38.0 // indirect\n\tgo.opentelemetry.io/otel/trace v1.38.0 // indirect\n\tgo.uber.org/multierr v1.11.0 // indirect\n\tgo.uber.org/zap v1.27.1 // indirect\n\tgo.yaml.in/yaml/v3 v3.0.4 // indirect\n\tgolang.org/x/arch v0.23.0 // indirect\n\tgolang.org/x/crypto v0.48.0 // indirect\n\tgolang.org/x/mod v0.32.0 // indirect\n\tgolang.org/x/net v0.51.0 // indirect\n\tgolang.org/x/oauth2 v0.34.0 // indirect\n\tgolang.org/x/sync v0.19.0 // indirect\n\tgolang.org/x/sys v0.42.0 // indirect\n\tgolang.org/x/term v0.40.0 // indirect\n\tgolang.org/x/text v0.34.0 // indirect\n\tgolang.org/x/time v0.14.0 // indirect\n\tgoogle.golang.org/genproto/googleapis/api v0.0.0-20251222181119-0a764e51fe1b // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20251222181119-0a764e51fe1b // indirect\n\tgoogle.golang.org/grpc v1.78.0 // indirect\n\tgoogle.golang.org/protobuf v1.36.11 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n\nreplace github.com/OpenNHP/opennhp/nhp v0.6.0 => ../nhp\n"
  },
  {
    "path": "endpoints/go.sum",
    "content": "cloud.google.com/go v0.121.6 h1:waZiuajrI28iAf40cWgycWNgaXPO06dupuS+sgibK6c=\ncloud.google.com/go v0.121.6/go.mod h1:coChdst4Ea5vUpiALcYKXEpR1S9ZgXbhEzzMcMR66vI=\ncloud.google.com/go/auth v0.18.0 h1:wnqy5hrv7p3k7cShwAU/Br3nzod7fxoqG+k0VZ+/Pk0=\ncloud.google.com/go/auth v0.18.0/go.mod h1:wwkPM1AgE1f2u6dG443MiWoD8C3BtOywNsUMcUTVDRo=\ncloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc=\ncloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c=\ncloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdBtwLoEkH9Zs=\ncloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10=\ncloud.google.com/go/iam v1.5.3 h1:+vMINPiDF2ognBJ97ABAYYwRgsaqxPbQDlMnbHMjolc=\ncloud.google.com/go/iam v1.5.3/go.mod h1:MR3v9oLkZCTlaqljW6Eb2d3HGDGK5/bDv93jhfISFvU=\ncloud.google.com/go/kms v1.23.2 h1:4IYDQL5hG4L+HzJBhzejUySoUOheh3Lk5YT4PCyyW6k=\ncloud.google.com/go/kms v1.23.2/go.mod h1:rZ5kK0I7Kn9W4erhYVoIRPtpizjunlrfU4fUkumUp8g=\ncloud.google.com/go/longrunning v0.7.0 h1:FV0+SYF1RIj59gyoWDRi45GiYUMM3K1qO51qoboQT1E=\ncloud.google.com/go/longrunning v0.7.0/go.mod h1:ySn2yXmjbK9Ba0zsQqunhDkYi0+9rlXIwnoAf+h+TPY=\nfilippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=\nfilippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=\ngithub.com/AdamKorcz/go-fuzz-headers-1 v0.0.0-20230919221257-8b5d3ce2d11d h1:zjqpY4C7H15HjRPEenkS4SAn3Jy2eRRjkjZbGR30TOg=\ngithub.com/AdamKorcz/go-fuzz-headers-1 v0.0.0-20230919221257-8b5d3ce2d11d/go.mod h1:XNqJ7hv2kY++g8XEHREpi+JqZo3+0l+CH2egBVN4yqM=\ngithub.com/Azure/azure-sdk-for-go v68.0.0+incompatible h1:fcYLmCpyNYRnvJbPerq7U0hS+6+I79yEDJBqVNcqUzU=\ngithub.com/Azure/azure-sdk-for-go/sdk/azcore v1.20.0 h1:JXg2dwJUmPB9JmtVmdEB16APJ7jurfbY5jnfXpJoRMc=\ngithub.com/Azure/azure-sdk-for-go/sdk/azcore v1.20.0/go.mod h1:YD5h/ldMsG0XiIw7PdyNhLxaM317eFh5yNLccNfGdyw=\ngithub.com/Azure/azure-sdk-for-go/sdk/azidentity v1.13.1 h1:Hk5QBxZQC1jb2Fwj6mpzme37xbCDdNTxU7O9eb5+LB4=\ngithub.com/Azure/azure-sdk-for-go/sdk/azidentity v1.13.1/go.mod h1:IYus9qsFobWIc2YVwe/WPjcnyCkPKtnHAqUYeebc8z0=\ngithub.com/Azure/azure-sdk-for-go/sdk/internal v1.11.2 h1:9iefClla7iYpfYWdzPCRDozdmndjTm8DXdpCzPajMgA=\ngithub.com/Azure/azure-sdk-for-go/sdk/internal v1.11.2/go.mod h1:XtLgD3ZD34DAaVIIAyG3objl5DynM3CQ/vMcbBNJZGI=\ngithub.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.4.0 h1:E4MgwLBGeVB5f2MdcIVD3ELVAWpr+WD6MUe1i+tM/PA=\ngithub.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.4.0/go.mod h1:Y2b/1clN4zsAoUd/pgNAQHjLDnTis/6ROkUfyob6psM=\ngithub.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.2.0 h1:nCYfgcSyHZXJI8J0IWE5MsCGlb2xp9fJiXyxWgmOFg4=\ngithub.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.2.0/go.mod h1:ucUjca2JtSZboY8IoUqyQyuuXvwbMBVwFOm0vdQPNhA=\ngithub.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c h1:udKWzYgxTojEKWjV8V+WSxDXJ4NFATAsZjh8iIbsQIg=\ngithub.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E=\ngithub.com/AzureAD/microsoft-authentication-library-for-go v1.6.0 h1:XRzhVemXdgvJqCH0sFfrBUTnUJSBrBf7++ypk+twtRs=\ngithub.com/AzureAD/microsoft-authentication-library-for-go v1.6.0/go.mod h1:HKpQxkWaGLJ+D/5H8QRpyQXA1eKjxkFlOMwck5+33Jk=\ngithub.com/alessio/shellescape v1.4.1 h1:V7yhSDDn8LP4lc4jS8pFkt0zCnzVJlG5JXy9BVKJUX0=\ngithub.com/alessio/shellescape v1.4.1/go.mod h1:PZAiSCk0LJaZkiCSkPv8qIobYglO3FPpyFjDCtHLS30=\ngithub.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so=\ngithub.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw=\ngithub.com/aws/aws-sdk-go v1.55.8 h1:JRmEUbU52aJQZ2AjX4q4Wu7t4uZjOu71uyNmaWlUkJQ=\ngithub.com/aws/aws-sdk-go v1.55.8/go.mod h1:ZkViS9AqA6otK+JBBNH2++sx1sgxrPKcSzPPvQkUtXk=\ngithub.com/aws/aws-sdk-go-v2 v1.41.0 h1:tNvqh1s+v0vFYdA1xq0aOJH+Y5cRyZ5upu6roPgPKd4=\ngithub.com/aws/aws-sdk-go-v2 v1.41.0/go.mod h1:MayyLB8y+buD9hZqkCW3kX1AKq07Y5pXxtgB+rRFhz0=\ngithub.com/aws/aws-sdk-go-v2/config v1.32.5 h1:pz3duhAfUgnxbtVhIK39PGF/AHYyrzGEyRD9Og0QrE8=\ngithub.com/aws/aws-sdk-go-v2/config v1.32.5/go.mod h1:xmDjzSUs/d0BB7ClzYPAZMmgQdrodNjPPhd6bGASwoE=\ngithub.com/aws/aws-sdk-go-v2/credentials v1.19.5 h1:xMo63RlqP3ZZydpJDMBsH9uJ10hgHYfQFIk1cHDXrR4=\ngithub.com/aws/aws-sdk-go-v2/credentials v1.19.5/go.mod h1:hhbH6oRcou+LpXfA/0vPElh/e0M3aFeOblE1sssAAEk=\ngithub.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.16 h1:80+uETIWS1BqjnN9uJ0dBUaETh+P1XwFy5vwHwK5r9k=\ngithub.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.16/go.mod h1:wOOsYuxYuB/7FlnVtzeBYRcjSRtQpAW0hCP7tIULMwo=\ngithub.com/aws/aws-sdk-go-v2/internal/configsources v1.4.16 h1:rgGwPzb82iBYSvHMHXc8h9mRoOUBZIGFgKb9qniaZZc=\ngithub.com/aws/aws-sdk-go-v2/internal/configsources v1.4.16/go.mod h1:L/UxsGeKpGoIj6DxfhOWHWQ/kGKcd4I1VncE4++IyKA=\ngithub.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.16 h1:1jtGzuV7c82xnqOVfx2F0xmJcOw5374L7N6juGW6x6U=\ngithub.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.16/go.mod h1:M2E5OQf+XLe+SZGmmpaI2yy+J326aFf6/+54PoxSANc=\ngithub.com/aws/aws-sdk-go-v2/internal/ini v1.8.4 h1:WKuaxf++XKWlHWu9ECbMlha8WOEGm0OUEZqm4K/Gcfk=\ngithub.com/aws/aws-sdk-go-v2/internal/ini v1.8.4/go.mod h1:ZWy7j6v1vWGmPReu0iSGvRiise4YI5SkR3OHKTZ6Wuc=\ngithub.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.4 h1:0ryTNEdJbzUCEWkVXEXoqlXV72J5keC1GvILMOuD00E=\ngithub.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.4/go.mod h1:HQ4qwNZh32C3CBeO6iJLQlgtMzqeG17ziAA/3KDJFow=\ngithub.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.16 h1:oHjJHeUy0ImIV0bsrX0X91GkV5nJAyv1l1CC9lnO0TI=\ngithub.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.16/go.mod h1:iRSNGgOYmiYwSCXxXaKb9HfOEj40+oTKn8pTxMlYkRM=\ngithub.com/aws/aws-sdk-go-v2/service/kms v1.49.1 h1:U0asSZ3ifpuIehDPkRI2rxHbmFUMplDA2VeR9Uogrmw=\ngithub.com/aws/aws-sdk-go-v2/service/kms v1.49.1/go.mod h1:NZo9WJqQ0sxQ1Yqu1IwCHQFQunTms2MlVgejg16S1rY=\ngithub.com/aws/aws-sdk-go-v2/service/signin v1.0.4 h1:HpI7aMmJ+mm1wkSHIA2t5EaFFv5EFYXePW30p1EIrbQ=\ngithub.com/aws/aws-sdk-go-v2/service/signin v1.0.4/go.mod h1:C5RdGMYGlfM0gYq/tifqgn4EbyX99V15P2V3R+VHbQU=\ngithub.com/aws/aws-sdk-go-v2/service/sso v1.30.7 h1:eYnlt6QxnFINKzwxP5/Ucs1vkG7VT3Iezmvfgc2waUw=\ngithub.com/aws/aws-sdk-go-v2/service/sso v1.30.7/go.mod h1:+fWt2UHSb4kS7Pu8y+BMBvJF0EWx+4H0hzNwtDNRTrg=\ngithub.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.12 h1:AHDr0DaHIAo8c9t1emrzAlVDFp+iMMKnPdYy6XO4MCE=\ngithub.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.12/go.mod h1:GQ73XawFFiWxyWXMHWfhiomvP3tXtdNar/fi8z18sx0=\ngithub.com/aws/aws-sdk-go-v2/service/sts v1.41.5 h1:SciGFVNZ4mHdm7gpD1dgZYnCuVdX1s+lFTg4+4DOy70=\ngithub.com/aws/aws-sdk-go-v2/service/sts v1.41.5/go.mod h1:iW40X4QBmUxdP+fZNOpfmkdMZqsovezbAeO+Ubiv2pk=\ngithub.com/aws/smithy-go v1.24.0 h1:LpilSUItNPFr1eY85RYgTIg5eIEPtvFbskaFcmmIUnk=\ngithub.com/aws/smithy-go v1.24.0/go.mod h1:LEj2LM3rBRQJxPZTB4KuzZkaZYnZPnvgIhb4pu07mx0=\ngithub.com/bahlo/generic-list-go v0.2.0 h1:5sz/EEAK+ls5wF+NeqDpk5+iNdMDXrh3z3nPnH1Wvgk=\ngithub.com/bahlo/generic-list-go v0.2.0/go.mod h1:2KvAjgMlE5NNynlg/5iLrrCCZ2+5xWbdbCW3pNTGyYg=\ngithub.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=\ngithub.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=\ngithub.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ=\ngithub.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=\ngithub.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs=\ngithub.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0=\ngithub.com/bytedance/gopkg v0.1.3 h1:TPBSwH8RsouGCBcMBktLt1AymVo2TVsBVCY4b6TnZ/M=\ngithub.com/bytedance/gopkg v0.1.3/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/sonic v1.15.0 h1:/PXeWFaR5ElNcVE84U0dOHjiMHQOwNIx3K4ymzh/uSE=\ngithub.com/bytedance/sonic v1.15.0/go.mod h1:tFkWrPz0/CUCLEF4ri4UkHekCIcdnkqXw9VduqpJh0k=\ngithub.com/bytedance/sonic/loader v0.5.0 h1:gXH3KVnatgY7loH5/TkeVyXPfESoqSBSBEiDd5VjlgE=\ngithub.com/bytedance/sonic/loader v0.5.0/go.mod h1:AR4NYCk5DdzZizZ5djGqQ92eEhCCcdf5x77udYiSJRo=\ngithub.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8=\ngithub.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=\ngithub.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM=\ngithub.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw=\ngithub.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=\ngithub.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=\ngithub.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=\ngithub.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=\ngithub.com/cilium/ebpf v0.21.0 h1:4dpx1J/B/1apeTmWBH5BkVLayHTkFrMovVPnHEk+l3k=\ngithub.com/cilium/ebpf v0.21.0/go.mod h1:1kHKv6Kvh5a6TePP5vvvoMa1bclRyzUXELSs272fmIQ=\ngithub.com/cloudwego/base64x v0.1.6 h1:t11wG9AECkCDk5fMSoxmufanudBtJ+/HemLstXDLI2M=\ngithub.com/cloudwego/base64x v0.1.6/go.mod h1:OFcloc187FXDaYHvrNIjxSe8ncn0OOM8gEHfghB2IPU=\ngithub.com/codahale/rfc6979 v0.0.0-20141003034818-6a90f24967eb h1:EDmT6Q9Zs+SbUoc7Ik9EfrFqcylYqgPZ9ANSbTAntnE=\ngithub.com/codahale/rfc6979 v0.0.0-20141003034818-6a90f24967eb/go.mod h1:ZjrT6AXHbDs86ZSdt/osfBi5qfexBrKUdONk989Wnk4=\ngithub.com/containerd/stargz-snapshotter/estargz v0.18.1 h1:cy2/lpgBXDA3cDKSyEfNOFMA/c10O1axL69EU7iirO8=\ngithub.com/containerd/stargz-snapshotter/estargz v0.18.1/go.mod h1:ALIEqa7B6oVDsrF37GkGN20SuvG/pIMm7FwP7ZmRb0Q=\ngithub.com/coocood/freecache v1.2.5 h1:FmhRQ8cLLVq9zWhHVYODUEZ0xu6rTPrVeAnX1AEIf7I=\ngithub.com/coocood/freecache v1.2.5/go.mod h1:RBUWa/Cy+OHdfTGFEhEuE1pMCMX51Ncizj7rthiQ3vk=\ngithub.com/coreos/go-oidc/v3 v3.17.0 h1:hWBGaQfbi0iVviX4ibC7bk8OKT5qNr4klBaCHVNvehc=\ngithub.com/coreos/go-oidc/v3 v3.17.0/go.mod h1:wqPbKFrVnE90vty060SB40FCJ8fTHTxSwyXJqZH+sI8=\ngithub.com/coreos/go-semver v0.3.1 h1:yi21YpKnrx1gt5R+la8n5WgS0kCrsPp33dmEyHReZr4=\ngithub.com/coreos/go-semver v0.3.1/go.mod h1:irMmmIw/7yzSRPWryHsK7EYSg09caPQL03VsM8rvUec=\ngithub.com/coreos/go-systemd/v22 v22.6.0 h1:aGVa/v8B7hpb0TKl0MWoAavPDmHvobFe5R5zn0bCJWo=\ngithub.com/coreos/go-systemd/v22 v22.6.0/go.mod h1:iG+pp635Fo7ZmV/j14KUcmEyWF+0X7Lua8rrTWzYgWU=\ngithub.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=\ngithub.com/cpuguy83/go-md2man/v2 v2.0.7 h1:zbFlGlXEAKlwXpmvle3d8Oe3YnkKIK4xSRTd3sHPnBo=\ngithub.com/cpuguy83/go-md2man/v2 v2.0.7/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=\ngithub.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY=\ngithub.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4=\ngithub.com/cyberphone/json-canonicalization v0.0.0-20241213102144-19d51d7fe467 h1:uX1JmpONuD549D73r6cgnxyUu18Zb7yHAy5AYU0Pm4Q=\ngithub.com/cyberphone/json-canonicalization v0.0.0-20241213102144-19d51d7fe467/go.mod h1:uzvlm1mxhHkdfqitSA92i7Se+S9ksOn3a3qmv/kyOCw=\ngithub.com/danieljoos/wincred v1.2.2 h1:774zMFJrqaeYCK2W57BgAem/MLi6mtSE47MB6BOJ0i0=\ngithub.com/danieljoos/wincred v1.2.2/go.mod h1:w7w4Utbrz8lqeMbDAK0lkNJUv5sAOkFi7nd/ogr0Uh8=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/digitorus/pkcs7 v0.0.0-20230713084857-e76b763bdc49/go.mod h1:SKVExuS+vpu2l9IoOc0RwqE7NYnb0JlcFHFnEJkVDzc=\ngithub.com/digitorus/pkcs7 v0.0.0-20230818184609-3a137a874352 h1:ge14PCmCvPjpMQMIAH7uKg0lrtNSOdpYsRXlwk3QbaE=\ngithub.com/digitorus/pkcs7 v0.0.0-20230818184609-3a137a874352/go.mod h1:SKVExuS+vpu2l9IoOc0RwqE7NYnb0JlcFHFnEJkVDzc=\ngithub.com/digitorus/timestamp v0.0.0-20231217203849-220c5c2851b7 h1:lxmTCgmHE1GUYL7P0MlNa00M67axePTq+9nBSGddR8I=\ngithub.com/digitorus/timestamp v0.0.0-20231217203849-220c5c2851b7/go.mod h1:GvWntX9qiTlOud0WkQ6ewFm0LPy5JUR1Xo0Ngbd1w6Y=\ngithub.com/docker/cli v29.2.0+incompatible h1:9oBd9+YM7rxjZLfyMGxjraKBKE4/nVyvVfN4qNl9XRM=\ngithub.com/docker/cli v29.2.0+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8=\ngithub.com/docker/distribution v2.8.3+incompatible h1:AtKxIZ36LoNK51+Z6RpzLpddBirtxJnzDrHLEKxTAYk=\ngithub.com/docker/distribution v2.8.3+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=\ngithub.com/docker/docker-credential-helpers v0.9.3 h1:gAm/VtF9wgqJMoxzT3Gj5p4AqIjCBS4wrsOh9yRqcz8=\ngithub.com/docker/docker-credential-helpers v0.9.3/go.mod h1:x+4Gbw9aGmChi3qTLZj8Dfn0TD20M/fuWy0E5+WDeCo=\ngithub.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=\ngithub.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=\ngithub.com/emmansun/gmsm v0.41.1 h1:mD1MqmaXTEqt+9UVmDpRYvcEMIa5vuslFEnw7IWp6/w=\ngithub.com/emmansun/gmsm v0.41.1/go.mod h1:FD1EQk4XcSMkahZFzNwFoI/uXzAlODB9JVsJ9G5N7Do=\ngithub.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM=\ngithub.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU=\ngithub.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg=\ngithub.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=\ngithub.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=\ngithub.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=\ngithub.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=\ngithub.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=\ngithub.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=\ngithub.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k=\ngithub.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0=\ngithub.com/gabriel-vasile/mimetype v1.4.12 h1:e9hWvmLYvtp846tLHam2o++qitpguFiYCKbn0w9jyqw=\ngithub.com/gabriel-vasile/mimetype v1.4.12/go.mod h1:d+9Oxyo1wTzWdyVUPMmXFvp4F9tea18J8ufA774AB3s=\ngithub.com/gin-contrib/sessions v1.0.4 h1:ha6CNdpYiTOK/hTp05miJLbpTSNfOnFg5Jm2kbcqy8U=\ngithub.com/gin-contrib/sessions v1.0.4/go.mod h1:ccmkrb2z6iU2osiAHZG3x3J4suJK+OU27oqzlWOqQgs=\ngithub.com/gin-contrib/sse v1.1.0 h1:n0w2GMuUpWDVp7qSpvze6fAu9iRxJY4Hmj6AmBOU05w=\ngithub.com/gin-contrib/sse v1.1.0/go.mod h1:hxRZ5gVpWMT7Z0B0gSNYqqsSCNIJMjzvm6fqCz9vjwM=\ngithub.com/gin-gonic/gin v1.12.0 h1:b3YAbrZtnf8N//yjKeU2+MQsh2mY5htkZidOM7O0wG8=\ngithub.com/gin-gonic/gin v1.12.0/go.mod h1:VxccKfsSllpKshkBWgVgRniFFAzFb9csfngsqANjnLc=\ngithub.com/go-chi/chi/v5 v5.2.4 h1:WtFKPHwlywe8Srng8j2BhOD9312j9cGUxG1SP4V2cR4=\ngithub.com/go-chi/chi/v5 v5.2.4/go.mod h1:X7Gx4mteadT3eDOMTsXzmI4/rwUpOwBHLpAfupzFJP0=\ngithub.com/go-jose/go-jose/v4 v4.1.3 h1:CVLmWDhDVRa6Mi/IgCgaopNosCaHz7zrMeF9MlZRkrs=\ngithub.com/go-jose/go-jose/v4 v4.1.3/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08=\ngithub.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=\ngithub.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=\ngithub.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-openapi/analysis v0.24.1 h1:Xp+7Yn/KOnVWYG8d+hPksOYnCYImE3TieBa7rBOesYM=\ngithub.com/go-openapi/analysis v0.24.1/go.mod h1:dU+qxX7QGU1rl7IYhBC8bIfmWQdX4Buoea4TGtxXY84=\ngithub.com/go-openapi/errors v0.22.6 h1:eDxcf89O8odEnohIXwEjY1IB4ph5vmbUsBMsFNwXWPo=\ngithub.com/go-openapi/errors v0.22.6/go.mod h1:z9S8ASTUqx7+CP1Q8dD8ewGH/1JWFFLX/2PmAYNQLgk=\ngithub.com/go-openapi/jsonpointer v0.22.4 h1:dZtK82WlNpVLDW2jlA1YCiVJFVqkED1MegOUy9kR5T4=\ngithub.com/go-openapi/jsonpointer v0.22.4/go.mod h1:elX9+UgznpFhgBuaMQ7iu4lvvX1nvNsesQ3oxmYTw80=\ngithub.com/go-openapi/jsonreference v0.21.4 h1:24qaE2y9bx/q3uRK/qN+TDwbok1NhbSmGjjySRCHtC8=\ngithub.com/go-openapi/jsonreference v0.21.4/go.mod h1:rIENPTjDbLpzQmQWCj5kKj3ZlmEh+EFVbz3RTUh30/4=\ngithub.com/go-openapi/loads v0.23.2 h1:rJXAcP7g1+lWyBHC7iTY+WAF0rprtM+pm8Jxv1uQJp4=\ngithub.com/go-openapi/loads v0.23.2/go.mod h1:IEVw1GfRt/P2Pplkelxzj9BYFajiWOtY2nHZNj4UnWY=\ngithub.com/go-openapi/runtime v0.29.2 h1:UmwSGWNmWQqKm1c2MGgXVpC2FTGwPDQeUsBMufc5Yj0=\ngithub.com/go-openapi/runtime v0.29.2/go.mod h1:biq5kJXRJKBJxTDJXAa00DOTa/anflQPhT0/wmjuy+0=\ngithub.com/go-openapi/spec v0.22.3 h1:qRSmj6Smz2rEBxMnLRBMeBWxbbOvuOoElvSvObIgwQc=\ngithub.com/go-openapi/spec v0.22.3/go.mod h1:iIImLODL2loCh3Vnox8TY2YWYJZjMAKYyLH2Mu8lOZs=\ngithub.com/go-openapi/strfmt v0.25.0 h1:7R0RX7mbKLa9EYCTHRcCuIPcaqlyQiWNPTXwClK0saQ=\ngithub.com/go-openapi/strfmt v0.25.0/go.mod h1:nNXct7OzbwrMY9+5tLX4I21pzcmE6ccMGXl3jFdPfn8=\ngithub.com/go-openapi/swag v0.25.4 h1:OyUPUFYDPDBMkqyxOTkqDYFnrhuhi9NR6QVUvIochMU=\ngithub.com/go-openapi/swag v0.25.4/go.mod h1:zNfJ9WZABGHCFg2RnY0S4IOkAcVTzJ6z2Bi+Q4i6qFQ=\ngithub.com/go-openapi/swag/cmdutils v0.25.4 h1:8rYhB5n6WawR192/BfUu2iVlxqVR9aRgGJP6WaBoW+4=\ngithub.com/go-openapi/swag/cmdutils v0.25.4/go.mod h1:pdae/AFo6WxLl5L0rq87eRzVPm/XRHM3MoYgRMvG4A0=\ngithub.com/go-openapi/swag/conv v0.25.4 h1:/Dd7p0LZXczgUcC/Ikm1+YqVzkEeCc9LnOWjfkpkfe4=\ngithub.com/go-openapi/swag/conv v0.25.4/go.mod h1:3LXfie/lwoAv0NHoEuY1hjoFAYkvlqI/Bn5EQDD3PPU=\ngithub.com/go-openapi/swag/fileutils v0.25.4 h1:2oI0XNW5y6UWZTC7vAxC8hmsK/tOkWXHJQH4lKjqw+Y=\ngithub.com/go-openapi/swag/fileutils v0.25.4/go.mod h1:cdOT/PKbwcysVQ9Tpr0q20lQKH7MGhOEb6EwmHOirUk=\ngithub.com/go-openapi/swag/jsonname v0.25.4 h1:bZH0+MsS03MbnwBXYhuTttMOqk+5KcQ9869Vye1bNHI=\ngithub.com/go-openapi/swag/jsonname v0.25.4/go.mod h1:GPVEk9CWVhNvWhZgrnvRA6utbAltopbKwDu8mXNUMag=\ngithub.com/go-openapi/swag/jsonutils v0.25.4 h1:VSchfbGhD4UTf4vCdR2F4TLBdLwHyUDTd1/q4i+jGZA=\ngithub.com/go-openapi/swag/jsonutils v0.25.4/go.mod h1:7OYGXpvVFPn4PpaSdPHJBtF0iGnbEaTk8AvBkoWnaAY=\ngithub.com/go-openapi/swag/jsonutils/fixtures_test v0.25.4 h1:IACsSvBhiNJwlDix7wq39SS2Fh7lUOCJRmx/4SN4sVo=\ngithub.com/go-openapi/swag/jsonutils/fixtures_test v0.25.4/go.mod h1:Mt0Ost9l3cUzVv4OEZG+WSeoHwjWLnarzMePNDAOBiM=\ngithub.com/go-openapi/swag/loading v0.25.4 h1:jN4MvLj0X6yhCDduRsxDDw1aHe+ZWoLjW+9ZQWIKn2s=\ngithub.com/go-openapi/swag/loading v0.25.4/go.mod h1:rpUM1ZiyEP9+mNLIQUdMiD7dCETXvkkC30z53i+ftTE=\ngithub.com/go-openapi/swag/mangling v0.25.4 h1:2b9kBJk9JvPgxr36V23FxJLdwBrpijI26Bx5JH4Hp48=\ngithub.com/go-openapi/swag/mangling v0.25.4/go.mod h1:6dxwu6QyORHpIIApsdZgb6wBk/DPU15MdyYj/ikn0Hg=\ngithub.com/go-openapi/swag/netutils v0.25.4 h1:Gqe6K71bGRb3ZQLusdI8p/y1KLgV4M/k+/HzVSqT8H0=\ngithub.com/go-openapi/swag/netutils v0.25.4/go.mod h1:m2W8dtdaoX7oj9rEttLyTeEFFEBvnAx9qHd5nJEBzYg=\ngithub.com/go-openapi/swag/stringutils v0.25.4 h1:O6dU1Rd8bej4HPA3/CLPciNBBDwZj9HiEpdVsb8B5A8=\ngithub.com/go-openapi/swag/stringutils v0.25.4/go.mod h1:GTsRvhJW5xM5gkgiFe0fV3PUlFm0dr8vki6/VSRaZK0=\ngithub.com/go-openapi/swag/typeutils v0.25.4 h1:1/fbZOUN472NTc39zpa+YGHn3jzHWhv42wAJSN91wRw=\ngithub.com/go-openapi/swag/typeutils v0.25.4/go.mod h1:Ou7g//Wx8tTLS9vG0UmzfCsjZjKhpjxayRKTHXf2pTE=\ngithub.com/go-openapi/swag/yamlutils v0.25.4 h1:6jdaeSItEUb7ioS9lFoCZ65Cne1/RZtPBZ9A56h92Sw=\ngithub.com/go-openapi/swag/yamlutils v0.25.4/go.mod h1:MNzq1ulQu+yd8Kl7wPOut/YHAAU/H6hL91fF+E2RFwc=\ngithub.com/go-openapi/testify/enable/yaml/v2 v2.0.2 h1:0+Y41Pz1NkbTHz8NngxTuAXxEodtNSI1WG1c/m5Akw4=\ngithub.com/go-openapi/testify/enable/yaml/v2 v2.0.2/go.mod h1:kme83333GCtJQHXQ8UKX3IBZu6z8T5Dvy5+CW3NLUUg=\ngithub.com/go-openapi/testify/v2 v2.0.2 h1:X999g3jeLcoY8qctY/c/Z8iBHTbwLz7R2WXd6Ub6wls=\ngithub.com/go-openapi/testify/v2 v2.0.2/go.mod h1:HCPmvFFnheKK2BuwSA0TbbdxJ3I16pjwMkYkP4Ywn54=\ngithub.com/go-openapi/validate v0.25.1 h1:sSACUI6Jcnbo5IWqbYHgjibrhhmt3vR6lCzKZnmAgBw=\ngithub.com/go-openapi/validate v0.25.1/go.mod h1:RMVyVFYte0gbSTaZ0N4KmTn6u/kClvAFp+mAVfS/DQc=\ngithub.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=\ngithub.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=\ngithub.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA=\ngithub.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=\ngithub.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=\ngithub.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=\ngithub.com/go-playground/validator/v10 v10.30.1 h1:f3zDSN/zOma+w6+1Wswgd9fLkdwy06ntQJp0BBvFG0w=\ngithub.com/go-playground/validator/v10 v10.30.1/go.mod h1:oSuBIQzuJxL//3MelwSLD5hc2Tu889bF0Idm9Dg26cM=\ngithub.com/go-quicktest/qt v1.101.1-0.20240301121107-c6c8733fa1e6 h1:teYtXy9B7y5lHTp8V9KPxpYRAVA7dozigQcMiBust1s=\ngithub.com/go-quicktest/qt v1.101.1-0.20240301121107-c6c8733fa1e6/go.mod h1:p4lGIVX+8Wa6ZPNDvqcxq36XpUDLh42FLetFU7odllI=\ngithub.com/go-rod/rod v0.116.2 h1:A5t2Ky2A+5eD/ZJQr1EfsQSe5rms5Xof/qj296e+ZqA=\ngithub.com/go-rod/rod v0.116.2/go.mod h1:H+CMO9SCNc2TJ2WfrG+pKhITz57uGNYU43qYHh438Mg=\ngithub.com/go-sql-driver/mysql v1.9.3 h1:U/N249h2WzJ3Ukj8SowVFjdtZKfu9vlLZxjPXV1aweo=\ngithub.com/go-sql-driver/mysql v1.9.3/go.mod h1:qn46aNg1333BRMNU69Lq93t8du/dwxI64Gl8i5p1WMU=\ngithub.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=\ngithub.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs=\ngithub.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM=\ngithub.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4=\ngithub.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M=\ngithub.com/goccy/go-yaml v1.19.2 h1:PmFC1S6h8ljIz6gMRBopkjP1TVT7xuwrButHID66PoM=\ngithub.com/goccy/go-yaml v1.19.2/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA=\ngithub.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk=\ngithub.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=\ngithub.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang-jwt/jwt/v5 v5.3.1 h1:kYf81DTWFe7t+1VvL7eS+jKFVWaUnK9cB1qbwn63YCY=\ngithub.com/golang-jwt/jwt/v5 v5.3.1/go.mod h1:fxCRLWMO43lRc8nhHWY6LGqRcf+1gQWArsqaEUEa5bE=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngithub.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=\ngithub.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=\ngithub.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=\ngithub.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=\ngithub.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=\ngithub.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=\ngithub.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=\ngithub.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=\ngithub.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=\ngithub.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs=\ngithub.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=\ngithub.com/google/certificate-transparency-go v1.3.2 h1:9ahSNZF2o7SYMaKaXhAumVEzXB2QaayzII9C8rv7v+A=\ngithub.com/google/certificate-transparency-go v1.3.2/go.mod h1:H5FpMUaGa5Ab2+KCYsxg6sELw3Flkl7pGZzWdBoYLXs=\ngithub.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=\ngithub.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=\ngithub.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=\ngithub.com/google/go-containerregistry v0.20.7 h1:24VGNpS0IwrOZ2ms2P1QE3Xa5X9p4phx0aUgzYzHW6I=\ngithub.com/google/go-containerregistry v0.20.7/go.mod h1:Lx5LCZQjLH1QBaMPeGwsME9biPeo1lPx6lbGj/UmzgM=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=\ngithub.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=\ngithub.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0=\ngithub.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM=\ngithub.com/google/trillian v1.7.2 h1:EPBxc4YWY4Ak8tcuhyFleY+zYlbCDCa4Sn24e1Ka8Js=\ngithub.com/google/trillian v1.7.2/go.mod h1:mfQJW4qRH6/ilABtPYNBerVJAJ/upxHLX81zxNQw05s=\ngithub.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=\ngithub.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/googleapis/enterprise-certificate-proxy v0.3.9 h1:TOpi/QG8iDcZlkQlGlFUti/ZtyLkliXvHDcyUIMuFrU=\ngithub.com/googleapis/enterprise-certificate-proxy v0.3.9/go.mod h1:MkHOF77EYAE7qfSuSS9PU6g4Nt4e11cnsDUowfwewLA=\ngithub.com/googleapis/gax-go/v2 v2.16.0 h1:iHbQmKLLZrexmb0OSsNGTeSTS0HO4YvFOG8g5E4Zd0Y=\ngithub.com/googleapis/gax-go/v2 v2.16.0/go.mod h1:o1vfQjjNZn4+dPnRdl/4ZD7S9414Y4xA+a/6Icj6l14=\ngithub.com/gorilla/context v1.1.2 h1:WRkNAv2uoa03QNIc1A6u4O7DAGMUVoopZhkiXWA2V1o=\ngithub.com/gorilla/context v1.1.2/go.mod h1:KDPwT9i/MeWHiLl90fuTgrt4/wPcv75vFAZLaOOcbxM=\ngithub.com/gorilla/securecookie v1.1.2 h1:YCIWL56dvtr73r6715mJs5ZvhtnY73hBvEF8kXD8ePA=\ngithub.com/gorilla/securecookie v1.1.2/go.mod h1:NfCASbcHqRSY+3a8tlWJwsQap2VX5pwzwo4h3eOamfo=\ngithub.com/gorilla/sessions v1.4.0 h1:kpIYOp/oi6MG/p5PgxApU8srsSw9tuFbt46Lt7auzqQ=\ngithub.com/gorilla/sessions v1.4.0/go.mod h1:FLWm50oby91+hl7p/wRxDth9bWSuk0qVL2emc7lT5ik=\ngithub.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI=\ngithub.com/grpc-ecosystem/go-grpc-middleware v1.4.0/go.mod h1:g5qyo/la0ALbONm6Vbp88Yd8NsDy6rZz+RcrMPxvld8=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.27.4 h1:kEISI/Gx67NzH3nJxAmY/dGac80kKZgZt134u7Y/k1s=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.27.4/go.mod h1:6Nz966r3vQYCqIzWsuEl9d7cf7mRhtDmm++sOxlnfxI=\ngithub.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=\ngithub.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=\ngithub.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=\ngithub.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=\ngithub.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k=\ngithub.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=\ngithub.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=\ngithub.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=\ngithub.com/hashicorp/go-retryablehttp v0.7.8 h1:ylXZWnqa7Lhqpk0L1P1LzDtGcCR0rPVUrx/c8Unxc48=\ngithub.com/hashicorp/go-retryablehttp v0.7.8/go.mod h1:rjiScheydd+CxvumBsIrFKlx3iS0jrZ7LvzFGFmuKbw=\ngithub.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=\ngithub.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=\ngithub.com/hashicorp/go-secure-stdlib/parseutil v0.2.0 h1:U+kC2dOhMFQctRfhK0gRctKAPTloZdMU5ZJxaesJ/VM=\ngithub.com/hashicorp/go-secure-stdlib/parseutil v0.2.0/go.mod h1:Ll013mhdmsVDuoIXVfBtvgGJsXDYkTw1kooNcoCXuE0=\ngithub.com/hashicorp/go-secure-stdlib/strutil v0.1.2 h1:kes8mmyCpxJsI7FTwtzRqEy9CdjCtrXrXGuOpxEA7Ts=\ngithub.com/hashicorp/go-secure-stdlib/strutil v0.1.2/go.mod h1:Gou2R9+il93BqX25LAKCLuM+y9U2T4hlwvT1yprcna4=\ngithub.com/hashicorp/go-sockaddr v1.0.7 h1:G+pTkSO01HpR5qCxg7lxfsFEZaG+C0VssTy/9dbT+Fw=\ngithub.com/hashicorp/go-sockaddr v1.0.7/go.mod h1:FZQbEYa1pxkQ7WLpyXJ6cbjpT8q0YgQaK/JakXqGyWw=\ngithub.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k=\ngithub.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM=\ngithub.com/hashicorp/hcl v1.0.1-vault-7 h1:ag5OxFVy3QYTFTJODRzTKVZ6xvdfLLCA1cy/Y6xGI0I=\ngithub.com/hashicorp/hcl v1.0.1-vault-7/go.mod h1:XYhtn6ijBSAj6n4YqAaf7RBPS4I06AItNorpy+MoQNM=\ngithub.com/hashicorp/vault/api v1.22.0 h1:+HYFquE35/B74fHoIeXlZIP2YADVboaPjaSicHEZiH0=\ngithub.com/hashicorp/vault/api v1.22.0/go.mod h1:IUZA2cDvr4Ok3+NtK2Oq/r+lJeXkeCrHRmqdyWfpmGM=\ngithub.com/howeyc/gopass v0.0.0-20210920133722-c8aef6fb66ef h1:A9HsByNhogrvm9cWb28sjiS3i7tcKCkflWFEkHfuAgM=\ngithub.com/howeyc/gopass v0.0.0-20210920133722-c8aef6fb66ef/go.mod h1:lADxMC39cJJqL93Duh1xhAs4I2Zs8mKS89XWXFGp9cs=\ngithub.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=\ngithub.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=\ngithub.com/in-toto/attestation v1.1.2 h1:MBFn6lsMq6dptQZJBhalXTcWMb/aJy3V+GX3VYj/V1E=\ngithub.com/in-toto/attestation v1.1.2/go.mod h1:gYFddHMZj3DiQ0b62ltNi1Vj5rC879bTmBbrv9CRHpM=\ngithub.com/in-toto/in-toto-golang v0.9.0 h1:tHny7ac4KgtsfrG6ybU8gVOZux2H8jN05AXJ9EBM1XU=\ngithub.com/in-toto/in-toto-golang v0.9.0/go.mod h1:xsBVrVsHNsB61++S6Dy2vWosKhuA3lUTQd+eF9HdeMo=\ngithub.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=\ngithub.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=\ngithub.com/invopop/jsonschema v0.13.0 h1:KvpoAJWEjR3uD9Kbm2HWJmqsEaHt8lBUpd0qHcIi21E=\ngithub.com/invopop/jsonschema v0.13.0/go.mod h1:ffZ5Km5SWWRAIN6wbDXItl95euhFz2uON45H2qjYt+0=\ngithub.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM=\ngithub.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg=\ngithub.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo=\ngithub.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM=\ngithub.com/jackc/pgx/v5 v5.7.5 h1:JHGfMnQY+IEtGM63d+NGMjoRpysB2JBwDr5fsngwmJs=\ngithub.com/jackc/pgx/v5 v5.7.5/go.mod h1:aruU7o91Tc2q2cFp5h4uP3f6ztExVpyVv88Xl/8Vl8M=\ngithub.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo=\ngithub.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4=\ngithub.com/jedisct1/go-minisign v0.0.0-20230811132847-661be99b8267 h1:TMtDYDHKYY15rFihtRfck/bfFqNfvcabqvXAFQfAUpY=\ngithub.com/jedisct1/go-minisign v0.0.0-20230811132847-661be99b8267/go.mod h1:h1nSAbGFqGVzn6Jyl1R/iCcBUHN4g+gW1u9CoBTrb9E=\ngithub.com/jellydator/ttlcache/v3 v3.4.0 h1:YS4P125qQS0tNhtL6aeYkheEaB/m8HCqdMMP4mnWdTY=\ngithub.com/jellydator/ttlcache/v3 v3.4.0/go.mod h1:Hw9EgjymziQD3yGsQdf1FqFdpp7YjFMd4Srg5EJlgD4=\ngithub.com/jmespath/go-jmespath v0.4.1-0.20220621161143-b0104c826a24 h1:liMMTbpW34dhU4az1GN0pTPADwNmvoRSeoZ6PItiqnY=\ngithub.com/jmespath/go-jmespath v0.4.1-0.20220621161143-b0104c826a24/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=\ngithub.com/jmhodges/clock v1.2.0 h1:eq4kys+NI0PLngzaHEe7AmPT90XMGIEySD1JfV1PDIs=\ngithub.com/jmhodges/clock v1.2.0/go.mod h1:qKjhA7x7u/lQpPB1XAqX1b1lCI/w3/fNuYpI/ZjLynI=\ngithub.com/josharian/native v1.1.0 h1:uuaP0hAbW7Y4l0ZRQ6C9zfb7Mg1mbFKry/xzDAfmtLA=\ngithub.com/josharian/native v1.1.0/go.mod h1:7X/raswPFr05uY3HiLlYeyQntB6OO7E/d2Cu7qoaN2w=\ngithub.com/jsimonetti/rtnetlink/v2 v2.0.1 h1:xda7qaHDSVOsADNouv7ukSuicKZO7GgVUCXxpaIEIlM=\ngithub.com/jsimonetti/rtnetlink/v2 v2.0.1/go.mod h1:7MoNYNbb3UaDHtF8udiJo/RH6VsTKP1pqKLUTVCvToE=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/klauspost/compress v1.18.1 h1:bcSGx7UbpBqMChDtsF28Lw6v/G94LPrrbMbdC3JH2co=\ngithub.com/klauspost/compress v1.18.1/go.mod h1:ZQFFVG+MdnR0P+l6wpXgIL4NTtwiKIdBnrBd8Nrxr+0=\ngithub.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzhA9Y=\ngithub.com/klauspost/cpuid/v2 v2.3.0/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=\ngithub.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=\ngithub.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ=\ngithub.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI=\ngithub.com/letsencrypt/boulder v0.20251110.0 h1:J8MnKICeilO91dyQ2n5eBbab24neHzUpYMUIOdOtbjc=\ngithub.com/letsencrypt/boulder v0.20251110.0/go.mod h1:ogKCJQwll82m7OVHWyTuf8eeFCjuzdRQlgnZcCl0V+8=\ngithub.com/mailru/easyjson v0.9.0 h1:PrnmzHw7262yW8sTBwxi1PdJA3Iw/EKBa8psRf7d9a4=\ngithub.com/mailru/easyjson v0.9.0/go.mod h1:1+xMtQp2MRNVL/V1bOzuP3aP8VNwRW55fQUto+XFtTU=\ngithub.com/mark3labs/mcp-go v0.45.0 h1:s0S8qR/9fWaQ3pHxz7pm1uQ0DrswoSnRIxKIjbiQtkc=\ngithub.com/mark3labs/mcp-go v0.45.0/go.mod h1:YnJfOL382MIWDx1kMY+2zsRHU/q78dBg9aFb8W6Thdw=\ngithub.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE=\ngithub.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8=\ngithub.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=\ngithub.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=\ngithub.com/mdlayher/netlink v1.7.2 h1:/UtM3ofJap7Vl4QWCPDGXY8d3GIY2UGSDbK+QWmY8/g=\ngithub.com/mdlayher/netlink v1.7.2/go.mod h1:xraEF7uJbxLhc5fpHL4cPe221LI2bdttWlU+ZGLfQSw=\ngithub.com/mdlayher/socket v0.5.1 h1:VZaqt6RkGkt2OE9l3GcC6nZkqD3xKeQLyfleW/uBcos=\ngithub.com/mdlayher/socket v0.5.1/go.mod h1:TjPLHI1UgwEv5J1B5q0zTZq12A/6H7nKmtTanQE37IQ=\ngithub.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=\ngithub.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=\ngithub.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c h1:cqn374mizHuIWj+OSJCajGr/phAmuMug9qIX3l9CflE=\ngithub.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=\ngithub.com/moby/term v0.5.2 h1:6qk3FJAFDs6i/q3W/pQ97SX192qKfZgGjCQqfCJkgzQ=\ngithub.com/moby/term v0.5.2/go.mod h1:d3djjFCrjnB+fl8NJux+EJzu0msscUP+f8it8hPkFLc=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8=\ngithub.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=\ngithub.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=\ngithub.com/natefinch/atomic v1.0.1 h1:ZPYKxkqQOx3KZ+RsbnP/YsgvxWQPGxjC0oBt2AhwV0A=\ngithub.com/natefinch/atomic v1.0.1/go.mod h1:N/D/ELrljoqDyT3rZrsUmtsuzvHkeB/wWjHV22AZRbM=\ngithub.com/nozzle/throttler v0.0.0-20180817012639-2ea982251481 h1:Up6+btDp321ZG5/zdSLo48H9Iaq0UQGthrhWC6pCxzE=\ngithub.com/nozzle/throttler v0.0.0-20180817012639-2ea982251481/go.mod h1:yKZQO8QE2bHlgozqWDiRVqTFlLQSj30K/6SAK8EeYFw=\ngithub.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=\ngithub.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=\ngithub.com/nxadm/tail v1.4.11 h1:8feyoE3OzPrcshW5/MJ4sGESc5cqmGkGCWlco4l0bqY=\ngithub.com/nxadm/tail v1.4.11/go.mod h1:OTaG3NK980DZzxbRq6lEuzgU+mug70nY11sMd4JXXHc=\ngithub.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4=\ngithub.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=\ngithub.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=\ngithub.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=\ngithub.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0=\ngithub.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=\ngithub.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU=\ngithub.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c=\ngithub.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=\ngithub.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=\ngithub.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY=\ngithub.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw=\ngithub.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro=\ngithub.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=\ngithub.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=\ngithub.com/opencontainers/image-spec v1.1.1 h1:y0fUlFfIZhPF1W537XOLg0/fcx6zcHCJwooC2xJA040=\ngithub.com/opencontainers/image-spec v1.1.1/go.mod h1:qpqAh3Dmcf36wStyyWU+kCeDgrGnAve2nCC8+7h8Q0M=\ngithub.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4=\ngithub.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY=\ngithub.com/pion/datachannel v1.6.0 h1:XecBlj+cvsxhAMZWFfFcPyUaDZtd7IJvrXqlXD/53i0=\ngithub.com/pion/datachannel v1.6.0/go.mod h1:ur+wzYF8mWdC+Mkis5Thosk+u/VOL287apDNEbFpsIk=\ngithub.com/pion/dtls/v3 v3.1.2 h1:gqEdOUXLtCGW+afsBLO0LtDD8GnuBBjEy6HRtyofZTc=\ngithub.com/pion/dtls/v3 v3.1.2/go.mod h1:Hw/igcX4pdY69z1Hgv5x7wJFrUkdgHwAn/Q/uo7YHRo=\ngithub.com/pion/ice/v4 v4.2.1 h1:XPRYXaLiFq3LFDG7a7bMrmr3mFr27G/gtXN3v/TVfxY=\ngithub.com/pion/ice/v4 v4.2.1/go.mod h1:2quLV1S5v1tAx3VvAJaH//KGitRXvo4RKlX6D3tnN+c=\ngithub.com/pion/interceptor v0.1.44 h1:sNlZwM8dWXU9JQAkJh8xrarC0Etn8Oolcniukmuy0/I=\ngithub.com/pion/interceptor v0.1.44/go.mod h1:4atVlBkcgXuUP+ykQF0qOCGU2j7pQzX2ofvPRFsY5RY=\ngithub.com/pion/logging v0.2.4 h1:tTew+7cmQ+Mc1pTBLKH2puKsOvhm32dROumOZ655zB8=\ngithub.com/pion/logging v0.2.4/go.mod h1:DffhXTKYdNZU+KtJ5pyQDjvOAh/GsNSyv1lbkFbe3so=\ngithub.com/pion/mdns/v2 v2.1.0 h1:3IJ9+Xio6tWYjhN6WwuY142P/1jA0D5ERaIqawg/fOY=\ngithub.com/pion/mdns/v2 v2.1.0/go.mod h1:pcez23GdynwcfRU1977qKU0mDxSeucttSHbCSfFOd9A=\ngithub.com/pion/randutil v0.1.0 h1:CFG1UdESneORglEsnimhUjf33Rwjubwj6xfiOXBa3mA=\ngithub.com/pion/randutil v0.1.0/go.mod h1:XcJrSMMbbMRhASFVOlj/5hQial/Y8oH/HVo7TBZq+j8=\ngithub.com/pion/rtcp v1.2.16 h1:fk1B1dNW4hsI78XUCljZJlC4kZOPk67mNRuQ0fcEkSo=\ngithub.com/pion/rtcp v1.2.16/go.mod h1:/as7VKfYbs5NIb4h6muQ35kQF/J0ZVNz2Z3xKoCBYOo=\ngithub.com/pion/rtp v1.10.1 h1:xP1prZcCTUuhO2c83XtxyOHJteISg6o8iPsE2acaMtA=\ngithub.com/pion/rtp v1.10.1/go.mod h1:rF5nS1GqbR7H/TCpKwylzeq6yDM+MM6k+On5EgeThEM=\ngithub.com/pion/sctp v1.9.2 h1:HxsOzEV9pWoeggv7T5kewVkstFNcGvhMPx0GvUOUQXo=\ngithub.com/pion/sctp v1.9.2/go.mod h1:OTOlsQ5EDQ6mQ0z4MUGXt2CgQmKyafBEXhUVqLRB6G8=\ngithub.com/pion/sdp/v3 v3.0.18 h1:l0bAXazKHpepazVdp+tPYnrsy9dfh7ZbT8DxesH5ZnI=\ngithub.com/pion/sdp/v3 v3.0.18/go.mod h1:ZREGo6A9ZygQ9XkqAj5xYCQtQpif0i6Pa81HOiAdqQ8=\ngithub.com/pion/srtp/v3 v3.0.10 h1:tFirkpBb3XccP5VEXLi50GqXhv5SKPxqrdlhDCJlZrQ=\ngithub.com/pion/srtp/v3 v3.0.10/go.mod h1:3mOTIB0cq9qlbn59V4ozvv9ClW/BSEbRp4cY0VtaR7M=\ngithub.com/pion/stun/v3 v3.1.1 h1:CkQxveJ4xGQjulGSROXbXq94TAWu8gIX2dT+ePhUkqw=\ngithub.com/pion/stun/v3 v3.1.1/go.mod h1:qC1DfmcCTQjl9PBaMa5wSn3x9IPmKxSdcCsxBcDBndM=\ngithub.com/pion/transport/v3 v3.1.1 h1:Tr684+fnnKlhPceU+ICdrw6KKkTms+5qHMgw6bIkYOM=\ngithub.com/pion/transport/v3 v3.1.1/go.mod h1:+c2eewC5WJQHiAA46fkMMzoYZSuGzA/7E2FPrOYHctQ=\ngithub.com/pion/transport/v4 v4.0.1 h1:sdROELU6BZ63Ab7FrOLn13M6YdJLY20wldXW2Cu2k8o=\ngithub.com/pion/transport/v4 v4.0.1/go.mod h1:nEuEA4AD5lPdcIegQDpVLgNoDGreqM/YqmEx3ovP4jM=\ngithub.com/pion/turn/v4 v4.1.4 h1:EU11yMXKIsK43FhcUnjLlrhE4nboHZq+TXBIi3QpcxQ=\ngithub.com/pion/turn/v4 v4.1.4/go.mod h1:ES1DXVFKnOhuDkqn9hn5VJlSWmZPaRJLyBXoOeO/BmQ=\ngithub.com/pion/webrtc/v4 v4.2.9 h1:DZIh1HAhPIL3RvwEDFsmL5hfPSLEpxsQk9/Jir2vkJE=\ngithub.com/pion/webrtc/v4 v4.2.9/go.mod h1:9EmLZve0H76eTzf8v2FmchZ6tcBXtDgpfTEu+drW6SY=\ngithub.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ=\ngithub.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU=\ngithub.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=\ngithub.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h0RJWRi/o0o=\ngithub.com/prometheus/client_golang v1.23.2/go.mod h1:Tb1a6LWHB3/SPIzCoaDXI4I8UHKeFTEQ1YCr+0Gyqmg=\ngithub.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk=\ngithub.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE=\ngithub.com/prometheus/common v0.67.4 h1:yR3NqWO1/UyO1w2PhUvXlGQs/PtFmoveVO0KZ4+Lvsc=\ngithub.com/prometheus/common v0.67.4/go.mod h1:gP0fq6YjjNCLssJCQp0yk4M8W6ikLURwkdd/YKtTbyI=\ngithub.com/prometheus/procfs v0.17.0 h1:FuLQ+05u4ZI+SS/w9+BWEM2TXiHKsUQ9TADiRH7DuK0=\ngithub.com/prometheus/procfs v0.17.0/go.mod h1:oPQLaDAMRbA+u8H5Pbfq+dl3VDAvHxMUOVhe0wYB2zw=\ngithub.com/quic-go/qpack v0.6.0 h1:g7W+BMYynC1LbYLSqRt8PBg5Tgwxn214ZZR34VIOjz8=\ngithub.com/quic-go/qpack v0.6.0/go.mod h1:lUpLKChi8njB4ty2bFLX2x4gzDqXwUpaO1DP9qMDZII=\ngithub.com/quic-go/quic-go v0.59.0 h1:OLJkp1Mlm/aS7dpKgTc6cnpynnD2Xg7C1pwL6vy/SAw=\ngithub.com/quic-go/quic-go v0.59.0/go.mod h1:upnsH4Ju1YkqpLXC305eW3yDZ4NfnNbmQRCMWS58IKU=\ngithub.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ=\ngithub.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc=\ngithub.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=\ngithub.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=\ngithub.com/ryanuber/go-glob v1.0.0 h1:iQh3xXAumdQ+4Ufa5b25cRpC5TYKlno6hsv6Cb3pkBk=\ngithub.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc=\ngithub.com/sagikazarmark/locafero v0.11.0 h1:1iurJgmM9G3PA/I+wWYIOw/5SyBtxapeHDcg+AAIFXc=\ngithub.com/sagikazarmark/locafero v0.11.0/go.mod h1:nVIGvgyzw595SUSUE6tvCp3YYTeHs15MvlmU87WwIik=\ngithub.com/sassoftware/relic v7.2.1+incompatible h1:Pwyh1F3I0r4clFJXkSI8bOyJINGqpgjJU3DYAZeI05A=\ngithub.com/sassoftware/relic v7.2.1+incompatible/go.mod h1:CWfAxv73/iLZ17rbyhIEq3K9hs5w6FpNMdUT//qR+zk=\ngithub.com/sassoftware/relic/v7 v7.6.2 h1:rS44Lbv9G9eXsukknS4mSjIAuuX+lMq/FnStgmZlUv4=\ngithub.com/sassoftware/relic/v7 v7.6.2/go.mod h1:kjmP0IBVkJZ6gXeAu35/KCEfca//+PKM6vTAsyDPY+k=\ngithub.com/secure-systems-lab/go-securesystemslib v0.10.0 h1:l+H5ErcW0PAehBNrBxoGv1jjNpGYdZ9RcheFkB2WI14=\ngithub.com/secure-systems-lab/go-securesystemslib v0.10.0/go.mod h1:MRKONWmRoFzPNQ9USRF9i1mc7MvAVvF1LlW8X5VWDvk=\ngithub.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8=\ngithub.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I=\ngithub.com/shibumi/go-pathspec v1.3.0 h1:QUyMZhFo0Md5B8zV8x2tesohbb5kfbpTi9rBnKh5dkI=\ngithub.com/shibumi/go-pathspec v1.3.0/go.mod h1:Xutfslp817l2I1cZvgcfeMQJG5QnU2lh5tVaaMCl3jE=\ngithub.com/sigstore/cosign/v2 v2.6.2 h1:mi6EAUJoPZ+yuyooU7m06a1DZWJouwYgh9a67L9tm2M=\ngithub.com/sigstore/cosign/v2 v2.6.2/go.mod h1:g+P/LgYyJkC85WGGDho7yySl3C6xTJzzpLm21ZV+E6s=\ngithub.com/sigstore/protobuf-specs v0.5.0 h1:F8YTI65xOHw70NrvPwJ5PhAzsvTnuJMGLkA4FIkofAY=\ngithub.com/sigstore/protobuf-specs v0.5.0/go.mod h1:+gXR+38nIa2oEupqDdzg4qSBT0Os+sP7oYv6alWewWc=\ngithub.com/sigstore/rekor v1.5.0 h1:rL7SghHd5HLCtsCrxw0yQg+NczGvM75EjSPPWuGjaiQ=\ngithub.com/sigstore/rekor v1.5.0/go.mod h1:D7JoVCUkxwQOpPDNYeu+CE8zeBC18Y5uDo6tF8s2rcQ=\ngithub.com/sigstore/rekor-tiles/v2 v2.0.1 h1:1Wfz15oSRNGF5Dzb0lWn5W8+lfO50ork4PGIfEKjZeo=\ngithub.com/sigstore/rekor-tiles/v2 v2.0.1/go.mod h1:Pjsbhzj5hc3MKY8FfVTYHBUHQEnP0ozC4huatu4x7OU=\ngithub.com/sigstore/sigstore v1.10.4 h1:ytOmxMgLdcUed3w1SbbZOgcxqwMG61lh1TmZLN+WeZE=\ngithub.com/sigstore/sigstore v1.10.4/go.mod h1:tDiyrdOref3q6qJxm2G+JHghqfmvifB7hw+EReAfnbI=\ngithub.com/sigstore/sigstore-go v1.1.4 h1:wTTsgCHOfqiEzVyBYA6mDczGtBkN7cM8mPpjJj5QvMg=\ngithub.com/sigstore/sigstore-go v1.1.4/go.mod h1:2U/mQOT9cjjxrtIUeKDVhL+sHBKsnWddn8URlswdBsg=\ngithub.com/sigstore/sigstore/pkg/signature/kms/aws v1.10.3 h1:D/FRl5J9UYAJPGZRAJbP0dH78pfwWnKsyCSBwFBU8CI=\ngithub.com/sigstore/sigstore/pkg/signature/kms/aws v1.10.3/go.mod h1:2GIWuNvTRMvrzd0Nl8RNqxrt9H7X0OBStwOSzGYRjYw=\ngithub.com/sigstore/sigstore/pkg/signature/kms/azure v1.10.3 h1:k5VMLf/ms7hh6MLgVoorM0K+hSMwZLXoywlxh4CXqP8=\ngithub.com/sigstore/sigstore/pkg/signature/kms/azure v1.10.3/go.mod h1:S1Bp3dmP7jYlXcGLAxG81wRbE01NIZING8ZIy0dJlAI=\ngithub.com/sigstore/sigstore/pkg/signature/kms/gcp v1.10.3 h1:AVWs0E6rVZMoDTE0Iyezrpo1J6RlI5B4QZhAC4FLE30=\ngithub.com/sigstore/sigstore/pkg/signature/kms/gcp v1.10.3/go.mod h1:nxQYF0D6u7mVtiP1azj1YVDIrtz7S0RYCVTqUG8IcCk=\ngithub.com/sigstore/sigstore/pkg/signature/kms/hashivault v1.10.3 h1:lJSdaC/aOlFHlvqmmV696n1HdXLMLEKGwpNZMV0sKts=\ngithub.com/sigstore/sigstore/pkg/signature/kms/hashivault v1.10.3/go.mod h1:b2rV9qPbt/jv/Yy75AIOZThP8j+pe1ZdLEjOwmjPdoA=\ngithub.com/sigstore/timestamp-authority/v2 v2.0.3 h1:sRyYNtdED/ttLCMdaYnwpf0zre1A9chvjTnCmWWxN8Y=\ngithub.com/sigstore/timestamp-authority/v2 v2.0.3/go.mod h1:mDaHxkt3HmZYoIlwYj4QWo0RUr7VjYU52aVO5f5Qb3I=\ngithub.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=\ngithub.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=\ngithub.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8 h1:+jumHNA0Wrelhe64i8F6HNlS8pkoyMv5sreGx2Ry5Rw=\ngithub.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8/go.mod h1:3n1Cwaq1E1/1lhQhtRK2ts/ZwZEhjcQeJQ1RuC6Q/8U=\ngithub.com/spf13/afero v1.15.0 h1:b/YBCLWAJdFWJTN9cLhiXXcD7mzKn9Dm86dNnfyQw1I=\ngithub.com/spf13/afero v1.15.0/go.mod h1:NC2ByUVxtQs4b3sIUphxK0NioZnmxgyCrfzeuq8lxMg=\ngithub.com/spf13/cast v1.10.0 h1:h2x0u2shc1QuLHfxi+cTJvs30+ZAHOGRic8uyGTDWxY=\ngithub.com/spf13/cast v1.10.0/go.mod h1:jNfB8QC9IA6ZuY2ZjDp0KtFO2LZZlg4S/7bzP6qqeHo=\ngithub.com/spf13/cobra v1.10.2 h1:DMTTonx5m65Ic0GOoRY2c16WCbHxOOw6xxezuLaBpcU=\ngithub.com/spf13/cobra v1.10.2/go.mod h1:7C1pvHqHw5A4vrJfjNwvOdzYu0Gml16OCs2GRiTUUS4=\ngithub.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=\ngithub.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk=\ngithub.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=\ngithub.com/spf13/viper v1.21.0 h1:x5S+0EU27Lbphp4UKm1C+1oQO+rKx36vfCoaVebLFSU=\ngithub.com/spf13/viper v1.21.0/go.mod h1:P0lhsswPGWD/1lZJ9ny3fYnVqxiegrlNrEmgLjbTCAY=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=\ngithub.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=\ngithub.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8=\ngithub.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU=\ngithub.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d h1:vfofYNRScrDdvS342BElfbETmL1Aiz3i2t0zfRj16Hs=\ngithub.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48=\ngithub.com/tetratelabs/wazero v1.11.0 h1:+gKemEuKCTevU4d7ZTzlsvgd1uaToIDtlQlmNbwqYhA=\ngithub.com/tetratelabs/wazero v1.11.0/go.mod h1:eV28rsN8Q+xwjogd7f4/Pp4xFxO7uOGbLcD/LzB1wiU=\ngithub.com/theupdateframework/go-tuf v0.7.0 h1:CqbQFrWo1ae3/I0UCblSbczevCCbS31Qvs5LdxRWqRI=\ngithub.com/theupdateframework/go-tuf v0.7.0/go.mod h1:uEB7WSY+7ZIugK6R1hiBMBjQftaFzn7ZCDJcp1tCUug=\ngithub.com/theupdateframework/go-tuf/v2 v2.4.1 h1:K6ewW064rKZCPkRo1W/CTbTtm/+IB4+coG1iNURAGCw=\ngithub.com/theupdateframework/go-tuf/v2 v2.4.1/go.mod h1:Nex2enPVYDFCklrnbTzl3OVwD7fgIAj0J5++z/rvCj8=\ngithub.com/tink-crypto/tink-go-awskms/v2 v2.1.0 h1:N9UxlsOzu5mttdjhxkDLbzwtEecuXmlxZVo/ds7JKJI=\ngithub.com/tink-crypto/tink-go-awskms/v2 v2.1.0/go.mod h1:PxSp9GlOkKL9rlybW804uspnHuO9nbD98V/fDX4uSis=\ngithub.com/tink-crypto/tink-go-gcpkms/v2 v2.2.0 h1:3B9i6XBXNTRspfkTC0asN5W0K6GhOSgcujNiECNRNb0=\ngithub.com/tink-crypto/tink-go-gcpkms/v2 v2.2.0/go.mod h1:jY5YN2BqD/KSCHM9SqZPIpJNG/u3zwfLXHgws4x2IRw=\ngithub.com/tink-crypto/tink-go-hcvault/v2 v2.3.0 h1:6nAX1aRGnkg2SEUMwO5toB2tQkP0Jd6cbmZ/K5Le1V0=\ngithub.com/tink-crypto/tink-go-hcvault/v2 v2.3.0/go.mod h1:HOC5NWW1wBI2Vke1FGcRBvDATkEYE7AUDiYbXqi2sBw=\ngithub.com/tink-crypto/tink-go/v2 v2.6.0 h1:+KHNBHhWH33Vn+igZWcsgdEPUxKwBMEe0QC60t388v4=\ngithub.com/tink-crypto/tink-go/v2 v2.6.0/go.mod h1:2WbBA6pfNsAfBwDCggboaHeB2X29wkU8XHtGwh2YIk8=\ngithub.com/titanous/rocacheck v0.0.0-20171023193734-afe73141d399 h1:e/5i7d4oYZ+C1wj2THlRK+oAhjeS/TRQwMfkIuet3w0=\ngithub.com/titanous/rocacheck v0.0.0-20171023193734-afe73141d399/go.mod h1:LdwHTNJT99C5fTAzDz0ud328OgXz+gierycbcIx2fRs=\ngithub.com/transparency-dev/formats v0.0.0-20251017110053-404c0d5b696c h1:5a2XDQ2LiAUV+/RjckMyq9sXudfrPSuCY4FuPC1NyAw=\ngithub.com/transparency-dev/formats v0.0.0-20251017110053-404c0d5b696c/go.mod h1:g85IafeFJZLxlzZCDRu4JLpfS7HKzR+Hw9qRh3bVzDI=\ngithub.com/transparency-dev/merkle v0.0.2 h1:Q9nBoQcZcgPamMkGn7ghV8XiTZ/kRxn1yCG81+twTK4=\ngithub.com/transparency-dev/merkle v0.0.2/go.mod h1:pqSy+OXefQ1EDUVmAJ8MUhHB9TXGuzVAT58PqBoHz1A=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/ugorji/go/codec v1.3.1 h1:waO7eEiFDwidsBN6agj1vJQ4AG7lh2yqXyOXqhgQuyY=\ngithub.com/ugorji/go/codec v1.3.1/go.mod h1:pRBVtBSKl77K30Bv8R2P+cLSGaTtex6fsA2Wjqmfxj4=\ngithub.com/urfave/cli/v2 v2.27.7 h1:bH59vdhbjLv3LAvIu6gd0usJHgoTTPhCFib8qqOwXYU=\ngithub.com/urfave/cli/v2 v2.27.7/go.mod h1:CyNAG/xg+iAOg0N4MPGZqVmv2rCoP267496AOXUZjA4=\ngithub.com/vbatts/tar-split v0.12.2 h1:w/Y6tjxpeiFMR47yzZPlPj/FcPLpXbTUi/9H7d3CPa4=\ngithub.com/vbatts/tar-split v0.12.2/go.mod h1:eF6B6i6ftWQcDqEn3/iGFRFRo8cBIMSJVOpnNdfTMFA=\ngithub.com/wk8/go-ordered-map/v2 v2.1.8 h1:5h/BUHu93oj4gIdvHHHGsScSTMijfx5PeYkE/fJgbpc=\ngithub.com/wk8/go-ordered-map/v2 v2.1.8/go.mod h1:5nJHM5DyteebpVlHnWMV0rPz6Zp7+xBAnxjb1X5vnTw=\ngithub.com/wlynxg/anet v0.0.5 h1:J3VJGi1gvo0JwZ/P1/Yc/8p63SoW98B5dHkYDmpgvvU=\ngithub.com/wlynxg/anet v0.0.5/go.mod h1:eay5PRQr7fIVAMbTbchTnO9gG65Hg/uYGdc7mguHxoA=\ngithub.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 h1:gEOO8jv9F4OT7lGCjxCBTO/36wtF6j2nSip77qHd4x4=\ngithub.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1/go.mod h1:Ohn+xnUBiLI6FVj/9LpzZWtj1/D6lUovWYBkxHVV3aM=\ngithub.com/yosida95/uritemplate/v3 v3.0.2 h1:Ed3Oyj9yrmi9087+NczuL5BwkIc4wvTb5zIM+UJPGz4=\ngithub.com/yosida95/uritemplate/v3 v3.0.2/go.mod h1:ILOh0sOhIJR3+L/8afwt/kE++YT040gmv5BQTMR2HP4=\ngithub.com/ysmood/fetchup v0.2.3 h1:ulX+SonA0Vma5zUFXtv52Kzip/xe7aj4vqT5AJwQ+ZQ=\ngithub.com/ysmood/fetchup v0.2.3/go.mod h1:xhibcRKziSvol0H1/pj33dnKrYyI2ebIvz5cOOkYGns=\ngithub.com/ysmood/goob v0.4.0 h1:HsxXhyLBeGzWXnqVKtmT9qM7EuVs/XOgkX7T6r1o1AQ=\ngithub.com/ysmood/goob v0.4.0/go.mod h1:u6yx7ZhS4Exf2MwciFr6nIM8knHQIE22lFpWHnfql18=\ngithub.com/ysmood/got v0.40.0 h1:ZQk1B55zIvS7zflRrkGfPDrPG3d7+JOza1ZkNxcc74Q=\ngithub.com/ysmood/got v0.40.0/go.mod h1:W7DdpuX6skL3NszLmAsC5hT7JAhuLZhByVzHTq874Qg=\ngithub.com/ysmood/gson v0.7.3 h1:QFkWbTH8MxyUTKPkVWAENJhxqdBa4lYTQWqZCiLG6kE=\ngithub.com/ysmood/gson v0.7.3/go.mod h1:3Kzs5zDl21g5F/BlLTNcuAGAYLKt2lV5G8D1zF3RNmg=\ngithub.com/ysmood/leakless v0.9.0 h1:qxCG5VirSBvmi3uynXFkcnLMzkphdh3xx5FtrORwDCU=\ngithub.com/ysmood/leakless v0.9.0/go.mod h1:R8iAXPRaG97QJwqxs74RdwzcRHT1SWCGTNqY8q0JvMQ=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/zalando/go-keyring v0.2.3 h1:v9CUu9phlABObO4LPWycf+zwMG7nlbb3t/B5wa97yms=\ngithub.com/zalando/go-keyring v0.2.3/go.mod h1:HL4k+OXQfJUWaMnqyuSOc0drfGPX2b51Du6K+MRgZMk=\ngo.etcd.io/etcd/api/v3 v3.6.8 h1:gqb1VN92TAI6G2FiBvWcqKtHiIjr4SU2GdXxTwyexbM=\ngo.etcd.io/etcd/api/v3 v3.6.8/go.mod h1:qyQj1HZPUV3B5cbAL8scG62+fyz5dSxxu0w8pn28N6Q=\ngo.etcd.io/etcd/client/pkg/v3 v3.6.8 h1:Qs/5C0LNFiqXxYf2GU8MVjYUEXJ6sZaYOz0zEqQgy50=\ngo.etcd.io/etcd/client/pkg/v3 v3.6.8/go.mod h1:GsiTRUZE2318PggZkAo6sWb6l8JLVrnckTNfbG8PWtw=\ngo.etcd.io/etcd/client/v3 v3.6.8 h1:B3G76t1UykqAOrbio7s/EPatixQDkQBevN8/mwiplrY=\ngo.etcd.io/etcd/client/v3 v3.6.8/go.mod h1:MVG4BpSIuumPi+ELF7wYtySETmoTWBHVcDoHdVupwt8=\ngo.mongodb.org/mongo-driver v1.17.6 h1:87JUG1wZfWsr6rIz3ZmpH90rL5tea7O3IHuSwHUpsss=\ngo.mongodb.org/mongo-driver v1.17.6/go.mod h1:Hy04i7O2kC4RS06ZrhPRqj/u4DTYkFDAAccj+rVKqgQ=\ngo.mongodb.org/mongo-driver/v2 v2.5.0 h1:yXUhImUjjAInNcpTcAlPHiT7bIXhshCTL3jVBkF3xaE=\ngo.mongodb.org/mongo-driver/v2 v2.5.0/go.mod h1:yOI9kBsufol30iFsl1slpdq1I0eHPzybRWdyYUs8K/0=\ngo.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64=\ngo.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y=\ngo.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.63.0 h1:YH4g8lQroajqUwWbq/tr2QX1JFmEXaDLgG+ew9bLMWo=\ngo.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.63.0/go.mod h1:fvPi2qXDqFs8M4B4fmJhE92TyQs9Ydjlg3RvfUp+NbQ=\ngo.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.63.0 h1:RbKq8BG0FI8OiXhBfcRtqqHcZcka+gU3cskNuf05R18=\ngo.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.63.0/go.mod h1:h06DGIukJOevXaj/xrNjhi/2098RZzcLTbc0jDAUbsg=\ngo.opentelemetry.io/otel v1.38.0 h1:RkfdswUDRimDg0m2Az18RKOsnI8UDzppJAtj01/Ymk8=\ngo.opentelemetry.io/otel v1.38.0/go.mod h1:zcmtmQ1+YmQM9wrNsTGV/q/uyusom3P8RxwExxkZhjM=\ngo.opentelemetry.io/otel/metric v1.38.0 h1:Kl6lzIYGAh5M159u9NgiRkmoMKjvbsKtYRwgfrA6WpA=\ngo.opentelemetry.io/otel/metric v1.38.0/go.mod h1:kB5n/QoRM8YwmUahxvI3bO34eVtQf2i4utNVLr9gEmI=\ngo.opentelemetry.io/otel/sdk v1.38.0 h1:l48sr5YbNf2hpCUj/FoGhW9yDkl+Ma+LrVl8qaM5b+E=\ngo.opentelemetry.io/otel/sdk v1.38.0/go.mod h1:ghmNdGlVemJI3+ZB5iDEuk4bWA3GkTpW+DOoZMYBVVg=\ngo.opentelemetry.io/otel/sdk/metric v1.38.0 h1:aSH66iL0aZqo//xXzQLYozmWrXxyFkBJ6qT5wthqPoM=\ngo.opentelemetry.io/otel/sdk/metric v1.38.0/go.mod h1:dg9PBnW9XdQ1Hd6ZnRz689CbtrUp0wMMs9iPcgT9EZA=\ngo.opentelemetry.io/otel/trace v1.38.0 h1:Fxk5bKrDZJUH+AMyyIXGcFAPah0oRcT+LuNtJrmcNLE=\ngo.opentelemetry.io/otel/trace v1.38.0/go.mod h1:j1P9ivuFsTceSWe1oY+EeW3sc+Pp42sO++GHkg4wwhs=\ngo.step.sm/crypto v0.75.0 h1:UAHYD6q6ggYyzLlIKHv1MCUVjZIesXRZpGTlRC/HSHw=\ngo.step.sm/crypto v0.75.0/go.mod h1:wwQ57+ajmDype9mrI/2hRyrvJd7yja5xVgWYqpUN3PE=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngo.uber.org/mock v0.6.0 h1:hyF9dfmbgIX5EfOdasqLsWD6xqpNZlXblLB/Dbnwv3Y=\ngo.uber.org/mock v0.6.0/go.mod h1:KiVJ4BqZJaMj4svdfmHM0AUx4NJYO8ZNpPnZn1Z+BBU=\ngo.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=\ngo.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.27.1 h1:08RqriUEv8+ArZRYSTXy1LeBScaMpVSTBhCeaZYfMYc=\ngo.uber.org/zap v1.27.1/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=\ngo.yaml.in/yaml/v2 v2.4.3 h1:6gvOSjQoTB3vt1l+CU+tSyi/HOjfOjRLJ4YwYZGwRO0=\ngo.yaml.in/yaml/v2 v2.4.3/go.mod h1:zSxWcmIDjOzPXpjlTTbAsKokqkDNAVtZO0WOMiT90s8=\ngo.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc=\ngo.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg=\ngolang.org/x/arch v0.23.0 h1:lKF64A2jF6Zd8L0knGltUnegD62JMFBiCPBmQpToHhg=\ngolang.org/x/arch v0.23.0/go.mod h1:dNHoOeKiyja7GTvF9NJS1l3Z2yntpQNzgrjh1cU103A=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.48.0 h1:/VRzVqiRSggnhY7gNRxPauEQ5Drw9haKdM0jqfcCFts=\ngolang.org/x/crypto v0.48.0/go.mod h1:r0kV5h3qnFPlQnBSrULhlsRfryS2pmewsg+XfMgkVos=\ngolang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=\ngolang.org/x/exp v0.0.0-20250620022241-b7579e27df2b h1:M2rDM6z3Fhozi9O7NWsxAkg/yqS/lQJ6PmkyIV3YP+o=\ngolang.org/x/exp v0.0.0-20250620022241-b7579e27df2b/go.mod h1:3//PLf8L/X+8b4vuAfHzxeRUl04Adcb341+IGKfnqS8=\ngolang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028 h1:4+4C/Iv2U4fMZBiMCc98MG1In4gJY5YRhtpDNeDeHWs=\ngolang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.32.0 h1:9F4d3PHLljb6x//jOyokMv3eX+YDeepZSEo3mFJy93c=\ngolang.org/x/mod v0.32.0/go.mod h1:SgipZ/3h2Ci89DlEtEXWUk/HteuRin+HHhN+WbNhguU=\ngolang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=\ngolang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=\ngolang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.51.0 h1:94R/GTO7mt3/4wIKpcR5gkGmRLOuE/2hNGeWq/GBIFo=\ngolang.org/x/net v0.51.0/go.mod h1:aamm+2QF5ogm02fjy5Bb7CQ0WMt1/WVM7FtyaTLlA9Y=\ngolang.org/x/oauth2 v0.34.0 h1:hqK/t4AKgbqWkdkcAeI8XLmbK+4m4G5YeQRrmiotGlw=\ngolang.org/x/oauth2 v0.34.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA=\ngolang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4=\ngolang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=\ngolang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.42.0 h1:omrd2nAlyT5ESRdCLYdm3+fMfNFE/+Rf4bDIQImRJeo=\ngolang.org/x/sys v0.42.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/term v0.40.0 h1:36e4zGLqU4yhjlmxEaagx2KuYbJq3EwY8K943ZsHcvg=\ngolang.org/x/term v0.40.0/go.mod h1:w2P8uVp06p2iyKKuvXIm7N/y0UCRt3UfJTfZ7oOpglM=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.34.0 h1:oL/Qq0Kdaqxa1KbNeMKwQq0reLCCaFtqu2eNuSeNHbk=\ngolang.org/x/text v0.34.0/go.mod h1:homfLqTYRFyVYemLBFl5GgL/DWEiH5wcsQ5gSh1yziA=\ngolang.org/x/time v0.14.0 h1:MRx4UaLrDotUKUdCIqzPC48t1Y9hANFKIRpNx+Te8PI=\ngolang.org/x/time v0.14.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8=\ngonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk=\ngonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E=\ngoogle.golang.org/api v0.260.0 h1:XbNi5E6bOVEj/uLXQRlt6TKuEzMD7zvW/6tNwltE4P4=\ngoogle.golang.org/api v0.260.0/go.mod h1:Shj1j0Phr/9sloYrKomICzdYgsSDImpTxME8rGLaZ/o=\ngoogle.golang.org/genproto v0.0.0-20251202230838-ff82c1b0f217 h1:GvESR9BIyHUahIb0NcTum6itIWtdoglGX+rnGxm2934=\ngoogle.golang.org/genproto v0.0.0-20251202230838-ff82c1b0f217/go.mod h1:yJ2HH4EHEDTd3JiLmhds6NkJ17ITVYOdV3m3VKOnws0=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20251222181119-0a764e51fe1b h1:uA40e2M6fYRBf0+8uN5mLlqUtV192iiksiICIBkYJ1E=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20251222181119-0a764e51fe1b/go.mod h1:Xa7le7qx2vmqB/SzWUBa7KdMjpdpAHlh5QCSnjessQk=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20251222181119-0a764e51fe1b h1:Mv8VFug0MP9e5vUxfBcE3vUkV6CImK3cMNMIDFjmzxU=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20251222181119-0a764e51fe1b/go.mod h1:j9x/tPzZkyxcgEFkiKEEGxfvyumM01BEtsW8xzOahRQ=\ngoogle.golang.org/grpc v1.78.0 h1:K1XZG/yGDJnzMdd/uZHAkVqJE+xIDOcmdSFZkBUicNc=\ngoogle.golang.org/grpc v1.78.0/go.mod h1:I47qjTo4OKbMkjA/aOOwxDIiPSBofUtQUI5EfpWvW7U=\ngoogle.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=\ngoogle.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=\ngoogle.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=\ngoogle.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=\ngoogle.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=\ngoogle.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=\ngoogle.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE=\ngoogle.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=\ngopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=\ngopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=\ngopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngotest.tools/v3 v3.5.0 h1:Ljk6PdHdOhAb5aDMWXjDLMMhph+BpztA4v1QdqEW2eY=\ngotest.tools/v3 v3.5.0/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU=\nk8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk=\nk8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE=\nsigs.k8s.io/yaml v1.6.0 h1:G8fkbMSAFqgEFgh4b1wmtzDnioxFCUgTZhlbj5P9QYs=\nsigs.k8s.io/yaml v1.6.0/go.mod h1:796bPqUfzR/0jLAl6XjHl3Ck7MiyVv8dbTdyT3/pMf4=\nsoftware.sslmate.com/src/go-pkcs12 v0.4.0 h1:H2g08FrTvSFKUj+D309j1DPfk5APnIdAQAB8aEykJ5k=\nsoftware.sslmate.com/src/go-pkcs12 v0.4.0/go.mod h1:Qiz0EyvDRJjjxGyUQa2cCNZn/wMyzrRJ/qcDXOQazLI=\n"
  },
  {
    "path": "endpoints/kgc/curve/curve.go",
    "content": "// This package provides the interface and custom implementation of elliptic curve operations.\n// It defines interfaces and structures to perform standard elliptic curve cryptographic operations\n// such as point addition, scalar multiplication, and checking whether a point lies on the curve.\n// we can create own custom curve or wrap official curve to follow the interface of this package.\n\npackage curve\n\nimport (\n\t\"crypto/elliptic\"\n\t\"math/big\"\n\n\t\"github.com/emmansun/gmsm/sm2\"\n)\n\ntype CurveParams struct {\n\tP       *big.Int // the order of the underlying field\n\tN       *big.Int // the order of the base point\n\tA       *big.Int // the constant of the curve equation\n\tB       *big.Int // the constant of the curve equation\n\tGx, Gy  *big.Int // (x,y) of the base point\n\tBitSize int      // the size of the underlying field\n\tName    string   // the canonical name of the curve\n}\n\ntype Curve interface {\n\tParams() *CurveParams\n\tIsOnCurve(x, y *big.Int) bool\n\tAdd(x1, y1, x2, y2 *big.Int) (x, y *big.Int)\n\tScalarMult(x1, y1 *big.Int, k []byte) (x, y *big.Int)\n\tScalarBaseMult(k []byte) (x, y *big.Int)\n}\n\ntype CustomStandardCurve struct {\n\t*CurveParams\n}\n\nfunc (c *CustomStandardCurve) Params() *CurveParams {\n\treturn c.CurveParams\n}\n\nfunc (c *CustomStandardCurve) IsOnCurve(x, y *big.Int) bool {\n\tif x.Sign() == 0 && y.Sign() == 0 {\n\t\treturn true // infinite point\n\t}\n\n\t// calculate y² mod p\n\tySquare := new(big.Int).Exp(y, big.NewInt(2), c.P)\n\n\t// calculate x³ + ax + b mod p\n\tx3 := new(big.Int).Exp(x, big.NewInt(3), c.P)\n\tax := new(big.Int).Mul(c.A, x)\n\tax.Mod(ax, c.P)\n\n\trhs := new(big.Int).Add(x3, ax)\n\trhs.Add(rhs, c.B)\n\trhs.Mod(rhs, c.P)\n\n\treturn ySquare.Cmp(rhs) == 0\n}\n\nfunc (c *CustomStandardCurve) Add(x1, y1, x2, y2 *big.Int) (x, y *big.Int) {\n\tif x1.Sign() == 0 && y1.Sign() == 0 {\n\t\treturn x2, y2\n\t}\n\n\tif x2.Sign() == 0 && y2.Sign() == 0 {\n\t\treturn x1, y1\n\t}\n\n\t// handle inverse point (P + (-P) = infinity point)\n\tif x1.Cmp(x2) == 0 && y1.Cmp(new(big.Int).Sub(c.P, y2)) == 0 {\n\t\treturn new(big.Int), new(big.Int)\n\t}\n\n\tvar lambda *big.Int\n\n\t// point doubling (P == Q)\n\tif x1.Cmp(x2) == 0 && y1.Cmp(y2) == 0 {\n\t\t// λ = (3x² + a) / (2y) mod p\n\t\tnum := new(big.Int).Mul(big.NewInt(3), new(big.Int).Exp(x1, big.NewInt(2), nil))\n\t\tnum.Add(num, c.A)\n\t\tnum.Mod(num, c.P)\n\n\t\tden := new(big.Int).Mul(big.NewInt(2), y1)\n\t\tden.Mod(den, c.P)\n\n\t\t// calculate modular inverse\n\t\tdenInv := new(big.Int).ModInverse(den, c.P)\n\t\tlambda = new(big.Int).Mul(num, denInv)\n\t\tlambda.Mod(lambda, c.P)\n\t} else {\n\t\t// normal addition (P ≠ Q)\n\t\t// λ = (y₂ - y₁) / (x₂ - x₁) mod p\n\t\tnum := new(big.Int).Sub(y2, y1)\n\t\tnum.Mod(num, c.P)\n\n\t\tden := new(big.Int).Sub(x2, x1)\n\t\tden.Mod(den, c.P)\n\n\t\tdenInv := new(big.Int).ModInverse(den, c.P)\n\t\tlambda = new(big.Int).Mul(num, denInv)\n\t\tlambda.Mod(lambda, c.P)\n\t}\n\n\t// calculate x₃ = λ² - x₁ - x₂ mod p\n\tx3 := new(big.Int).Exp(lambda, big.NewInt(2), nil)\n\tx3.Sub(x3, x1)\n\tx3.Sub(x3, x2)\n\tx3.Mod(x3, c.P)\n\n\t// calculate y₃ = λ(x₁ - x₃) - y₁ mod p\n\ty3 := new(big.Int).Sub(x1, x3)\n\ty3.Mul(y3, lambda)\n\ty3.Sub(y3, y1)\n\ty3.Mod(y3, c.P)\n\n\treturn x3, y3\n}\n\nfunc (c *CustomStandardCurve) ScalarMult(x1, y1 *big.Int, k []byte) (x, y *big.Int) {\n\tx = new(big.Int)\n\ty = new(big.Int)\n\n\tkCopy := new(big.Int).SetBytes(k)\n\n\t// binary expansion (Montgomery ladder algorithm)\n\tfor kCopy.Sign() > 0 {\n\t\tif kCopy.Bit(0) == 1 {\n\t\t\tx, y = c.Add(x, y, x1, y1)\n\t\t}\n\n\t\tx1, y1 = c.Add(x1, y1, x1, y1) // point doubling\n\t\tkCopy.Rsh(kCopy, 1)            // right shift by one bit\n\t}\n\n\treturn x, y\n}\n\nfunc (c *CustomStandardCurve) ScalarBaseMult(k []byte) (x, y *big.Int) {\n\treturn c.ScalarMult(c.Gx, c.Gy, k)\n}\n\nfunc NewCustomSM2Curve() *CustomStandardCurve {\n\tp, _ := new(big.Int).SetString(\"FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFF\", 16)\n\ta, _ := new(big.Int).SetString(\"FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFC\", 16)\n\tb, _ := new(big.Int).SetString(\"28E9FA9E9D9F5E344D5A9E4BCF6509A7F39789F515AB8F92DDBCBD414D940E93\", 16)\n\tn, _ := new(big.Int).SetString(\"FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFF7203DF6B21C6052B53BBF40939D54123\", 16)\n\n\tgx, _ := new(big.Int).SetString(\"32C4AE2C1F1981195F9904466A39C9948FE30BBFF2660BE1715A4589334C74C7\", 16)\n\tgy, _ := new(big.Int).SetString(\"BC3736A2F4F6779C59BDCEE36B692153D0A9877CC62A474002DF32E52139F0A0\", 16)\n\n\treturn &CustomStandardCurve{\n\t\t&CurveParams{\n\t\t\tP:       p,\n\t\t\tN:       n,\n\t\t\tA:       a,\n\t\t\tB:       b,\n\t\t\tGx:      gx,\n\t\t\tGy:      gy,\n\t\t\tBitSize: 256,\n\t\t\tName:    \"Custom SM2\",\n\t\t},\n\t}\n}\n\nfunc NewCustomSecp256k1Curve() *CustomStandardCurve {\n\tp, _ := new(big.Int).SetString(\"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F\", 16)\n\ta, _ := new(big.Int).SetString(\"000000000000000000000000000000000000000000000000000000000000\", 16)\n\tb, _ := new(big.Int).SetString(\"000000000000000000000000000000000000000000000000000000000007\", 16)\n\tn, _ := new(big.Int).SetString(\"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141\", 16)\n\n\tgx, _ := new(big.Int).SetString(\"79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798\", 16)\n\tgy, _ := new(big.Int).SetString(\"483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8\", 16)\n\n\treturn &CustomStandardCurve{\n\t\t&CurveParams{\n\t\t\tP:       p,\n\t\t\tN:       n,\n\t\t\tA:       a,\n\t\t\tB:       b,\n\t\t\tGx:      gx,\n\t\t\tGy:      gy,\n\t\t\tBitSize: 256,\n\t\t\tName:    \"Custom Secp256k1\",\n\t\t},\n\t}\n}\n\ntype OfficialSM2Curve struct {\n\tcurve elliptic.Curve\n}\n\nfunc (c *OfficialSM2Curve) Params() *CurveParams {\n\tA := new(big.Int).Mod(big.NewInt(-3), c.curve.Params().P)\n\n\treturn &CurveParams{\n\t\tP:       c.curve.Params().P,\n\t\tN:       c.curve.Params().N,\n\t\tA:       A,\n\t\tB:       c.curve.Params().B,\n\t\tGx:      c.curve.Params().Gx,\n\t\tGy:      c.curve.Params().Gy,\n\t\tBitSize: c.curve.Params().BitSize,\n\t\tName:    c.curve.Params().Name,\n\t}\n}\n\nfunc (c *OfficialSM2Curve) IsOnCurve(x, y *big.Int) bool {\n\treturn c.curve.IsOnCurve(x, y)\n}\n\nfunc (c *OfficialSM2Curve) Add(x1, y1, x2, y2 *big.Int) (x, y *big.Int) {\n\treturn c.curve.Add(x1, y1, x2, y2)\n}\n\nfunc (c *OfficialSM2Curve) ScalarMult(x1, y1 *big.Int, k []byte) (x, y *big.Int) {\n\treturn c.curve.ScalarMult(x1, y1, k)\n}\n\nfunc (c *OfficialSM2Curve) ScalarBaseMult(k []byte) (x, y *big.Int) {\n\treturn c.curve.ScalarBaseMult(k)\n}\n\nfunc NewOfficialSM2Curve() *OfficialSM2Curve {\n\treturn &OfficialSM2Curve{\n\t\tcurve: sm2.P256(),\n\t}\n}\n"
  },
  {
    "path": "endpoints/kgc/kgc.go",
    "content": "package kgc\n\nimport (\n\t\"encoding/base64\"\n\t\"fmt\"\n\t\"hash\"\n\t\"math/big\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\n\t\"github.com/emmansun/gmsm/sm3\"\n\t\"github.com/pelletier/go-toml/v2\"\n\n\t\"github.com/OpenNHP/opennhp/endpoints/kgc/curve\"\n)\n\ntype Config struct {\n\tMasterPrivateKeyBase64 string `json:\"masterPrivateKeyBase64\"`\n\tMasterPublicKeyBase64  string `json:\"masterPublicKeyBase64\"`\n\tDefaultCipherScheme    int    `json:\"defaultCipherScheme\"`\n}\n\ntype MasterKey struct {\n\tMs    *big.Int // Master private key in KGC, KGC SHOULD keep its safety\n\tPpubX *big.Int // X coordinate of master public key in KGC\n\tPpubY *big.Int // Y coordinate of master public key in KGC\n}\n\nfunc (m MasterKey) String() string {\n\treturn fmt.Sprintf(\"MasterKey{Ms: %x, PpubX: %x, PpubY: %x}\", m.Ms.Bytes(), m.PpubX.Bytes(), m.PpubY.Bytes())\n}\n\ntype KGCUserPartialKey struct {\n\tId string\n\tT  *big.Int // User partial private key which is generated by KGC\n\tWx *big.Int // X coordinate of User declared public key\n\tWy *big.Int // Y coordinate of User declared public key\n}\n\ntype KGC interface {\n\tParams() *curve.CurveParams\n\tGenerateMasterKey() error\n\tGenerateUserPartialKey(userId string, userPartialPubX *big.Int, userPartialPubY *big.Int) (*KGCUserPartialKey, error)\n}\n\ntype KGCImpl struct {\n\tcurve.Curve\n\th         hash.Hash\n\tmasterKey *MasterKey\n}\n\nfunc (k *KGCImpl) Params() *curve.CurveParams {\n\treturn k.Params()\n}\n\n// GenerateMasterKey generates a new master key pair (private and public) for the KGC (Key Generation Center).\n// It creates a random master secret (Ms), derives the public key (Ppub) from it using elliptic curve multiplication,\n// and updates both keys in the system's config file (config.toml) as base64-encoded strings.\n// Returns an error if any step fails (random number generation, file operations, etc.).\nfunc (k *KGCImpl) GenerateMasterKey() error {\n\tms, err := GenerateRandomNumber(k.Params().N)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tmasterKey := MasterKey{\n\t\tMs: ms,\n\t}\n\n\tmasterKey.PpubX, masterKey.PpubY = k.ScalarBaseMult(masterKey.Ms.Bytes())\n\n\tk.masterKey = &masterKey\n\n\tupdateValueWithKey := func(content, key, value string) string {\n\t\tlines := strings.Split(content, \"\\n\")\n\t\tfor i, line := range lines {\n\t\t\tif strings.HasPrefix(line, key) {\n\t\t\t\tlines[i] = fmt.Sprintf(\"%s = \\\"%s\\\"\", key, value)\n\t\t\t}\n\t\t}\n\n\t\treturn strings.Join(lines, \"\\n\")\n\t}\n\n\t// Also update it to the config file\n\tdirPath, err := GetExeDirPath()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tconfigFilePath := filepath.Join(dirPath, \"etc\", \"config.toml\")\n\tcontent, err := os.ReadFile(configFilePath)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tcontent = []byte(updateValueWithKey(string(content), \"MasterPrivateKeyBase64\", base64.StdEncoding.EncodeToString(ms.Bytes())))\n\tpubKeyBytes := masterKey.PpubX.Bytes()\n\tpubKeyBytes = append(pubKeyBytes, masterKey.PpubY.Bytes()...)\n\tcontent = []byte(updateValueWithKey(string(content), \"MasterPublicKeyBase64\", base64.StdEncoding.EncodeToString(pubKeyBytes)))\n\n\terr = os.WriteFile(configFilePath, content, 0600)\n\tif err != nil {\n\t\treturn err\n\t}\n\t// Ensure restrictive permissions even if file already existed\n\t// (WriteFile only sets permissions on new files, not existing ones)\n\tif err := os.Chmod(configFilePath, 0600); err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\n// GenerateKGCUserPartialKey generates a partial key for the specified user using elliptic curve cryptography.\n// It takes the user ID and their partial public key coordinates (x,y) as input, and returns a KGCUserPartialKey\n// containing the generated components (T, Wx, Wy) or an error if key generation fails.\n// The function combines system parameters, master key, and user information to compute the partial key.\nfunc (k *KGCImpl) GenerateKGCUserPartialKey(userId string, userPartialPubX *big.Int, userPartialPubY *big.Int) (*KGCUserPartialKey, error) {\n\tinfo := []byte{}\n\tlenUserId := len(userId)\n\tinfo = append(info, byte(lenUserId>>8))\n\tinfo = append(info, byte(lenUserId))\n\tinfo = append(info, []byte(userId)...)\n\tinfo = append(info, k.Params().A.Bytes()...)\n\tinfo = append(info, k.Params().B.Bytes()...)\n\tinfo = append(info, k.Params().Gx.Bytes()...)\n\tinfo = append(info, k.Params().Gy.Bytes()...)\n\tinfo = append(info, k.masterKey.PpubX.Bytes()...)\n\tinfo = append(info, k.masterKey.PpubY.Bytes()...)\n\n\tk.h.Write(info)\n\tinfoHash := k.h.Sum(nil)\n\tk.h.Reset()\n\n\tw, err := GenerateRandomNumber(k.Params().N)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\twx, wy := k.ScalarBaseMult(w.Bytes())\n\n\tdeclaredUserPubX, declaredUserPubY := k.Add(wx, wy, userPartialPubX, userPartialPubY)\n\n\tlamdaInfo := []byte{}\n\tlamdaInfo = append(lamdaInfo, declaredUserPubX.Bytes()...)\n\tlamdaInfo = append(lamdaInfo, declaredUserPubY.Bytes()...)\n\tlamdaInfo = append(lamdaInfo, infoHash...)\n\n\tk.h.Write(lamdaInfo)\n\tlamdaHash := k.h.Sum(nil)\n\tk.h.Reset()\n\tlamda := new(big.Int).SetBytes(lamdaHash)\n\tlamda.Mod(lamda, k.Params().N)\n\n\tt := new(big.Int).Add(w, new(big.Int).Mul(lamda, k.masterKey.Ms))\n\tt.Mod(t, k.Params().N)\n\n\treturn &KGCUserPartialKey{\n\t\tId: userId,\n\t\tT:  t,\n\t\tWx: declaredUserPubX,\n\t\tWy: declaredUserPubY,\n\t}, nil\n}\n\nfunc (k *KGCImpl) GetHash() hash.Hash {\n\treturn k.h\n}\n\nfunc (k *KGCImpl) GetMasterKey() *MasterKey {\n\treturn k.masterKey\n}\n\ntype KGCEllipticCurveMode uint8\n\nconst (\n\tSM2 KGCEllipticCurveMode = iota\n\tUNKNOWN\n)\n\nfunc (k KGCEllipticCurveMode) String() string {\n\tswitch k {\n\tcase SM2:\n\t\treturn \"SM2\"\n\tdefault:\n\t\treturn \"UNKNOWN\"\n\t}\n}\n\nfunc (k KGCEllipticCurveMode) NewKGCImpl() *KGCImpl {\n\tswitch k {\n\tcase SM2:\n\t\tcurve := curve.NewOfficialSM2Curve()\n\t\t// curve := curve.NewCustomSM2Curve()\n\n\t\tkgcImpl := &KGCImpl{\n\t\t\tCurve: curve,\n\t\t}\n\n\t\tkgcImpl.h = sm3.New()\n\n\t\treturn kgcImpl\n\tdefault:\n\t\treturn nil\n\t}\n}\n\n// NewKGCImplFromConfig creates a new KGCImpl instance by loading and parsing the configuration file.\n// It reads the config.toml file from the etc directory relative to the executable's path,\n// decodes the base64-encoded master keys, and initializes the KGC implementation.\n// Returns an error if the config file is missing, invalid, or if the master keys are not set.\nfunc NewKGCImplFromConfig() (*KGCImpl, error) {\n\tdirPath, err := GetExeDirPath()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tconfigFilePath := filepath.Join(dirPath, \"etc\", \"config.toml\")\n\tcontent, err := os.ReadFile(configFilePath)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar config Config\n\tif err := toml.Unmarshal(content, &config); err != nil {\n\t\treturn nil, err\n\t}\n\n\tif config.MasterPrivateKeyBase64 == \"\" || config.MasterPublicKeyBase64 == \"\" {\n\t\treturn nil, fmt.Errorf(\"master key is not set, please execuute setup command first\")\n\t}\n\n\tmasterPrivateKey, err := base64.StdEncoding.DecodeString(config.MasterPrivateKeyBase64)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tmasterPublicKey, err := base64.StdEncoding.DecodeString(config.MasterPublicKeyBase64)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tif config.DefaultCipherScheme == 0 {\n\t\tk := SM2.NewKGCImpl()\n\t\tk.masterKey = &MasterKey{\n\t\t\tMs:    new(big.Int).SetBytes(masterPrivateKey),\n\t\t\tPpubX: new(big.Int).SetBytes(masterPublicKey[0:32]),\n\t\t\tPpubY: new(big.Int).SetBytes(masterPublicKey[32:]),\n\t\t}\n\t\treturn k, nil\n\t} else {\n\t\treturn nil, fmt.Errorf(\"not support default cipher scheme %d\", config.DefaultCipherScheme)\n\t}\n}\n"
  },
  {
    "path": "endpoints/kgc/kgc_test.go",
    "content": "package kgc\n\nimport (\n\t\"os\"\n\t\"testing\"\n)\n\n// TestConfigFilePermissions verifies that config files are written with secure permissions.\n// The KGC master key config is written with 0600 permissions to prevent unauthorized access.\nfunc TestConfigFilePermissions(t *testing.T) {\n\t// Create a temporary file with 0600 permissions (same as used in GenerateMasterKey)\n\ttempFile, err := os.CreateTemp(\"\", \"kgc-perm-test-*.toml\")\n\tif err != nil {\n\t\tt.Fatalf(\"Failed to create temp file: %v\", err)\n\t}\n\tdefer os.Remove(tempFile.Name())\n\ttempFile.Close()\n\n\t// Write with the same permissions used in GenerateMasterKey\n\ttestContent := []byte(\"test = \\\"value\\\"\")\n\tif err := os.WriteFile(tempFile.Name(), testContent, 0600); err != nil {\n\t\tt.Fatalf(\"Failed to write file: %v\", err)\n\t}\n\n\t// Verify permissions\n\tinfo, err := os.Stat(tempFile.Name())\n\tif err != nil {\n\t\tt.Fatalf(\"Failed to stat file: %v\", err)\n\t}\n\n\tperm := info.Mode().Perm()\n\tif perm != 0600 {\n\t\tt.Errorf(\"Expected file permissions 0600, got %04o\", perm)\n\t}\n\n\t// Verify group and other have no access\n\tif perm&0077 != 0 {\n\t\tt.Errorf(\"File should not be accessible by group or others, got %04o\", perm)\n\t}\n}\n"
  },
  {
    "path": "endpoints/kgc/main/etc/config.toml",
    "content": "# KGC base config\n\n# MasterPrivateKeyBase64: base64 encoded master private key of KGC\n# MasterPublicKeyBase64: base64 encoded master public key of KGC\n# DefaultCipherScheme: 0: curve25519, 1: gmsm.\n# MIGRATION: Values changed in v2.x. If upgrading: old 0(gmsm)->new 1, old 1(curve)->new 0.\nMasterPrivateKeyBase64 = \"4KnNzGFzeyhPlf6g/dbIa41jYnZHWM/8T45BwPtEuJQ=\"\nMasterPublicKeyBase64 = \"Vh1qLWYyduCXE0xvZOiFbusAtGTL0T30zejCr5FQQBpaw6SvNrnVID/S1Ud/Otr6JZrJFxRVrUdOXPJ3HnZf/Q==\"\nDefaultCipherScheme = 0\n"
  },
  {
    "path": "endpoints/kgc/main/main.go",
    "content": "package main\n\nimport (\n\t\"encoding/base64\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"os\"\n\n\t\"github.com/OpenNHP/opennhp/endpoints/kgc\"\n\t\"github.com/OpenNHP/opennhp/endpoints/kgc/user\"\n\n\t\"github.com/OpenNHP/opennhp/nhp/version\"\n\n\t\"github.com/urfave/cli/v2\"\n)\n\nfunc main() {\n\tapp := cli.NewApp()\n\tapp.Name = \"kgc\"\n\tapp.Usage = \"kgc is used to distribute the key to the user\"\n\tapp.Version = version.Version\n\n\tmasterCmd := &cli.Command{\n\t\tName:  \"setup\",\n\t\tUsage: \"generate the system parameters and the master public and private key pair in kgc\",\n\t\tAction: func(c *cli.Context) error {\n\t\t\treturn setUp()\n\t\t},\n\t}\n\n\tuserCmd := &cli.Command{\n\t\tName:  \"keygen\",\n\t\tUsage: \"generate the user private key and declared user public key.\",\n\t\tFlags: []cli.Flag{\n\t\t\t&cli.StringFlag{Name: \"user-id\", Usage: \"specify the user identifier that can be email address, phone number or other unique identifier\", Required: true},\n\t\t\t&cli.BoolFlag{Name: \"json\", Value: false, DisableDefaultText: true, Usage: \"output in JSON format\"},\n\t\t},\n\t\tBefore: func(c *cli.Context) error {\n\t\t\tif len(c.String(\"user-id\")) > 64 {\n\t\t\t\treturn fmt.Errorf(\"userId is too long, should be not longer than 64\")\n\t\t\t}\n\t\t\treturn nil\n\t\t},\n\t\tAction: func(c *cli.Context) error {\n\t\t\tuserId := c.String(\"user-id\")\n\t\t\treturn GenerateUserFullKey(userId, c.Bool(\"json\"))\n\t\t},\n\t}\n\n\tsignCmd := &cli.Command{\n\t\tName:  \"sign\",\n\t\tUsage: \"sign the message with the user's private key\",\n\t\tFlags: []cli.Flag{\n\t\t\t&cli.StringFlag{Name: \"private-key\", Usage: \"specify private key with base64 format\", Required: true},\n\t\t\t&cli.StringFlag{Name: \"message\", Usage: \"specify the message to be signed\", Required: true},\n\t\t\t&cli.BoolFlag{Name: \"json\", Value: false, DisableDefaultText: true, Usage: \"output in JSON format\"},\n\t\t},\n\t\tAction: func(c *cli.Context) error {\n\t\t\tprivateKey := c.String(\"private-key\")\n\t\t\tmessage := c.String(\"message\")\n\t\t\treturn Sign(privateKey, message, c.Bool(\"json\"))\n\t\t},\n\t}\n\n\tverifyCmd := &cli.Command{\n\t\tName:  \"verify\",\n\t\tUsage: \"verify the signature with the user's declared public key\",\n\t\tFlags: []cli.Flag{\n\t\t\t&cli.StringFlag{Name: \"declared-public-key\", Usage: \"specify the declared public key with base64 format\", Required: true},\n\t\t\t&cli.StringFlag{Name: \"user-id\", Usage: \"specify the user identifier that can be email address, phone number or other unique identifier\", Required: true},\n\t\t\t&cli.StringFlag{Name: \"message\", Usage: \"specify the message to be signed\", Required: true},\n\t\t\t&cli.StringFlag{Name: \"signature\", Usage: \"specify the signature with base64 format\", Required: true},\n\t\t\t&cli.BoolFlag{Name: \"json\", Value: false, DisableDefaultText: true, Usage: \"output in JSON format\"},\n\t\t},\n\t\tAction: func(c *cli.Context) error {\n\t\t\tdeclaredPbkBase64 := c.String(\"declared-public-key\")\n\t\t\tuserId := c.String(\"user-id\")\n\t\t\tmessage := c.String(\"message\")\n\t\t\tsignatureBase64 := c.String(\"signature\")\n\t\t\treturn Verify(declaredPbkBase64, userId, message, signatureBase64, c.Bool(\"json\"))\n\t\t},\n\t}\n\n\tapp.Commands = []*cli.Command{masterCmd, userCmd, signCmd, verifyCmd}\n\n\tif err := app.Run(os.Args); err != nil {\n\t\tpanic(err)\n\t}\n}\n\nfunc setUp() error {\n\tk := kgc.SM2.NewKGCImpl()\n\treturn k.GenerateMasterKey()\n}\n\n// GenerateUserFullKey generates a complete key pair for a user based on the provided userId.\n// It initializes a KGC instance from the configuration and creates a new user with parameters derived from the KGC.\n// Then it proceeds to generate the user's partial key, KGC-assisted partial key, and finally the full key.\n// The function validates the generated full key and prints the private and public keys in Base64 format.\nfunc GenerateUserFullKey(userId string, outputJson bool) error {\n\tk, err := kgc.NewKGCImplFromConfig()\n\tif err != nil {\n\t\tif outputJson {\n\t\t\tjson.NewEncoder(os.Stdout).Encode(map[string]interface{}{\n\t\t\t\t\"error\": err.Error(),\n\t\t\t})\n\t\t\treturn nil\n\t\t}\n\t\treturn err\n\t}\n\n\tuser := user.NewUser(k.Curve, k.GetHash(), k.GetMasterKey())\n\n\tuserPartialKey, err := user.GenerateUserPartialKey()\n\tif err != nil {\n\t\tif outputJson {\n\t\t\tjson.NewEncoder(os.Stdout).Encode(map[string]interface{}{\n\t\t\t\t\"error\": err.Error(),\n\t\t\t})\n\t\t\treturn nil\n\t\t}\n\t\treturn err\n\t}\n\n\tkgcUserPartialKey, err := k.GenerateKGCUserPartialKey(userId, userPartialKey.PubX, userPartialKey.PubY)\n\tif err != nil {\n\t\tif outputJson {\n\t\t\tjson.NewEncoder(os.Stdout).Encode(map[string]interface{}{\n\t\t\t\t\"error\": err.Error(),\n\t\t\t})\n\t\t\treturn nil\n\t\t}\n\t\treturn err\n\t}\n\n\tuserFullKey, err := user.GenerateUserFullKey(kgcUserPartialKey, userPartialKey)\n\tif err != nil {\n\t\tif outputJson {\n\t\t\tjson.NewEncoder(os.Stdout).Encode(map[string]interface{}{\n\t\t\t\t\"error\": err.Error(),\n\t\t\t})\n\t\t\treturn nil\n\t\t}\n\t\treturn err\n\t}\n\n\tdeclaredUserPubBytes := userFullKey.PubX.Bytes()\n\tdeclaredUserPubBytes = append(declaredUserPubBytes, userFullKey.PubY.Bytes()...)\n\n\tif err := user.VerifyFullKey(userFullKey, userId); err != nil {\n\t\tif outputJson {\n\t\t\tjson.NewEncoder(os.Stdout).Encode(map[string]interface{}{\n\t\t\t\t\"error\": err.Error(),\n\t\t\t})\n\t\t\treturn nil\n\t\t}\n\t\treturn err\n\t}\n\n\tpriv := base64.StdEncoding.EncodeToString(userFullKey.PrivateKey.Bytes())\n\tpub := base64.StdEncoding.EncodeToString(declaredUserPubBytes)\n\n\tif outputJson {\n\t\tjson.NewEncoder(os.Stdout).Encode(map[string]string{\n\t\t\t\"privateKey\":        priv,\n\t\t\t\"declaredPublicKey\": pub,\n\t\t})\n\t} else {\n\t\tfmt.Println(\"Private key: \", priv)\n\t\tfmt.Println(\"Declared Public key: \", pub)\n\t}\n\treturn nil\n}\n\nfunc Sign(privateKey string, message string, outputJson bool) error {\n\tk, err := kgc.NewKGCImplFromConfig()\n\tif err != nil {\n\t\tif outputJson {\n\t\t\tjson.NewEncoder(os.Stdout).Encode(map[string]interface{}{\n\t\t\t\t\"error\": err.Error(),\n\t\t\t})\n\t\t\treturn nil\n\t\t}\n\t\treturn err\n\t}\n\n\tuser := user.NewUser(k.Curve, k.GetHash(), k.GetMasterKey())\n\n\tr, s, err := user.Sign(privateKey, message)\n\tif err != nil {\n\t\tif outputJson {\n\t\t\tjson.NewEncoder(os.Stdout).Encode(map[string]interface{}{\n\t\t\t\t\"error\": err.Error(),\n\t\t\t})\n\t\t\treturn nil\n\t\t}\n\t\treturn err\n\t}\n\n\tsig := base64.StdEncoding.EncodeToString(append(r.Bytes(), s.Bytes()...))\n\n\tif outputJson {\n\t\tjson.NewEncoder(os.Stdout).Encode(map[string]string{\n\t\t\t\"signature\": sig,\n\t\t})\n\t} else {\n\t\tfmt.Println(\"base64 encoded signature: \", sig)\n\t}\n\n\treturn nil\n}\n\nfunc Verify(declaredPbkBase64, userId, message, signatureBase64 string, outputJson bool) error {\n\tk, err := kgc.NewKGCImplFromConfig()\n\tif err != nil {\n\t\tif outputJson {\n\t\t\tjson.NewEncoder(os.Stdout).Encode(map[string]interface{}{\n\t\t\t\t\"error\": err.Error(),\n\t\t\t})\n\t\t\treturn nil\n\t\t}\n\t\treturn err\n\t}\n\n\tuser := user.NewUser(k.Curve, k.GetHash(), k.GetMasterKey())\n\n\tvalid := user.Verify(declaredPbkBase64, userId, message, signatureBase64)\n\n\tif outputJson {\n\t\tjson.NewEncoder(os.Stdout).Encode(map[string]bool{\n\t\t\t\"valid\": valid,\n\t\t})\n\t} else {\n\t\tif valid {\n\t\t\tfmt.Println(\"Signature is valid\")\n\t\t} else {\n\t\t\tfmt.Println(\"Signature is invalid\")\n\t\t}\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "endpoints/kgc/user/user.go",
    "content": "package user\n\nimport (\n\t\"encoding/base64\"\n\t\"fmt\"\n\t\"hash\"\n\t\"math/big\"\n\n\t\"github.com/OpenNHP/opennhp/endpoints/kgc\"\n\t\"github.com/OpenNHP/opennhp/endpoints/kgc/curve\"\n)\n\ntype UserPartialKey struct {\n\tPrivateKey *big.Int\n\tPubX       *big.Int\n\tPubY       *big.Int\n}\n\ntype UserFullKey struct {\n\tPrivateKey *big.Int\n\tPubX       *big.Int\n\tPubY       *big.Int\n}\n\nfunc (u UserFullKey) String() string {\n\treturn fmt.Sprintf(\"UserFullKey{PrivateKey: %x, PubX: %x, PubY: %x}\", u.PrivateKey.Bytes(), u.PubX.Bytes(), u.PubY.Bytes())\n}\n\nfunc NewUserFullKeyWithPrivateKey(prkBase64 string) (*UserFullKey, error) {\n\tprk, err := base64.StdEncoding.DecodeString(prkBase64)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tuserFullKey := &UserFullKey{\n\t\tPrivateKey: new(big.Int).SetBytes(prk),\n\t}\n\n\treturn userFullKey, nil\n}\n\ntype User interface {\n\tParams() *curve.Curve\n\tGenerateUserPartialKey() (*UserPartialKey, error)\n\tGenerateUserFullKey(kgcUserPartialKey *kgc.KGCUserPartialKey) (*UserFullKey, error)\n\tVerifyFullKey() error\n}\n\ntype UserImpl struct {\n\tcurve.Curve\n\th         hash.Hash\n\tmasterKey *kgc.MasterKey\n}\n\nfunc NewUser(params curve.Curve, hash hash.Hash, masterKey *kgc.MasterKey) *UserImpl {\n\treturn &UserImpl{\n\t\tCurve:     params,\n\t\th:         hash,\n\t\tmasterKey: masterKey,\n\t}\n}\n\nfunc (u *UserImpl) Params() *curve.CurveParams {\n\treturn u.Curve.Params()\n}\n\nfunc (u *UserImpl) GenerateUserPartialKey() (*UserPartialKey, error) {\n\tpartialPrivateKey, err := kgc.GenerateRandomNumber(u.Params().N)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tpartialPubX, partialPubY := u.Curve.ScalarBaseMult(partialPrivateKey.Bytes())\n\n\treturn &UserPartialKey{\n\t\tPrivateKey: partialPrivateKey,\n\t\tPubX:       partialPubX,\n\t\tPubY:       partialPubY,\n\t}, nil\n}\n\nfunc (u *UserImpl) GenerateUserFullKey(kgcUserPartialKey *kgc.KGCUserPartialKey, userPartialKey *UserPartialKey) (*UserFullKey, error) {\n\tfullPrivateKey := new(big.Int).Add(kgcUserPartialKey.T, userPartialKey.PrivateKey)\n\tfullPrivateKey.Mod(fullPrivateKey, u.Params().N)\n\tif fullPrivateKey.Cmp(big.NewInt(0)) == 0 {\n\t\treturn nil, fmt.Errorf(\"full key generation failed, please regenerate user partial key\")\n\t}\n\n\treturn &UserFullKey{\n\t\tPrivateKey: fullPrivateKey,\n\t\tPubX:       kgcUserPartialKey.Wx,\n\t\tPubY:       kgcUserPartialKey.Wy,\n\t}, nil\n}\n\n// CalculateFullPublicKey computes the full public key by combining a declared public key with a master public key.\n// It takes a base64-encoded declared public key and user ID as input, and returns the derived public key coordinates (X,Y).\n// The calculation involves hashing user-specific information and applying elliptic curve operations.\n// Returns error if the input public key is invalid.\nfunc (u *UserImpl) CalculateFullPublicKey(declaredPbkBase64, userId string) (*big.Int, *big.Int, error) {\n\tbyteLen := u.Curve.Params().BitSize / 8\n\tdeclaredPbk, err := base64.StdEncoding.DecodeString(declaredPbkBase64)\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\n\tdeclaredPbkX := new(big.Int).SetBytes(declaredPbk[:byteLen])\n\tdeclaredPbkY := new(big.Int).SetBytes(declaredPbk[byteLen:])\n\n\tinfo := []byte{}\n\tlenUserId := len(userId)\n\tinfo = append(info, byte(lenUserId>>8))\n\tinfo = append(info, byte(lenUserId))\n\tinfo = append(info, []byte(userId)...)\n\tinfo = append(info, u.Params().A.Bytes()...)\n\tinfo = append(info, u.Params().B.Bytes()...)\n\tinfo = append(info, u.Params().Gx.Bytes()...)\n\tinfo = append(info, u.Params().Gy.Bytes()...)\n\tinfo = append(info, u.masterKey.PpubX.Bytes()...)\n\tinfo = append(info, u.masterKey.PpubY.Bytes()...)\n\n\tu.h.Write(info)\n\tinfoHash := u.h.Sum(nil)\n\tu.h.Reset()\n\n\tlamdaInfo := []byte{}\n\tlamdaInfo = append(lamdaInfo, declaredPbkX.Bytes()...)\n\tlamdaInfo = append(lamdaInfo, declaredPbkY.Bytes()...)\n\tlamdaInfo = append(lamdaInfo, infoHash...)\n\n\tu.h.Write(lamdaInfo)\n\tlamdaHash := u.h.Sum(nil)\n\tu.h.Reset()\n\tlamda := new(big.Int).SetBytes(lamdaHash)\n\tlamda.Mod(lamda, u.Params().N)\n\n\tscaleMasterPubX, scaleMasterPubY := u.Curve.ScalarMult(u.masterKey.PpubX, u.masterKey.PpubY, lamda.Bytes())\n\n\tuserPubX, userPubY := u.Curve.Add(\n\t\tdeclaredPbkX, declaredPbkY,\n\t\tscaleMasterPubX, scaleMasterPubY,\n\t)\n\n\treturn userPubX, userPubY, nil\n}\n\n// VerifyFullKey verifies the user's full key by checking if the derived public key matches\n// the public key generated from the private key. It combines user information with system\n// parameters to compute a hash, then uses this hash to scale the master public key.\n// The scaled key is added to declared public key and compared against the public key\n// generated from the full key's private key. Returns an error if verification fails.\nfunc (u *UserImpl) VerifyFullKey(fullKey *UserFullKey, userId string) error {\n\tdeclaredUserPubBytes := fullKey.PubX.Bytes()\n\tdeclaredUserPubBytes = append(declaredUserPubBytes, fullKey.PubY.Bytes()...)\n\n\tdeclaredPbkBase64 := base64.StdEncoding.EncodeToString(declaredUserPubBytes)\n\n\tuserPubX, userPubY, err := u.CalculateFullPublicKey(declaredPbkBase64, userId)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tuserPubXFromPrk, userPubYFromPrk := u.Curve.ScalarBaseMult(fullKey.PrivateKey.Bytes())\n\n\tif userPubX.Cmp(userPubXFromPrk) != 0 || userPubY.Cmp(userPubYFromPrk) != 0 {\n\t\treturn fmt.Errorf(\"full key verification failed\")\n\t}\n\n\treturn nil\n}\n\n// Sign generates an ECDSA signature for the given message using the user's private key.\n// It returns the signature components (r, s) and any error encountered during signing.\n// The signature is computed using the standard ECDSA algorithm:\n// 1. Hashes the message\n// 2. Generates a random nonce k\n// 3. Computes r = (k*G).x mod N\n// 4. Computes s = k⁻¹·(e + r·dA) mod N\n// where e is the message hash, dA is the private key, and N is the curve order.\nfunc (u *UserImpl) Sign(prkBase64 string, message string) (r, s *big.Int, err error) {\n\tu.h.Write([]byte(message))\n\tmsgHash := u.h.Sum(nil)\n\tu.h.Reset()\n\n\tk, err := kgc.GenerateRandomNumber(u.Params().N)\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\n\t// k*G\n\tkGx, _ := u.Curve.ScalarBaseMult(k.Bytes())\n\n\t// r = kGx mod N\n\tr = new(big.Int).Mod(kGx, u.Params().N)\n\tif r.Sign() == 0 {\n\t\treturn nil, nil, fmt.Errorf(\"invalid r value\")\n\t}\n\n\t// k⁻¹\n\tkInv := new(big.Int).ModInverse(k, u.Params().N)\n\n\tprk, err := base64.StdEncoding.DecodeString(prkBase64)\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\n\t// s = k⁻¹·(e + r·dA) mod n\n\trda := new(big.Int).Mul(r, new(big.Int).SetBytes(prk))\n\tePlusRda := new(big.Int).Add(rda, new(big.Int).SetBytes(msgHash))\n\ts = new(big.Int).Mod(new(big.Int).Mul(ePlusRda, kInv), u.Params().N)\n\n\tif s.Sign() == 0 {\n\t\treturn nil, nil, fmt.Errorf(\"invalid s value\")\n\t}\n\n\treturn r, s, nil\n}\n\n// Verify checks the validity of an ECDSA signature (r, s) for the given message using the user's public key.\n// It returns true if the signature is valid, false otherwise, and any error encountered during verification.\n// The verification is performed using the standard ECDSA algorithm:\n// 1. Hashes the message to get e (same hash function as used in signing)\n// 2. Checks that r and s are in the range [1, N-1] where N is the curve order\n// 3. Computes w = s⁻¹ mod N\n// 4. Computes u1 = e·w mod N and u2 = r·w mod N\n// 5. Computes (x1, y1) = u1*G + u2*Q where Q is the public key point\n// 6. Verifies that r ≡ x1 mod N\n// If any step fails, the signature is considered invalid.\nfunc (u *UserImpl) Verify(declaredPbkBase64, userId, message, sigBase64 string) bool {\n\tn := u.Params().N\n\n\tsig, err := base64.StdEncoding.DecodeString(sigBase64)\n\tif err != nil {\n\t\treturn false\n\t}\n\n\tr := new(big.Int).SetBytes(sig[:len(sig)/2])\n\ts := new(big.Int).SetBytes(sig[len(sig)/2:])\n\n\tif r.Sign() <= 0 || r.Cmp(n) >= 0 {\n\t\treturn false\n\t}\n\tif s.Sign() <= 0 || s.Cmp(n) >= 0 {\n\t\treturn false\n\t}\n\n\tu.h.Write([]byte(message))\n\tmsgHash := u.h.Sum(nil)\n\tu.h.Reset()\n\n\t// w = s⁻¹ mod n\n\tw := new(big.Int).ModInverse(s, n)\n\n\t// u1 = e·w mod n\n\tu1 := new(big.Int).Mul(new(big.Int).SetBytes(msgHash), w)\n\tu1.Mod(u1, n)\n\n\t// u2 = r·w mod n\n\tu2 := new(big.Int).Mul(r, w)\n\tu2.Mod(u2, n)\n\n\tuserPubX, userPubY, err := u.CalculateFullPublicKey(declaredPbkBase64, userId)\n\tif err != nil {\n\t\treturn false\n\t}\n\n\t// (x, y) = u1·G + u2·P\n\tx1, y1 := u.Curve.ScalarBaseMult(u1.Bytes())\n\tx2, y2 := u.Curve.ScalarMult(userPubX, userPubY, u2.Bytes())\n\tx, _ := u.Curve.Add(x1, y1, x2, y2)\n\n\t// r' = x1 mod n\n\trPrime := new(big.Int).Mod(x, n)\n\n\treturn r.Cmp(rPrime) == 0\n}\n"
  },
  {
    "path": "endpoints/kgc/utils.go",
    "content": "package kgc\n\nimport (\n\t\"crypto/rand\"\n\t\"fmt\"\n\t\"math/big\"\n\t\"os\"\n\t\"path/filepath\"\n)\n\nfunc GenerateRandomNumber(N *big.Int) (*big.Int, error) {\n\tr, err := rand.Int(rand.Reader, N)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tif r.Cmp(big.NewInt(0)) == 0 {\n\t\treturn nil, fmt.Errorf(\"random number is zero\")\n\t}\n\n\treturn r, nil\n}\n\nfunc GetExeDirPath() (string, error) {\n\texeFilePath, err := os.Executable()\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\treturn filepath.Dir(exeFilePath), nil\n}\n"
  },
  {
    "path": "endpoints/relay/tcprelay.go",
    "content": "package relay\n"
  },
  {
    "path": "endpoints/server/config.go",
    "content": "package server\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\n\t\"github.com/OpenNHP/opennhp/nhp/etcd\"\n\n\t\"github.com/OpenNHP/opennhp/nhp/common\"\n\t\"github.com/OpenNHP/opennhp/nhp/core\"\n\t\"github.com/OpenNHP/opennhp/nhp/core/verifier\"\n\t\"github.com/OpenNHP/opennhp/nhp/log\"\n\t\"github.com/OpenNHP/opennhp/nhp/plugins\"\n\t\"github.com/OpenNHP/opennhp/nhp/utils\"\n\n\ttoml \"github.com/pelletier/go-toml/v2\"\n)\n\nvar (\n\tbaseConfigWatch  io.Closer\n\thttpConfigWatch  io.Closer\n\tacConfigWatch    io.Closer\n\tagentConfigWatch io.Closer\n\tresConfigWatch   io.Closer\n\tsrcipConfigWatch io.Closer\n\tdbConfigWatch    io.Closer\n\tteeWatch         io.Closer\n\terrLoadConfig    = fmt.Errorf(\"config load error\")\n)\n\ntype ServerEtcdConfig struct {\n\tBaseConfig    Config\n\tHttpConfig    HttpConfig\n\tACs           []*core.UdpPeer\n\tAgents        []*core.UdpPeer\n\tDBs           []*core.UdpPeer\n\tAuthServiceId []*common.AuthServiceProviderData\n\tSrcIps        []*SrcIpMap\n}\n\ntype SrcIpMap struct {\n\tSrcIp string\n\tIp    []string\n}\n\ntype Config struct {\n\tPrivateKeyBase64       string       `json:\"privateKey\"`\n\tHostname               string       `json:\"hostname\"`\n\tListenIp               string       `json:\"listenIp\"`\n\tListenPort             int          `json:\"listenPort\"`\n\tLogLevel               int          `json:\"logLevel\"`\n\tDefaultCipherScheme    int          `json:\"defaultCipherScheme\"`\n\tDisableAgentValidation bool         `json:\"disableAgentValidation\"`\n\tWebRTC                 WebRTCConfig `toml:\"webrtc\"`\n}\n\ntype RemoteConfig struct {\n\tProvider  string\n\tKey       string\n\tEndpoints []string\n\tUsername  string\n\tPassword  string\n}\n\ntype HttpConfig struct {\n\tEnableHttp     bool\n\tEnableTLS      bool\n\tHttpListenIp   string\n\tHttpListenPort int\n\tTLSCertFile    string\n\tTLSKeyFile     string\n\tReadTimeoutMs  int\n\tWriteTimeoutMs int\n\tIdleTimeoutMs  int\n}\n\ntype Peers struct {\n\tACs    []*core.UdpPeer\n\tAgents []*core.UdpPeer\n\tDBs    []*core.UdpPeer\n}\n\nfunc (s *UdpServer) loadBaseConfig() error {\n\t// config.toml\n\tfileName := filepath.Join(ExeDirPath, \"etc\", \"config.toml\")\n\tcontent, err := s.loadConfigFile(fileName)\n\tif err != nil {\n\t\tlog.Error(\"load base config err: %v\", err)\n\t\treturn err\n\t}\n\tvar config Config\n\tif err := toml.Unmarshal(content, &config); err != nil {\n\t\tlog.Error(\"failed to unmarshal base config: %v\", err)\n\t}\n\tif err = s.updateBaseConfig(config); err != nil {\n\t\t// report base config error\n\t\treturn err\n\t}\n\n\tbaseConfigWatch = utils.WatchFile(fileName, func() {\n\t\tlog.Info(\"base config: %s has been updated\", fileName)\n\t\tif content, err = s.loadConfigFile(fileName); err == nil {\n\t\t\tif err = toml.Unmarshal(content, &config); err == nil {\n\t\t\t\t_ = s.updateBaseConfig(config)\n\t\t\t}\n\n\t\t}\n\t})\n\treturn nil\n}\n\nfunc (s *UdpServer) loadHttpConfig() error {\n\t// http.toml\n\tfileName := filepath.Join(ExeDirPath, \"etc\", \"http.toml\")\n\tcontent, err := s.loadConfigFile(fileName)\n\tif err != nil {\n\t\tlog.Error(\"load http config err: %v\", err)\n\t\treturn err\n\t}\n\tvar httpConf HttpConfig\n\tif err := toml.Unmarshal(content, &httpConf); err != nil {\n\t\tlog.Error(\"failed to unmarshal http config: %v\", err)\n\t}\n\tif err = s.updateHttpConfig(httpConf); err != nil {\n\t\t// ignore error\n\t\t_ = err\n\t}\n\n\thttpConfigWatch = utils.WatchFile(fileName, func() {\n\t\tlog.Info(\"http config: %s has been updated\", fileName)\n\t\tif content, err = s.loadConfigFile(fileName); err == nil {\n\t\t\tif err = toml.Unmarshal(content, &httpConf); err == nil {\n\t\t\t\t_ = s.updateHttpConfig(httpConf)\n\t\t\t}\n\t\t}\n\n\t})\n\treturn nil\n}\n\nfunc (s *UdpServer) loadPeers() error {\n\t// ac.toml\n\tfileNameAC := filepath.Join(ExeDirPath, \"etc\", \"ac.toml\")\n\n\tcontentAC, err := s.loadConfigFile(fileNameAC)\n\tif err != nil {\n\t\tlog.Error(\"load ac peer config err: %v\", err)\n\t\treturn err\n\t}\n\tvar acPeers Peers\n\tif err := toml.Unmarshal(contentAC, &acPeers); err != nil {\n\t\tlog.Error(\"failed to unmarshal ac peers config: %v\", err)\n\t}\n\n\tif err := s.updateACPeers(acPeers.ACs); err != nil {\n\t\t// ignore error\n\t\t_ = err\n\t}\n\n\tacConfigWatch = utils.WatchFile(fileNameAC, func() {\n\t\tlog.Info(\"ac peer config: %s has been updated\", fileNameAC)\n\t\tif contentAC, err = s.loadConfigFile(fileNameAC); err == nil {\n\t\t\tif err = toml.Unmarshal(contentAC, &acPeers); err == nil {\n\t\t\t\t_ = s.updateACPeers(acPeers.ACs)\n\t\t\t}\n\t\t}\n\t})\n\n\t// agent.toml\n\tfileNameAgent := filepath.Join(ExeDirPath, \"etc\", \"agent.toml\")\n\tcontentAgent, err := s.loadConfigFile(fileNameAgent)\n\tif err != nil {\n\t\tlog.Error(\"load agent peer config err: %v\", err)\n\t\treturn err\n\t}\n\tvar agentPeers Peers\n\tif err := toml.Unmarshal(contentAgent, &agentPeers); err != nil {\n\t\tlog.Error(\"failed to unmarshal agent peers config: %v\", err)\n\t}\n\tif err := s.updateAgentPeers(agentPeers.Agents); err != nil {\n\t\t// ignore error\n\t\t_ = err\n\t}\n\n\tagentConfigWatch = utils.WatchFile(fileNameAgent, func() {\n\t\tlog.Info(\"agent peer config: %s has been updated\", fileNameAgent)\n\t\tif contentAgent, err = s.loadConfigFile(fileNameAgent); err == nil {\n\t\t\tif err = toml.Unmarshal(contentAgent, &agentPeers); err == nil {\n\t\t\t\t_ = s.updateAgentPeers(agentPeers.Agents)\n\t\t\t}\n\t\t}\n\t})\n\n\t//db.toml\n\tfileNameDE := filepath.Join(ExeDirPath, \"etc\", \"db.toml\")\n\tcontentDE, err := s.loadConfigFile(fileNameDE)\n\tif err != nil {\n\t\tlog.Error(\"load db peer config err: %v\", err)\n\t\treturn err\n\t}\n\tvar dePeers Peers\n\tif err := toml.Unmarshal(contentDE, &dePeers); err != nil {\n\t\tlog.Error(\"failed to unmarshal db peers config: %v\", err)\n\t}\n\tif err := s.updateDePeers(dePeers.DBs); err != nil {\n\t\t// ignore error\n\t\t_ = err\n\t}\n\tdbConfigWatch = utils.WatchFile(fileNameDE, func() {\n\t\tlog.Info(\"device peer config: %s has been updated\", fileNameDE)\n\t\tif contentDE, err = s.loadConfigFile(fileNameDE); err == nil {\n\t\t\tif err = toml.Unmarshal(contentDE, &dePeers); err == nil {\n\t\t\t\t_ = s.updateDePeers(dePeers.DBs)\n\t\t\t}\n\t\t}\n\t})\n\n\t// tee.toml\n\tfileNameTee := filepath.Join(ExeDirPath, \"etc\", \"tee.toml\")\n\tif err := s.updateTee(fileNameTee); err != nil {\n\t\t// ignore error\n\t\t_ = err\n\t}\n\tteeWatch = utils.WatchFile(fileNameTee, func() {\n\t\tlog.Info(\"tee: %s has been updated\", fileNameTee)\n\t\t_ = s.updateTee(fileNameTee)\n\t})\n\n\treturn nil\n}\n\nfunc (s *UdpServer) loadResources() error {\n\t// resource.toml\n\tfileName := filepath.Join(ExeDirPath, \"etc\", \"resource.toml\")\n\tcontent, err := os.ReadFile(fileName)\n\tif err != nil {\n\t\tlog.Error(\"failed to read resource config: %v\", err)\n\t}\n\taspMap := make(common.AuthSvcProviderMap)\n\t// update\n\tif err := toml.Unmarshal(content, &aspMap); err != nil {\n\t\tlog.Error(\"failed to unmarshal resource config: %v\", err)\n\t}\n\tif err := s.updateResources(aspMap); err != nil {\n\t\t// ignore error\n\t\t_ = err\n\t}\n\n\tresConfigWatch = utils.WatchFile(fileName, func() {\n\t\tlog.Info(\"resource config: %s has been updated\", fileName)\n\t\tif content, err = s.loadConfigFile(fileName); err == nil {\n\t\t\taspMap := make(common.AuthSvcProviderMap)\n\t\t\tif err = toml.Unmarshal(content, &aspMap); err == nil {\n\t\t\t\t_ = s.updateResources(aspMap)\n\t\t\t}\n\t\t}\n\t})\n\treturn nil\n}\n\nfunc (s *UdpServer) loadSourceIps() error {\n\t// srcip.toml\n\tfileName := filepath.Join(ExeDirPath, \"etc\", \"srcip.toml\")\n\tcontent, err := os.ReadFile(fileName)\n\tif err != nil {\n\t\tlog.Error(\"failed to read src ip config: %v\", err)\n\t}\n\n\t// update\n\tsrcIpMap := make(map[string][]*common.NetAddress)\n\tif err := toml.Unmarshal(content, &srcIpMap); err != nil {\n\t\tlog.Error(\"failed to unmarshal src ip config: %v\", err)\n\t}\n\tif err := s.updateSourceIps(srcIpMap); err != nil {\n\t\t// ignore error\n\t\t_ = err\n\t}\n\n\tsrcipConfigWatch = utils.WatchFile(fileName, func() {\n\t\tlog.Info(\"src ip config: %s has been updated\", fileName)\n\t\tif content, err = s.loadConfigFile(fileName); err == nil {\n\t\t\tif err = toml.Unmarshal(content, &srcIpMap); err == nil {\n\t\t\t\t_ = s.updateSourceIps(srcIpMap)\n\t\t\t}\n\t\t}\n\t})\n\treturn nil\n}\n\nfunc (s *UdpServer) initRemoteConn() error {\n\t// remote.toml\n\tfileName := filepath.Join(ExeDirPath, \"etc\", \"remote.toml\")\n\n\t_, e := os.Stat(fileName)\n\tif os.IsNotExist(e) {\n\t\t//remote.toml file not found,use local config\n\t\treturn nil\n\t}\n\n\tcontent, err := os.ReadFile(fileName)\n\tif err != nil {\n\t\tlog.Error(\"failed to read remote config: %v\", err)\n\t\treturn err\n\t}\n\n\tvar conf RemoteConfig\n\tif err = toml.Unmarshal(content, &conf); err != nil {\n\t\tlog.Error(\"failed to unmarshal remote config: %v\", err)\n\t\treturn err\n\t}\n\n\tif strings.EqualFold(conf.Provider, \"etcd\") {\n\t\tif len(conf.Endpoints) == 0 {\n\t\t\tlog.Error(\"remote config has no endpoints,open nhp server will startup with local configuration\")\n\t\t\treturn nil\n\t\t}\n\n\t\tif len(conf.Key) == 0 {\n\t\t\tlog.Error(\"remote config has no key,open nhp server will startup with local configuration\")\n\t\t\treturn nil\n\t\t}\n\n\t\ts.etcdConn = &etcd.EtcdConn{\n\t\t\tEndpoints: conf.Endpoints,\n\t\t\tUsername:  conf.Username,\n\t\t\tPassword:  conf.Password,\n\t\t\tKey:       conf.Key,\n\t\t}\n\n\t\terr = s.etcdConn.InitClient()\n\t\treturn err\n\t} else {\n\t\treturn errors.New(\"unknown remote provider\")\n\t}\n\n}\n\nfunc (s *UdpServer) loadRemoteBaseConfig() error {\n\tvar serverEtcdConfig ServerEtcdConfig\n\tvalue, err := s.etcdConn.GetValue()\n\tif err != nil {\n\t\treturn err\n\t}\n\tif err = toml.Unmarshal(value, &serverEtcdConfig); err != nil {\n\t\tlog.Error(\"failed to unmarshal remote config: %v\", err)\n\t\treturn err\n\t}\n\n\terr = s.updateBaseConfig(serverEtcdConfig.BaseConfig)\n\treturn err\n}\n\nfunc (s *UdpServer) loadRemoteConfig() error {\n\tvalue, err := s.etcdConn.GetValue()\n\tif err != nil {\n\t\treturn err\n\t}\n\t//base config has been loaded and no secondary loading is required\n\tif err = s.updateEtcdConfig(value, false); err != nil {\n\t\treturn err\n\t}\n\n\tgo s.etcdConn.WatchValue(func(val []byte) {\n\t\ts.remoteConfigUpdateMutex.Lock()\n\t\tdefer s.remoteConfigUpdateMutex.Unlock()\n\t\t_ = s.updateEtcdConfig(val, true)\n\t})\n\n\treturn nil\n}\n\nfunc (s *UdpServer) updateEtcdConfig(content []byte, baseLoad bool) (err error) {\n\tutils.CatchPanicThenRun(func() {\n\t\terr = errLoadConfig\n\t})\n\n\tvar serverEtcdConfig ServerEtcdConfig\n\tif err = toml.Unmarshal(content, &serverEtcdConfig); err != nil {\n\t\tlog.Error(\"failed to unmarshal remote config: %v\", err)\n\t\treturn err\n\t}\n\tif baseLoad {\n\t\t_ = s.updateBaseConfig(serverEtcdConfig.BaseConfig)\n\t}\n\t_ = s.updateHttpConfig(serverEtcdConfig.HttpConfig)\n\t_ = s.updateACPeers(serverEtcdConfig.ACs)\n\t_ = s.updateAgentPeers(serverEtcdConfig.Agents)\n\t_ = s.updateDePeers(serverEtcdConfig.DBs)\n\n\taspMap := make(common.AuthSvcProviderMap)\n\tfor _, aspData := range serverEtcdConfig.AuthServiceId {\n\t\taspId := aspData.AuthSvcId\n\t\taspMap[aspId] = aspData\n\t}\n\t_ = s.updateResources(aspMap)\n\n\tsrcIpMap := make(map[string][]*common.NetAddress)\n\tfor _, srcIp := range serverEtcdConfig.SrcIps {\n\t\tips := make([]*common.NetAddress, 0)\n\t\tfor _, ip := range srcIp.Ip {\n\t\t\taddr := &common.NetAddress{\n\t\t\t\tIp: ip,\n\t\t\t}\n\t\t\tips = append(ips, addr)\n\t\t}\n\t\tsrcIpMap[srcIp.SrcIp] = ips\n\t}\n\t_ = s.updateSourceIps(srcIpMap)\n\n\treturn err\n}\n\nfunc (s *UdpServer) loadConfigFile(file string) (content []byte, err error) {\n\tutils.CatchPanicThenRun(func() {\n\t\terr = errLoadConfig\n\t})\n\tcontent, err = os.ReadFile(file)\n\tif err != nil {\n\t\tlog.Error(\"failed to read base config: %v\", err)\n\t}\n\treturn\n}\n\nfunc (s *UdpServer) updateBaseConfig(conf Config) (err error) {\n\tif s.config == nil {\n\t\ts.config = &conf\n\t\ts.log.SetLogLevel(conf.LogLevel)\n\t\tif conf.WebRTC.Enable {\n\t\t\ts.webrtcServer = NewWebRTCServer(s, &conf.WebRTC)\n\t\t\tif err := s.webrtcServer.Start(); err != nil {\n\t\t\t\tlog.Error(\"failed to start WebRTC server: %v\", err)\n\t\t\t}\n\t\t}\n\t\treturn err\n\t}\n\n\t// update\n\tif s.config.LogLevel != conf.LogLevel {\n\t\tlog.Info(\"set base log level to %d\", conf.LogLevel)\n\t\ts.log.SetLogLevel(conf.LogLevel)\n\t\ts.config.LogLevel = conf.LogLevel\n\t}\n\n\tif s.config.DisableAgentValidation != conf.DisableAgentValidation {\n\t\tif s.device != nil {\n\t\t\ts.device.SetOption(core.DeviceOptions{\n\t\t\t\tDisableAgentPeerValidation: conf.DisableAgentValidation,\n\t\t\t})\n\t\t}\n\t\ts.config.DisableAgentValidation = conf.DisableAgentValidation\n\t}\n\n\tif s.config.DefaultCipherScheme != conf.DefaultCipherScheme {\n\t\tlog.Info(\"set default cipher scheme to %d\", conf.DefaultCipherScheme)\n\t\ts.config.DefaultCipherScheme = conf.DefaultCipherScheme\n\t}\n\n\t// handle WebRTC configuration change\n\tif conf.WebRTC.Enable && s.webrtcServer == nil {\n\t\ts.webrtcServer = NewWebRTCServer(s, &conf.WebRTC)\n\t\tif err := s.webrtcServer.Start(); err != nil {\n\t\t\tlog.Error(\"failed to start WebRTC server: %v\", err)\n\t\t}\n\t}\n\tif !conf.WebRTC.Enable && s.webrtcServer != nil {\n\t\ts.webrtcServer.Stop()\n\t\ts.webrtcServer = nil\n\t}\n\ts.config.WebRTC = conf.WebRTC\n\n\treturn err\n}\n\nfunc (s *UdpServer) updateHttpConfig(httpConf HttpConfig) (err error) {\n\tutils.CatchPanicThenRun(func() {\n\t\terr = errLoadConfig\n\t})\n\n\t// set http default timeout values\n\t// 4.5s for read timeout, 4s for write timeout, 5s for idle timeout\n\tif httpConf.ReadTimeoutMs == 0 {\n\t\thttpConf.ReadTimeoutMs = DefaultHttpRequestReadTimeoutMs\n\t}\n\tif httpConf.WriteTimeoutMs == 0 {\n\t\thttpConf.WriteTimeoutMs = DefaultHttpResponseWriteTimeoutMs\n\t}\n\tif httpConf.IdleTimeoutMs == 0 {\n\t\thttpConf.IdleTimeoutMs = DefaultHttpServerIdleTimeoutMs\n\t}\n\n\t// update\n\tif httpConf.EnableHttp {\n\t\t// start http server\n\t\tif s.httpServer == nil || !s.httpServer.IsRunning() {\n\t\t\tif s.httpServer != nil {\n\t\t\t\t// stop old http server\n\t\t\t\tgo s.httpServer.Stop()\n\t\t\t}\n\t\t\ths := &HttpServer{}\n\t\t\ts.httpServer = hs\n\t\t\terr = hs.Start(s, &httpConf)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// stop http server\n\t\tif s.httpServer != nil && s.httpServer.IsRunning() {\n\t\t\tgo s.httpServer.Stop()\n\t\t\ts.httpServer = nil\n\t\t}\n\t}\n\n\ts.httpConfig = &httpConf\n\treturn err\n}\n\nfunc (s *UdpServer) updateACPeers(peers []*core.UdpPeer) (err error) {\n\tutils.CatchPanicThenRun(func() {\n\t\terr = errLoadConfig\n\t})\n\n\tacPeerMap := make(map[string]*core.UdpPeer)\n\tfor _, p := range peers {\n\t\tp.Type = core.NHP_AC\n\t\ts.device.AddPeer(p)\n\t\tacPeerMap[p.PublicKeyBase64()] = p\n\t}\n\n\t// remove old peers from device\n\ts.acPeerMapMutex.Lock()\n\tdefer s.acPeerMapMutex.Unlock()\n\tfor pubKey := range s.acPeerMap {\n\t\tif _, found := acPeerMap[pubKey]; !found {\n\t\t\ts.device.RemovePeer(pubKey)\n\t\t}\n\t}\n\ts.acPeerMap = acPeerMap\n\n\treturn err\n}\n\nfunc (s *UdpServer) updateAgentPeers(peers []*core.UdpPeer) (err error) {\n\tutils.CatchPanicThenRun(func() {\n\t\terr = errLoadConfig\n\t})\n\tagentPeerMap := make(map[string]*core.UdpPeer)\n\tfor _, p := range peers {\n\t\tp.Type = core.NHP_AGENT\n\t\ts.device.AddPeer(p)\n\t\tagentPeerMap[p.PublicKeyBase64()] = p\n\t}\n\n\t// remove old peers from device\n\ts.agentPeerMapMutex.Lock()\n\tdefer s.agentPeerMapMutex.Unlock()\n\tfor pubKey := range s.agentPeerMap {\n\t\tif _, found := agentPeerMap[pubKey]; !found {\n\t\t\ts.device.RemovePeer(pubKey)\n\t\t}\n\t}\n\ts.agentPeerMap = agentPeerMap\n\n\treturn err\n}\n\nfunc (s *UdpServer) updateResources(aspMap common.AuthSvcProviderMap) (err error) {\n\tutils.CatchPanicThenRun(func() {\n\t\terr = errLoadConfig\n\t})\n\n\tfor aspId, aspData := range aspMap {\n\t\taspData.AuthSvcId = aspId\n\t\tif len(aspData.PluginPath) > 0 {\n\t\t\th := plugins.ReadPluginHandler(aspData.PluginPath)\n\t\t\tif h != nil {\n\t\t\t\t_ = s.LoadPlugin(aspId, h)\n\t\t\t}\n\t\t}\n\n\t\tfor resId, res := range aspData.ResourceGroups {\n\t\t\t// Note: res is a pointer, so we can update its value\n\t\t\tres.AuthServiceId = aspId\n\t\t\tres.ResourceId = resId\n\t\t}\n\t}\n\n\ts.authServiceMapMutex.Lock()\n\tdefer s.authServiceMapMutex.Unlock()\n\ts.authServiceMap = aspMap\n\n\treturn err\n}\n\nfunc (s *UdpServer) updateSourceIps(srcIpMap map[string][]*common.NetAddress) (err error) {\n\tutils.CatchPanicThenRun(func() {\n\t\terr = errLoadConfig\n\t})\n\n\ts.srcIpAssociatedAddrMapMutex.Lock()\n\tdefer s.srcIpAssociatedAddrMapMutex.Unlock()\n\ts.srcIpAssociatedAddrMap = srcIpMap\n\n\treturn err\n}\n\nfunc (s *UdpServer) StopConfigWatch() {\n\tif baseConfigWatch != nil {\n\t\tbaseConfigWatch.Close()\n\t}\n\tif httpConfigWatch != nil {\n\t\thttpConfigWatch.Close()\n\t}\n\tif acConfigWatch != nil {\n\t\tacConfigWatch.Close()\n\t}\n\tif agentConfigWatch != nil {\n\t\tagentConfigWatch.Close()\n\t}\n\tif resConfigWatch != nil {\n\t\tresConfigWatch.Close()\n\t}\n\tif srcipConfigWatch != nil {\n\t\tsrcipConfigWatch.Close()\n\t}\n\t//add dbConfigWatch\n\tif dbConfigWatch != nil {\n\t\tdbConfigWatch.Close()\n\t}\n\tif teeWatch != nil {\n\t\tteeWatch.Close()\n\t}\n}\n\n// updateDePeers\nfunc (s *UdpServer) updateDePeers(peers []*core.UdpPeer) (err error) {\n\tutils.CatchPanicThenRun(func() {\n\t\terr = errLoadConfig\n\t})\n\n\tdbPeerMap := make(map[string]*core.UdpPeer)\n\tfor _, p := range peers {\n\t\tp.Type = core.NHP_DB\n\t\ts.device.AddPeer(p)\n\t\tdbPeerMap[p.PublicKeyBase64()] = p\n\t}\n\n\t// remove old peers from device\n\ts.dbPeerMapMutex.Lock()\n\tdefer s.dbPeerMapMutex.Unlock()\n\tfor pubKey := range s.dbPeerMap {\n\t\tif _, found := dbPeerMap[pubKey]; !found {\n\t\t\ts.device.RemovePeer(pubKey)\n\t\t}\n\t}\n\ts.dbPeerMap = dbPeerMap\n\treturn err\n}\n\n// update tee\nfunc (s *UdpServer) updateTee(file string) (err error) {\n\tutils.CatchPanicThenRun(func() {\n\t\terr = errLoadConfig\n\t})\n\n\tcontent, err := os.ReadFile(file)\n\tif err != nil {\n\t\tlog.Error(\"failed to read tee config: %v\", err)\n\t}\n\n\tvar tees TeeAttestationReports\n\tteeMap := make(map[string]*TeeAttestationReport)\n\tif err := toml.Unmarshal(content, &tees); err != nil {\n\t\tlog.Error(\"failed to unmarshal device peer config: %v\", err)\n\t}\n\tfor _, tee := range tees.TEEs {\n\t\tteeMap[tee.Measure] = tee\n\t}\n\n\ts.teeMapMutex.Lock()\n\tdefer s.teeMapMutex.Unlock()\n\ts.teeMap = teeMap\n\treturn err\n}\n\nfunc (s *UdpServer) AppraiseEvidence(evidenceBase64 string) bool {\n\tvar measure string\n\tvar sn string\n\n\tattestationVerifier, err := verifier.NewVerifier(evidenceBase64)\n\tif err != nil {\n\t\tlog.Error(\"failed to create attestation verifier: %v\", err)\n\t\treturn false\n\t}\n\n\tif err := attestationVerifier.Verify(); err != nil {\n\t\tlog.Error(\"failed to verify attestation: %v\", err)\n\t\treturn false\n\t}\n\n\tmeasure = attestationVerifier.GetMeasure()\n\tsn = attestationVerifier.GetSerialNumber()\n\n\ts.teeMapMutex.Lock()\n\tdefer s.teeMapMutex.Unlock()\n\n\tif _, exist := s.teeMap[measure]; exist {\n\t\ts.teeMap[measure].Verified = true\n\t\treturn s.teeMap[measure].SerialNumber == sn\n\t}\n\n\treturn false\n}\n"
  },
  {
    "path": "endpoints/server/constants.go",
    "content": "package server\n\nimport \"github.com/OpenNHP/opennhp/nhp/common\"\n\nconst (\n\tMaxConcurrentConnection         = 20480\n\tOverloadConnectionThreshold     = MaxConcurrentConnection * 4 / 5      // 80%\n\tBlockAddrRefreshRate            = 20                                   // 20 seconds\n\tBlockAddrExpireTime             = 90                                   // 90 seconds\n\tPreCheckThreatCountBeforeBlock  = 5                                    // block source address if packet precheck errors exceeds this count\n\tDefaultAgentConnectionTimeoutMs = common.ClientSideConnectionTimeoutMs // 30 seconds to delete idle connection\n\tDefaultACConnectionTimeoutMs    = common.ServerSideConnectionTimeoutMs // 300 seconds to delete idle connection\n\tDefaultDBConnectionTimeoutMs    = common.ServerSideConnectionTimeoutMs // 300 seconds to delete idle connection\n\tPacketQueueSizePerConnection    = 256\n)\n\n// http APIs\nconst (\n\tDefaultHttpRequestReadTimeoutMs   = 4500 // millisecond\n\tDefaultHttpResponseWriteTimeoutMs = 5500 // millisecond\n\tDefaultHttpServerIdleTimeoutMs    = 6000 // millisecond\n)\n\n// knock\nconst (\n\tDefaultIpOpenTime         = 120 // second, align with ipset default timeout\n\tACOpenCompensationTime    = 5   // second\n\tTokenStoreRefreshInterval = common.TokenStoreRefreshInterval\n)\n"
  },
  {
    "path": "endpoints/server/httpauth.go",
    "content": "package server\n\nimport (\n\t\"net/http\"\n\n\t\"github.com/gin-gonic/gin\"\n\n\t\"github.com/OpenNHP/opennhp/nhp/common\"\n\t\"github.com/OpenNHP/opennhp/nhp/log\"\n)\n\n// doAuthWithPlugin is the common implementation for plugin-based authentication.\n// Both authWithAspPlugin and legacyAuthWithAspPlugin delegate to this function.\nfunc (hs *HttpServer) doAuthWithPlugin(c *gin.Context, req *common.HttpKnockRequest) {\n\thandler := hs.FindPluginHandler(req.AuthServiceId)\n\tif handler == nil {\n\t\tlog.Error(\"no auth handler provided for aspId: %s\", req.AuthServiceId)\n\t\tc.String(http.StatusOK, \"{\\\"errMsg\\\": \\\"no auth handler provided\\\"}\")\n\t\treturn\n\t}\n\n\thelper := hs.NewHttpServerHelper()\n\t_, err := handler.AuthWithHttp(c, req, helper)\n\tif err != nil {\n\t\tlog.Warning(\"auth error: %v\", err)\n\t\tif !c.Writer.Written() {\n\t\t\tc.String(http.StatusOK, \"{\\\"errMsg\\\": \\\"auth error: %v\\\"}\", err)\n\t\t}\n\t} else {\n\t\tlog.Info(\"auth completed successfully\")\n\t}\n}\n\n// authWithAspPlugin handles authentication using the ASP plugin system.\nfunc (hs *HttpServer) authWithAspPlugin(c *gin.Context, req *common.HttpKnockRequest) {\n\ths.doAuthWithPlugin(c, req)\n}\n\n// legacyAuthWithAspPlugin is the legacy authentication handler.\n// Kept for backward compatibility; delegates to the common implementation.\nfunc (hs *HttpServer) legacyAuthWithAspPlugin(c *gin.Context, req *common.HttpKnockRequest) {\n\ths.doAuthWithPlugin(c, req)\n}\n"
  },
  {
    "path": "endpoints/server/httpserver.go",
    "content": "package server\n\nimport (\n\t\"context\"\n\t\"html/template\"\n\t\"io/fs\"\n\t\"net\"\n\t\"net/http\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"sync\"\n\t\"sync/atomic\"\n\t\"time\"\n\n\t\"github.com/gin-contrib/sessions\"\n\t\"github.com/gin-contrib/sessions/cookie\"\n\t\"github.com/gin-gonic/gin\"\n\n\t\"github.com/OpenNHP/opennhp/nhp/common\"\n\t\"github.com/OpenNHP/opennhp/nhp/core\"\n\t\"github.com/OpenNHP/opennhp/nhp/log\"\n\t\"github.com/OpenNHP/opennhp/nhp/plugins\"\n\t\"github.com/OpenNHP/opennhp/nhp/version\"\n)\n\ntype HttpServer struct {\n\tid         string\n\tudpServer  *UdpServer\n\thttpServer *http.Server\n\tginEngine  *gin.Engine\n\tlistenAddr *net.TCPAddr\n\n\twg      sync.WaitGroup\n\trunning atomic.Bool\n\n\t// signals\n\tsignals struct {\n\t\tstop chan struct{}\n\t}\n}\n\n// Note HttpServer must be started after starting UdpServer, when log and config have been setup\nfunc (hs *HttpServer) Start(us *UdpServer, hc *HttpConfig) error {\n\ths.id = time.Now().Format(\"2006-01-02 15:04:05\")\n\tlog.Info(\"==================================================\")\n\tlog.Info(\"===  HttpServer (%s) started  ===\", hs.id)\n\tlog.Info(\"==================================================\")\n\n\ths.udpServer = us\n\n\tipStr := hc.HttpListenIp\n\tvar netIP net.IP\n\tif len(ipStr) > 0 {\n\t\tnetIP = net.ParseIP(ipStr)\n\t\tif netIP == nil {\n\t\t\tlog.Error(\"http listen ip address is incorrect! using udp listening ip\")\n\t\t\tnetIP = us.listenAddr.IP\n\t\t}\n\t} else {\n\t\tnetIP = net.IPv4zero // will both listen on ipv4 0.0.0.0:port and ipv6 [::]:port\n\t}\n\n\tlistenPort := us.listenAddr.Port // use the same port as udp server if HttpListenPort is not specified\n\tif hc.HttpListenPort > 0 && hc.HttpListenPort < 65536 {\n\t\tlistenPort = hc.HttpListenPort\n\t}\n\ths.listenAddr = &net.TCPAddr{\n\t\tIP:   netIP,\n\t\tPort: listenPort,\n\t}\n\n\ths.signals.stop = make(chan struct{})\n\n\tgin.SetMode(gin.ReleaseMode)\n\ths.ginEngine = gin.New()\n\tstore := cookie.NewStore([]byte(\"nhpstore\"))\n\ths.ginEngine.Use(sessions.Sessions(\"nhpsessions\", store))\n\ths.ginEngine.Use(corsMiddleware())\n\ths.ginEngine.Use(gin.LoggerWithWriter(us.log.Writer()))\n\ths.ginEngine.Use(gin.Recovery())\n\n\ths.initRouter()\n\n\ths.httpServer = &http.Server{\n\t\tAddr:         hs.listenAddr.String(),\n\t\tHandler:      hs.ginEngine,\n\t\tReadTimeout:  time.Duration(hc.ReadTimeoutMs) * time.Millisecond,\n\t\tWriteTimeout: time.Duration(hc.WriteTimeoutMs) * time.Millisecond,\n\t\tIdleTimeout:  time.Duration(hc.IdleTimeoutMs) * time.Millisecond,\n\t}\n\n\ths.wg.Add(1)\n\tif hc.EnableTLS {\n\t\tcertFilePath := filepath.Join(ExeDirPath, hc.TLSCertFile)\n\t\tkeyFilePath := filepath.Join(ExeDirPath, hc.TLSKeyFile)\n\t\t_, err1 := os.Stat(certFilePath)\n\t\t_, err2 := os.Stat(keyFilePath)\n\t\tif err1 == nil && err2 == nil {\n\t\t\tgo func() {\n\t\t\t\tdefer hs.wg.Done()\n\t\t\t\tlog.Info(\"Listening https on %s\", hs.listenAddr.String())\n\t\t\t\tvar err = hs.httpServer.ListenAndServeTLS(certFilePath, keyFilePath)\n\t\t\t\tif err != nil && err != http.ErrServerClosed {\n\t\t\t\t\tlog.Error(\"https server close error: %v\", err)\n\t\t\t\t\t//panic(err)\n\t\t\t\t}\n\t\t\t}()\n\n\t\t\treturn nil\n\t\t}\n\t}\n\n\tgo func() {\n\t\tdefer hs.wg.Done()\n\t\tlog.Info(\"Listening http on %s\", hs.listenAddr.String())\n\t\tvar err = hs.httpServer.ListenAndServe()\n\t\tif err != nil && err != http.ErrServerClosed {\n\t\t\tlog.Error(\"http server close error: %v\", err)\n\t\t\t//panic(err)\n\t\t}\n\t}()\n\n\ths.running.Store(true)\n\treturn nil\n}\n\n// Stop stops the HttpServer by setting the running flag to false,\n// closing the stop channel, shutting down the underlying http server,\n// waiting for all goroutines to finish, and logging a message indicating\n// that the HttpServer has been stopped.\nfunc (hs *HttpServer) Stop() {\n\tif !hs.running.Load() {\n\t\t// already stopped, do nothing\n\t\treturn\n\t}\n\n\ths.running.Store(false)\n\tclose(hs.signals.stop)\n\tctx, cancel := context.WithTimeout(context.Background(), 5500*time.Millisecond)\n\t_ = hs.httpServer.Shutdown(ctx)\n\n\ths.wg.Wait()\n\tcancel()\n\tcancel = nil\n\tlog.Info(\"==================================================\")\n\tlog.Info(\"===  HttpServer (%s) stopped  ===\", hs.id)\n\tlog.Info(\"==================================================\")\n}\n\nfunc (hs *HttpServer) IsRunning() bool {\n\treturn hs.running.Load()\n}\n\n// LoadFilesRecursively loads HTML and template files recursively from the specified directory and adds them to the given gin.Engine.\n// It walks through the directory and its subdirectories, and for each file with a .html or .tmpl extension, it reads the file content,\n// creates a new template with the file path as the template name, and parses the content into the template.\n// The loaded templates are set as the HTML templates for the gin.Engine.\n// The directory path should be a clean absolute path.\n// If any error occurs during the file loading or template parsing, the function returns the error.\nfunc LoadFilesRecursively(g *gin.Engine, dir string) {\n\t_, err := os.Stat(dir)\n\tif os.IsNotExist(err) {\n\t\t// dir does not exist\n\t\treturn\n\t}\n\n\tcleanRootDir := filepath.Clean(dir)\n\trootTmpl := template.New(\"\").Funcs(g.FuncMap)\n\tf := os.DirFS(cleanRootDir)\n\n\terr = fs.WalkDir(f, \".\", func(path string, info fs.DirEntry, walkErr error) error {\n\t\t// add *.html and *.tmpl files\n\t\tif !info.IsDir() && (strings.HasSuffix(path, \".html\") || strings.HasSuffix(path, \".tmpl\")) {\n\t\t\tif walkErr != nil {\n\t\t\t\treturn walkErr\n\t\t\t}\n\n\t\t\tabsPath := filepath.Join(cleanRootDir, path)\n\t\t\tcontent, err := os.ReadFile(absPath)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t\tt := rootTmpl.New(path) // template name is relative path separated by slash on all platforms\n\t\t\t_, err = t.Parse(string(content))\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tlog.Info(\"gin load file %s from %s\", path, cleanRootDir)\n\t\t\tg.SetHTMLTemplate(t)\n\t\t}\n\n\t\treturn nil\n\t})\n\n\tif err != nil {\n\t\tlog.Error(\"load files to web engine failed. %v\", err)\n\t\treturn\n\t}\n}\n\n// init gin engine. Must be called at initialization\nfunc (hs *HttpServer) initRouter() {\n\tg := hs.ginEngine\n\n\t// load templates. won't trigger panic if file does not exist\n\tstaticPath := filepath.Join(ExeDirPath, \"static\")\n\tLoadFilesRecursively(g, staticPath)\n\ttemplatePath := filepath.Join(ExeDirPath, \"templates\")\n\tLoadFilesRecursively(g, templatePath)\n\n\tpluginGrp := g.Group(\"plugins\")\n\t// display login page with templates\n\tpluginGrp.GET(\"/:aspid\", func(ctx *gin.Context) {\n\t\tvar err error\n\t\taspId := ctx.Param(\"aspid\")\n\t\tlog.Info(\"get plugins request. aspId: %s, query: %v\", aspId, ctx.Request.URL.RawQuery)\n\n\t\tif len(aspId) == 0 {\n\t\t\terr = common.ErrUrlPathInvalid\n\t\t\tlog.Error(\"path error: %v\", err)\n\t\t\tctx.String(http.StatusOK, \"{\\\"errMsg\\\": \\\"path error: %v\\\"}\", err)\n\t\t\treturn\n\t\t}\n\n\t\treq := &common.HttpKnockRequest{\n\t\t\tAuthServiceId: aspId,\n\t\t\tDeviceId:      ctx.Request.UserAgent(),\n\t\t\tSrcIp:         ctx.ClientIP(),\n\t\t\tUrl:           ctx.Request.URL,\n\t\t}\n\n\t\ths.authWithAspPlugin(ctx, req)\n\t})\n\n\t// legacy api\n\tpluginGrp.GET(\"/:aspid/:resid/valid\", func(ctx *gin.Context) {\n\t\t// parse url parameters\n\t\taspId := ctx.Param(\"aspid\")\n\t\tresId := ctx.Param(\"resid\")\n\t\tlog.Info(\"get plugins request. aspId: %s, resId: %s, query: %v\", aspId, resId, ctx.Request.URL.RawQuery)\n\n\t\tif len(aspId) == 0 {\n\t\t\tlog.Error(\"no aspId provided\")\n\t\t\tctx.String(http.StatusOK, \"{\\\"errMsg\\\": \\\"no aspId provided\\\"}\")\n\t\t\treturn\n\t\t}\n\n\t\tif len(resId) == 0 {\n\t\t\tlog.Error(\"no resId provided\")\n\t\t\tctx.String(http.StatusOK, \"{\\\"errMsg\\\": \\\"no resId provided\\\"}\")\n\t\t\treturn\n\t\t}\n\n\t\treq := &common.HttpKnockRequest{\n\t\t\tAuthServiceId: aspId,\n\t\t\tResourceId:    resId,\n\t\t\tDeviceId:      ctx.Request.UserAgent(),\n\t\t\tSrcIp:         ctx.ClientIP(),\n\t\t\tUrl:           ctx.Request.URL,\n\t\t}\n\t\ths.legacyAuthWithAspPlugin(ctx, req)\n\t})\n\n\ths.initStorageRouter()\n\n\ths.initKbsRouter()\n\n\t/*\n\t\trefreshGrp := g.Group(\"refresh\")\n\t\trefreshGrp.GET(\"/:token\", func(ctx *gin.Context) {\n\t\t\tvar err error\n\t\t\ttoken := ctx.Param(\"token\")\n\t\t\tlog.Info(\"get refresh request. aspId: %s, query: %v\", token, ctx.Request.URL.RawQuery)\n\n\t\t\tif len(token) == 0 {\n\t\t\t\terr = common.ErrUrlPathInvalid\n\t\t\t\tlog.Error(\"path error: %v\", err)\n\t\t\t\tctx.String(http.StatusOK, \"{\\\"errMsg\\\": \\\"path error: %v\\\"}\", err)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\treq := &common.HttpRefreshRequest{\n\t\t\t\tToken: token,\n\t\t\t\tSrcIp: ctx.Query(\"srcip\"),\n\t\t\t}\n\n\t\t\ths.handleRefreshResource()\n\t\t})\n\t*/\n\n}\n\n// corsMiddleware is a middleware function that adds CORS headers to the HTTP response.\n// It allows cross-origin resource sharing, specifies allowed methods, exposes headers, and sets maximum age.\n// If the request method is OPTIONS, PUT, or DELETE, it aborts the request with a 204 status code.\nfunc corsMiddleware() gin.HandlerFunc {\n\treturn func(c *gin.Context) {\n\t\t// HTTP headers for CORS\n\t\tc.Writer.Header().Set(\"Access-Control-Allow-Origin\", \"*\")                   // allow cross-origin resource sharing\n\t\tc.Writer.Header().Set(\"Access-Control-Allow-Methods\", \"GET, OPTIONS, POST\") // methods\n\t\tc.Writer.Header().Set(\"Access-Control-Expose-Headers\", \"Content-Type, Content-Length, Set-Cookie\")\n\t\tc.Writer.Header().Set(\"Access-Control-Allow-Headers\", \"Content-Type, Content-Length, Authorization, X-NHP-Ver, Cookie\")\n\t\tc.Writer.Header().Set(\"Access-Control-Allow-Credentials\", \"true\")\n\t\tc.Writer.Header().Set(\"Access-Control-Max-Age\", \"300\")\n\t\t// NHP headers\n\t\tc.Writer.Header().Set(\"Access-Control-NHP-Ver\", version.Version+\"/\"+version.CommitId)\n\n\t\tif c.Request.Method == \"OPTIONS\" {\n\t\t\tc.Status(http.StatusOK)\n\t\t\treturn\n\t\t}\n\n\t\tif c.Request.Method == \"DELETE\" || c.Request.Method == \"PUT\" {\n\t\t\tc.AbortWithStatus(http.StatusNoContent)\n\t\t\treturn\n\t\t}\n\n\t\tc.Next()\n\t}\n}\n\nfunc (hs *HttpServer) handleHttpOpenResource(req *common.HttpKnockRequest, res *common.ResourceData) (ack *common.ServerKnockAckMsg, err error) {\n\tdefer hs.wg.Done()\n\ths.wg.Add(1)\n\ts := hs.udpServer\n\tsrcIp := req.SrcIp\n\n\tknkMsg := &common.AgentKnockMsg{\n\t\tUserId:         req.UserId,\n\t\tDeviceId:       req.DeviceId,\n\t\tOrganizationId: req.OrganizationId,\n\t\tAuthServiceId:  req.AuthServiceId,\n\t\tResourceId:     res.ResourceId,\n\t}\n\n\tif req.Command == \"exit\" {\n\t\tknkMsg.HeaderType = core.NHP_EXT\n\t}\n\n\tackMsg := &common.ServerKnockAckMsg{\n\t\tAuthProviderToken: req.Token,\n\t\tAgentAddr:         srcIp,\n\t\tOpenTime:          res.OpenTime,\n\t}\n\n\tif len(res.Resources) == 0 {\n\t\terr = common.ErrResourceNotFound\n\t\tackMsg.ErrCode = common.ErrResourceNotFound.ErrorCode()\n\t\tackMsg.ErrMsg = err.Error()\n\t\treturn\n\t}\n\n\t// PART II: determine knock src ip address and resource dst ip addresses\n\tsrcAddr := &common.NetAddress{Ip: srcIp}\n\n\tacDstIpMap := make(map[string][]*common.NetAddress)\n\tfor resName, info := range res.Resources {\n\t\taddrs, exist := acDstIpMap[resName]\n\t\tif exist {\n\t\t\taddrs = append(addrs, info.Addr)\n\t\t\tacDstIpMap[resName] = addrs\n\t\t} else {\n\t\t\tacDstIpMap[resName] = []*common.NetAddress{info.Addr}\n\t\t}\n\t}\n\n\t// PART III: request ac operation for each resource and block for response\n\tvar acWg sync.WaitGroup\n\tvar artMsgsMutex sync.Mutex\n\tartMsgs := make(map[string]*common.ACOpsResultMsg)\n\tackMsg.ResourceHost = make(map[string]string)\n\tackMsg.ACTokens = make(map[string]string)\n\tackMsg.PreAccessActions = make(map[string]*common.PreAccessInfo)\n\n\tfor resName, addrs := range acDstIpMap {\n\t\tresInfo := res.Resources[resName]\n\t\tif resInfo == nil {\n\t\t\tcontinue\n\t\t}\n\t\tacId := resInfo.ACId\n\t\ts.acConnectionMapMutex.Lock()\n\t\tacConn, found := s.acConnectionMap[acId]\n\t\ts.acConnectionMapMutex.Unlock()\n\t\tif !found {\n\t\t\tlog.Warning(\"httpserver-agent(%s#%s@%s)-ac(@%s)[HandleHttpKnockRequest] no ac connection is available\", knkMsg.UserId, knkMsg.DeviceId, srcIp, acId)\n\t\t\tartMsg := &common.ACOpsResultMsg{}\n\t\t\terr = common.ErrACConnectionNotFound\n\t\t\tartMsg.ErrCode = common.ErrACConnectionNotFound.ErrorCode()\n\t\t\tartMsg.ErrMsg = err.Error()\n\t\t\tartMsgsMutex.Lock()\n\t\t\tartMsgs[resName] = artMsg\n\t\t\tartMsgsMutex.Unlock()\n\t\t\tcontinue\n\t\t}\n\n\t\tacWg.Add(1)\n\t\tgo func(name string, info *common.ResourceInfo, dstAddrs []*common.NetAddress) {\n\t\t\tdefer acWg.Done()\n\n\t\t\topenTime := res.OpenTime\n\t\t\tif knkMsg.HeaderType == core.NHP_EXT {\n\t\t\t\topenTime = 1 // timeout in 1 second\n\t\t\t}\n\t\t\tartMsg, err := s.processACOperation(knkMsg, acConn, srcAddr, dstAddrs, openTime)\n\t\t\tartMsgsMutex.Lock()\n\t\t\tartMsgs[name] = artMsg\n\t\t\tif err == nil {\n\t\t\t\tackMsg.ResourceHost[name] = info.DestHost()\n\t\t\t\tackMsg.ACTokens[name] = artMsg.ACToken\n\t\t\t\tackMsg.PreAccessActions[name] = artMsg.PreAccessAction\n\t\t\t}\n\t\t\tartMsgsMutex.Unlock()\n\t\t}(resName, resInfo, addrs)\n\t}\n\tacWg.Wait()\n\n\tvar successCount int\n\tfor _, artMsg := range artMsgs {\n\t\tif artMsg.ErrCode == common.ErrSuccess.ErrorCode() {\n\t\t\tsuccessCount++\n\t\t}\n\t}\n\n\tif successCount == 0 {\n\t\tlog.Info(\"httpserver-agent(%s#%s@%s)[handleHttpOpenResource] failed: %+v\", knkMsg.UserId, knkMsg.DeviceId, srcIp, artMsgs)\n\t\terr = common.ErrServerACOpsFailed\n\t\tackMsg.ErrCode = common.ErrServerACOpsFailed.ErrorCode()\n\t\tackMsg.ErrMsg = err.Error()\n\t\treturn\n\t}\n\n\tlog.Info(\"httpserver-agent(%s#%s@%s)[handleHttpOpenResource] succeed\", knkMsg.UserId, knkMsg.DeviceId, srcIp)\n\tackMsg.ErrCode = common.ErrSuccess.ErrorCode()\n\tackMsg.ErrMsg = common.ErrSuccess.Error()\n\n\treturn ackMsg, nil\n}\n\nfunc (hs *HttpServer) NewHttpServerHelper() *plugins.HttpServerPluginHelper {\n\th := &plugins.HttpServerPluginHelper{}\n\th.StopSignal = hs.signals.stop\n\n\th.AuthWithHttpCallbackFunc = func(req *common.HttpKnockRequest, res *common.ResourceData) (*common.ServerKnockAckMsg, error) {\n\t\treturn hs.handleHttpOpenResource(req, res)\n\t}\n\n\t// Session helper functions for plugins\n\th.SessionGet = func(ctx *gin.Context, key string) interface{} {\n\t\tsession := sessions.Default(ctx)\n\t\treturn session.Get(key)\n\t}\n\th.SessionSet = func(ctx *gin.Context, key string, val interface{}) {\n\t\tsession := sessions.Default(ctx)\n\t\tsession.Set(key, val)\n\t}\n\th.SessionSave = func(ctx *gin.Context) error {\n\t\tsession := sessions.Default(ctx)\n\t\treturn session.Save()\n\t}\n\th.SessionClear = func(ctx *gin.Context) {\n\t\tsession := sessions.Default(ctx)\n\t\tsession.Clear()\n\t}\n\n\treturn h\n}\n\n// FindPluginHandler returns the plugin handler for the given ASP ID\n// It delegates the task to the underlying UDP server's FindPluginHandler method.\nfunc (hs *HttpServer) FindPluginHandler(aspId string) plugins.PluginHandler {\n\treturn hs.udpServer.FindPluginHandler(aspId)\n}\n\nfunc (hs *HttpServer) handleRefreshResource(token string) (err error) {\n\t// to do\n\treturn nil\n}\n"
  },
  {
    "path": "endpoints/server/httpstorage.go",
    "content": "package server\n\nimport (\n\t\"crypto/md5\"\n\t\"encoding/hex\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io\"\n\t\"net/http\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"sync\"\n\n\t\"github.com/gin-gonic/gin\"\n\t\"github.com/google/uuid\"\n)\n\nconst (\n\tuploadDir     = \"etc/uploads\"           // storage directory\n\tmetadataDir   = \"etc/metadata\"          // metadata directory\n\tmaxUploadSize = 20 * 1024 * 1024 * 1024 // 20G max upload size\n\tmaxMemorySize = 10 * 1024 * 1024\n)\n\ntype FileMetadata struct {\n\tUUID      string `json:\"uuid\"`       // file UUID\n\tOriginal  string `json:\"original\"`   // original file name\n\tMD5       string `json:\"md5\"`        // file MD5\n\tPath      string `json:\"path\"`       // file storage path\n\tSize      int64  `json:\"size\"`       // file size\n\tUploadURI string `json:\"upload_uri\"` // file download URI\n}\n\n// upload progress\nvar progressMap = make(map[string]int64)\nvar progressMutex sync.Mutex\n\nfunc (hs *HttpServer) initStorageRouter() {\n\tg := hs.ginEngine.Group(\"/storage\")\n\n\tg.POST(\"/upload\", func(c *gin.Context) {\n\t\t// check file size\n\t\tc.Request.Body = http.MaxBytesReader(c.Writer, c.Request.Body, maxUploadSize)\n\t\tif err := c.Request.ParseMultipartForm(maxMemorySize); err != nil {\n\t\t\tc.JSON(http.StatusBadRequest, gin.H{\n\t\t\t\t\"error\":     \"file size exceeds max upload size\",\n\t\t\t\t\"detail\":    err.Error(),\n\t\t\t\t\"max limit\": maxUploadSize,\n\t\t\t\t\"file size\": c.Request.ContentLength,\n\t\t\t})\n\t\t\treturn\n\t\t}\n\n\t\t// get file from form\n\t\tfile, header, err := c.Request.FormFile(\"file\")\n\t\tif err != nil {\n\t\t\tc.JSON(http.StatusBadRequest, gin.H{\"error\": \"file not found\"})\n\t\t\treturn\n\t\t}\n\t\tdefer file.Close()\n\n\t\t// generate UUID and file path\n\t\tfileUUID := uuid.New().String()\n\t\tfileDir := filepath.Join(ExeDirPath, uploadDir, fileUUID)\n\t\tif err := os.MkdirAll(fileDir, os.ModePerm); err != nil {\n\t\t\tc.JSON(http.StatusInternalServerError, gin.H{\"error\": \"create storage directory failed\"})\n\t\t\treturn\n\t\t}\n\n\t\t// create target file\n\t\tfilename := header.Filename\n\t\tfilePath := filepath.Join(fileDir, filename)\n\t\tout, err := os.Create(filePath)\n\t\tif err != nil {\n\t\t\tc.JSON(http.StatusInternalServerError, gin.H{\"error\": \"create file failed\"})\n\t\t\treturn\n\t\t}\n\t\tdefer out.Close()\n\n\t\t// create md5 calculator and progress tracker\n\t\tmd5Hash := md5.New()\n\t\tprogressKey := fileUUID // use UUID as progress key\n\t\ttotalSize := header.Size\n\n\t\t// create multi-writer: write to file, calculate md5, and update progress\n\t\tmultiWriter := io.MultiWriter(out, md5Hash)\n\t\tprogressWriter := &ProgressWriter{\n\t\t\tWriter:   multiWriter,\n\t\t\tProgress: &progressMap,\n\t\t\tKey:      progressKey,\n\t\t\tMutex:    &progressMutex,\n\t\t\tTotal:    totalSize,\n\t\t}\n\n\t\t// copy file content\n\t\tif _, err := io.Copy(progressWriter, file); err != nil {\n\t\t\tc.JSON(http.StatusInternalServerError, gin.H{\"error\": \"file copy failed\"})\n\t\t\treturn\n\t\t}\n\n\t\t// calculate md5\n\t\tfileMD5 := hex.EncodeToString(md5Hash.Sum(nil))\n\n\t\t// check if file already exists\n\t\texistingMetadata, exists := checkFileExists(fileMD5)\n\t\tif exists {\n\t\t\t// delete duplicate file\n\t\t\tos.RemoveAll(fileDir)\n\n\t\t\tc.JSON(http.StatusOK, gin.H{\n\t\t\t\t\"message\":  \"file already exists, skip storage\",\n\t\t\t\t\"file_uri\": existingMetadata.UploadURI,\n\t\t\t\t\"uuid\":     existingMetadata.UUID,\n\t\t\t\t\"md5\":      existingMetadata.MD5,\n\t\t\t})\n\t\t\treturn\n\t\t}\n\n\t\t// create metadata\n\t\trelativePath := filepath.Join(fileUUID, filename)\n\t\tfileURI := fmt.Sprintf(\"storage/download/%s/%s\", fileUUID, filename)\n\t\tmetadata := FileMetadata{\n\t\t\tUUID:      fileUUID,\n\t\t\tOriginal:  filename,\n\t\t\tMD5:       fileMD5,\n\t\t\tPath:      relativePath,\n\t\t\tSize:      totalSize,\n\t\t\tUploadURI: fileURI,\n\t\t}\n\n\t\t// save metadata\n\t\tif err := saveMetadata(metadata); err != nil {\n\t\t\tc.JSON(http.StatusInternalServerError, gin.H{\"error\": \"save metadata failed\"})\n\t\t\treturn\n\t\t}\n\n\t\t// delete progress after upload\n\t\tprogressMutex.Lock()\n\t\tdelete(progressMap, progressKey)\n\t\tprogressMutex.Unlock()\n\n\t\tc.JSON(http.StatusOK, gin.H{\n\t\t\t\"message\":  \"file upload success\",\n\t\t\t\"file_uri\": fileURI,\n\t\t\t\"uuid\":     fileUUID,\n\t\t\t\"md5\":      fileMD5,\n\t\t})\n\t})\n\n\t// get upload progress\n\tg.GET(\"/progress/:uuid\", func(c *gin.Context) {\n\t\tuuid := c.Param(\"uuid\")\n\t\tprogressMutex.Lock()\n\t\tdefer progressMutex.Unlock()\n\n\t\tbytesCopied, exists := progressMap[uuid]\n\t\tif !exists {\n\t\t\tc.JSON(http.StatusNotFound, gin.H{\"error\": \"file not in upload\"})\n\t\t\treturn\n\t\t}\n\n\t\t// calculate progress percent\n\t\ttotal, exists := progressMap[uuid+\"_total\"]\n\t\tif !exists {\n\t\t\tc.JSON(http.StatusOK, gin.H{\n\t\t\t\t\"uuid\":         uuid,\n\t\t\t\t\"bytes_copied\": bytesCopied,\n\t\t\t})\n\t\t\treturn\n\t\t}\n\n\t\tpercent := 0\n\t\tif total > 0 {\n\t\t\tpercent = int(float64(bytesCopied) / float64(total) * 100)\n\t\t}\n\n\t\tc.JSON(http.StatusOK, gin.H{\n\t\t\t\"uuid\":         uuid,\n\t\t\t\"bytes_copied\": bytesCopied,\n\t\t\t\"total_size\":   total,\n\t\t\t\"percent\":      percent,\n\t\t})\n\t})\n\n\t// file download\n\tg.GET(\"/download/:uuid/:filename\", func(c *gin.Context) {\n\t\tuuid := c.Param(\"uuid\")\n\t\tfilename := c.Param(\"filename\")\n\n\t\t// validate that uuid and filename are single path components\n\t\tif uuid == \"\" || strings.Contains(uuid, \"/\") || strings.Contains(uuid, \"\\\\\") || strings.Contains(uuid, \"..\") {\n\t\t\tc.JSON(http.StatusBadRequest, gin.H{\"error\": \"invalid file name\"})\n\t\t\treturn\n\t\t}\n\t\tif filename == \"\" || strings.Contains(filename, \"/\") || strings.Contains(filename, \"\\\\\") || strings.Contains(filename, \"..\") {\n\t\t\tc.JSON(http.StatusBadRequest, gin.H{\"error\": \"invalid file name\"})\n\t\t\treturn\n\t\t}\n\n\t\tfilePath := filepath.Join(ExeDirPath, uploadDir, uuid, filename)\n\n\t\tsafeDir := filepath.Join(ExeDirPath, uploadDir)\n\t\tsafeDirAbs, err := filepath.Abs(safeDir)\n\t\tif err != nil {\n\t\t\tc.JSON(http.StatusInternalServerError, gin.H{\"error\": \"internal server error\"})\n\t\t\treturn\n\t\t}\n\n\t\tabsPath, err := filepath.Abs(filePath)\n\t\tif err != nil {\n\t\t\tc.JSON(http.StatusBadRequest, gin.H{\"error\": \"invalid file name\"})\n\t\t\treturn\n\t\t}\n\n\t\t// ensure that the resolved path is within the safe directory\n\t\tif !strings.HasPrefix(absPath, safeDirAbs+string(os.PathSeparator)) {\n\t\t\tc.JSON(http.StatusBadRequest, gin.H{\"error\": \"invalid file name\"})\n\t\t\treturn\n\t\t}\n\n\t\t// check file exists\n\t\tif _, err := os.Stat(absPath); os.IsNotExist(err) {\n\t\t\tc.JSON(http.StatusNotFound, gin.H{\"error\": \"file not exists\"})\n\t\t\treturn\n\t\t}\n\n\t\t// provide file download\n\t\tc.Header(\"Content-Description\", \"File Transfer\")\n\t\tc.Header(\"Content-Disposition\", \"attachment; filename=\"+filename)\n\t\tc.Header(\"Content-Type\", \"application/octet-stream\")\n\t\tc.File(absPath)\n\t})\n\n\t// get file metadata\n\tg.GET(\"/metadata/:uuid\", func(c *gin.Context) {\n\t\tuuid := c.Param(\"uuid\")\n\t\tmetadata, err := loadMetadata(uuid)\n\t\tif err != nil {\n\t\t\tc.JSON(http.StatusNotFound, gin.H{\"error\": \"file metadata not exists\"})\n\t\t\treturn\n\t\t}\n\n\t\tc.JSON(http.StatusOK, metadata)\n\t})\n}\n\n// ProgressWriter use to track upload progress\ntype ProgressWriter struct {\n\tio.Writer\n\tProgress *map[string]int64\n\tKey      string\n\tMutex    *sync.Mutex\n\tTotal    int64\n\twritten  int64\n}\n\nfunc (pw *ProgressWriter) Write(p []byte) (n int, err error) {\n\tn, err = pw.Writer.Write(p)\n\tif err == nil {\n\t\tpw.written += int64(n)\n\t\tpw.Mutex.Lock()\n\t\t(*pw.Progress)[pw.Key] = pw.written\n\t\t// store total size for progress calculation\n\t\t(*pw.Progress)[pw.Key+\"_total\"] = pw.Total\n\t\tpw.Mutex.Unlock()\n\t}\n\treturn\n}\n\n// saveMetadata use to save file metadata\nfunc saveMetadata(metadata FileMetadata) error {\n\tif _, err := os.Stat(filepath.Join(ExeDirPath, metadataDir)); os.IsNotExist(err) {\n\t\tif err := os.MkdirAll(filepath.Join(ExeDirPath, metadataDir), os.ModePerm); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tmetadataPath := filepath.Join(ExeDirPath, metadataDir, metadata.UUID+\".json\")\n\tfile, err := os.Create(metadataPath)\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer file.Close()\n\n\tencoder := json.NewEncoder(file)\n\tencoder.SetIndent(\"\", \"  \")\n\treturn encoder.Encode(metadata)\n}\n\n// loadMetadata use to load file metadata\nfunc loadMetadata(uuid string) (FileMetadata, error) {\n\tvar metadata FileMetadata\n\tmetadataPath := filepath.Join(ExeDirPath, metadataDir, uuid+\".json\")\n\n\tabsPath, err := filepath.Abs(metadataPath)\n\tif err != nil {\n\t\treturn metadata, err\n\t}\n\n\tsafeDir := filepath.Join(ExeDirPath, metadataDir)\n\tsafeDirAbs, err := filepath.Abs(safeDir)\n\tif err != nil {\n\t\treturn metadata, err\n\t}\n\tif !strings.HasPrefix(absPath, safeDirAbs) {\n\t\treturn metadata, fmt.Errorf(\"invalid file name\")\n\t}\n\n\tfile, err := os.Open(absPath)\n\tif err != nil {\n\t\treturn metadata, err\n\t}\n\tdefer file.Close()\n\n\tdecoder := json.NewDecoder(file)\n\terr = decoder.Decode(&metadata)\n\treturn metadata, err\n}\n\n// checkFileExists use to check if file exists\nfunc checkFileExists(md5 string) (FileMetadata, bool) {\n\t// check all metadata files\n\tfiles, err := os.ReadDir(filepath.Join(ExeDirPath, metadataDir))\n\tif err != nil {\n\t\treturn FileMetadata{}, false\n\t}\n\n\tfor _, file := range files {\n\t\tif file.IsDir() {\n\t\t\tcontinue\n\t\t}\n\n\t\tmetadata, err := loadMetadata(file.Name()[:len(file.Name())-5]) // remove .json suffix\n\t\tif err == nil && metadata.MD5 == md5 {\n\t\t\treturn metadata, true\n\t\t}\n\t}\n\n\treturn FileMetadata{}, false\n}\n"
  },
  {
    "path": "endpoints/server/kbs/attest/attest.go",
    "content": "package attest\n\nimport (\n\t\"crypto/ecdsa\"\n\t\"crypto/elliptic\"\n\t\"crypto/rand\"\n\t\"crypto/rsa\"\n\t\"encoding/base64\"\n\t\"errors\"\n\t\"fmt\"\n\t\"math/big\"\n\t\"net/http\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/gin-gonic/gin\"\n\t\"github.com/golang-jwt/jwt/v5\"\n\n\tkbsError \"github.com/OpenNHP/opennhp/endpoints/server/kbs/error\"\n)\n\nvar (\n\tteePubKeys = struct {\n\t\tsync.RWMutex\n\t\tdata map[string]*rsa.PublicKey\n\t}{data: make(map[string]*rsa.PublicKey)}\n\n\tjwtSigningKey *ecdsa.PrivateKey\n\tinitKeyOnce   sync.Once\n)\n\ntype AttestRequest struct {\n\tTeePubkey   TeePubkey      `json:\"tee-pubkey\"`\n\tTeeEvidence map[string]any `json:\"tee-evidence\"`\n}\n\ntype TeePubkey struct {\n\tKty string `json:\"kty\"`\n\tAlg string `json:\"alg\"`\n\tN   string `json:\"n\"`\n\tE   string `json:\"e\"`\n}\n\ntype CustomClaims struct {\n\tCosignAuthorized bool `json:\"cosign_authorized\"`\n\tjwt.RegisteredClaims\n}\n\nfunc init() {\n\tinitKeyOnce.Do(func() {\n\t\tvar err error\n\t\tjwtSigningKey, err = ecdsa.GenerateKey(elliptic.P256(), rand.Reader)\n\t\tif err != nil {\n\t\t\tpanic(fmt.Sprintf(\"fail to generate jwt signing key: %v\", err))\n\n\t\t}\n\t})\n}\n\nfunc Attest(c *gin.Context) {\n\tsessionID, err := c.Cookie(\"kbs-session-id\")\n\tif err != nil || sessionID == \"\" {\n\t\tc.JSON(http.StatusUnauthorized, kbsError.MissingOrInvalidSessionID())\n\t\treturn\n\t}\n\n\tvar req AttestRequest\n\tif err := c.ShouldBindJSON(&req); err != nil {\n\t\tc.JSON(http.StatusBadRequest, kbsError.InvalidRequest(err))\n\t\treturn\n\t}\n\n\tteePubKey, err := parseTeePubkey(req.TeePubkey)\n\tif err != nil {\n\t\tc.JSON(http.StatusBadRequest, kbsError.TeePubKeyNotFound(err))\n\t\treturn\n\t}\n\n\ttoken, err := generateJWT()\n\tif err != nil {\n\t\tc.JSON(http.StatusInternalServerError, kbsError.TokenGenerationFailed(err))\n\t\treturn\n\t}\n\n\tteePubKeys.Lock()\n\tteePubKeys.data[token] = teePubKey\n\tteePubKeys.Unlock()\n\n\tc.SetCookie(\n\t\t\"kbs-session-id\",\n\t\tsessionID,\n\t\t3600,\n\t\t\"/\", \"\", true, true, // Secure: only send over HTTPS\n\t)\n\n\tc.JSON(http.StatusOK, gin.H{\n\t\t\"token\": token,\n\t})\n}\n\nfunc parseTeePubkey(pubkey TeePubkey) (*rsa.PublicKey, error) {\n\tif pubkey.Kty != \"RSA\" {\n\t\treturn nil, errors.New(\"unsupported key type, expect RSA\")\n\t}\n\n\tnBytes, err := base64.RawURLEncoding.DecodeString(pubkey.N)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"invalid n: %w\", err)\n\t}\n\n\teBytes, err := base64.RawURLEncoding.DecodeString(pubkey.E)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"invalid e: %w\", err)\n\t}\n\n\te := 0\n\tfor _, b := range eBytes {\n\t\te = e<<8 | int(b)\n\t}\n\n\treturn &rsa.PublicKey{\n\t\tN: new(big.Int).SetBytes(nBytes),\n\t\tE: e,\n\t}, nil\n}\n\nfunc generateJWT() (string, error) {\n\tif jwtSigningKey == nil {\n\t\treturn \"\", errors.New(\"JWT signing key is not initialized\")\n\t}\n\n\tclaims := CustomClaims{\n\t\tCosignAuthorized: true,\n\t\tRegisteredClaims: jwt.RegisteredClaims{\n\t\t\tIssuedAt:  jwt.NewNumericDate(time.Now()),\n\t\t\tExpiresAt: jwt.NewNumericDate(time.Now().Add(5 * time.Minute)),\n\t\t},\n\t}\n\n\ttoken := jwt.NewWithClaims(jwt.SigningMethodES256, claims)\n\n\tpublicKey := jwtSigningKey.PublicKey\n\ttoken.Header[\"jwk\"] = map[string]any{\n\t\t\"alg\": \"ES256\",\n\t\t\"crv\": \"P-256\",\n\t\t\"kty\": \"EC\",\n\t\t\"x\":   base64.RawURLEncoding.EncodeToString(publicKey.X.Bytes()),\n\t\t\"y\":   base64.RawURLEncoding.EncodeToString(publicKey.Y.Bytes()),\n\t}\n\n\treturn token.SignedString(jwtSigningKey)\n}\n\nfunc GetTeePubKeyByToken(token string) (*rsa.PublicKey, error) {\n\tteePubKeys.RLock()\n\tdefer teePubKeys.RUnlock()\n\n\tpubKey, exists := teePubKeys.data[token]\n\tif !exists {\n\t\treturn nil, errors.New(\"TEE public key is not found for specified token\")\n\n\t}\n\treturn pubKey, nil\n}\n"
  },
  {
    "path": "endpoints/server/kbs/auth/auth.go",
    "content": "package auth\n\nimport (\n\t\"crypto/rand\"\n\t\"encoding/base64\"\n\t\"encoding/hex\"\n\t\"fmt\"\n\t\"net/http\"\n\n\t\"github.com/gin-gonic/gin\"\n\n\tkbsError \"github.com/OpenNHP/opennhp/endpoints/server/kbs/error\"\n)\n\ntype AuthRequest struct {\n\tVersion     string         `json:\"version\"`\n\tTee         string         `json:\"tee\"`\n\tExtraParams map[string]any `json:\"extra-params\"`\n}\n\ntype AuthResponse struct {\n\tNonce       string `json:\"nonce\"`\n\tExtraParams string `json:\"extra-params\"`\n}\n\nfunc generateNonce() (string, error) {\n\tb := make([]byte, 32)\n\t_, err := rand.Read(b)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\treturn base64.StdEncoding.EncodeToString(b), nil\n}\n\nfunc generateSecureSessionID() (string, error) {\n\trandomBytes := make([]byte, 32)\n\t_, err := rand.Read(randomBytes)\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"fail to generate session id: %w\", err)\n\n\t}\n\n\treturn hex.EncodeToString(randomBytes), nil\n}\n\nfunc Auth(c *gin.Context) {\n\tvar req AuthRequest\n\n\tif err := c.ShouldBindJSON(&req); err != nil {\n\t\tc.JSON(http.StatusBadRequest, kbsError.InvalidRequest(err))\n\t\treturn\n\t}\n\n\tnonce, err := generateNonce()\n\tif err != nil {\n\t\tc.JSON(http.StatusInternalServerError, kbsError.NonceGenerationFailed(err))\n\t\treturn\n\t}\n\n\tkbsSessionId, err := generateSecureSessionID()\n\tif err != nil {\n\t\tc.JSON(http.StatusInternalServerError, kbsError.SessionIDGenerationFailed(err))\n\t\treturn\n\t}\n\n\tc.SetCookie(\n\t\t\"kbs-session-id\",\n\t\tkbsSessionId,\n\t\t3600, // the unit is second\n\t\t\"/\",\n\t\t\"\",\n\t\ttrue, // Secure: only send over HTTPS\n\t\ttrue,\n\t)\n\n\tc.JSON(http.StatusOK, AuthResponse{\n\t\tNonce:       nonce,\n\t\tExtraParams: \"\",\n\t})\n}\n"
  },
  {
    "path": "endpoints/server/kbs/error/error.go",
    "content": "/*\nPackage error defines error types and utility functions for the KBS (Key Broker Service)\ncomponent. It provides standardized error responses with specific error types and\ndetail messages for common failure scenarios encountered in the KBS operations,\nincluding token validation, resource access, encryption processes, and session management.\n*/\n\npackage error\n\ntype ErrorType string\n\nconst (\n\ttokenNotFound             ErrorType = \"https://github.com/confidential-containers/kbs/errors/TokenNotFound\"\n\ttokenInvalid              ErrorType = \"https://github.com/confidential-containers/kbs/errors/TokenInvalid\"\n\tpolicyDeny                ErrorType = \"https://github.com/confidential-containers/kbs/errors/PolicyDeny\"\n\tteePubKeyNotFound         ErrorType = \"https://github.com/confidential-containers/kbs/errors/TeePubKeyNotFound\"\n\tresourceNotFound          ErrorType = \"https://github.com/confidential-containers/kbs/errors/ResourceNotFound\"\n\tkeyGenerationFailed       ErrorType = \"https://github.com/confidential-containers/kbs/errors/KeyGenerationFailed\"\n\tkeyEncryptionFailed       ErrorType = \"https://github.com/confidential-containers/kbs/errors/KeyEncryptionFailed\"\n\tcontentEncryptionFailed   ErrorType = \"https://github.com/confidential-containers/kbs/errors/ContentEncryptionFailed\"\n\tinvalidRequest            ErrorType = \"https://github.com/confidential-containers/kbs/errors/InvalidRequest\"\n\tnonceGenerationFailed     ErrorType = \"https://github.com/confidential-containers/kbs/errors/NonceGenerationFailed\"\n\tsessionIDGenerationFailed ErrorType = \"https://github.com/confidential-containers/kbs/errors/SessionIDGenerationFailed\"\n\tmissingOrInvalidSessionID ErrorType = \"https://github.com/confidential-containers/kbs/errors/MissingOrInvalidSessionID\"\n\ttokenGenerationFailed     ErrorType = \"https://github.com/confidential-containers/kbs/errors/TokenGenerationFailed\"\n)\n\nfunc newError(errType ErrorType, detail string) map[string]any {\n\treturn map[string]any{\n\t\t\"type\":   errType,\n\t\t\"detail\": detail,\n\t}\n}\n\nfunc TokenNotFound() map[string]any {\n\treturn newError(tokenNotFound, \"Attestation Token is not found\")\n}\n\nfunc TokenInvalid() map[string]any {\n\treturn newError(tokenInvalid, \"Attestation Token is invalid\")\n}\n\nfunc PolicyDeny() map[string]any {\n\treturn newError(policyDeny, \"Access is denied by policy\")\n}\n\nfunc TeePubKeyNotFound(err error) map[string]any {\n\treturn newError(teePubKeyNotFound, \"Tee public key is not found\"+err.Error())\n}\n\nfunc ResourceNotFound(err error) map[string]any {\n\treturn newError(resourceNotFound, \"Resource is not found: \"+err.Error())\n}\n\nfunc KeyGenerationFailed(err error) map[string]any {\n\treturn newError(keyGenerationFailed, \"Failed to generate content key: \"+err.Error())\n}\n\nfunc KeyEncryptionFailed(err error) map[string]any {\n\treturn newError(keyEncryptionFailed, \"Failed to encrypt content key: \"+err.Error())\n}\n\nfunc ContentEncryptionFailed(err error) map[string]any {\n\treturn newError(contentEncryptionFailed, \"Failed to encrypt resource content: \"+err.Error())\n}\n\nfunc InvalidRequest(err error) map[string]any {\n\treturn newError(invalidRequest, \"Invalid request: \"+err.Error())\n}\n\nfunc NonceGenerationFailed(err error) map[string]any {\n\treturn newError(nonceGenerationFailed, \"Failed to generate nonce: \"+err.Error())\n}\n\nfunc SessionIDGenerationFailed(err error) map[string]any {\n\treturn newError(sessionIDGenerationFailed, \"Failed to generate session ID: \"+err.Error())\n}\n\nfunc MissingOrInvalidSessionID() map[string]any {\n\treturn newError(missingOrInvalidSessionID, \"Missing or invalid session ID\")\n}\n\nfunc TokenGenerationFailed(err error) map[string]any {\n\treturn newError(tokenGenerationFailed, \"Failed to generate token: \"+err.Error())\n}\n"
  },
  {
    "path": "endpoints/server/kbs/resource/resource.go",
    "content": "package resource\n\nimport (\n\t\"crypto/aes\"\n\t\"crypto/cipher\"\n\t\"crypto/ecdsa\"\n\t\"crypto/elliptic\"\n\t\"crypto/rand\"\n\t\"crypto/rsa\"\n\t\"encoding/base64\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"math/big\"\n\t\"net/http\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\n\t\"github.com/gin-gonic/gin\"\n\t\"github.com/golang-jwt/jwt/v5\"\n\t\"github.com/sigstore/cosign/v2/pkg/cosign\"\n\n\t\"github.com/OpenNHP/opennhp/endpoints/server/kbs/attest\"\n\tkbsError \"github.com/OpenNHP/opennhp/endpoints/server/kbs/error\"\n)\n\nvar (\n\tbaseDir = \"/opt/confidential-containers/kbs/repository\"\n)\n\nfunc init() {\n\terr := generateCosignKeyPair(\n\t\tfilepath.Join(baseDir, \"cosign.key\"),\n\t\tfilepath.Join(baseDir, \"/default/cosign-key/pub\"),\n\t)\n\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n\nfunc generateCosignKeyPair(privateKeyPath, publicKeyPath string) error {\n\tif _, err := os.Stat(privateKeyPath); err == nil {\n\t\tif _, err := os.Stat(publicKeyPath); err == nil {\n\t\t\treturn nil\n\t\t}\n\t}\n\n\tkeys, err := cosign.GenerateKeyPair(nil)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif err := os.MkdirAll(filepath.Dir(privateKeyPath), 0755); err != nil {\n\t\treturn fmt.Errorf(\"fail to create private key directory: %w\", err)\n\t}\n\n\tif err := os.MkdirAll(filepath.Dir(publicKeyPath), 0755); err != nil {\n\t\treturn fmt.Errorf(\"fail to create public key directory: %w\", err)\n\t}\n\n\tif err := os.WriteFile(privateKeyPath, keys.PrivateBytes, 0600); err != nil {\n\t\treturn fmt.Errorf(\"fail to write private key file: %w\", err)\n\t}\n\n\tif err := os.WriteFile(publicKeyPath, keys.PublicBytes, 0644); err != nil { //nolint:gosec // G306: Public keys are intentionally world-readable\n\t\treturn fmt.Errorf(\"fail to write public key file: %w\", err)\n\t}\n\n\treturn nil\n}\n\nfunc GetResource(c *gin.Context) {\n\tpath := c.Param(\"path\")\n\tif path == \"\" {\n\t\tc.JSON(http.StatusBadRequest, gin.H{\"error\": \"resource path is empty\"})\n\t\treturn\n\t}\n\n\tauthHeader := c.GetHeader(\"Authorization\")\n\tif authHeader == \"\" || !strings.HasPrefix(authHeader, \"Bearer \") {\n\t\tc.JSON(http.StatusUnauthorized, kbsError.TokenNotFound())\n\t\treturn\n\t}\n\ttokenStr := strings.TrimPrefix(authHeader, \"Bearer \")\n\n\tverifiedToken, err := VerifyJWT(tokenStr)\n\tif err != nil {\n\t\tc.JSON(http.StatusUnauthorized, kbsError.TokenInvalid())\n\t\treturn\n\t}\n\n\tif !verifiedToken.Valid {\n\t\tc.JSON(http.StatusUnauthorized, kbsError.TokenInvalid())\n\t\treturn\n\t}\n\n\tif claims, ok := verifiedToken.Claims.(*attest.CustomClaims); ok {\n\t\tif !claims.CosignAuthorized {\n\t\t\tc.JSON(http.StatusForbidden, kbsError.PolicyDeny())\n\t\t\treturn\n\t\t}\n\t}\n\n\tteePubKey, err := attest.GetTeePubKeyByToken(tokenStr)\n\tif err != nil {\n\t\tc.JSON(http.StatusForbidden, kbsError.TeePubKeyNotFound(err))\n\t\treturn\n\t}\n\n\tresourceData, err := loadResource(path)\n\tif err != nil {\n\t\tc.JSON(http.StatusNotFound, kbsError.ResourceNotFound(err))\n\t\treturn\n\t}\n\n\tcontentKey := make([]byte, 32)\n\tif _, err := rand.Read(contentKey); err != nil {\n\t\tc.JSON(http.StatusInternalServerError, kbsError.KeyGenerationFailed(err))\n\t\treturn\n\t}\n\n\tencryptedKey, err := rsa.EncryptPKCS1v15(\n\t\trand.Reader,\n\t\tteePubKey,\n\t\tcontentKey,\n\t)\n\tif err != nil {\n\t\tc.JSON(http.StatusInternalServerError, kbsError.KeyEncryptionFailed(err))\n\t\treturn\n\t}\n\n\tencryptedContent, iv, _, err := encryptWithA256GCM(contentKey, resourceData)\n\tif err != nil {\n\t\tc.JSON(http.StatusInternalServerError, kbsError.ContentEncryptionFailed(err))\n\t\treturn\n\t}\n\n\tprotected := map[string]string{\n\t\t\"alg\": \"RSA1_5\",\n\t\t\"enc\": \"A256GCM\",\n\t}\n\tprotectedJSON, _ := json.Marshal(protected)\n\n\tresponse := map[string]string{\n\t\t\"protected\":     string(protectedJSON),\n\t\t\"encrypted_key\": base64.RawURLEncoding.EncodeToString(encryptedKey),\n\t\t\"iv\":            base64.RawURLEncoding.EncodeToString(iv),\n\t\t\"ciphertext\":    base64.RawURLEncoding.EncodeToString(encryptedContent),\n\t\t\"tag\":           \"\",\n\t}\n\n\tc.JSON(http.StatusOK, response)\n}\n\nfunc loadResource(resourceID string) ([]byte, error) {\n\tabsBaseDir, err := filepath.Abs(baseDir)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"fail to get base directory absolute path: %w\", err)\n\t}\n\n\tfullPath := filepath.Join(absBaseDir, resourceID)\n\n\tabsFullPath, err := filepath.Abs(fullPath)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"fail to get resource absolute path: %w\", err)\n\t}\n\n\t// Check if the path is within the base directory to avoid path traversal attack.\n\tif !strings.HasPrefix(absFullPath, absBaseDir) {\n\t\treturn nil, errors.New(\"invalid resource ID: potential path traversal attack\")\n\t}\n\n\tif _, err := os.Stat(absFullPath); err != nil {\n\t\tif os.IsNotExist(err) {\n\t\t\treturn nil, errors.New(\"resource not found\")\n\t\t}\n\t\treturn nil, fmt.Errorf(\"fail to check resource: %w\", err)\n\t}\n\n\tdata, err := os.ReadFile(absFullPath)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"fail to read resource: %w\", err)\n\t}\n\treturn data, nil\n}\n\nfunc encryptWithA256GCM(key, plaintext []byte) (ciphertext, iv, tag []byte, err error) {\n\tblock, err := aes.NewCipher(key)\n\tif err != nil {\n\t\treturn nil, nil, nil, err\n\t}\n\n\tgcm, err := cipher.NewGCM(block)\n\tif err != nil {\n\t\treturn nil, nil, nil, err\n\t}\n\n\tiv = make([]byte, gcm.NonceSize())\n\tif _, err = io.ReadFull(rand.Reader, iv); err != nil {\n\t\treturn nil, nil, nil, err\n\t}\n\n\tciphertext = gcm.Seal(nil, iv, plaintext, nil)\n\n\treturn ciphertext, iv, nil, nil\n}\n\nfunc VerifyJWT(tokenString string) (*jwt.Token, error) {\n\t// First parse the token without verification to get the header\n\tparser := jwt.NewParser()\n\tunverifiedToken, _, err := parser.ParseUnverified(tokenString, jwt.MapClaims{})\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to parse token: %w\", err)\n\t}\n\n\t// Extract JWK from header\n\tjwkHeader, ok := unverifiedToken.Header[\"jwk\"].(map[string]any)\n\tif !ok {\n\t\treturn nil, fmt.Errorf(\"missing or invalid jwk in header\")\n\t}\n\n\t// Convert JWK back to ECDSA public key\n\txStr, ok := jwkHeader[\"x\"].(string)\n\tif !ok {\n\t\treturn nil, fmt.Errorf(\"missing x coordinate in jwk\")\n\t}\n\tyStr, ok := jwkHeader[\"y\"].(string)\n\tif !ok {\n\t\treturn nil, fmt.Errorf(\"missing y coordinate in jwk\")\n\t}\n\n\txBytes, err := base64.RawURLEncoding.DecodeString(xStr)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"invalid x coordinate: %w\", err)\n\t}\n\tyBytes, err := base64.RawURLEncoding.DecodeString(yStr)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"invalid y coordinate: %w\", err)\n\t}\n\n\tpublicKey := &ecdsa.PublicKey{\n\t\tCurve: elliptic.P256(),\n\t\tX:     new(big.Int).SetBytes(xBytes),\n\t\tY:     new(big.Int).SetBytes(yBytes),\n\t}\n\n\t// Now verify the token with the extracted public key\n\ttoken, err := jwt.Parse(tokenString, func(token *jwt.Token) (any, error) {\n\t\t// Check signing method\n\t\tif _, ok := token.Method.(*jwt.SigningMethodECDSA); !ok {\n\t\t\treturn nil, fmt.Errorf(\"unexpected signing method: %v\", token.Header[\"alg\"])\n\t\t}\n\t\treturn publicKey, nil\n\t})\n\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn token, nil\n}\n"
  },
  {
    "path": "endpoints/server/kbs.go",
    "content": "package server\n\nimport (\n\tkbsAttest \"github.com/OpenNHP/opennhp/endpoints/server/kbs/attest\"\n\tkbsAuth \"github.com/OpenNHP/opennhp/endpoints/server/kbs/auth\"\n\tkbsResource \"github.com/OpenNHP/opennhp/endpoints/server/kbs/resource\"\n)\n\nfunc (hs *HttpServer) initKbsRouter() {\n\tg := hs.ginEngine.Group(\"/kbs/v0\")\n\n\tg.POST(\"/auth\", kbsAuth.Auth)\n\tg.POST(\"/attest\", kbsAttest.Attest)\n\tg.GET(\"/resource/*path\", kbsResource.GetResource)\n}\n"
  },
  {
    "path": "endpoints/server/main/etc/ac.toml",
    "content": "# list the AC peers for the server under [[ACs]] table\r\n\r\n# PubKeyBase64: public key for the AC in base64 format.\r\n# ExpireTime (epoch timestamp in seconds): peer key validation will fail when it expires.\r\n[[ACs]]\r\nPubKeyBase64 = \"Fr5jzZDVpNh5m9AcBDMtHGmbCAczHyPegT8IxQ3XAzE=\"\r\nExpireTime = 1924991999\r\n"
  },
  {
    "path": "endpoints/server/main/etc/agent.toml",
    "content": "# list the agent peers for the server under [[Agents]] table\r\n\r\n# PubKeyBase64: public key for the agent in base64 format.\r\n# ExpireTime (epoch timestamp in seconds): peer key validation will fail when it expires.\r\n[[Agents]]\r\nPubKeyBase64 = \"WnJAolo88/q0x2VdLQYdmZNtKjwG2ocBd1Ozj41AKlo=\"\r\nExpireTime = 1924991999\r\n"
  },
  {
    "path": "endpoints/server/main/etc/config.toml",
    "content": "# NHP-Server base config\r\n# field with (-) does not support dynamic update\r\n\r\n# PrivateKeyBase64 (-): server private key in base64 format.\r\n# DefaultCipherScheme: 0: curve25519, 1: gmsm.\r\n# MIGRATION: Values changed in v2.x. If upgrading: old 0(gmsm)->new 1, old 1(curve)->new 0.\r\n# ListenIp (-): udp listening address.\r\n# ListenPort (-): udp listening port.\r\n# Hostname (-): server domain name.\r\n# LogLevel: 0: silent, 1: error, 2: info, 3: audit, 4: debug, 5: trace.\r\n# DisableAgentValidation: whether for the server to skip the agent's public key validation.\r\nPrivateKeyBase64 = \"eHdyRHKJy/YZJsResCt5XTAZgtcwvLpSXAiZ8DBc0V4=\"\r\nDefaultCipherScheme = 0\r\nListenIp = \"\"    # empty for ipv4 + ipv6, \"0.0.0.0\" for ipv4 only\r\nListenPort = 62206\r\nHostname = \"localhost\" # the hostname of NHP-Server\r\nLogLevel = 4\r\nDisableAgentValidation = false\r\n\r\n[webrtc]\r\nEnable = false\r\nOfferFile = \"\"\r\nAnswerFile = \"\"\r\nStunServers = [\"stun:stun.l.google.com:19302\"]\r\nTurnServers = []\r\n\r\n"
  },
  {
    "path": "endpoints/server/main/etc/db.toml",
    "content": "# list the device peers for the server under [[Devices]] table\n\n# PubKeyBase64: public key for the device in base64 format.\n# ExpireTime (epoch timestamp in seconds): peer key validation will fail when it expires.\n[[DBs]]\nPubKeyBase64 = \"CtxNuy7lJ1mJgjqWplcwN8dZhXhSNPhECja1A0OWKa+2wtI7xuB3jPcamogGZGBBfQ4SqnoPGLA7zRQaAotoxg==\"\nExpireTime = 1924991999\n"
  },
  {
    "path": "endpoints/server/main/etc/http.toml",
    "content": "# http server config\r\n\r\n# EnableHttp: true: turn on http server, false: shutdown http server.\r\n# EnableTLS: whether to use TLS certificates for hosting https server.\r\n# TLSCertFile: certificate file path.\r\n# TLSKeyFile: key file path.\r\n# to update http changes, you need to restart the http server by changing \"EnableHttp\" to \"false\" and then switch it back to \"true\".\r\nEnableHttp = true\r\nEnableTLS = true\r\nHttpListenIp = \"0.0.0.0\"    # empty for ipv4 + ipv6, \"0.0.0.0\" for ipv4 only, \"127.0.0.1\" for local ipv4 access only\r\nHttpListenPort = 443\r\nTLSCertFile = \"cert/cert.pem\"\r\nTLSKeyFile = \"cert/cert.key\"\r\n"
  },
  {
    "path": "endpoints/server/main/etc/remote.toml.example",
    "content": "# NHP-Server remote config\n# field with (-) does not support dynamic update\n# If the file remote.toml exists, NHP-Server will obtain remote configuration information through the etcd client.\n\n# Provider: Remote configuration provider type. Currently only etcd supported\n# Endpoints: ETCD service access address.\n# Key: NHP-Server obtain the configuration information through this key.\n# Username: The account of the NHP-Server accessing ETCD.\n# Password: The password for NHP-Server to access ETCD.\n\nProvider = \"etcd\"\nEndpoints = [\"172.16.3.53:2379\"]\nKey = \"openserver-1\"\n"
  },
  {
    "path": "endpoints/server/main/etc/resource.toml",
    "content": "# List resources and their sub-fields here\r\n\r\n# syntax [\"{AuthServiceId}\"]\r\n# AuthServiceId: id of the authentication and authorization service provider.\r\n# PluginPath: path of plugin to implement auth logic.\r\n[\"example\"]\r\nPluginPath = \"example/example.so\"\r\n\r\n[\"authenticator\"]\r\nPluginPath = \"authenticator/authenticator.so\"\r\n"
  },
  {
    "path": "endpoints/server/main/etc/srcip.toml",
    "content": "# list additional source addresses to be passed along with the agent address\r\n\r\n# syntax [[\"{SrcIp}\"]]\r\n# SrcIp: specify the agent source ip. Each source ip can have multiple side source ips.\r\n# Ip: specify a side source ip address to be also passed after successful knock.\r\n[[\"192.168.2.27\"]]\r\nIp = \"192.168.2.26\"\r\n\r\n[[\"192.168.2.27\"]]\r\nIp = \"192.168.2.28\"\r\n"
  },
  {
    "path": "endpoints/server/main/etc/tee.toml",
    "content": "# list trusted execution environments under [[TEEs]] table\n\n# Measure: cryptographic hashes that ensure the integrity of software and data within the TEE.\n# SerialNumber: unique serial number of the TEE.\n\n[[TEEs]]\nMeasure = \"19178a674248bbca705863bbf75ecaa049fcf3dfcc5ff59a80dcc5cbb60dae59\"\nSerialNumber = \"TMEX300023050201\"\n\n[[TEEs]]\nMeasure = \"c8b352707a25207e0fefc647aa933d4bd20981c80d8cebcc7389b3204d43130c\"\nSerialNumber = \"c8b352707a25207e0fefc647aa933d4bd20981c80d8cebcc7389b3204d43130c\"\n"
  },
  {
    "path": "endpoints/server/main/main.go",
    "content": "package main\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"os\"\n\t\"os/signal\"\n\t\"path/filepath\"\n\t\"runtime\"\n\t\"runtime/pprof\"\n\t\"syscall\"\n\t\"time\"\n\n\t\"github.com/urfave/cli/v2\"\n\n\t\"github.com/OpenNHP/opennhp/endpoints/server\"\n\t\"github.com/OpenNHP/opennhp/nhp/core\"\n\t\"github.com/OpenNHP/opennhp/nhp/version\"\n)\n\n// ANSI color codes\nconst (\n\tcolorReset  = \"\\033[0m\"\n\tcolorCyan   = \"\\033[36m\"\n\tcolorGreen  = \"\\033[32m\"\n\tcolorYellow = \"\\033[33m\"\n\tcolorBlue   = \"\\033[34m\"\n\tcolorPurple = \"\\033[35m\"\n\tcolorBold   = \"\\033[1m\"\n\tcolorDim    = \"\\033[2m\"\n)\n\nfunc main() {\n\tapp := cli.NewApp()\n\tapp.Name = \"nhp-server\"\n\tapp.Usage = \"server entity for NHP protocol\"\n\tapp.Version = version.Version\n\n\trunCmd := &cli.Command{\n\t\tName:  \"run\",\n\t\tUsage: \"create and run server process for NHP protocol\",\n\t\tFlags: []cli.Flag{\n\t\t\t&cli.BoolFlag{Name: \"prof\", Value: false, DisableDefaultText: true, Usage: \"running profiling for the server\"},\n\t\t},\n\t\tAction: func(c *cli.Context) error {\n\t\t\treturn runApp(c.Bool(\"prof\"))\n\t\t},\n\t}\n\n\tkeygenCmd := &cli.Command{\n\t\tName:  \"keygen\",\n\t\tUsage: \"generate key pairs for NHP devices\",\n\t\tFlags: []cli.Flag{\n\t\t\t&cli.BoolFlag{Name: \"curve\", Value: false, DisableDefaultText: true, Usage: \"generate curve25519 keys\"},\n\t\t\t&cli.BoolFlag{Name: \"sm2\", Value: false, DisableDefaultText: true, Usage: \"generate sm2 keys (default)\"},\n\t\t\t&cli.BoolFlag{Name: \"json\", Value: false, DisableDefaultText: true, Usage: \"output in JSON format\"},\n\t\t},\n\t\tAction: func(c *cli.Context) error {\n\t\t\tvar e core.Ecdh\n\t\t\teccType := core.ECC_SM2\n\t\t\tif c.Bool(\"curve\") {\n\t\t\t\teccType = core.ECC_CURVE25519\n\t\t\t}\n\t\t\te = core.NewECDH(eccType)\n\t\t\tpub := e.PublicKeyBase64()\n\t\t\tpriv := e.PrivateKeyBase64()\n\t\t\tif c.Bool(\"json\") {\n\t\t\t\toutput := map[string]string{\n\t\t\t\t\t\"privateKey\": priv,\n\t\t\t\t\t\"publicKey\":  pub,\n\t\t\t\t}\n\t\t\t\tjson.NewEncoder(os.Stdout).Encode(output)\n\t\t\t} else {\n\t\t\t\tfmt.Println(\"Private key: \", priv)\n\t\t\t\tfmt.Println(\"Public key: \", pub)\n\t\t\t}\n\t\t\treturn nil\n\t\t},\n\t}\n\n\tapp.Commands = []*cli.Command{\n\t\trunCmd,\n\t\tkeygenCmd,\n\t}\n\n\tif err := app.Run(os.Args); err != nil {\n\t\tpanic(err)\n\t}\n}\n\nfunc printBanner() {\n\tbanner := `\n` + colorCyan + colorBold + `\n   ____                   _   _ _   _ ____  \n  / __ \\                 | \\ | | | | |  _ \\ \n | |  | |_ __   ___ _ __ |  \\| | |_| | |_) |\n | |  | | '_ \\ / _ \\ '_ \\| . ' |  _  |  __/ \n | |__| | |_) |  __/ | | | |\\  | | | | |    \n  \\____/| .__/ \\___|_| |_|_| \\_|_| |_|_|    \n        | |                                  \n        |_|  ` + colorReset + colorDim + `Network-infrastructure Hiding Protocol` + colorReset + `\n` + colorPurple + `\n  ⭐ GitHub: ` + colorReset + `https://github.com/OpenNHP/opennhp\n` + colorYellow + `  💡 Star us & Join the community! Contributors welcome!` + colorReset + `\n\n`\n\tfmt.Print(banner)\n}\n\nfunc printServerInfo(us *server.UdpServer) {\n\t// Safely get commit ID (first 12 chars or full if shorter)\n\tcommitId := version.CommitId\n\tif len(commitId) > 12 {\n\t\tcommitId = commitId[:12]\n\t}\n\n\tfmt.Println(colorGreen + \"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\" + colorReset)\n\tfmt.Println()\n\tfmt.Printf(\"  %s🚀 NHP-Server%s is running!\\n\", colorBold, colorReset)\n\tfmt.Println()\n\tfmt.Printf(\"  %sVersion:%s    %s\\n\", colorYellow, colorReset, version.Version)\n\tfmt.Printf(\"  %sCommit:%s     %s\\n\", colorYellow, colorReset, commitId)\n\tfmt.Printf(\"  %sBuild:%s      %s\\n\", colorYellow, colorReset, version.BuildTime)\n\tfmt.Printf(\"  %sPlatform:%s   %s/%s\\n\", colorYellow, colorReset, runtime.GOOS, runtime.GOARCH)\n\tfmt.Println()\n\tfmt.Printf(\"  %sUDP Port:%s   %s%d%s\\n\", colorBlue, colorReset, colorCyan, us.GetListenPort(), colorReset)\n\n\t// Display HTTP status\n\thttpPort, httpEnabled := us.GetHttpPort()\n\tif httpEnabled {\n\t\tfmt.Printf(\"  %sHTTP Port:%s  %s%d%s (TLS: %s)\\n\", colorBlue, colorReset, colorCyan, httpPort, colorReset, us.GetHttpTLSStatus())\n\t} else {\n\t\tfmt.Printf(\"  %sHTTP:%s       %sdisabled%s\\n\", colorBlue, colorReset, colorDim, colorReset)\n\t}\n\n\tfmt.Printf(\"  %sStarted:%s    %s\\n\", colorBlue, colorReset, time.Now().Format(\"2006-01-02 15:04:05\"))\n\tfmt.Println()\n\tfmt.Println(colorGreen + \"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\" + colorReset)\n\tfmt.Println()\n\tfmt.Printf(\"  %sPress Ctrl+C to stop the server%s\\n\", colorDim, colorReset)\n\tfmt.Println()\n}\n\nfunc runApp(enableProfiling bool) error {\n\texeFilePath, err := os.Executable()\n\tif err != nil {\n\t\treturn err\n\t}\n\texeDirPath := filepath.Dir(exeFilePath)\n\n\tif enableProfiling {\n\t\t// Start profiling\n\t\tf, err := os.Create(filepath.Join(exeDirPath, \"cpu.prf\"))\n\t\tif err == nil {\n\t\t\t_ = pprof.StartCPUProfile(f)\n\t\t\tdefer pprof.StopCPUProfile()\n\t\t}\n\t}\n\n\t// Print banner before starting\n\tprintBanner()\n\n\tus := server.UdpServer{}\n\terr = us.Start(exeDirPath, 4)\n\tif err != nil {\n\t\tfmt.Printf(\"\\n  %s❌ Failed to start server:%s %v\\n\\n\", colorYellow, colorReset, err)\n\t\treturn err\n\t}\n\n\t// Print server info after successful start\n\tprintServerInfo(&us)\n\n\t// react to terminate signals\n\ttermCh := make(chan os.Signal, 1)\n\tsignal.Notify(termCh, syscall.SIGTERM, os.Interrupt)\n\n\t// block until terminated\n\t<-termCh\n\n\tfmt.Printf(\"\\n  %s🛑 Shutting down server...%s\\n\", colorYellow, colorReset)\n\tus.Stop()\n\tfmt.Printf(\"  %s✅ Server stopped gracefully%s\\n\\n\", colorGreen, colorReset)\n\n\treturn nil\n}\n"
  },
  {
    "path": "endpoints/server/msghandler.go",
    "content": "package server\n\nimport (\n\t\"encoding/base64\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"time\"\n\n\t\"github.com/OpenNHP/opennhp/nhp/common\"\n\t\"github.com/OpenNHP/opennhp/nhp/core\"\n\twasmEngine \"github.com/OpenNHP/opennhp/nhp/core/wasm/engine\"\n\t\"github.com/OpenNHP/opennhp/nhp/log\"\n\tutils \"github.com/OpenNHP/opennhp/nhp/utils\"\n)\n\n// HandleOTPRequest\n// Server will not respond to agent's otp request\nfunc (s *UdpServer) HandleOTPRequest(ppd *core.PacketParserData) (err error) {\n\tdefer s.wg.Done()\n\ts.wg.Add(1)\n\n\ttransactionId := ppd.SenderTrxId\n\taddrStr := ppd.ConnData.RemoteAddr.String()\n\n\totpMsg := &common.AgentOTPMsg{}\n\terr = json.Unmarshal(ppd.BodyMessage, otpMsg)\n\tif err != nil {\n\t\tlog.Error(\"server-agent(#%d@%s)[HandleOTPRequest] failed to parse %s message: %v\", transactionId, addrStr, core.HeaderTypeToString(ppd.HeaderType), err)\n\t\treturn err\n\t}\n\n\thandler := s.FindPluginHandler(otpMsg.AuthServiceId)\n\tif handler == nil {\n\t\treturn common.ErrAuthHandlerNotFound\n\t}\n\n\totpReq := &common.NhpOTPRequest{\n\t\tMsg: otpMsg,\n\t\tSrcAddr: &common.NetAddress{\n\t\t\tIp:   ppd.ConnData.RemoteAddr.IP.String(),\n\t\t\tPort: ppd.ConnData.RemoteAddr.Port,\n\t\t},\n\t}\n\n\terr = handler.RequestOTP(otpReq, s.NewNhpServerHelper(ppd))\n\tif err != nil {\n\t\tlog.Error(\"server-agent(%s#%d@%s)[HandleOTPRequest] error: %v\", otpMsg.UserId, transactionId, addrStr, err)\n\t\treturn err\n\t}\n\n\tlog.Info(\"server-agent(%s#%d@%s)[HandleOTPRequest] succeeded\", otpMsg.UserId, transactionId, addrStr)\n\treturn nil\n}\n\n// HandleRegisterRequest\n// Server will respond with success or error with NHP_RAK message\nfunc (s *UdpServer) HandleRegisterRequest(ppd *core.PacketParserData) (err error) {\n\tdefer s.wg.Done()\n\ts.wg.Add(1)\n\n\ttransactionId := ppd.SenderTrxId\n\taddrStr := ppd.ConnData.RemoteAddr.String()\n\tregMsg := &common.AgentRegisterMsg{}\n\trakMsg := &common.ServerRegisterAckMsg{}\n\n\tfunc() {\n\t\terr = json.Unmarshal(ppd.BodyMessage, regMsg)\n\t\tif err != nil {\n\t\t\tlog.Error(\"server-agent(#%d@%s)[HandleRegisterRequest] failed to parse %s message: %v\", transactionId, addrStr, core.HeaderTypeToString(ppd.HeaderType), err)\n\t\t\trakMsg.ErrCode = common.ErrJsonParseFailed.ErrorCode()\n\t\t\trakMsg.ErrMsg = err.Error()\n\t\t\treturn\n\t\t}\n\n\t\thandler := s.FindPluginHandler(regMsg.AuthServiceId)\n\t\tif handler == nil {\n\t\t\terr = common.ErrAuthHandlerNotFound\n\t\t\trakMsg.ErrCode = common.ErrAuthHandlerNotFound.ErrorCode()\n\t\t\trakMsg.ErrMsg = err.Error()\n\t\t\treturn\n\t\t}\n\n\t\tagentPubkey := base64.StdEncoding.EncodeToString(ppd.RemotePubKey)\n\n\t\tregReq := &common.NhpRegisterRequest{\n\t\t\tMsg:       regMsg,\n\t\t\tAck:       rakMsg,\n\t\t\tPublicKey: agentPubkey,\n\t\t\tSrcAddr: &common.NetAddress{\n\t\t\t\tIp:   ppd.ConnData.RemoteAddr.IP.String(),\n\t\t\t\tPort: ppd.ConnData.RemoteAddr.Port,\n\t\t\t},\n\t\t}\n\n\t\trakMsg, err = handler.RegisterAgent(regReq, s.NewNhpServerHelper(ppd))\n\t\tif err != nil {\n\t\t\tlog.Error(\"server-agent(%s#%d@%s)[HandleRegisterRequest] error: %v\", regMsg.UserId, transactionId, addrStr, err)\n\t\t\treturn\n\t\t}\n\n\t\tlog.Info(\"server-agent(%s#%d@%s)[HandleRegisterRequest] succeeded\", regMsg.UserId, transactionId, addrStr)\n\t}()\n\n\t// send NHP_RAK message\n\trakBytes, _ := json.Marshal(rakMsg)\n\trakMd := &core.MsgData{\n\t\tHeaderType:     core.NHP_RAK,\n\t\tTransactionId:  transactionId,\n\t\tCompress:       true,\n\t\tPrevParserData: ppd,\n\t\tMessage:        rakBytes,\n\t}\n\n\t// forward to a specific transaction\n\ttransaction := ppd.ConnData.FindRemoteTransaction(transactionId)\n\tif transaction == nil {\n\t\tlog.Error(\"server-agent(%s#%d@%s)[HandleRegisterRequest] transaction is not available\", regMsg.UserId, transactionId, addrStr)\n\t\terr = common.ErrTransactionIdNotFound\n\t\treturn err\n\t}\n\n\ttransaction.NextMsgCh <- rakMd\n\n\treturn err\n}\n\n// HandleListRequest\n// Server will respond with success or error with NHP_LRT message\nfunc (s *UdpServer) HandleListRequest(ppd *core.PacketParserData) (err error) {\n\tdefer s.wg.Done()\n\ts.wg.Add(1)\n\n\ttransactionId := ppd.SenderTrxId\n\taddrStr := ppd.ConnData.RemoteAddr.String()\n\tlstMsg := &common.AgentListMsg{}\n\tlrtMsg := &common.ServerListResultMsg{}\n\n\tfunc() {\n\t\terr = json.Unmarshal(ppd.BodyMessage, lstMsg)\n\t\tif err != nil {\n\t\t\tlog.Error(\"server-agent(#%d@%s)[HandleListRequest] failed to parse %s message: %v\", transactionId, addrStr, core.HeaderTypeToString(ppd.HeaderType), err)\n\t\t\tlrtMsg.ErrCode = common.ErrJsonParseFailed.ErrorCode()\n\t\t\tlrtMsg.ErrMsg = err.Error()\n\t\t\treturn\n\t\t}\n\n\t\thandler := s.FindPluginHandler(lstMsg.AuthServiceId)\n\t\tif handler == nil {\n\t\t\terr = common.ErrAuthHandlerNotFound\n\t\t\tlrtMsg.ErrCode = common.ErrAuthHandlerNotFound.ErrorCode()\n\t\t\tlrtMsg.ErrMsg = err.Error()\n\t\t\treturn\n\t\t}\n\n\t\tagentPubkey := base64.StdEncoding.EncodeToString(ppd.RemotePubKey)\n\t\tlistReq := &common.NhpListRequest{\n\t\t\tMsg:       lstMsg,\n\t\t\tAck:       lrtMsg,\n\t\t\tPublicKey: agentPubkey,\n\t\t\tSrcAddr: &common.NetAddress{\n\t\t\t\tIp:   ppd.ConnData.RemoteAddr.IP.String(),\n\t\t\t\tPort: ppd.ConnData.RemoteAddr.Port,\n\t\t\t},\n\t\t}\n\n\t\tlrtMsg, err = handler.ListService(listReq, s.NewNhpServerHelper(ppd))\n\t\tif err != nil {\n\t\t\tlog.Error(\"server-agent(%s#%d@%s)[HandleListRequest] error: %v\", lstMsg.UserId, transactionId, addrStr, err)\n\t\t\treturn\n\t\t}\n\n\t\tlog.Info(\"server-agent(%s#%d@%s)[HandleListRequest] succeeded\", lstMsg.UserId, transactionId, addrStr)\n\t}()\n\n\tlrtBytes, _ := json.Marshal(lrtMsg)\n\tackMd := &core.MsgData{\n\t\tHeaderType:     core.NHP_LRT,\n\t\tTransactionId:  transactionId,\n\t\tCompress:       true,\n\t\tPrevParserData: ppd,\n\t\tMessage:        lrtBytes,\n\t}\n\n\t// forward to a specific transaction\n\ttransaction := ppd.ConnData.FindRemoteTransaction(transactionId)\n\tif transaction == nil {\n\t\tlog.Error(\"server-agent(%s#%d@%s)[HandleListRequest] transaction is not available\", lstMsg.UserId, transactionId, addrStr)\n\t\terr = common.ErrTransactionIdNotFound\n\t\treturn err\n\t}\n\n\ttransaction.NextMsgCh <- ackMd\n\n\treturn err\n}\n\nfunc (s *UdpServer) HandleACOnline(ppd *core.PacketParserData) (err error) {\n\tdefer s.wg.Done()\n\ts.wg.Add(1)\n\n\ttransactionId := ppd.SenderTrxId\n\taddrStr := ppd.ConnData.RemoteAddr.String()\n\taolMsg := &common.ACOnlineMsg{}\n\n\terr = json.Unmarshal(ppd.BodyMessage, aolMsg)\n\tif err != nil {\n\t\tlog.Error(\"server-ac(#%d@%s)[HandleACOnline] failed to parse %s message: %v\", transactionId, addrStr, core.HeaderTypeToString(ppd.HeaderType), err)\n\t\treturn err\n\t}\n\n\tacId := aolMsg.ACId\n\tacPubkeyBase64 := base64.StdEncoding.EncodeToString(ppd.RemotePubKey)\n\ts.acPeerMapMutex.Lock()\n\tacPeer := s.acPeerMap[acPubkeyBase64] // ac peer's recvAddr has already been updated by nhp packet parser\n\ts.acPeerMapMutex.Unlock()\n\n\tacConn := &ACConn{\n\t\tConnData:       ppd.ConnData,\n\t\tACPeer:         acPeer,\n\t\tACCipherScheme: ppd.CipherScheme,\n\t\tACId:           acId,\n\t\tServiceId:      aolMsg.AuthServiceId,\n\t\tApps:           aolMsg.ResourceIds,\n\t}\n\n\ts.acConnectionMapMutex.Lock()\n\ts.acConnectionMap[acId] = acConn\n\ts.acConnectionMapMutex.Unlock()\n\n\taakMsg := &common.ServerACAckMsg{\n\t\tErrCode: common.ErrSuccess.ErrorCode(),\n\t\tACAddr:  ppd.ConnData.RemoteAddr.String(),\n\t}\n\taakBytes, _ := json.Marshal(aakMsg)\n\n\taakMd := &core.MsgData{\n\t\tHeaderType:     core.NHP_AAK,\n\t\tTransactionId:  transactionId,\n\t\tCompress:       true,\n\t\tPrevParserData: ppd,\n\t\tMessage:        aakBytes,\n\t}\n\n\t// forward to a specific transaction\n\ttransaction := ppd.ConnData.FindRemoteTransaction(transactionId)\n\tif transaction == nil {\n\t\tlog.Error(\"server-ac(@%s#%d@%s)[HandleACOnline] transaction is not available\", acId, transactionId, addrStr)\n\t\terr = common.ErrTransactionIdNotFound\n\t\treturn err\n\t}\n\n\ttransaction.NextMsgCh <- aakMd\n\n\treturn nil\n}\n\nfunc (s *UdpServer) HandleDBOnline(ppd *core.PacketParserData) (err error) {\n\tdefer s.wg.Done()\n\ts.wg.Add(1)\n\n\ttransactionId := ppd.SenderTrxId\n\taddrStr := ppd.ConnData.RemoteAddr.String()\n\tdolMsg := &common.DBOnlineMsg{}\n\n\terr = json.Unmarshal(ppd.BodyMessage, dolMsg)\n\tif err != nil {\n\t\tlog.Error(\"server-db(#%d@%s)[HandleDBOnline] failed to parse %s message: %v\", transactionId, addrStr, core.HeaderTypeToString(ppd.HeaderType), err)\n\t\treturn err\n\t}\n\n\tdbId := dolMsg.DBId\n\tdbPubkeyBase64 := base64.StdEncoding.EncodeToString(ppd.RemotePubKey)\n\ts.dbPeerMapMutex.Lock()\n\tdbPeer := s.dbPeerMap[dbPubkeyBase64] // ac peer's recvAddr has already been updated by nhp packet parser\n\ts.dbPeerMapMutex.Unlock()\n\n\tdbConn := &DBConn{\n\t\tConnData:       ppd.ConnData,\n\t\tDBPeer:         dbPeer,\n\t\tDBCipherScheme: ppd.CipherScheme,\n\t\tDBId:           dbId,\n\t}\n\n\ts.dbConnectionMapMutex.Lock()\n\ts.dbConnectionMap[dbId] = dbConn\n\ts.dbConnectionMapMutex.Unlock()\n\n\taakMsg := &common.ServerDBAckMsg{\n\t\tErrCode: common.ErrSuccess.ErrorCode(),\n\t\tDBAddr:  ppd.ConnData.RemoteAddr.String(),\n\t}\n\taakBytes, _ := json.Marshal(aakMsg)\n\n\taakMd := &core.MsgData{\n\t\tHeaderType:     core.NHP_DBA,\n\t\tTransactionId:  transactionId,\n\t\tCompress:       true,\n\t\tPrevParserData: ppd,\n\t\tMessage:        aakBytes,\n\t}\n\n\t// forward to a specific transaction\n\ttransaction := ppd.ConnData.FindRemoteTransaction(transactionId)\n\tif transaction == nil {\n\t\tlog.Error(\"server-db(@%s#%d@%s)[HandleDBOnline] transaction is not available\", dbId, transactionId, addrStr)\n\t\terr = common.ErrTransactionIdNotFound\n\t\treturn err\n\t}\n\n\ttransaction.NextMsgCh <- aakMd\n\n\treturn nil\n}\n\nfunc (s *UdpServer) HandleDHPDARMessage(ppd *core.PacketParserData) (err error) {\n\tdefer s.wg.Done()\n\ts.wg.Add(1)\n\n\ttransactionId := ppd.SenderTrxId\n\taddrStr := ppd.ConnData.RemoteAddr.String()\n\tdarMsg := &common.DARMsg{}\n\n\terr = json.Unmarshal(ppd.BodyMessage, darMsg)\n\tif err != nil {\n\t\tlog.Error(\"server-agent(#%d@%s)[HandleDHPDARMessage] failed to parse %s message: %v\", transactionId, addrStr, core.HeaderTypeToString(ppd.HeaderType), err)\n\t\treturn err\n\t}\n\n\tdoId := darMsg.DoId\n\tconfig, err := ReadZdtoConfig(doId)\n\tdsaMsg := &common.DSAMsg{}\n\tif err != nil {\n\t\tdsaMsg.DoId = doId\n\t\tdsaMsg.ErrCode = 1\n\t\tdsaMsg.ErrMsg = err.Error()\n\t} else {\n\t\tdsaMsg.DoId = doId\n\t\tdsaMsg.SpoId = config.Spo.PolicyId\n\t\tdsaMsg.Spo = &config.Spo\n\t\tdsaMsg.TTL = int((30 * time.Minute).Milliseconds())\n\t\ts.UpdateTeePublicKeyAndConsumerEphemeralPublicKey(darMsg.TeePublicKey, darMsg.ConsumerEphemeralPublicKey, ppd.RemotePubKey)\n\t}\n\n\taakBytes, _ := json.Marshal(dsaMsg)\n\tlog.Debug(\"dagMsg:%s\", (string)(aakBytes))\n\taakMd := &core.MsgData{\n\t\tHeaderType:     core.NHP_DSA,\n\t\tTransactionId:  transactionId,\n\t\tCompress:       true,\n\t\tPrevParserData: ppd,\n\t\tMessage:        aakBytes,\n\t}\n\t// forward to a specific transaction\n\ttransaction := ppd.ConnData.FindRemoteTransaction(transactionId)\n\tif transaction == nil {\n\t\tlog.Error(\"server-agent(@%s#%d@%s)[HandleDHPDARMessage] transaction is not available\", doId, transactionId, addrStr)\n\t\terr = common.ErrTransactionIdNotFound\n\t\treturn err\n\t}\n\n\ttransaction.NextMsgCh <- aakMd\n\n\treturn nil\n}\n\nfunc (s *UdpServer) HandleDHPDAVMessage(ppd *core.PacketParserData) (err error) {\n\tdefer s.wg.Done()\n\ts.wg.Add(1)\n\n\ttransactionId := ppd.SenderTrxId\n\taddrStr := ppd.ConnData.RemoteAddr.String()\n\tdavMsg := &common.DAVMsg{}\n\n\terr = json.Unmarshal(ppd.BodyMessage, davMsg)\n\tif err != nil {\n\t\tlog.Error(\"server-agent(#%d@%s)[HandleDHPDAVMessage] failed to parse %s message: %v\", transactionId, addrStr, core.HeaderTypeToString(ppd.HeaderType), err)\n\t\treturn err\n\t}\n\n\tdoId := davMsg.DoId\n\tconfig, err := ReadZdtoConfig(doId)\n\n\tif err := s.onAttestationVerify(&config.Spo, davMsg.Evidence); err != nil {\n\t\tlog.Error(\"server-agent(#%d@%s)[HandleDHPDAVMessage] failed to verify attesation: %s with error: %s\", transactionId, addrStr, davMsg.Evidence, err.Error())\n\t\treturn err\n\t}\n\n\tdagMsg := &common.DAGMsg{}\n\tif err != nil {\n\t\tdagMsg.DoId = doId\n\t\tdagMsg.ErrCode = 1\n\t\tdagMsg.ErrMsg = err.Error()\n\t} else {\n\t\tdagMsg.DoId = doId\n\n\t\tteePublicKey, consumerEphemeralPublicKey := s.GetTeePublicKeyBase64AndConsumerEphemeralPublicKeyBase64(ppd.RemotePubKey)\n\n\t\tdwrMsg := &common.DWRMsg{\n\t\t\tDoId:                       doId,\n\t\t\tTeePublicKey:               teePublicKey,\n\t\t\tConsumerEphemeralPublicKey: consumerEphemeralPublicKey,\n\t\t}\n\n\t\tdbConn, found := s.dbConnectionMap[config.DbId]\n\t\tif !found {\n\t\t\tlog.Critical(\"dbConn not found for dbId:%s\", config.DbId)\n\t\t\terr = common.ErrDBOffline\n\t\t\tdagMsg.ErrCode = 1\n\t\t\tdagMsg.ErrMsg = err.Error()\n\t\t} else {\n\t\t\tdwaMsg, err := s.ProcessDataPrivateKeyWrapping(dwrMsg, dbConn)\n\t\t\tif err != nil || dwaMsg.ErrCode != 0 {\n\t\t\t\tdagMsg.ErrCode = dwaMsg.ErrCode\n\t\t\t\tdagMsg.ErrMsg = dwaMsg.ErrMsg\n\t\t\t}\n\n\t\t\tdagMsg.Kao = dwaMsg.Kao\n\t\t\tdagMsg.Spo = &config.Spo\n\t\t\tdagMsg.DataSourceType = config.DataSourceType\n\t\t\tdagMsg.AccessUrl = config.AccessUrl\n\t\t\tdagMsg.AccessByNHP = config.AccessByNHP\n\t\t\tdagMsg.DoType = config.DoType\n\t\t}\n\t}\n\n\taakBytes, _ := json.Marshal(dagMsg)\n\tlog.Debug(\"dagMsg:%s\", (string)(aakBytes))\n\taakMd := &core.MsgData{\n\t\tHeaderType:     core.NHP_DAG,\n\t\tTransactionId:  transactionId,\n\t\tCompress:       true,\n\t\tPrevParserData: ppd,\n\t\tMessage:        aakBytes,\n\t}\n\t// forward to a specific transaction\n\ttransaction := ppd.ConnData.FindRemoteTransaction(transactionId)\n\tif transaction == nil {\n\t\tlog.Error(\"server-agent(@%s#%d@%s)[HandleDHPDARMessage] transaction is not available\", doId, transactionId, addrStr)\n\t\terr = common.ErrTransactionIdNotFound\n\t\treturn err\n\t}\n\n\ttransaction.NextMsgCh <- aakMd\n\n\treturn nil\n}\n\n// HandleDHPDRGMessage\nfunc (s *UdpServer) HandleDHPDRGMessage(ppd *core.PacketParserData) (err error) {\n\tdefer s.wg.Done()\n\ts.wg.Add(1)\n\n\ttransactionId := ppd.SenderTrxId\n\taddrStr := ppd.ConnData.RemoteAddr.String()\n\taolMsg := &common.DRGMsg{}\n\n\terr = json.Unmarshal(ppd.BodyMessage, aolMsg)\n\tif err != nil {\n\t\tlog.Error(\"server-Device(#%d@%s)[HandleDHPDRGMessage] failed to parse %s message: %v\", transactionId, addrStr, core.HeaderTypeToString(ppd.HeaderType), err)\n\t\treturn err\n\t}\n\n\tdoId := aolMsg.DoId\n\n\terr = SaveZdtoConfig(aolMsg)\n\n\terrCode := 0 //success\n\terrMsg := \"\"\n\n\tif err != nil {\n\t\terrCode = 1\n\t\terrMsg = err.Error()\n\t}\n\n\taakMsg := &common.DAKMsg{\n\t\tDoId:    doId,\n\t\tErrCode: errCode,\n\t\tErrMsg:  errMsg,\n\t}\n\taakBytes, _ := json.Marshal(aakMsg)\n\n\taakMd := &core.MsgData{\n\t\tHeaderType:     core.NHP_DAK,\n\t\tTransactionId:  transactionId,\n\t\tCompress:       true,\n\t\tPrevParserData: ppd,\n\t\tMessage:        aakBytes,\n\t}\n\n\t// forward to a specific transaction\n\n\ttransaction := ppd.ConnData.FindRemoteTransaction(transactionId)\n\tif transaction == nil {\n\t\tlog.Error(\"server-DB(@%s#%d@%s)[HandleDHPDRGMessage] transaction is not available\", doId, transactionId, addrStr)\n\t\terr = common.ErrTransactionIdNotFound\n\t\treturn err\n\t}\n\ttransaction.NextMsgCh <- aakMd\n\treturn nil\n}\n\nfunc (s *UdpServer) onAttestationVerify(spo *common.SmartPolicy, attestation string) error {\n\tif spo.Policy == \"\" {\n\t\treturn nil\n\t}\n\n\twasmBytes, err := base64.StdEncoding.DecodeString(spo.Policy)\n\tif err != nil {\n\t\twasmPath, err := utils.DownloadFileToTemp(spo.Policy, \"wasm-\")\n\t\tdefer os.Remove(filepath.Dir(wasmPath))\n\t\tdefer os.Remove(wasmPath)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\twasmBytes, err = os.ReadFile(wasmPath)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tengine := wasmEngine.NewEngine()\n\terr = engine.LoadWasm(wasmBytes)\n\tdefer engine.Close()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif engine.OnAttestationVerify(attestation) {\n\t\treturn nil\n\t} else {\n\t\treturn fmt.Errorf(\"attestation verification failed\")\n\t}\n}\n\nfunc SaveZdtoConfig(drgMsg *common.DRGMsg) error {\n\tobjectId := drgMsg.DoId\n\tconfigFileName := \"data-\" + objectId + \".json\"\n\n\tetcDir := filepath.Join(ExeDirPath, \"etc\", \"ztdo\")\n\tconfigPath := filepath.Join(etcDir, configFileName)\n\n\tif existingDrgMsg, err := ReadZdtoConfig(objectId); err == nil {\n\t\t// alway keep original date source type\n\t\tdrgMsg.DataSourceType = existingDrgMsg.DataSourceType\n\n\t\tif drgMsg.AccessUrl == \"\" { // provider update access url\n\t\t\tdrgMsg.AccessUrl = existingDrgMsg.AccessUrl\n\t\t}\n\n\t\tos.Remove(configPath)\n\t}\n\n\t// Make sure the etc directory exists\n\tif err := os.MkdirAll(etcDir, 0755); err != nil {\n\t\treturn fmt.Errorf(\"failed to create etc directory: %v\", err)\n\t}\n\n\tif _, err := os.Stat(configPath); err == nil {\n\t\treturn fmt.Errorf(\"%v already exists, please delete it first\", configFileName)\n\t}\n\n\tfile, err := os.Create(configPath)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to create config.json: %v\", err)\n\t}\n\tdefer file.Close()\n\n\tencoder := json.NewEncoder(file)\n\tencoder.SetIndent(\"\", \"  \")\n\treturn encoder.Encode(drgMsg)\n}\n\n// read data-<doId>.json to DRGMsg Object\nfunc ReadZdtoConfig(doId string) (common.DRGMsg, error) {\n\tetcDir := filepath.Join(ExeDirPath, \"etc\", \"ztdo\")\n\tconfigFilePath := filepath.Join(etcDir, \"data-\"+doId+\".json\")\n\tfile, err := os.Open(configFilePath)\n\tif err != nil {\n\t\treturn common.DRGMsg{}, fmt.Errorf(\"could not open file: %v\", err)\n\t}\n\tdefer file.Close()\n\n\tfileContentByte, err := io.ReadAll(file)\n\tif err != nil {\n\t\treturn common.DRGMsg{}, fmt.Errorf(\"error reading file: %v\", err)\n\t}\n\n\tvar config common.DRGMsg\n\n\terr = json.Unmarshal(fileContentByte, &config)\n\tif err != nil {\n\t\treturn common.DRGMsg{}, fmt.Errorf(\"json parsing error: %s\", err)\n\t}\n\treturn config, nil\n}\n"
  },
  {
    "path": "endpoints/server/nhpauth.go",
    "content": "package server\n\nimport (\n\t\"encoding/base64\"\n\t\"encoding/json\"\n\n\t\"github.com/OpenNHP/opennhp/nhp/common\"\n\t\"github.com/OpenNHP/opennhp/nhp/core\"\n\t\"github.com/OpenNHP/opennhp/nhp/log\"\n)\n\n// HandleKnockRequest\n// Server will respond with success or error with NHP_ACK message\nfunc (s *UdpServer) HandleKnockRequest(ppd *core.PacketParserData) (err error) {\n\tdefer s.wg.Done()\n\ts.wg.Add(1)\n\n\ttransactionId := ppd.SenderTrxId\n\taddrStr := ppd.ConnData.RemoteAddr.String()\n\tknkMsg := &common.AgentKnockMsg{}\n\tdhpKnkMsg := &common.DHPKnockMsg{}\n\tackMsg := &common.ServerKnockAckMsg{\n\t\tAgentAddr: addrStr, // optional, to tell agent its own outwards ip address\n\t}\n\tdhpAckMsg := &common.ServerDHPKnockAckMsg{\n\t\tOpenTime: 30, // currently, use fixed value, unit is seconds.\n\t}\n\n\tfunc() {\n\t\t// parse knockMsg\n\t\tif ppd.HeaderType == core.DHP_KNK { // dhp knock\n\t\t\terr = json.Unmarshal(ppd.BodyMessage, dhpKnkMsg)\n\t\t} else {\n\t\t\terr = json.Unmarshal(ppd.BodyMessage, knkMsg)\n\t\t}\n\n\t\tif err != nil {\n\t\t\tlog.Error(\"server-agent(#%d@%s)[HandleKnockRequest] failed to parse %s message: %v\", transactionId, addrStr, core.HeaderTypeToString(ppd.HeaderType), err)\n\t\t\tackMsg.ErrCode = common.ErrJsonParseFailed.ErrorCode()\n\t\t\tackMsg.ErrMsg = err.Error()\n\t\t\treturn\n\t\t}\n\n\t\t// dhp knock\n\t\tif ppd.HeaderType == core.DHP_KNK {\n\t\t\tlog.Info(\"server-agent(%s#%d@%s)[HandleKnockRequest] start to verify evidence for dhp knock\", knkMsg.UserId, transactionId, addrStr)\n\t\t\tif s.AppraiseEvidence(dhpKnkMsg.Evidence) {\n\t\t\t\tdhpAckMsg.ErrCode = common.ErrSuccess.ErrorCode()\n\t\t\t} else {\n\t\t\t\tdhpAckMsg.ErrCode = common.ErrEvidenceAppraisalFailed.ErrorCode()\n\t\t\t}\n\t\t\treturn\n\t\t}\n\n\t\t// determine knock type\n\t\tknkMsg.HeaderType = ppd.HeaderType\n\n\t\t// find out auth service provider\n\t\taspData := s.FindAuthSvcProvider(knkMsg.AuthServiceId)\n\t\tif aspData == nil {\n\t\t\terr = common.ErrAuthServiceProviderNotFound\n\t\t\tackMsg.ErrCode = common.ErrAuthServiceProviderNotFound.ErrorCode()\n\t\t\tackMsg.ErrMsg = err.Error()\n\t\t\treturn\n\t\t}\n\n\t\t// find out auth plugin handler\n\t\thandler := s.FindPluginHandler(knkMsg.AuthServiceId)\n\t\tif handler == nil {\n\t\t\tlog.Error(\"server-agent(%s#%d@%s)[HandleKnockRequest-Auth] failed to find service provider with %s\", knkMsg.UserId, transactionId, addrStr, knkMsg.AuthServiceId)\n\t\t\terr = common.ErrAuthServiceProviderNotFound\n\t\t\tackMsg.ErrCode = common.ErrAuthServiceProviderNotFound.ErrorCode()\n\t\t\tackMsg.ErrMsg = err.Error()\n\t\t\treturn\n\t\t}\n\n\t\tauthReq := &common.NhpAuthRequest{\n\t\t\tMsg:       knkMsg,\n\t\t\tAck:       ackMsg,\n\t\t\tPublicKey: base64.StdEncoding.EncodeToString(ppd.RemotePubKey),\n\t\t\tSrcAddr: &common.NetAddress{\n\t\t\t\tIp:   ppd.ConnData.RemoteAddr.IP.String(),\n\t\t\t\tPort: ppd.ConnData.RemoteAddr.Port,\n\t\t\t},\n\t\t}\n\n\t\t// perform knock auth and open ip rule from the agent src address and resource dst address\n\t\tackMsg, err = handler.AuthWithNHP(authReq, s.NewNhpServerHelper(ppd))\n\t\tif err != nil {\n\t\t\tlog.Info(\"server-agent(%s#%d@%s)[HandleKnockRequest] failed: %+v\", knkMsg.UserId, transactionId, addrStr, err)\n\t\t\treturn\n\t\t}\n\n\t\tlog.Info(\"server-agent(%s#%d@%s)[HandleKnockRequest] succeed: %+v\", knkMsg.UserId, transactionId, addrStr)\n\t}()\n\n\t// send back knock ack response\n\tackBytes, _ := json.Marshal(ackMsg)\n\n\t// DHP knock\n\tif ppd.HeaderType == core.DHP_KNK {\n\t\tackBytes, _ = json.Marshal(dhpAckMsg)\n\t}\n\n\tackMd := &core.MsgData{\n\t\tHeaderType:     core.NHP_ACK,\n\t\tTransactionId:  transactionId, // transactionId of the original knock request\n\t\tCompress:       true,\n\t\tPrevParserData: ppd,\n\t\tMessage:        ackBytes,\n\t}\n\n\t// forward to a specific transaction\n\ttransaction := ppd.ConnData.FindRemoteTransaction(transactionId)\n\tif transaction == nil {\n\t\tlog.Error(\"server-agent(%s#%d@%s)[HandleKnockRequest] transaction is not available\", knkMsg.UserId, transactionId, addrStr)\n\t\terr = common.ErrTransactionIdNotFound\n\t\treturn err\n\t}\n\n\ttransaction.NextMsgCh <- ackMd\n\treturn nil\n}\n"
  },
  {
    "path": "endpoints/server/tokenstore.go",
    "content": "package server\n\nimport (\n\t\"encoding/base64\"\n\t\"encoding/binary\"\n\t\"time\"\n\n\t\"github.com/emmansun/gmsm/sm3\"\n\n\t\"github.com/OpenNHP/opennhp/nhp/common\"\n)\n\n// ACTokenEntry represents a server access token entry that maps to multiple AC tokens.\ntype ACTokenEntry struct {\n\tUser       *common.AgentUser\n\tResourceId string\n\tACTokens   map[string]string\n\tOpenTime   int\n\tExpireTime time.Time\n}\n\n// GetExpireTime implements the common.TokenEntry interface.\nfunc (e *ACTokenEntry) GetExpireTime() time.Time {\n\treturn e.ExpireTime\n}\n\n// GenerateAccessToken creates a new access token for the given entry.\nfunc (s *UdpServer) GenerateAccessToken(entry *ACTokenEntry) string {\n\tvar tsBytes [8]byte\n\tcurrTime := time.Now().UnixNano()\n\n\thash := sm3.New()\n\tbinary.BigEndian.PutUint64(tsBytes[:], uint64(currTime))\n\tau := entry.User\n\thash.Write([]byte(s.config.Hostname + au.UserId + au.DeviceId + au.OrganizationId + au.AuthServiceId))\n\thash.Write(tsBytes[:])\n\ttoken := base64.StdEncoding.EncodeToString(hash.Sum(nil))\n\thash.Reset()\n\n\tentry.ExpireTime = time.Now().Add(time.Duration(entry.OpenTime) * time.Second)\n\ts.tokenStore.Store(token, entry)\n\n\treturn token\n}\n\n// VerifyAccessToken validates a token and returns the entry if found.\n// Unlike AC's version, this does not extend the expiry time.\nfunc (s *UdpServer) VerifyAccessToken(token string) *ACTokenEntry {\n\tentry, found := s.tokenStore.Load(token)\n\tif found {\n\t\treturn entry\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "endpoints/server/udpserver.go",
    "content": "package server\n\nimport (\n\t\"encoding/base64\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"net\"\n\t\"path/filepath\"\n\t\"strconv\"\n\t\"sync\"\n\t\"sync/atomic\"\n\t\"time\"\n\n\t\"github.com/OpenNHP/opennhp/nhp/etcd\"\n\n\t\"github.com/pion/webrtc/v4\"\n\n\t\"github.com/OpenNHP/opennhp/nhp/common\"\n\t\"github.com/OpenNHP/opennhp/nhp/core\"\n\t\"github.com/OpenNHP/opennhp/nhp/log\"\n\t\"github.com/OpenNHP/opennhp/nhp/plugins\"\n\t\"github.com/OpenNHP/opennhp/nhp/utils\"\n\t\"github.com/OpenNHP/opennhp/nhp/version\"\n)\n\nvar (\n\tExeDirPath string\n)\n\ntype UdpServer struct {\n\tstats struct {\n\t\ttotalRecvBytes uint64\n\t\ttotalSendBytes uint64\n\t}\n\n\tconfig     *Config\n\thttpConfig *HttpConfig\n\tlog        *log.Logger\n\tlistenAddr *net.UDPAddr\n\tlistenConn *net.UDPConn\n\tlocalIp    string\n\tlocalMac   string\n\n\tdevice       *core.Device\n\thttpServer   *HttpServer\n\twebrtcServer *WebRTCServer\n\twg           sync.WaitGroup\n\trunning      atomic.Bool\n\n\t// connection and remote transaction management\n\n\tremoteConnectionMapMutex sync.Mutex\n\tremoteConnectionMap      map[string]*UdpConn // indexed by remote UDP address\n\n\tagentPeerMapMutex sync.Mutex\n\tagentPeerMap      map[string]*core.UdpPeer // indexed by peer's public key base64 string\n\n\tacConnectionMapMutex sync.Mutex\n\tacConnectionMap      map[string]*ACConn // ac connection is indexed by remote IP address\n\n\tacPeerMapMutex sync.Mutex\n\tacPeerMap      map[string]*core.UdpPeer // indexed by peer's public key base64 string\n\n\tdbConnectionMapMutex sync.Mutex\n\tdbConnectionMap      map[string]*DBConn // ac connection is indexed by remote IP address\n\n\ttokenStore *common.TokenStore[*ACTokenEntry]\n\n\t// block address management\n\tblockAddrMapMutex sync.Mutex\n\tblockAddrMap      map[string]*BlockAddr // indexed by remote UDP address, need lock for dynamic change\n\n\t// address association map\n\tsrcIpAssociatedAddrMapMutex sync.Mutex\n\tsrcIpAssociatedAddrMap      map[string][]*common.NetAddress // indexed by source ip\n\n\t// preset asp-resource-address map\n\tauthServiceMapMutex sync.Mutex\n\tauthServiceMap      common.AuthSvcProviderMap // indexed by asp id and then resource id\n\n\t// plugin handlers\n\tpluginHandlerMapMutex sync.Mutex\n\tpluginHandlerMap      map[string]plugins.PluginHandler\n\n\t// signals\n\tsignals struct {\n\t\tstop chan struct{}\n\t}\n\n\trecvMsgCh <-chan *core.PacketParserData\n\tsendMsgCh chan *core.MsgData\n\n\t//NHP-DB\n\tdbPeerMapMutex sync.Mutex\n\tdbPeerMap      map[string]*core.UdpPeer // indexed by peer's public key base64 string\n\n\tteeMapMutex sync.Mutex\n\tteeMap      map[string]*TeeAttestationReport // indexed by tee's measure\n\n\t// etcd client\n\tetcdConn                *etcd.EtcdConn\n\tremoteConfigUpdateMutex sync.Mutex\n}\n\ntype BlockAddr struct {\n\taddr       *net.UDPAddr\n\texpireTime time.Time\n}\n\ntype UdpConn struct {\n\tConnData       *core.ConnectionData\n\tisACConnection bool // Immutable. Don't change it after creation. Conn object is also stored in acConnectionMap which is indexed by ACId\n\tisDBConnection bool // Immutable. Don't change it after creation. Conn object is also stored in dbConnectionMap which is indexed by DBId\n\tisWebRTC       bool\n\tdc             *webrtc.DataChannel\n}\n\ntype ACConn struct {\n\tConnData       *core.ConnectionData\n\tACPeer         *core.UdpPeer\n\tACCipherScheme int\n\tACId           string\n\tServiceId      string\n\tApps           []string\n}\n\ntype DBConn struct {\n\tConnData       *core.ConnectionData\n\tDBPeer         *core.UdpPeer\n\tDBCipherScheme int\n\tDBId           string\n}\n\ntype TeeAttestationReport struct {\n\tMeasure      string `json:\"measure\"`\n\tSerialNumber string `json:\"serialNumber\"`\n\tVerified     bool   `json:\"verified\"`\n}\n\ntype TeeAttestationReports struct {\n\tTEEs []*TeeAttestationReport `json:\"tees\"`\n}\n\nfunc (c *UdpConn) Close() {\n\tc.ConnData.Close()\n}\n\n/*\ndirPath: the path of app or shared library entry point\nlogLevel: 0: silent, 1: error, 2: info, 3: debug, 4: verbose\n*/\n// UDP server never actively sends first packet outwards. It only reacts to received packet then sends response.\nfunc (s *UdpServer) Start(dirPath string, logLevel int) (err error) {\n\tplugins.ExeDirPath = dirPath\n\tExeDirPath = dirPath\n\n\t// init logger\n\ts.log = log.NewLogger(\"NHP-Server\", logLevel, filepath.Join(ExeDirPath, \"logs\"), \"server\")\n\tlog.SetGlobalLogger(s.log)\n\n\tlog.Info(\"=========================================================\")\n\tlog.Info(\"=== NHP-Server %s started              ===\", version.Version)\n\tlog.Info(\"=== REVISION %s ===\", version.CommitId)\n\tlog.Info(\"=== RELEASE %s                       ===\", version.BuildTime)\n\tlog.Info(\"=========================================================\")\n\n\t// load remote config,init etcd client\n\terr = s.initRemoteConn()\n\tif err == nil && s.etcdConn == nil {\n\t\t// init config\n\t\terr = s.loadBaseConfig()\n\t} else {\n\t\t// nhp server base config must be loaded first.\n\t\terr = s.loadRemoteBaseConfig()\n\t}\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif s.config.WebRTC.Enable {\n\t\ts.webrtcServer = NewWebRTCServer(s, &s.config.WebRTC)\n\t\tif err := s.webrtcServer.Start(); err != nil {\n\t\t\tlog.Error(\"failed to start WebRTC server: %v\", err)\n\t\t}\n\t}\n\n\tvar netIP net.IP\n\tif len(s.config.ListenIp) > 0 {\n\t\tnetIP = net.ParseIP(s.config.ListenIp)\n\t\tif netIP == nil {\n\t\t\tlog.Error(\"udp listen ip address is incorrect!\")\n\t\t\treturn fmt.Errorf(\"udp listen ip address is incorrect\")\n\t\t}\n\t} else {\n\t\tnetIP = net.IPv4zero // will both listen on ipv4 0.0.0.0:port and ipv6 [::]:port\n\t}\n\n\ts.listenConn, err = net.ListenUDP(\"udp\", &net.UDPAddr{\n\t\tIP:   netIP,\n\t\tPort: s.config.ListenPort,\n\t})\n\tif err != nil {\n\t\tlog.Error(\"listen error: %v\", err)\n\t\treturn fmt.Errorf(\"listen error %v\", err)\n\t}\n\n\t// retrieve local port\n\tladdr := s.listenConn.LocalAddr()\n\ts.listenAddr, err = net.ResolveUDPAddr(laddr.Network(), laddr.String())\n\tif err != nil {\n\t\tlog.Error(\"resolve local UDPAddr error: %v\", err)\n\t\treturn fmt.Errorf(\"resolve UDPAddr error %v\", err)\n\t}\n\n\tprk, err := base64.StdEncoding.DecodeString(s.config.PrivateKeyBase64)\n\tif err != nil {\n\t\tlog.Error(\"private key parse error: %v\", err)\n\t\treturn fmt.Errorf(\"private key parse error %v\", err)\n\t}\n\n\toption := &core.DeviceOptions{\n\t\tDisableAgentPeerValidation: s.config.DisableAgentValidation,\n\t}\n\ts.device = core.NewDevice(core.NHP_SERVER, prk, option)\n\tif s.device == nil {\n\t\tlog.Critical(\"failed to create device: %v\", err)\n\t\treturn fmt.Errorf(\"failed to create device %v\", err)\n\t}\n\n\t// retrieve local ip and mac\n\ts.localIp = utils.GetLocalOutboundAddress().String()\n\ts.localMac = utils.GetMacAddress(s.localIp)\n\t// load asp resources and plugins\n\ts.pluginHandlerMap = make(map[string]plugins.PluginHandler)\n\tif s.etcdConn != nil {\n\t\t// load nhp server\n\t\t_ = s.loadRemoteConfig()\n\t} else {\n\t\t// load peers\n\t\t_ = s.loadPeers()\n\n\t\t// load http config and turn on http server if needed\n\t\t_ = s.loadHttpConfig()\n\n\t\t// load ip associated addresses\n\t\t_ = s.loadSourceIps()\n\n\t\t_ = s.loadResources()\n\t}\n\n\ts.remoteConnectionMap = make(map[string]*UdpConn)\n\ts.acConnectionMap = make(map[string]*ACConn)\n\ts.dbConnectionMap = make(map[string]*DBConn)\n\ts.tokenStore = common.NewTokenStore[*ACTokenEntry]()\n\ts.blockAddrMap = make(map[string]*BlockAddr)\n\ts.signals.stop = make(chan struct{})\n\n\ts.recvMsgCh = s.device.DecryptedMsgQueue\n\ts.sendMsgCh = make(chan *core.MsgData, core.SendQueueSize)\n\n\t// start device routines\n\ts.device.Start()\n\n\t// start server routines\n\ts.wg.Add(5)\n\tgo s.tokenStore.RunRefreshRoutine(&s.wg, s.signals.stop, TokenStoreRefreshInterval)\n\tgo s.BlockAddrRefreshRoutine()\n\tgo s.recvPacketRoutine()\n\tgo s.sendMessageRoutine()\n\tgo s.recvMessageRoutine()\n\n\ts.running.Store(true)\n\treturn nil\n}\n\nfunc (s *UdpServer) Stop() {\n\tif !s.running.Load() {\n\t\t// already stopped, do nothing\n\t\treturn\n\t}\n\ts.running.Store(false)\n\t// stop http server first\n\tif s.httpServer != nil {\n\t\ts.httpServer.Stop()\n\t}\n\tif s.etcdConn != nil {\n\t\ts.etcdConn.Close()\n\t}\n\tif s.webrtcServer != nil {\n\t\ts.webrtcServer.Stop()\n\t}\n\tclose(s.signals.stop)\n\ts.listenConn.Close()\n\ts.device.Stop()\n\ts.StopConfigWatch()\n\ts.wg.Wait()\n\tclose(s.sendMsgCh)\n\ts.ClosePlugins()\n\n\tlog.Info(\"==========================\")\n\tlog.Info(\"=== NHP-Server stopped ===\")\n\tlog.Info(\"==========================\")\n\ts.log.Close()\n}\n\n// GetListenPort returns the UDP listening port of the server\nfunc (s *UdpServer) GetListenPort() int {\n\tif s.listenAddr != nil {\n\t\treturn s.listenAddr.Port\n\t}\n\tif s.config != nil {\n\t\treturn s.config.ListenPort\n\t}\n\treturn 0\n}\n\n// GetHttpPort returns the HTTP listening port and whether HTTP is enabled\nfunc (s *UdpServer) GetHttpPort() (int, bool) {\n\tif s.httpConfig == nil || !s.httpConfig.EnableHttp {\n\t\treturn 0, false\n\t}\n\tport := s.httpConfig.HttpListenPort\n\tif port == 0 {\n\t\tport = s.GetListenPort() // falls back to UDP port\n\t}\n\treturn port, true\n}\n\n// GetHttpTLSStatus returns TLS status as a string\nfunc (s *UdpServer) GetHttpTLSStatus() string {\n\tif s.httpConfig != nil && s.httpConfig.EnableTLS {\n\t\treturn \"enabled\"\n\t}\n\treturn \"disabled\"\n}\n\nfunc (s *UdpServer) IsRunning() bool {\n\treturn s.running.Load()\n}\n\nfunc (s *UdpServer) SendPacket(pkt *core.Packet, conn *UdpConn) (n int, err error) {\n\tdefer func() {\n\t\tatomic.AddUint64(&s.stats.totalSendBytes, uint64(n))\n\t\tatomic.StoreInt64(&conn.ConnData.LastLocalSendTime, time.Now().UnixNano())\n\n\t\tif !pkt.KeepAfterSend {\n\t\t\ts.device.ReleasePoolPacket(pkt)\n\t\t}\n\t}()\n\n\tpktType := core.HeaderTypeToString(pkt.HeaderType)\n\tlog.Info(\"Send [%s] packet (%s -> %s), %d bytes\", pktType, s.listenAddr.String(), conn.ConnData.RemoteAddr.String(), len(pkt.Content))\n\tlog.Evaluate(\"Send [%s] packet (%s -> %s), %d bytes\", pktType, s.listenAddr.String(), conn.ConnData.RemoteAddr.String(), len(pkt.Content))\n\n\tif conn.isWebRTC && conn.dc != nil {\n\t\terr = conn.dc.Send(pkt.Content)\n\t\treturn len(pkt.Content), err\n\t}\n\n\treturn s.listenConn.WriteToUDP(pkt.Content, conn.ConnData.RemoteAddr)\n}\n\nfunc (s *UdpServer) recvPacketRoutine() {\n\tdefer s.wg.Done()\n\tdefer log.Debug(\"recvPacketRoutine stopped\")\n\n\tlog.Debug(\"recvPacketRoutine started\")\n\n\tpreCheckThreats := make(map[string]int32)\n\n\tfor {\n\t\tselect {\n\t\tcase <-s.signals.stop:\n\t\t\treturn\n\n\t\tdefault:\n\t\t}\n\n\t\t// allocate a new packet buffer for every read\n\t\tpkt := s.device.AllocatePoolPacket()\n\n\t\t// udp recv, blocking until packet arrives or conn.Close()\n\t\tn, remoteAddr, err := s.listenConn.ReadFromUDP(pkt.Buf[:])\n\t\tif err != nil {\n\t\t\ts.device.ReleasePoolPacket(pkt)\n\t\t\tlog.Error(\"Read from UDP error: %v\", err)\n\t\t\tif n == 0 {\n\t\t\t\t// listenConn closed\n\t\t\t\treturn\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\t\taddrStr := remoteAddr.String()\n\n\t\t// add total recv bytes\n\t\tatomic.AddUint64(&s.stats.totalRecvBytes, uint64(n))\n\n\t\t// check minimal length\n\t\tif n < pkt.MinimalLength() {\n\t\t\ts.device.ReleasePoolPacket(pkt)\n\t\t\tlog.Error(\"Received UDP packet from %s is too short, discard\", addrStr)\n\t\t\tcontinue\n\t\t}\n\n\t\t// check if it is from blocked address\n\t\tif s.IsBlockAddr(remoteAddr) {\n\t\t\ts.device.ReleasePoolPacket(pkt)\n\t\t\tlog.Critical(\"Remote address %s is being blocked at the moment, discard.\", addrStr)\n\t\t\tcontinue\n\t\t}\n\n\t\trecvTime := time.Now().UnixNano()\n\t\tpkt.Content = pkt.Buf[:n]\n\t\t//log.Trace(\"receive udp packet (%s -> %s): %+v\", addrStr, s.listenAddr.String(), pkt.Content)\n\n\t\ttyp, _, err := s.device.RecvPrecheck(pkt) // this check also records packet header type\n\t\tmsgType := core.HeaderTypeToString(typ)\n\t\tlog.Info(\"Receive [%s] packet (%s -> %s), %d bytes\", msgType, addrStr, s.listenAddr.String(), n)\n\t\tlog.Evaluate(\"Receive [%s] packet (%s -> %s), %d bytes\", msgType, addrStr, s.listenAddr.String(), n)\n\t\tif err != nil {\n\t\t\t// threat plus 1\n\t\t\tpreCheckThreats[addrStr]++\n\t\t\tif preCheckThreats[addrStr] > PreCheckThreatCountBeforeBlock {\n\t\t\t\ts.AddBlockAddr(remoteAddr)\n\t\t\t}\n\t\t\ts.device.ReleasePoolPacket(pkt)\n\t\t\tlog.Warning(\"Receive [%s] packet (%s -> %s), precheck error: %v\", msgType, addrStr, s.listenAddr.String(), err)\n\t\t\tlog.Evaluate(\"Receive [%s] packet (%s -> %s) precheck error: %v\", msgType, addrStr, s.listenAddr.String(), err)\n\t\t\tcontinue\n\t\t}\n\t\t// clear threat\n\t\tdelete(preCheckThreats, addrStr)\n\n\t\ts.remoteConnectionMapMutex.Lock()\n\t\tconn, found := s.remoteConnectionMap[addrStr]\n\t\ts.remoteConnectionMapMutex.Unlock()\n\n\t\tif found {\n\t\t\t// existing connection\n\t\t\tatomic.StoreInt64(&conn.ConnData.LastLocalRecvTime, recvTime)\n\t\t\tconn.ConnData.ForwardInboundPacket(pkt)\n\n\t\t} else {\n\t\t\t// create new connection if there is room\n\t\t\ts.remoteConnectionMapMutex.Lock()\n\t\t\tif len(s.remoteConnectionMap) > OverloadConnectionThreshold {\n\t\t\t\ts.device.SetOverload(true)\n\t\t\t} else if len(s.remoteConnectionMap) >= MaxConcurrentConnection {\n\t\t\t\ts.remoteConnectionMapMutex.Unlock()\n\t\t\t\tlog.Critical(\"Reached maximum concurrent connection, discarding packet from: %s\", addrStr)\n\t\t\t\ts.device.ReleasePoolPacket(pkt)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\ts.remoteConnectionMapMutex.Unlock()\n\n\t\t\tisACConn := pkt.HeaderType == core.NHP_AOL\n\t\t\tisDBConn := pkt.HeaderType == core.NHP_DOL\n\t\t\tconn = &UdpConn{\n\t\t\t\tisACConnection: isACConn,\n\t\t\t\tisDBConnection: isDBConn,\n\t\t\t}\n\t\t\t// setup new routine for connection\n\t\t\tconn.ConnData = &core.ConnectionData{\n\t\t\t\tInitTime:             recvTime,\n\t\t\t\tLastLocalRecvTime:    recvTime, // not in multithreaded yet, directly assign value\n\t\t\t\tDevice:               s.device,\n\t\t\t\tLocalAddr:            s.listenAddr,\n\t\t\t\tRemoteAddr:           remoteAddr,\n\t\t\t\tCookieStore:          &core.CookieStore{},\n\t\t\t\tRemoteTransactionMap: make(map[uint64]*core.RemoteTransaction),\n\t\t\t\tTimeoutMs:            DefaultAgentConnectionTimeoutMs,\n\t\t\t\tSendQueue:            make(chan *core.Packet, PacketQueueSizePerConnection),\n\t\t\t\tRecvQueue:            make(chan *core.Packet, PacketQueueSizePerConnection),\n\t\t\t\tBlockSignal:          make(chan struct{}),\n\t\t\t\tSetTimeoutSignal:     make(chan struct{}),\n\t\t\t\tStopSignal:           make(chan struct{}),\n\t\t\t}\n\n\t\t\tif conn.isACConnection {\n\t\t\t\tconn.ConnData.TimeoutMs = DefaultACConnectionTimeoutMs\n\t\t\t\tlog.Debug(\"Received new ac connection from %s\", addrStr)\n\t\t\t}\n\t\t\tif conn.isDBConnection {\n\t\t\t\tconn.ConnData.TimeoutMs = DefaultDBConnectionTimeoutMs\n\t\t\t\tlog.Debug(\"Received new db connection from %s\", addrStr)\n\t\t\t}\n\t\t\ts.remoteConnectionMapMutex.Lock()\n\t\t\ts.remoteConnectionMap[addrStr] = conn\n\t\t\ts.remoteConnectionMapMutex.Unlock()\n\n\t\t\tconn.ConnData.RecvQueue <- pkt\n\n\t\t\tlog.Info(\"Accept new UDP connection from %s to %s\", addrStr, s.listenAddr.String())\n\n\t\t\t// launch connection routine\n\t\t\ts.wg.Add(1)\n\t\t\tgo s.connectionRoutine(conn)\n\t\t}\n\t}\n}\n\nfunc (s *UdpServer) connectionRoutine(conn *UdpConn) {\n\taddrStr := conn.ConnData.RemoteAddr.String()\n\n\tdefer s.wg.Done()\n\tdefer log.Debug(\"Connection routine: %s stopped\", addrStr)\n\n\tlog.Debug(\"Connection routine: %s started\", addrStr)\n\n\t// stop receiving packets and clean up\n\tdefer func() {\n\t\t// Remove old ac connection record\n\t\t// Note on server side, before an old ac connection times out, the very ac can send new connections (due to restart or deemed connection failure)\n\t\t// and it may come with the same remote ip but a different remote port\n\t\t// so make sure the timeout removal here does not delete newer ac connections\n\t\tif conn.isACConnection {\n\t\t\tvar acToDelete string\n\t\t\ts.acConnectionMapMutex.Lock()\n\t\t\tfor acId, acConn := range s.acConnectionMap {\n\t\t\t\tif acConn.ConnData.Equal(conn.ConnData) {\n\t\t\t\t\tacToDelete = acId\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t\tdelete(s.acConnectionMap, acToDelete)\n\t\t\ts.acConnectionMapMutex.Unlock()\n\t\t}\n\n\t\tif conn.isDBConnection {\n\t\t\tvar dbToDelete string\n\t\t\ts.dbConnectionMapMutex.Lock()\n\t\t\tfor dbId, dbConn := range s.dbConnectionMap {\n\t\t\t\tif dbConn.ConnData.Equal(conn.ConnData) {\n\t\t\t\t\tdbToDelete = dbId\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t\tdelete(s.dbConnectionMap, dbToDelete)\n\t\t\ts.dbConnectionMapMutex.Unlock()\n\t\t}\n\n\t\t// remove the udp conn from remoteConnectionMap\n\t\ts.remoteConnectionMapMutex.Lock()\n\t\tdelete(s.remoteConnectionMap, addrStr)\n\t\tif len(s.remoteConnectionMap) <= OverloadConnectionThreshold {\n\t\t\ts.device.SetOverload(false)\n\t\t}\n\t\ts.remoteConnectionMapMutex.Unlock()\n\n\t\tconn.Close()\n\t}()\n\n\tfor {\n\t\tselect {\n\t\tcase <-s.signals.stop:\n\t\t\treturn\n\n\t\tcase <-conn.ConnData.SetTimeoutSignal:\n\t\t\tif conn.ConnData.TimeoutMs <= 0 {\n\t\t\t\tlog.Debug(\"Connection routine closed immediately\")\n\t\t\t\treturn\n\t\t\t}\n\n\t\tcase <-time.After(time.Duration(conn.ConnData.TimeoutMs) * time.Millisecond):\n\t\t\t// timeout, quit routine\n\t\t\tlog.Debug(\"Connection routine idle timeout\")\n\t\t\treturn\n\n\t\tcase <-conn.ConnData.BlockSignal:\n\t\t\ts.AddBlockAddr(conn.ConnData.RemoteAddr)\n\t\t\treturn\n\n\t\tcase pkt, ok := <-conn.ConnData.RecvQueue:\n\t\t\tif !ok {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif pkt == nil {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tlog.Debug(\"Received udp packet len [%d] from addr: %s\", len(pkt.Content), addrStr)\n\n\t\t\t// process keepalive packet\n\t\t\tif pkt.HeaderType == core.NHP_KPL {\n\t\t\t\ts.device.ReleasePoolPacket(pkt)\n\t\t\t\tlog.Info(\"Receive [NHP_KPL] message (%s -> %s)\", addrStr, s.listenAddr.String())\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tif s.device.IsTransactionResponse(pkt.HeaderType) {\n\t\t\t\t// forward to a specific transaction\n\t\t\t\ttransactionId := pkt.Counter()\n\t\t\t\ttransaction := s.device.FindLocalTransaction(transactionId)\n\t\t\t\tif transaction != nil {\n\t\t\t\t\ttransaction.NextPacketCh <- pkt\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tpd := &core.PacketData{\n\t\t\t\tBasePacket: pkt,\n\t\t\t\tConnData:   conn.ConnData,\n\t\t\t\tInitTime:   atomic.LoadInt64(&conn.ConnData.LastLocalRecvTime),\n\t\t\t}\n\t\t\t// generic receive\n\t\t\ts.device.RecvPacketToMsg(pd)\n\n\t\tcase pkt, ok := <-conn.ConnData.SendQueue:\n\t\t\tif !ok {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif pkt == nil {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\t_, _ = s.SendPacket(pkt, conn)\n\t\t}\n\t}\n}\n\nfunc (s *UdpServer) BlockAddrRefreshRoutine() {\n\tdefer s.wg.Done()\n\tdefer log.Info(\"BlockedAddrRoutine stopped\")\n\n\tlog.Info(\"BlockedAddrRoutine started\")\n\n\tfor {\n\t\tselect {\n\t\tcase <-s.signals.stop:\n\t\t\treturn\n\n\t\tcase <-time.After(BlockAddrRefreshRate * time.Second):\n\t\t\ts.RefreshBlockAddr()\n\t\t}\n\t}\n}\n\nfunc (s *UdpServer) IsBlockAddr(addr *net.UDPAddr) bool {\n\ts.blockAddrMapMutex.Lock()\n\tdefer s.blockAddrMapMutex.Unlock()\n\n\t_, found := s.blockAddrMap[addr.String()]\n\treturn found\n}\n\nfunc (s *UdpServer) AddBlockAddr(addr *net.UDPAddr) {\n\ts.blockAddrMapMutex.Lock()\n\tdefer s.blockAddrMapMutex.Unlock()\n\n\taddrStr := addr.String()\n\tlog.Critical(\"add blocking address %s\", addrStr)\n\n\tif len(s.blockAddrMap) < MaxConcurrentConnection {\n\t\ts.blockAddrMap[addrStr] = &BlockAddr{addr, time.Now().Add(BlockAddrExpireTime * time.Second)}\n\t} else {\n\t\tlog.Warning(\"block address pool is full\")\n\t}\n}\n\nfunc (s *UdpServer) RefreshBlockAddr() {\n\ts.blockAddrMapMutex.Lock()\n\tdefer s.blockAddrMapMutex.Unlock()\n\n\tnow := time.Now()\n\tfor k, v := range s.blockAddrMap {\n\t\tif v.expireTime.Before(now) {\n\t\t\tdelete(s.blockAddrMap, k)\n\t\t}\n\t}\n}\n\nfunc (s *UdpServer) sendMessageRoutine() {\n\tdefer s.wg.Done()\n\tdefer log.Info(\"sendMessageRoutine stopped\")\n\n\tlog.Info(\"sendMessageRoutine started\")\n\n\tfor {\n\t\tselect {\n\t\tcase <-s.signals.stop:\n\t\t\treturn\n\n\t\tcase md, ok := <-s.sendMsgCh:\n\t\t\tif !ok {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif md.PrevParserData != nil && s.device.IsTransactionResponse(md.HeaderType) {\n\t\t\t\t// forward to a specific transaction\n\t\t\t\ttransaction := md.ConnData.FindRemoteTransaction(md.PrevParserData.SenderTrxId)\n\t\t\t\tif transaction != nil {\n\t\t\t\t\ttransaction.NextMsgCh <- md\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// generic send\n\t\t\ts.device.SendMsgToPacket(md)\n\t\t}\n\t}\n}\n\nfunc (s *UdpServer) recvMessageRoutine() {\n\tdefer s.wg.Done()\n\tdefer log.Info(\"recvMessageRoutine stopped\")\n\n\tlog.Info(\"recvMessageRoutine started\")\n\n\tfor {\n\t\tselect {\n\t\tcase <-s.signals.stop:\n\t\t\treturn\n\n\t\tcase ppd, ok := <-s.recvMsgCh:\n\t\t\tif !ok {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif ppd == nil {\n\t\t\t\t// recvMsgCh is closed\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tswitch ppd.HeaderType {\n\t\t\tcase core.NHP_KNK, core.NHP_RKN, core.NHP_EXT, core.DHP_KNK:\n\t\t\t\t// aynchronously process knock messages with ack response\n\t\t\t\tgo func(p *core.PacketParserData) {\n\t\t\t\t\t_ = s.HandleKnockRequest(p)\n\t\t\t\t}(ppd)\n\n\t\t\tcase core.NHP_AOL:\n\t\t\t\t// synchronously block and deal with NHP_DOL to ensure future ac messages will be correctly processed. Don't use go routine\n\t\t\t\t_ = s.HandleACOnline(ppd)\n\n\t\t\tcase core.NHP_DOL:\n\t\t\t\t_ = s.HandleDBOnline(ppd)\n\n\t\t\tcase core.NHP_OTP:\n\t\t\t\tgo func(p *core.PacketParserData) {\n\t\t\t\t\t_ = s.HandleOTPRequest(p)\n\t\t\t\t}(ppd)\n\n\t\t\tcase core.NHP_REG:\n\t\t\t\tgo func(p *core.PacketParserData) {\n\t\t\t\t\t_ = s.HandleRegisterRequest(p)\n\t\t\t\t}(ppd)\n\n\t\t\tcase core.NHP_LST:\n\t\t\t\tgo func(p *core.PacketParserData) {\n\t\t\t\t\t_ = s.HandleListRequest(p)\n\t\t\t\t}(ppd)\n\t\t\tcase core.NHP_DAR:\n\t\t\t\tgo func(p *core.PacketParserData) {\n\t\t\t\t\t_ = s.HandleDHPDARMessage(p)\n\t\t\t\t}(ppd)\n\t\t\tcase core.NHP_DRG:\n\t\t\t\tgo func(p *core.PacketParserData) {\n\t\t\t\t\t_ = s.HandleDHPDRGMessage(p)\n\t\t\t\t}(ppd)\n\t\t\tcase core.NHP_DAV:\n\t\t\t\tgo func(p *core.PacketParserData) {\n\t\t\t\t\t_ = s.HandleDHPDAVMessage(p)\n\t\t\t\t}(ppd)\n\t\t\t}\n\n\t\t}\n\t}\n}\n\nfunc (s *UdpServer) AddAgentPeer(agent *core.UdpPeer) {\n\tif agent.DeviceType() == core.NHP_AGENT {\n\t\ts.device.AddPeer(agent)\n\t\ts.agentPeerMapMutex.Lock()\n\t\ts.agentPeerMap[agent.PublicKeyBase64()] = agent\n\t\ts.agentPeerMapMutex.Unlock()\n\t}\n}\n\nfunc (s *UdpServer) UpdateTeePublicKeyAndConsumerEphemeralPublicKey(teePublicKeyBase64 string, consumerEphemeralPublicKeyBase64 string, agentPulicKey []byte) {\n\tagentPulicKeyBase64 := base64.StdEncoding.EncodeToString(agentPulicKey)\n\n\tif peer, found := s.agentPeerMap[agentPulicKeyBase64]; found {\n\t\tpeer.SetTeePublicKeyBase64(teePublicKeyBase64)\n\t\tpeer.SetConsumerEphemeralPublicKeyBase64(consumerEphemeralPublicKeyBase64)\n\t}\n}\n\nfunc (s *UdpServer) GetTeePublicKeyBase64AndConsumerEphemeralPublicKeyBase64(agentPublicKey []byte) (teePublicKeyBase64 string, consumerEphemeralPublicKeyBase64 string) {\n\tagentPulicKeyBase64 := base64.StdEncoding.EncodeToString(agentPublicKey)\n\n\tif peer, found := s.agentPeerMap[agentPulicKeyBase64]; found {\n\t\treturn peer.TeePublicKeyBase64(), peer.ConsumerEphemeralPublicKeyBase64()\n\t}\n\treturn \"\", \"\"\n}\nfunc (s *UdpServer) AddACPeer(acPeer *core.UdpPeer) {\n\tif acPeer.DeviceType() == core.NHP_AC {\n\t\ts.device.AddPeer(acPeer)\n\t\ts.acPeerMapMutex.Lock()\n\t\ts.acPeerMap[acPeer.PublicKeyBase64()] = acPeer\n\t\ts.acPeerMapMutex.Unlock()\n\t}\n}\n\nfunc (s *UdpServer) AddAddressAssociation(srcIp string, addrs []*common.NetAddress) {\n\ts.srcIpAssociatedAddrMapMutex.Lock()\n\ts.srcIpAssociatedAddrMap[srcIp] = addrs\n\ts.srcIpAssociatedAddrMapMutex.Unlock()\n}\n\nfunc (s *UdpServer) RemoveAddressAssociation(srcIp string) {\n\ts.srcIpAssociatedAddrMapMutex.Lock()\n\tdelete(s.srcIpAssociatedAddrMap, srcIp)\n\ts.srcIpAssociatedAddrMapMutex.Unlock()\n}\n\nfunc (s *UdpServer) AddAuthService(aspData *common.AuthServiceProviderData) error {\n\tif len(aspData.AuthSvcId) == 0 {\n\t\treturn fmt.Errorf(\"aspId is empty\")\n\t}\n\n\ts.authServiceMapMutex.Lock()\n\ts.authServiceMap[aspData.AuthSvcId] = aspData\n\ts.authServiceMapMutex.Unlock()\n\n\tif len(aspData.PluginPath) > 0 {\n\t\th := plugins.ReadPluginHandler(aspData.PluginPath)\n\t\tif h != nil {\n\t\t\terr := s.LoadPlugin(aspData.AuthSvcId, h)\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc (s *UdpServer) AddResource(res *common.ResourceData) error {\n\tif len(res.AuthServiceId) == 0 || len(res.ResourceId) == 0 {\n\t\treturn fmt.Errorf(\"aspId or resId is empty\")\n\t}\n\n\ts.authServiceMapMutex.Lock()\n\taspData, found := s.authServiceMap[res.AuthServiceId]\n\tif !found {\n\t\ts.authServiceMapMutex.Unlock()\n\t\treturn fmt.Errorf(\"aspId not found\")\n\t}\n\taspData.ResourceGroups[res.ResourceId] = res\n\ts.authServiceMapMutex.Unlock()\n\n\treturn nil\n}\n\nfunc (s *UdpServer) ValidatePlugin(h plugins.PluginHandler) bool {\n\t// placeholder to validate plugin file\n\t// err = checkSignature(s.Signature())\n\t// if err != nil {\n\t//   return false\n\t// }\n\n\treturn true\n}\n\nfunc (s *UdpServer) LoadPlugin(pluginId string, h plugins.PluginHandler) error {\n\tif !s.ValidatePlugin(h) {\n\t\tlog.Error(\"Plugin: %s validation failed\", pluginId)\n\t\treturn fmt.Errorf(\"plugin validation failed\")\n\t}\n\n\ts.pluginHandlerMapMutex.Lock()\n\toldHandler, found := s.pluginHandlerMap[pluginId]\n\ts.pluginHandlerMapMutex.Unlock()\n\tif found {\n\t\toldHandler.Close()\n\t}\n\n\tpluginDirPath := filepath.Join(ExeDirPath, \"plugins\", pluginId)\n\terr := h.Init(&plugins.PluginParamsIn{\n\t\tPluginDirPath: &pluginDirPath,\n\t\tLog:           s.log.NewSubLogger(\"Plugin[\"+pluginId+\"]\", log.LogLevelDebug),\n\t\tHostname:      &s.config.Hostname,\n\t\tLocalIp:       &s.localIp,\n\t\tLocalMac:      &s.localMac,\n\t})\n\tif err != nil {\n\t\tlog.Error(\"plugin: %s initialization failed, %v\", pluginId, err)\n\t\treturn err\n\t}\n\n\tver := h.Version()\n\tinfo := h.ExportedData()\n\t// use info if necessary\n\t_ = info\n\n\ts.pluginHandlerMapMutex.Lock()\n\ts.pluginHandlerMap[pluginId] = h\n\ts.pluginHandlerMapMutex.Unlock()\n\n\tlog.Info(\"plugin %s loaded successfully to %s\", ver, pluginId)\n\treturn nil\n}\n\nfunc (s *UdpServer) ClosePlugins() {\n\ts.pluginHandlerMapMutex.Lock()\n\tdefer s.pluginHandlerMapMutex.Unlock()\n\n\tfor id, handler := range s.pluginHandlerMap {\n\t\tlog.Info(\"closing plugin: %s\", id)\n\t\thandler.Close()\n\t}\n}\n\nfunc (s *UdpServer) FindAuthSvcProvider(aspId string) *common.AuthServiceProviderData {\n\ts.authServiceMapMutex.Lock()\n\tdefer s.authServiceMapMutex.Unlock()\n\n\taspData, found := s.authServiceMap[aspId]\n\tif found {\n\t\treturn aspData\n\t}\n\n\treturn nil\n}\n\nfunc (s *UdpServer) processACOperation(knkMsg *common.AgentKnockMsg, conn *ACConn, srcAddr *common.NetAddress, dstAddrs []*common.NetAddress, openTime uint32) (artMsg *common.ACOpsResultMsg, err error) {\n\t// should not happen\n\tif knkMsg == nil || conn == nil {\n\t\tlog.Critical(\"processACOperation with nil input argument\")\n\t\terr = common.ErrInvalidInput\n\t\treturn\n\t}\n\n\tartMsg = &common.ACOpsResultMsg{}\n\tif srcAddr == nil || len(dstAddrs) == 0 {\n\t\tlog.Error(\"[processACOperation] no address specified\")\n\t\terr = common.ErrACEmptyPassAddress\n\t\tartMsg.ErrCode = common.ErrACEmptyPassAddress.ErrorCode()\n\t\tartMsg.ErrMsg = err.Error()\n\t\treturn\n\t}\n\n\tsrcAddrs := []*common.NetAddress{srcAddr}\n\t// check source ip associated address\n\ts.srcIpAssociatedAddrMapMutex.Lock()\n\tasscAddrs, found := s.srcIpAssociatedAddrMap[srcAddr.Ip]\n\ts.srcIpAssociatedAddrMapMutex.Unlock()\n\tif found {\n\t\tsrcAddrs = append(srcAddrs, asscAddrs...)\n\t}\n\n\tacAddrStr := conn.ACPeer.RecvAddr().String()\n\tif openTime == 0 {\n\t\topenTime = DefaultIpOpenTime\n\t}\n\n\taopMsg := &common.ServerACOpsMsg{\n\t\tUserId:           knkMsg.UserId,\n\t\tDeviceId:         knkMsg.DeviceId,\n\t\tOrganizationId:   knkMsg.OrganizationId,\n\t\tAuthServiceId:    knkMsg.AuthServiceId,\n\t\tResourceId:       knkMsg.ResourceId,\n\t\tSourceAddrs:      srcAddrs,\n\t\tDestinationAddrs: dstAddrs,\n\t\tOpenTime:         openTime + ACOpenCompensationTime, // compensate ac open time\n\t}\n\taopBytes, _ := json.Marshal(aopMsg)\n\n\taopMd := &core.MsgData{\n\t\tConnData:      conn.ConnData,\n\t\tHeaderType:    core.NHP_AOP,\n\t\tCipherScheme:  conn.ACCipherScheme,\n\t\tTransactionId: s.device.NextCounterIndex(),\n\t\tCompress:      true,\n\t\tPeerPk:        conn.ACPeer.PublicKey(),\n\t\tMessage:       aopBytes,\n\t\tResponseMsgCh: make(chan *core.PacketParserData),\n\t}\n\n\tif !s.IsRunning() {\n\t\tlog.Error(\"server-agent(%s@%s)-ac(%s#%d@%s)[processACOperation] MsgData channel closed or being closed, skip sending\", knkMsg.UserId, srcAddr.String(), conn.ACId, aopMd.TransactionId, acAddrStr)\n\t\terr = common.ErrPacketToMessageRoutineStopped\n\t\tartMsg.ErrCode = common.ErrPacketToMessageRoutineStopped.ErrorCode()\n\t\tartMsg.ErrMsg = err.Error()\n\t\treturn\n\t}\n\n\ts.sendMsgCh <- aopMd\n\n\t// wait for ac sending back operation result\n\t// block until transaction completes\n\tacPpd := <-aopMd.ResponseMsgCh\n\tclose(aopMd.ResponseMsgCh)\n\n\tif acPpd.Error != nil {\n\t\tlog.Error(\"server-agent(%s@%s)-ac(%s#%d@%s)[processACOperation] failed to receive response from ac: %v\", knkMsg.UserId, srcAddr.String(), conn.ACId, aopMd.TransactionId, acAddrStr, acPpd.Error)\n\t\terr = acPpd.Error\n\t\tartMsg.ErrCode = common.ErrServerACOpsFailed.ErrorCode()\n\t\tartMsg.ErrMsg = err.Error()\n\t\treturn\n\t}\n\n\tif acPpd.HeaderType != core.NHP_ART {\n\t\tlog.Error(\"server-agent(%s@%s)-ac(%s#%d@%s)[processACOperation] response has wrong type: %s\", knkMsg.UserId, srcAddr.String(), conn.ACId, aopMd.TransactionId, acAddrStr, core.HeaderTypeToString(acPpd.HeaderType))\n\t\terr = common.ErrTransactionRepliedWithWrongType\n\t\tartMsg.ErrCode = common.ErrTransactionRepliedWithWrongType.ErrorCode()\n\t\tartMsg.ErrMsg = err.Error()\n\t\treturn\n\t}\n\n\terr = json.Unmarshal(acPpd.BodyMessage, artMsg)\n\tif err != nil {\n\t\tlog.Error(\"server-agent(%s@%s)-ac(%s#%d@%s)[processACOperation] failed to parse %s message: %v\", knkMsg.UserId, srcAddr.String(), conn.ACId, aopMd.TransactionId, acAddrStr, core.HeaderTypeToString(acPpd.HeaderType), err)\n\t\tartMsg.ErrCode = common.ErrJsonParseFailed.ErrorCode()\n\t\tartMsg.ErrMsg = err.Error()\n\t\treturn\n\t}\n\n\tif artMsg.ErrCode != common.ErrSuccess.ErrorCode() {\n\t\tlog.Error(\"server-agent(%s@%s)-ac(%s#%d@%s)[processACOperation] response error: %+v\", knkMsg.UserId, srcAddr.String(), conn.ACId, aopMd.TransactionId, acAddrStr, artMsg)\n\t\terr = common.ErrACOperationFailed\n\t\treturn\n\t}\n\n\treturn artMsg, nil\n}\n\nfunc (s *UdpServer) handleNhpOpenResource(req *common.NhpAuthRequest, res *common.ResourceData) (ackMsg *common.ServerKnockAckMsg, err error) {\n\tknkMsg := req.Msg\n\tsrcAddr := req.SrcAddr\n\taddrStr := srcAddr.String()\n\tackMsg = req.Ack\n\n\tacDstIpMap := make(map[string][]*common.NetAddress)\n\tfor resName, info := range res.Resources {\n\t\taddrs, exist := acDstIpMap[resName]\n\t\tif exist {\n\t\t\taddrs = append(addrs, info.Addr)\n\t\t\tacDstIpMap[resName] = addrs\n\t\t} else {\n\t\t\tacDstIpMap[resName] = []*common.NetAddress{info.Addr}\n\t\t}\n\t}\n\n\t// PART III: request ac operation for each resource and block for response\n\tvar acWg sync.WaitGroup\n\tvar artMsgsMutex sync.Mutex\n\tartMsgs := make(map[string]*common.ACOpsResultMsg)\n\tackMsg.ResourceHost = make(map[string]string)\n\tackMsg.ACTokens = make(map[string]string)\n\tackMsg.PreAccessActions = make(map[string]*common.PreAccessInfo)\n\n\tfor resName, addrs := range acDstIpMap {\n\t\tresInfo := res.Resources[resName]\n\t\tif resInfo == nil {\n\t\t\tcontinue\n\t\t}\n\t\tacId := resInfo.ACId\n\t\ts.acConnectionMapMutex.Lock()\n\t\tacConn, found := s.acConnectionMap[acId]\n\t\ts.acConnectionMapMutex.Unlock()\n\t\tif !found {\n\t\t\tlog.Warning(\"server-agent(%s@%s)-ac(@%s)[handleNhpOpenResource] no ac connection is available\", knkMsg.UserId, addrStr, acId)\n\t\t\tartMsg := &common.ACOpsResultMsg{}\n\t\t\terr = common.ErrACConnectionNotFound\n\t\t\tartMsg.ErrCode = common.ErrACConnectionNotFound.ErrorCode()\n\t\t\tartMsg.ErrMsg = err.Error()\n\t\t\tartMsgsMutex.Lock()\n\t\t\tartMsgs[resName] = artMsg\n\t\t\tartMsgsMutex.Unlock()\n\t\t\tcontinue\n\t\t}\n\n\t\tacWg.Add(1)\n\t\tgo func(name string, info *common.ResourceInfo, dstAddrs []*common.NetAddress) {\n\t\t\tdefer acWg.Done()\n\n\t\t\topenTime := res.OpenTime\n\t\t\tif knkMsg.HeaderType == core.NHP_EXT {\n\t\t\t\topenTime = 1 // timeout in 1 second\n\t\t\t}\n\t\t\tartMsg, err := s.processACOperation(knkMsg, acConn, srcAddr, dstAddrs, openTime)\n\t\t\tartMsgsMutex.Lock()\n\t\t\tartMsgs[name] = artMsg\n\t\t\tif err == nil {\n\t\t\t\tackMsg.ResourceHost[name] = info.DestHost()\n\t\t\t\tackMsg.ACTokens[name] = artMsg.ACToken\n\t\t\t\tackMsg.PreAccessActions[name] = artMsg.PreAccessAction\n\t\t\t}\n\t\t\tartMsgsMutex.Unlock()\n\t\t}(resName, resInfo, addrs)\n\t}\n\tacWg.Wait()\n\n\tvar successCount int\n\tfor _, artMsg := range artMsgs {\n\t\tif artMsg.ErrCode == common.ErrSuccess.ErrorCode() {\n\t\t\tsuccessCount++\n\t\t}\n\t}\n\n\tif successCount == 0 {\n\t\tlog.Info(\"server-agent(%s@%s)[handleNhpOpenResource] failed: %+v\", knkMsg.UserId, addrStr, artMsgs)\n\t\terr = common.ErrServerACOpsFailed\n\t\tackMsg.ErrCode = common.ErrServerACOpsFailed.ErrorCode()\n\t\tackMsg.ErrMsg = err.Error()\n\t\treturn\n\t}\n\n\tackMsg.ErrCode = common.ErrSuccess.ErrorCode()\n\tackMsg.ErrMsg = common.ErrSuccess.Error()\n\treturn ackMsg, nil\n}\n\nfunc (us *UdpServer) NewNhpServerHelper(ppd *core.PacketParserData) *plugins.NhpServerPluginHelper {\n\th := &plugins.NhpServerPluginHelper{}\n\th.StopSignal = ppd.ConnData.StopSignal\n\n\th.AuthWithNhpCallbackFunc = func(req *common.NhpAuthRequest, res *common.ResourceData) (*common.ServerKnockAckMsg, error) {\n\t\treturn us.handleNhpOpenResource(req, res)\n\t}\n\n\treturn h\n}\n\nfunc (us *UdpServer) FindPluginHandler(aspId string) plugins.PluginHandler {\n\tus.pluginHandlerMapMutex.Lock()\n\tdefer us.pluginHandlerMapMutex.Unlock()\n\n\thandler, found := us.pluginHandlerMap[aspId]\n\tif !found {\n\t\treturn nil\n\t}\n\treturn handler\n}\n\n// DHP\nfunc (s *UdpServer) AddDEPeer(device *core.UdpPeer) {\n\tif device.DeviceType() == core.NHP_DB {\n\t\ts.device.AddPeer(device)\n\t\ts.dbPeerMapMutex.Lock()\n\t\ts.dbPeerMap[device.PublicKeyBase64()] = device\n\t\ts.dbPeerMapMutex.Unlock()\n\t}\n}\n\nfunc (s *UdpServer) ProcessDataPrivateKeyWrapping(dwrMsg *common.DWRMsg, conn *DBConn) (dwaMsg *common.DWAMsg, err error) {\n\tif dwrMsg == nil || conn == nil {\n\t\tlog.Critical(\"processACOperation with nil input argument\")\n\t\terr = common.ErrInvalidInput\n\t\treturn\n\t}\n\n\tdbAddrStr := conn.DBPeer.RecvAddr().String()\n\n\tdwrBytes, _ := json.Marshal(dwrMsg)\n\n\tdwrMd := &core.MsgData{\n\t\tConnData:      conn.ConnData,\n\t\tHeaderType:    core.NHP_DWR,\n\t\tCipherScheme:  conn.DBCipherScheme,\n\t\tTransactionId: s.device.NextCounterIndex(),\n\t\tCompress:      true,\n\t\tPeerPk:        conn.DBPeer.PublicKey(),\n\t\tMessage:       dwrBytes,\n\t\tResponseMsgCh: make(chan *core.PacketParserData),\n\t}\n\n\tdwaMsg = &common.DWAMsg{}\n\n\tif !s.IsRunning() {\n\t\tlog.Error(\"server-agent-db(%s#%d@%s)[ProcessDataPrivateKeyWrapping] MsgData channel closed or being closed, skip sending\", conn.DBId, dwrMd.TransactionId, dbAddrStr)\n\t\terr = common.ErrPacketToMessageRoutineStopped\n\t\terrCode, _ := strconv.Atoi(common.ErrPacketToMessageRoutineStopped.ErrorCode())\n\t\tdwaMsg.ErrCode = errCode\n\t\tdwaMsg.ErrMsg = err.Error()\n\t\treturn\n\t}\n\n\ts.sendMsgCh <- dwrMd\n\n\t// wait for ac sending back operation result\n\t// block until transaction completes\n\tdbPpd := <-dwrMd.ResponseMsgCh\n\tclose(dwrMd.ResponseMsgCh)\n\n\terr = json.Unmarshal(dbPpd.BodyMessage, dwaMsg)\n\tif err != nil {\n\t\tlog.Error(\"server-agent-db(%s#%d@%s)[ProcessDataPrivateKeyWrapping] failed to parse %s message: %v\", conn.DBId, dwrMd.TransactionId, dbAddrStr, core.HeaderTypeToString(dbPpd.HeaderType), err)\n\t\terrCode, _ := strconv.Atoi(common.ErrJsonParseFailed.ErrorCode())\n\t\tdwaMsg.ErrCode = errCode\n\t\tdwaMsg.ErrMsg = err.Error()\n\t\treturn\n\t}\n\n\treturn dwaMsg, nil\n}\n"
  },
  {
    "path": "endpoints/server/webrtcserver.go",
    "content": "package server\n\nimport (\n\t\"encoding/json\"\n\t\"net\"\n\t\"os\"\n\t\"sync/atomic\"\n\t\"time\"\n\n\t\"github.com/pion/webrtc/v4\"\n\n\t\"github.com/OpenNHP/opennhp/nhp/core\"\n\t\"github.com/OpenNHP/opennhp/nhp/log\"\n)\n\n// WebRTCConfig holds settings for the optional WebRTC transport.\ntype WebRTCConfig struct {\n\tEnable      bool\n\tOfferFile   string\n\tAnswerFile  string\n\tStunServers []string\n\tTurnServers []string\n}\n\n// WebRTCServer bridges a WebRTC DataChannel with the UDP server message pipeline.\ntype WebRTCServer struct {\n\tus   *UdpServer\n\tconf *WebRTCConfig\n\tpc   *webrtc.PeerConnection\n}\n\nfunc NewWebRTCServer(us *UdpServer, conf *WebRTCConfig) *WebRTCServer {\n\treturn &WebRTCServer{us: us, conf: conf}\n}\n\nfunc (w *WebRTCServer) Start() error {\n\tif w.conf == nil || !w.conf.Enable {\n\t\treturn nil\n\t}\n\n\tcfg := webrtc.Configuration{}\n\tfor _, u := range w.conf.StunServers {\n\t\tcfg.ICEServers = append(cfg.ICEServers, webrtc.ICEServer{URLs: []string{u}})\n\t}\n\tfor _, u := range w.conf.TurnServers {\n\t\tcfg.ICEServers = append(cfg.ICEServers, webrtc.ICEServer{URLs: []string{u}})\n\t}\n\n\tvar err error\n\tw.pc, err = webrtc.NewPeerConnection(cfg)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tw.pc.OnDataChannel(w.setupDataChannel)\n\n\t// if an offer file is provided, perform one-shot signaling using files\n\tif w.conf.OfferFile != \"\" {\n\t\tif offerBytes, err := os.ReadFile(w.conf.OfferFile); err == nil {\n\t\t\tvar offer webrtc.SessionDescription\n\t\t\tif err := json.Unmarshal(offerBytes, &offer); err == nil {\n\t\t\t\tif err := w.pc.SetRemoteDescription(offer); err == nil {\n\t\t\t\t\tanswer, err := w.pc.CreateAnswer(nil)\n\t\t\t\t\tif err == nil {\n\t\t\t\t\t\tif err = w.pc.SetLocalDescription(answer); err == nil {\n\t\t\t\t\t\t\tif w.conf.AnswerFile != \"\" {\n\t\t\t\t\t\t\t\tif data, err := json.Marshal(answer); err == nil {\n\t\t\t\t\t\t\t\t\t_ = os.WriteFile(w.conf.AnswerFile, data, 0644) //nolint:gosec // G306: SDP signaling data is not sensitive\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc (w *WebRTCServer) setupDataChannel(dc *webrtc.DataChannel) {\n\tdc.OnOpen(func() {\n\t\tlog.Info(\"WebRTC data channel %d open\", dc.ID())\n\t\trecvTime := time.Now().UnixNano()\n\t\taddr := &net.UDPAddr{IP: net.IPv4zero, Port: int(*dc.ID())}\n\t\tconn := &UdpConn{isWebRTC: true, dc: dc}\n\t\tconn.ConnData = &core.ConnectionData{\n\t\t\tInitTime:             recvTime,\n\t\t\tLastLocalRecvTime:    recvTime,\n\t\t\tDevice:               w.us.device,\n\t\t\tLocalAddr:            w.us.listenAddr,\n\t\t\tRemoteAddr:           addr,\n\t\t\tCookieStore:          &core.CookieStore{},\n\t\t\tRemoteTransactionMap: make(map[uint64]*core.RemoteTransaction),\n\t\t\tTimeoutMs:            DefaultAgentConnectionTimeoutMs,\n\t\t\tSendQueue:            make(chan *core.Packet, PacketQueueSizePerConnection),\n\t\t\tRecvQueue:            make(chan *core.Packet, PacketQueueSizePerConnection),\n\t\t\tBlockSignal:          make(chan struct{}),\n\t\t\tSetTimeoutSignal:     make(chan struct{}),\n\t\t\tStopSignal:           make(chan struct{}),\n\t\t}\n\n\t\tkey := addr.String()\n\t\tw.us.remoteConnectionMapMutex.Lock()\n\t\tw.us.remoteConnectionMap[key] = conn\n\t\tw.us.remoteConnectionMapMutex.Unlock()\n\n\t\tw.us.wg.Add(1)\n\t\tgo w.us.connectionRoutine(conn)\n\t})\n\n\tdc.OnMessage(func(m webrtc.DataChannelMessage) {\n\t\tif m.IsString {\n\t\t\treturn\n\t\t}\n\t\taddr := &net.UDPAddr{IP: net.IPv4zero, Port: int(*dc.ID())}\n\t\tkey := addr.String()\n\t\tw.us.remoteConnectionMapMutex.Lock()\n\t\tconn, ok := w.us.remoteConnectionMap[key]\n\t\tw.us.remoteConnectionMapMutex.Unlock()\n\t\tif !ok {\n\t\t\treturn\n\t\t}\n\t\tpkt := w.us.device.AllocatePoolPacket()\n\t\tcopy(pkt.Buf[:], m.Data)\n\t\tpkt.Content = pkt.Buf[:len(m.Data)]\n\t\tif len(pkt.Content) < pkt.MinimalLength() {\n\t\t\tw.us.device.ReleasePoolPacket(pkt)\n\t\t\treturn\n\t\t}\n\t\tatomic.AddUint64(&w.us.stats.totalRecvBytes, uint64(len(m.Data)))\n\t\tconn.ConnData.ForwardInboundPacket(pkt)\n\t})\n\n\tdc.OnClose(func() {\n\t\taddr := &net.UDPAddr{IP: net.IPv4zero, Port: int(*dc.ID())}\n\t\tkey := addr.String()\n\t\tw.us.remoteConnectionMapMutex.Lock()\n\t\tconn, ok := w.us.remoteConnectionMap[key]\n\t\tif ok {\n\t\t\tdelete(w.us.remoteConnectionMap, key)\n\t\t}\n\t\tw.us.remoteConnectionMapMutex.Unlock()\n\t\tif ok {\n\t\t\tconn.Close()\n\t\t}\n\t})\n}\n\nfunc (w *WebRTCServer) Stop() {\n\tif w.pc != nil {\n\t\t_ = w.pc.Close()\n\t}\n}\n"
  },
  {
    "path": "endpoints/test/gin_test.go",
    "content": "package test\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"testing\"\n\n\t\"github.com/gin-gonic/gin\"\n\n\t\"github.com/OpenNHP/opennhp/endpoints/server\"\n)\n\nfunc TestGlobInit(t *testing.T) {\n\tgin.SetMode(gin.ReleaseMode)\n\tg := gin.New()\n\tpwd, _ := os.Getwd()\n\tstaticPath := filepath.Join(pwd, \"../release/nhp-server/static\")\n\tserver.LoadFilesRecursively(g, staticPath)\n\ttemplatePath := filepath.Join(pwd, \"../release/nhp-server/templates\")\n\tserver.LoadFilesRecursively(g, templatePath)\n}\n"
  },
  {
    "path": "endpoints/test/json_test.go",
    "content": "package test\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"testing\"\n\n\t\"github.com/OpenNHP/opennhp/endpoints/server\"\n\tcommon \"github.com/OpenNHP/opennhp/nhp/common\"\n)\n\nfunc TestJsonTypeDetermine(t *testing.T) {\n\tjsonStr := \"{\\\"data\\\":{\\\"accessToken\\\":\\\"abcdefgh\\\"}}\"\n\n\ttype DataStruct struct {\n\t\tData map[string]any `json:\"data\"`\n\t}\n\n\tvar data map[string]any\n\n\tobj := &DataStruct{}\n\n\terr := json.Unmarshal([]byte(jsonStr), obj)\n\tif err != nil {\n\t\tfmt.Println(\"unmarshal error: \", err)\n\t\treturn\n\t}\n\n\ttokenStr, ok := obj.Data[\"accessToken\"].(string)\n\tif !ok {\n\t\tfmt.Println(\"type conversion failed\")\n\t}\n\n\tfmt.Println(\"token string: \", tokenStr)\n\n\terr = json.Unmarshal([]byte(jsonStr), &data)\n\tif err != nil {\n\t\tfmt.Println(\"unmarshal1 error: \", err)\n\t\treturn\n\t}\n\n\ttokenStr1, ok := obj.Data[\"accessToken\"].(string)\n\tif !ok {\n\t\tfmt.Println(\"type conversion1 failed\")\n\t}\n\n\tfmt.Println(\"token string1: \", tokenStr1)\n}\n\nfunc TestJsonSerialization(t *testing.T) {\n\tvar data common.ACOpsResultMsg\n\tdata.ErrCode = \"40001\"\n\tdata.ErrMsg = \"This is an error test\"\n\n\tbytes, err := json.Marshal(data)\n\tif err != nil {\n\t\tfmt.Println(\"marshal data error: \", err)\n\t}\n\n\tfmt.Println(\"json string of data: \", string(bytes))\n\n\tvar data2 map[string]string\n\tvar dataStr string = \"{\\\"errCode\\\":\\\"50001\\\", \\\"errMsg\\\":\\\"This is the second data.\\\", \\\"data\\\":{\\\"token\\\":\\\"654321\\\"}}\"\n\terr = json.Unmarshal([]byte(dataStr), &data2)\n\tif err != nil {\n\t\tfmt.Println(\"unmarshal error: \", err)\n\t}\n\tfmt.Printf(\"json object: %+v\\n\", data2)\n\tbytes, err = json.Marshal(data2)\n\tif err != nil {\n\t\tfmt.Println(\"marshal data2 error: \", err)\n\t}\n\n\tfmt.Println(\"json string of data2: \", string(bytes))\n}\n\ntype UserData struct {\n\tB0 bool\n\tB1 bool\n\tI0 int\n\tI1 int\n}\n\nfunc TestJsonSerializationForAnyType(t *testing.T) {\n\totpMsg := &common.AgentOTPMsg{\n\t\tUserId:   \"abc\",\n\t\tUserData: map[string]any{\"bool1\": true, \"bool2\": false, \"num1\": 5555, \"num2\": 6666},\n\t}\n\n\totpBytes, _ := json.Marshal(otpMsg)\n\tfmt.Println(\"json string of otpMsg: \", string(otpBytes))\n\n\totpMsg1 := &common.AgentOTPMsg{}\n\terr := json.Unmarshal(otpBytes, otpMsg1)\n\tif err != nil {\n\t\tfmt.Println(\"unmarshal error: \", err)\n\t}\n\tfmt.Printf(\"json object: %+v\\n\", *otpMsg1)\n\n\totpBytes1, _ := json.Marshal(otpMsg1)\n\tfmt.Println(\"json string of otpMsg1: \", string(otpBytes1))\n}\n\nfunc TestServerJsonConfig(t *testing.T) {\n\tfileName := filepath.Join(\"../server/main/etc\", \"config.json\")\n\tcontent, err := os.ReadFile(fileName)\n\tif err != nil {\n\t\tfmt.Println(\"Failed to load config file: \", err)\n\t\treturn\n\t}\n\n\tconfig := &server.Config{}\n\n\terr = json.Unmarshal(content, config)\n\tif err != nil {\n\t\tfmt.Println(\"json format error: \", err)\n\t\treturn\n\t}\n\n\tfmt.Printf(\"config: %+v\\n\", config)\n}\n"
  },
  {
    "path": "endpoints/test/toml_test.go",
    "content": "package test\n\nimport (\n\t\"fmt\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/fsnotify/fsnotify\"\n\ttoml \"github.com/pelletier/go-toml/v2\"\n\t\"github.com/spf13/viper\"\n\n\t\"github.com/OpenNHP/opennhp/endpoints/ac\"\n\tcommon \"github.com/OpenNHP/opennhp/nhp/common\"\n\tcore \"github.com/OpenNHP/opennhp/nhp/core\"\n)\n\nfunc TestTomlUnmarshal(t *testing.T) {\n\tconfig := `\n  a = \"abc\"\n  B = \"aBc\"\n  C = \"abC\"\n  ACId = \"test.clouddeep.cn-ac\"\n  PrivateKey = \"+B0RLGbe+nknJBZ0Fjt7kCBWfSTUttbUqkGteLfIp30=\"\n  IpPassMode = 0\n  AuthServiceId = \"core.clouddeep.cn\"\n  ResourceIds = [\"test.clouddeep.cn\"]\n  OrganizationId = \"5f3e36149fa95c0414408ad4\"\n\n  [[Servers]]\n  Hostname = \"\"\n  Ip = \"192.168.80.35\"\n  Port = 62206\n  Type = 2\n  PubKeyBase64 = \"WqJxe+Z4+wLen3VRgZx6YnbjvJFmptz99zkONCt/7gc=\"\n  ExpireTime = 1716345064\n\n  [Data]\n  \"Abc\" = \"TEST\"\n  \"aBc\" = true\n  \"abC\" = 1234\n  `\n\n\ttype embed struct {\n\t\ta string\n\t\tB string\n\t\tC string\n\t}\n\n\ttype obj struct {\n\t\tembed          `mapstructure:\",squash\"`\n\t\tACId           string\n\t\tPrivateKey     string\n\t\tIpPassMode     int\n\t\tAuthServiceId  string\n\t\tResourceIds    []string\n\t\tOrganizationId string\n\t\tServers        []*core.UdpPeer\n\t\tData           map[string]any\n\t}\n\tvar Obj obj\n\terr := toml.Unmarshal([]byte(config), &Obj)\n\tif err != nil {\n\t\tfmt.Printf(\"toml unmarshal error: %v\\n\", err)\n\t}\n\tfmt.Printf(\"peer0: %+v\\n\", Obj.Servers[0])\n\tfmt.Printf(\"config: %+v, ACId: %s, B: %s\\n\", Obj, Obj.ACId, Obj.B)\n\tfmt.Printf(\"Data: %+v, %s, %t, %d,\\n\", Obj.Data, Obj.Data[\"Abc\"].(string), Obj.Data[\"aBc\"].(bool), Obj.Data[\"abC\"].(int64))\n\t// below will trigger panic\n\t//fmt.Printf(\"non-exist data %s, %t, %d\\n\", Obj.Data[\"Abc1\"].(string), Obj.Data[\"aBc2\"].(bool), Obj.Data[\"abC3\"].(int64))\n}\n\nfunc TestTomlViperHandling(t *testing.T) {\n\tt.Skip(\"Skipping interactive test with infinite loop - for manual testing only\")\n\tvar config ac.Config\n\tconfigDir := \"../ac/main/etc\"\n\tviper.SupportedExts = []string{\"toml\"}\n\tviper.AddConfigPath(configDir)\n\tviper.SetConfigType(\"toml\")\n\terr := viper.ReadInConfig()\n\tif err != nil {\n\t\tfmt.Printf(\"load toml file failed: %v\\n\", err)\n\t\treturn\n\t}\n\tviper.OnConfigChange(func(in fsnotify.Event) {\n\t\tfmt.Printf(\"file changed: %s\\n\", in.Name)\n\t\t// content, err := os.ReadFile(in.Name)\n\t\t// if err != nil {\n\t\t// \tfmt.Printf(\"Failed to read config file: %v\\n\", err)\n\t\t// \treturn\n\t\t// }\n\t\t// err = toml.Unmarshal(content, &config)\n\t\terr = viper.Unmarshal(&config)\n\t\tif err != nil {\n\t\t\tfmt.Printf(\"Failed to unmarshal config file: %v\\n\", err)\n\t\t\treturn\n\t\t}\n\t\tfmt.Printf(\"config: %+v\\n\", config)\n\t})\n\tviper.WatchConfig()\n\n\t//content, err := os.ReadFile(filepath.Join(configDir, \"config.toml\"))\n\t//err = toml.Unmarshal(content, &config)\n\terr = viper.Unmarshal(&config)\n\tif err != nil {\n\t\tfmt.Printf(\"Failed to unmarshal config file: %v\\n\", err)\n\t\treturn\n\t}\n\tfmt.Printf(\"config: %+v\\n\", config)\n\n\tfor {\n\t\ttime.Sleep(5 * time.Second)\n\t}\n}\n\nfunc TestWxwebTomlViperHandling(t *testing.T) {\n\tt.Skip(\"Skipping interactive test with infinite loop - for manual testing only\")\n\tconfigFile := \"../server/plugins/wxweb/etc/resource.toml\"\n\tviper.SetConfigFile(configFile)\n\tviper.SetConfigType(\"toml\")\n\terr := viper.ReadInConfig()\n\tif err != nil {\n\t\tfmt.Printf(\"load toml file failed: %v\\n\", err)\n\t\treturn\n\t}\n\n\tvar resources common.ResourceGroupMap\n\terr = viper.Unmarshal(&resources)\n\tif err != nil {\n\t\tfmt.Printf(\"failed to unmarshal config file: %v\\n\", err)\n\t}\n\n\tfmt.Printf(\"config: %+v\\n\", resources)\n\tfor k, res := range resources {\n\t\tfmt.Printf(\"resid %s, config: %+v\\nlogin info: %+v\\n\", k, res, res.ExInfo)\n\n\t\tfor key, info := range res.Resources {\n\t\t\tfmt.Printf(\"sub res name %s, info: %+v\\n\", key, info)\n\t\t}\n\t}\n\n\tviper.OnConfigChange(func(in fsnotify.Event) {\n\t\tfmt.Printf(\"file changed: %s\\n\", in.Name)\n\t\t// content, err := os.ReadFile(in.Name)\n\t\t// if err != nil {\n\t\t// \tfmt.Printf(\"Failed to read config file: %v\\n\", err)\n\t\t// \treturn\n\t\t// }\n\t\t// err = toml.Unmarshal(content, &config)\n\t\terr = viper.Unmarshal(&resources)\n\t\tif err != nil {\n\t\t\tfmt.Printf(\"Failed to unmarshal config file: %v\\n\", err)\n\t\t\treturn\n\t\t}\n\t\tfor _, res := range resources {\n\t\t\tfmt.Printf(\"config: %+v\\n\", res)\n\t\t}\n\t})\n\tviper.WatchConfig()\n\n\tfor {\n\t\ttime.Sleep(5 * time.Second)\n\t}\n}\n\nfunc TestUdpServerTomlViperHandling(t *testing.T) {\n\tt.Skip(\"Skipping interactive test with infinite loop - for manual testing only\")\n\tconfigFile := \"../etc/ac.toml\"\n\tviper.SetConfigFile(configFile)\n\tviper.SetConfigType(\"toml\")\n\terr := viper.ReadInConfig()\n\tif err != nil {\n\t\tfmt.Printf(\"load toml file failed: %v\\n\", err)\n\t\treturn\n\t}\n\n\ttype acPeers struct {\n\t\tACs []*core.UdpPeer\n\t}\n\n\tvar peers acPeers\n\terr = viper.Unmarshal(&peers)\n\tif err != nil {\n\t\tfmt.Printf(\"failed to unmarshal config file: %v\\n\", err)\n\t}\n\n\tfmt.Printf(\"config: %+v\\n\", peers)\n\tfor _, peer := range peers.ACs {\n\t\tfmt.Printf(\"peer: %+v\\n\", peer)\n\t}\n\n\tviper.OnConfigChange(func(in fsnotify.Event) {\n\t\tfmt.Printf(\"file changed: %s\\n\", in.Name)\n\t\t// content, err := os.ReadFile(in.Name)\n\t\t// if err != nil {\n\t\t// \tfmt.Printf(\"Failed to read config file: %v\\n\", err)\n\t\t// \treturn\n\t\t// }\n\t\t// err = toml.Unmarshal(content, &config)\n\t\terr = viper.Unmarshal(&peers)\n\t\tif err != nil {\n\t\t\tfmt.Printf(\"Failed to unmarshal config file: %v\\n\", err)\n\t\t\treturn\n\t\t}\n\t\tfor _, peer := range peers.ACs {\n\t\t\tfmt.Printf(\"config: %+v\\n\", peer)\n\t\t}\n\t})\n\tviper.WatchConfig()\n\n\tfor {\n\t\ttime.Sleep(5 * time.Second)\n\t}\n}\n"
  },
  {
    "path": "examples/client_sdk/android/java/MainActivity.java",
    "content": "package org.example;\n\nimport android.os.Bundle;\nimport android.os.Environment;\nimport android.util.Log;\nimport androidx.appcompat.app.AppCompatActivity;\n\n\nimport com.OpennhpLibrary;\nimport com.fancy.zerotrust.R;\n\nimport java.io.File;\n\npublic class MainActivity extends AppCompatActivity {\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        // Read the phone's storage download directory.\n        String appDir = Environment.getExternalStorageDirectory() + File.separator + \"download\";\n        // Does the nhp directory exist in the downloads\n        File file = new File(appDir);\n        if (!file.exists()) {\n            Log.d(\"MainActivity\",\"download file not exist！\");\n            return;\n        }\n        Log.d(\"MainActivity\",\"download file exist！\");\n        String appDir1 = Environment.getExternalStorageDirectory() + File.separator + \"download\"+ File.separator + \"nhp\";\n        boolean initFlag = OpennhpLibrary.INSTANCE.nhp_agent_init(appDir1, 3);\n        if (!initFlag) {\n            System.out.println(\"NHP Agent init failed\");\n            System.exit(0);\n        }\n        System.out.println(\"start the loop knocking thread...\");\n        OpennhpLibrary.INSTANCE.nhp_agent_knockloop_start();\n    }\n}"
  },
  {
    "path": "examples/client_sdk/android/java/OpennhpLibrary.java",
    "content": "package org.example;\n\nimport com.sun.jna.Library;\nimport com.sun.jna.Native;\n\n/**\n * OpenNHP agent sdk interface\n *\n * @author haochangjiu\n * @version JDK 8\n * @className OpennhpLibrary\n * @date 2025/10/27\n */\npublic interface OpennhpLibrary extends Library {\n    // load OpenNHP agent sdk\n    OpennhpLibrary INSTANCE = Native.load(\"nhpagent\", OpennhpLibrary.class);\n\n    /**\n     * @description Initialization of the nhp_agent instance working directory path:\n     *              The configuration files to be read are located under workingdir/etc/,\n     *              and log files will be generated under workingdir/logs/.\n     * @param workingDir: the working directory path for the agent\n     * @param logLevel:   0: silent, 1: error, 2: info, 3: debug, 4: verbose\n     *                    return boolean Whether agent instance has been initialized successfully.\n     * @return boolean\n     * @author haochangjiu\n     * @date 2025/10/27\n     * {@link boolean}\n     */\n    boolean nhp_agent_init(String workingDir, int logLevel);\n\n    /**\n     * @description Synchronously stop and release nhp_agent.\n     * @author haochangjiu\n     * @date 2025/10/27\n     */\n    void nhp_agent_close();\n    /**\n     * @description Read the user information, resource information, server information,\n     *              and other configuration files written under workingdir/etc,\n     *              and asynchronously start the loop knocking thread.\n     * @return int\n     * @author haochangjiu\n     * @date 2025/10/27\n     * {@link int}\n     */\n    int nhp_agent_knockloop_start();\n\n    /**\n     * @description Synchronously stop the loop, knock-on sub thread\n     * @author hangchangjiu\n     * @date 2025/10/27\n     */\n    void nhp_agent_knockloop_stop();\n}"
  },
  {
    "path": "examples/client_sdk/android/kotlin/MainActivity.kt",
    "content": "package com.example.androidtestsoapp\n\nimport android.os.Bundle\nimport android.os.Environment\nimport android.util.Log\nimport androidx.activity.ComponentActivity\nimport androidx.activity.compose.setContent\nimport androidx.activity.enableEdgeToEdge\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.material3.Scaffold\nimport androidx.compose.material3.Text\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.tooling.preview.Preview\nimport com.example.androidtestsoapp.ui.theme.AndroidTestSoAppTheme\nimport com.hjq.permissions.Permission\nimport com.hjq.permissions.XXPermissions\nimport java.io.File\n\nclass MainActivity : ComponentActivity() {\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        enableEdgeToEdge()\n        setContent {\n            AndroidTestSoAppTheme {\n                Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding ->\n                    Greeting(\n                        name = \"Android\",\n                        modifier = Modifier.padding(innerPadding)\n                    )\n                }\n            }\n        }\n        // Request permissions - read/write\n        XXPermissions.with(this)\n            .permission(Permission.WRITE_EXTERNAL_STORAGE)\n            .permission(Permission.READ_MEDIA_IMAGES)\n            .permission(Permission.READ_MEDIA_VIDEO)\n            .permission(Permission.READ_MEDIA_AUDIO)\n            .request { permissions, allGranted ->\n                if (allGranted) {\n                    Log.d(\"MainActivity\", \"Permissions granted\")\n                    performFileOperations()\n                } else {\n                    Log.d(\"MainActivity\", \"Permissions not granted\")\n                }\n            }\n    }\n}\n\n/**\n * Need to place the nhp folder containing the etc folder in the phone's download folder\n * After reading the phone storage download directory, call OpennhpLibrary\n */\nprivate fun performFileOperations() {\n    // Read phone storage download directory\n    val appDir = Environment.getExternalStorageDirectory().toString() + File.separator + \"download\"\n    // Check if zero folder exists in download\n    val file = File(appDir)\n    if (!file.exists()) {\n        Log.d(\"MainActivity\", \"Download folder does not exist\")\n        return\n    }\n    Log.d(\"MainActivity\", \"Download folder exists\")\n    val appDir1 = Environment.getExternalStorageDirectory().toString() + File.separator + \"download\" + File.separator + \"nhp\"\n    // Check if nhp folder exists in download\n    val file1 = File(appDir1)\n    if (!file1.exists()) {\n        Log.d(\"MainActivity\", \"nhp folder does not exist\")\n        return\n    }\n    val appDir2 = Environment.getExternalStorageDirectory().toString() + File.separator + \"download\" + File.separator + \"nhp\"+ File.separator + \"etc\"\n    // Check if etc folder exists in download\n    val file2 = File(appDir2)\n    if (!file2.exists()) {\n        Log.d(\"MainActivity\", \"Etc folder does not exist\")\n        return\n    }\n\n    val initFlag = OpennhpLibrary.INSTANCE.nhp_agent_init(appDir1, 2)\n    if (!initFlag) {\n        println(\"NHP Agent init failed\")\n        return\n    }\n    println(\"start the loop knocking thread...\")\n    val flag:Int = OpennhpLibrary.INSTANCE.nhp_agent_knockloop_start()\n    // Print result\n    if (flag > 0) {\n        println(\"NHP Agent knockloop start success\")\n    } else {\n        println(\"NHP Agent knockloop start failed\")\n    }\n}\n\n@Composable\nfun Greeting(name: String, modifier: Modifier = Modifier) {\n    Text(\n        text = \"Hello $name!\",\n        modifier = modifier\n    )\n}\n\n@Preview(showBackground = true)\n@Composable\nfun GreetingPreview() {\n    AndroidTestSoAppTheme {\n        Greeting(\"Android\")\n    }\n}"
  },
  {
    "path": "examples/client_sdk/desktop/c/nhp-agent-demo.c",
    "content": "#include <stdio.h>\n#include <unistd.h>\n#include \"nhp-agent.h\"\n\nint main() {\n    // Initialize nhp_agent, only one nhp_agent singleton is allowed per process.\n    nhp_agent_init(\".\", 3);\n\n    // Set the user information for the knock-on-the-door feature.\n    nhp_agent_set_knock_user(\"zengl\", NULL, NULL, NULL);\n\n    // Set NHP server information\n    // If there is already a configuration file for the server, the call to nhp_agent_add_server can be omitted\n    // Timestamp date is visible at https://unixtime.org/\n    nhp_agent_add_server(\"replace_with_actual_publickeybase64\", \"192.168.1.66\", NULL, 62206, 1748908471);\n\n    // Send a request to the server to access the resource example/demo, and return information in the form of a JSON format string\n    // Note: The resource information here is an independent input, and is unrelated to the resource information saved in the configuration file\n    char *ret = nhp_agent_knock_resource(\"example\", \"demo\", \"192.168.1.66\", NULL, 62206);\n    printf(\"knock return: %s\\n\", ret);\n\n    // Immediately close the agent's access to the example/demo resources,\n    // if not invoked, access permission will automatically close after the door opening duration has passed.\n    nhp_agent_exit_resource(\"example\", \"demo\", \"192.168.1.66\", NULL, 62206);\n\n    // Turn off and release nhp_agent.\n    nhp_agent_close();\n    return 0;\n}\n\n"
  },
  {
    "path": "examples/client_sdk/desktop/java/App.java",
    "content": "package org.example;\n\nimport java.util.Scanner;\n\n/**\n * Application for calling the OpenNHP agent SDK\n *\n * @author haochangjiu\n * @version JDK 8\n * @className App\n * @date 2025/10/27\n */\npublic class App {\n    public static void main(String[] args) throws Exception {\n//        Initialize and start the OpenNHP agent SDK service\n        boolean initFlag = OpennhpLibrary.INSTANCE.nhp_agent_init(\"D:\\\\console-workspace\\\\opennhp-knock\", 3);\n        if (!initFlag) {\n            System.out.println(\"NHP Agent init failed\");\n            System.exit(0);\n        }\n//        Invoke methods in the OpenNHP agent SDK via input commands\n        Scanner scanner = new Scanner(System.in);\n\n        while (true) {\n            System.out.print(\"> \");\n            if (scanner.hasNextLine()) {\n                String input = scanner.nextLine().trim();\n                if (\"knock\".equalsIgnoreCase(input)) {\n                    System.out.println(\"start the loop knocking thread...\");\n                    OpennhpLibrary.INSTANCE.nhp_agent_knockloop_start();\n                } else if (\"cancel\".equalsIgnoreCase(input)) {\n                    System.out.println(\"stop the loop knocking thread...\");\n                    OpennhpLibrary.INSTANCE.nhp_agent_knockloop_stop();\n                } else if (\"exit\".equalsIgnoreCase(input)) {\n                    System.out.println(\"exit nhp agent service...\");\n                    OpennhpLibrary.INSTANCE.nhp_agent_close();\n                    break;\n                } else {\n                    System.out.println(\"invalid input\");\n                }\n            }\n        }\n        scanner.close();\n    }\n}"
  },
  {
    "path": "examples/client_sdk/desktop/java/OpennhpLibrary.java",
    "content": "package org.example;\n\nimport com.sun.jna.Library;\nimport com.sun.jna.Native;\n\n/**\n * OpenNHP agent sdk interface\n *\n * @author haochangjiu\n * @version JDK 8\n * @className OpennhpLibrary\n * @date 2025/10/27\n */\npublic interface OpennhpLibrary extends Library {\n    // load OpenNHP agent sdk\n    OpennhpLibrary INSTANCE = Native.load(\"nhp-agent\", OpennhpLibrary.class);\n\n    /**\n     * @description Initialization of the nhp_agent instance working directory path:\n     *              The configuration files to be read are located under workingdir/etc/,\n     *              and log files will be generated under workingdir/logs/.\n     * @param workingDir: the working directory path for the agent\n     * @param logLevel:   0: silent, 1: error, 2: info, 3: debug, 4: verbose\n     *                    return boolean Whether agent instance has been initialized successfully.\n     * @return boolean\n     * @author haochangjiu\n     * @date 2025/10/27\n     * {@link boolean}\n     */\n    boolean nhp_agent_init(String workingDir, int logLevel);\n\n    /**\n     * @description Synchronously stop and release nhp_agent.\n     * @author haochangjiu\n     * @date 2025/10/27\n     */\n    void nhp_agent_close();\n    /**\n     * @description Read the user information, resource information, server information,\n     *              and other configuration files written under workingdir/etc,\n     *              and asynchronously start the loop knocking thread.\n     * @return int\n     * @author haochangjiu\n     * @date 2025/10/27\n     * {@link int}\n     */\n    int nhp_agent_knockloop_start();\n\n    /**\n     * @description Synchronously stop the loop, knock-on sub thread\n     * @author hangchangjiu\n     * @date 2025/10/27\n     */\n    void nhp_agent_knockloop_stop();\n}"
  },
  {
    "path": "examples/client_sdk/desktop/python/nhp-agent-demo.py",
    "content": "import ctypes\nfrom time import sleep\n\n# Windows\nnhp_agent = ctypes.CDLL('nhp-agent.dll')\n# Linux\n# mylib = ctypes.CDLL('./nhp-agent.so')\n# macOS\n# mylib = ctypes.CDLL('./nhp-agent.dylib')\n\nnhp_agent.nhp_agent_init.argtypes = [ctypes.c_char_p, ctypes.c_int]\nnhp_agent.nhp_agent_init.restype = ctypes.c_bool\n\nnhp_agent.nhp_agent_init.restype = ctypes.c_int\n\n\n\nif __name__ == '__main__':\n    flag = nhp_agent.nhp_agent_init(ctypes.c_char_p(b\"D:\\\\nhpagent\"),3)\n    if flag:\n        print(\"nhp-agent init success\")\n    else:\n        print(\"nhp-agent init failed\")\n    # start the loop knocking thread\n    status = nhp_agent.nhp_agent_knockloop_start()\n    if status >= 0:\n        print(\"nhp-agent knockloop success\")\n        # Delay between calls\n        sleep(30)\n    else:\n        print(\"nhp-agent knockloop failed\")\n\n    # stop nhp_agent\n    nhp_agent.nhp_agent_close()"
  },
  {
    "path": "examples/client_sdk/ios/objectivec/FileCopyManager.h",
    "content": "//\n//  FileCopyManager.h\n//  TestXCFramework\n//\n//  Created by haochangjiu on 2025/10/30.\n//\n\n#import <Foundation/Foundation.h>\n\nNS_ASSUME_NONNULL_BEGIN\n\n@interface FileCopyManager : NSObject\n/// Copy the specified file(s) to the etc and certs directories in the application's home directory\n+ (void)copyFilesToSandboxEtc;\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "examples/client_sdk/ios/objectivec/FileCopyManager.m",
    "content": "//\n//  FileCopyManager.m\n//  TestXCFramework\n//\n//  Created by haochangjiu on 2025/10/30.\n//\n\n#import \"FileCopyManager.h\"\n#import <Foundation/Foundation.h>\n\n@implementation FileCopyManager\n\n/// Copy the specified file(s) to the etc and certs directories in the application's home directory\n+ (void)copyFilesToSandboxEtc {\n    // 1. Retrieve the sandboxed Documents directory\n    NSArray *documentsURLs = [[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask];\n    NSURL *documentsURL = [documentsURLs firstObject];\n    if (!documentsURL) {\n        NSLog(@\"Failed to retrieve Documents directory\");\n        return;\n    }\n\n    // 2. Define paths for etc and certs directories within the sandbox\n    NSURL *etcURL = [documentsURL URLByAppendingPathComponent:@\"etc\"];\n    NSURL *certsURL = [etcURL URLByAppendingPathComponent:@\"certs\"];\n\n    // 3. Create etc and certs directories (if they don't exist)\n    [self createDirectoryIfNotExists:etcURL];\n    [self createDirectoryIfNotExists:certsURL];\n\n    // 4. Copy toml files to the etc directory\n    NSArray *tomlFiles = @[@\"server.toml\", @\"config.toml\", @\"dhp.toml\", @\"resource.toml\"];\n    for (NSString *fileName in tomlFiles) {\n        [self copyFileFromBundle:fileName toDestinationURL:etcURL];\n    }\n\n    // 5. Copy certificate files to the etc/certs directory\n    NSArray *certFiles = @[@\"server.crt\", @\"server.key\"];\n    for (NSString *fileName in certFiles) {\n        [self copyFileFromBundle:fileName toDestinationURL:certsURL];\n    }\n}\n\n/// Create directory if it does not exist\n+ (void)createDirectoryIfNotExists:(NSURL *)directoryURL {\n    NSFileManager *fileManager = [NSFileManager defaultManager];\n    if (![fileManager fileExistsAtPath:directoryURL.path]) {\n        NSError *error;\n        BOOL success = [fileManager createDirectoryAtURL:directoryURL\n                              withIntermediateDirectories:YES\n                                               attributes:nil\n                                                    error:&error];\n        if (success) {\n            NSLog(@\"Directory created successfully: %@\", directoryURL.path);\n        } else {\n            NSLog(@\"Failed to create directory: %@, error: %@\", directoryURL.path, error.localizedDescription);\n        }\n    } else {\n        NSLog(@\"Directory already exists: %@\", directoryURL.path);\n    }\n}\n\n/// Copy file from Bundle to destination path\n+ (void)copyFileFromBundle:(NSString *)fileName toDestinationURL:(NSURL *)destinationURL {\n    // Get the file path in the Bundle\n    NSURL *sourceURL = [[NSBundle mainBundle] URLForResource:[fileName stringByDeletingPathExtension]\n                                                withExtension:[fileName pathExtension]];\n    if (!sourceURL) {\n        NSLog(@\"File not found in Bundle: %@\", fileName);\n        return;\n    }\n\n    // Destination file path (destination directory + file name)\n    NSURL *destFileURL = [destinationURL URLByAppendingPathComponent:fileName];\n\n    // Copy file (if it doesn't exist)\n    NSFileManager *fileManager = [NSFileManager defaultManager];\n    if (![fileManager fileExistsAtPath:destFileURL.path]) {\n        NSError *error;\n        BOOL success = [fileManager copyItemAtURL:sourceURL toURL:destFileURL error:&error];\n        if (success) {\n            NSLog(@\"File copied successfully: %@ -> %@\", fileName, destFileURL.path);\n        } else {\n            NSLog(@\"File copy failed: %@, error: %@\", fileName, error.localizedDescription);\n        }\n    } else {\n        NSLog(@\"File already exists: %@\", destFileURL.path);\n    }\n}\n\n@end\n"
  },
  {
    "path": "examples/client_sdk/ios/objectivec/ViewController.m",
    "content": "//\n//  ViewController.m\n//  TestXCFramework\n//\n//  Created by haochangjiu on 2025/10/30.\n//\n\n#import \"ViewController.h\"\n#import <Nhpagent/Nhpagent.h>\n#import \"FileCopyManager.h\"\n\n@interface ViewController ()\n\n@end\n\n@implementation ViewController\n\n- (void)viewDidLoad {\n    [super viewDidLoad];\n    // Do any additional setup after loading the view.\n    // Invoke method to copy files from etc folder to sandbox etc directory\n    [FileCopyManager copyFilesToSandboxEtc];\n    // Retrieve the sandbox target path (Documents), which is the parent directory of the etc folder\n    NSArray *documentsURLs = [[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask];\n    NSURL *documentsURL = [documentsURLs firstObject];\n    if (!documentsURL) {\n        NSLog(@\"Error: Failed to read Documents directory\");\n    }\n    // Get the parent directory path of the etc folder\n    NSString *etcPath = documentsURL.path;\n    // SdkNhpAgentInit\n    BOOL initFlag = IossdkNhpAgentInit(etcPath, 3);\n    if (!initFlag) {\n        NSLog(@\"NHP Agent init failed\");\n        return;\n    }\n    // knockloop_start\n    long value = IossdkNhpAgentKnockloopStart();\n    NSLog(@\"SdkNhpAgentKnockloopStart value : %ld\", value);\n}\n\n@end\n"
  },
  {
    "path": "examples/client_sdk/ios/swift/FileCopyManager.swift",
    "content": "//\n//  FileCopyManager.swift\n//  TestXCFrameworkSwift\n//\n//  Created by haochangjiu on 2025/10/30.\n//\n\nimport UIKit\nimport Foundation\n\nclass FileCopyManager {\n\n    /// Copy specified files to the etc and certs directories in the sandbox\n    static func copyFilesToSandboxEtc() {\n        // 1. Get the Documents directory in the sandbox\n        guard let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else {\n            print(\"Failed to get Documents directory\")\n            return\n        }\n\n        // 2. Define paths for etc and certs directories in the sandbox\n        let etcURL = documentsURL.appendingPathComponent(\"etc\")\n        let certsURL = etcURL.appendingPathComponent(\"certs\")\n\n        // 3. Create etc and certs directories (if they don't exist)\n        createDirectoryIfNotExists(at: etcURL)\n        createDirectoryIfNotExists(at: certsURL)\n\n        // 4. Copy toml files to the etc directory\n        let tomlFiles = [\"server.toml\", \"config.toml\", \"dhp.toml\", \"resource.toml\"]\n        tomlFiles.forEach { fileName in\n            copyFileFromBundle(fileName: fileName, to: etcURL)\n        }\n\n        // 5. Copy certificate files to the etc/certs directory\n        let certFiles = [\"server.crt\", \"server.key\"]\n        certFiles.forEach { fileName in\n            copyFileFromBundle(fileName: fileName, to: certsURL)\n        }\n    }\n\n    /// Create directory if it doesn't exist\n    private static func createDirectoryIfNotExists(at url: URL) {\n        let fileManager = FileManager.default\n        guard !fileManager.fileExists(atPath: url.path) else {\n            print(\"Directory already exists: \\(url.path)\")\n            return\n        }\n\n        do {\n            try fileManager.createDirectory(at: url, withIntermediateDirectories: true, attributes: nil)\n            print(\"Directory created successfully: \\(url.path)\")\n        } catch {\n            print(\"Failed to create directory: \\(url.path), error: \\(error.localizedDescription)\")\n        }\n    }\n\n    /// Copy file from Bundle to destination path\n    private static func copyFileFromBundle(fileName: String, to destinationURL: URL) {\n        // Split filename and extension (handling files with extensions)\n        let fileNameWithoutExt = (fileName as NSString).deletingPathExtension\n        let fileExt = (fileName as NSString).pathExtension\n\n        // Get the file path in the Bundle\n        guard let sourceURL = Bundle.main.url(forResource: fileNameWithoutExt, withExtension: fileExt) else {\n            print(\"File not found in Bundle: \\(fileName)\")\n            return\n        }\n\n        // Destination file path (destination directory + filename)\n        let destFileURL = destinationURL.appendingPathComponent(fileName)\n        let fileManager = FileManager.default\n\n        // Copy file (if it doesn't exist)\n        guard !fileManager.fileExists(atPath: destFileURL.path) else {\n            print(\"File already exists: \\(destFileURL.path)\")\n            return\n        }\n\n        do {\n            try fileManager.copyItem(at: sourceURL, to: destFileURL)\n            print(\"File copied successfully: \\(fileName) -> \\(destFileURL.path)\")\n        } catch {\n            print(\"File copy failed: \\(fileName), error: \\(error.localizedDescription)\")\n        }\n    }\n}\n"
  },
  {
    "path": "examples/client_sdk/ios/swift/ViewController.swift",
    "content": "//\n//  ViewController.swift\n//  TestXCFrameworkSwift\n//\n//  Created by haochangjiu on 2025/10/30.\n//\n\nimport UIKit\nimport Nhpagent\n\nclass ViewController: UIViewController {\n    override func viewDidLoad() {\n        super.viewDidLoad()\n        // Do any additional setup after loading the view.\n        // Call method to copy files from etc folder to sandbox etc directory\n        FileCopyManager.copyFilesToSandboxEtc()\n        // Retrieve the sandbox target path (Documents), which is the parent directory of the etc folder\n        guard let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else {\n            print(\"Error: Failed to read Documents directory\")\n            return\n        }\n        // Get the parent directory path of the etc folder\n        let etcPath: String = documentsURL.path\n        // Call SdkNhpAgentInit for initialization\n        let initFlag: Bool = IossdkNhpAgentInit(etcPath, 3)\n        if !initFlag {\n            print(\"NHP Agent init failed\")\n        }\n        // Call knockloop_start\n        let value = IossdkNhpAgentKnockloopStart()\n        print(\"SdkNhpAgentKnockloopStart value: %ld\", value)\n  }\n}"
  },
  {
    "path": "examples/server_plugin/authenticator/Makefile",
    "content": "export GO111MODULE := on\n\nall: build\n\nPluginName = authenticator\nTargetName = ${PluginName}.so\nServerDir = ../../../release/nhp-server\nLD_FLAGS = \"-s -w\"\n\n# Color definition\nCOLOUR_GREEN=\\033[0;32m\nCOLOUR_RED=\\033[0;31m\nCOLOUR_BLUE=\\033[0;34m\nEND_COLOUR=\\033[0m\n\nbuild:\n\t@echo \"$(COLOUR_BLUE)[Plugin-${PluginName}] Start building... $(END_COLOUR)\"\n\tgo build -buildmode=plugin -trimpath -ldflags ${LD_FLAGS} -v -o ${ServerDir}/plugins/${PluginName}/${TargetName} ./main.go ./qrauth.go\n\tmkdir -p ${ServerDir}/plugins/${PluginName}/etc\n\tcp ./etc/*.toml ${ServerDir}/plugins/${PluginName}/etc/\n\tmkdir -p ${ServerDir}/templates/${PluginName}\n\tcp ./templates/*.* ${ServerDir}/templates/${PluginName}\n\t@echo \"$(COLOUR_GREEN)[Plugin-${PluginName}] Successfully built!$(END_COLOUR)\"\n.PHONY: all build\n\n"
  },
  {
    "path": "examples/server_plugin/authenticator/etc/config.toml",
    "content": "# Authenticator Plugin Configuration\n\n# OTP Secret Key for manual OTP input authentication\n# This is a Base32 encoded secret key (recommended length: 16-32 characters)\n# You can generate one using: https://www.google.com/landing/2step/ or similar tools\n# Example: JBSWY3DPEHPK3PXP (16 characters)\nOTPSecretKey = \"JBSWY3DPEHPK3PXPJBSWY3DPEHPK3PXP\"\n\n# OTP code validity period in seconds (default: 30)\nOTPPeriod = 30\n\n# Number of digits in OTP code (default: 6)\nOTPDigits = 6\n\n# QR code expiry time in seconds (default: 300)\nQRCodeExpiry = 300\n"
  },
  {
    "path": "examples/server_plugin/authenticator/etc/resource.toml",
    "content": "# List resources id and their sub-fields here\n\n# syntax [\"{ResourceId}\"]\n# ResourceId: id for the resource group. Each AuthServiceId can have multiple ResourceIds.\n# SkipAuth: true: auth by matching the AuthServiceId and ResourceId, skip using plugin logic.\n# OpenTime: seconds for traffic passing duration after successful knock.\n# RedirectUrl: a customized url send back with the http response message as an option for redirection. (only applicable for http agent)\n# RedirectWithParams: whether or not to include queries in the original http request. (only applicable for http agent)\n[\"demo\"]\nSkipAuth = true\nOpenTime = 15\nRedirectUrl = \"https://acdemo.opennhp.org\"\nRedirectWithParams = false\nCookieDomain = \"opennhp.org\"\n\n# syntax [\"{ResourceId}\".Resources.\"{ResourceName}\"]\n# ResourceName: name of resource inside a resource group. Each ResourceId can have multiple ResourceNames.\n# ACId: id of the NHP-AC that guards the resource.\n# Hostname: domain for the resource.\n# Addr.Ip: destination ip address of the resource.\n# Addr.Port: destination port of the resource.\n# Addr.Protocol: whether to pass a specific protocol among \"tcp\", \"udp\", \"any\". \"any\" also includes ping traffic.\n# PortSuffix: true: fill ack field \"resHost\" with \"{Hostname}:{Port}\", false: fill ack field \"resHost\" with just \"{Hostname}\"\n[\"demo\".Resources.\"demoServer\"]\nACId = \"testAC-1\"\nHostname = \"acdemo.opennhp.org\"\nAddr.Ip = \"220.191.216.236\"\nAddr.Port = 443 # empty or 0 for all ports\nAddr.Protocol = \"\" # \"tcp/udp/any\", empty for \"any\"\nPortSuffix = false\n\n# extra information as per-plugin defined fields\n[\"demo\".ExInfo]\nTitle = \"OpenNHP Demo - Authentication\"\n\n"
  },
  {
    "path": "examples/server_plugin/authenticator/go.mod",
    "content": "module github.com/OpenNHP/opennhp/examples/server_plugin/authenticator\n\ngo 1.25.6\n\nrequire (\n\tgithub.com/OpenNHP/opennhp/nhp v0.6.0\n\tgithub.com/gin-gonic/gin v1.12.0\n\tgithub.com/pelletier/go-toml/v2 v2.2.4\n\tgithub.com/pquerna/otp v1.5.0\n)\n\nrequire (\n\tgithub.com/boombuler/barcode v1.0.1-0.20190219062509-6c824513bacc // indirect\n\tgithub.com/bytedance/gopkg v0.1.3 // indirect\n\tgithub.com/bytedance/sonic v1.15.0 // indirect\n\tgithub.com/bytedance/sonic/loader v0.5.0 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.3.0 // indirect\n\tgithub.com/cloudwego/base64x v0.1.6 // indirect\n\tgithub.com/coocood/freecache v1.2.5 // indirect\n\tgithub.com/fsnotify/fsnotify v1.9.0 // indirect\n\tgithub.com/gabriel-vasile/mimetype v1.4.12 // indirect\n\tgithub.com/gin-contrib/sse v1.1.0 // indirect\n\tgithub.com/go-playground/locales v0.14.1 // indirect\n\tgithub.com/go-playground/universal-translator v0.18.1 // indirect\n\tgithub.com/go-playground/validator/v10 v10.30.1 // indirect\n\tgithub.com/goccy/go-json v0.10.5 // indirect\n\tgithub.com/goccy/go-yaml v1.19.2 // indirect\n\tgithub.com/google/uuid v1.6.0 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.3.0 // indirect\n\tgithub.com/leodido/go-urn v1.4.0 // indirect\n\tgithub.com/mattn/go-isatty v0.0.20 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/quic-go/qpack v0.6.0 // indirect\n\tgithub.com/quic-go/quic-go v0.59.0 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgithub.com/ugorji/go/codec v1.3.1 // indirect\n\tgo.mongodb.org/mongo-driver/v2 v2.5.0 // indirect\n\tgolang.org/x/arch v0.23.0 // indirect\n\tgolang.org/x/crypto v0.48.0 // indirect\n\tgolang.org/x/net v0.51.0 // indirect\n\tgolang.org/x/sys v0.42.0 // indirect\n\tgolang.org/x/text v0.34.0 // indirect\n\tgoogle.golang.org/protobuf v1.36.11 // indirect\n)\n\nreplace github.com/OpenNHP/opennhp/nhp v0.6.0 => ../../../nhp\n"
  },
  {
    "path": "examples/server_plugin/authenticator/go.sum",
    "content": "github.com/boombuler/barcode v1.0.1-0.20190219062509-6c824513bacc h1:biVzkmvwrH8WK8raXaxBx6fRVTlJILwEwQGL1I/ByEI=\ngithub.com/boombuler/barcode v1.0.1-0.20190219062509-6c824513bacc/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=\ngithub.com/bytedance/gopkg v0.1.3 h1:TPBSwH8RsouGCBcMBktLt1AymVo2TVsBVCY4b6TnZ/M=\ngithub.com/bytedance/gopkg v0.1.3/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/sonic v1.15.0 h1:/PXeWFaR5ElNcVE84U0dOHjiMHQOwNIx3K4ymzh/uSE=\ngithub.com/bytedance/sonic v1.15.0/go.mod h1:tFkWrPz0/CUCLEF4ri4UkHekCIcdnkqXw9VduqpJh0k=\ngithub.com/bytedance/sonic/loader v0.5.0 h1:gXH3KVnatgY7loH5/TkeVyXPfESoqSBSBEiDd5VjlgE=\ngithub.com/bytedance/sonic/loader v0.5.0/go.mod h1:AR4NYCk5DdzZizZ5djGqQ92eEhCCcdf5x77udYiSJRo=\ngithub.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=\ngithub.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cloudwego/base64x v0.1.6 h1:t11wG9AECkCDk5fMSoxmufanudBtJ+/HemLstXDLI2M=\ngithub.com/cloudwego/base64x v0.1.6/go.mod h1:OFcloc187FXDaYHvrNIjxSe8ncn0OOM8gEHfghB2IPU=\ngithub.com/coocood/freecache v1.2.5 h1:FmhRQ8cLLVq9zWhHVYODUEZ0xu6rTPrVeAnX1AEIf7I=\ngithub.com/coocood/freecache v1.2.5/go.mod h1:RBUWa/Cy+OHdfTGFEhEuE1pMCMX51Ncizj7rthiQ3vk=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k=\ngithub.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0=\ngithub.com/gabriel-vasile/mimetype v1.4.12 h1:e9hWvmLYvtp846tLHam2o++qitpguFiYCKbn0w9jyqw=\ngithub.com/gabriel-vasile/mimetype v1.4.12/go.mod h1:d+9Oxyo1wTzWdyVUPMmXFvp4F9tea18J8ufA774AB3s=\ngithub.com/gin-contrib/sse v1.1.0 h1:n0w2GMuUpWDVp7qSpvze6fAu9iRxJY4Hmj6AmBOU05w=\ngithub.com/gin-contrib/sse v1.1.0/go.mod h1:hxRZ5gVpWMT7Z0B0gSNYqqsSCNIJMjzvm6fqCz9vjwM=\ngithub.com/gin-gonic/gin v1.12.0 h1:b3YAbrZtnf8N//yjKeU2+MQsh2mY5htkZidOM7O0wG8=\ngithub.com/gin-gonic/gin v1.12.0/go.mod h1:VxccKfsSllpKshkBWgVgRniFFAzFb9csfngsqANjnLc=\ngithub.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=\ngithub.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=\ngithub.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA=\ngithub.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=\ngithub.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=\ngithub.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=\ngithub.com/go-playground/validator/v10 v10.30.1 h1:f3zDSN/zOma+w6+1Wswgd9fLkdwy06ntQJp0BBvFG0w=\ngithub.com/go-playground/validator/v10 v10.30.1/go.mod h1:oSuBIQzuJxL//3MelwSLD5hc2Tu889bF0Idm9Dg26cM=\ngithub.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4=\ngithub.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M=\ngithub.com/goccy/go-yaml v1.19.2 h1:PmFC1S6h8ljIz6gMRBopkjP1TVT7xuwrButHID66PoM=\ngithub.com/goccy/go-yaml v1.19.2/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA=\ngithub.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=\ngithub.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=\ngithub.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzhA9Y=\ngithub.com/klauspost/cpuid/v2 v2.3.0/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0=\ngithub.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ=\ngithub.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI=\ngithub.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=\ngithub.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4=\ngithub.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pquerna/otp v1.5.0 h1:NMMR+WrmaqXU4EzdGJEE1aUUI0AMRzsp96fFFWNPwxs=\ngithub.com/pquerna/otp v1.5.0/go.mod h1:dkJfzwRKNiegxyNb54X/3fLwhCynbMspSyWKnvi1AEg=\ngithub.com/quic-go/qpack v0.6.0 h1:g7W+BMYynC1LbYLSqRt8PBg5Tgwxn214ZZR34VIOjz8=\ngithub.com/quic-go/qpack v0.6.0/go.mod h1:lUpLKChi8njB4ty2bFLX2x4gzDqXwUpaO1DP9qMDZII=\ngithub.com/quic-go/quic-go v0.59.0 h1:OLJkp1Mlm/aS7dpKgTc6cnpynnD2Xg7C1pwL6vy/SAw=\ngithub.com/quic-go/quic-go v0.59.0/go.mod h1:upnsH4Ju1YkqpLXC305eW3yDZ4NfnNbmQRCMWS58IKU=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=\ngithub.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/ugorji/go/codec v1.3.1 h1:waO7eEiFDwidsBN6agj1vJQ4AG7lh2yqXyOXqhgQuyY=\ngithub.com/ugorji/go/codec v1.3.1/go.mod h1:pRBVtBSKl77K30Bv8R2P+cLSGaTtex6fsA2Wjqmfxj4=\ngo.mongodb.org/mongo-driver/v2 v2.5.0 h1:yXUhImUjjAInNcpTcAlPHiT7bIXhshCTL3jVBkF3xaE=\ngo.mongodb.org/mongo-driver/v2 v2.5.0/go.mod h1:yOI9kBsufol30iFsl1slpdq1I0eHPzybRWdyYUs8K/0=\ngo.uber.org/mock v0.6.0 h1:hyF9dfmbgIX5EfOdasqLsWD6xqpNZlXblLB/Dbnwv3Y=\ngo.uber.org/mock v0.6.0/go.mod h1:KiVJ4BqZJaMj4svdfmHM0AUx4NJYO8ZNpPnZn1Z+BBU=\ngolang.org/x/arch v0.23.0 h1:lKF64A2jF6Zd8L0knGltUnegD62JMFBiCPBmQpToHhg=\ngolang.org/x/arch v0.23.0/go.mod h1:dNHoOeKiyja7GTvF9NJS1l3Z2yntpQNzgrjh1cU103A=\ngolang.org/x/crypto v0.48.0 h1:/VRzVqiRSggnhY7gNRxPauEQ5Drw9haKdM0jqfcCFts=\ngolang.org/x/crypto v0.48.0/go.mod h1:r0kV5h3qnFPlQnBSrULhlsRfryS2pmewsg+XfMgkVos=\ngolang.org/x/net v0.51.0 h1:94R/GTO7mt3/4wIKpcR5gkGmRLOuE/2hNGeWq/GBIFo=\ngolang.org/x/net v0.51.0/go.mod h1:aamm+2QF5ogm02fjy5Bb7CQ0WMt1/WVM7FtyaTLlA9Y=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.42.0 h1:omrd2nAlyT5ESRdCLYdm3+fMfNFE/+Rf4bDIQImRJeo=\ngolang.org/x/sys v0.42.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=\ngolang.org/x/text v0.34.0 h1:oL/Qq0Kdaqxa1KbNeMKwQq0reLCCaFtqu2eNuSeNHbk=\ngolang.org/x/text v0.34.0/go.mod h1:homfLqTYRFyVYemLBFl5GgL/DWEiH5wcsQ5gSh1yziA=\ngoogle.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE=\ngoogle.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\n"
  },
  {
    "path": "examples/server_plugin/authenticator/main.go",
    "content": "package main\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"net/http\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"sync\"\n\n\t\"github.com/OpenNHP/opennhp/nhp/common\"\n\tnhplog \"github.com/OpenNHP/opennhp/nhp/log\"\n\t\"github.com/OpenNHP/opennhp/nhp/plugins\"\n\t\"github.com/OpenNHP/opennhp/nhp/utils\"\n\t\"github.com/gin-gonic/gin\"\n\n\ttoml \"github.com/pelletier/go-toml/v2\"\n)\n\ntype config struct {\n\t// Plugin specific config\n\tOTPSecretKey string `toml:\"OTPSecretKey\"` // Fixed OTP secret key for manual OTP input\n\tOTPPeriod    int    `toml:\"OTPPeriod\"`    // OTP validity period in seconds (default 30)\n\tOTPDigits    int    `toml:\"OTPDigits\"`    // Number of OTP digits (default 6)\n\tQRCodeExpiry int    `toml:\"QRCodeExpiry\"` // QR code expiry in seconds (default 300)\n}\n\nvar (\n\t// Plugin Settings\n\tlog           *nhplog.Logger\n\tpluginDirPath string\n\thostname      string\n\tlocalIp       string\n\tlocalMac      string\n)\n\nvar (\n\tname    = \"authenticator\"\n\tversion = \"1.0.0\"\n\n\tbaseConfigWatch io.Closer\n\tresConfigWatch  io.Closer\n\n\tbaseConf         *config\n\tresourceMapMutex sync.Mutex\n\tresourceMap      common.ResourceGroupMap\n)\n\nvar (\n\terrLoadConfig = fmt.Errorf(\"config load error\")\n)\n\nfunc Version() string {\n\treturn fmt.Sprintf(\"%s v%s\", name, version)\n}\n\nfunc Init(in *plugins.PluginParamsIn) error {\n\tif in.PluginDirPath != nil {\n\t\tpluginDirPath = *in.PluginDirPath\n\t}\n\tif in.Log != nil {\n\t\tlog = in.Log\n\t}\n\tif in.Hostname != nil {\n\t\thostname = *in.Hostname\n\t}\n\tif in.LocalIp != nil {\n\t\tlocalIp = *in.LocalIp\n\t}\n\tif in.LocalMac != nil {\n\t\tlocalMac = *in.LocalMac\n\t}\n\n\t// Initialize QR Auth Service\n\tInitQRAuthService()\n\n\t// load config\n\tfileNameBase := filepath.Join(pluginDirPath, \"etc\", \"config.toml\")\n\tif err := updateConfig(fileNameBase); err != nil {\n\t\t_ = err\n\t}\n\n\tbaseConfigWatch = utils.WatchFile(fileNameBase, func() {\n\t\tlog.Info(\"base config: %s has been updated\", fileNameBase)\n\t\tupdateConfig(fileNameBase)\n\t})\n\n\tfileNameRes := filepath.Join(pluginDirPath, \"etc\", \"resource.toml\")\n\tif err := updateResource(fileNameRes); err != nil {\n\t\t_ = err\n\t}\n\tresConfigWatch = utils.WatchFile(fileNameRes, func() {\n\t\tlog.Info(\"resource config: %s has been updated\", fileNameRes)\n\t\tupdateResource(fileNameRes)\n\t})\n\n\treturn nil\n}\n\nfunc updateConfig(file string) (err error) {\n\tutils.CatchPanicThenRun(func() {\n\t\terr = errLoadConfig\n\t})\n\n\tcontent, err := os.ReadFile(file)\n\tif err != nil {\n\t\tlog.Error(\"failed to read config file %s: %v\", file, err)\n\t\treturn err\n\t}\n\n\tconf := &config{}\n\tif err = toml.Unmarshal(content, conf); err != nil {\n\t\tlog.Error(\"failed to unmarshal config: %v\", err)\n\t\treturn err\n\t}\n\n\t// Set defaults\n\tif conf.OTPPeriod == 0 {\n\t\tconf.OTPPeriod = 30\n\t}\n\tif conf.OTPDigits == 0 {\n\t\tconf.OTPDigits = 6\n\t}\n\tif conf.QRCodeExpiry == 0 {\n\t\tconf.QRCodeExpiry = 300\n\t}\n\n\tbaseConf = conf\n\tlog.Info(\"Authenticator plugin config loaded: OTPSecretKey=%s..., OTPPeriod=%d, OTPDigits=%d, QRCodeExpiry=%d\",\n\t\tconf.OTPSecretKey[:min(8, len(conf.OTPSecretKey))], conf.OTPPeriod, conf.OTPDigits, conf.QRCodeExpiry)\n\n\treturn nil\n}\n\nfunc updateResource(file string) (err error) {\n\tutils.CatchPanicThenRun(func() {\n\t\terr = errLoadConfig\n\t})\n\n\tcontent, err := os.ReadFile(file)\n\tif err != nil {\n\t\tlog.Error(\"failed to read resource file %s: %v\", file, err)\n\t\treturn err\n\t}\n\n\tresourceMapMutex.Lock()\n\tdefer resourceMapMutex.Unlock()\n\n\tresourceMap = make(common.ResourceGroupMap)\n\tif err = toml.Unmarshal(content, &resourceMap); err != nil {\n\t\tlog.Error(\"failed to unmarshal resource: %v\", err)\n\t\treturn err\n\t}\n\n\t// Set resource ID and auth service ID\n\tfor resId, res := range resourceMap {\n\t\tres.AuthServiceId = name\n\t\tres.ResourceId = resId\n\t}\n\n\treturn nil\n}\n\nfunc findResource(resId string) *common.ResourceData {\n\tresourceMapMutex.Lock()\n\tdefer resourceMapMutex.Unlock()\n\tres := resourceMap[resId]\n\treturn res\n}\n\nfunc Close() error {\n\tif baseConfigWatch != nil {\n\t\tbaseConfigWatch.Close()\n\t}\n\tif resConfigWatch != nil {\n\t\tresConfigWatch.Close()\n\t}\n\treturn nil\n}\n\n// CORS middleware\nfunc corsMiddleware(ctx *gin.Context) {\n\tctx.Header(\"Access-Control-Allow-Origin\", \"*\")\n\tctx.Header(\"Access-Control-Allow-Methods\", \"GET, POST, OPTIONS\")\n\tctx.Header(\"Access-Control-Allow-Headers\", \"Content-Type, Authorization\")\n}\n\n// AuthWithHttp handles HTTP authentication requests\nfunc AuthWithHttp(ctx *gin.Context, req *common.HttpKnockRequest, helper *plugins.HttpServerPluginHelper) (ackMsg *common.ServerKnockAckMsg, err error) {\n\tif helper == nil {\n\t\treturn nil, fmt.Errorf(\"AuthWithHttp: helper is null\")\n\t}\n\n\tresId := ctx.Query(\"resid\")\n\taction := ctx.Query(\"action\")\n\tif len(resId) > 0 && strings.Contains(resId, \"|\") {\n\t\tparams := strings.Split(resId, \"|\")\n\t\tresId = params[0]\n\t\tif len(params) > 1 {\n\t\t\taction = params[1]\n\t\t}\n\t}\n\n\tres := findResource(resId)\n\tif res == nil || len(res.Resources) == 0 {\n\t\tackMsg = nil\n\t\terr = common.ErrResourceNotFound\n\t\tlog.Error(\"resource error: %v\", err)\n\t\tctx.String(http.StatusOK, \"{\\\"errMsg\\\": \\\"resource error: %v\\\"}\", err)\n\t\treturn\n\t}\n\n\tcorsMiddleware(ctx)\n\n\tswitch {\n\tcase strings.EqualFold(action, \"otpvalid\"):\n\t\t// OTP code validation (manual input)\n\t\tackMsg, err = authOTPCode(ctx, req, res, helper)\n\n\tcase strings.EqualFold(action, \"qrvalid\"):\n\t\t// QR code authentication (after mobile scan)\n\t\tackMsg, err = authQRCode(ctx, req, res, helper)\n\n\tcase strings.EqualFold(action, \"login\"):\n\t\t// Show login page\n\t\tackMsg, err = showLoginPage(ctx, req, res, helper)\n\n\tcase strings.EqualFold(action, \"generate\"):\n\t\t// Generate QR code\n\t\tHandleQRGenerate(ctx, resId)\n\t\tackMsg, err = nil, nil\n\n\tcase strings.EqualFold(action, \"verify\"):\n\t\t// Mobile device QR verification\n\t\tHandleQRVerify(ctx)\n\t\tackMsg, err = nil, nil\n\n\tcase strings.EqualFold(action, \"status\"):\n\t\t// Check QR code status (polling from web browser)\n\t\tHandleQRStatus(ctx)\n\t\tackMsg, err = nil, nil\n\n\tcase strings.EqualFold(action, \"scan\"):\n\t\t// Mobile device scan notification\n\t\tHandleQRScan(ctx)\n\t\tackMsg, err = nil, nil\n\n\tdefault:\n\t\tackMsg = nil\n\t\terr = fmt.Errorf(\"action invalid\")\n\t}\n\treturn\n}\n\n// showLoginPage displays the authenticator login page\nfunc showLoginPage(ctx *gin.Context, req *common.HttpKnockRequest, res *common.ResourceData, helper *plugins.HttpServerPluginHelper) (*common.ServerKnockAckMsg, error) {\n\t_ = helper\n\n\ttitle := \"OTP Authentication\"\n\tif res.ExInfo != nil {\n\t\tif t, ok := res.ExInfo[\"Title\"].(string); ok {\n\t\t\ttitle = t\n\t\t}\n\t}\n\n\t// Get OTP secret key from config\n\totpSecretKey := \"\"\n\tif baseConf != nil {\n\t\totpSecretKey = baseConf.OTPSecretKey\n\t}\n\n\tctx.HTML(http.StatusOK, \"authenticator/authenticator_login.html\", gin.H{\n\t\t\"title\":        title,\n\t\t\"nhpServer\":    hostname,\n\t\t\"aspId\":        name, // Use plugin name as aspId\n\t\t\"resId\":        res.ResourceId,\n\t\t\"otpSecretKey\": otpSecretKey,\n\t})\n\n\treturn nil, nil\n}\n\n// authOTPCode validates OTP code entered manually\nfunc authOTPCode(ctx *gin.Context, req *common.HttpKnockRequest, res *common.ResourceData, helper *plugins.HttpServerPluginHelper) (*common.ServerKnockAckMsg, error) {\n\totpCode := ctx.Query(\"otpCode\")\n\n\tif otpCode == \"\" {\n\t\tlog.Info(\"OTP auth failed: missing otpCode\")\n\t\tctx.JSON(http.StatusOK, gin.H{\n\t\t\t\"success\": false,\n\t\t\t\"errMsg\":  \"missing otpCode\",\n\t\t})\n\t\treturn nil, fmt.Errorf(\"missing otpCode\")\n\t}\n\n\t// Verify OTP code using configured secret key\n\tif baseConf == nil || baseConf.OTPSecretKey == \"\" {\n\t\tlog.Error(\"OTP auth failed: OTPSecretKey not configured\")\n\t\tctx.JSON(http.StatusOK, gin.H{\n\t\t\t\"success\": false,\n\t\t\t\"errMsg\":  \"OTP secret key not configured\",\n\t\t})\n\t\treturn nil, fmt.Errorf(\"OTPSecretKey not configured\")\n\t}\n\n\t// Validate OTP using configured secret\n\tservice := GetQRAuthService()\n\tif !service.ValidateConfiguredOTP(baseConf.OTPSecretKey, otpCode) {\n\t\tlog.Info(\"OTP verification failed: invalid OTP code\")\n\t\tctx.JSON(http.StatusOK, gin.H{\n\t\t\t\"success\": false,\n\t\t\t\"errMsg\":  \"Invalid OTP code\",\n\t\t})\n\t\treturn nil, fmt.Errorf(\"invalid OTP code\")\n\t}\n\n\tlog.Info(\"OTP authentication successful using configured secret key\")\n\n\t// Proceed with knock operation\n\tackMsg, err := helper.AuthWithHttpCallbackFunc(req, res)\n\tif ackMsg == nil || ackMsg.ErrCode != common.ErrSuccess.ErrorCode() {\n\t\tlog.Error(\"OTP knock failed. ackMsg is nil\")\n\t\tackMsg = &common.ServerKnockAckMsg{}\n\t\tackMsg.ErrCode = common.ErrServerACOpsFailed.ErrorCode()\n\t\tif err != nil {\n\t\t\tackMsg.ErrMsg = err.Error()\n\t\t}\n\t} else {\n\t\tlog.Info(\"OTP knock succeeded.\")\n\t\tackMsg.ErrMsg = \"\"\n\t\tif len(res.RedirectUrl) > 0 {\n\t\t\tackMsg.RedirectUrl = res.RedirectUrl\n\t\t}\n\t}\n\tctx.JSON(http.StatusOK, ackMsg)\n\treturn ackMsg, nil\n}\n\n// authQRCode handles authentication after QR code scan\nfunc authQRCode(ctx *gin.Context, req *common.HttpKnockRequest, res *common.ResourceData, helper *plugins.HttpServerPluginHelper) (*common.ServerKnockAckMsg, error) {\n\tsessionId := ctx.Query(\"sessionId\")\n\tif sessionId == \"\" {\n\t\tlog.Info(\"QR auth failed: missing sessionId\")\n\t\treturn nil, fmt.Errorf(\"missing sessionId for QR authentication\")\n\t}\n\n\tlog.Info(\"QR authentication for sessionId: %s\", sessionId)\n\n\t// Proceed with knock operation\n\tackMsg, err := helper.AuthWithHttpCallbackFunc(req, res)\n\tif ackMsg == nil || ackMsg.ErrCode != common.ErrSuccess.ErrorCode() {\n\t\tlog.Error(\"QR knock failed. ackMsg is nil\")\n\t\tackMsg = &common.ServerKnockAckMsg{}\n\t\tackMsg.ErrCode = common.ErrServerACOpsFailed.ErrorCode()\n\t\tif err != nil {\n\t\t\tackMsg.ErrMsg = err.Error()\n\t\t}\n\t} else {\n\t\tlog.Info(\"QR knock succeeded.\")\n\t\tackMsg.ErrMsg = \"\"\n\t\tif len(res.RedirectUrl) > 0 {\n\t\t\tackMsg.RedirectUrl = res.RedirectUrl\n\t\t}\n\t}\n\tctx.JSON(http.StatusOK, ackMsg)\n\treturn ackMsg, nil\n}\n"
  },
  {
    "path": "examples/server_plugin/authenticator/qrauth.go",
    "content": "package main\n\nimport (\n\t\"crypto/aes\"\n\t\"crypto/cipher\"\n\t\"crypto/hmac\"\n\t\"crypto/rand\"\n\t\"crypto/sha256\"\n\t\"encoding/base64\"\n\t\"encoding/hex\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"net/http\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/gin-gonic/gin\"\n\t\"github.com/pquerna/otp/totp\"\n)\n\n// QRCodeSession represents a QR code login session\ntype QRCodeSession struct {\n\tSessionID     string    `json:\"sessionId\"`\n\tToken         string    `json:\"token\"`\n\tOTPSecret     string    `json:\"otpSecret\"`\n\tAuthServiceId string    `json:\"aspId\"`\n\tResourceId    string    `json:\"resId\"`\n\tSrcIp         string    `json:\"srcIp\"`\n\tStatus        int       `json:\"status\"` // 0: pending, 1: scanned, 2: confirmed, 3: expired, 4: failed\n\tCreatedAt     time.Time `json:\"createdAt\"`\n\tExpiresAt     time.Time `json:\"expiresAt\"`\n\tConfirmedAt   time.Time `json:\"confirmedAt,omitempty\"`\n\tMobileIP      string    `json:\"mobileIp,omitempty\"`\n\tMobileDevice  string    `json:\"mobileDevice,omitempty\"`\n\tErrMsg        string    `json:\"errMsg,omitempty\"`\n}\n\n// QRCodeStatus constants\nconst (\n\tQRStatusPending   = 0\n\tQRStatusScanned   = 1\n\tQRStatusConfirmed = 2\n\tQRStatusExpired   = 3\n\tQRStatusFailed    = 4\n)\n\n// QRAuthService manages QR code authentication sessions\ntype QRAuthService struct {\n\tsessions   map[string]*QRCodeSession\n\tmutex      sync.RWMutex\n\tencryptKey []byte\n\thmacKey    []byte\n\texpiry     time.Duration\n}\n\n// QRCodeData structure (encoded in QR)\ntype QRCodeData struct {\n\tSessionID string `json:\"sid\"`\n\tToken     string `json:\"tok\"`\n\tTimestamp int64  `json:\"ts\"`\n\tAspId     string `json:\"asp\"`\n\tResId     string `json:\"res\"`\n\tServer    string `json:\"srv\"`\n\tSignature string `json:\"sig\"`\n}\n\n// QRVerifyRequest is the request from mobile device\ntype QRVerifyRequest struct {\n\tSessionID     string `json:\"sessionId\"`\n\tToken         string `json:\"token\"`\n\tOTPCode       string `json:\"otpCode\"`\n\tDeviceInfo    string `json:\"deviceInfo\"`\n\tEncryptedData string `json:\"encryptedData\"`\n}\n\n// QRGenerateResponse is the response when generating QR code\ntype QRGenerateResponse struct {\n\tSuccess   bool   `json:\"success\"`\n\tSessionID string `json:\"sessionId,omitempty\"`\n\tQRData    string `json:\"qrData,omitempty\"`\n\tOTPSecret string `json:\"otpSecret,omitempty\"`\n\tOTPUri    string `json:\"otpUri,omitempty\"` // otpauth:// URI for Google Authenticator\n\tServerUrl string `json:\"serverUrl,omitempty\"`\n\tAspId     string `json:\"aspId,omitempty\"`\n\tResId     string `json:\"resId,omitempty\"`\n\tExpiresAt int64  `json:\"expiresAt,omitempty\"`\n\tErrMsg    string `json:\"errMsg,omitempty\"`\n}\n\n// QRStatusResponse is the response for status check\ntype QRStatusResponse struct {\n\tSuccess     bool   `json:\"success\"`\n\tStatus      int    `json:\"status\"`\n\tStatusText  string `json:\"statusText\"`\n\tRedirectUrl string `json:\"redirectUrl,omitempty\"`\n\tErrMsg      string `json:\"errMsg,omitempty\"`\n}\n\n// QRVerifyResponse is the response for mobile verification\ntype QRVerifyResponse struct {\n\tSuccess bool   `json:\"success\"`\n\tErrMsg  string `json:\"errMsg,omitempty\"`\n}\n\nvar qrAuthService *QRAuthService\nvar qrAuthOnce sync.Once\n\n// InitQRAuthService initializes the QR auth service\nfunc InitQRAuthService() {\n\tqrAuthOnce.Do(func() {\n\t\tencKey := make([]byte, 32)\n\t\thmacKey := make([]byte, 32)\n\t\trand.Read(encKey)\n\t\trand.Read(hmacKey)\n\n\t\tqrAuthService = &QRAuthService{\n\t\t\tsessions:   make(map[string]*QRCodeSession),\n\t\t\tencryptKey: encKey,\n\t\t\thmacKey:    hmacKey,\n\t\t\texpiry:     5 * time.Minute,\n\t\t}\n\n\t\tgo qrAuthService.cleanupExpiredSessions()\n\t})\n}\n\n// GetQRAuthService returns the singleton QR auth service\nfunc GetQRAuthService() *QRAuthService {\n\tif qrAuthService == nil {\n\t\tInitQRAuthService()\n\t}\n\treturn qrAuthService\n}\n\n// GenerateSession creates a new QR code session\nfunc (s *QRAuthService) GenerateSession(aspId, resId, srcIp, serverUrl string) (*QRCodeSession, *QRCodeData, string, error) {\n\t// Generate session ID\n\tsessionBytes := make([]byte, 16)\n\trand.Read(sessionBytes)\n\tsessionID := hex.EncodeToString(sessionBytes)\n\n\t// Generate random token\n\ttokenBytes := make([]byte, 32)\n\trand.Read(tokenBytes)\n\ttoken := base64.URLEncoding.EncodeToString(tokenBytes)\n\n\t// Generate TOTP secret\n\tkey, err := totp.Generate(totp.GenerateOpts{\n\t\tIssuer:      \"OpenNHP Authenticator\",\n\t\tAccountName: sessionID[:8],\n\t\tPeriod:      30,\n\t\tSecretSize:  20,\n\t})\n\tif err != nil {\n\t\treturn nil, nil, \"\", fmt.Errorf(\"failed to generate OTP secret: %v\", err)\n\t}\n\n\tnow := time.Now()\n\tsession := &QRCodeSession{\n\t\tSessionID:     sessionID,\n\t\tToken:         token,\n\t\tOTPSecret:     key.Secret(),\n\t\tAuthServiceId: aspId,\n\t\tResourceId:    resId,\n\t\tSrcIp:         srcIp,\n\t\tStatus:        QRStatusPending,\n\t\tCreatedAt:     now,\n\t\tExpiresAt:     now.Add(s.expiry),\n\t}\n\n\t// Store session\n\ts.mutex.Lock()\n\ts.sessions[sessionID] = session\n\ts.mutex.Unlock()\n\n\t// Create QR code data\n\tqrData := &QRCodeData{\n\t\tSessionID: sessionID,\n\t\tToken:     token,\n\t\tTimestamp: now.Unix(),\n\t\tAspId:     aspId,\n\t\tResId:     resId,\n\t\tServer:    serverUrl,\n\t}\n\n\t// Sign the QR data\n\tqrData.Signature = s.signQRData(qrData)\n\n\t// Generate OTP URI for Google Authenticator\n\totpUri := key.URL()\n\n\tlog.Info(\"Authenticator session created: sessionId=%s, aspId=%s, resId=%s\", sessionID, aspId, resId)\n\treturn session, qrData, otpUri, nil\n}\n\n// signQRData creates HMAC signature for QR data\nfunc (s *QRAuthService) signQRData(data *QRCodeData) string {\n\th := hmac.New(sha256.New, s.hmacKey)\n\tsignData := fmt.Sprintf(\"%s|%s|%d|%s|%s|%s\", data.SessionID, data.Token, data.Timestamp, data.AspId, data.ResId, data.Server)\n\th.Write([]byte(signData))\n\treturn base64.URLEncoding.EncodeToString(h.Sum(nil))\n}\n\n// EncryptQRData encrypts the QR code data\nfunc (s *QRAuthService) EncryptQRData(data *QRCodeData) (string, error) {\n\tjsonData, err := json.Marshal(data)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\tblock, err := aes.NewCipher(s.encryptKey)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\tgcm, err := cipher.NewGCM(block)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\tnonce := make([]byte, gcm.NonceSize())\n\tif _, err := rand.Read(nonce); err != nil {\n\t\treturn \"\", err\n\t}\n\n\tciphertext := gcm.Seal(nonce, nonce, jsonData, nil)\n\treturn base64.URLEncoding.EncodeToString(ciphertext), nil\n}\n\n// DecryptQRData decrypts the QR code data\nfunc (s *QRAuthService) DecryptQRData(encrypted string) (*QRCodeData, error) {\n\tciphertext, err := base64.URLEncoding.DecodeString(encrypted)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tblock, err := aes.NewCipher(s.encryptKey)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tgcm, err := cipher.NewGCM(block)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tnonceSize := gcm.NonceSize()\n\tif len(ciphertext) < nonceSize {\n\t\treturn nil, fmt.Errorf(\"ciphertext too short\")\n\t}\n\n\tnonce, ciphertext := ciphertext[:nonceSize], ciphertext[nonceSize:]\n\tplaintext, err := gcm.Open(nil, nonce, ciphertext, nil)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar data QRCodeData\n\tif err := json.Unmarshal(plaintext, &data); err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &data, nil\n}\n\n// GetSession retrieves a session by ID\nfunc (s *QRAuthService) GetSession(sessionID string) *QRCodeSession {\n\ts.mutex.RLock()\n\tdefer s.mutex.RUnlock()\n\n\tsession, exists := s.sessions[sessionID]\n\tif !exists {\n\t\treturn nil\n\t}\n\n\tif time.Now().After(session.ExpiresAt) {\n\t\tsession.Status = QRStatusExpired\n\t}\n\n\treturn session\n}\n\n// VerifyOTPOnly verifies OTP code without mobile scan\nfunc (s *QRAuthService) VerifyOTPOnly(sessionID, otpCode string) error {\n\ts.mutex.Lock()\n\tdefer s.mutex.Unlock()\n\n\tsession, exists := s.sessions[sessionID]\n\tif !exists {\n\t\treturn fmt.Errorf(\"session not found\")\n\t}\n\n\tif time.Now().After(session.ExpiresAt) {\n\t\tsession.Status = QRStatusExpired\n\t\treturn fmt.Errorf(\"session expired\")\n\t}\n\n\t// Verify OTP\n\tif !totp.Validate(otpCode, session.OTPSecret) {\n\t\tsession.Status = QRStatusFailed\n\t\tsession.ErrMsg = \"invalid OTP code\"\n\t\treturn fmt.Errorf(\"invalid OTP code\")\n\t}\n\n\tsession.Status = QRStatusConfirmed\n\tsession.ConfirmedAt = time.Now()\n\treturn nil\n}\n\n// ValidateConfiguredOTP validates an OTP code against the configured secret key\nfunc (s *QRAuthService) ValidateConfiguredOTP(secretKey, otpCode string) bool {\n\treturn totp.Validate(otpCode, secretKey)\n}\n\n// VerifySession verifies a session with OTP\nfunc (s *QRAuthService) VerifySession(sessionID, token, otpCode, mobileIP, deviceInfo string) error {\n\ts.mutex.Lock()\n\tdefer s.mutex.Unlock()\n\n\tsession, exists := s.sessions[sessionID]\n\tif !exists {\n\t\treturn fmt.Errorf(\"session not found\")\n\t}\n\n\tif time.Now().After(session.ExpiresAt) {\n\t\tsession.Status = QRStatusExpired\n\t\treturn fmt.Errorf(\"session expired\")\n\t}\n\n\tif session.Status == QRStatusConfirmed {\n\t\treturn fmt.Errorf(\"session already confirmed\")\n\t}\n\n\t// Verify token\n\tif session.Token != token {\n\t\tsession.Status = QRStatusFailed\n\t\tsession.ErrMsg = \"invalid token\"\n\t\treturn fmt.Errorf(\"invalid token\")\n\t}\n\n\t// Verify OTP\n\tif !totp.Validate(otpCode, session.OTPSecret) {\n\t\tsession.Status = QRStatusFailed\n\t\tsession.ErrMsg = \"invalid OTP code\"\n\t\treturn fmt.Errorf(\"invalid OTP code\")\n\t}\n\n\tsession.Status = QRStatusConfirmed\n\tsession.ConfirmedAt = time.Now()\n\tsession.MobileIP = mobileIP\n\tsession.MobileDevice = deviceInfo\n\n\treturn nil\n}\n\n// UpdateSessionStatus updates session status\nfunc (s *QRAuthService) UpdateSessionStatus(sessionID string, status int) error {\n\ts.mutex.Lock()\n\tdefer s.mutex.Unlock()\n\n\tsession, exists := s.sessions[sessionID]\n\tif !exists {\n\t\treturn fmt.Errorf(\"session not found\")\n\t}\n\n\tsession.Status = status\n\treturn nil\n}\n\n// cleanupExpiredSessions removes expired sessions\nfunc (s *QRAuthService) cleanupExpiredSessions() {\n\tticker := time.NewTicker(1 * time.Minute)\n\tdefer ticker.Stop()\n\n\tfor range ticker.C {\n\t\ts.mutex.Lock()\n\t\tnow := time.Now()\n\t\tfor id, session := range s.sessions {\n\t\t\tif now.After(session.ExpiresAt.Add(5 * time.Minute)) {\n\t\t\t\tdelete(s.sessions, id)\n\t\t\t}\n\t\t}\n\t\ts.mutex.Unlock()\n\t}\n}\n\n// HandleQRGenerate handles QR code generation\nfunc HandleQRGenerate(ctx *gin.Context, resId string) {\n\tservice := GetQRAuthService()\n\n\taspId := \"authenticator\"\n\tsrcIp := ctx.ClientIP()\n\n\t// Build server URL\n\tscheme := \"https\"\n\tif ctx.Request.TLS == nil {\n\t\tscheme = \"http\"\n\t}\n\tserverUrl := fmt.Sprintf(\"%s://%s\", scheme, ctx.Request.Host)\n\n\tsession, qrData, otpUri, err := service.GenerateSession(aspId, resId, srcIp, serverUrl)\n\tif err != nil {\n\t\tctx.JSON(http.StatusOK, QRGenerateResponse{\n\t\t\tSuccess: false,\n\t\t\tErrMsg:  err.Error(),\n\t\t})\n\t\treturn\n\t}\n\n\t// Encrypt QR data\n\tencryptedData, err := service.EncryptQRData(qrData)\n\tif err != nil {\n\t\tctx.JSON(http.StatusOK, QRGenerateResponse{\n\t\t\tSuccess: false,\n\t\t\tErrMsg:  \"Failed to encrypt QR data\",\n\t\t})\n\t\treturn\n\t}\n\n\tresponse := QRGenerateResponse{\n\t\tSuccess:   true,\n\t\tSessionID: session.SessionID,\n\t\tQRData:    encryptedData,\n\t\tOTPSecret: session.OTPSecret,\n\t\tOTPUri:    otpUri,\n\t\tServerUrl: serverUrl,\n\t\tAspId:     aspId,\n\t\tResId:     resId,\n\t\tExpiresAt: session.ExpiresAt.Unix(),\n\t}\n\n\tctx.JSON(http.StatusOK, response)\n}\n\n// HandleQRStatus handles status check requests\nfunc HandleQRStatus(ctx *gin.Context) {\n\tsessionId := ctx.Query(\"sessionId\")\n\tif sessionId == \"\" {\n\t\tctx.JSON(http.StatusOK, QRStatusResponse{\n\t\t\tSuccess: false,\n\t\t\tErrMsg:  \"missing sessionId\",\n\t\t})\n\t\treturn\n\t}\n\n\tservice := GetQRAuthService()\n\tsession := service.GetSession(sessionId)\n\tif session == nil {\n\t\tctx.JSON(http.StatusOK, QRStatusResponse{\n\t\t\tSuccess: false,\n\t\t\tErrMsg:  \"session not found\",\n\t\t})\n\t\treturn\n\t}\n\n\tstatusTexts := map[int]string{\n\t\tQRStatusPending:   \"pending\",\n\t\tQRStatusScanned:   \"scanned\",\n\t\tQRStatusConfirmed: \"confirmed\",\n\t\tQRStatusExpired:   \"expired\",\n\t\tQRStatusFailed:    \"failed\",\n\t}\n\n\tresponse := QRStatusResponse{\n\t\tSuccess:    true,\n\t\tStatus:     session.Status,\n\t\tStatusText: statusTexts[session.Status],\n\t}\n\n\tif session.Status == QRStatusConfirmed {\n\t\tres := findResource(session.ResourceId)\n\t\tif res != nil && len(res.RedirectUrl) > 0 {\n\t\t\tresponse.RedirectUrl = res.RedirectUrl\n\t\t}\n\t}\n\n\tctx.JSON(http.StatusOK, response)\n}\n\n// HandleQRScan handles scan notification from mobile\nfunc HandleQRScan(ctx *gin.Context) {\n\tsessionId := ctx.Query(\"sessionId\")\n\tif sessionId == \"\" {\n\t\tctx.JSON(http.StatusOK, gin.H{\n\t\t\t\"success\": false,\n\t\t\t\"errMsg\":  \"missing sessionId\",\n\t\t})\n\t\treturn\n\t}\n\n\tservice := GetQRAuthService()\n\terr := service.UpdateSessionStatus(sessionId, QRStatusScanned)\n\tif err != nil {\n\t\tctx.JSON(http.StatusOK, gin.H{\n\t\t\t\"success\": false,\n\t\t\t\"errMsg\":  err.Error(),\n\t\t})\n\t\treturn\n\t}\n\n\tctx.JSON(http.StatusOK, gin.H{\n\t\t\"success\": true,\n\t})\n}\n\n// HandleQRVerify handles verification from mobile device\nfunc HandleQRVerify(ctx *gin.Context) {\n\tvar req QRVerifyRequest\n\n\t// Support both GET and POST\n\tif ctx.Request.Method == \"GET\" {\n\t\treq.EncryptedData = ctx.Query(\"encryptedData\")\n\t\treq.OTPCode = ctx.Query(\"otpCode\")\n\t\treq.DeviceInfo = ctx.Query(\"deviceInfo\")\n\t} else {\n\t\tif err := ctx.ShouldBindJSON(&req); err != nil {\n\t\t\tctx.JSON(http.StatusOK, QRVerifyResponse{\n\t\t\t\tSuccess: false,\n\t\t\t\tErrMsg:  \"invalid request\",\n\t\t\t})\n\t\t\treturn\n\t\t}\n\t}\n\n\tif req.EncryptedData == \"\" || req.OTPCode == \"\" {\n\t\tctx.JSON(http.StatusOK, QRVerifyResponse{\n\t\t\tSuccess: false,\n\t\t\tErrMsg:  \"missing required fields\",\n\t\t})\n\t\treturn\n\t}\n\n\tservice := GetQRAuthService()\n\n\t// Decrypt QR data\n\tqrData, err := service.DecryptQRData(req.EncryptedData)\n\tif err != nil {\n\t\tctx.JSON(http.StatusOK, QRVerifyResponse{\n\t\t\tSuccess: false,\n\t\t\tErrMsg:  \"invalid QR data\",\n\t\t})\n\t\treturn\n\t}\n\n\t// Verify session\n\terr = service.VerifySession(qrData.SessionID, qrData.Token, req.OTPCode, ctx.ClientIP(), req.DeviceInfo)\n\tif err != nil {\n\t\tctx.JSON(http.StatusOK, QRVerifyResponse{\n\t\t\tSuccess: false,\n\t\t\tErrMsg:  err.Error(),\n\t\t})\n\t\treturn\n\t}\n\n\tctx.JSON(http.StatusOK, QRVerifyResponse{\n\t\tSuccess: true,\n\t})\n}\n"
  },
  {
    "path": "examples/server_plugin/authenticator/templates/authenticator_acdemo.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>OpenNHP Demo - AC Protected Server</title>\n    <link rel=\"preconnect\" href=\"https://fonts.googleapis.com\">\n    <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n    <link href=\"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600&family=Outfit:wght@300;400;600;700&display=swap\" rel=\"stylesheet\">\n    <style>\n        :root {\n            --bg-primary: #0a0e17;\n            --bg-secondary: #131a2b;\n            --bg-card: rgba(20, 30, 50, 0.85);\n            --accent-cyan: #00d4ff;\n            --accent-green: #00ff88;\n            --accent-orange: #ff6b35;\n            --text-primary: #e8eef5;\n            --text-secondary: #8892a4;\n            --border-color: rgba(0, 212, 255, 0.2);\n        }\n\n        * {\n            margin: 0;\n            padding: 0;\n            box-sizing: border-box;\n        }\n\n        body {\n            font-family: 'Outfit', sans-serif;\n            min-height: 100vh;\n            display: flex;\n            justify-content: center;\n            align-items: center;\n            background: var(--bg-primary);\n            background-image: \n                radial-gradient(ellipse at 20% 20%, rgba(0, 212, 255, 0.08) 0%, transparent 50%),\n                radial-gradient(ellipse at 80% 80%, rgba(0, 255, 136, 0.06) 0%, transparent 50%),\n                linear-gradient(180deg, var(--bg-primary) 0%, var(--bg-secondary) 100%);\n            padding: 2rem;\n        }\n\n        .container {\n            max-width: 640px;\n            width: 100%;\n            background: var(--bg-card);\n            backdrop-filter: blur(20px);\n            border: 1px solid var(--border-color);\n            border-radius: 24px;\n            padding: 3rem;\n            text-align: center;\n            box-shadow: \n                0 4px 60px rgba(0, 0, 0, 0.4),\n                0 0 0 1px rgba(255, 255, 255, 0.05) inset;\n            animation: fadeIn 0.6s ease-out;\n        }\n\n        @keyframes fadeIn {\n            from { opacity: 0; transform: translateY(20px); }\n            to { opacity: 1; transform: translateY(0); }\n        }\n\n        .logo-title {\n            display: flex;\n            align-items: center;\n            justify-content: center;\n            gap: 0.75rem;\n            margin-bottom: 0.5rem;\n        }\n\n        .logo-title img {\n            height: 48px;\n            width: 48px;\n        }\n\n        .logo-title h1 {\n            font-size: 1.5rem;\n            font-weight: 700;\n            color: var(--text-primary);\n            margin: 0;\n            letter-spacing: -0.02em;\n        }\n\n        .subtitle {\n            font-size: 0.95rem;\n            color: var(--text-secondary);\n            margin-bottom: 2rem;\n            text-align: center;\n        }\n\n        .server-links {\n            display: flex;\n            flex-direction: column;\n            gap: 0.75rem;\n            margin-bottom: 2.5rem;\n        }\n\n        .server-card {\n            background: rgba(0, 212, 255, 0.05);\n            border: 1px solid rgba(0, 212, 255, 0.15);\n            border-radius: 12px;\n            padding: 1rem 1.25rem;\n            display: flex;\n            align-items: center;\n            justify-content: space-between;\n            transition: all 0.3s ease;\n        }\n\n        .server-card:hover {\n            background: rgba(0, 212, 255, 0.1);\n            border-color: rgba(0, 212, 255, 0.3);\n            transform: translateY(-2px);\n        }\n\n        .server-url {\n            font-family: 'JetBrains Mono', monospace;\n            font-size: 0.9rem;\n            color: var(--accent-cyan);\n            text-decoration: none;\n        }\n\n        .scan-link {\n            font-size: 0.8rem;\n            color: var(--accent-green);\n            text-decoration: none;\n            padding: 0.4rem 0.8rem;\n            background: rgba(0, 255, 136, 0.1);\n            border-radius: 6px;\n            transition: all 0.2s ease;\n            display: flex;\n            align-items: center;\n            gap: 0.3rem;\n        }\n\n        .scan-link:hover {\n            background: rgba(0, 255, 136, 0.2);\n        }\n\n        .scan-link svg {\n            width: 14px;\n            height: 14px;\n            fill: currentColor;\n        }\n\n        .countdown-section {\n            background: linear-gradient(135deg, rgba(255, 107, 53, 0.1), rgba(255, 107, 53, 0.05));\n            border: 1px solid rgba(255, 107, 53, 0.2);\n            border-radius: 16px;\n            padding: 1.5rem;\n            margin-bottom: 1.5rem;\n        }\n\n        .countdown-label {\n            font-size: 0.85rem;\n            color: var(--text-secondary);\n            margin-bottom: 0.75rem;\n            text-transform: uppercase;\n            letter-spacing: 0.1em;\n        }\n\n        .countdown-timer {\n            display: flex;\n            align-items: baseline;\n            justify-content: center;\n            gap: 0.5rem;\n        }\n\n        #timer {\n            font-family: 'JetBrains Mono', monospace;\n            font-size: 3.5rem;\n            font-weight: 600;\n            color: var(--accent-orange);\n            line-height: 1;\n            text-shadow: 0 0 30px rgba(255, 107, 53, 0.5);\n            animation: pulse 1s ease-in-out infinite;\n        }\n\n        @keyframes pulse {\n            0%, 100% { opacity: 1; }\n            50% { opacity: 0.7; }\n        }\n\n        .countdown-unit {\n            font-size: 1rem;\n            color: var(--text-secondary);\n        }\n\n        #message {\n            display: none;\n            background: linear-gradient(135deg, rgba(0, 255, 136, 0.1), rgba(0, 255, 136, 0.05));\n            border: 1px solid rgba(0, 255, 136, 0.3);\n            border-radius: 16px;\n            padding: 1.5rem;\n            margin-bottom: 1.5rem;\n        }\n\n        #message .icon {\n            font-size: 2rem;\n            margin-bottom: 0.5rem;\n        }\n\n        #message .text {\n            font-size: 1.1rem;\n            color: var(--accent-green);\n            font-weight: 600;\n        }\n\n        .info-section {\n            display: flex;\n            flex-direction: column;\n            gap: 1rem;\n            align-items: center;\n        }\n\n        #ip-display {\n            font-family: 'JetBrains Mono', monospace;\n            font-size: 0.85rem;\n            color: var(--text-secondary);\n            background: rgba(255, 255, 255, 0.03);\n            padding: 0.5rem 1rem;\n            border-radius: 8px;\n            border: 1px solid rgba(255, 255, 255, 0.05);\n        }\n\n        .auto-refresh-toggle {\n            display: flex;\n            align-items: center;\n            gap: 0.75rem;\n            cursor: pointer;\n            user-select: none;\n        }\n\n        .auto-refresh-toggle input {\n            display: none;\n        }\n\n        .toggle-switch {\n            width: 44px;\n            height: 24px;\n            background: rgba(255, 255, 255, 0.1);\n            border-radius: 12px;\n            position: relative;\n            transition: all 0.3s ease;\n        }\n\n        .toggle-switch::after {\n            content: '';\n            position: absolute;\n            width: 18px;\n            height: 18px;\n            background: var(--text-secondary);\n            border-radius: 50%;\n            top: 3px;\n            left: 3px;\n            transition: all 0.3s ease;\n        }\n\n        .auto-refresh-toggle input:checked + .toggle-switch {\n            background: rgba(0, 255, 136, 0.3);\n        }\n\n        .auto-refresh-toggle input:checked + .toggle-switch::after {\n            background: var(--accent-green);\n            left: 23px;\n        }\n\n        .toggle-label {\n            font-size: 0.85rem;\n            color: var(--text-secondary);\n        }\n\n        .footer {\n            margin-top: 2rem;\n            padding-top: 1.5rem;\n            border-top: 1px solid rgba(255, 255, 255, 0.05);\n        }\n\n        .footer-text {\n            font-size: 0.75rem;\n            color: var(--text-secondary);\n            opacity: 0.6;\n        }\n\n        .footer-text a {\n            color: var(--accent-cyan);\n            text-decoration: none;\n        }\n\n        .language-select {\n            text-align: right;\n            margin-bottom: 1rem;\n        }\n\n        .language-select select {\n            background: rgba(255, 255, 255, 0.05);\n            border: 1px solid rgba(255, 255, 255, 0.1);\n            color: var(--text-secondary);\n            padding: 0.4rem 0.75rem;\n            border-radius: 8px;\n            font-family: 'Outfit', sans-serif;\n            font-size: 0.85rem;\n            cursor: pointer;\n            outline: none;\n            transition: all 0.2s ease;\n        }\n\n        .language-select select:hover {\n            border-color: var(--accent-cyan);\n        }\n\n        .language-select select option {\n            background: var(--bg-secondary);\n            color: var(--text-primary);\n        }\n\n        @media (max-width: 480px) {\n            .container {\n                padding: 2rem 1.5rem;\n            }\n\n            h1 {\n                font-size: 1.4rem;\n            }\n\n            .server-card {\n                flex-direction: column;\n                gap: 0.75rem;\n                text-align: center;\n            }\n\n            #timer {\n                font-size: 2.5rem;\n            }\n        }\n    </style>\n</head>\n<body>\n    <div class=\"container\">\n        <div class=\"language-select\">\n            <select id=\"languageSelect\" onchange=\"changeLanguage()\">\n                <option value=\"en\">English</option>\n                <option value=\"zh\">中文</option>\n                <option value=\"es\">Español</option>\n            </select>\n        </div>\n\n        <div class=\"logo-title\">\n            <img src=\"https://raw.githubusercontent.com/OpenNHP/opennhp/main/docs/images/logo10.png\" alt=\"OpenNHP Logo\">\n            <h1 id=\"title\">OpenNHP AC Protected Server</h1>\n        </div>\n        <p class=\"subtitle\" id=\"subtitle\">Invisible to Unauthenticated Users</p>\n\n        <div class=\"server-links\">\n            <div class=\"server-card\">\n                <span class=\"server-url\">https://acdemo.opennhp.org</span>\n                <a href=\"https://dnschecker.org/port-scanner.php?query=acdemo.opennhp.org&ptype=server\" target=\"_blank\" class=\"scan-link scan-link-1\">\n                    <svg viewBox=\"0 0 24 24\"><path d=\"M11 7h2v2h-2zm0 4h2v6h-2zm1-9C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z\"/></svg>\n                    <span id=\"scanPorts1\">Scan Ports</span>\n                </a>\n            </div>\n            <div class=\"server-card\">\n                <span class=\"server-url\">https://demo.nhp</span>\n                <a href=\"https://dnschecker.org/port-scanner.php?query=demo.nhp&ptype=server\" target=\"_blank\" class=\"scan-link scan-link-2\">\n                    <svg viewBox=\"0 0 24 24\"><path d=\"M11 7h2v2h-2zm0 4h2v6h-2zm1-9C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z\"/></svg>\n                    <span id=\"scanPorts2\">Scan Ports</span>\n                </a>\n            </div>\n        </div>\n\n        <div class=\"countdown-section\" id=\"countdown\">\n            <div class=\"countdown-label\" id=\"countdownLabel\">Server will be hidden in</div>\n            <div class=\"countdown-timer\">\n                <span id=\"timer\">15</span>\n                <span class=\"countdown-unit\" id=\"countdownUnit\">seconds</span>\n            </div>\n        </div>\n\n        <div id=\"message\">\n            <div class=\"icon\">🔒</div>\n            <div class=\"text\" id=\"hiddenMessage\">Server is now hidden</div>\n        </div>\n\n        <div class=\"info-section\">\n            <div id=\"ip-display\">Detecting IP...</div>\n            \n            <label class=\"auto-refresh-toggle\" id=\"auto-refresh-section\">\n                <input type=\"checkbox\" id=\"auto-refresh\">\n                <span class=\"toggle-switch\"></span>\n                <span class=\"toggle-label\" id=\"autoRefreshLabel\">Auto Refresh (10s)</span>\n            </label>\n        </div>\n\n        <div class=\"footer\">\n            <p class=\"footer-text\" id=\"footerPowered\">Powered by <a href=\"https://github.com/OpenNHP/opennhp\" target=\"_blank\">OpenNHP</a> \n                - Network-infrastructure Hiding Protocol</p>\n            <p class=\"footer-text\" style=\"margin-top: 0.5rem;\" id=\"footerSponsored\">Sponsored by: <a href=\"https://layerv.ai\" target=\"_blank\">LayerV.ai</a></p>\n        </div>\n    </div>\n\n    <script>\n        // Translations\n        const translations = {\n            en: {\n                title: \"OpenNHP AC Protected Server\",\n                subtitle: \"Invisible to Unauthenticated Users\",\n                scanPorts: \"Scan Ports\",\n                countdownLabel: \"SERVER WILL BE HIDDEN IN\",\n                countdownUnit: \"seconds\",\n                hiddenMessage: \"Server is now hidden\",\n                autoRefreshLabel: \"Auto Refresh (10s)\",\n                footerPowered: 'Powered by <a href=\"https://github.com/OpenNHP/opennhp\" target=\"_blank\">OpenNHP</a> - Network-infrastructure Hiding Protocol',\n                footerSponsored: 'Sponsored by: <a href=\"https://layerv.ai\" target=\"_blank\">LayerV.ai</a>',\n                detectingIP: \"Detecting IP...\",\n                ipFailed: \"IP detection failed\"\n            },\n            zh: {\n                title: \"OpenNHP AC 受保护服务器\",\n                subtitle: \"对未认证用户不可见\",\n                scanPorts: \"扫描端口\",\n                countdownLabel: \"服务器将在以下时间后隐藏\",\n                countdownUnit: \"秒\",\n                hiddenMessage: \"服务器已隐藏\",\n                autoRefreshLabel: \"自动刷新 (10秒)\",\n                footerPowered: '由 <a href=\"https://github.com/OpenNHP/opennhp\" target=\"_blank\">OpenNHP</a> 提供支持 - 网络基础设施隐藏协议',\n                footerSponsored: '赞助商：<a href=\"https://layerv.ai\" target=\"_blank\">LayerV.ai</a>',\n                detectingIP: \"正在检测 IP...\",\n                ipFailed: \"IP 检测失败\"\n            },\n            es: {\n                title: \"Servidor Protegido OpenNHP AC\",\n                subtitle: \"Invisible para Usuarios No Autenticados\",\n                scanPorts: \"Escanear\",\n                countdownLabel: \"EL SERVIDOR SE OCULTARÁ EN\",\n                countdownUnit: \"segundos\",\n                hiddenMessage: \"El servidor está oculto\",\n                autoRefreshLabel: \"Auto Refrescar (10s)\",\n                footerPowered: 'Desarrollado por <a href=\"https://github.com/OpenNHP/opennhp\" target=\"_blank\">OpenNHP</a> - Protocolo de Ocultación de Infraestructura',\n                footerSponsored: 'Patrocinado por: <a href=\"https://layerv.ai\" target=\"_blank\">LayerV.ai</a>',\n                detectingIP: \"Detectando IP...\",\n                ipFailed: \"Detección de IP fallida\"\n            }\n        };\n\n        let currentLang = 'en';\n\n        function changeLanguage() {\n            const lang = document.getElementById('languageSelect').value;\n            currentLang = lang;\n            document.documentElement.lang = lang;\n            const t = translations[lang];\n\n            document.getElementById('title').textContent = t.title;\n            document.getElementById('subtitle').textContent = t.subtitle;\n            document.getElementById('scanPorts1').textContent = t.scanPorts;\n            document.getElementById('scanPorts2').textContent = t.scanPorts;\n            document.getElementById('countdownLabel').textContent = t.countdownLabel;\n            document.getElementById('countdownUnit').textContent = t.countdownUnit;\n            document.getElementById('hiddenMessage').textContent = t.hiddenMessage;\n            document.getElementById('autoRefreshLabel').textContent = t.autoRefreshLabel;\n            document.getElementById('footerPowered').innerHTML = t.footerPowered;\n            document.getElementById('footerSponsored').innerHTML = t.footerSponsored;\n        }\n\n        // Initialize countdown seconds\n        let seconds = 15;\n\n        // Get DOM elements\n        const timerElement = document.getElementById('timer');\n        const countdownElement = document.getElementById('countdown');\n        const messageElement = document.getElementById('message');\n        const autoRefreshSection = document.getElementById('auto-refresh-section');\n        const autoRefreshCheckbox = document.getElementById('auto-refresh');\n\n        // Update countdown every second\n        const countdownInterval = setInterval(() => {\n            seconds--;\n            timerElement.textContent = seconds;\n\n            if (seconds <= 0) {\n                clearInterval(countdownInterval);\n                // Hide countdown\n                countdownElement.style.display = 'none';\n                // Show hidden message\n                messageElement.style.display = 'block';\n                // Hide auto refresh checkbox\n                autoRefreshSection.style.display = 'none';\n            }\n        }, 1000);\n\n        // Auto refresh functionality\n        let autoRefreshInterval;\n\n        // Get autoRefreshState stored in cookie\n        function getCookie(name) {\n            const value = `; ${document.cookie}`;\n            const parts = value.split(`; ${name}=`);\n            if (parts.length === 2) return parts.pop().split(';').shift();\n        }\n\n        // Set cookie\n        function setCookie(name, value, days) {\n            const date = new Date();\n            date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));\n            document.cookie = `${name}=${value};expires=${date.toUTCString()};path=/`;\n        }\n\n        // Restore checkbox state from cookie\n        const savedAutoRefreshState = getCookie('autoRefreshState');\n        if (savedAutoRefreshState === 'true') {\n            autoRefreshCheckbox.checked = true;\n        } else {\n            autoRefreshCheckbox.checked = false;\n        }\n\n        // When checkbox state changes, start or stop auto refresh\n        autoRefreshCheckbox.addEventListener('change', () => {\n            if (autoRefreshCheckbox.checked) {\n                // Start auto refresh, refresh page every 10 seconds\n                autoRefreshInterval = setInterval(() => {\n                    location.reload();\n                }, 10000);\n            } else {\n                // Stop auto refresh\n                clearInterval(autoRefreshInterval);\n            }\n\n            // Save checkbox state to cookie (expires in 7 days)\n            setCookie('autoRefreshState', autoRefreshCheckbox.checked, 7);\n        });\n\n        // Check checkbox state on page load and trigger auto refresh\n        window.onload = () => {\n            // Detect user language\n            const userLang = navigator.language || navigator.userLanguage;\n            const lang = userLang.startsWith('es') ? 'es' : (userLang.startsWith('zh') ? 'zh' : 'en');\n            document.getElementById('languageSelect').value = lang;\n            changeLanguage();\n\n            if (autoRefreshCheckbox.checked) {\n                // If checkbox was previously checked, start auto refresh\n                autoRefreshInterval = setInterval(() => {\n                    location.reload();\n                }, 10000);\n            }\n\n            fetchIP();\n        };\n\n        async function fetchIP() {\n            const ipDisplay = document.getElementById('ip-display');\n            let ipv4 = null, ipv6 = null;\n\n            // Fetch IPv4\n            try {\n                const res = await fetch('https://api.ipify.org?format=json');\n                const data = await res.json();\n                ipv4 = data.ip;\n            } catch (e) { console.error(\"IPv4 fetch error:\", e); }\n\n            // Fetch IPv6\n            try {\n                const res = await fetch('https://api6.ipify.org?format=json');\n                const data = await res.json();\n                ipv6 = data.ip;\n            } catch (e) { console.error(\"IPv6 fetch error:\", e); }\n\n            // Display results\n            if (ipv4 && ipv6) {\n                ipDisplay.innerHTML = `IPv4: ${ipv4} | IPv6: ${ipv6}`;\n            } else if (ipv4) {\n                ipDisplay.textContent = `IPv4: ${ipv4}`;\n            } else if (ipv6) {\n                ipDisplay.textContent = `IPv6: ${ipv6}`;\n            } else {\n                ipDisplay.textContent = translations[currentLang].ipFailed;\n            }\n        }\n    </script>\n</body>\n</html>\n"
  },
  {
    "path": "examples/server_plugin/authenticator/templates/authenticator_login.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>{{.title}} - OTP Authentication</title>\n    <!-- Fonts with fallback - load async to prevent blocking -->\n    <link rel=\"preconnect\" href=\"https://fonts.googleapis.com\">\n    <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n    <link href=\"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600&family=Outfit:wght@300;400;600;700&display=swap\" rel=\"stylesheet\" media=\"print\" onload=\"this.media='all'\">\n    <noscript><link href=\"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600&family=Outfit:wght@300;400;600;700&display=swap\" rel=\"stylesheet\"></noscript>\n    <!-- QR Code Generator Library with fallback -->\n    <script>\n        // Inline minimal QR code generator fallback\n        var qrcodeFallbackLoaded = false;\n        function loadQRCodeFallback() {\n            if (typeof qrcode === 'undefined' && !qrcodeFallbackLoaded) {\n                qrcodeFallbackLoaded = true;\n                console.log('QR library not loaded, using Canvas API fallback');\n            }\n        }\n    </script>\n    <script src=\"https://cdn.jsdelivr.net/npm/qrcode-generator@1.4.4/qrcode.min.js\"\n            onerror=\"this.onerror=null; this.src='https://unpkg.com/qrcode-generator@1.4.4/qrcode.min.js';\"\n            onload=\"console.log('QR library loaded successfully')\"></script>\n    <style>\n        :root {\n            --bg-primary: #0a0e17;\n            --bg-secondary: #131a2b;\n            --bg-card: rgba(20, 30, 50, 0.85);\n            --accent-cyan: #00d4ff;\n            --accent-green: #00ff88;\n            --accent-orange: #ff6b35;\n            --accent-red: #ff4757;\n            --text-primary: #e8eef5;\n            --text-secondary: #8892a4;\n            --border-color: rgba(0, 212, 255, 0.2);\n        }\n\n        * {\n            margin: 0;\n            padding: 0;\n            box-sizing: border-box;\n        }\n\n        body {\n            font-family: 'Outfit', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\n            min-height: 100vh;\n            display: flex;\n            justify-content: center;\n            align-items: center;\n            background: var(--bg-primary);\n            background-image:\n                    radial-gradient(ellipse at 20% 20%, rgba(0, 212, 255, 0.08) 0%, transparent 50%),\n                    radial-gradient(ellipse at 80% 80%, rgba(0, 255, 136, 0.06) 0%, transparent 50%),\n                    linear-gradient(180deg, var(--bg-primary) 0%, var(--bg-secondary) 100%);\n            padding: 2rem;\n        }\n\n        .container {\n            max-width: 540px;\n            width: 100%;\n            background: var(--bg-card);\n            backdrop-filter: blur(20px);\n            border: 1px solid var(--border-color);\n            border-radius: 24px;\n            padding: 2.5rem;\n            box-shadow:\n                    0 4px 60px rgba(0, 0, 0, 0.4),\n                    0 0 0 1px rgba(255, 255, 255, 0.05) inset;\n            animation: fadeIn 0.6s ease-out;\n        }\n\n        @keyframes fadeIn {\n            from { opacity: 0; transform: translateY(20px); }\n            to { opacity: 1; transform: translateY(0); }\n        }\n\n        .language-select {\n            text-align: right;\n            margin-bottom: 1rem;\n        }\n\n        .language-select select {\n            background: rgba(255, 255, 255, 0.05);\n            border: 1px solid rgba(255, 255, 255, 0.1);\n            color: var(--text-secondary);\n            padding: 0.4rem 0.75rem;\n            border-radius: 8px;\n            font-family: 'Outfit', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\n            font-size: 0.85rem;\n            cursor: pointer;\n            outline: none;\n            transition: all 0.2s ease;\n        }\n\n        .language-select select:hover {\n            border-color: var(--accent-cyan);\n        }\n\n        .language-select select option {\n            background: var(--bg-secondary);\n            color: var(--text-primary);\n        }\n\n        .logo-title {\n            display: flex;\n            align-items: center;\n            justify-content: center;\n            gap: 0.75rem;\n            margin-bottom: 1.5rem;\n        }\n\n        .logo-title img {\n            height: 42px;\n            width: 42px;\n        }\n\n        .logo-title h1 {\n            font-size: 1.5rem;\n            font-weight: 700;\n            color: var(--text-primary);\n            margin: 0;\n        }\n\n        .server-info {\n            background: rgba(0, 212, 255, 0.05);\n            border: 1px solid rgba(0, 212, 255, 0.15);\n            border-radius: 12px;\n            padding: 1rem;\n            margin-bottom: 1.5rem;\n        }\n\n        .server-url-row {\n            display: flex;\n            align-items: center;\n            justify-content: center;\n            gap: 0.5rem;\n            margin-bottom: 1rem;\n        }\n\n        .server-url-row span {\n            color: var(--text-secondary);\n            font-size: 0.85rem;\n            white-space: nowrap;\n            flex-shrink: 0;\n        }\n\n        .server-url-row a {\n            font-family: 'JetBrains Mono', 'SF Mono', 'Monaco', 'Inconsolata', 'Fira Code', 'Consolas', 'Courier New', monospace;\n            font-size: 0.8rem;\n            color: var(--accent-cyan);\n            text-decoration: none;\n        }\n\n        .server-url-row a:hover {\n            text-decoration: underline;\n        }\n\n        .scan-link {\n            font-size: 0.7rem;\n            font-family: 'Outfit', sans-serif !important;\n            color: var(--accent-green);\n            text-decoration: none;\n            padding: 0.2rem 0.4rem;\n            background: rgba(0, 255, 136, 0.1);\n            border-radius: 4px;\n            white-space: nowrap;\n            flex-shrink: 0;\n        }\n\n        .status-grid {\n            display: flex;\n            flex-direction: column;\n            align-items: center;\n            gap: 0.5rem;\n        }\n\n        .status-row {\n            display: flex;\n            align-items: center;\n            gap: 0.5rem;\n            font-size: 0.85rem;\n        }\n\n        .status-label {\n            color: var(--text-secondary);\n            min-width: 100px;\n            text-align: right;\n        }\n\n        .status-value {\n            min-width: 120px;\n        }\n\n        .status-value.timeout {\n            color: var(--accent-red);\n        }\n\n        .status-value.success {\n            color: var(--accent-green);\n        }\n\n        /* Login Tabs */\n        .login-tabs {\n            display: flex;\n            gap: 0.5rem;\n            margin-bottom: 1.5rem;\n            background: rgba(255, 255, 255, 0.03);\n            border-radius: 12px;\n            padding: 0.25rem;\n        }\n\n        .tab-btn {\n            flex: 1;\n            display: flex;\n            align-items: center;\n            justify-content: center;\n            gap: 0.5rem;\n            padding: 0.75rem 1rem;\n            background: transparent;\n            border: none;\n            border-radius: 10px;\n            color: var(--text-secondary);\n            font-family: 'Outfit', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\n            font-size: 0.9rem;\n            cursor: pointer;\n            transition: all 0.2s ease;\n        }\n\n        .tab-btn:hover {\n            color: var(--text-primary);\n            background: rgba(255, 255, 255, 0.05);\n        }\n\n        .tab-btn.active {\n            background: rgba(0, 212, 255, 0.15);\n            color: var(--accent-cyan);\n        }\n\n        .tab-btn svg {\n            stroke: currentColor;\n        }\n\n        /* QR Code Section */\n        .qr-login-section {\n            text-align: center;\n        }\n\n        .qr-container {\n            background: #ffffff;\n            border-radius: 16px;\n            padding: 1.5rem;\n            display: inline-block;\n            margin-bottom: 1rem;\n            position: relative;\n            min-width: 220px;\n            min-height: 220px;\n        }\n\n        .qr-loading {\n            display: flex;\n            flex-direction: column;\n            align-items: center;\n            justify-content: center;\n            min-height: 180px;\n            color: #333;\n        }\n\n        .spinner {\n            width: 40px;\n            height: 40px;\n            border: 3px solid rgba(0, 212, 255, 0.2);\n            border-top-color: var(--accent-cyan);\n            border-radius: 50%;\n            animation: spin 1s linear infinite;\n            margin-bottom: 1rem;\n        }\n\n        @keyframes spin {\n            to { transform: rotate(360deg); }\n        }\n\n        .qr-code-wrapper {\n            position: relative;\n            display: inline-block;\n        }\n\n        #qrCanvas {\n            display: block;\n            max-width: 200px;\n            max-height: 200px;\n            width: 100%;\n            height: auto;\n        }\n\n        .qr-overlay {\n            position: absolute;\n            top: 0;\n            left: 0;\n            right: 0;\n            bottom: 0;\n            background: rgba(255, 255, 255, 0.95);\n            display: none;\n            align-items: center;\n            justify-content: center;\n            border-radius: 8px;\n            color: #333;\n            font-weight: 600;\n            font-size: 0.9rem;\n            text-align: center;\n            padding: 1rem;\n        }\n\n        .qr-overlay.show {\n            display: flex;\n        }\n\n        .qr-overlay.success {\n            background: rgba(0, 255, 136, 0.95);\n            color: #0a0e17;\n        }\n\n        .qr-overlay.expired {\n            background: rgba(255, 71, 87, 0.95);\n            color: #fff;\n        }\n\n        .qr-instructions {\n            margin-bottom: 1rem;\n        }\n\n        .qr-instructions p {\n            color: var(--text-secondary);\n            font-size: 0.9rem;\n            margin-bottom: 0.75rem;\n        }\n\n        .qr-status {\n            display: flex;\n            align-items: center;\n            justify-content: center;\n            gap: 0.5rem;\n            margin-bottom: 0.5rem;\n        }\n\n        .status-dot {\n            width: 10px;\n            height: 10px;\n            border-radius: 50%;\n            animation: pulse 2s infinite;\n        }\n\n        .status-dot.pending {\n            background: var(--accent-orange);\n        }\n\n        .status-dot.scanned {\n            background: var(--accent-cyan);\n        }\n\n        .status-dot.confirmed {\n            background: var(--accent-green);\n            animation: none;\n        }\n\n        .status-dot.expired {\n            background: var(--accent-red);\n            animation: none;\n        }\n\n        @keyframes pulse {\n            0%, 100% { opacity: 1; }\n            50% { opacity: 0.5; }\n        }\n\n        #qrStatusText {\n            color: var(--text-secondary);\n            font-size: 0.85rem;\n        }\n\n        .qr-timer {\n            color: var(--text-secondary);\n            font-size: 0.8rem;\n            margin-bottom: 1rem;\n        }\n\n        .refresh-qr-btn {\n            display: inline-flex;\n            align-items: center;\n            gap: 0.5rem;\n            padding: 0.6rem 1.2rem;\n            background: rgba(255, 255, 255, 0.05);\n            border: 1px solid rgba(255, 255, 255, 0.1);\n            border-radius: 8px;\n            color: var(--text-secondary);\n            font-family: 'Outfit', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\n            font-size: 0.85rem;\n            cursor: pointer;\n            transition: all 0.2s ease;\n        }\n\n        .refresh-qr-btn:hover {\n            background: rgba(255, 255, 255, 0.1);\n            color: var(--text-primary);\n        }\n\n        .refresh-qr-btn svg {\n            stroke: currentColor;\n        }\n\n        /* OTP Input Section */\n        .otp-login-section {\n            text-align: center;\n        }\n\n        .otp-description {\n            color: var(--text-secondary);\n            font-size: 0.9rem;\n            margin-bottom: 1.5rem;\n            line-height: 1.6;\n        }\n\n        .secret-section {\n            background: rgba(0, 212, 255, 0.05);\n            border: 1px solid rgba(0, 212, 255, 0.15);\n            border-radius: 12px;\n            padding: 1rem;\n            margin-bottom: 1.5rem;\n        }\n\n        .secret-header {\n            display: flex;\n            justify-content: space-between;\n            align-items: center;\n            margin-bottom: 0.5rem;\n        }\n\n        .secret-expiry {\n            display: flex;\n            align-items: center;\n            gap: 0.4rem;\n            font-size: 0.75rem;\n            color: var(--accent-orange);\n            font-family: 'JetBrains Mono', 'SF Mono', 'Monaco', 'Inconsolata', 'Fira Code', 'Consolas', 'Courier New', monospace;\n        }\n\n        .secret-expiry svg {\n            flex-shrink: 0;\n        }\n\n        .secret-expiry.expired {\n            color: var(--accent-red);\n        }\n\n        .secret-label {\n            color: var(--text-secondary);\n            font-size: 0.75rem;\n            text-transform: uppercase;\n            letter-spacing: 0.05em;\n            margin-bottom: 0.5rem;\n        }\n\n        .secret-value {\n            display: flex;\n            align-items: center;\n            justify-content: center;\n            gap: 0.75rem;\n        }\n\n        .secret-code {\n            font-family: 'JetBrains Mono', 'SF Mono', 'Monaco', 'Inconsolata', 'Fira Code', 'Consolas', 'Courier New', monospace;\n            font-size: 0.95rem;\n            color: var(--accent-cyan);\n            background: rgba(0, 0, 0, 0.3);\n            padding: 0.75rem 1rem;\n            border-radius: 8px;\n            word-break: break-all;\n            user-select: all;\n            flex: 1;\n        }\n\n        .copy-btn {\n            padding: 0.6rem 0.8rem;\n            background: rgba(255, 255, 255, 0.05);\n            border: 1px solid rgba(255, 255, 255, 0.1);\n            border-radius: 8px;\n            color: var(--text-secondary);\n            cursor: pointer;\n            transition: all 0.2s ease;\n        }\n\n        .copy-btn:hover {\n            background: rgba(255, 255, 255, 0.1);\n            color: var(--text-primary);\n        }\n\n        .copy-btn.copied {\n            color: var(--accent-green);\n            border-color: var(--accent-green);\n        }\n\n        .copy-btn svg {\n            width: 16px;\n            height: 16px;\n            stroke: currentColor;\n            fill: none;\n        }\n\n        .otp-input-section {\n            margin-bottom: 1.5rem;\n        }\n\n        .otp-input-label {\n            color: var(--text-secondary);\n            font-size: 0.85rem;\n            margin-bottom: 0.75rem;\n        }\n\n        .otp-input-group {\n            display: flex;\n            gap: 0.5rem;\n            justify-content: center;\n            margin-bottom: 1rem;\n        }\n\n        .otp-input {\n            width: 48px;\n            height: 56px;\n            text-align: center;\n            font-family: 'JetBrains Mono', 'SF Mono', 'Monaco', 'Inconsolata', 'Fira Code', 'Consolas', 'Courier New', monospace;\n            font-size: 1.5rem;\n            font-weight: 600;\n            background: rgba(255, 255, 255, 0.03);\n            border: 2px solid rgba(255, 255, 255, 0.1);\n            border-radius: 10px;\n            color: var(--text-primary);\n            outline: none;\n            transition: all 0.2s ease;\n        }\n\n        .otp-input:focus {\n            border-color: var(--accent-cyan);\n            box-shadow: 0 0 0 3px rgba(0, 212, 255, 0.1);\n        }\n\n        .verify-btn {\n            width: 100%;\n            padding: 1rem;\n            background: linear-gradient(135deg, var(--accent-cyan), #0099cc);\n            border: none;\n            border-radius: 10px;\n            font-family: 'Outfit', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\n            font-size: 1rem;\n            font-weight: 600;\n            color: var(--bg-primary);\n            cursor: pointer;\n            transition: all 0.3s ease;\n        }\n\n        .verify-btn:hover:not(:disabled) {\n            transform: translateY(-2px);\n            box-shadow: 0 8px 25px rgba(0, 212, 255, 0.3);\n        }\n\n        .verify-btn:disabled {\n            opacity: 0.5;\n            cursor: not-allowed;\n        }\n\n        .otp-help {\n            color: var(--text-secondary);\n            font-size: 0.8rem;\n            margin-top: 1rem;\n            line-height: 1.5;\n        }\n\n        .otp-help a {\n            color: var(--accent-cyan);\n            text-decoration: none;\n            cursor: pointer;\n            display: inline;\n        }\n\n        .otp-help a:hover {\n            text-decoration: underline;\n            color: var(--accent-green);\n        }\n\n        /* Message display */\n        .message {\n            padding: 1rem;\n            border-radius: 10px;\n            margin-bottom: 1rem;\n            display: none;\n            align-items: center;\n            justify-content: center;\n            gap: 0.5rem;\n        }\n\n        .message.show {\n            display: flex;\n        }\n\n        .message.success {\n            background: rgba(0, 255, 136, 0.1);\n            border: 1px solid rgba(0, 255, 136, 0.3);\n            color: var(--accent-green);\n        }\n\n        .message.error {\n            background: rgba(255, 71, 87, 0.1);\n            border: 1px solid rgba(255, 71, 87, 0.3);\n            color: var(--accent-red);\n        }\n\n        /* IP display */\n        .ip-display {\n            text-align: center;\n            margin-top: 1.5rem;\n            padding-top: 1rem;\n            border-top: 1px solid rgba(255, 255, 255, 0.05);\n        }\n\n        #ip-display {\n            font-family: 'JetBrains Mono', 'SF Mono', 'Monaco', 'Inconsolata', 'Fira Code', 'Consolas', 'Courier New', monospace;\n            font-size: 0.8rem;\n            color: var(--text-secondary);\n            opacity: 0.7;\n        }\n\n        /* Footer */\n        .footer {\n            text-align: center;\n            margin-top: 1.5rem;\n            padding-top: 1rem;\n            border-top: 1px solid rgba(255, 255, 255, 0.05);\n        }\n\n        .footer p {\n            font-size: 0.8rem;\n            color: var(--text-secondary);\n            margin: 0.3rem 0;\n        }\n\n        .footer a {\n            color: var(--accent-cyan);\n            text-decoration: none;\n            transition: color 0.2s ease;\n        }\n\n        .footer a:hover {\n            color: var(--accent-green);\n            text-decoration: underline;\n        }\n\n        @media (max-width: 480px) {\n            .container {\n                padding: 1.5rem;\n            }\n\n            .status-row {\n                flex-direction: column;\n                align-items: flex-start;\n            }\n\n            .status-label {\n                min-width: auto;\n            }\n\n            .login-tabs {\n                flex-direction: column;\n            }\n\n            .qr-container {\n                min-width: 180px;\n                min-height: 180px;\n                padding: 1rem;\n            }\n\n            .otp-input {\n                width: 40px;\n                height: 48px;\n                font-size: 1.25rem;\n            }\n        }\n    </style>\n</head>\n<body>\n<div class=\"container\">\n    <!-- Language Select -->\n    <div class=\"language-select\">\n        <select id=\"languageSelect\" onchange=\"changeLanguage()\">\n            <option value=\"en\">English</option>\n            <option value=\"zh\">中文</option>\n        </select>\n    </div>\n\n    <!-- Logo and Title -->\n    <div class=\"logo-title\">\n        <img src=\"https://raw.githubusercontent.com/OpenNHP/opennhp/main/docs/images/logo10.png\"\n             alt=\"OpenNHP Logo\"\n             onerror=\"this.onerror=null; this.style.display='none';\"\n             loading=\"lazy\">\n        <h1 id=\"title\">OTP Authentication</h1>\n    </div>\n\n    <!-- Server Info -->\n    <div class=\"server-info\">\n        <div class=\"server-url-row\">\n            <span id=\"protectedServer\">Protected Server: </span>\n            <a href=\"https://acdemo.opennhp.org\" target=\"_blank\">https://acdemo.opennhp.org</a>\n            <a href=\"https://dnschecker.org/port-scanner.php?query=acdemo.opennhp.org&ptype=server\" target=\"_blank\" class=\"scan-link\" id=\"scanPorts\">Scan Ports</a>\n        </div>\n        <div class=\"status-grid\">\n            <div class=\"status-row\">\n                <span class=\"status-label\" id=\"beforeLogin\">Before Login:</span>\n                <span class=\"status-value timeout\" id=\"timeoutStatus\">Connection Timeout ❌</span>\n            </div>\n            <div class=\"status-row\">\n                <span class=\"status-label\" id=\"afterLogin\">After Login:</span>\n                <span class=\"status-value success\" id=\"successStatus\">Accessible ✅</span>\n            </div>\n        </div>\n    </div>\n\n    <!-- Message Display -->\n    <div id=\"message\" class=\"message\"></div>\n\n    <!-- Login Method Tabs -->\n    <div class=\"login-tabs\">\n        <button type=\"button\" class=\"tab-btn active\" id=\"otpTabBtn\" onclick=\"switchLoginTab('otp')\">\n            <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n                <rect x=\"3\" y=\"11\" width=\"18\" height=\"11\" rx=\"2\" ry=\"2\"></rect>\n                <path d=\"M7 11V7a5 5 0 0 1 10 0v4\"></path>\n            </svg>\n            <span id=\"otpTabLabel\">Enter OTP Code</span>\n        </button>\n        <button type=\"button\" class=\"tab-btn\" id=\"qrTabBtn\" onclick=\"switchLoginTab('qr')\">\n            <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n                <rect x=\"3\" y=\"3\" width=\"7\" height=\"7\"></rect>\n                <rect x=\"14\" y=\"3\" width=\"7\" height=\"7\"></rect>\n                <rect x=\"14\" y=\"14\" width=\"7\" height=\"7\"></rect>\n                <rect x=\"3\" y=\"14\" width=\"7\" height=\"7\"></rect>\n            </svg>\n            <span id=\"qrTabLabel\">Scan QR Code</span>\n        </button>\n    </div>\n\n    <!-- QR Code Login Section -->\n    <div id=\"qrLoginSection\" class=\"qr-login-section\" style=\"display: none;\">\n        <div class=\"qr-container\" id=\"qrContainer\">\n            <div class=\"qr-loading\" id=\"qrLoading\">\n                <div class=\"spinner\"></div>\n                <span id=\"qrLoadingText\">Generating QR Code...</span>\n            </div>\n            <div class=\"qr-code-wrapper\" id=\"qrCodeWrapper\" style=\"display: none;\">\n                <canvas id=\"qrCanvas\"></canvas>\n                <div class=\"qr-overlay\" id=\"qrOverlay\">\n                    <span id=\"qrOverlayText\"></span>\n                </div>\n            </div>\n        </div>\n\n        <div class=\"qr-instructions\">\n            <p id=\"qrInstructions\">Scan with <a href=\"https://github.com/OpenNHP/stealth-dns\" target=\"_blank\" rel=\"noopener noreferrer\">StealthDNS</a> mobile app to login</p>\n            <div class=\"qr-status\">\n                <span class=\"status-dot pending\" id=\"statusDot\"></span>\n                <span id=\"qrStatusText\">Waiting for scan...</span>\n            </div>\n            <p class=\"qr-timer\" id=\"qrTimer\">Expires in 5m 00s</p>\n        </div>\n\n        <button class=\"refresh-qr-btn\" id=\"refreshQrBtn\" onclick=\"generateQRCode()\">\n            <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n                <path d=\"M23 4v6h-6\"></path>\n                <path d=\"M20.49 15a9 9 0 1 1-2.12-9.36L23 10\"></path>\n            </svg>\n            <span id=\"refreshText\">Refresh QR Code</span>\n        </button>\n    </div>\n\n    <!-- OTP Code Login Section -->\n    <div id=\"otpLoginSection\" class=\"otp-login-section\">\n        <p class=\"otp-description\" id=\"otpDescription\">\n            Add the secret key below to your authenticator app (Google Authenticator, Authy, etc.), then enter the 6-digit code.\n        </p>\n\n        <div class=\"secret-section\">\n            <p class=\"secret-label\" id=\"secretLabel\">OTP Secret Key</p>\n            <div class=\"secret-value\">\n                <code id=\"otpSecret\" class=\"secret-code\">Loading...</code>\n                <button type=\"button\" class=\"copy-btn\" id=\"copySecretBtn\" onclick=\"copySecret()\" title=\"Copy to clipboard\">\n                    <svg viewBox=\"0 0 24 24\" stroke-width=\"2\">\n                        <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"></rect>\n                        <path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"></path>\n                    </svg>\n                </button>\n            </div>\n        </div>\n\n        <div class=\"otp-input-section\">\n            <p class=\"otp-input-label\" id=\"otpInputLabel\">Enter 6-digit verification code</p>\n            <div class=\"otp-input-group\">\n                <input type=\"text\" class=\"otp-input\" maxlength=\"1\" data-index=\"0\" inputmode=\"numeric\">\n                <input type=\"text\" class=\"otp-input\" maxlength=\"1\" data-index=\"1\" inputmode=\"numeric\">\n                <input type=\"text\" class=\"otp-input\" maxlength=\"1\" data-index=\"2\" inputmode=\"numeric\">\n                <input type=\"text\" class=\"otp-input\" maxlength=\"1\" data-index=\"3\" inputmode=\"numeric\">\n                <input type=\"text\" class=\"otp-input\" maxlength=\"1\" data-index=\"4\" inputmode=\"numeric\">\n                <input type=\"text\" class=\"otp-input\" maxlength=\"1\" data-index=\"5\" inputmode=\"numeric\">\n            </div>\n            <button class=\"verify-btn\" id=\"verifyOtpBtn\" onclick=\"verifyOTP()\" disabled>\n                <span id=\"verifyBtnText\">Verify</span>\n            </button>\n        </div>\n\n        <p class=\"otp-help\" id=\"otpHelp\">\n            Don't have an authenticator app? Download\n            <a href=\"https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2\" target=\"_blank\" rel=\"noopener noreferrer\">Google Authenticator</a> or\n            <a href=\"https://authy.com/download/\" target=\"_blank\" rel=\"noopener noreferrer\">Authy</a>\n        </p>\n    </div>\n\n    <!-- IP Display -->\n    <div class=\"ip-display\">\n        <span id=\"ip-display\">Detecting IP...</span>\n    </div>\n\n    <!-- Footer -->\n    <div class=\"footer\">\n        <p id=\"footerPowered\">Powered by <a href=\"https://github.com/OpenNHP/opennhp\" target=\"_blank\">OpenNHP</a></p>\n        <p id=\"footerSponsored\">Sponsored by: <a href=\"https://layerv.ai\" target=\"_blank\">LayerV.ai</a></p>\n    </div>\n</div>\n\n<script>\n    // Configuration\n    const config = {\n        aspId: '{{.aspId}}',\n        resId: '{{.resId}}',\n        baseUrl: window.location.origin,\n        otpSecretKey: '{{.otpSecretKey}}'\n    };\n\n    // Translations\n    const translations = {\n        en: {\n            title: \"OTP Authentication\",\n            protectedServer: \"Protected Server: \",\n            scanPorts: \"Scan Ports\",\n            beforeLogin: \"Before Login:\",\n            afterLogin: \"After Login:\",\n            timeoutStatus: \"Connection Timeout ❌\",\n            successStatus: \"Accessible ✅\",\n            qrTabLabel: \"Scan QR Code\",\n            otpTabLabel: \"Enter OTP Code\",\n            qrLoadingText: \"Generating QR Code...\",\n            qrInstructions: 'Scan with <a href=\"https://github.com/OpenNHP/stealth-dns\" target=\"_blank\" rel=\"noopener noreferrer\">StealthDNS</a> mobile app to login',\n            qrStatusWaiting: \"Waiting for scan...\",\n            qrStatusScanned: \"Scanned! Confirming...\",\n            qrStatusConfirmed: \"Verified!\",\n            qrStatusExpired: \"Expired\",\n            refreshText: \"Refresh QR Code\",\n            otpDescription: \"Add the secret key below to your authenticator app (Google Authenticator, Authy, etc.), then enter the 6-digit code.\",\n            secretLabel: \"OTP Secret Key\",\n            secretValidFor: \"Valid for\",\n            secretExpired: \"Expired\",\n            otpInputLabel: \"Enter 6-digit verification code\",\n            verifyBtnText: \"Verify\",\n            otpHelp: 'Don\\'t have an authenticator app? Download <a href=\"https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2\" target=\"_blank\" rel=\"noopener noreferrer\">Google Authenticator</a> or <a href=\"https://authy.com/download/\" target=\"_blank\" rel=\"noopener noreferrer\">Authy</a>',\n            footerPowered: \"Powered by\",\n            footerSponsored: \"Sponsored by:\",\n            footerSponsoredSuffix: \"\",\n            detectingIP: \"Detecting IP...\",\n            ipFailed: \"IP detection failed\",\n            loginSuccess: \"Login successful! Redirecting...\",\n            copySuccess: \"Copied!\",\n            expiresIn: \"Expires in\",\n            verifying: \"Verifying...\",\n            loading: \"Loading...\"\n        },\n        zh: {\n            title: \"OTP 身份认证\",\n            protectedServer: \"受保护服务器：\",\n            scanPorts: \"扫描端口\",\n            beforeLogin: \"登录前：\",\n            afterLogin: \"登录后：\",\n            timeoutStatus: \"连接超时 ❌\",\n            successStatus: \"可访问 ✅\",\n            qrTabLabel: \"扫描二维码\",\n            otpTabLabel: \"输入OTP码\",\n            qrLoadingText: \"正在生成二维码...\",\n            qrInstructions: '使用 <a href=\"https://github.com/OpenNHP/stealth-dns\" target=\"_blank\" rel=\"noopener noreferrer\">StealthDNS</a> 手机端扫描二维码登录',\n            qrStatusWaiting: \"等待扫描...\",\n            qrStatusScanned: \"已扫描，确认中...\",\n            qrStatusConfirmed: \"验证成功！\",\n            qrStatusExpired: \"已过期\",\n            refreshText: \"刷新二维码\",\n            otpDescription: \"将下方密钥添加到您的认证器应用（Google Authenticator、Authy 等），然后输入 6 位验证码。\",\n            secretLabel: \"OTP 密钥\",\n            secretValidFor: \"有效期\",\n            secretExpired: \"已过期\",\n            otpInputLabel: \"输入 6 位验证码\",\n            verifyBtnText: \"验证\",\n            otpHelp: '没有认证器应用？下载 <a href=\"https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2\" target=\"_blank\" rel=\"noopener noreferrer\">Google Authenticator</a> 或 <a href=\"https://authy.com/download/\" target=\"_blank\" rel=\"noopener noreferrer\">Authy</a>',\n            footerPowered: \"提供支持\",\n            footerSponsored: \"由\",\n            footerSponsoredSuffix: \"赞助，\",\n            detectingIP: \"正在检测 IP...\",\n            ipFailed: \"IP 检测失败\",\n            loginSuccess: \"登录成功！正在跳转...\",\n            copySuccess: \"已复制！\",\n            expiresIn: \"有效期剩余\",\n            verifying: \"验证中...\",\n            loading: \"加载中...\"\n        }\n    };\n\n    let currentLang = 'en';\n    let currentSession = {\n        sessionId: null,\n        otpSecret: null,\n        expiresAt: null\n    };\n    let pollingInterval = null;\n    let timerInterval = null;\n\n    // Helper function to safely set element text\n    function setText(id, text) {\n        const el = document.getElementById(id);\n        if (el) el.textContent = text;\n    }\n\n    function setHtml(id, html) {\n        const el = document.getElementById(id);\n        if (el) el.innerHTML = html;\n    }\n\n    // Language change\n    function changeLanguage() {\n        currentLang = document.getElementById('languageSelect').value;\n        const t = translations[currentLang];\n\n        // Header and server info\n        setText('title', t.title);\n        setText('protectedServer', t.protectedServer);\n        setText('scanPorts', t.scanPorts);\n        setText('beforeLogin', t.beforeLogin);\n        setText('afterLogin', t.afterLogin);\n        setText('timeoutStatus', t.timeoutStatus);\n        setText('successStatus', t.successStatus);\n\n        // Tab labels\n        setText('qrTabLabel', t.qrTabLabel);\n        setText('otpTabLabel', t.otpTabLabel);\n\n        // QR section\n        setText('qrLoadingText', t.qrLoadingText);\n        setHtml('qrInstructions', t.qrInstructions);\n        setText('refreshText', t.refreshText);\n\n        // OTP section - these are the elements that need translation\n        setText('otpDescription', t.otpDescription);\n        setText('secretLabel', t.secretLabel);\n        setText('otpInputLabel', t.otpInputLabel);\n        setText('verifyBtnText', t.verifyBtnText);\n        setHtml('otpHelp', t.otpHelp);\n\n        // Update OTP secret loading text if still loading\n        const otpSecretEl = document.getElementById('otpSecret');\n        if (otpSecretEl && (otpSecretEl.textContent === 'Loading...' || otpSecretEl.textContent === '加载中...')) {\n            otpSecretEl.textContent = t.loading;\n        }\n\n        // Update QR status text based on current state\n        const qrStatusText = document.getElementById('qrStatusText');\n        const statusDot = document.getElementById('statusDot');\n        const qrOverlayText = document.getElementById('qrOverlayText');\n        if (statusDot && qrStatusText) {\n            if (statusDot.classList.contains('pending')) {\n                qrStatusText.textContent = t.qrStatusWaiting;\n            } else if (statusDot.classList.contains('scanned')) {\n                qrStatusText.textContent = t.qrStatusScanned;\n                if (qrOverlayText) qrOverlayText.textContent = t.qrStatusScanned;\n            } else if (statusDot.classList.contains('confirmed')) {\n                qrStatusText.textContent = t.qrStatusConfirmed;\n                if (qrOverlayText) qrOverlayText.textContent = t.qrStatusConfirmed;\n            } else if (statusDot.classList.contains('expired')) {\n                qrStatusText.textContent = t.qrStatusExpired;\n                if (qrOverlayText) qrOverlayText.textContent = t.qrStatusExpired;\n            }\n        }\n\n        // Update QR timer\n        const qrTimerEl = document.getElementById('qrTimer');\n        if (qrTimerEl) {\n            if (currentSession.expiresAt) {\n                const remaining = Math.max(0, currentSession.expiresAt - Date.now());\n                const minutes = Math.floor(remaining / 60000);\n                const seconds = Math.floor((remaining % 60000) / 1000);\n                qrTimerEl.textContent = `${t.expiresIn} ${minutes}m ${seconds.toString().padStart(2, '0')}s`;\n            } else {\n                qrTimerEl.textContent = `${t.expiresIn} 5m 00s`;\n            }\n        }\n\n        // Update IP display placeholder\n        const ipDisplay = document.getElementById('ip-display');\n        if (ipDisplay && (ipDisplay.textContent.includes('Detecting') || ipDisplay.textContent.includes('检测'))) {\n            ipDisplay.textContent = t.detectingIP;\n        }\n\n        // Update footer\n        if (currentLang === 'zh') {\n            // 中文格式：由LayerV.ai赞助，OpenNHP提供支持。\n            setHtml('footerSponsored', `${t.footerSponsored}<a href=\"https://layerv.ai\" target=\"_blank\">LayerV.ai</a>${t.footerSponsoredSuffix}<a href=\"https://github.com/OpenNHP/opennhp\" target=\"_blank\">OpenNHP</a>${t.footerPowered}。`);\n            document.getElementById('footerPowered').style.display = 'none';\n        } else {\n            // English format: Powered by OpenNHP / Sponsored by: LayerV.ai\n            setHtml('footerPowered', `${t.footerPowered} <a href=\"https://github.com/OpenNHP/opennhp\" target=\"_blank\">OpenNHP</a>`);\n            setHtml('footerSponsored', `${t.footerSponsored} <a href=\"https://layerv.ai\" target=\"_blank\">LayerV.ai</a>`);\n            document.getElementById('footerPowered').style.display = '';\n        }\n\n        console.log('Language changed to:', currentLang);\n    }\n\n    // Tab switching\n    let qrGenerated = false; // Track if QR code has been generated\n\n    function switchLoginTab(tab) {\n        const qrTabBtn = document.getElementById('qrTabBtn');\n        const otpTabBtn = document.getElementById('otpTabBtn');\n        const qrSection = document.getElementById('qrLoginSection');\n        const otpSection = document.getElementById('otpLoginSection');\n\n        if (tab === 'qr') {\n            qrTabBtn.classList.add('active');\n            otpTabBtn.classList.remove('active');\n            qrSection.style.display = 'block';\n            otpSection.style.display = 'none';\n\n            // Generate QR code when switching to QR tab (only once or if expired)\n            if (!qrGenerated || !currentSession.expiresAt || Date.now() > currentSession.expiresAt) {\n                generateQRCode();\n                qrGenerated = true;\n            }\n        } else {\n            qrTabBtn.classList.remove('active');\n            otpTabBtn.classList.add('active');\n            qrSection.style.display = 'none';\n            otpSection.style.display = 'block';\n        }\n    }\n\n    // Generate QR Code\n    async function generateQRCode() {\n        stopPolling();\n        const qrLoading = document.getElementById('qrLoading');\n        const qrCodeWrapper = document.getElementById('qrCodeWrapper');\n        const qrOverlay = document.getElementById('qrOverlay');\n        const statusDot = document.getElementById('statusDot');\n        const qrStatusText = document.getElementById('qrStatusText');\n\n        qrLoading.style.display = 'flex';\n        qrCodeWrapper.style.display = 'none';\n        qrOverlay.classList.remove('show', 'success', 'expired');\n        statusDot.className = 'status-dot pending';\n        qrStatusText.textContent = translations[currentLang].qrStatusWaiting;\n\n        // Reset OTP secret expiry display\n        const secretExpiry = document.getElementById('secretExpiry');\n        const secretExpiryText = document.getElementById('secretExpiryText');\n        if (secretExpiry) secretExpiry.classList.remove('expired');\n        if (secretExpiryText) secretExpiryText.textContent = `${translations[currentLang].secretValidFor} 5m 00s`;\n\n        try {\n            const url = `${config.baseUrl}/plugins/${config.aspId}?resid=${config.resId}&action=generate`;\n            const response = await fetch(url);\n            const data = await response.json();\n\n            if (!data.success) {\n                throw new Error(data.errMsg || 'Failed to generate QR code');\n            }\n\n            currentSession = {\n                sessionId: data.sessionId,\n                otpSecret: data.otpSecret,\n                expiresAt: data.expiresAt * 1000\n            };\n\n\n            // Build QR content\n            const qrContent = `nhp://scan?data=${encodeURIComponent(data.qrData)}&otp=${encodeURIComponent(data.otpSecret)}&server=${encodeURIComponent(data.serverUrl)}&asp=${encodeURIComponent(config.aspId)}&res=${encodeURIComponent(config.resId)}&sid=${encodeURIComponent(data.sessionId)}`;\n\n            // Render QR code\n            renderQRCode(qrContent);\n\n            qrLoading.style.display = 'none';\n            qrCodeWrapper.style.display = 'block';\n\n            startTimer();\n            startPolling();\n\n        } catch (err) {\n            console.error('QR generation error:', err);\n            qrLoading.innerHTML = `<span style=\"color: var(--accent-red);\">${err.message}</span>`;\n        }\n    }\n\n    // Render QR Code\n    function renderQRCode(content) {\n        // Check if qrcode library is loaded\n        if (typeof qrcode === 'undefined') {\n            console.error('QR code library not loaded');\n            const qrLoading = document.getElementById('qrLoading');\n            qrLoading.innerHTML = '<span style=\"color: var(--accent-red);\">QR library failed to load. Please refresh the page.</span>';\n            return;\n        }\n\n        try {\n            const qr = qrcode(0, 'M');\n            qr.addData(content);\n            qr.make();\n\n            const canvas = document.getElementById('qrCanvas');\n            const ctx = canvas.getContext('2d');\n            const moduleCount = qr.getModuleCount();\n\n            // Calculate cell size to fit within 200px\n            const targetSize = 200;\n            const cellSize = Math.floor(targetSize / moduleCount);\n            const size = moduleCount * cellSize;\n\n            canvas.width = size;\n            canvas.height = size;\n\n            ctx.fillStyle = '#ffffff';\n            ctx.fillRect(0, 0, size, size);\n\n            ctx.fillStyle = '#000000';\n            for (let row = 0; row < moduleCount; row++) {\n                for (let col = 0; col < moduleCount; col++) {\n                    if (qr.isDark(row, col)) {\n                        ctx.fillRect(col * cellSize, row * cellSize, cellSize, cellSize);\n                    }\n                }\n            }\n        } catch (err) {\n            console.error('QR code generation error:', err);\n            const qrLoading = document.getElementById('qrLoading');\n            qrLoading.innerHTML = '<span style=\"color: var(--accent-red);\">QR generation failed</span>';\n        }\n    }\n\n    // Timer\n    function startTimer() {\n        if (timerInterval) clearInterval(timerInterval);\n        const qrTimer = document.getElementById('qrTimer');\n        const secretExpiry = document.getElementById('secretExpiry');\n        const secretExpiryText = document.getElementById('secretExpiryText');\n\n        timerInterval = setInterval(() => {\n            if (!currentSession.expiresAt) return;\n\n            const remaining = Math.max(0, currentSession.expiresAt - Date.now());\n            const minutes = Math.floor(remaining / 60000);\n            const seconds = Math.floor((remaining % 60000) / 1000);\n            const timeStr = `${minutes}m ${seconds.toString().padStart(2, '0')}s`;\n\n            // Update QR code timer\n            qrTimer.textContent = `${translations[currentLang].expiresIn} ${timeStr}`;\n\n            // Update OTP secret expiry timer\n            if (secretExpiryText) {\n                secretExpiryText.textContent = `${translations[currentLang].secretValidFor} ${timeStr}`;\n            }\n\n            if (remaining <= 0) {\n                clearInterval(timerInterval);\n                stopPolling();\n                const statusDot = document.getElementById('statusDot');\n                const qrStatusText = document.getElementById('qrStatusText');\n                const qrOverlay = document.getElementById('qrOverlay');\n                const qrOverlayText = document.getElementById('qrOverlayText');\n\n                statusDot.className = 'status-dot expired';\n                qrStatusText.textContent = translations[currentLang].qrStatusExpired;\n                qrOverlay.classList.add('show', 'expired');\n                qrOverlayText.textContent = translations[currentLang].qrStatusExpired;\n\n                // Update OTP secret expiry to show expired\n                if (secretExpiry && secretExpiryText) {\n                    secretExpiry.classList.add('expired');\n                    secretExpiryText.textContent = translations[currentLang].secretExpired;\n                }\n            }\n        }, 1000);\n    }\n\n    // Polling\n    function startPolling() {\n        if (pollingInterval) clearInterval(pollingInterval);\n\n        pollingInterval = setInterval(async () => {\n            if (!currentSession.sessionId) return;\n\n            try {\n                const url = `${config.baseUrl}/plugins/${config.aspId}?resid=${config.resId}&action=status&sessionId=${currentSession.sessionId}`;\n                const response = await fetch(url);\n                const data = await response.json();\n\n                if (!data.success) return;\n\n                const statusDot = document.getElementById('statusDot');\n                const qrStatusText = document.getElementById('qrStatusText');\n                const qrOverlay = document.getElementById('qrOverlay');\n                const qrOverlayText = document.getElementById('qrOverlayText');\n\n                switch (data.status) {\n                    case 1: // scanned\n                        statusDot.className = 'status-dot scanned';\n                        qrStatusText.textContent = translations[currentLang].qrStatusScanned;\n                        qrOverlay.classList.add('show');\n                        qrOverlayText.textContent = translations[currentLang].qrStatusScanned;\n                        break;\n                    case 2: // confirmed\n                        stopPolling();\n                        statusDot.className = 'status-dot confirmed';\n                        qrStatusText.textContent = translations[currentLang].qrStatusConfirmed;\n                        qrOverlay.classList.add('show', 'success');\n                        qrOverlayText.textContent = translations[currentLang].qrStatusConfirmed;\n                        showMessage(translations[currentLang].loginSuccess, 'success');\n                        await completeAuthentication('qrvalid');\n                        break;\n                    case 3: // expired\n                        stopPolling();\n                        statusDot.className = 'status-dot expired';\n                        qrStatusText.textContent = translations[currentLang].qrStatusExpired;\n                        qrOverlay.classList.add('show', 'expired');\n                        qrOverlayText.textContent = translations[currentLang].qrStatusExpired;\n                        break;\n                }\n            } catch (err) {\n                console.error('Polling error:', err);\n            }\n        }, 2000);\n    }\n\n    function stopPolling() {\n        if (pollingInterval) {\n            clearInterval(pollingInterval);\n            pollingInterval = null;\n        }\n        if (timerInterval) {\n            clearInterval(timerInterval);\n            timerInterval = null;\n        }\n    }\n\n    // OTP Input handling\n    const otpInputs = document.querySelectorAll('.otp-input');\n    otpInputs.forEach((input, index) => {\n        input.addEventListener('input', (e) => {\n            const value = e.target.value.replace(/\\D/g, '');\n            e.target.value = value;\n\n            if (value && index < otpInputs.length - 1) {\n                otpInputs[index + 1].focus();\n            }\n\n            checkOtpComplete();\n        });\n\n        input.addEventListener('keydown', (e) => {\n            if (e.key === 'Backspace' && !e.target.value && index > 0) {\n                otpInputs[index - 1].focus();\n            }\n        });\n\n        input.addEventListener('paste', (e) => {\n            e.preventDefault();\n            const paste = (e.clipboardData || window.clipboardData).getData('text');\n            const digits = paste.replace(/\\D/g, '').slice(0, 6);\n\n            digits.split('').forEach((digit, i) => {\n                if (otpInputs[i]) {\n                    otpInputs[i].value = digit;\n                }\n            });\n\n            if (digits.length > 0) {\n                otpInputs[Math.min(digits.length, 5)].focus();\n            }\n\n            checkOtpComplete();\n        });\n    });\n\n    function checkOtpComplete() {\n        const otp = Array.from(otpInputs).map(i => i.value).join('');\n        document.getElementById('verifyOtpBtn').disabled = otp.length !== 6;\n    }\n\n    function getOtpValue() {\n        return Array.from(otpInputs).map(i => i.value).join('');\n    }\n\n    function clearOtpInputs() {\n        otpInputs.forEach(input => input.value = '');\n        document.getElementById('verifyOtpBtn').disabled = true;\n    }\n\n    // Copy secret\n    async function copySecret() {\n        const secretText = document.getElementById('otpSecret').textContent;\n        if (!secretText || secretText === 'Loading...' || secretText === '加载中...') {\n            return;\n        }\n\n        const btn = document.getElementById('copySecretBtn');\n\n        try {\n            // Try modern clipboard API first\n            if (navigator.clipboard && window.isSecureContext) {\n                await navigator.clipboard.writeText(secretText);\n            } else {\n                // Fallback for non-HTTPS or older browsers\n                const textArea = document.createElement('textarea');\n                textArea.value = secretText;\n                textArea.style.position = 'fixed';\n                textArea.style.left = '-9999px';\n                textArea.style.top = '-9999px';\n                document.body.appendChild(textArea);\n                textArea.focus();\n                textArea.select();\n                document.execCommand('copy');\n                document.body.removeChild(textArea);\n            }\n\n            // Show success state\n            btn.classList.add('copied');\n            btn.innerHTML = `<svg viewBox=\"0 0 24 24\" stroke-width=\"2\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>`;\n            showMessage(translations[currentLang].copySuccess, 'success');\n\n            setTimeout(() => {\n                btn.classList.remove('copied');\n                btn.innerHTML = `<svg viewBox=\"0 0 24 24\" stroke-width=\"2\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"></rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"></path></svg>`;\n            }, 2000);\n        } catch (err) {\n            console.error('Copy failed:', err);\n            showMessage('Copy failed', 'error');\n        }\n    }\n\n    // Verify OTP\n    async function verifyOTP() {\n        const otpCode = getOtpValue();\n        if (otpCode.length !== 6) return;\n\n        const verifyBtn = document.getElementById('verifyOtpBtn');\n        verifyBtn.disabled = true;\n        verifyBtn.textContent = translations[currentLang].verifying;\n\n        try {\n            // Use configured OTP secret key - no session needed\n            const url = `${config.baseUrl}/plugins/${config.aspId}?resid=${config.resId}&action=otpvalid&otpCode=${otpCode}`;\n            const response = await fetch(url);\n            const data = await response.json();\n\n            if (data.errCode === \"0\" || data.errCode === \"\") {\n                showMessage(translations[currentLang].loginSuccess, 'success');\n                if (data.redirectUrl) {\n                    setTimeout(() => {\n                        window.location.href = data.redirectUrl;\n                    }, 1500);\n                }\n            } else {\n                throw new Error(data.errMsg || 'Invalid OTP code');\n            }\n        } catch (err) {\n            console.error('OTP verification error:', err);\n            showMessage(err.message, 'error');\n            clearOtpInputs();\n        } finally {\n            verifyBtn.disabled = false;\n            verifyBtn.textContent = translations[currentLang].verifyBtnText;\n        }\n    }\n\n    // Complete authentication\n    async function completeAuthentication(action) {\n        try {\n            const url = `${config.baseUrl}/plugins/${config.aspId}?resid=${config.resId}&action=${action}&sessionId=${currentSession.sessionId}`;\n            const response = await fetch(url);\n            const data = await response.json();\n\n            if (data.errCode === \"0\" || data.errCode === \"\") {\n                if (data.redirectUrl) {\n                    setTimeout(() => {\n                        window.location.href = data.redirectUrl;\n                    }, 1500);\n                }\n            } else {\n                throw new Error(data.errMsg || 'Authentication failed');\n            }\n        } catch (err) {\n            console.error('Complete auth error:', err);\n            showMessage(err.message, 'error');\n        }\n    }\n\n    // Show message\n    function showMessage(text, type) {\n        const messageEl = document.getElementById('message');\n        messageEl.textContent = text;\n        messageEl.className = `message show ${type}`;\n        setTimeout(() => {\n            messageEl.classList.remove('show');\n        }, 5000);\n    }\n\n    // Fetch IP\n    async function fetchIP() {\n        const ipDisplay = document.getElementById('ip-display');\n        try {\n            // Add timeout to prevent slow loading\n            const controller = new AbortController();\n            const timeoutId = setTimeout(() => controller.abort(), 5000);\n\n            const res = await fetch('https://api.ipify.org?format=json', {\n                signal: controller.signal\n            });\n            clearTimeout(timeoutId);\n\n            const data = await res.json();\n            ipDisplay.textContent = `IP: ${data.ip}`;\n        } catch (e) {\n            // Silently fail - don't block page load\n            ipDisplay.textContent = '';\n        }\n    }\n\n    // Initialize\n    document.addEventListener('DOMContentLoaded', () => {\n        // Detect language and set default\n        const userLang = navigator.language || navigator.userLanguage;\n        if (userLang.startsWith('zh')) {\n            document.getElementById('languageSelect').value = 'zh';\n            currentLang = 'zh';\n        } else {\n            document.getElementById('languageSelect').value = 'en';\n            currentLang = 'en';\n        }\n\n        // Always call changeLanguage to initialize all translations\n        changeLanguage();\n\n        // Display configured OTP secret key immediately\n        if (config.otpSecretKey) {\n            document.getElementById('otpSecret').textContent = config.otpSecretKey;\n        }\n\n        // Fetch IP\n        fetchIP();\n\n        // Don't auto-generate QR code since OTP is the default tab\n        // QR code will be generated when user switches to QR tab\n    });\n</script>\n</body>\n</html>\n"
  },
  {
    "path": "examples/server_plugin/basic/Makefile",
    "content": "export GO111MODULE := on\n\nall: build\n\nPluginName = example\nTargetName = ${PluginName}.so\nServerDir = ../../../release/nhp-server\nLD_FLAGS = \"-s -w\"\n\n# Color definition\nCOLOUR_GREEN=\\033[0;32m\nCOLOUR_RED=\\033[0;31m\nCOLOUR_BLUE=\\033[0;34m\nEND_COLOUR=\\033[0m\n\nbuild:\n\t@echo \"$(COLOUR_BLUE)[Plugin-${PluginName}] Start building... $(END_COLOUR)\"\n\tgo build -buildmode=plugin -trimpath -ldflags ${LD_FLAGS} -v -o ${ServerDir}/plugins/${PluginName}/${TargetName} ./main.go\n\tmkdir -p ${ServerDir}/plugins/${PluginName}/etc\n\tcp ./etc/*.toml ${ServerDir}/plugins/${PluginName}/etc/\n\tmkdir -p ${ServerDir}/templates/${PluginName}\n\tcp ./templates/*.* ${ServerDir}/templates/${PluginName}\n\t@echo \"$(COLOUR_GREEN)[Plugin-${PluginName}] Successfully built!$(END_COLOUR)\"\n.PHONY: all build\n\n"
  },
  {
    "path": "examples/server_plugin/basic/etc/config.toml",
    "content": "ExampleUsername = \"user\"\nExamplePassword = \"password\"\n\n"
  },
  {
    "path": "examples/server_plugin/basic/etc/resource.toml",
    "content": "# List resources id and their sub-fields here\n\n# syntax [\"{ResourceId}\"]\n# ResourceId: id for the resource group. Each AuthServiceId can have multiple ResourceIds.\n# SkipAuth: true: auth by matching the AuthServiceId and ResourceId, skip using plugin logic.\n# OpenTime: seconds for traffic passing duration after successful knock.\n# RedirectUrl: a customized url send back with the http response message as an option for redirection. (only applicable for http agent)\n# RedirectWithParams: whether or not to include queries in the original http request. (only applicable for http agent)\n[\"demo\"]\nSkipAuth = true\nOpenTime = 15\nRedirectUrl = \"https://acdemo.opennhp.org\"\nRedirectWithParams = false\nCookieDomain = \"opennhp.org\"\n\n# syntax [\"{ResourceId}\".Resources.\"{ResourceName}\"]\n# ResourceName: name of resource inside a resource group. Each ResourceId can have multiple ResourceNames.\n# ACId: id of the NHP-AC that guards the resource.\n# Hostname: domain for the resource.\n# Addr.Ip: destination ip address of the resource.\n# Addr.Port: destination port of the resource.\n# Addr.Protocol: whether to pass a specific protocol among \"tcp\", \"udp\", \"any\". \"any\" also includes ping traffic.\n# PortSuffix: true: fill ack field \"resHost\" with \"{Hostname}:{Port}\", false: fill ack field \"resHost\" with just \"{Hostname}\"\n[\"demo\".Resources.\"demoServer\"]\nACId = \"testAC-1\"\nHostname = \"acdemo.opennhp.org\"\nAddr.Ip = \"220.191.216.236\"\nAddr.Port = 443 # empty or 0 for all ports\nAddr.Protocol = \"\" # \"tcp/udp/any\", empty for \"any\"\nPortSuffix = false\n\n# extra information as per-plugin defined fields\n[\"demo\".ExInfo]\nTitle = \"OpenNHP Demo - Authentication\"\n\n"
  },
  {
    "path": "examples/server_plugin/basic/go.mod",
    "content": "module github.com/OpenNHP/opennhp/examples/server_plugin/basic\n\ngo 1.25.6\n\nrequire (\n\tgithub.com/OpenNHP/opennhp/nhp v0.6.0\n\tgithub.com/gin-gonic/gin v1.12.0\n\tgithub.com/pelletier/go-toml/v2 v2.2.4\n)\n\nrequire (\n\tgithub.com/bytedance/gopkg v0.1.3 // indirect\n\tgithub.com/bytedance/sonic v1.15.0 // indirect\n\tgithub.com/bytedance/sonic/loader v0.5.0 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.3.0 // indirect\n\tgithub.com/cloudwego/base64x v0.1.6 // indirect\n\tgithub.com/coocood/freecache v1.2.5 // indirect\n\tgithub.com/fsnotify/fsnotify v1.9.0 // indirect\n\tgithub.com/gabriel-vasile/mimetype v1.4.12 // indirect\n\tgithub.com/gin-contrib/sse v1.1.0 // indirect\n\tgithub.com/go-playground/locales v0.14.1 // indirect\n\tgithub.com/go-playground/universal-translator v0.18.1 // indirect\n\tgithub.com/go-playground/validator/v10 v10.30.1 // indirect\n\tgithub.com/goccy/go-json v0.10.5 // indirect\n\tgithub.com/goccy/go-yaml v1.19.2 // indirect\n\tgithub.com/google/uuid v1.6.0 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.3.0 // indirect\n\tgithub.com/leodido/go-urn v1.4.0 // indirect\n\tgithub.com/mattn/go-isatty v0.0.20 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/quic-go/qpack v0.6.0 // indirect\n\tgithub.com/quic-go/quic-go v0.59.0 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgithub.com/ugorji/go/codec v1.3.1 // indirect\n\tgo.mongodb.org/mongo-driver/v2 v2.5.0 // indirect\n\tgolang.org/x/arch v0.23.0 // indirect\n\tgolang.org/x/crypto v0.48.0 // indirect\n\tgolang.org/x/net v0.51.0 // indirect\n\tgolang.org/x/sys v0.42.0 // indirect\n\tgolang.org/x/text v0.34.0 // indirect\n\tgoogle.golang.org/protobuf v1.36.11 // indirect\n)\n\nreplace github.com/OpenNHP/opennhp/nhp v0.6.0 => ../../../nhp\n"
  },
  {
    "path": "examples/server_plugin/basic/go.sum",
    "content": "github.com/bytedance/gopkg v0.1.3 h1:TPBSwH8RsouGCBcMBktLt1AymVo2TVsBVCY4b6TnZ/M=\ngithub.com/bytedance/gopkg v0.1.3/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/sonic v1.15.0 h1:/PXeWFaR5ElNcVE84U0dOHjiMHQOwNIx3K4ymzh/uSE=\ngithub.com/bytedance/sonic v1.15.0/go.mod h1:tFkWrPz0/CUCLEF4ri4UkHekCIcdnkqXw9VduqpJh0k=\ngithub.com/bytedance/sonic/loader v0.5.0 h1:gXH3KVnatgY7loH5/TkeVyXPfESoqSBSBEiDd5VjlgE=\ngithub.com/bytedance/sonic/loader v0.5.0/go.mod h1:AR4NYCk5DdzZizZ5djGqQ92eEhCCcdf5x77udYiSJRo=\ngithub.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=\ngithub.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cloudwego/base64x v0.1.6 h1:t11wG9AECkCDk5fMSoxmufanudBtJ+/HemLstXDLI2M=\ngithub.com/cloudwego/base64x v0.1.6/go.mod h1:OFcloc187FXDaYHvrNIjxSe8ncn0OOM8gEHfghB2IPU=\ngithub.com/coocood/freecache v1.2.5 h1:FmhRQ8cLLVq9zWhHVYODUEZ0xu6rTPrVeAnX1AEIf7I=\ngithub.com/coocood/freecache v1.2.5/go.mod h1:RBUWa/Cy+OHdfTGFEhEuE1pMCMX51Ncizj7rthiQ3vk=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k=\ngithub.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0=\ngithub.com/gabriel-vasile/mimetype v1.4.12 h1:e9hWvmLYvtp846tLHam2o++qitpguFiYCKbn0w9jyqw=\ngithub.com/gabriel-vasile/mimetype v1.4.12/go.mod h1:d+9Oxyo1wTzWdyVUPMmXFvp4F9tea18J8ufA774AB3s=\ngithub.com/gin-contrib/sse v1.1.0 h1:n0w2GMuUpWDVp7qSpvze6fAu9iRxJY4Hmj6AmBOU05w=\ngithub.com/gin-contrib/sse v1.1.0/go.mod h1:hxRZ5gVpWMT7Z0B0gSNYqqsSCNIJMjzvm6fqCz9vjwM=\ngithub.com/gin-gonic/gin v1.12.0 h1:b3YAbrZtnf8N//yjKeU2+MQsh2mY5htkZidOM7O0wG8=\ngithub.com/gin-gonic/gin v1.12.0/go.mod h1:VxccKfsSllpKshkBWgVgRniFFAzFb9csfngsqANjnLc=\ngithub.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=\ngithub.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=\ngithub.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA=\ngithub.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=\ngithub.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=\ngithub.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=\ngithub.com/go-playground/validator/v10 v10.30.1 h1:f3zDSN/zOma+w6+1Wswgd9fLkdwy06ntQJp0BBvFG0w=\ngithub.com/go-playground/validator/v10 v10.30.1/go.mod h1:oSuBIQzuJxL//3MelwSLD5hc2Tu889bF0Idm9Dg26cM=\ngithub.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4=\ngithub.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M=\ngithub.com/goccy/go-yaml v1.19.2 h1:PmFC1S6h8ljIz6gMRBopkjP1TVT7xuwrButHID66PoM=\ngithub.com/goccy/go-yaml v1.19.2/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA=\ngithub.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=\ngithub.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=\ngithub.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzhA9Y=\ngithub.com/klauspost/cpuid/v2 v2.3.0/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0=\ngithub.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ=\ngithub.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI=\ngithub.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=\ngithub.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4=\ngithub.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/quic-go/qpack v0.6.0 h1:g7W+BMYynC1LbYLSqRt8PBg5Tgwxn214ZZR34VIOjz8=\ngithub.com/quic-go/qpack v0.6.0/go.mod h1:lUpLKChi8njB4ty2bFLX2x4gzDqXwUpaO1DP9qMDZII=\ngithub.com/quic-go/quic-go v0.59.0 h1:OLJkp1Mlm/aS7dpKgTc6cnpynnD2Xg7C1pwL6vy/SAw=\ngithub.com/quic-go/quic-go v0.59.0/go.mod h1:upnsH4Ju1YkqpLXC305eW3yDZ4NfnNbmQRCMWS58IKU=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=\ngithub.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/ugorji/go/codec v1.3.1 h1:waO7eEiFDwidsBN6agj1vJQ4AG7lh2yqXyOXqhgQuyY=\ngithub.com/ugorji/go/codec v1.3.1/go.mod h1:pRBVtBSKl77K30Bv8R2P+cLSGaTtex6fsA2Wjqmfxj4=\ngo.mongodb.org/mongo-driver/v2 v2.5.0 h1:yXUhImUjjAInNcpTcAlPHiT7bIXhshCTL3jVBkF3xaE=\ngo.mongodb.org/mongo-driver/v2 v2.5.0/go.mod h1:yOI9kBsufol30iFsl1slpdq1I0eHPzybRWdyYUs8K/0=\ngo.uber.org/mock v0.6.0 h1:hyF9dfmbgIX5EfOdasqLsWD6xqpNZlXblLB/Dbnwv3Y=\ngo.uber.org/mock v0.6.0/go.mod h1:KiVJ4BqZJaMj4svdfmHM0AUx4NJYO8ZNpPnZn1Z+BBU=\ngolang.org/x/arch v0.23.0 h1:lKF64A2jF6Zd8L0knGltUnegD62JMFBiCPBmQpToHhg=\ngolang.org/x/arch v0.23.0/go.mod h1:dNHoOeKiyja7GTvF9NJS1l3Z2yntpQNzgrjh1cU103A=\ngolang.org/x/crypto v0.48.0 h1:/VRzVqiRSggnhY7gNRxPauEQ5Drw9haKdM0jqfcCFts=\ngolang.org/x/crypto v0.48.0/go.mod h1:r0kV5h3qnFPlQnBSrULhlsRfryS2pmewsg+XfMgkVos=\ngolang.org/x/net v0.51.0 h1:94R/GTO7mt3/4wIKpcR5gkGmRLOuE/2hNGeWq/GBIFo=\ngolang.org/x/net v0.51.0/go.mod h1:aamm+2QF5ogm02fjy5Bb7CQ0WMt1/WVM7FtyaTLlA9Y=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.42.0 h1:omrd2nAlyT5ESRdCLYdm3+fMfNFE/+Rf4bDIQImRJeo=\ngolang.org/x/sys v0.42.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=\ngolang.org/x/text v0.34.0 h1:oL/Qq0Kdaqxa1KbNeMKwQq0reLCCaFtqu2eNuSeNHbk=\ngolang.org/x/text v0.34.0/go.mod h1:homfLqTYRFyVYemLBFl5GgL/DWEiH5wcsQ5gSh1yziA=\ngoogle.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE=\ngoogle.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\n"
  },
  {
    "path": "examples/server_plugin/basic/main.go",
    "content": "package main\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"sync\"\n\n\t\"github.com/OpenNHP/opennhp/nhp/common\"\n\tnhplog \"github.com/OpenNHP/opennhp/nhp/log\"\n\t\"github.com/OpenNHP/opennhp/nhp/plugins\"\n\t\"github.com/OpenNHP/opennhp/nhp/utils\"\n\t\"github.com/gin-gonic/gin\"\n\n\ttoml \"github.com/pelletier/go-toml/v2\"\n)\n\ntype config struct {\n\tExampleUsername string\n\tExamplePassword string\n}\n\nvar (\n\t// Example Plugin Settings\n\tlog           *nhplog.Logger\n\tpluginDirPath string\n\thostname      string\n\tlocalIp       string\n\tlocalMac      string\n)\n\nvar (\n\tname    = \"example\"\n\tversion = \"0.1.1\"\n\n\tbaseConfigWatch io.Closer\n\tresConfigWatch  io.Closer\n\n\tbaseConf         *config\n\tresourceMapMutex sync.Mutex\n\tresourceMap      common.ResourceGroupMap\n)\n\nvar (\n\terrLoadConfig = fmt.Errorf(\"config load error\")\n)\n\nfunc Version() string {\n\treturn fmt.Sprintf(\"%s v%s\", name, version)\n}\n\nfunc Init(in *plugins.PluginParamsIn) error {\n\tif in.PluginDirPath != nil {\n\t\tpluginDirPath = *in.PluginDirPath\n\t}\n\tif in.Log != nil {\n\t\tlog = in.Log\n\t}\n\tif in.Hostname != nil {\n\t\thostname = *in.Hostname\n\t}\n\tif in.LocalIp != nil {\n\t\tlocalIp = *in.LocalIp\n\t}\n\tif in.LocalMac != nil {\n\t\tlocalMac = *in.LocalMac\n\t}\n\n\t// load config\n\tfileNameBase := (filepath.Join(pluginDirPath, \"etc\", \"config.toml\"))\n\tif err := updateConfig(fileNameBase); err != nil {\n\t\t// ignore error\n\t\t_ = err\n\t}\n\n\tbaseConfigWatch = utils.WatchFile(fileNameBase, func() {\n\t\tlog.Info(\"base config: %s has been updated\", fileNameBase)\n\t\tupdateConfig(fileNameBase)\n\t})\n\n\tfileNameRes := filepath.Join(pluginDirPath, \"etc\", \"resource.toml\")\n\tif err := updateResource(fileNameRes); err != nil {\n\t\t// ignore error\n\t\t_ = err\n\t}\n\tresConfigWatch = utils.WatchFile(fileNameRes, func() {\n\t\tlog.Info(\"resource config: %s has been updated\", fileNameRes)\n\t\tupdateResource(fileNameRes)\n\t})\n\n\treturn nil\n}\n\nfunc updateConfig(file string) (err error) {\n\tutils.CatchPanicThenRun(func() {\n\t\terr = errLoadConfig\n\t})\n\n\tcontent, err := os.ReadFile(file)\n\tif err != nil {\n\t\tlog.Error(\"failed to read base config: %v\", err)\n\t}\n\n\tvar conf config\n\tif err := toml.Unmarshal(content, &conf); err != nil {\n\t\tlog.Error(\"failed to unmarshal base config: %v\", err)\n\t}\n\n\tbaseConf = &conf\n\treturn err\n}\n\nfunc updateResource(file string) (err error) {\n\tutils.CatchPanicThenRun(func() {\n\t\terr = errLoadConfig\n\t})\n\n\tcontent, err := os.ReadFile(file)\n\tif err != nil {\n\t\tlog.Error(\"failed to read resource config: %v\", err)\n\t}\n\n\tresourceMapMutex.Lock()\n\tdefer resourceMapMutex.Unlock()\n\n\tresourceMap = make(common.ResourceGroupMap)\n\tif err := toml.Unmarshal(content, &resourceMap); err != nil {\n\t\tlog.Error(\"failed to unmarshal resource config: %v\", err)\n\t}\n\n\t// res is pointer so we can update its fields\n\tfor resId, res := range resourceMap {\n\t\tres.AuthServiceId = name\n\t\tres.ResourceId = resId\n\t}\n\n\treturn err\n}\n\nfunc Close() error {\n\tif baseConfigWatch != nil {\n\t\tbaseConfigWatch.Close()\n\t}\n\tif resConfigWatch != nil {\n\t\tresConfigWatch.Close()\n\t}\n\treturn nil\n}\n\nfunc findResource(resId string) *common.ResourceData {\n\tresourceMapMutex.Lock()\n\tdefer resourceMapMutex.Unlock()\n\n\tres, found := resourceMap[resId]\n\tif found {\n\t\treturn res\n\t}\n\treturn nil\n}\n\nfunc AuthWithHttp(ctx *gin.Context, req *common.HttpKnockRequest, helper *plugins.HttpServerPluginHelper) (ackMsg *common.ServerKnockAckMsg, err error) {\n\tif helper == nil {\n\t\treturn nil, fmt.Errorf(\"AuthWithHttp: helper is null\")\n\t}\n\n\tresId := ctx.Query(\"resid\")\n\taction := ctx.Query(\"action\")\n\tif len(resId) > 0 && strings.Contains(resId, \"|\") {\n\t\tparams := strings.Split(resId, \"|\")\n\t\tresId = params[0]\n\t\tif len(params) > 1 {\n\t\t\taction = params[1]\n\t\t}\n\t}\n\n\tres := findResource(resId)\n\tif res == nil || len(res.Resources) == 0 {\n\t\tackMsg = nil\n\t\terr = common.ErrResourceNotFound\n\t\tlog.Error(\"resource error: %v\", err)\n\t\tctx.String(http.StatusOK, \"{\\\"errMsg\\\": \\\"resource error: %v\\\"}\", err)\n\t\treturn\n\t}\n\n\tcorsMiddleware(ctx)\n\n\tswitch {\n\tcase strings.EqualFold(action, \"valid\"):\n\t\tackMsg, err = authRegular(ctx, req, res, helper)\n\n\tcase strings.EqualFold(action, \"login\"):\n\t\tackMsg, err = authAndShowLogin(ctx, req, res, helper)\n\n\tdefault:\n\t\tackMsg = nil\n\t\terr = fmt.Errorf(\"action invalid\")\n\t}\n\treturn\n}\n\nfunc authAndShowLogin(ctx *gin.Context, req *common.HttpKnockRequest, res *common.ResourceData, helper *plugins.HttpServerPluginHelper) (*common.ServerKnockAckMsg, error) {\n\t_ = helper\n\n\tif res.ExInfo == nil {\n\t\tlog.Error(\"extra login info not available\")\n\t\tctx.String(http.StatusOK, \"{\\\"errMsg\\\": \\\"extra login info not available\\\"}\")\n\t\treturn nil, fmt.Errorf(\"extra login info not available\")\n\t}\n\n\tctx.HTML(http.StatusOK, \"example/example_login.html\", gin.H{\n\t\t\"title\":     res.ExInfo[\"Title\"].(string),\n\t\t\"nhpServer\": hostname,\n\t\t\"aspId\":     req.AuthServiceId,\n\t\t\"resId\":     res.ResourceId,\n\t})\n\n\treturn nil, nil\n}\n\nfunc authRegular(ctx *gin.Context, req *common.HttpKnockRequest, res *common.ResourceData, helper *plugins.HttpServerPluginHelper) (*common.ServerKnockAckMsg, error) {\n\tvar err error\n\tusername, _ := url.QueryUnescape(ctx.Query(\"username\"))\n\tpassword, _ := url.QueryUnescape(ctx.Query(\"password\"))\n\n\tif !strings.EqualFold(username, baseConf.ExampleUsername) || !strings.EqualFold(password, baseConf.ExamplePassword) {\n\t\tlog.Info(\"Authenticating user: %s failed!\", username)\n\t\treturn nil, fmt.Errorf(\"user or password is incorrect\")\n\t}\n\n\t// interact with udp server for ac operation\n\tackMsg, err := helper.AuthWithHttpCallbackFunc(req, res)\n\tif ackMsg == nil || ackMsg.ErrCode != common.ErrSuccess.ErrorCode() {\n\t\tlog.Error(\"knock failed. ackMsg is nil\")\n\t\tackMsg = &common.ServerKnockAckMsg{}\n\t\tackMsg.ErrCode = common.ErrServerACOpsFailed.ErrorCode()\n\t\tackMsg.ErrMsg = err.Error()\n\t} else {\n\t\tlog.Info(\"knock succeeded.\")\n\t\tackMsg.ErrMsg = \"\"\n\t\t// assign the redirect url to the ackMsg\n\t\tif len(res.RedirectUrl) == 0 {\n\t\t\tlog.Error(\"RedirectUrl is not provided.\")\n\t\t} else {\n\t\t\tackMsg.RedirectUrl = res.RedirectUrl\n\t\t}\n\n\t\t// set cookies\n\t\t// note that a dot in domain prefix used to make a difference, but now it doesn't (RFC6265).\n\t\t// The cookie will be sent to any subdomain of the specified domain, with or without the leading dot.\n\t\tsingleHost := len(ackMsg.ACTokens) == 1\n\t\tfor resName, token := range ackMsg.ACTokens {\n\t\t\tif singleHost {\n\t\t\t\tctx.SetCookie(\n\t\t\t\t\t\"nhp-token\",            // Name\n\t\t\t\t\turl.QueryEscape(token), // Value\n\t\t\t\t\tint(res.OpenTime),      // MaxAge - use the knock interval time\n\t\t\t\t\t\"/\",                    // Path\n\t\t\t\t\tres.CookieDomain,       // Domain\n\t\t\t\t\ttrue,                   // Secure - if true, this cookie will only be sent on https, not http\n\t\t\t\t\ttrue)                   // HttpOnly - if true, this cookie will only be sent on http(s)\n\t\t\t} else {\n\t\t\t\tdomain := strings.Split(ackMsg.ResourceHost[resName], \":\")[0]\n\t\t\t\tctx.SetCookie(\n\t\t\t\t\t\"nhp-token\"+\"/\"+resName, // Name\n\t\t\t\t\turl.QueryEscape(token),  // Value\n\t\t\t\t\tint(res.OpenTime),       // MaxAge - use the knock interval time\n\t\t\t\t\t\"/\",                     // Path\n\t\t\t\t\tdomain,                  // Domain\n\t\t\t\t\ttrue,                    // Secure - if true, this cookie will only be sent on https, not http\n\t\t\t\t\ttrue)                    // HttpOnly - if true, this cookie will only be sent on http(s)\n\t\t\t}\n\t\t\tlog.Info(\"ctx.SetCookie.\")\n\t\t}\n\t}\n\tctx.JSON(http.StatusOK, ackMsg)\n\treturn ackMsg, nil\n}\n\nfunc AuthWithNHP(req *common.NhpAuthRequest, helper *plugins.NhpServerPluginHelper) (ackMsg *common.ServerKnockAckMsg, err error) {\n\tackMsg = req.Ack\n\tif helper == nil {\n\t\treturn ackMsg, fmt.Errorf(\"AuthWithNHP: helper is null\")\n\t}\n\n\tvar found bool\n\tvar res *common.ResourceData\n\tresourceMapMutex.Lock()\n\tres, found = resourceMap[req.Msg.ResourceId]\n\tresourceMapMutex.Unlock()\n\n\tif !found || len(res.Resources) == 0 {\n\t\terr = common.ErrResourceNotFound\n\t\tackMsg.ErrCode = common.ErrResourceNotFound.ErrorCode()\n\t\tackMsg.ErrMsg = err.Error()\n\t\treturn\n\t}\n\n\t// there is no backend auth in this plugin, fail the request if SkipAuth is false\n\tif !res.SkipAuth {\n\t\terr = common.ErrBackendAuthRequired\n\t\tackMsg.ErrCode = common.ErrBackendAuthRequired.ErrorCode()\n\t\tackMsg.ErrMsg = err.Error()\n\t\treturn\n\t}\n\n\t// skip backend auth and continue with AC operations\n\tlog.Info(\"agent user [%s]: skip auth\", req.Msg.UserId)\n\tackMsg.OpenTime = res.OpenTime\n\n\t// PART III: request ac operation for each resource and block for response\n\tackMsg, err = helper.AuthWithNhpCallbackFunc(req, res)\n\n\treturn ackMsg, err\n}\n\nfunc corsMiddleware(ctx *gin.Context) {\n\toriginResource := ctx.Request.Header.Get(\"Origin\")\n\n\tif originResource != \"\" {\n\t\t// HTTP headers for CORS\n\t\tctx.Writer.Header().Set(\"Access-Control-Allow-Origin\", originResource) // allow cross-origin resource sharing\n\t}\n\n\tctx.Next()\n}\n\nfunc main() {\n\n}\n\n"
  },
  {
    "path": "examples/server_plugin/basic/templates/example_acdemo.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>OpenNHP Demo - AC Protected Server</title>\n    <link rel=\"preconnect\" href=\"https://fonts.googleapis.com\">\n    <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n    <link href=\"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600&family=Outfit:wght@300;400;600;700&display=swap\" rel=\"stylesheet\">\n    <style>\n        :root {\n            --bg-primary: #0a0e17;\n            --bg-secondary: #131a2b;\n            --bg-card: rgba(20, 30, 50, 0.85);\n            --accent-cyan: #00d4ff;\n            --accent-green: #00ff88;\n            --accent-orange: #ff6b35;\n            --text-primary: #e8eef5;\n            --text-secondary: #8892a4;\n            --border-color: rgba(0, 212, 255, 0.2);\n        }\n\n        * {\n            margin: 0;\n            padding: 0;\n            box-sizing: border-box;\n        }\n\n        body {\n            font-family: 'Outfit', sans-serif;\n            min-height: 100vh;\n            display: flex;\n            justify-content: center;\n            align-items: center;\n            background: var(--bg-primary);\n            background-image: \n                radial-gradient(ellipse at 20% 20%, rgba(0, 212, 255, 0.08) 0%, transparent 50%),\n                radial-gradient(ellipse at 80% 80%, rgba(0, 255, 136, 0.06) 0%, transparent 50%),\n                linear-gradient(180deg, var(--bg-primary) 0%, var(--bg-secondary) 100%);\n            padding: 2rem;\n        }\n\n        .container {\n            max-width: 640px;\n            width: 100%;\n            background: var(--bg-card);\n            backdrop-filter: blur(20px);\n            border: 1px solid var(--border-color);\n            border-radius: 24px;\n            padding: 3rem;\n            text-align: center;\n            box-shadow: \n                0 4px 60px rgba(0, 0, 0, 0.4),\n                0 0 0 1px rgba(255, 255, 255, 0.05) inset;\n            animation: fadeIn 0.6s ease-out;\n        }\n\n        @keyframes fadeIn {\n            from { opacity: 0; transform: translateY(20px); }\n            to { opacity: 1; transform: translateY(0); }\n        }\n\n        .logo-title {\n            display: flex;\n            align-items: center;\n            justify-content: center;\n            gap: 0.75rem;\n            margin-bottom: 0.5rem;\n        }\n\n        .logo-title img {\n            height: 48px;\n            width: 48px;\n        }\n\n        .logo-title h1 {\n            font-size: 1.5rem;\n            font-weight: 700;\n            color: var(--text-primary);\n            margin: 0;\n            letter-spacing: -0.02em;\n        }\n\n        .subtitle {\n            font-size: 0.95rem;\n            color: var(--text-secondary);\n            margin-bottom: 2rem;\n            text-align: center;\n        }\n\n        .server-links {\n            display: flex;\n            flex-direction: column;\n            gap: 0.75rem;\n            margin-bottom: 2.5rem;\n        }\n\n        .server-card {\n            background: rgba(0, 212, 255, 0.05);\n            border: 1px solid rgba(0, 212, 255, 0.15);\n            border-radius: 12px;\n            padding: 1rem 1.25rem;\n            display: flex;\n            align-items: center;\n            justify-content: space-between;\n            transition: all 0.3s ease;\n        }\n\n        .server-card:hover {\n            background: rgba(0, 212, 255, 0.1);\n            border-color: rgba(0, 212, 255, 0.3);\n            transform: translateY(-2px);\n        }\n\n        .server-url {\n            font-family: 'JetBrains Mono', monospace;\n            font-size: 0.9rem;\n            color: var(--accent-cyan);\n            text-decoration: none;\n        }\n\n        .scan-link {\n            font-size: 0.8rem;\n            color: var(--accent-green);\n            text-decoration: none;\n            padding: 0.4rem 0.8rem;\n            background: rgba(0, 255, 136, 0.1);\n            border-radius: 6px;\n            transition: all 0.2s ease;\n            display: flex;\n            align-items: center;\n            gap: 0.3rem;\n        }\n\n        .scan-link:hover {\n            background: rgba(0, 255, 136, 0.2);\n        }\n\n        .scan-link svg {\n            width: 14px;\n            height: 14px;\n            fill: currentColor;\n        }\n\n        .countdown-section {\n            background: linear-gradient(135deg, rgba(255, 107, 53, 0.1), rgba(255, 107, 53, 0.05));\n            border: 1px solid rgba(255, 107, 53, 0.2);\n            border-radius: 16px;\n            padding: 1.5rem;\n            margin-bottom: 1.5rem;\n        }\n\n        .countdown-label {\n            font-size: 0.85rem;\n            color: var(--text-secondary);\n            margin-bottom: 0.75rem;\n            text-transform: uppercase;\n            letter-spacing: 0.1em;\n        }\n\n        .countdown-timer {\n            display: flex;\n            align-items: baseline;\n            justify-content: center;\n            gap: 0.5rem;\n        }\n\n        #timer {\n            font-family: 'JetBrains Mono', monospace;\n            font-size: 3.5rem;\n            font-weight: 600;\n            color: var(--accent-orange);\n            line-height: 1;\n            text-shadow: 0 0 30px rgba(255, 107, 53, 0.5);\n            animation: pulse 1s ease-in-out infinite;\n        }\n\n        @keyframes pulse {\n            0%, 100% { opacity: 1; }\n            50% { opacity: 0.7; }\n        }\n\n        .countdown-unit {\n            font-size: 1rem;\n            color: var(--text-secondary);\n        }\n\n        #message {\n            display: none;\n            background: linear-gradient(135deg, rgba(0, 255, 136, 0.1), rgba(0, 255, 136, 0.05));\n            border: 1px solid rgba(0, 255, 136, 0.3);\n            border-radius: 16px;\n            padding: 1.5rem;\n            margin-bottom: 1.5rem;\n        }\n\n        #message .icon {\n            font-size: 2rem;\n            margin-bottom: 0.5rem;\n        }\n\n        #message .text {\n            font-size: 1.1rem;\n            color: var(--accent-green);\n            font-weight: 600;\n        }\n\n        .info-section {\n            display: flex;\n            flex-direction: column;\n            gap: 1rem;\n            align-items: center;\n        }\n\n        #ip-display {\n            font-family: 'JetBrains Mono', monospace;\n            font-size: 0.85rem;\n            color: var(--text-secondary);\n            background: rgba(255, 255, 255, 0.03);\n            padding: 0.5rem 1rem;\n            border-radius: 8px;\n            border: 1px solid rgba(255, 255, 255, 0.05);\n        }\n\n        .auto-refresh-toggle {\n            display: flex;\n            align-items: center;\n            gap: 0.75rem;\n            cursor: pointer;\n            user-select: none;\n        }\n\n        .auto-refresh-toggle input {\n            display: none;\n        }\n\n        .toggle-switch {\n            width: 44px;\n            height: 24px;\n            background: rgba(255, 255, 255, 0.1);\n            border-radius: 12px;\n            position: relative;\n            transition: all 0.3s ease;\n        }\n\n        .toggle-switch::after {\n            content: '';\n            position: absolute;\n            width: 18px;\n            height: 18px;\n            background: var(--text-secondary);\n            border-radius: 50%;\n            top: 3px;\n            left: 3px;\n            transition: all 0.3s ease;\n        }\n\n        .auto-refresh-toggle input:checked + .toggle-switch {\n            background: rgba(0, 255, 136, 0.3);\n        }\n\n        .auto-refresh-toggle input:checked + .toggle-switch::after {\n            background: var(--accent-green);\n            left: 23px;\n        }\n\n        .toggle-label {\n            font-size: 0.85rem;\n            color: var(--text-secondary);\n        }\n\n        .footer {\n            margin-top: 2rem;\n            padding-top: 1.5rem;\n            border-top: 1px solid rgba(255, 255, 255, 0.05);\n        }\n\n        .footer-text {\n            font-size: 0.75rem;\n            color: var(--text-secondary);\n            opacity: 0.6;\n        }\n\n        .footer-text a {\n            color: var(--accent-cyan);\n            text-decoration: none;\n        }\n\n        .language-select {\n            text-align: right;\n            margin-bottom: 1rem;\n        }\n\n        .language-select select {\n            background: rgba(255, 255, 255, 0.05);\n            border: 1px solid rgba(255, 255, 255, 0.1);\n            color: var(--text-secondary);\n            padding: 0.4rem 0.75rem;\n            border-radius: 8px;\n            font-family: 'Outfit', sans-serif;\n            font-size: 0.85rem;\n            cursor: pointer;\n            outline: none;\n            transition: all 0.2s ease;\n        }\n\n        .language-select select:hover {\n            border-color: var(--accent-cyan);\n        }\n\n        .language-select select option {\n            background: var(--bg-secondary);\n            color: var(--text-primary);\n        }\n\n        @media (max-width: 480px) {\n            .container {\n                padding: 2rem 1.5rem;\n            }\n\n            h1 {\n                font-size: 1.4rem;\n            }\n\n            .server-card {\n                flex-direction: column;\n                gap: 0.75rem;\n                text-align: center;\n            }\n\n            #timer {\n                font-size: 2.5rem;\n            }\n        }\n    </style>\n</head>\n<body>\n    <div class=\"container\">\n        <div class=\"language-select\">\n            <select id=\"languageSelect\" onchange=\"changeLanguage()\">\n                <option value=\"en\">English</option>\n                <option value=\"zh\">中文</option>\n                <option value=\"es\">Español</option>\n            </select>\n        </div>\n\n        <div class=\"logo-title\">\n            <img src=\"https://raw.githubusercontent.com/OpenNHP/opennhp/main/docs/images/logo10.png\" alt=\"OpenNHP Logo\">\n            <h1 id=\"title\">OpenNHP AC Protected Server</h1>\n        </div>\n        <p class=\"subtitle\" id=\"subtitle\">Invisible to Unauthenticated Users</p>\n\n        <div class=\"server-links\">\n            <div class=\"server-card\">\n                <span class=\"server-url\">https://acdemo.opennhp.org</span>\n                <a href=\"https://dnschecker.org/port-scanner.php?query=acdemo.opennhp.org&ptype=server\" target=\"_blank\" class=\"scan-link scan-link-1\">\n                    <svg viewBox=\"0 0 24 24\"><path d=\"M11 7h2v2h-2zm0 4h2v6h-2zm1-9C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z\"/></svg>\n                    <span id=\"scanPorts1\">Scan Ports</span>\n                </a>\n            </div>\n            <div class=\"server-card\">\n                <span class=\"server-url\">https://demo.nhp</span>\n                <a href=\"https://dnschecker.org/port-scanner.php?query=demo.nhp&ptype=server\" target=\"_blank\" class=\"scan-link scan-link-2\">\n                    <svg viewBox=\"0 0 24 24\"><path d=\"M11 7h2v2h-2zm0 4h2v6h-2zm1-9C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z\"/></svg>\n                    <span id=\"scanPorts2\">Scan Ports</span>\n                </a>\n            </div>\n        </div>\n\n        <div class=\"countdown-section\" id=\"countdown\">\n            <div class=\"countdown-label\" id=\"countdownLabel\">Server will be hidden in</div>\n            <div class=\"countdown-timer\">\n                <span id=\"timer\">15</span>\n                <span class=\"countdown-unit\" id=\"countdownUnit\">seconds</span>\n            </div>\n        </div>\n\n        <div id=\"message\">\n            <div class=\"icon\">🔒</div>\n            <div class=\"text\" id=\"hiddenMessage\">Server is now hidden</div>\n        </div>\n\n        <div class=\"info-section\">\n            <div id=\"ip-display\">Detecting IP...</div>\n            \n            <label class=\"auto-refresh-toggle\" id=\"auto-refresh-section\">\n                <input type=\"checkbox\" id=\"auto-refresh\">\n                <span class=\"toggle-switch\"></span>\n                <span class=\"toggle-label\" id=\"autoRefreshLabel\">Auto Refresh (10s)</span>\n            </label>\n        </div>\n\n        <div class=\"footer\">\n            <p class=\"footer-text\" id=\"footerPowered\">Powered by <a href=\"https://github.com/OpenNHP/opennhp\" target=\"_blank\">OpenNHP</a> \n                - Network-infrastructure Hiding Protocol</p>\n            <p class=\"footer-text\" style=\"margin-top: 0.5rem;\" id=\"footerSponsored\">Sponsored by: <a href=\"https://layerv.ai\" target=\"_blank\">LayerV.ai</a></p>\n        </div>\n    </div>\n\n    <script>\n        // Translations\n        const translations = {\n            en: {\n                title: \"OpenNHP AC Protected Server\",\n                subtitle: \"Invisible to Unauthenticated Users\",\n                scanPorts: \"Scan Ports\",\n                countdownLabel: \"SERVER WILL BE HIDDEN IN\",\n                countdownUnit: \"seconds\",\n                hiddenMessage: \"Server is now hidden\",\n                autoRefreshLabel: \"Auto Refresh (10s)\",\n                footerPowered: 'Powered by <a href=\"https://github.com/OpenNHP/opennhp\" target=\"_blank\">OpenNHP</a> - Network-infrastructure Hiding Protocol',\n                footerSponsored: 'Sponsored by: <a href=\"https://layerv.ai\" target=\"_blank\">LayerV.ai</a>',\n                detectingIP: \"Detecting IP...\",\n                ipFailed: \"IP detection failed\"\n            },\n            zh: {\n                title: \"OpenNHP AC 受保护服务器\",\n                subtitle: \"对未认证用户不可见\",\n                scanPorts: \"扫描端口\",\n                countdownLabel: \"服务器将在以下时间后隐藏\",\n                countdownUnit: \"秒\",\n                hiddenMessage: \"服务器已隐藏\",\n                autoRefreshLabel: \"自动刷新 (10秒)\",\n                footerPowered: '由 <a href=\"https://github.com/OpenNHP/opennhp\" target=\"_blank\">OpenNHP</a> 提供支持 - 网络基础设施隐藏协议',\n                footerSponsored: '赞助商：<a href=\"https://layerv.ai\" target=\"_blank\">LayerV.ai</a>',\n                detectingIP: \"正在检测 IP...\",\n                ipFailed: \"IP 检测失败\"\n            },\n            es: {\n                title: \"Servidor Protegido OpenNHP AC\",\n                subtitle: \"Invisible para Usuarios No Autenticados\",\n                scanPorts: \"Escanear\",\n                countdownLabel: \"EL SERVIDOR SE OCULTARÁ EN\",\n                countdownUnit: \"segundos\",\n                hiddenMessage: \"El servidor está oculto\",\n                autoRefreshLabel: \"Auto Refrescar (10s)\",\n                footerPowered: 'Desarrollado por <a href=\"https://github.com/OpenNHP/opennhp\" target=\"_blank\">OpenNHP</a> - Protocolo de Ocultación de Infraestructura',\n                footerSponsored: 'Patrocinado por: <a href=\"https://layerv.ai\" target=\"_blank\">LayerV.ai</a>',\n                detectingIP: \"Detectando IP...\",\n                ipFailed: \"Detección de IP fallida\"\n            }\n        };\n\n        let currentLang = 'en';\n\n        function changeLanguage() {\n            const lang = document.getElementById('languageSelect').value;\n            currentLang = lang;\n            document.documentElement.lang = lang;\n            const t = translations[lang];\n\n            document.getElementById('title').textContent = t.title;\n            document.getElementById('subtitle').textContent = t.subtitle;\n            document.getElementById('scanPorts1').textContent = t.scanPorts;\n            document.getElementById('scanPorts2').textContent = t.scanPorts;\n            document.getElementById('countdownLabel').textContent = t.countdownLabel;\n            document.getElementById('countdownUnit').textContent = t.countdownUnit;\n            document.getElementById('hiddenMessage').textContent = t.hiddenMessage;\n            document.getElementById('autoRefreshLabel').textContent = t.autoRefreshLabel;\n            document.getElementById('footerPowered').innerHTML = t.footerPowered;\n            document.getElementById('footerSponsored').innerHTML = t.footerSponsored;\n        }\n\n        // Initialize countdown seconds\n        let seconds = 15;\n\n        // Get DOM elements\n        const timerElement = document.getElementById('timer');\n        const countdownElement = document.getElementById('countdown');\n        const messageElement = document.getElementById('message');\n        const autoRefreshSection = document.getElementById('auto-refresh-section');\n        const autoRefreshCheckbox = document.getElementById('auto-refresh');\n\n        // Update countdown every second\n        const countdownInterval = setInterval(() => {\n            seconds--;\n            timerElement.textContent = seconds;\n\n            if (seconds <= 0) {\n                clearInterval(countdownInterval);\n                // Hide countdown\n                countdownElement.style.display = 'none';\n                // Show hidden message\n                messageElement.style.display = 'block';\n                // Hide auto refresh checkbox\n                autoRefreshSection.style.display = 'none';\n            }\n        }, 1000);\n\n        // Auto refresh functionality\n        let autoRefreshInterval;\n\n        // Get autoRefreshState stored in cookie\n        function getCookie(name) {\n            const value = `; ${document.cookie}`;\n            const parts = value.split(`; ${name}=`);\n            if (parts.length === 2) return parts.pop().split(';').shift();\n        }\n\n        // Set cookie\n        function setCookie(name, value, days) {\n            const date = new Date();\n            date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));\n            document.cookie = `${name}=${value};expires=${date.toUTCString()};path=/`;\n        }\n\n        // Restore checkbox state from cookie\n        const savedAutoRefreshState = getCookie('autoRefreshState');\n        if (savedAutoRefreshState === 'true') {\n            autoRefreshCheckbox.checked = true;\n        } else {\n            autoRefreshCheckbox.checked = false;\n        }\n\n        // When checkbox state changes, start or stop auto refresh\n        autoRefreshCheckbox.addEventListener('change', () => {\n            if (autoRefreshCheckbox.checked) {\n                // Start auto refresh, refresh page every 10 seconds\n                autoRefreshInterval = setInterval(() => {\n                    location.reload();\n                }, 10000);\n            } else {\n                // Stop auto refresh\n                clearInterval(autoRefreshInterval);\n            }\n\n            // Save checkbox state to cookie (expires in 7 days)\n            setCookie('autoRefreshState', autoRefreshCheckbox.checked, 7);\n        });\n\n        // Check checkbox state on page load and trigger auto refresh\n        window.onload = () => {\n            // Detect user language\n            const userLang = navigator.language || navigator.userLanguage;\n            const lang = userLang.startsWith('es') ? 'es' : (userLang.startsWith('zh') ? 'zh' : 'en');\n            document.getElementById('languageSelect').value = lang;\n            changeLanguage();\n\n            if (autoRefreshCheckbox.checked) {\n                // If checkbox was previously checked, start auto refresh\n                autoRefreshInterval = setInterval(() => {\n                    location.reload();\n                }, 10000);\n            }\n\n            fetchIP();\n        };\n\n        async function fetchIP() {\n            const ipDisplay = document.getElementById('ip-display');\n            let ipv4 = null, ipv6 = null;\n\n            // Fetch IPv4\n            try {\n                const res = await fetch('https://api.ipify.org?format=json');\n                const data = await res.json();\n                ipv4 = data.ip;\n            } catch (e) { console.error(\"IPv4 fetch error:\", e); }\n\n            // Fetch IPv6\n            try {\n                const res = await fetch('https://api6.ipify.org?format=json');\n                const data = await res.json();\n                ipv6 = data.ip;\n            } catch (e) { console.error(\"IPv6 fetch error:\", e); }\n\n            // Display results\n            if (ipv4 && ipv6) {\n                ipDisplay.innerHTML = `IPv4: ${ipv4} | IPv6: ${ipv6}`;\n            } else if (ipv4) {\n                ipDisplay.textContent = `IPv4: ${ipv4}`;\n            } else if (ipv6) {\n                ipDisplay.textContent = `IPv6: ${ipv6}`;\n            } else {\n                ipDisplay.textContent = translations[currentLang].ipFailed;\n            }\n        }\n    </script>\n</body>\n</html>\n"
  },
  {
    "path": "examples/server_plugin/basic/templates/example_login.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>OpenNHP Demo - Authentication</title>\n    <link rel=\"preconnect\" href=\"https://fonts.googleapis.com\">\n    <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n    <link href=\"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600&family=Outfit:wght@300;400;600;700&display=swap\" rel=\"stylesheet\">\n    <style>\n        :root {\n            --bg-primary: #0a0e17;\n            --bg-secondary: #131a2b;\n            --bg-card: rgba(20, 30, 50, 0.85);\n            --accent-cyan: #00d4ff;\n            --accent-green: #00ff88;\n            --accent-orange: #ff6b35;\n            --accent-purple: #a855f7;\n            --accent-red: #ff4757;\n            --text-primary: #e8eef5;\n            --text-secondary: #8892a4;\n            --border-color: rgba(0, 212, 255, 0.2);\n        }\n\n        * {\n            margin: 0;\n            padding: 0;\n            box-sizing: border-box;\n        }\n\n        body {\n            font-family: 'Outfit', sans-serif;\n            min-height: 100vh;\n            display: flex;\n            justify-content: center;\n            align-items: center;\n            background: var(--bg-primary);\n            background-image:\n                radial-gradient(ellipse at 20% 20%, rgba(0, 212, 255, 0.08) 0%, transparent 50%),\n                radial-gradient(ellipse at 80% 80%, rgba(0, 255, 136, 0.06) 0%, transparent 50%),\n                linear-gradient(180deg, var(--bg-primary) 0%, var(--bg-secondary) 100%);\n            padding: 2rem;\n        }\n\n        .container {\n            max-width: 520px;\n            width: 100%;\n            background: var(--bg-card);\n            backdrop-filter: blur(20px);\n            border: 1px solid var(--border-color);\n            border-radius: 24px;\n            padding: 2rem;\n            box-shadow:\n                0 4px 60px rgba(0, 0, 0, 0.4),\n                0 0 0 1px rgba(255, 255, 255, 0.05) inset;\n            animation: fadeIn 0.6s ease-out;\n        }\n\n        @keyframes fadeIn {\n            from { opacity: 0; transform: translateY(20px); }\n            to { opacity: 1; transform: translateY(0); }\n        }\n\n        .language-select {\n            text-align: right;\n            margin-bottom: 1rem;\n        }\n\n        .language-select select {\n            background: rgba(255, 255, 255, 0.05);\n            border: 1px solid rgba(255, 255, 255, 0.1);\n            color: var(--text-secondary);\n            padding: 0.4rem 0.75rem;\n            border-radius: 8px;\n            font-family: 'Outfit', sans-serif;\n            font-size: 0.85rem;\n            cursor: pointer;\n            outline: none;\n            transition: all 0.2s ease;\n        }\n\n        .language-select select:hover {\n            border-color: var(--accent-cyan);\n        }\n\n        .language-select select option {\n            background: var(--bg-secondary);\n            color: var(--text-primary);\n        }\n\n        .logo-title {\n            display: flex;\n            align-items: center;\n            justify-content: center;\n            gap: 0.75rem;\n            margin-bottom: 0.5rem;\n        }\n\n        .logo-title img {\n            height: 42px;\n            width: 42px;\n        }\n\n        .logo-title h1 {\n            font-size: 1.4rem;\n            font-weight: 700;\n            color: var(--text-primary);\n            margin: 0;\n        }\n\n        .subtitle {\n            text-align: center;\n            font-size: 0.85rem;\n            color: var(--text-secondary);\n            margin-bottom: 1rem;\n        }\n\n        .server-info {\n            padding: 0.5rem 0;\n            margin-bottom: 1rem;\n            text-align: center;\n        }\n\n        .server-info-row {\n            display: flex;\n            flex-direction: column;\n            align-items: center;\n            gap: 0.5rem;\n        }\n\n        .server-url-part {\n            display: flex;\n            align-items: center;\n            justify-content: center;\n            gap: 0.5rem;\n            flex-wrap: wrap;\n        }\n\n        .server-url-part span {\n            color: var(--text-secondary);\n            font-size: 0.8rem;\n        }\n\n        .server-url-part a {\n            font-family: 'JetBrains Mono', monospace;\n            font-size: 0.75rem;\n            color: var(--accent-cyan);\n            text-decoration: none;\n        }\n\n        .server-url-part a:hover {\n            text-decoration: underline;\n        }\n\n        .scan-link {\n            font-size: 0.65rem;\n            font-family: 'Outfit', sans-serif !important;\n            color: var(--accent-green);\n            text-decoration: none;\n            padding: 0.15rem 0.4rem;\n            background: rgba(0, 255, 136, 0.1);\n            border-radius: 4px;\n        }\n\n        .scan-link:hover {\n            background: rgba(0, 255, 136, 0.2);\n        }\n\n        .status-part {\n            display: flex;\n            align-items: center;\n            justify-content: center;\n            gap: 1rem;\n            font-size: 0.75rem;\n        }\n\n        .status-item {\n            display: flex;\n            align-items: center;\n            gap: 0.3rem;\n        }\n\n        .status-label {\n            color: var(--text-secondary);\n        }\n\n        .status-value.timeout {\n            color: var(--accent-red);\n        }\n\n        .status-value.success {\n            color: var(--accent-green);\n        }\n\n        /* Auth Methods Section */\n        .auth-methods {\n            display: flex;\n            flex-direction: column;\n            gap: 0.6rem;\n        }\n\n        .auth-btn {\n            display: flex;\n            align-items: center;\n            gap: 0.6rem;\n            width: 100%;\n            padding: 0.7rem 1rem;\n            border-radius: 8px;\n            text-decoration: none;\n            font-family: 'Outfit', sans-serif;\n            cursor: pointer;\n            transition: all 0.2s ease;\n            border: none;\n        }\n\n        .auth-btn svg {\n            width: 18px;\n            height: 18px;\n            flex-shrink: 0;\n        }\n\n        .auth-btn-content {\n            display: flex;\n            align-items: center;\n            justify-content: space-between;\n            flex: 1;\n        }\n\n        .auth-btn-title {\n            font-size: 0.9rem;\n            font-weight: 600;\n        }\n\n        .auth-btn-desc {\n            font-size: 0.7rem;\n            font-weight: 400;\n            opacity: 0.5;\n        }\n\n        /* SSO & OTP - outline style */\n        .auth-btn.sso,\n        .auth-btn.otp {\n            background: transparent;\n            border: 1px solid rgba(255, 255, 255, 0.15);\n            color: var(--text-primary);\n        }\n\n        .auth-btn.sso:hover,\n        .auth-btn.otp:hover {\n            border-color: var(--accent-cyan);\n            background: rgba(0, 212, 255, 0.05);\n        }\n\n        .auth-btn.sso svg,\n        .auth-btn.otp svg {\n            fill: var(--accent-cyan);\n        }\n\n        /* Password Section (always visible) */\n        .password-section {\n            margin-bottom: 1rem;\n        }\n\n        .login-form {\n            display: flex;\n            flex-direction: column;\n            gap: 0.875rem;\n        }\n\n        .input-group {\n            display: flex;\n            align-items: center;\n            gap: 0.75rem;\n        }\n\n        .input-group label {\n            font-size: 0.85rem;\n            color: var(--text-secondary);\n            min-width: 70px;\n            text-align: right;\n        }\n\n        .input-group input {\n            flex: 1;\n            padding: 0.7rem 1rem;\n            background: rgba(255, 255, 255, 0.03);\n            border: 1px solid rgba(255, 255, 255, 0.1);\n            border-radius: 8px;\n            font-family: 'Outfit', sans-serif;\n            font-size: 0.9rem;\n            color: var(--text-primary);\n            outline: none;\n            transition: all 0.2s ease;\n        }\n\n        .input-group input:focus {\n            border-color: var(--accent-cyan);\n            box-shadow: 0 0 0 3px rgba(0, 212, 255, 0.1);\n        }\n\n        .login-btn {\n            width: 100%;\n            padding: 0.7rem;\n            background: linear-gradient(135deg, var(--accent-cyan), #0099cc);\n            border: none;\n            border-radius: 8px;\n            font-family: 'Outfit', sans-serif;\n            font-size: 0.9rem;\n            font-weight: 600;\n            color: var(--bg-primary);\n            cursor: pointer;\n            transition: all 0.2s ease;\n            margin-top: 0.25rem;\n        }\n\n        .login-btn:hover {\n            transform: translateY(-1px);\n            box-shadow: 0 4px 15px rgba(0, 212, 255, 0.3);\n        }\n\n        .login-btn:disabled {\n            opacity: 0.5;\n            cursor: not-allowed;\n            transform: none;\n            box-shadow: none;\n        }\n\n        /* Divider */\n        .divider {\n            display: flex;\n            align-items: center;\n            gap: 1rem;\n            margin: 1rem 0;\n        }\n\n        .divider::before,\n        .divider::after {\n            content: '';\n            flex: 1;\n            height: 1px;\n            background: rgba(255, 255, 255, 0.1);\n        }\n\n        .divider span {\n            font-size: 0.75rem;\n            color: var(--text-secondary);\n            text-transform: uppercase;\n            letter-spacing: 0.1em;\n        }\n\n        /* Success Message */\n        #message {\n            display: none;\n            text-align: center;\n        }\n\n        #message h2 {\n            font-size: 1.5rem;\n            color: var(--accent-green);\n            margin-bottom: 1rem;\n        }\n\n        #message .message-content {\n            margin-bottom: 1rem;\n        }\n\n        #message .message-content span {\n            color: var(--text-secondary);\n        }\n\n        #message .message-content a {\n            color: var(--accent-cyan);\n            font-family: 'JetBrains Mono', monospace;\n            font-size: 0.9rem;\n        }\n\n        .countdown-container {\n            display: flex;\n            align-items: center;\n            justify-content: center;\n            gap: 0.5rem;\n            margin-top: 1rem;\n        }\n\n        #welcomeMessage {\n            color: var(--text-secondary);\n        }\n\n        #countdown {\n            font-family: 'JetBrains Mono', monospace;\n            font-size: 2rem;\n            font-weight: 600;\n            color: var(--accent-orange);\n        }\n\n        #timeUnit {\n            color: var(--text-secondary);\n        }\n\n        /* Footer */\n        .ip-display {\n            text-align: center;\n            margin-top: 1.25rem;\n            padding-top: 0.75rem;\n            border-top: 1px solid rgba(255, 255, 255, 0.05);\n        }\n\n        #ip-display {\n            font-family: 'JetBrains Mono', monospace;\n            font-size: 0.7rem;\n            color: var(--text-secondary);\n            opacity: 0.7;\n        }\n\n        .footer {\n            text-align: center;\n            margin-top: 0.75rem;\n            padding-top: 0.75rem;\n            border-top: 1px solid rgba(255, 255, 255, 0.05);\n        }\n\n        .footer p {\n            font-size: 0.7rem;\n            color: var(--text-secondary);\n            margin: 0.2rem 0;\n        }\n\n        .footer a {\n            color: var(--accent-cyan);\n            text-decoration: none;\n        }\n\n        .footer a:hover {\n            text-decoration: underline;\n        }\n\n        /* Responsive */\n        @media (max-width: 520px) {\n            .container {\n                padding: 1.5rem;\n            }\n\n            .logo-title h1 {\n                font-size: 1.2rem;\n            }\n\n            .server-info-row {\n                gap: 0.5rem;\n            }\n\n            .input-group {\n                flex-direction: column;\n                align-items: stretch;\n                gap: 0.3rem;\n            }\n\n            .input-group label {\n                text-align: left;\n                min-width: auto;\n            }\n        }\n    </style>\n</head>\n<body>\n    <div class=\"container\" id=\"mainContainer\">\n        <div class=\"language-select\" id=\"languageSelectContainer\">\n            <select id=\"languageSelect\" onchange=\"changeLanguage()\">\n                <option value=\"en\">English</option>\n                <option value=\"zh\">中文</option>\n                <option value=\"es\">Español</option>\n            </select>\n        </div>\n\n        <div class=\"logo-title\">\n            <img src=\"https://raw.githubusercontent.com/OpenNHP/opennhp/main/docs/images/logo10.png\" alt=\"OpenNHP Logo\">\n            <h1 id=\"title\">OpenNHP Demo</h1>\n        </div>\n        \n        <div class=\"server-info\" id=\"serverInfoBox\">\n            <div class=\"server-info-row\">\n                <div class=\"server-url-part\">\n                    <span id=\"protectedServerLabel\">Protected Server:</span>\n                    <a href=\"https://acdemo.opennhp.org\" target=\"_blank\">https://acdemo.opennhp.org</a>\n                    <a href=\"https://www.shodan.io/host/47.76.140.98\" target=\"_blank\" class=\"scan-link\" id=\"scanPortsLink\">Scan Ports</a>\n                </div>\n                <div class=\"status-part\">\n                    <div class=\"status-item\">\n                        <span class=\"status-label\" id=\"beforeLogin\">Before:</span>\n                        <span class=\"status-value timeout\" id=\"timeoutStatus\">Invisible</span>\n                    </div>\n                    <div class=\"status-item\">\n                        <span class=\"status-label\" id=\"afterLogin\">After:</span>\n                        <span class=\"status-value success\" id=\"successStatus\">Accessible</span>\n                    </div>\n                </div>\n            </div>\n        </div>\n\n        <!-- Password Login Section -->\n        <div class=\"password-section\" id=\"passwordSection\">\n            <form id=\"loginForm\" class=\"login-form\" onsubmit=\"return nhpValidate()\">\n                <div class=\"input-group\">\n                    <label for=\"username\" id=\"usernameLabel\">Username</label>\n                    <input type=\"text\" id=\"username\" name=\"username\" value=\"user\" autocomplete=\"username\">\n                </div>\n                <div class=\"input-group\">\n                    <label for=\"password\" id=\"passwordLabel\">Password</label>\n                    <input type=\"password\" id=\"password\" name=\"password\" value=\"password\" autocomplete=\"current-password\">\n                </div>\n                <button type=\"submit\" class=\"login-btn\" id=\"loginButton\">Sign In</button>\n            </form>\n        </div>\n\n        <!-- Divider -->\n        <div class=\"divider\">\n            <span id=\"orText\">OR</span>\n        </div>\n\n        <!-- Alternative Auth Methods -->\n        <div class=\"auth-methods\" id=\"authMethods\">\n            <a href=\"https://nhp.opennhp.org/plugins/oidc?resid=demo&action=login\" class=\"auth-btn sso\">\n                <svg viewBox=\"0 0 24 24\"><path d=\"M12 1L3 5v6c0 5.55 3.84 10.74 9 12 5.16-1.26 9-6.45 9-12V5l-9-4zm0 10.99h7c-.53 4.12-3.28 7.79-7 8.94V12H5V6.3l7-3.11v8.8z\"/></svg>\n                <div class=\"auth-btn-content\">\n                    <span class=\"auth-btn-title\" id=\"ssoBtn\">Single Sign-On</span>\n                    <span class=\"auth-btn-desc\" id=\"ssoDesc\">OpenID Connect</span>\n                </div>\n            </a>\n            <a href=\"https://otplogin.opennhp.org/\" class=\"auth-btn otp\">\n                <svg viewBox=\"0 0 24 24\"><path d=\"M17 1H7c-1.1 0-2 .9-2 2v18c0 1.1.9 2 2 2h10c1.1 0 2-.9 2-2V3c0-1.1-.9-2-2-2zm0 18H7V5h10v14zm-5-1c.55 0 1-.45 1-1s-.45-1-1-1-1 .45-1 1 .45 1 1 1zm-3-4h6v-2H9v2zm0-4h6V8H9v2z\"/></svg>\n                <div class=\"auth-btn-content\">\n                    <span class=\"auth-btn-title\" id=\"otpBtn\">One-Time Password</span>\n                    <span class=\"auth-btn-desc\" id=\"otpDesc\">Authenticator App</span>\n                </div>\n            </a>\n        </div>\n\n        <!-- Success Message -->\n        <div id=\"message\">\n            <h2 id=\"authSuccessMessage\"></h2>\n            <div class=\"message-content\">\n                <span id=\"redirectMessage\"></span>\n                <a href=\"\" id=\"redirectUrl\"></a>\n            </div>\n            <div class=\"countdown-container\">\n                <span id=\"welcomeMessage\"></span>\n                <span id=\"countdown\">5</span>\n                <span id=\"timeUnit\"></span>\n            </div>\n        </div>\n\n        <div class=\"ip-display\">\n            <span id=\"ip-display\">Detecting IP...</span>\n        </div>\n\n        <div class=\"footer\">\n            <p>Powered by <a href=\"https://github.com/OpenNHP/opennhp\" target=\"_blank\">OpenNHP</a> - Network-infrastructure Hiding Protocol</p>\n            <p>Sponsored by: <a href=\"https://layerv.ai\" target=\"_blank\">LayerV.ai</a></p>\n        </div>\n    </div>\n\n    <script>\n        const translations = {\n            en: {\n                title: \"OpenNHP Demo\",\n                subtitle: \"Zero Trust Network Access\",\n                protectedServer: \"Protected Server:\",\n                scanPorts: \"Scan Ports\",\n                beforeLogin: \"Before login:\",\n                afterLogin: \"After login:\",\n                timeoutStatus: \"Invisible\",\n                successStatus: \"Accessible\",\n                usernameLabel: \"Username\",\n                passwordLabel: \"Password\",\n                loginButton: \"Sign In\",\n                orText: \"Or\",\n                ssoBtn: \"Single Sign-On\",\n                ssoDesc: \"OpenID Connect\",\n                otpBtn: \"One-Time Password\",\n                otpDesc: \"Authenticator App\",\n                authSuccess: \"Authentication Succeeded!\",\n                redirectMessage: \"You can now access\",\n                timeUnit: \"seconds\",\n                welcomeMessage: \"Redirecting in\"\n            },\n            zh: {\n                title: \"OpenNHP 演示\",\n                subtitle: \"零信任网络访问\",\n                protectedServer: \"受保护服务器：\",\n                scanPorts: \"端口扫描\",\n                beforeLogin: \"登录前：\",\n                afterLogin: \"登录后：\",\n                timeoutStatus: \"不可见\",\n                successStatus: \"可访问\",\n                usernameLabel: \"用户名\",\n                passwordLabel: \"密码\",\n                loginButton: \"登录\",\n                orText: \"或\",\n                ssoBtn: \"单点登录\",\n                ssoDesc: \"OpenID Connect\",\n                otpBtn: \"动态密码\",\n                otpDesc: \"Authenticator App\",\n                authSuccess: \"认证成功！\",\n                redirectMessage: \"您现在可以访问\",\n                timeUnit: \"秒后跳转\",\n                welcomeMessage: \"\"\n            },\n            es: {\n                title: \"OpenNHP Demo\",\n                subtitle: \"Acceso de Red Zero Trust\",\n                protectedServer: \"Servidor Protegido:\",\n                scanPorts: \"Escanear Puertos\",\n                beforeLogin: \"Antes:\",\n                afterLogin: \"Después:\",\n                timeoutStatus: \"Invisible\",\n                successStatus: \"Accesible\",\n                usernameLabel: \"Usuario\",\n                passwordLabel: \"Contraseña\",\n                loginButton: \"Iniciar Sesión\",\n                orText: \"O\",\n                ssoBtn: \"Inicio de Sesión Único\",\n                ssoDesc: \"OpenID Connect\",\n                otpBtn: \"Contraseña de Un Solo Uso\",\n                otpDesc: \"Authenticator App\",\n                authSuccess: \"¡Autenticación Exitosa!\",\n                redirectMessage: \"Ahora puedes acceder a\",\n                timeUnit: \"segundos\",\n                welcomeMessage: \"Redirigiendo en\"\n            }\n        };\n\n        function changeLanguage() {\n            const lang = document.getElementById('languageSelect').value;\n            document.documentElement.lang = lang;\n            const t = translations[lang];\n\n            document.getElementById('title').textContent = t.title;\n            document.getElementById('protectedServerLabel').textContent = t.protectedServer;\n            document.getElementById('scanPortsLink').textContent = t.scanPorts;\n            document.getElementById('beforeLogin').textContent = t.beforeLogin;\n            document.getElementById('afterLogin').textContent = t.afterLogin;\n            document.getElementById('timeoutStatus').textContent = t.timeoutStatus;\n            document.getElementById('successStatus').textContent = t.successStatus;\n            document.getElementById('usernameLabel').textContent = t.usernameLabel;\n            document.getElementById('passwordLabel').textContent = t.passwordLabel;\n            document.getElementById('loginButton').textContent = t.loginButton;\n            document.getElementById('orText').textContent = t.orText;\n            document.getElementById('ssoBtn').textContent = t.ssoBtn;\n            document.getElementById('ssoDesc').textContent = t.ssoDesc;\n            document.getElementById('otpBtn').textContent = t.otpBtn;\n            document.getElementById('otpDesc').textContent = t.otpDesc;\n        }\n\n        function nhpValidate() {\n            const user = document.getElementById(\"username\").value;\n            const password = document.getElementById(\"password\").value;\n            const nhpValidUrl = \"https://nhp.opennhp.org/plugins/example?resid=demo&action=valid\" +\n                \"&username=\" + encodeURIComponent(user) +\n                \"&password=\" + encodeURIComponent(password);\n\n            const loginBtn = document.getElementById('loginButton');\n            const originalText = loginBtn.textContent;\n            loginBtn.textContent = '...';\n            loginBtn.disabled = true;\n\n            fetch(nhpValidUrl)\n                .then(response => response.json())\n                .then(result => {\n                    const lang = document.getElementById('languageSelect').value;\n                    const t = translations[lang];\n                    const messageElement = document.getElementById(\"message\");\n\n                    if (result && result.redirectUrl) {\n                        // Hide all login UI\n                        document.getElementById('languageSelectContainer').style.display = 'none';\n                        document.getElementById('serverInfoBox').style.display = 'none';\n                        document.getElementById('passwordSection').style.display = 'none';\n                        document.querySelector('.divider').style.display = 'none';\n                        document.getElementById('authMethods').style.display = 'none';\n\n                        // Show success message\n                        document.getElementById('redirectUrl').href = result.redirectUrl;\n                        document.getElementById('redirectUrl').textContent = result.redirectUrl;\n                        document.getElementById('authSuccessMessage').textContent = t.authSuccess;\n                        document.getElementById('welcomeMessage').textContent = t.welcomeMessage;\n                        document.getElementById('redirectMessage').textContent = t.redirectMessage + ' ';\n                        document.getElementById('timeUnit').textContent = ' ' + t.timeUnit;\n                        messageElement.style.display = 'block';\n\n                        let countdown = 5;\n                        const countdownElement = document.getElementById('countdown');\n                        const intervalId = setInterval(() => {\n                            countdown -= 1;\n                            if (countdown <= 0) {\n                                clearInterval(intervalId);\n                                window.location.href = result.redirectUrl;\n                            } else {\n                                countdownElement.textContent = countdown;\n                            }\n                        }, 1000);\n                    } else {\n                        loginBtn.textContent = originalText;\n                        loginBtn.disabled = false;\n                        alert(result.errMsg || \"Invalid username or password\");\n                    }\n                })\n                .catch(error => {\n                    loginBtn.textContent = originalText;\n                    loginBtn.disabled = false;\n                    alert(error.message);\n                });\n            return false;\n        }\n\n        document.addEventListener('DOMContentLoaded', () => {\n            const userLang = navigator.language || navigator.userLanguage;\n            const lang = userLang.startsWith('es') ? 'es' : (userLang.startsWith('zh') ? 'zh' : 'en');\n            document.getElementById('languageSelect').value = lang;\n            changeLanguage();\n            fetchIP();\n        });\n\n        async function fetchIP() {\n            const ipDisplay = document.getElementById('ip-display');\n            let ipv4 = null, ipv6 = null;\n\n            try {\n                const res = await fetch('https://api.ipify.org?format=json');\n                const data = await res.json();\n                ipv4 = data.ip;\n            } catch (e) { console.error(\"IPv4 fetch error:\", e); }\n\n            try {\n                const res = await fetch('https://api6.ipify.org?format=json');\n                const data = await res.json();\n                ipv6 = data.ip;\n            } catch (e) { console.error(\"IPv6 fetch error:\", e); }\n\n            if (ipv4 && ipv6) {\n                ipDisplay.innerHTML = `IPv4: ${ipv4} | IPv6: ${ipv6}`;\n            } else if (ipv4) {\n                ipDisplay.textContent = `IPv4: ${ipv4}`;\n            } else if (ipv6) {\n                ipDisplay.textContent = `IPv6: ${ipv6}`;\n            } else {\n                ipDisplay.textContent = \"IP detection failed\";\n            }\n        }\n    </script>\n</body>\n</html>\n"
  },
  {
    "path": "examples/server_plugin/oidc/Makefile",
    "content": "export GO111MODULE := on\n\nall: build\n\nPluginName = oidc\nTargetName = ${PluginName}.so\nServerDir = ../../../release/nhp-server\nLD_FLAGS = \"-s -w\"\n\n# Color definition\nCOLOUR_GREEN=\\033[0;32m\nCOLOUR_RED=\\033[0;31m\nCOLOUR_BLUE=\\033[0;34m\nEND_COLOUR=\\033[0m\n\nbuild:\n\t@echo \"$(COLOUR_BLUE)[Plugin-${PluginName}] Start building... $(END_COLOUR)\"\n\tgo build -buildmode=plugin -trimpath -ldflags ${LD_FLAGS} -v -o ${ServerDir}/plugins/${PluginName}/${TargetName} ./main.go ./auth.go\n\tmkdir -p ${ServerDir}/plugins/${PluginName}/etc\n\tcp ./etc/*.toml ${ServerDir}/plugins/${PluginName}/etc/\n\tmkdir -p ${ServerDir}/templates/${PluginName}\n\tcp ./templates/*.* ${ServerDir}/templates/${PluginName}\n\t@echo \"$(COLOUR_GREEN)[Plugin-${PluginName}] Successfully built!$(END_COLOUR)\"\n.PHONY: all build"
  },
  {
    "path": "examples/server_plugin/oidc/auth.go",
    "content": "package main\r\n\r\nimport (\r\n\t\"context\"\r\n\t\"crypto/rand\"\r\n\t\"encoding/base64\"\r\n\t\"errors\"\r\n\t\"net/http\"\r\n\r\n\t\"github.com/coreos/go-oidc/v3/oidc\"\r\n\t\"github.com/gin-gonic/gin\"\r\n\t\"golang.org/x/oauth2\"\r\n)\r\n\r\n// Authenticator is used to authenticate our users.\r\ntype Authenticator struct {\r\n\t*oidc.Provider\r\n\toauth2.Config\r\n}\r\n\r\n// New instantiates the *Authenticator.\r\nfunc NewAuthenticator(conf config) (*Authenticator, error) {\r\n\tprovider, err := oidc.NewProvider(\r\n\t\tcontext.Background(),\r\n\t\t\"https://\"+conf.AUTH0_DOMAIN+\"/\",\r\n\t)\r\n\tif err != nil {\r\n\t\treturn nil, err\r\n\t}\r\n\r\n\toauth2Conf := oauth2.Config{\r\n\t\tClientID:     conf.AUTH0_CLIENT_ID,\r\n\t\tClientSecret: conf.AUTH0_CLIENT_SECRET,\r\n\t\tRedirectURL:  conf.AUTH0_CALLBACK_URL,\r\n\t\tEndpoint:     provider.Endpoint(),\r\n\t\tScopes:       []string{oidc.ScopeOpenID, \"profile\"},\r\n\t}\r\n\r\n\treturn &Authenticator{\r\n\t\tProvider: provider,\r\n\t\tConfig:   oauth2Conf,\r\n\t}, nil\r\n}\r\n\r\n// VerifyIDToken verifies that an *oauth2.Token is a valid *oidc.IDToken.\r\nfunc (a *Authenticator) VerifyIDToken(ctx context.Context, token *oauth2.Token) (*oidc.IDToken, error) {\r\n\trawIDToken, ok := token.Extra(\"id_token\").(string)\r\n\tif !ok {\r\n\t\treturn nil, errors.New(\"no id_token field in oauth2 token\")\r\n\t}\r\n\r\n\toidcConfig := &oidc.Config{\r\n\t\tClientID: a.ClientID,\r\n\t}\r\n\r\n\treturn a.Verifier(oidcConfig).Verify(ctx, rawIDToken)\r\n}\r\n\r\nfunc (a *Authenticator) DoAuth(ctx *gin.Context) error {\r\n\tstate, err := generateRandomState()\r\n\tif err != nil {\r\n\t\treturn err\r\n\t}\r\n\r\n\t// Save the state inside the session using helper functions\r\n\tsessionSet(ctx, \"state\", state)\r\n\tif err := sessionSave(ctx); err != nil {\r\n\t\treturn err\r\n\t}\r\n\r\n\tctx.Redirect(http.StatusTemporaryRedirect, a.AuthCodeURL(state))\r\n\treturn nil\r\n}\r\n\r\nfunc generateRandomState() (string, error) {\r\n\tb := make([]byte, 32)\r\n\t_, err := rand.Read(b)\r\n\tif err != nil {\r\n\t\treturn \"\", err\r\n\t}\r\n\r\n\tstate := base64.StdEncoding.EncodeToString(b)\r\n\r\n\treturn state, nil\r\n}\r\n"
  },
  {
    "path": "examples/server_plugin/oidc/etc/config.toml",
    "content": "AUTH0_DOMAIN = \"dev-y6ay708guvsacsaq.ca.auth0.com\"\r\nAUTH0_CLIENT_ID = \"__AUTH0_CLIENT_ID__\"\r\nAUTH0_CLIENT_SECRET = \"__AUTH0_CLIENT_SECRET__\"\r\nAUTH0_CALLBACK_URL = \"https://nhp.opennhp.org/plugins/oidc?resid=demo&action=valid\""
  },
  {
    "path": "examples/server_plugin/oidc/etc/resource.toml",
    "content": "# List resources id and their sub-fields here\r\n\r\n# syntax [\"{ResourceId}\"]\r\n# ResourceId: id for the resource group. Each AuthServiceId can have multiple ResourceIds.\r\n# SkipAuth: true: auth by matching the AuthServiceId and ResourceId, skip using plugin logic.\r\n# OpenTime: seconds for traffic passing duration after successful knock.\r\n# RedirectUrl: a customized url send back with the http response message as an option for redirection. (only applicable for http agent)\r\n# RedirectWithParams: whether or not to include queries in the original http request. (only applicable for http agent)\r\n[\"demo\"]\r\nSkipAuth = true\r\nOpenTime = 15\r\nRedirectUrl = \"https://acdemo.opennhp.org\"\r\nRedirectWithParams = false\r\nCookieDomain = \"opennhp.org\"\r\n\r\n# syntax [\"{ResourceId}\".Resources.\"{ResourceName}\"]\r\n# ResourceName: name of resource inside a resource group. Each ResourceId can have multiple ResourceNames.\r\n# ACId: id of the NHP-AC that guards the resource.\r\n# Hostname: domain for the resource.\r\n# Addr.Ip: destination ip address of the resource.\r\n# Addr.Port: destination port of the resource.\r\n# Addr.Protocol: whether to pass a specific protocol among \"tcp\", \"udp\", \"any\". \"any\" also includes ping traffic.\r\n# PortSuffix: true: fill ack field \"resHost\" with \"{Hostname}:{Port}\", false: fill ack field \"resHost\" with just \"{Hostname}\"\r\n[\"demo\".Resources.\"demoServer\"]\r\nACId = \"testAC-1\"\r\nHostname = \"acdemo.opennhp.org\"\r\nAddr.Ip = \"220.191.216.236\"\r\nAddr.Port = 443 # empty or 0 for all ports\r\nAddr.Protocol = \"\" # \"tcp/udp/any\", empty for \"any\"\r\nPortSuffix = false\r\n\r\n# extra information as per-plugin defined fields\r\n[\"demo\".ExInfo]\r\nTitle = \"OpenNHP Demo Login\"\r\n"
  },
  {
    "path": "examples/server_plugin/oidc/go.mod",
    "content": "module github.com/OpenNHP/opennhp/examples/server_plugin/oidc\n\ngo 1.25.6\n\nrequire (\n\tgithub.com/OpenNHP/opennhp/nhp v0.6.0\n\tgithub.com/coreos/go-oidc/v3 v3.17.0\n\tgithub.com/gin-gonic/gin v1.12.0\n\tgithub.com/pelletier/go-toml/v2 v2.2.4\n\tgolang.org/x/oauth2 v0.34.0\n)\n\nrequire (\n\tgithub.com/bytedance/gopkg v0.1.3 // indirect\n\tgithub.com/bytedance/sonic v1.15.0 // indirect\n\tgithub.com/bytedance/sonic/loader v0.5.0 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.3.0 // indirect\n\tgithub.com/cloudwego/base64x v0.1.6 // indirect\n\tgithub.com/coocood/freecache v1.2.5 // indirect\n\tgithub.com/fsnotify/fsnotify v1.9.0 // indirect\n\tgithub.com/gabriel-vasile/mimetype v1.4.12 // indirect\n\tgithub.com/gin-contrib/sse v1.1.0 // indirect\n\tgithub.com/go-jose/go-jose/v4 v4.1.3 // indirect\n\tgithub.com/go-playground/locales v0.14.1 // indirect\n\tgithub.com/go-playground/universal-translator v0.18.1 // indirect\n\tgithub.com/go-playground/validator/v10 v10.30.1 // indirect\n\tgithub.com/goccy/go-json v0.10.5 // indirect\n\tgithub.com/goccy/go-yaml v1.19.2 // indirect\n\tgithub.com/google/uuid v1.6.0 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.3.0 // indirect\n\tgithub.com/leodido/go-urn v1.4.0 // indirect\n\tgithub.com/mattn/go-isatty v0.0.20 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect\n\tgithub.com/quic-go/qpack v0.6.0 // indirect\n\tgithub.com/quic-go/quic-go v0.59.0 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgithub.com/ugorji/go/codec v1.3.1 // indirect\n\tgo.mongodb.org/mongo-driver/v2 v2.5.0 // indirect\n\tgolang.org/x/arch v0.23.0 // indirect\n\tgolang.org/x/crypto v0.48.0 // indirect\n\tgolang.org/x/net v0.51.0 // indirect\n\tgolang.org/x/sys v0.42.0 // indirect\n\tgolang.org/x/text v0.34.0 // indirect\n\tgoogle.golang.org/protobuf v1.36.11 // indirect\n)\n\nreplace github.com/OpenNHP/opennhp/nhp v0.6.0 => ../../../nhp\n"
  },
  {
    "path": "examples/server_plugin/oidc/go.sum",
    "content": "github.com/bytedance/gopkg v0.1.3 h1:TPBSwH8RsouGCBcMBktLt1AymVo2TVsBVCY4b6TnZ/M=\ngithub.com/bytedance/gopkg v0.1.3/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/sonic v1.15.0 h1:/PXeWFaR5ElNcVE84U0dOHjiMHQOwNIx3K4ymzh/uSE=\ngithub.com/bytedance/sonic v1.15.0/go.mod h1:tFkWrPz0/CUCLEF4ri4UkHekCIcdnkqXw9VduqpJh0k=\ngithub.com/bytedance/sonic/loader v0.5.0 h1:gXH3KVnatgY7loH5/TkeVyXPfESoqSBSBEiDd5VjlgE=\ngithub.com/bytedance/sonic/loader v0.5.0/go.mod h1:AR4NYCk5DdzZizZ5djGqQ92eEhCCcdf5x77udYiSJRo=\ngithub.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=\ngithub.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cloudwego/base64x v0.1.6 h1:t11wG9AECkCDk5fMSoxmufanudBtJ+/HemLstXDLI2M=\ngithub.com/cloudwego/base64x v0.1.6/go.mod h1:OFcloc187FXDaYHvrNIjxSe8ncn0OOM8gEHfghB2IPU=\ngithub.com/coocood/freecache v1.2.5 h1:FmhRQ8cLLVq9zWhHVYODUEZ0xu6rTPrVeAnX1AEIf7I=\ngithub.com/coocood/freecache v1.2.5/go.mod h1:RBUWa/Cy+OHdfTGFEhEuE1pMCMX51Ncizj7rthiQ3vk=\ngithub.com/coreos/go-oidc/v3 v3.17.0 h1:hWBGaQfbi0iVviX4ibC7bk8OKT5qNr4klBaCHVNvehc=\ngithub.com/coreos/go-oidc/v3 v3.17.0/go.mod h1:wqPbKFrVnE90vty060SB40FCJ8fTHTxSwyXJqZH+sI8=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k=\ngithub.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0=\ngithub.com/gabriel-vasile/mimetype v1.4.12 h1:e9hWvmLYvtp846tLHam2o++qitpguFiYCKbn0w9jyqw=\ngithub.com/gabriel-vasile/mimetype v1.4.12/go.mod h1:d+9Oxyo1wTzWdyVUPMmXFvp4F9tea18J8ufA774AB3s=\ngithub.com/gin-contrib/sse v1.1.0 h1:n0w2GMuUpWDVp7qSpvze6fAu9iRxJY4Hmj6AmBOU05w=\ngithub.com/gin-contrib/sse v1.1.0/go.mod h1:hxRZ5gVpWMT7Z0B0gSNYqqsSCNIJMjzvm6fqCz9vjwM=\ngithub.com/gin-gonic/gin v1.12.0 h1:b3YAbrZtnf8N//yjKeU2+MQsh2mY5htkZidOM7O0wG8=\ngithub.com/gin-gonic/gin v1.12.0/go.mod h1:VxccKfsSllpKshkBWgVgRniFFAzFb9csfngsqANjnLc=\ngithub.com/go-jose/go-jose/v4 v4.1.3 h1:CVLmWDhDVRa6Mi/IgCgaopNosCaHz7zrMeF9MlZRkrs=\ngithub.com/go-jose/go-jose/v4 v4.1.3/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08=\ngithub.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=\ngithub.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=\ngithub.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA=\ngithub.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=\ngithub.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=\ngithub.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=\ngithub.com/go-playground/validator/v10 v10.30.1 h1:f3zDSN/zOma+w6+1Wswgd9fLkdwy06ntQJp0BBvFG0w=\ngithub.com/go-playground/validator/v10 v10.30.1/go.mod h1:oSuBIQzuJxL//3MelwSLD5hc2Tu889bF0Idm9Dg26cM=\ngithub.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4=\ngithub.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M=\ngithub.com/goccy/go-yaml v1.19.2 h1:PmFC1S6h8ljIz6gMRBopkjP1TVT7xuwrButHID66PoM=\ngithub.com/goccy/go-yaml v1.19.2/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA=\ngithub.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=\ngithub.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=\ngithub.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzhA9Y=\ngithub.com/klauspost/cpuid/v2 v2.3.0/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0=\ngithub.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ=\ngithub.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI=\ngithub.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=\ngithub.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8=\ngithub.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4=\ngithub.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/quic-go/qpack v0.6.0 h1:g7W+BMYynC1LbYLSqRt8PBg5Tgwxn214ZZR34VIOjz8=\ngithub.com/quic-go/qpack v0.6.0/go.mod h1:lUpLKChi8njB4ty2bFLX2x4gzDqXwUpaO1DP9qMDZII=\ngithub.com/quic-go/quic-go v0.59.0 h1:OLJkp1Mlm/aS7dpKgTc6cnpynnD2Xg7C1pwL6vy/SAw=\ngithub.com/quic-go/quic-go v0.59.0/go.mod h1:upnsH4Ju1YkqpLXC305eW3yDZ4NfnNbmQRCMWS58IKU=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=\ngithub.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/ugorji/go/codec v1.3.1 h1:waO7eEiFDwidsBN6agj1vJQ4AG7lh2yqXyOXqhgQuyY=\ngithub.com/ugorji/go/codec v1.3.1/go.mod h1:pRBVtBSKl77K30Bv8R2P+cLSGaTtex6fsA2Wjqmfxj4=\ngo.mongodb.org/mongo-driver/v2 v2.5.0 h1:yXUhImUjjAInNcpTcAlPHiT7bIXhshCTL3jVBkF3xaE=\ngo.mongodb.org/mongo-driver/v2 v2.5.0/go.mod h1:yOI9kBsufol30iFsl1slpdq1I0eHPzybRWdyYUs8K/0=\ngo.uber.org/mock v0.6.0 h1:hyF9dfmbgIX5EfOdasqLsWD6xqpNZlXblLB/Dbnwv3Y=\ngo.uber.org/mock v0.6.0/go.mod h1:KiVJ4BqZJaMj4svdfmHM0AUx4NJYO8ZNpPnZn1Z+BBU=\ngolang.org/x/arch v0.23.0 h1:lKF64A2jF6Zd8L0knGltUnegD62JMFBiCPBmQpToHhg=\ngolang.org/x/arch v0.23.0/go.mod h1:dNHoOeKiyja7GTvF9NJS1l3Z2yntpQNzgrjh1cU103A=\ngolang.org/x/crypto v0.48.0 h1:/VRzVqiRSggnhY7gNRxPauEQ5Drw9haKdM0jqfcCFts=\ngolang.org/x/crypto v0.48.0/go.mod h1:r0kV5h3qnFPlQnBSrULhlsRfryS2pmewsg+XfMgkVos=\ngolang.org/x/net v0.51.0 h1:94R/GTO7mt3/4wIKpcR5gkGmRLOuE/2hNGeWq/GBIFo=\ngolang.org/x/net v0.51.0/go.mod h1:aamm+2QF5ogm02fjy5Bb7CQ0WMt1/WVM7FtyaTLlA9Y=\ngolang.org/x/oauth2 v0.34.0 h1:hqK/t4AKgbqWkdkcAeI8XLmbK+4m4G5YeQRrmiotGlw=\ngolang.org/x/oauth2 v0.34.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.42.0 h1:omrd2nAlyT5ESRdCLYdm3+fMfNFE/+Rf4bDIQImRJeo=\ngolang.org/x/sys v0.42.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=\ngolang.org/x/text v0.34.0 h1:oL/Qq0Kdaqxa1KbNeMKwQq0reLCCaFtqu2eNuSeNHbk=\ngolang.org/x/text v0.34.0/go.mod h1:homfLqTYRFyVYemLBFl5GgL/DWEiH5wcsQ5gSh1yziA=\ngoogle.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE=\ngoogle.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\n"
  },
  {
    "path": "examples/server_plugin/oidc/main.go",
    "content": "package main\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"sync\"\n\n\t\"github.com/gin-gonic/gin\"\n\ttoml \"github.com/pelletier/go-toml/v2\"\n\t\"golang.org/x/oauth2\"\n\n\t\"github.com/OpenNHP/opennhp/nhp/common\"\n\tnhplog \"github.com/OpenNHP/opennhp/nhp/log\"\n\t\"github.com/OpenNHP/opennhp/nhp/plugins\"\n\t\"github.com/OpenNHP/opennhp/nhp/utils\"\n)\n\n// helperContextKey is the context key for storing HttpServerPluginHelper\nconst helperContextKey = \"oidc_plugin_helper\"\n\n// getHelper retrieves the HttpServerPluginHelper from the gin context\nfunc getHelper(ctx *gin.Context) *plugins.HttpServerPluginHelper {\n\tif h, exists := ctx.Get(helperContextKey); exists {\n\t\tif helper, ok := h.(*plugins.HttpServerPluginHelper); ok {\n\t\t\treturn helper\n\t\t}\n\t}\n\treturn nil\n}\n\n// setHelper stores the HttpServerPluginHelper in the gin context\nfunc setHelper(ctx *gin.Context, helper *plugins.HttpServerPluginHelper) {\n\tctx.Set(helperContextKey, helper)\n}\n\n// Session helper functions that use the helper from gin context (thread-safe)\nfunc sessionGet(ctx *gin.Context, key string) interface{} {\n\thelper := getHelper(ctx)\n\tif helper == nil {\n\t\tlog.Error(\"sessionGet: helper not found in context - plugin initialization error\")\n\t\treturn nil\n\t}\n\tif helper.SessionGet == nil {\n\t\tlog.Error(\"sessionGet: SessionGet function not provided - plugin initialization error\")\n\t\treturn nil\n\t}\n\treturn helper.SessionGet(ctx, key)\n}\n\nfunc sessionSet(ctx *gin.Context, key string, val interface{}) {\n\thelper := getHelper(ctx)\n\tif helper == nil {\n\t\tlog.Error(\"sessionSet: helper not found in context - plugin initialization error\")\n\t\treturn\n\t}\n\tif helper.SessionSet == nil {\n\t\tlog.Error(\"sessionSet: SessionSet function not provided - plugin initialization error\")\n\t\treturn\n\t}\n\thelper.SessionSet(ctx, key, val)\n}\n\nfunc sessionSave(ctx *gin.Context) error {\n\thelper := getHelper(ctx)\n\tif helper == nil {\n\t\tlog.Error(\"sessionSave: helper not found in context - plugin initialization error\")\n\t\treturn fmt.Errorf(\"session helper not available\")\n\t}\n\tif helper.SessionSave == nil {\n\t\tlog.Error(\"sessionSave: SessionSave function not provided - plugin initialization error\")\n\t\treturn fmt.Errorf(\"session helper not available\")\n\t}\n\treturn helper.SessionSave(ctx)\n}\n\nfunc sessionClear(ctx *gin.Context) {\n\thelper := getHelper(ctx)\n\tif helper == nil {\n\t\tlog.Error(\"sessionClear: helper not found in context - plugin initialization error\")\n\t\treturn\n\t}\n\tif helper.SessionClear == nil {\n\t\tlog.Error(\"sessionClear: SessionClear function not provided - plugin initialization error\")\n\t\treturn\n\t}\n\thelper.SessionClear(ctx)\n}\n\ntype config struct {\n\tAUTH0_DOMAIN        string\n\tAUTH0_CLIENT_ID     string\n\tAUTH0_CLIENT_SECRET string\n\tAUTH0_CALLBACK_URL  string\n}\n\nvar (\n\t// Example Plugin Settings\n\tlog           *nhplog.Logger\n\tpluginDirPath string\n\thostname      string\n\tlocalIp       string\n\tlocalMac      string\n\toidcAuth      *Authenticator\n)\n\nvar (\n\tname    = \"oidc\"\n\tversion = \"0.1.1\"\n\n\tbaseConfigWatch io.Closer\n\tresConfigWatch  io.Closer\n\n\tbaseConf         *config\n\tresourceMapMutex sync.Mutex\n\tresourceMap      common.ResourceGroupMap\n)\n\nvar (\n\terrLoadConfig = fmt.Errorf(\"config load error\")\n)\n\nfunc Version() string {\n\treturn fmt.Sprintf(\"%s v%s\", name, version)\n}\n\nfunc Init(in *plugins.PluginParamsIn) error {\n\tif in.PluginDirPath != nil {\n\t\tpluginDirPath = *in.PluginDirPath\n\t}\n\tif in.Log != nil {\n\t\tlog = in.Log\n\t}\n\tif in.Hostname != nil {\n\t\thostname = *in.Hostname\n\t}\n\tif in.LocalIp != nil {\n\t\tlocalIp = *in.LocalIp\n\t}\n\tif in.LocalMac != nil {\n\t\tlocalMac = *in.LocalMac\n\t}\n\n\t// load config\n\tfileNameBase := (filepath.Join(pluginDirPath, \"etc\", \"config.toml\"))\n\tif err := updateConfig(fileNameBase); err != nil {\n\t\t// ignore error\n\t\t_ = err\n\t}\n\n\tbaseConfigWatch = utils.WatchFile(fileNameBase, func() {\n\t\tlog.Info(\"base config: %s has been updated\", fileNameBase)\n\t\tupdateConfig(fileNameBase)\n\t})\n\n\tfileNameRes := filepath.Join(pluginDirPath, \"etc\", \"resource.toml\")\n\tif err := updateResource(fileNameRes); err != nil {\n\t\t// ignore error\n\t\t_ = err\n\t}\n\tresConfigWatch = utils.WatchFile(fileNameRes, func() {\n\t\tlog.Info(\"resource config: %s has been updated\", fileNameRes)\n\t\tupdateResource(fileNameRes)\n\t})\n\n\treturn nil\n}\n\nfunc updateConfig(file string) (err error) {\n\tutils.CatchPanicThenRun(func() {\n\t\terr = errLoadConfig\n\t})\n\n\tcontent, err := os.ReadFile(file)\n\tif err != nil {\n\t\tlog.Error(\"failed to read base config: %v\", err)\n\t\treturn err\n\t}\n\n\tvar conf config\n\tif err := toml.Unmarshal(content, &conf); err != nil {\n\t\tlog.Error(\"failed to unmarshal base config: %v\", err)\n\t\treturn err\n\t}\n\n\t// Validate that secrets are properly configured (not placeholder values)\n\tif strings.HasPrefix(conf.AUTH0_CLIENT_ID, \"__\") || strings.HasSuffix(conf.AUTH0_CLIENT_ID, \"__\") {\n\t\tlog.Error(\"AUTH0_CLIENT_ID contains placeholder value - secrets not properly configured\")\n\t\treturn fmt.Errorf(\"AUTH0_CLIENT_ID not configured\")\n\t}\n\tif strings.HasPrefix(conf.AUTH0_CLIENT_SECRET, \"__\") || strings.HasSuffix(conf.AUTH0_CLIENT_SECRET, \"__\") {\n\t\tlog.Error(\"AUTH0_CLIENT_SECRET contains placeholder value - secrets not properly configured\")\n\t\treturn fmt.Errorf(\"AUTH0_CLIENT_SECRET not configured\")\n\t}\n\n\tbaseConf = &conf\n\treturn nil\n}\n\nfunc updateResource(file string) (err error) {\n\tutils.CatchPanicThenRun(func() {\n\t\terr = errLoadConfig\n\t})\n\n\tcontent, err := os.ReadFile(file)\n\tif err != nil {\n\t\tlog.Error(\"failed to read resource config: %v\", err)\n\t}\n\n\tresourceMapMutex.Lock()\n\tdefer resourceMapMutex.Unlock()\n\n\tresourceMap = make(common.ResourceGroupMap)\n\tif err := toml.Unmarshal(content, &resourceMap); err != nil {\n\t\tlog.Error(\"failed to unmarshal resource config: %v\", err)\n\t}\n\n\t// res is pointer so we can update its fields\n\tfor resId, res := range resourceMap {\n\t\tres.AuthServiceId = name\n\t\tres.ResourceId = resId\n\t}\n\n\treturn err\n}\n\nfunc Close() error {\n\tif baseConfigWatch != nil {\n\t\tbaseConfigWatch.Close()\n\t}\n\tif resConfigWatch != nil {\n\t\tresConfigWatch.Close()\n\t}\n\treturn nil\n}\n\nfunc findResource(resId string) *common.ResourceData {\n\tresourceMapMutex.Lock()\n\tdefer resourceMapMutex.Unlock()\n\n\tres, found := resourceMap[resId]\n\tif found {\n\t\treturn res\n\t}\n\treturn nil\n}\n\nfunc AuthWithHttp(ctx *gin.Context, req *common.HttpKnockRequest, helper *plugins.HttpServerPluginHelper) (ackMsg *common.ServerKnockAckMsg, err error) {\n\tif helper == nil {\n\t\treturn nil, fmt.Errorf(\"AuthWithHttp: helper is null\")\n\t}\n\n\t// Store helper in context for thread-safe session access\n\tsetHelper(ctx, helper)\n\n\tresId := ctx.Query(\"resid\")\n\taction := ctx.Query(\"action\")\n\tif len(resId) > 0 && strings.Contains(resId, \"|\") {\n\t\tparams := strings.Split(resId, \"|\")\n\t\tresId = params[0]\n\t\tif len(params) > 1 {\n\t\t\taction = params[1]\n\t\t}\n\t}\n\n\tres := findResource(resId)\n\tif res == nil || len(res.Resources) == 0 {\n\t\tackMsg = nil\n\t\terr = common.ErrResourceNotFound\n\t\tlog.Error(\"resource error: %v\", err)\n\t\tctx.String(http.StatusOK, \"{\\\"errMsg\\\": \\\"resource error: %v\\\"}\", err)\n\t\treturn\n\t}\n\n\tcorsMiddleware(ctx)\n\n\tswitch {\n\tcase strings.EqualFold(action, \"valid\"):\n\t\tackMsg, err = authRegular(ctx, req, res, helper)\n\n\tcase strings.EqualFold(action, \"login\"):\n\t\tauthAndShowLogin(ctx)\n\n\tcase strings.EqualFold(action, \"oauth\"):\n\t\terr = authOidc(ctx)\n\n\tdefault:\n\t\tackMsg = nil\n\t\terr = fmt.Errorf(\"action invalid\")\n\t}\n\treturn\n}\n\nfunc authAndShowLogin(ctx *gin.Context) {\n\tt := sessionGet(ctx, \"oauth_token\")\n\toauthToken, ok1 := t.(oauth2.Token)\n\ts := sessionGet(ctx, \"state\")\n\tstate, ok2 := s.(string)\n\tif ok1 && ok2 {\n\t\t_, err := oidcAuth.VerifyIDToken(ctx.Request.Context(), &oauthToken)\n\t\tif err == nil {\n\t\t\tctx.Redirect(http.StatusSeeOther, \"/plugins/oidc?resid=demo&action=valid\"+\"&state=\"+state)\n\t\t\treturn\n\t\t}\n\t}\n\n\tctx.HTML(http.StatusOK, \"oidc/auth0home.html\", gin.H{})\n}\n\nfunc authOidc(ctx *gin.Context) error {\n\tvar err error\n\toidcAuth, err = NewAuthenticator(*baseConf)\n\tif err != nil {\n\t\tctx.String(http.StatusOK, \"{\\\"errMsg\\\": \\\"failed to initialize authenticator\\\"}\")\n\t\toidcAuth = nil\n\t\treturn fmt.Errorf(\"failed to initialize authenticator\")\n\t}\n\n\terr = oidcAuth.DoAuth(ctx)\n\tif err != nil {\n\t\tctx.String(http.StatusOK, \"{\\\"errMsg\\\": \\\"user authentication failed\\\"}\")\n\t\treturn fmt.Errorf(\"user authentication failed\")\n\t}\n\n\treturn nil\n}\n\nfunc authRegular(ctx *gin.Context, req *common.HttpKnockRequest, res *common.ResourceData, helper *plugins.HttpServerPluginHelper) (*common.ServerKnockAckMsg, error) {\n\tif oidcAuth == nil {\n\t\tlog.Error(\"authenticator not initialized\")\n\t\tctx.String(http.StatusOK, \"{\\\"errMsg\\\": \\\"authentication failed\\\"}\")\n\t\treturn nil, fmt.Errorf(\"invalid authenticator\")\n\t}\n\n\t// Validate state parameter to prevent CSRF attacks\n\tstateVal := sessionGet(ctx, \"state\")\n\tif stateVal == nil {\n\t\tlog.Error(\"no state found in session\")\n\t\tctx.String(http.StatusOK, \"{\\\"errMsg\\\": \\\"authentication failed\\\"}\")\n\t\treturn nil, fmt.Errorf(\"no state in session\")\n\t}\n\tstateStr, ok := stateVal.(string)\n\tif !ok || stateStr == \"\" {\n\t\tlog.Error(\"invalid state type or empty state in session\")\n\t\tctx.String(http.StatusOK, \"{\\\"errMsg\\\": \\\"authentication failed\\\"}\")\n\t\treturn nil, fmt.Errorf(\"invalid state in session\")\n\t}\n\tqueryState := ctx.Query(\"state\")\n\tif queryState == \"\" || queryState != stateStr {\n\t\tlog.Error(\"state mismatch: query state does not match session state\")\n\t\tctx.String(http.StatusOK, \"{\\\"errMsg\\\": \\\"authentication failed\\\"}\")\n\t\treturn nil, fmt.Errorf(\"invalid authentication session\")\n\t}\n\t// Clear state after validation to prevent replay attacks\n\tsessionSet(ctx, \"state\", \"\")\n\tsessionSave(ctx)\n\n\tauthorizeCode := ctx.Query(\"code\")\n\tvar err error\n\tvar oidcToken *oauth2.Token\n\n\tif len(authorizeCode) > 0 {\n\t\t// when there is authorize code in query, it is a callback from oidc\n\t\t// Exchange an authorization code for a token.\n\t\toidcToken, err = oidcAuth.Exchange(ctx.Request.Context(), authorizeCode)\n\t\tif err != nil {\n\t\t\tlog.Error(\"failed to exchange authorization code: %v\", err)\n\t\t\tctx.String(http.StatusOK, \"{\\\"errMsg\\\": \\\"authentication failed\\\"}\")\n\t\t\treturn nil, fmt.Errorf(\"failed to convert an authorization code into a token\")\n\t\t}\n\n\t\tidToken, err := oidcAuth.VerifyIDToken(ctx.Request.Context(), oidcToken)\n\t\tif err != nil {\n\t\t\tlog.Error(\"failed to verify ID token: %v\", err)\n\t\t\tctx.String(http.StatusOK, \"{\\\"errMsg\\\": \\\"authentication failed\\\"}\")\n\t\t\treturn nil, fmt.Errorf(\"failed to verify ID token\")\n\t\t}\n\n\t\tvar profile map[string]interface{}\n\t\tif err := idToken.Claims(&profile); err != nil {\n\t\t\tlog.Error(\"failed to claim user profile: %v\", err)\n\t\t\tctx.String(http.StatusOK, \"{\\\"errMsg\\\": \\\"authentication failed\\\"}\")\n\t\t\treturn nil, fmt.Errorf(\"failed to claim user profile\")\n\t\t}\n\n\t\tsessionSet(ctx, \"oauth_token\", *oidcToken)\n\t\tsessionSet(ctx, \"profile\", profile)\n\t\tsessionSave(ctx)\n\t} else {\n\t\t// if no authorize code exists, try extract the oauth token from the session\n\t\toauthToken := sessionGet(ctx, \"oauth_token\")\n\t\tt, ok := oauthToken.(oauth2.Token)\n\t\tif !ok {\n\t\t\tlog.Error(\"invalid or missing oauth token in session\")\n\t\t\tctx.String(http.StatusOK, \"{\\\"errMsg\\\": \\\"authentication failed\\\"}\")\n\t\t\treturn nil, fmt.Errorf(\"invalid session parameter\")\n\t\t}\n\t\toidcToken = &t\n\n\t\t_, err := oidcAuth.VerifyIDToken(ctx.Request.Context(), oidcToken)\n\t\tif err != nil {\n\t\t\tlog.Error(\"failed to verify ID token from session: %v\", err)\n\t\t\tctx.String(http.StatusOK, \"{\\\"errMsg\\\": \\\"authentication failed\\\"}\")\n\t\t\tsessionClear(ctx)\n\t\t\tctx.Redirect(http.StatusSeeOther, \"/plugins/oidc?resid=demo&action=login\")\n\t\t\treturn nil, fmt.Errorf(\"failed to verify ID token\")\n\t\t}\n\t}\n\n\t// interact with udp server for ac operation\n\tackMsg, err := helper.AuthWithHttpCallbackFunc(req, res)\n\tif ackMsg == nil || ackMsg.ErrCode != common.ErrSuccess.ErrorCode() {\n\t\tlog.Error(\"knock failed. ackMsg is nil\")\n\t\tackMsg = &common.ServerKnockAckMsg{}\n\t\tackMsg.ErrCode = common.ErrServerACOpsFailed.ErrorCode()\n\t\tif err != nil {\n\t\t\tackMsg.ErrMsg = err.Error()\n\t\t}\n\t} else {\n\t\tlog.Info(\"knock succeeded.\")\n\t\tackMsg.ErrMsg = \"\"\n\t\t// assign the redirect url from resource config to the ackMsg;\n\t\t// always overwrite to prevent the knock response from injecting an arbitrary redirect target\n\t\tif len(res.RedirectUrl) == 0 {\n\t\t\tlog.Error(\"RedirectUrl is not provided.\")\n\t\t\tackMsg.RedirectUrl = \"\"\n\t\t} else {\n\t\t\tackMsg.RedirectUrl = res.RedirectUrl\n\t\t}\n\n\t\t// set cookies\n\t\t// note that a dot in domain prefix used to make a difference, but now it doesn't (RFC6265).\n\t\t// The cookie will be sent to any subdomain of the specified domain, with or without the leading dot.\n\t\tsingleHost := len(ackMsg.ACTokens) == 1\n\t\tfor resName, token := range ackMsg.ACTokens {\n\t\t\tif singleHost {\n\t\t\t\tctx.SetCookie(\n\t\t\t\t\t\"nhp-token\",            // Name\n\t\t\t\t\turl.QueryEscape(token), // Value\n\t\t\t\t\tint(res.OpenTime),      // MaxAge - use the knock interval time\n\t\t\t\t\t\"/\",                    // Path\n\t\t\t\t\tres.CookieDomain,       // Domain\n\t\t\t\t\ttrue,                   // Secure - if true, this cookie will only be sent on https, not http\n\t\t\t\t\ttrue)                   // HttpOnly - if true, this cookie will only be sent on http(s)\n\t\t\t} else {\n\t\t\t\tdomain := strings.Split(ackMsg.ResourceHost[resName], \":\")[0]\n\t\t\t\tctx.SetCookie(\n\t\t\t\t\t\"nhp-token\"+\"/\"+resName, // Name\n\t\t\t\t\turl.QueryEscape(token),  // Value\n\t\t\t\t\tint(res.OpenTime),       // MaxAge - use the knock interval time\n\t\t\t\t\t\"/\",                     // Path\n\t\t\t\t\tdomain,                  // Domain\n\t\t\t\t\ttrue,                    // Secure - if true, this cookie will only be sent on https, not http\n\t\t\t\t\ttrue)                    // HttpOnly - if true, this cookie will only be sent on http(s)\n\t\t\t}\n\t\t\tlog.Info(\"ctx.SetCookie.\")\n\t\t}\n\t}\n\t// OIDC uses server-side redirect (instead of returning JSON like basic/authenticator plugins)\n\t// because the OIDC flow is entirely browser-based: the user arrives via OAuth callback and\n\t// must be redirected to the protected resource without client-side JavaScript handling.\n\tif ackMsg.ErrCode == common.ErrSuccess.ErrorCode() && ackMsg.RedirectUrl != \"\" {\n\t\tu, err := url.Parse(ackMsg.RedirectUrl)\n\t\tif err != nil || (u.Scheme != \"http\" && u.Scheme != \"https\") || u.Host == \"\" {\n\t\t\tlog.Error(\"invalid or unsafe RedirectUrl: %s\", ackMsg.RedirectUrl)\n\t\t\tackMsg.ErrCode = common.ErrServerACOpsFailed.ErrorCode()\n\t\t\tackMsg.ErrMsg = fmt.Sprintf(\"invalid or unsafe RedirectUrl: %s\", ackMsg.RedirectUrl)\n\t\t\tctx.Data(http.StatusBadRequest, \"text/html; charset=utf-8\", []byte(\n\t\t\t\t`<html><body><h3>Authentication Error</h3>`+\n\t\t\t\t\t`<p>The configured redirect URL is invalid. Please contact the administrator.</p>`+\n\t\t\t\t\t`</body></html>`))\n\t\t\treturn ackMsg, fmt.Errorf(\"invalid RedirectUrl: %s\", ackMsg.RedirectUrl)\n\t\t} else {\n\t\t\tif u.Scheme == \"http\" {\n\t\t\t\tlog.Warning(\"RedirectUrl uses plain HTTP, HTTPS is recommended for post-authentication redirects: %s\", ackMsg.RedirectUrl)\n\t\t\t}\n\t\t\tctx.Redirect(http.StatusSeeOther, ackMsg.RedirectUrl)\n\t\t}\n\t} else {\n\t\tctx.JSON(http.StatusOK, ackMsg)\n\t}\n\treturn ackMsg, nil\n}\n\nfunc AuthWithNHP(req *common.NhpAuthRequest, helper *plugins.NhpServerPluginHelper) (ackMsg *common.ServerKnockAckMsg, err error) {\n\tackMsg = req.Ack\n\tif helper == nil {\n\t\treturn ackMsg, fmt.Errorf(\"AuthWithNHP: helper is null\")\n\t}\n\n\tvar found bool\n\tvar res *common.ResourceData\n\tresourceMapMutex.Lock()\n\tres, found = resourceMap[req.Msg.ResourceId]\n\tresourceMapMutex.Unlock()\n\n\tif !found || len(res.Resources) == 0 {\n\t\terr = common.ErrResourceNotFound\n\t\tackMsg.ErrCode = common.ErrResourceNotFound.ErrorCode()\n\t\tackMsg.ErrMsg = err.Error()\n\t\treturn\n\t}\n\n\t// there is no backend auth in this plugin, fail the request if SkipAuth is false\n\tif !res.SkipAuth {\n\t\terr = common.ErrBackendAuthRequired\n\t\tackMsg.ErrCode = common.ErrBackendAuthRequired.ErrorCode()\n\t\tackMsg.ErrMsg = err.Error()\n\t\treturn\n\t}\n\n\t// skip backend auth and continue with AC operations\n\tlog.Info(\"agent user [%s]: skip auth\", req.Msg.UserId)\n\tackMsg.OpenTime = res.OpenTime\n\n\t// PART III: request ac operation for each resource and block for response\n\tackMsg, err = helper.AuthWithNhpCallbackFunc(req, res)\n\n\treturn ackMsg, err\n}\n\n// allowedOrigins is the list of trusted origins for CORS\nvar allowedOrigins = []string{\n\t\"https://nhp.opennhp.org\",\n\t\"https://acdemo.opennhp.org\",\n\t\"https://demo.opennhp.org\",\n}\n\nfunc corsMiddleware(ctx *gin.Context) {\n\toriginResource := ctx.Request.Header.Get(\"Origin\")\n\n\tif originResource != \"\" {\n\t\t// Validate origin against allowlist\n\t\tfor _, allowed := range allowedOrigins {\n\t\t\tif originResource == allowed {\n\t\t\t\tctx.Writer.Header().Set(\"Access-Control-Allow-Origin\", originResource)\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n\tctx.Next()\n}\n\nfunc main() {\n\n}\n"
  },
  {
    "path": "examples/server_plugin/oidc/templates/auth0home.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>OpenNHP Demo - OIDC Authentication</title>\n    <link rel=\"preconnect\" href=\"https://fonts.googleapis.com\">\n    <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n    <link href=\"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600&family=Outfit:wght@300;400;600;700&display=swap\" rel=\"stylesheet\">\n    <style>\n        :root {\n            --bg-primary: #0a0e17;\n            --bg-secondary: #131a2b;\n            --bg-card: rgba(20, 30, 50, 0.85);\n            --accent-cyan: #00d4ff;\n            --accent-green: #00ff88;\n            --accent-orange: #ff6b35;\n            --accent-red: #ff4757;\n            --text-primary: #e8eef5;\n            --text-secondary: #8892a4;\n            --border-color: rgba(0, 212, 255, 0.2);\n        }\n\n        * {\n            margin: 0;\n            padding: 0;\n            box-sizing: border-box;\n        }\n\n        body {\n            font-family: 'Outfit', sans-serif;\n            min-height: 100vh;\n            display: flex;\n            justify-content: center;\n            align-items: center;\n            background: var(--bg-primary);\n            background-image:\n                radial-gradient(ellipse at 20% 20%, rgba(0, 212, 255, 0.08) 0%, transparent 50%),\n                radial-gradient(ellipse at 80% 80%, rgba(0, 255, 136, 0.06) 0%, transparent 50%),\n                linear-gradient(180deg, var(--bg-primary) 0%, var(--bg-secondary) 100%);\n            padding: 2rem;\n        }\n\n        .container {\n            max-width: 480px;\n            width: 100%;\n            background: var(--bg-card);\n            backdrop-filter: blur(20px);\n            border: 1px solid var(--border-color);\n            border-radius: 24px;\n            padding: 2.5rem;\n            text-align: center;\n            box-shadow:\n                0 4px 60px rgba(0, 0, 0, 0.4),\n                0 0 0 1px rgba(255, 255, 255, 0.05) inset;\n            animation: fadeIn 0.6s ease-out;\n        }\n\n        @keyframes fadeIn {\n            from { opacity: 0; transform: translateY(20px); }\n            to { opacity: 1; transform: translateY(0); }\n        }\n\n        .logo-section {\n            margin-bottom: 2rem;\n        }\n\n        .logo-section img {\n            height: 64px;\n            width: 64px;\n            margin-bottom: 1rem;\n        }\n\n        .logo-section h1 {\n            font-size: 1.5rem;\n            font-weight: 700;\n            color: var(--text-primary);\n            margin-bottom: 0.5rem;\n        }\n\n        .logo-section p {\n            font-size: 0.9rem;\n            color: var(--text-secondary);\n            line-height: 1.5;\n        }\n\n        .auth-info {\n            background: rgba(0, 212, 255, 0.05);\n            border: 1px solid rgba(0, 212, 255, 0.15);\n            border-radius: 12px;\n            padding: 1rem;\n            margin-bottom: 1.5rem;\n        }\n\n        .auth-info p {\n            font-size: 0.85rem;\n            color: var(--text-secondary);\n        }\n\n        .auth-info .provider {\n            font-family: 'JetBrains Mono', monospace;\n            color: var(--accent-cyan);\n            font-weight: 600;\n        }\n\n        .login-btn {\n            display: block;\n            width: 100%;\n            padding: 1rem;\n            background: linear-gradient(135deg, var(--accent-cyan), #0099cc);\n            border: none;\n            border-radius: 10px;\n            font-family: 'Outfit', sans-serif;\n            font-size: 1rem;\n            font-weight: 600;\n            color: var(--bg-primary);\n            cursor: pointer;\n            text-decoration: none;\n            transition: all 0.3s ease;\n            margin-bottom: 1.5rem;\n        }\n\n        .login-btn:hover {\n            transform: translateY(-2px);\n            box-shadow: 0 8px 25px rgba(0, 212, 255, 0.3);\n        }\n\n        .login-btn:active {\n            transform: translateY(0);\n        }\n\n        .login-btn svg {\n            width: 20px;\n            height: 20px;\n            margin-right: 0.5rem;\n            vertical-align: middle;\n            fill: currentColor;\n        }\n\n        .security-badges {\n            display: flex;\n            justify-content: center;\n            gap: 1rem;\n            margin-bottom: 1.5rem;\n            flex-wrap: wrap;\n        }\n\n        .badge {\n            display: flex;\n            align-items: center;\n            gap: 0.3rem;\n            font-size: 0.75rem;\n            color: var(--text-secondary);\n            background: rgba(255, 255, 255, 0.03);\n            padding: 0.4rem 0.8rem;\n            border-radius: 6px;\n            border: 1px solid rgba(255, 255, 255, 0.05);\n        }\n\n        .badge svg {\n            width: 14px;\n            height: 14px;\n            fill: var(--accent-green);\n        }\n\n        .footer {\n            padding-top: 1.5rem;\n            border-top: 1px solid rgba(255, 255, 255, 0.05);\n        }\n\n        .footer p {\n            font-size: 0.8rem;\n            color: var(--text-secondary);\n            margin: 0.3rem 0;\n        }\n\n        .footer a {\n            color: var(--accent-cyan);\n            text-decoration: none;\n            transition: color 0.2s ease;\n        }\n\n        .footer a:hover {\n            color: var(--accent-green);\n            text-decoration: underline;\n        }\n\n        @media (max-width: 480px) {\n            .container {\n                padding: 1.5rem;\n            }\n\n            .logo-section h1 {\n                font-size: 1.25rem;\n            }\n\n            .security-badges {\n                flex-direction: column;\n                align-items: center;\n            }\n        }\n    </style>\n</head>\n<body>\n    <div class=\"container\">\n        <div class=\"logo-section\">\n            <img src=\"https://raw.githubusercontent.com/OpenNHP/opennhp/main/docs/images/logo10.png\" alt=\"OpenNHP Logo\">\n            <h1>OpenNHP OIDC Demo</h1>\n            <p>Secure authentication powered by OpenID Connect</p>\n        </div>\n\n        <div class=\"auth-info\">\n            <p>You will be redirected to <span class=\"provider\">Auth0</span> for secure authentication</p>\n        </div>\n\n        <a href=\"/plugins/oidc?resid=demo&action=oauth\" class=\"login-btn\">\n            <svg viewBox=\"0 0 24 24\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z\"/></svg>\n            Sign In with OIDC\n        </a>\n\n        <div class=\"security-badges\">\n            <div class=\"badge\">\n                <svg viewBox=\"0 0 24 24\"><path d=\"M12 1L3 5v6c0 5.55 3.84 10.74 9 12 5.16-1.26 9-6.45 9-12V5l-9-4zm0 10.99h7c-.53 4.12-3.28 7.79-7 8.94V12H5V6.3l7-3.11v8.8z\"/></svg>\n                Zero Trust\n            </div>\n            <div class=\"badge\">\n                <svg viewBox=\"0 0 24 24\"><path d=\"M18 8h-1V6c0-2.76-2.24-5-5-5S7 3.24 7 6v2H6c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V10c0-1.1-.9-2-2-2zm-6 9c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2zm3.1-9H8.9V6c0-1.71 1.39-3.1 3.1-3.1 1.71 0 3.1 1.39 3.1 3.1v2z\"/></svg>\n                Encrypted\n            </div>\n            <div class=\"badge\">\n                <svg viewBox=\"0 0 24 24\"><path d=\"M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z\"/></svg>\n                OIDC Compliant\n            </div>\n        </div>\n\n        <div class=\"footer\">\n            <p>Powered by <a href=\"https://github.com/OpenNHP/opennhp\" target=\"_blank\">OpenNHP</a> - Network-infrastructure Hiding Protocol</p>\n            <p>Sponsored by: <a href=\"https://layerv.ai\" target=\"_blank\">LayerV.ai</a></p>\n        </div>\n    </div>\n</body>\n</html>\n"
  },
  {
    "path": "nhp/common/constants.go",
    "content": "package common\n\n// Connection timeout constants\nconst (\n\t// ServerSideConnectionTimeoutMs is the default timeout for server-side connections\n\t// (AC, Server-to-AC, Server-to-DB). These connections are long-lived and need\n\t// higher timeouts.\n\tServerSideConnectionTimeoutMs = 300 * 1000 // 300 seconds\n\n\t// ClientSideConnectionTimeoutMs is the default timeout for client-side connections\n\t// (Agent, DB). These connections are typically short-lived.\n\tClientSideConnectionTimeoutMs = 30 * 1000 // 30 seconds\n)\n\n// Token store constants\nconst (\n\t// TokenStoreRefreshInterval is the interval in seconds between token store\n\t// cleanup operations. Used by both AC and Server.\n\tTokenStoreRefreshInterval = 10 // seconds\n)\n\n// Server discovery constants (shared by AC and DB)\nconst (\n\t// ReportToServerInterval is how often to report status to the server.\n\tReportToServerInterval = 60 // seconds\n\n\t// MinimalServerDiscoveryInterval is the minimum time between server discovery attempts.\n\tMinimalServerDiscoveryInterval = 5 // seconds\n\n\t// ServerKeepaliveInterval is how often to send keepalive messages.\n\tServerKeepaliveInterval = 20 // seconds\n\n\t// ServerDiscoveryRetryBeforeFail is the number of retries before declaring failure.\n\tServerDiscoveryRetryBeforeFail = 3\n)\n"
  },
  {
    "path": "nhp/common/errors.go",
    "content": "package common\n\nimport (\n\t\"strconv\"\n\t\"strings\"\n)\n\nvar errorMap map[string]*Error = make(map[string]*Error)\n\nvar ErrorMsgLanguageLocale string = \"EN\"\n\ntype Error struct {\n\tcode  string\n\tmsgEN string\n\tmsgCH string\n}\n\n// implment NhpError interface\nfunc (e *Error) Error() string {\n\tswitch strings.ToUpper(ErrorMsgLanguageLocale) {\n\tcase \"EN\", \"EN-US\", \"EN-GB\":\n\t\treturn e.msgEN\n\tcase \"ZH\", \"ZH-HANS\":\n\t\treturn e.msgCH\n\t}\n\treturn \"\"\n}\n\nfunc (e *Error) ErrorCode() string {\n\treturn e.code\n}\n\nfunc (e *Error) ErrorNumber() int {\n\tn, err := strconv.Atoi(e.code)\n\tif err != nil {\n\t\treturn 0\n\t}\n\treturn n\n}\n\nfunc newError(code string, enStr string, chStr string) *Error {\n\te := &Error{\n\t\tcode:  code,\n\t\tmsgEN: enStr,\n\t\tmsgCH: chStr,\n\t}\n\terrorMap[code] = e\n\treturn e\n}\n\nfunc ErrorToErrorCode(err error) string {\n\te, ok := err.(*Error)\n\tif ok {\n\t\treturn e.ErrorCode()\n\t}\n\treturn \"\"\n}\n\nfunc ErrorToString(err error) string {\n\te, ok := err.(*Error)\n\tif ok {\n\t\treturn e.Error()\n\t}\n\treturn \"\"\n}\n\nfunc ErrorCodeToError(code string) *Error {\n\te, found := errorMap[code]\n\tif found {\n\t\treturn e\n\t}\n\treturn nil // should not happen\n}\n\n// application errors\nvar (\n\t// generic\n\tErrSuccess                             = newError(\"0\", \"\", \"\")\n\tErrExit                                = newError(\"1\", \"must exit\", \"立即退出\")\n\tErrJsonParseFailed                     = newError(\"50001\", \"json parse failed\", \"json解析失败\")\n\tErrTransactionIdNotFound               = newError(\"50002\", \"transaction id not found\", \"无法找到交互id\")\n\tErrTransactionFailedByTimeout          = newError(\"50003\", \"transaction failed due to time out\", \"请求超时，交互失败\")\n\tErrTransactionFailedByClosedConnection = newError(\"50004\", \"transaction failed by closed connection\", \"由于连接中断，交互失败\")\n\tErrTransactionFailedByClosedDevice     = newError(\"50005\", \"transaction failed by closed device\", \"由于设备停止，交互失败\")\n\tErrTransactionRepliedWithWrongType     = newError(\"50006\", \"transaction replied wrong type\", \"交互回应了错误的消息类型\")\n\tErrPacketToMessageRoutineStopped       = newError(\"50007\", \"packet to message routine stopped\", \"消息处理线程已停止\")\n\tErrInvalidIpAddress                    = newError(\"50008\", \"invalid ip address\", \"ip地址无效\")\n\tErrPacketEncryptionFailed              = newError(\"50009\", \"packet encryption failed\", \"报文加密失败\")\n\n\t// agent\n\tErrKnockUserNotSpecified   = newError(\"51001\", \"knock user not specified\", \"没有指定敲门用户\")\n\tErrKnockServerNotFound     = newError(\"51002\", \"failed to find knock server\", \"无法找到敲门服务器\")\n\tErrKnockTerminatedByCookie = newError(\"51003\", \"knock terminated by cookie\", \"敲门被cookie包中止\")\n\n\t// agentsdk\n\tErrNoAgentInstance = newError(\"51100\", \"agent instance does not exist\", \"未创建agent实例\")\n\tErrInvalidInput    = newError(\"51101\", \"invalid input parameter\", \"无效的输入参数\")\n\n\t// server\n\tErrKnockApiRequestFailed       = newError(\"52001\", \"knock api request failed\", \"敲门api请求失败\")\n\tErrAuthServiceProviderNotFound = newError(\"52002\", \"failed to find auth service provider\", \"无法找到服务提供商\")\n\tErrACConnectionNotFound        = newError(\"52003\", \"failed to find ac connection\", \"无法找到门禁连接\")\n\tErrResourceNotFound            = newError(\"52004\", \"failed to find resource\", \"无法找到资源\")\n\tErrServerACOpsFailed           = newError(\"52005\", \"server ac operation failed\", \"服务器请求门禁操作失败\")\n\tErrAuthHandlerNotFound         = newError(\"52006\", \"failed to find auth handler\", \"无法找到验证处理接口\")\n\tErrBackendAuthRequired         = newError(\"52007\", \"server backend auth required\", \"服务器需要后端敲门验证\")\n\tErrUrlPathInvalid              = newError(\"52008\", \"client request url path is invalid\", \"请求路径无效\")\n\n\t// ac\n\tErrACOperationFailed       = newError(\"53001\", \"ac operation failed\", \"门禁操作失败\")\n\tErrACEmptyPassAddress      = newError(\"53002\", \"pass address is empty\", \"放行地址为空\")\n\tErrACIPSetNotFound         = newError(\"53003\", \"ipset not found\", \"无法找到ipset\")\n\tErrACIPSetOperationFailed  = newError(\"53004\", \"ipset operation failed\", \"ipset操作失败\")\n\tErrACTempPortListenFailed  = newError(\"53005\", \"temporary port listening failed\", \"临时端口监听失败\")\n\tErrACResolveTempPortFailed = newError(\"53006\", \"resolve temporary port failed\", \"解析临时端口失败\")\n\n\t// api\n\tErrHttpRequestFailed           = newError(\"54001\", \"http request failed\", \"http请求失败\")\n\tErrHttpResponseFormatError     = newError(\"54002\", \"http response format error\", \"http响应格式错误\")\n\tErrHttpReturnedWithError       = newError(\"54003\", \"http returns with error\", \"http返回带有错误\")\n\tErrHttpResourceAddressNotFound = newError(\"54004\", \"http resource address not found\", \"http无法找到资源地址\")\n\n\t// db\n\tErrTEENotAuthorized        = newError(\"55001\", \"TEE is  not authorized\", \"可信执行环境未授权\")\n\tErrDataPrivateKeyStore     = newError(\"55002\", \"data private key store error\", \"数据私钥存储错误\")\n\tErrEvidenceAppraisalFailed = newError(\"55003\", \"remote attestation appraisal failed\", \"远程证明评估失败\")\n\tErrEvidenceGetFailed       = newError(\"55004\", \"failed to get evidence\", \"无法获取远程证明\")\n\tErrDBOffline               = newError(\"55005\", \"data broker offline\", \"数据经纪件离线\")\n)\n"
  },
  {
    "path": "nhp/common/global.go",
    "content": "package common\n\nvar (\n\tExeDirPath string\n)\n"
  },
  {
    "path": "nhp/common/nhpmsg.go",
    "content": "package common\n\nimport (\n\t\"encoding/base64\"\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\n\tutils \"github.com/OpenNHP/opennhp/nhp/utils\"\n)\n\ntype NetAddress struct {\n\tIp       string `json:\"ip\"`              // IP address, mandatory\n\tPort     int    `json:\"port,omitempty\"`  // optional\n\tProtocol string `json:\"proto,omitempty\"` // tcp/udp/empty for any optional\n}\n\nfunc (na *NetAddress) String() string {\n\tif na.Port == 0 {\n\t\treturn na.Ip\n\t}\n\treturn fmt.Sprintf(\"%s:%d\", na.Ip, na.Port)\n}\n\n// agent <-> server\ntype ServerCookieMsg struct {\n\tTransactionId uint64 `json:\"trxId\"`\n\tCookie        string `json:\"cookie\"`\n}\n\ntype AgentOTPMsg struct {\n\tUserId         string         `json:\"usrId\"`\n\tDeviceId       string         `json:\"devId\"`\n\tOrganizationId string         `json:\"orgId,omitempty\"`\n\tAuthServiceId  string         `json:\"aspId\"`\n\tPasscode       string         `json:\"pass,omitempty\"`\n\tUserData       map[string]any `json:\"usrData,omitempty\"`\n}\n\ntype AgentRegisterMsg struct {\n\tUserId         string         `json:\"usrId\"`\n\tDeviceId       string         `json:\"devId\"`\n\tOrganizationId string         `json:\"orgId,omitempty\"`\n\tAuthServiceId  string         `json:\"aspId\"`\n\tOTP            string         `json:\"otp,omitempty\"`\n\tUserData       map[string]any `json:\"usrData,omitempty\"`\n}\n\ntype ServerRegisterAckMsg struct {\n\tErrCode       string `json:\"errCode\"`\n\tErrMsg        string `json:\"errMsg,omitempty\"`\n\tAuthServiceId string `json:\"aspId\"`\n}\n\ntype AgentKnockMsg struct {\n\tHeaderType     int            `json:\"headerType\"`\n\tUserId         string         `json:\"usrId\"`\n\tDeviceId       string         `json:\"devId\"`\n\tOrganizationId string         `json:\"orgId,omitempty\"`\n\tAuthServiceId  string         `json:\"aspId\"`\n\tResourceId     string         `json:\"resId\"`\n\tCheckResults   map[string]any `json:\"results,omitempty\"`\n\tUserData       map[string]any `json:\"usrData,omitempty\"`\n}\n\nfunc (knkMsg *AgentKnockMsg) Id() string {\n\treturn knkMsg.AuthServiceId + \"/\" + knkMsg.ResourceId\n}\n\ntype PreAccessInfo struct {\n\tAccessIp       string `json:\"acIp\"`\n\tAccessPort     string `json:\"acPort\"`\n\tACPubKey       string `json:\"acPubKey\"`\n\tACToken        string `json:\"acToken\"`\n\tACCipherScheme int    `json:\"acCipherScheme\"`\n}\n\ntype ServerKnockAckMsg struct {\n\tErrCode           string                    `json:\"errCode\"`\n\tErrMsg            string                    `json:\"errMsg,omitempty\"`\n\tResourceHost      map[string]string         `json:\"resHost\"`\n\tOpenTime          uint32                    `json:\"opnTime\"`\n\tAuthProviderToken string                    `json:\"aspToken,omitempty\"` // optional for ac backend validation\n\tAgentAddr         string                    `json:\"agentAddr\"`\n\tACTokens          map[string]string         `json:\"acTokens\"`\n\tPreAccessActions  map[string]*PreAccessInfo `json:\"preActions,omitempty\"` // optional for pre-access\n\tRedirectUrl       string                    `json:\"redirectUrl,omitempty\"`\n}\n\ntype AgentListMsg struct {\n\tUserId         string         `json:\"usrId\"`\n\tDeviceId       string         `json:\"devId\"`\n\tOrganizationId string         `json:\"orgId,omitempty\"`\n\tAuthServiceId  string         `json:\"aspId\"`\n\tUserData       map[string]any `json:\"usrData,omitempty\"`\n}\n\ntype ServerListResultMsg struct {\n\tErrCode     string         `json:\"errCode\"`\n\tErrMsg      string         `json:\"errMsg,omitempty\"`\n\tListResults map[string]any `json:\"list,omitempty\"`\n}\n\n// agent <-> ac\ntype AgentAccessMsg struct {\n\tUserId         string         `json:\"usrId\"`\n\tDeviceId       string         `json:\"devId\"`\n\tOrganizationId string         `json:\"orgId,omitempty\"`\n\tACToken        string         `json:\"acToken\"`\n\tUserData       map[string]any `json:\"usrData,omitempty\"`\n}\n\ntype ACAccessAckMsg struct {\n\tErrCode   string `json:\"errCode\"`\n\tErrMsg    string `json:\"errMsg,omitempty\"`\n\tAgentAddr string `json:\"agentAddr,omitempty\"` // optional\n}\n\n// ac <-> server\ntype ServerACOpsMsg struct {\n\tUserId           string        `json:\"usrId\"`\n\tDeviceId         string        `json:\"devId\"`\n\tOrganizationId   string        `json:\"orgId,omitempty\"`\n\tAuthServiceId    string        `json:\"aspId\"`\n\tResourceId       string        `json:\"resId\"`\n\tSourceAddrs      []*NetAddress `json:\"srcAddrs\"`\n\tDestinationAddrs []*NetAddress `json:\"dstAddrs\"`\n\tOpenTime         uint32        `json:\"opnTime\"`\n}\n\ntype ACOpsResultMsg struct {\n\tErrCode         string         `json:\"errCode\"`\n\tErrMsg          string         `json:\"errMsg,omitempty\"`\n\tOpenTime        uint32         `json:\"opnTime\"`\n\tACToken         string         `json:\"token\"`\n\tPreAccessAction *PreAccessInfo `json:\"preAct\"`\n}\n\ntype ACOnlineMsg struct {\n\tAuthServiceId string   `json:\"aspId\"`\n\tResourceIds   []string `json:\"resIds\"`\n\tACId          string   `json:\"acId,omitempty\"`\n}\n\ntype ACRefreshMsg struct {\n\tNhpToken   string      `json:\"nhpToken\"`\n\tSourceAddr *NetAddress `json:\"srcAddr\"`\n}\n\ntype ServerACAckMsg struct {\n\tErrCode string `json:\"errCode\"`\n\tErrMsg  string `json:\"errMsg,omitempty\"`\n\tACAddr  string `json:\"acAddr\"`\n}\n\ntype ResourceInfo struct {\n\tACId       string      `json:\"acId\"`\n\tHostname   string      `json:\"host,omitempty\"` // hostname, optional\n\tAddr       *NetAddress `json:\"addr\"`           // dst ip + port + protocol\n\tPortSuffix bool        `json:\"portSuffix,omitempty\"`\n\tMaskHost   bool        `json:\"maskHost,omitempty\"` // do not reveal resource host in ack info\n}\n\nfunc (r *ResourceInfo) DestHost() string {\n\tif r.MaskHost || r.Addr == nil {\n\t\treturn \"\"\n\t}\n\n\thost := r.Addr.Ip\n\tif len(r.Hostname) > 0 {\n\t\thost = r.Hostname\n\t}\n\tif !r.PortSuffix || r.Addr.Port == 0 {\n\t\treturn host\n\t}\n\treturn fmt.Sprintf(\"%s:%d\", host, r.Addr.Port)\n}\n\nfunc (r *ResourceInfo) DstIp() string {\n\tif r.Addr == nil {\n\t\treturn \"\"\n\t}\n\treturn r.Addr.Ip\n}\n\ntype ResourceGroup struct {\n\tAuthServiceId     string                   `json:\"aspId\"`\n\tResourceId        string                   `json:\"resId\"`\n\tOpenTime          uint32                   `json:\"opnTime,omitempty\"`\n\tAuthProviderToken string                   `json:\"aspToken,omitempty\"`\n\tResources         map[string]*ResourceInfo `json:\"resInfo\"`\n}\n\nfunc (r *ResourceGroup) Id() string {\n\treturn r.AuthServiceId + \"/\" + r.ResourceId\n}\n\nfunc (r *ResourceGroup) Hosts() map[string]string {\n\thostMap := make(map[string]string)\n\tfor name, info := range r.Resources {\n\t\thostMap[name] = info.DestHost()\n\t}\n\n\treturn hostMap\n}\n\ntype DRGMsg struct {\n\tDoType         string      `json:\"doType\"`         // Data object format type, default \"ZTDO\" (ZTDO format details in Chapter 8). Custom formats allowed.\n\tDoId           string      `json:\"doId\"`           // Globally unique data object identifier (typically UUID)\n\tDbId           string      `json:\"dbId\"`           // Data broker identifier\n\tDataSourceType string      `json:\"dataSourceType\"` // Data source type, default \"file\", Supported Values: file, stream\n\tAccessUrl      string      `json:\"accessUrl\"`      // Data access URL (empty indicates offline transfer)\n\tAccessByNHP    bool        `json:\"accessByNHP\"`    // Require NHP handshake before accessing URL (optional if accessUrl empty)\n\tSpo            SmartPolicy `json:\"spo\"`\n}\n\ntype DAKMsg struct {\n\tDoId    string `json:\"doId\"`    // Echoes registration request's DoId\n\tErrCode int    `json:\"errCode\"` // Registration error code (0=success)\n\tErrMsg  string `json:\"errMsg\"`  // Error message (empty if success)\n}\n\ntype DARMsg struct {\n\tDoId                       string `json:\"doId\"`                       // Requested data object identifier\n\tUserId                     string `json:\"userId\"`                     // User identifier\n\tTeePublicKey               string `json:\"teePublicKey\"`               // Base64-encoded TEE (Trusted Execution Environment) public key\n\tConsumerEphemeralPublicKey string `json:\"consumerEphemeralPublicKey\"` // Base64-encoded consumer ephemeral public key\n}\n\ntype DAGMsg struct {\n\tDoId           string           `json:\"doId\"`                     // Echoes request's DoId\n\tDoType         string           `json:\"doType,omitempty\"`         // Echoes request's DoType\n\tDataSourceType string           `json:\"dataSourceType,omitempty\"` // Data source type, the default value is online, and supported values are online, offline and stream.\n\tAccessUrl      string           `json:\"accessUrl,omitempty\"`      // Data access URL\n\tAccessByNHP    bool             `json:\"accessByNHP,omitempty\"`    // Indicates whether to grant access to the data through NHP\n\tKao            *KeyAccessObject `json:\"kao,omitempty\"`            // Key access object\n\tSpo            *SmartPolicy     `json:\"spo,omitempty\"`            // Smart policy Object\n\tErrCode        int              `json:\"errCode\"`                  // Registration error code (0=success)\n\tErrMsg         string           `json:\"errMsg\"`                   // Error message (empty if success)\n}\n\ntype DWRMsg struct {\n\tDoId                       string `json:\"doId\"`                       // Data object identifier\n\tTeePublicKey               string `json:\"teePublicKey\"`               // Based64 encoded TEE public key\n\tConsumerEphemeralPublicKey string `json:\"consumerEphemeralPublicKey\"` // Based64 encoded consumer ephemeral public key\n}\n\ntype DWAMsg struct {\n\tDoId    string           `json:\"doId\"`          // Data object identifier\n\tKao     *KeyAccessObject `json:\"kao,omitempty\"` // Key access object\n\tErrCode int              `json:\"errCode\"`       // Registration error code (0=success)\n\tErrMsg  string           `json:\"errMsg\"`        // Error message (empty if success)\n}\n\ntype DSAMsg struct {\n\tDoId    string       `json:\"doId\"`          // Data object identifier\n\tSpoId   string       `json:\"spoId\"`         // Smart Policy Object identifier\n\tSpo     *SmartPolicy `json:\"spo,omitempty\"` // Smart policy Object\n\tTTL     int          `json:\"TTL\"`           // Evidence validity period in milliseconds\n\tErrCode int          `json:\"errCode\"`       // Registration error code (0=success)\n\tErrMsg  string       `json:\"errMsg\"`        // Error message (empty if success)\n}\n\ntype DAVMsg struct {\n\tDoId     string `json:\"doId\"`     // Data object identifier\n\tSpoId    string `json:\"spoId\"`    // Smart Policy Object identifier\n\tEvidence string `json:\"evidence\"` // Policy verification evidence\n}\n\ntype KeyAccessObject struct {\n\tWrappedDataKey string `json:\"wrappedDataKey\"`          // Wrapped data private key\n\tSpoId          string `json:\"spoId,omitempty\"`         // SPO identifier\n\tPolicyBinding  string `json:\"policyBinding,omitempty\"` // Base64-encoded HMAC(HMAC(pao), key) using payload key\n}\n\ntype SmartPolicy struct {\n\tPolicyId string `json:\"policyId\"` // Policy identifier\n\tPolicy   string `json:\"policy\"`   // Base64-encoded wasm policy\n\tEmbedded bool   `json:\"embedded\"`\n}\n\nfunc (spo *SmartPolicy) GetPolicy() ([]byte, error) {\n\twasmBytes, err := base64.StdEncoding.DecodeString(spo.Policy)\n\tif err != nil {\n\t\twasmPath, err := utils.DownloadFileToTemp(spo.Policy, \"wasm-\")\n\t\tdefer os.Remove(filepath.Dir(wasmPath))\n\t\tdefer os.Remove(wasmPath)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\twasmBytes, err = os.ReadFile(wasmPath)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\treturn wasmBytes, nil\n}\n\ntype DBOnlineMsg struct {\n\tDBId string `json:\"dbId,omitempty\"`\n}\n\ntype ServerDBAckMsg struct {\n\tErrCode string `json:\"errCode\"`\n\tErrMsg  string `json:\"errMsg,omitempty\"`\n\tDBAddr  string `json:\"dbAddr\"`\n}\n\ntype DHPKnockMsg struct {\n\tUserId         string         `json:\"usrId\"`\n\tDeviceId       string         `json:\"devId\"`\n\tOrganizationId string         `json:\"orgId,omitempty\"`\n\tUserData       map[string]any `json:\"usrData,omitempty\"`\n\tEvidence       string         `json:\"evidence\"`\n}\n\ntype ServerDHPKnockAckMsg struct {\n\tErrCode  string `json:\"errCode\"`\n\tErrMsg   string `json:\"errMsg,omitempty\"`\n\tOpenTime uint32 `json:\"opnTime\"`\n}\n"
  },
  {
    "path": "nhp/common/packet.go",
    "content": "package common\n\n// header flags (bit 0 - bit 11)\nconst (\n\tNHP_FLAG_EXTENDEDLENGTH = 1 << iota\n\tNHP_FLAG_COMPRESS\n\tNHP_FLAG_CL_PKC\n)\n\n// cipher scheme combination (bit 12 - bit 15)\nconst (\n\tNHP_FLAG_SCHEME_CURVE = 0 << 12\n\tNHP_FLAG_SCHEME_GMSM  = 1 << 12\n)\n\nconst (\n\tCIPHER_SCHEME_CURVE int = iota // 0 - Curve25519/Blake2s/AES256 (international standard)\n\tCIPHER_SCHEME_GMSM             // 1 - SM2/SM3/SM4 (Chinese national standard)\n)\n"
  },
  {
    "path": "nhp/common/tokenstore.go",
    "content": "package common\n\nimport (\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/OpenNHP/opennhp/nhp/log\"\n)\n\n// TokenEntry is an interface for token entries that have an expiration time.\n// Both AccessEntry (AC) and ACTokenEntry (Server) implement this interface.\ntype TokenEntry interface {\n\tGetExpireTime() time.Time\n}\n\n// TokenStore is a generic two-level map for efficient token storage.\n// The first level is indexed by the first character of the token for fast lookup.\n// This design distributes tokens across ~64 buckets (base64 characters).\ntype TokenStore[E TokenEntry] struct {\n\tmu    sync.Mutex\n\tstore map[string]map[string]E\n}\n\n// NewTokenStore creates a new TokenStore instance.\nfunc NewTokenStore[E TokenEntry]() *TokenStore[E] {\n\treturn &TokenStore[E]{\n\t\tstore: make(map[string]map[string]E),\n\t}\n}\n\n// Store adds or updates a token entry in the store.\nfunc (ts *TokenStore[E]) Store(token string, entry E) {\n\tts.mu.Lock()\n\tdefer ts.mu.Unlock()\n\n\tprefix := token[0:1]\n\ttokenMap, found := ts.store[prefix]\n\tif found {\n\t\ttokenMap[token] = entry\n\t} else {\n\t\ttokenMap = make(map[string]E)\n\t\ttokenMap[token] = entry\n\t\tts.store[prefix] = tokenMap\n\t}\n}\n\n// Load retrieves a token entry from the store.\n// Returns the entry and true if found, or zero value and false if not found.\nfunc (ts *TokenStore[E]) Load(token string) (E, bool) {\n\tts.mu.Lock()\n\tdefer ts.mu.Unlock()\n\n\tprefix := token[0:1]\n\ttokenMap, found := ts.store[prefix]\n\tif found {\n\t\tentry, ok := tokenMap[token]\n\t\tif ok {\n\t\t\treturn entry, true\n\t\t}\n\t}\n\tvar zero E\n\treturn zero, false\n}\n\n// Delete removes a token from the store.\nfunc (ts *TokenStore[E]) Delete(token string) {\n\tts.mu.Lock()\n\tdefer ts.mu.Unlock()\n\n\tprefix := token[0:1]\n\tif tokenMap, found := ts.store[prefix]; found {\n\t\tdelete(tokenMap, token)\n\t\tif len(tokenMap) == 0 {\n\t\t\tdelete(ts.store, prefix)\n\t\t}\n\t}\n}\n\n// CleanExpired removes all expired tokens from the store.\n// Returns the number of tokens removed.\nfunc (ts *TokenStore[E]) CleanExpired() int {\n\tts.mu.Lock()\n\tdefer ts.mu.Unlock()\n\n\tnow := time.Now()\n\tremoved := 0\n\n\tfor prefix, tokenMap := range ts.store {\n\t\tfor token, entry := range tokenMap {\n\t\t\tif now.After(entry.GetExpireTime()) {\n\t\t\t\tlog.Info(\"[TokenStore] token %s expired, remove\", token)\n\t\t\t\tdelete(tokenMap, token)\n\t\t\t\tremoved++\n\t\t\t}\n\t\t}\n\t\tif len(tokenMap) == 0 {\n\t\t\tdelete(ts.store, prefix)\n\t\t}\n\t}\n\n\treturn removed\n}\n\n// RunRefreshRoutine starts a background goroutine that periodically cleans\n// expired tokens. It stops when the stop channel is closed.\n// The wg.Done() is called when the routine exits.\nfunc (ts *TokenStore[E]) RunRefreshRoutine(wg *sync.WaitGroup, stop <-chan struct{}, intervalSeconds int) {\n\tdefer wg.Done()\n\tdefer log.Info(\"tokenStoreRefreshRoutine stopped\")\n\n\tlog.Info(\"tokenStoreRefreshRoutine started\")\n\n\tfor {\n\t\tselect {\n\t\tcase <-stop:\n\t\t\treturn\n\t\tcase <-time.After(time.Duration(intervalSeconds) * time.Second):\n\t\t\tts.CleanExpired()\n\t\t}\n\t}\n}\n\n// Size returns the total number of tokens in the store.\nfunc (ts *TokenStore[E]) Size() int {\n\tts.mu.Lock()\n\tdefer ts.mu.Unlock()\n\n\tcount := 0\n\tfor _, tokenMap := range ts.store {\n\t\tcount += len(tokenMap)\n\t}\n\treturn count\n}\n"
  },
  {
    "path": "nhp/common/types.go",
    "content": "package common\n\nimport \"net/url\"\n\n// an object contains represent knocking user information\ntype AgentUser struct {\n\tUserId         string\n\tDeviceId       string\n\tOrganizationId string\n\tAuthServiceId  string\n}\n\n// authsvcprovider and resource\ntype LoginPageContext struct {\n\tTitle              string `json:\"title,omitempty\"`\n\tClientId           string `json:\"clientId,omitempty\"`\n\tAppKey             string `json:\"appKey,omitempty\"`\n\tAppSecret          string `json:\"appSecret,omitempty\"`\n\tRedirectUrl        string `json:\"redirectUrl,omitempty\"`\n\tRedirectWithParams bool   `json:\"redirectWithParams,omitempty\"`\n}\n\ntype ResourceData struct {\n\tResourceGroup `mapstructure:\",squash\"`\n\t// optional extension data\n\tAppKey             string         `json:\"appKey,omitempty\"`\n\tAppSecret          string         `json:\"appSecret,omitempty\"`\n\tAccessKey          string         `json:\"accessKey,omitempty\"`\n\tSecretKey          string         `json:\"secretKey,omitempty\"`\n\tExInfo             map[string]any `json:\"exinfo,omitempty\"`\n\tRedirectUrl        string         `json:\"redirectUrl,omitempty\"`\n\tRedirectWithParams bool           `json:\"redirectWithParams,omitempty\"`\n\tSkipAuth           bool           `json:\"skipAuth,omitempty\"`\n\tCookieDomain       string         `json:\"cookieDomain,omitempty\"`\n}\n\ntype ResourceGroupMap map[string]*ResourceData\ntype AuthServiceProviderData struct {\n\tResourceGroups ResourceGroupMap `json:\"ress\"`\n\tAuthSvcId      string           `json:\"aspId\"`\n\tPluginPath     string           `json:\"pluginPath,omitempty\"`\n\tPluginHash     string           `json:\"pluginHash,omitempty\"`\n}\ntype AuthSvcProviderMap map[string]*AuthServiceProviderData\n\n// requests\ntype NhpOTPRequest struct {\n\tMsg     *AgentOTPMsg `json:\"msg\"`\n\tSrcAddr *NetAddress  `json:\"srcAddr\"`\n}\n\ntype NhpRegisterRequest struct {\n\tMsg       *AgentRegisterMsg     `json:\"msg\"`\n\tAck       *ServerRegisterAckMsg `json:\"ack\"`\n\tPublicKey string                `json:\"pubKey\"`\n\tSrcAddr   *NetAddress           `json:\"srcAddr\"`\n}\n\ntype NhpAuthRequest struct {\n\tMsg       *AgentKnockMsg     `json:\"msg\"`\n\tAck       *ServerKnockAckMsg `json:\"ack\"`\n\tPublicKey string             `json:\"pubKey\"`\n\tSrcAddr   *NetAddress        `json:\"srcAddr\"`\n}\n\ntype NhpListRequest struct {\n\tMsg       *AgentListMsg        `json:\"msg\"`\n\tAck       *ServerListResultMsg `json:\"ack\"`\n\tPublicKey string               `json:\"pubKey\"`\n\tSrcAddr   *NetAddress          `json:\"srcAddr\"`\n}\n\ntype HttpKnockRequest struct {\n\tUserId         string   `json:\"usrId\"`\n\tDeviceId       string   `json:\"devId\"`\n\tOrganizationId string   `json:\"orgId,omitempty\"`\n\tAuthServiceId  string   `json:\"aspId\"`\n\tResourceId     string   `json:\"resId\"`\n\tToken          string   `json:\"token\"`\n\tCode           string   `json:\"code\"`\n\tDstUrl         string   `json:\"dstUrl\"`\n\tCommand        string   `json:\"command\"`\n\tUrl            *url.URL `json:\"-\"`\n\tUserAgent      string   `json:\"-\"`\n\tSrcIp          string   `json:\"-\"`\n\tSrcPort        int      `json:\"-\"`\n}\n\ntype HttpRefreshRequest struct {\n\tToken string `json:\"token\"`\n\tSrcIp string `json:\"srcIp\"`\n}\n"
  },
  {
    "path": "nhp/core/benchmark/ecc_rsa_test.go",
    "content": "package benchmark\n\nimport (\n\t\"crypto/sha256\"\n\t\"encoding/binary\"\n\t\"fmt\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/OpenNHP/opennhp/nhp/core\"\n)\n\nvar aeadCount uint64 = 0\n\nfunc TestRSASignAndVerify(t *testing.T) {\n\tmsg := \"Qt for Windows - Building from Source\" +\n\t\t\"This page describes the process of configuring and building Qt for Windows. To download\" +\n\t\t\" and install a pre-built Qt for Windows, follow the instructions on the Getting Started with Qt page.\"\n\n\tnow := time.Now()\n\n\tfor i := 0; i < 10; i++ {\n\t\tpriv, pub := GenerateRSAKeys()\n\t\thashed, signature, err := SignWithRSAPrivateKey(priv, []byte(msg))\n\n\t\tif err != nil {\n\t\t\tfmt.Printf(\"RSA sign error: %v\", err)\n\t\t\treturn\n\t\t}\n\n\t\terr = VerifyWithRSAPublicKey(pub, hashed, signature)\n\t\tif err != nil {\n\t\t\tfmt.Printf(\"RSA verify error: %v\", err)\n\t\t\treturn\n\t\t}\n\t}\n\n\td := time.Since(now)\n\tfmt.Printf(\"RSA verify success with %d microseconds.\\n\", d.Microseconds())\n}\n\nfunc TestECCSharedKey(t *testing.T) {\n\tnow := time.Now()\n\n\tmsg := \"Qt for Windows - Building from Source\" +\n\t\t\"This page describes the process of configuring and building Qt for Windows. To download\" +\n\t\t\" and install a pre-built Qt for Windows, follow the instructions on the Getting Started with Qt page.\"\n\n\tfor i := 0; i < 10; i++ {\n\t\tecdh := core.NewECDH(core.ECC_CURVE25519)\n\t\tecdhr := core.NewECDH(core.ECC_CURVE25519)\n\n\t\tssc := ecdh.SharedSecret(ecdhr.PublicKey())\n\t\tsss := ecdhr.SharedSecret(ecdh.PublicKey())\n\n\t\t//if !bytes.Equal(ssc[:], sss[:]) {\n\t\t//\tfmt.Printf(\"shared key is not identical, quit\")\n\t\t//\treturn\n\t\t//}\n\n\t\tvar sscKey, sssKey [core.SymmetricKeySize]byte\n\t\tcopy(sscKey[:], ssc[:])\n\t\tcopy(sssKey[:], sss[:])\n\n\t\thashc := sha256.New()\n\t\thashc.Write(ssc[:])\n\t\thashedc := hashc.Sum(nil)\n\n\t\thashs := sha256.New()\n\t\thashs.Write(ssc[:])\n\t\thasheds := hashs.Sum(nil)\n\n\t\taeadc, err := core.AeadFromKey(core.GCM_AES256, &sscKey)\n\t\tif err != nil {\n\t\t\tfmt.Printf(\"aead creation error: %v\", err)\n\t\t\treturn\n\t\t}\n\t\taeads, err := core.AeadFromKey(core.GCM_AES256, &sssKey)\n\t\tif err != nil {\n\t\t\tfmt.Printf(\"aead creation error: %v\", err)\n\t\t\treturn\n\t\t}\n\n\t\tvar nonceBytes [12]byte\n\t\taeadCount++\n\t\tbinary.BigEndian.PutUint64(nonceBytes[:], aeadCount)\n\n\t\tencrypted := aeadc.Seal(nil, nonceBytes[:], []byte(msg), hashedc)\n\t\tdecrypted, err := aeads.Open(nil, nonceBytes[:], encrypted, hasheds)\n\t\t_ = decrypted\n\t\tif err != nil {\n\t\t\tfmt.Printf(\"aead decrypt error: %v\", err)\n\t\t\treturn\n\t\t}\n\t}\n\n\td := time.Since(now)\n\t//fmt.Printf(\"Decrypted message:\\n%s\\n\", string(decrypted))\n\tfmt.Printf(\"ECC verify success with %d microseconds.\\n\", d.Microseconds())\n}\n\nfunc TestGMSharedKey(t *testing.T) {\n\tnow := time.Now()\n\n\tmsg := \"Qt for Windows - Building from Source\" +\n\t\t\"This page describes the process of configuring and building Qt for Windows. To download\" +\n\t\t\" and install a pre-built Qt for Windows, follow the instructions on the Getting Started with Qt page.\"\n\n\tfor i := 0; i < 10; i++ {\n\t\tecdh := core.NewECDH(core.ECC_SM2)\n\t\tecdhr := core.NewECDH(core.ECC_SM2)\n\n\t\tssc := ecdh.SharedSecret(ecdhr.PublicKey())\n\t\tsss := ecdhr.SharedSecret(ecdh.PublicKey())\n\n\t\t//if !bytes.Equal(ssc[:], sss[:]) {\n\t\t//\tfmt.Printf(\"shared key is not identical, quit\")\n\t\t//\treturn\n\t\t//}\n\n\t\tvar sscKey, sssKey [core.SymmetricKeySize]byte\n\t\tcopy(sscKey[:], ssc[:])\n\t\tcopy(sssKey[:], sss[:])\n\n\t\thashc := sha256.New()\n\t\thashc.Write(ssc[:])\n\t\thashedc := hashc.Sum(nil)\n\n\t\thashs := sha256.New()\n\t\thashs.Write(ssc[:])\n\t\thasheds := hashs.Sum(nil)\n\n\t\taeadc, err := core.AeadFromKey(core.GCM_SM4, &sscKey)\n\t\tif err != nil {\n\t\t\tfmt.Printf(\"aead creation error: %v\", err)\n\t\t\treturn\n\t\t}\n\t\taeads, err := core.AeadFromKey(core.GCM_SM4, &sssKey)\n\t\tif err != nil {\n\t\t\tfmt.Printf(\"aead creation error: %v\", err)\n\t\t\treturn\n\t\t}\n\n\t\tvar nonceBytes [12]byte\n\t\taeadCount++\n\t\tbinary.BigEndian.PutUint64(nonceBytes[:], aeadCount)\n\n\t\tencrypted := aeadc.Seal(nil, nonceBytes[:], []byte(msg), hashedc)\n\t\tdecrypted, err := aeads.Open(nil, nonceBytes[:], encrypted, hasheds)\n\t\t_ = decrypted\n\t\tif err != nil {\n\t\t\tfmt.Printf(\"aead decrypt error: %v\", err)\n\t\t\treturn\n\t\t}\n\t}\n\n\td := time.Since(now)\n\t//fmt.Printf(\"Decrypted message:\\n%s\\n\", string(decrypted))\n\tfmt.Printf(\"ECC verify success with %d microseconds.\\n\", d.Microseconds())\n}\n"
  },
  {
    "path": "nhp/core/benchmark/rsa_utils.go",
    "content": "package benchmark\n\nimport (\n\t\"crypto\"\n\t\"crypto/rand\"\n\t\"crypto/rsa\"\n\t\"crypto/sha256\"\n\t\"fmt\"\n)\n\nfunc GenerateRSAKeys() (priv *rsa.PrivateKey, pub *rsa.PublicKey) {\n\tvar err error\n\tpriv, err = rsa.GenerateKey(rand.Reader, 2048)\n\tif err != nil {\n\t\tfmt.Printf(\"Failed to generate RSA private key: %v\", err)\n\t\treturn\n\t}\n\n\tpub = &priv.PublicKey\n\n\t/*\n\t\tprivBytes := x509.MarshalPKCS1PrivateKey(priv)\n\t\tpubBytes := x509.MarshalPKCS1PublicKey(pub)\n\n\t\tprivBlock := &pem.Block{\n\t\t\tType:  \"RSA PRIVATE KEY\",\n\t\t\tBytes: privBytes,\n\t\t}\n\t\tpubBlock := &pem.Block{\n\t\t\tType:  \"PUBLIC KEY\",\n\t\t\tBytes: pubBytes,\n\t\t}\n\t\tprivPemBytes := pem.EncodeToMemory(privBlock)\n\t\tpubPemBytes := pem.EncodeToMemory(pubBlock)\n\n\t\tfmt.Printf(\"Generated RSA private key:\\n%s\\n\", string(privPemBytes))\n\t\tfmt.Printf(\"Generated RSA public key:\\n%s\\n\", string(pubPemBytes))\n\t*/\n\n\treturn\n}\n\nfunc SignWithRSAPrivateKey(priv *rsa.PrivateKey, msg []byte) (hashed []byte, signature []byte, err error) {\n\thash := sha256.New()\n\thash.Write(msg)\n\thashed = hash.Sum(nil)\n\tsignature, err = rsa.SignPKCS1v15(nil, priv, crypto.SHA256, hashed)\n\n\treturn\n}\n\nfunc VerifyWithRSAPublicKey(pub *rsa.PublicKey, hashed []byte, signature []byte) error {\n\treturn rsa.VerifyPKCS1v15(pub, crypto.SHA256, hashed, signature)\n}\n"
  },
  {
    "path": "nhp/core/constants.go",
    "content": "package core\n\n// protocol\nconst ProtocolVersionMajor = 1\nconst ProtocolVersionMinor = 0\n\n// device\nconst (\n\tMaxMemoryUsage         = 1 * 1024 * 1024 * 1024 // 1GB\n\tPacketBufferSize       = 4096\n\tPacketBufferPoolSize   = MaxMemoryUsage / PacketBufferSize\n\tAllocateTimeToOverload = 2 // 2 seconds\n\tSendQueueSize          = 10240\n\tRecvQueueSize          = 10240\n)\n\n// session\nconst (\n\tMinimalRecvIntervalMs  = 20  // millisecond\n\tThreatCountBeforeBlock = 1   // block at 2nd attempt\n\tCookieRegenerateTime   = 120 // second\n\tCookieRoundTripTimeMs  = 20  // millisecond\n\tFailureRetryInterval   = 10  // second\n)\n\n// transaction\nconst (\n\tAgentLocalTransactionResponseTimeoutMs  = 5 * 1000                                     // millisecond\n\tServerLocalTransactionResponseTimeoutMs = AgentLocalTransactionResponseTimeoutMs - 300 // millisecond\n\tACLocalTransactionResponseTimeoutMs     = ServerLocalTransactionResponseTimeoutMs      // millisecond\n\n\tRemoteTransactionProcessTimeoutMs   = 10 * 1000 // millisecond\n\tDELocalTransactionResponseTimeoutMs = 5 * 1000\n)\n\n// peer\nconst (\n\tMinimalPeerAddressHoldTime = 5 // second\n)\n\n// hostname resolve\nconst (\n\tMinimalNSLookupInterval = 300 // second\n)\n\n// packet\nconst (\n\tHeaderCommonSize      = 24\n\tSymmetricKeySize      = 32\n\tPrivateKeySize        = 32\n\tPublicKeySize         = 32\n\tPublicKeySizeEx       = 64\n\tHashSize              = 32\n\tCookieSize            = 32\n\tTimestampSize         = 8\n\tGCMNonceSize          = 12\n\tGCMTagSize            = 16\n\tPublicKeyBase64Size   = 44\n\tPublicKeyBase64SizeEx = 88\n)\n\n// noise\nconst (\n\tInitialChainKeyString = \"NHP keygen v.20230421@clouddeep.cn\"\n\tInitialHashString     = \"NHP hashgen v.20230421@deepcloudsdp.com\"\n)\n"
  },
  {
    "path": "nhp/core/crypto.go",
    "content": "package core\n\nimport (\n\t\"crypto/aes\"\n\t\"crypto/cipher\"\n\t\"crypto/rand\"\n\t\"crypto/sha256\"\n\t\"encoding/base64\"\n\t\"encoding/hex\"\n\t\"fmt\"\n\t\"hash\"\n\t\"io\"\n\t\"log\"\n\t\"os\"\n\n\t\"github.com/emmansun/gmsm/padding\"\n\t\"github.com/emmansun/gmsm/sm2\"\n\t\"github.com/emmansun/gmsm/sm3\"\n\t\"github.com/emmansun/gmsm/sm4\"\n\t\"golang.org/x/crypto/blake2s\"\n\t\"golang.org/x/crypto/chacha20poly1305\"\n\n\t\"github.com/OpenNHP/opennhp/nhp/common\"\n\t\"github.com/OpenNHP/opennhp/nhp/core/scheme/curve\"\n\t\"github.com/OpenNHP/opennhp/nhp/core/scheme/gmsm\"\n\t\"github.com/OpenNHP/opennhp/nhp/utils\"\n)\n\ntype HashTypeEnum int\n\nconst (\n\tHASH_BLAKE2S HashTypeEnum = iota\n\tHASH_SM3\n\tHASH_SHA256\n)\n\ntype EccTypeEnum int\n\nconst (\n\tECC_CURVE25519 EccTypeEnum = iota\n\tECC_SM2\n\tECC_UMI\n)\n\ntype GcmTypeEnum int\n\nconst (\n\tGCM_AES256 GcmTypeEnum = iota\n\tGCM_SM4\n\tGCM_CHACHA20POLY1305\n)\n\ntype CipherSuite struct {\n\tScheme   int\n\tEccType  EccTypeEnum\n\tHashType HashTypeEnum\n\tGcmType  GcmTypeEnum\n}\n\n// init cipher suite\nfunc NewCipherSuite(scheme int) (ciphers *CipherSuite) {\n\t// init cipher suite\n\tswitch scheme {\n\tcase common.CIPHER_SCHEME_GMSM:\n\t\tciphers = &CipherSuite{\n\t\t\tScheme:   common.CIPHER_SCHEME_GMSM,\n\t\t\tHashType: HASH_SM3,\n\t\t\tEccType:  ECC_SM2,\n\t\t\tGcmType:  GCM_SM4,\n\t\t}\n\n\tcase common.CIPHER_SCHEME_CURVE:\n\t\tfallthrough\n\tdefault:\n\t\tciphers = &CipherSuite{\n\t\t\tScheme:   common.CIPHER_SCHEME_CURVE,\n\t\t\tHashType: HASH_BLAKE2S,\n\t\t\tEccType:  ECC_CURVE25519,\n\t\t\tGcmType:  GCM_AES256,\n\t\t}\n\t}\n\treturn\n}\n\nfunc NewHash(t HashTypeEnum) (hash.Hash, error) {\n\tswitch t {\n\tcase HASH_BLAKE2S:\n\t\th, err := blake2s.New256(nil)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to create blake2s hash: %w\", err)\n\t\t}\n\t\treturn h, nil\n\n\tcase HASH_SM3:\n\t\treturn sm3.New(), nil\n\n\tcase HASH_SHA256:\n\t\treturn sha256.New(), nil\n\n\tdefault:\n\t\treturn nil, fmt.Errorf(\"unsupported hash type: %d\", t)\n\t}\n}\n\ntype Ecdh interface {\n\tSetPrivateKey(prk []byte) error\n\tPrivateKey() []byte\n\tPublicKey() []byte\n\tSharedSecret(pbk []byte) []byte\n\tName() string\n\tPrivateKeyBase64() string\n\tPublicKeyBase64() string\n\tIdentity() []byte\n\tMidPublicKey() []byte\n}\n\nfunc ECDHFromKey(t EccTypeEnum, prk []byte) (e Ecdh) {\n\tswitch t {\n\tcase ECC_CURVE25519:\n\t\tvar c curve.Curve25519ECDH\n\t\terr := c.SetPrivateKey(prk)\n\t\tif err != nil {\n\t\t\treturn nil\n\t\t}\n\t\te = &c\n\n\tcase ECC_SM2:\n\t\tvar s gmsm.SM2ECDH\n\t\terr := s.SetPrivateKey(prk)\n\t\tif err != nil {\n\t\t\treturn nil\n\t\t}\n\t\te = &s\n\t}\n\n\treturn e\n}\n\nfunc NewECDH(t EccTypeEnum) (e Ecdh) {\n\tswitch t {\n\tcase ECC_CURVE25519:\n\t\te = curve.NewECDH()\n\n\tcase ECC_SM2:\n\t\te = gmsm.NewECDH()\n\t}\n\n\treturn e\n}\n\nfunc AeadFromKey(t GcmTypeEnum, key *[SymmetricKeySize]byte) (cipher.AEAD, error) {\n\tswitch t {\n\tcase GCM_AES256:\n\t\taesBlock, err := aes.NewCipher(key[:])\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to create AES cipher: %w\", err)\n\t\t}\n\t\taead, err := cipher.NewGCM(aesBlock)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to create AES-GCM: %w\", err)\n\t\t}\n\t\treturn aead, nil\n\n\tcase GCM_SM4:\n\t\tsm4Block, err := sm4.NewCipher(key[:16])\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to create SM4 cipher: %w\", err)\n\t\t}\n\t\taead, err := cipher.NewGCM(sm4Block)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to create SM4-GCM: %w\", err)\n\t\t}\n\t\treturn aead, nil\n\n\tcase GCM_CHACHA20POLY1305:\n\t\taead, err := chacha20poly1305.New(key[:])\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to create ChaCha20-Poly1305: %w\", err)\n\t\t}\n\t\treturn aead, nil\n\n\tdefault:\n\t\treturn nil, fmt.Errorf(\"unsupported GCM type: %d\", t)\n\t}\n}\n\nfunc CBCEncryption(t GcmTypeEnum, key *[SymmetricKeySize]byte, plaintext []byte, inPlace bool) ([]byte, error) {\n\tvar block cipher.Block\n\tvar iv []byte\n\tvar err error\n\tswitch t {\n\tcase GCM_AES256:\n\t\tblock, err = aes.NewCipher(key[:])\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to create AES cipher for CBC: %w\", err)\n\t\t}\n\t\tiv = key[8:24]\n\n\tcase GCM_SM4:\n\t\tblock, err = sm4.NewCipher(key[:16])\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to create SM4 cipher for CBC: %w\", err)\n\t\t}\n\t\tiv = key[16:]\n\n\tcase GCM_CHACHA20POLY1305:\n\t\treturn nil, ErrNotApplicable\n\n\tdefault:\n\t\treturn nil, fmt.Errorf(\"unsupported cipher type for CBC: %d\", t)\n\t}\n\n\tvar paddedPlainText []byte\n\tif len(plaintext)%block.BlockSize() == 0 {\n\t\t// skip padding\n\t\tpaddedPlainText = plaintext\n\t} else {\n\t\tpkcs7 := padding.NewPKCS7Padding(uint(block.BlockSize()))\n\t\tpaddedPlainText = pkcs7.Pad(plaintext)\n\t}\n\n\tvar ciphertext []byte\n\tif inPlace {\n\t\tciphertext = paddedPlainText\n\t} else {\n\t\tciphertext = make([]byte, 0, len(plaintext))\n\t}\n\n\tmode := cipher.NewCBCEncrypter(block, iv)\n\t// CryptBlocks can work in-place if the two arguments are the same.\n\tmode.CryptBlocks(ciphertext, paddedPlainText)\n\n\treturn ciphertext, nil\n}\n\nfunc CBCDecryption(t GcmTypeEnum, key *[SymmetricKeySize]byte, ciphertext []byte, inPlace bool) ([]byte, error) {\n\tvar block cipher.Block\n\tvar iv []byte\n\tvar err error\n\tswitch t {\n\tcase GCM_AES256:\n\t\tblock, err = aes.NewCipher(key[:])\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to create AES cipher for CBC decryption: %w\", err)\n\t\t}\n\t\tiv = key[8:24]\n\n\tcase GCM_SM4:\n\t\tblock, err = sm4.NewCipher(key[:16])\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to create SM4 cipher for CBC decryption: %w\", err)\n\t\t}\n\t\tiv = key[16:]\n\n\tcase GCM_CHACHA20POLY1305:\n\t\treturn nil, ErrNotApplicable\n\n\tdefault:\n\t\treturn nil, fmt.Errorf(\"unsupported cipher type for CBC decryption: %d\", t)\n\t}\n\n\t// Validate ciphertext: must be at least one block and a multiple of block size\n\tif len(ciphertext) < block.BlockSize() {\n\t\treturn nil, fmt.Errorf(\"ciphertext too short: need at least %d bytes\", block.BlockSize())\n\t}\n\tif len(ciphertext)%block.BlockSize() != 0 {\n\t\treturn nil, fmt.Errorf(\"ciphertext length %d is not a multiple of block size %d\", len(ciphertext), block.BlockSize())\n\t}\n\n\tvar plaintext []byte\n\tif inPlace {\n\t\tplaintext = ciphertext\n\t} else {\n\t\tplaintext = make([]byte, len(ciphertext))\n\t}\n\n\tmode := cipher.NewCBCDecrypter(block, iv)\n\t// CryptBlocks can work in-place if the two arguments are the same.\n\tmode.CryptBlocks(plaintext, ciphertext)\n\n\tif len(plaintext)%block.BlockSize() == 0 {\n\t\t// skip unpadding\n\t} else {\n\t\t// Unpad plaintext\n\t\tpkcs7 := padding.NewPKCS7Padding(uint(block.BlockSize()))\n\t\tplaintext, err = pkcs7.Unpad(plaintext)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\treturn plaintext, nil\n}\n\nfunc SM2Encrypt(pubKeyBase64 string, message string) (string, error) {\n\t//ASN.1\n\n\t// real public key should be from cert or public key pem file\n\tsm2PublicKey, err := gmsm.Base64DecodeSM2ECDSAPublicKey(pubKeyBase64)\n\n\tsecretMessage := []byte(message)\n\t// crypto/rand.Reader is a good source of entropy for randomizing the\n\t// encryption function.\n\trng := rand.Reader\n\n\tciphertext, err := sm2.EncryptASN1(rng, sm2PublicKey, secretMessage)\n\tif err != nil {\n\t\tfmt.Fprintf(os.Stderr, \"Error from encryption: %s\\n\", err)\n\t\treturn \"\", err\n\t}\n\t// Since encryption is a randomized function, ciphertext will be\n\t// different each time.\n\tfmt.Printf(\"Ciphertext: %x\\n\", ciphertext)\n\treturn hex.EncodeToString(ciphertext), err\n}\n\nfunc SM2Decrypt(privateKeyBase64 string, message string) (string, error) {\n\t//ASN.1\n\tciphertext, err := hex.DecodeString(message)\n\tprivKeyBytes, err := base64.StdEncoding.DecodeString(privateKeyBase64)\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"size incorrect\")\n\t}\n\n\ttestkey, err := sm2.NewPrivateKey(privKeyBytes)\n\tif err != nil {\n\t\tlog.Fatalf(\"fail to new private key %v\", err)\n\t}\n\n\tsourceText, err := testkey.Decrypt(nil, ciphertext, nil)\n\tif err != nil {\n\t\tfmt.Fprintf(os.Stderr, \"Error from decryption: %s\\n\", err)\n\t\treturn \"\", err\n\t}\n\treturn string(sourceText), err\n}\n\n// AESEncryption Function\nfunc AESEncrypt(plainText []byte, key []byte) ([]byte, error) {\n\tblock, err := aes.NewCipher(key)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t//Padding Plaintext\n\tplainText = pad(plainText, aes.BlockSize)\n\tcipherText := make([]byte, aes.BlockSize+len(plainText))\n\tiv := cipherText[:aes.BlockSize]\n\tif _, err := io.ReadFull(rand.Reader, iv); err != nil {\n\t\treturn nil, err\n\t}\n\n\tmode := cipher.NewCBCEncrypter(block, iv)\n\tmode.CryptBlocks(cipherText[aes.BlockSize:], plainText)\n\treturn cipherText, nil\n}\n\n// pad adds PKCS#7 padding to data. Uses shared implementation from utils.\nfunc pad(data []byte, blockSize int) []byte {\n\treturn utils.PKCS7Pad(data, blockSize)\n}\n\nfunc AESDecrypt(cipherText []byte, key []byte) ([]byte, error) {\n\tblock, err := aes.NewCipher(key)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\t// Validate ciphertext length:\n\t// - Must have at least IV (16 bytes) + one encrypted block (16 bytes)\n\t// - After IV extraction, remaining must be a multiple of block size\n\tif len(cipherText) < aes.BlockSize*2 {\n\t\treturn nil, fmt.Errorf(\"cipherText too short: need at least %d bytes, got %d\", aes.BlockSize*2, len(cipherText))\n\t}\n\tif (len(cipherText)-aes.BlockSize)%aes.BlockSize != 0 {\n\t\treturn nil, fmt.Errorf(\"cipherText length invalid: must be IV + multiple of block size\")\n\t}\n\tiv := cipherText[:aes.BlockSize]\n\tcipherText = cipherText[aes.BlockSize:]\n\n\t// Decrypt\n\tmode := cipher.NewCBCDecrypter(block, iv)\n\tdecrypted := make([]byte, len(cipherText))\n\tmode.CryptBlocks(decrypted, cipherText)\n\n\t// Remove padding\n\tdecrypted = unpad(decrypted, aes.BlockSize)\n\n\treturn decrypted, nil\n}\n\n// unpad removes PKCS#7 padding from data. Uses shared implementation from utils.\nfunc unpad(padded []byte, blockSize int) []byte {\n\treturn utils.PKCS7Unpad(padded, blockSize)\n}\n"
  },
  {
    "path": "nhp/core/device.go",
    "content": "package core\n\nimport (\n\t\"encoding/base64\"\n\t\"fmt\"\n\t\"runtime\"\n\t\"runtime/debug\"\n\t\"sync\"\n\t\"sync/atomic\"\n\t\"time\"\n\n\t\"github.com/OpenNHP/opennhp/nhp/common\"\n\tlog \"github.com/OpenNHP/opennhp/nhp/log\"\n)\n\ntype DeviceTypeEnum = int\n\nconst (\n\tNHP_NO_DEVICE = iota\n\tNHP_AGENT\n\tNHP_SERVER\n\tNHP_AC\n\tNHP_RELAY\n\tNHP_DB\n\tDHP_AGENT\n)\n\ntype DeviceOptions struct {\n\tDisableAgentPeerValidation  bool\n\tDisableServerPeerValidation bool\n\tDisableACPeerValidation     bool\n\tDisableRelayPeerValidation  bool\n\tDisableDePeerValidation     bool\n}\n\ntype NhpError interface {\n\tError() string\n\tErrorCode() string\n\tErrorNumber() int\n}\n\nfunc defaultDeviceOptions(t int) (option DeviceOptions) {\n\tswitch t {\n\tcase NHP_AGENT:\n\tcase NHP_SERVER:\n\tcase NHP_DB:\n\tcase NHP_AC:\n\t\t// NHP_AC does not validate, nor store any agent peer. Related message: NHP-ACC (agent-ac pre-access)\n\t\toption.DisableAgentPeerValidation = true\n\tcase NHP_RELAY:\n\t}\n\n\treturn option\n}\n\ntype Device struct {\n\toptionMutex sync.Mutex\n\toption      DeviceOptions\n\n\tcounterIndex    uint64\n\tdeviceType      int\n\tstaticEcdhCurve Ecdh // for cipherscheme curve\n\tstaticEcdhGmsm  Ecdh // for cipherscheme gmsm\n\n\tpeerMapMutex sync.Mutex\n\tpeerMap      map[string]Peer\n\n\tlocalTransactionMutex sync.Mutex\n\tlocalTransactionMap   map[uint64]*LocalTransaction\n\n\tpool     *PacketBufferPool\n\tOverload atomic.Bool\n\n\twg      sync.WaitGroup\n\tsignals struct {\n\t\tstop chan struct{}\n\t}\n\n\tDecryptedMsgQueue chan *PacketParserData\n\tpacketToMsgQueue  chan *PacketData\n\tmsgToPacketQueue  chan *MsgData\n}\n\nfunc NewDevice(t int, prk []byte, option *DeviceOptions) *Device {\n\td := &Device{\n\t\tdeviceType: t,\n\t}\n\n\tif option != nil {\n\t\td.option = *option\n\t} else {\n\t\td.option = defaultDeviceOptions(t)\n\t}\n\n\td.staticEcdhCurve = ECDHFromKey(ECC_CURVE25519, prk)\n\tif d.staticEcdhCurve == nil {\n\t\tlog.Critical(\"Failed to set private key\")\n\t\treturn nil\n\t}\n\td.staticEcdhGmsm = ECDHFromKey(ECC_SM2, prk)\n\tif d.staticEcdhGmsm == nil {\n\t\tlog.Critical(\"Failed to set private key ex\")\n\t\treturn nil\n\t}\n\n\td.pool = &PacketBufferPool{}\n\td.pool.Init(PacketBufferPoolSize)\n\n\td.peerMap = make(map[string]Peer)\n\td.localTransactionMap = make(map[uint64]*LocalTransaction)\n\n\td.DecryptedMsgQueue = make(chan *PacketParserData, RecvQueueSize)\n\td.msgToPacketQueue = make(chan *MsgData, SendQueueSize)\n\td.packetToMsgQueue = make(chan *PacketData, RecvQueueSize)\n\td.signals.stop = make(chan struct{})\n\n\treturn d\n}\n\nfunc (d *Device) SetOption(option DeviceOptions) {\n\td.optionMutex.Lock()\n\tdefer d.optionMutex.Unlock()\n\n\td.option = option\n}\n\nfunc (d *Device) Start() {\n\tcpus := runtime.NumCPU()\n\td.wg.Add(2 * cpus)\n\tfor i := 0; i < cpus; i++ {\n\t\tgo d.msgToPacketRoutine(i)\n\t\tgo d.packetToMsgRoutine(i)\n\t}\n}\n\nfunc (d *Device) Stop() {\n\tclose(d.signals.stop)\n\td.wg.Wait()\n\tclose(d.msgToPacketQueue)\n\tclose(d.packetToMsgQueue)\n\tclose(d.DecryptedMsgQueue)\n}\n\nfunc (d *Device) PublicKeyBase64() string {\n\treturn d.staticEcdhCurve.PublicKeyBase64()\n}\n\nfunc (d *Device) PublicKeyExBase64() string {\n\treturn d.staticEcdhGmsm.PublicKeyBase64()\n}\n\nfunc (d *Device) NextCounterIndex() uint64 {\n\treturn atomic.AddUint64(&d.counterIndex, 1)\n}\n\n// Asynchronous multi-channel processing.\nfunc (d *Device) msgToPacketRoutine(id int) {\n\tdefer d.wg.Done()\n\tdefer log.Info(\"msgToPacketRoutine %d: quit\", id)\n\n\tlog.Info(\"msgToPacketRoutine %d: start\", id)\n\n\tfor {\n\t\tselect {\n\t\tcase <-d.signals.stop:\n\t\t\treturn\n\n\t\tcase md, ok := <-d.msgToPacketQueue:\n\t\t\tif !ok {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif md == nil {\n\t\t\t\tlog.Warning(\"msgToPacketRoutine %d: msgToPacketRoutine gets nil data\", id)\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// message encryption workflow: raw message -> encryption -> raw packet -> connection.SendQueue\n\t\t\tfunc() {\n\t\t\t\tmsgType := HeaderTypeToString(md.HeaderType)\n\t\t\t\tvar msgStr string\n\t\t\t\tif md.Message != nil {\n\t\t\t\t\tmsgStr = string(md.Message)\n\t\t\t\t}\n\t\t\t\tlog.Debug(\"msgToPacketRoutine %d: encrypting [%s] raw message: %s\", id, msgType, msgStr)\n\t\t\t\tlog.Evaluate(\"msgToPacketRoutine %d: encrypting [%s] raw message: %s\", id, msgType, msgStr)\n\n\t\t\t\tvar mad *MsgAssemblerData\n\t\t\t\tvar err error\n\n\t\t\t\t// error handling\n\t\t\t\tdefer func() {\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tmad.Error = err\n\t\t\t\t\t\tmad.Destroy()\n\n\t\t\t\t\t\t// inform preset channel with error\n\t\t\t\t\t\tif mad.ResponseMsgCh != nil {\n\t\t\t\t\t\t\tmad.ResponseMsgCh <- &PacketParserData{\n\t\t\t\t\t\t\t\tError: err,\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif mad.encryptedPktCh != nil {\n\t\t\t\t\t\t\tmad.encryptedPktCh <- mad\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}()\n\n\t\t\t\t// process keepalive separately\n\t\t\t\tif md.HeaderType == NHP_KPL {\n\t\t\t\t\tmad, _ = d.createKeepalivePacket(md)\n\t\t\t\t\t// send out keepalive packet\n\t\t\t\t\tmad.connData.ForwardOutboundPacket(mad.BasePacket)\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tmad, err = d.createMsgAssemblerData(md)\n\t\t\t\t// no errors will happen\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\terr = mad.setPeerPublicKey(nil)\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Error(\"msgToPacketRoutine %d: [%s] message randomization failed: %v\", id, msgType, err)\n\t\t\t\t\tlog.Evaluate(\"msgToPacketRoutine %d: [%s] message randomization failed: %v\", id, msgType, err)\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\terr = mad.encryptBody()\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Error(\"msgToPacketRoutine %d: [%s] message encryption failed: %v\", id, msgType, err)\n\t\t\t\t\tlog.Evaluate(\"msgToPacketRoutine %d: [%s] message encryption failed: %v\", id, msgType, err)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tlog.Debug(\"msgToPacketRoutine %d: complete encrypting [%s]\", id, msgType)\n\t\t\t\tlog.Evaluate(\"msgToPacketRoutine %d: complete encrypting [%s]\", id, msgType)\n\n\t\t\t\t// deliver encrypted packet to specific channel, but be sure to release the packet buffer after use\n\t\t\t\tif mad.encryptedPktCh != nil {\n\t\t\t\t\tmad.encryptedPktCh <- mad\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t// create local transaction if needed\n\t\t\t\tlog.Debug(\"msgToPacketRoutine IsTransactionRequest:deviceType:%d HeaderType:%d\", d.deviceType, mad.HeaderType)\n\t\t\t\tif d.IsTransactionRequest(mad.HeaderType) {\n\t\t\t\t\t// save initiator transaction\n\t\t\t\t\tmad.BasePacket.KeepAfterSend = true // packet is kept after sending and deleted at transaction level\n\t\t\t\t\tt := &LocalTransaction{\n\t\t\t\t\t\ttransactionId: mad.header.Counter(),\n\t\t\t\t\t\tconnData:      mad.connData,\n\t\t\t\t\t\tmad:           mad,\n\t\t\t\t\t\tNextPacketCh:  make(chan *Packet),\n\t\t\t\t\t\ttimeout:       d.LocalTransactionTimeout(),\n\t\t\t\t\t}\n\t\t\t\t\td.AddLocalTransaction(t)\n\t\t\t\t\tlog.Debug(\"AddLocalTransaction:deviceType=%d,HeaderType=%d\", d.deviceType, mad.HeaderType)\n\t\t\t\t}\n\n\t\t\t\t// send out fully encrypted packet\n\t\t\t\tmad.connData.ForwardOutboundPacket(mad.BasePacket)\n\t\t\t}()\n\t\t}\n\t}\n}\n\n// Synchronous linear processing.\nfunc (d *Device) MsgToPacket(md *MsgData) (mad *MsgAssemblerData, err error) {\n\tdefer func() {\n\t\tif x := recover(); x != nil {\n\t\t\tmad = nil\n\t\t\terr = fmt.Errorf(\"!!!recovered from panic: %v\\n%s\", x, string(debug.Stack()))\n\t\t\tErrRuntimePanic.SetExtraError(err)\n\t\t\terr = ErrRuntimePanic\n\t\t}\n\t}()\n\n\tvar buf [PacketBufferSize]byte\n\tmd.ExternalPacket = &Packet{\n\t\tBuf:        &buf,\n\t\tContent:    buf[:],\n\t\tHeaderType: md.HeaderType,\n\t}\n\t//md.Compress = len(md.Message) > 64 // no gain for compression if size is small\n\t// use new transaction id if not specified\n\tif md.TransactionId == 0 {\n\t\tmd.TransactionId = d.NextCounterIndex()\n\t}\n\n\t// process keepalive separately\n\tif md.HeaderType == NHP_KPL {\n\t\tmad, _ = d.createKeepalivePacket(md)\n\t\treturn mad, nil\n\t}\n\n\tmad, err = d.createMsgAssemblerData(md)\n\tdefer mad.Destroy()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\terr = mad.setPeerPublicKey(nil)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\terr = mad.encryptBody()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn mad, nil\n}\n\n// Asynchronous multi-channel processing.\nfunc (d *Device) packetToMsgRoutine(id int) {\n\tdefer d.wg.Done()\n\tdefer log.Info(\"packetToMsgRoutine %d: quit\", id)\n\n\tlog.Info(\"packetToMsgRoutine %d: start\", id)\n\n\tfor {\n\t\tselect {\n\t\tcase <-d.signals.stop:\n\t\t\treturn\n\n\t\tcase pd, ok := <-d.packetToMsgQueue:\n\t\t\tif !ok {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif pd == nil {\n\t\t\t\tlog.Warning(\"packetToMsgRoutine %d: packetToMsgQueue gets nil data\", id)\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// packet decryption workflow: connection.RecvQueue -> raw packet -> decryption -> raw message\n\t\t\tfunc() {\n\t\t\t\tmsgType := HeaderTypeToString(pd.BasePacket.HeaderType)\n\t\t\t\tlog.Debug(\"packetToMsgRoutine %d: decrypting [%s] raw packet\", id, msgType)\n\t\t\t\tlog.Evaluate(\"packetToMsgRoutine %d: decrypting [%s] raw packet\", id, msgType)\n\n\t\t\t\tvar ppd *PacketParserData\n\t\t\t\tvar err error\n\n\t\t\t\t// error handling\n\t\t\t\tdefer func() {\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tppd.Error = err\n\t\t\t\t\t\tppd.Destroy()\n\n\t\t\t\t\t\t// inform preset channel with error\n\t\t\t\t\t\tif ppd.feedbackMsgCh != nil {\n\t\t\t\t\t\t\tppd.feedbackMsgCh <- ppd\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ppd.decryptedMsgCh != nil {\n\t\t\t\t\t\t\tppd.decryptedMsgCh <- ppd\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}()\n\n\t\t\t\tppd, err = d.createPacketParserData(pd)\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Debug(\"packetToMsgRoutine %d: [%s] packet precheck failed: %v\", id, msgType, err)\n\t\t\t\t\tlog.Evaluate(\"packetToMsgRoutine %d: [%s] packet precheck failed: %v\", id, msgType, err)\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\terr = ppd.validatePeer()\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Debug(\"packetToMsgRoutine %d: [%s] packet validation failed: %v\", id, msgType, err)\n\t\t\t\t\tlog.Evaluate(\"packetToMsgRoutine %d: [%s] packet validation failed: %v\", id, msgType, err)\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\terr = ppd.decryptBody()\n\t\t\t\tif err != nil {\n\t\t\t\t\tlog.Error(\"packetToMsgRoutine: %d: [%s] packet decryption failed: %v\", id, msgType, err)\n\t\t\t\t\tlog.Evaluate(\"packetToMsgRoutine: %d: [%s] packet decryption failed: %v\", id, msgType, err)\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tvar msgStr string\n\t\t\t\tif ppd.BodyMessage != nil {\n\t\t\t\t\tmsgStr = string(ppd.BodyMessage)\n\t\t\t\t}\n\t\t\t\tlog.Debug(\"packetToMsgRoutine: %d: complete decrypting [%s] message: %s\", id, msgType, msgStr)\n\t\t\t\tlog.Evaluate(\"packetToMsgRoutine: %d: complete decrypting [%s] message: %s\", id, msgType, msgStr)\n\t\t\t\tlog.Debug(\"packetToMsgRoutine: complete decrypting feedbackMsgCh:%d,headerType:%s\", d.deviceType, HeaderTypeToString(ppd.HeaderType))\n\t\t\t\t// deliver decrypted message to specific channel\n\t\t\t\tif ppd.decryptedMsgCh != nil {\n\t\t\t\t\tlog.Debug(\"packetToMsgRoutine: complete decrypting decryptedMsgCh is not nil\")\n\t\t\t\t\tppd.Destroy()\n\t\t\t\t\tppd.decryptedMsgCh <- ppd\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif ppd.feedbackMsgCh != nil {\n\t\t\t\t\tlog.Debug(\"packetToMsgRoutine: complete decrypting feedbackMsgCh  is not nil\")\n\t\t\t\t\tppd.Destroy()\n\t\t\t\t\tppd.feedbackMsgCh <- ppd\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tlog.Debug(\"packetToMsgRoutine: complete decrypting start IsTransactionRequest:deviceType:%d,headerType:%s\", d.deviceType, HeaderTypeToString(ppd.HeaderType))\n\t\t\t\t// start and save responder transaction\n\t\t\t\tif d.IsTransactionRequest(ppd.HeaderType) {\n\t\t\t\t\tt := &RemoteTransaction{\n\t\t\t\t\t\ttransactionId: ppd.SenderTrxId,\n\t\t\t\t\t\tconnData:      ppd.ConnData,\n\t\t\t\t\t\tparserData:    ppd, // ppd is owned and to be destroyed by transaction\n\t\t\t\t\t\tNextMsgCh:     make(chan *MsgData),\n\t\t\t\t\t\ttimeout:       d.RemoteTransactionTimeout(),\n\t\t\t\t\t}\n\t\t\t\t\tppd.ConnData.AddRemoteTransaction(t)\n\t\t\t\t\tlog.Debug(\"IsTransactionRequest:true\")\n\t\t\t\t}\n\n\t\t\t\t// release packet buffer, but still keep the decrypted message\n\t\t\t\tppd.Destroy()\n\t\t\t\t// deliver decrypted message to generic channel\n\t\t\t\tselect {\n\t\t\t\tcase d.DecryptedMsgQueue <- ppd:\n\n\t\t\t\tdefault:\n\t\t\t\t\t// ppd not delivered, set error to destroy the ppd\n\t\t\t\t\tlog.Critical(\"packetToMsgRoutine: %d: decryptedMessageCh is full, discarding message\", id)\n\t\t\t\t}\n\t\t\t}()\n\t\t}\n\t}\n}\n\n// Synchronous linear processing.\nfunc (d *Device) PacketToMsg(pd *PacketData) (ppd *PacketParserData, err error) {\n\tdefer func() {\n\t\tif x := recover(); x != nil {\n\t\t\tppd = nil\n\t\t\terr = fmt.Errorf(\"!!!recovered from panic: %v\\n%s\", x, string(debug.Stack()))\n\t\t\tErrRuntimePanic.SetExtraError(err)\n\t\t\terr = ErrRuntimePanic\n\t\t}\n\t}()\n\n\tvar packetType int\n\tpacketType, _, err = d.RecvPrecheck(pd.BasePacket)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\t// skip processing keepalive packet\n\tif packetType == NHP_KPL {\n\t\treturn &PacketParserData{HeaderType: NHP_KPL}, nil\n\t}\n\n\tpd.InitTime = time.Now().UnixNano()\n\tppd, err = d.createPacketParserData(pd)\n\tdefer ppd.Destroy()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\terr = ppd.validatePeer()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\terr = ppd.decryptBody()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn ppd, nil\n}\n\nfunc (d *Device) SendMsgToPacket(md *MsgData) {\n\tselect {\n\tcase d.msgToPacketQueue <- md:\n\t\t// process encryption and send encrypted packet via connection\n\tdefault:\n\t\t// discard\n\t\tlog.Critical(\"msgToPacketQueue is full, discarding message\")\n\t}\n}\n\nfunc (d *Device) RecvPacketToMsg(pd *PacketData) {\n\tselect {\n\tcase d.packetToMsgQueue <- pd:\n\t\t// process decryption and deliver plain text message to DecryptedMessageCh\n\tdefault:\n\t\t// discard\n\t\tlog.Critical(\"packetToMsgQueue is full, discarding packet\")\n\t}\n}\n\nfunc (d *Device) AddPeer(peer Peer) {\n\td.peerMapMutex.Lock()\n\tdefer d.peerMapMutex.Unlock()\n\n\td.peerMap[peer.PublicKeyBase64()] = peer\n}\n\nfunc (d *Device) RemovePeer(pubKey string) {\n\td.peerMapMutex.Lock()\n\tdefer d.peerMapMutex.Unlock()\n\n\tdelete(d.peerMap, pubKey)\n}\n\nfunc (d *Device) ResetPeers() {\n\td.peerMapMutex.Lock()\n\tdefer d.peerMapMutex.Unlock()\n\n\td.peerMap = make(map[string]Peer)\n}\n\nfunc (d *Device) LookupPeer(pk []byte) Peer {\n\tpkStr := base64.StdEncoding.EncodeToString(pk)\n\n\td.peerMapMutex.Lock()\n\tdefer d.peerMapMutex.Unlock()\n\n\tpeer, found := d.peerMap[pkStr]\n\tif found {\n\t\treturn peer\n\t}\n\treturn nil\n}\n\nfunc (d *Device) IsOverload() bool {\n\t//return true // debug\n\treturn d.Overload.Load()\n}\n\nfunc (d *Device) SetOverload(overloaded bool) {\n\td.Overload.Store(overloaded)\n}\n\nfunc (d *Device) GetEcdhByCipherScheme(cipherScheme int) Ecdh {\n\tswitch cipherScheme {\n\tcase common.CIPHER_SCHEME_GMSM:\n\t\treturn d.staticEcdhGmsm\n\tcase common.CIPHER_SCHEME_CURVE:\n\t\tfallthrough\n\tdefault:\n\t\treturn d.staticEcdhCurve\n\t}\n}\n"
  },
  {
    "path": "nhp/core/errors.go",
    "content": "package core\n\n/*\n#include \"main/nhpdevicedef.h\"\n*/\nimport \"C\"\nimport (\n\t\"strconv\"\n)\n\nvar errorMap map[int]*Error = make(map[int]*Error)\n\ntype Error struct {\n\tnum         int\n\tmsg         string\n\textraErr    error\n\thasExtraErr bool\n}\n\nfunc (e *Error) SetExtraError(err error) {\n\te.extraErr = err\n\tif err != nil {\n\t\te.hasExtraErr = true\n\t}\n}\n\n// implment NhpError interface\nfunc (e *Error) Error() string {\n\tif e.hasExtraErr {\n\t\te.hasExtraErr = false\n\t\tdefer e.SetExtraError(nil)\n\t\treturn e.msg + \": \" + e.extraErr.Error()\n\t}\n\treturn e.msg\n}\n\nfunc (e *Error) ErrorCode() string {\n\treturn strconv.Itoa(e.num)\n}\n\nfunc (e *Error) ErrorNumber() int {\n\treturn e.num\n}\n\nfunc newError(number C.int, msg string) *Error {\n\te := &Error{\n\t\tnum: int(number),\n\t\tmsg: msg,\n\t}\n\terrorMap[e.num] = e\n\treturn e\n}\n\nfunc ErrorToErrorNumber(err error) int {\n\te, ok := err.(*Error)\n\tif ok {\n\t\treturn e.ErrorNumber()\n\t}\n\treturn -1\n}\n\nfunc ErrorToString(err error) string {\n\te, ok := err.(*Error)\n\tif ok {\n\t\treturn e.Error()\n\t}\n\treturn \"\"\n}\n\nfunc ErrorCodeToError(number int) *Error {\n\te, found := errorMap[number]\n\tif found {\n\t\treturn e\n\t}\n\treturn nil // should not happen\n}\n\n// device sdk errors\nvar (\n\tErrSuccess = newError(C.ERR_NHP_SUCCESS, \"\")\n\n\t// device\n\tErrCipherNotSupported = newError(C.ERR_NHP_CIPHER_NOT_SUPPORTED, \"cipher scheme not supported\")\n\tErrNotApplicable      = newError(C.ERR_NHP_OPERATION_NOT_APPLICABLE, \"operation not applicable\")\n\tErrCreateDeviceFailed = newError(C.ERR_NHP_CREATE_DEVICE_FAILED, \"failed to create nhp device\")\n\tErrCloseDeviceFailed  = newError(C.ERR_NHP_CLOSE_DEVICE_FAILED, \"attempt to close a non-initialized nhp device\")\n\tErrRuntimePanic       = newError(C.ERR_NHP_SDK_RUNTIME_PANIC, \"runtime panic encountered\")\n\n\t// initiator and encryption\n\tErrWrongCipherScheme       = newError(C.ERR_NHP_WRONG_CIPHER_SCHEME, \"a wrong cipher scheme is used\")\n\tErrEmptyPeerPublicKey      = newError(C.ERR_NHP_EMPTY_PEER_PUBLIC_KEY, \"remote peer public key is not set\")\n\tErrEphermalECDHPeerFailed  = newError(C.ERR_NHP_EPHERMAL_ECDH_PEER_FAILED, \"ephermal ECDH failed with peer\")\n\tErrDeviceECDHPeerFailed    = newError(C.ERR_NHP_DEVICE_ECDH_PEER_FAILED, \"device ECDH failed with peer\")\n\tErrIdentityTooLong         = newError(C.ERR_NHP_IDENTITY_TOO_LONG, \"identity exceeds max length\")\n\tErrDataCompressionFailed   = newError(C.ERR_NHP_DATA_COMPRESSION_FAILED, \"data compression failed\")\n\tErrPacketSizeExceedsBuffer = newError(C.ERR_NHP_PACKET_SIZE_EXCEEDS_BUFFER, \"packet size longer than send buffer\")\n\n\t// responder and decryption\n\tErrCloseConnection                = newError(C.ERR_NHP_CLOSE_CONNECTION, \"disengage nhp access immediately\")\n\tErrIncorrectPacketSize            = newError(C.ERR_NHP_INCORRECT_PACKET_SIZE, \"incorrect packet size\")\n\tErrMessageTypeNotMatchDevice      = newError(C.ERR_NHP_MESSAGE_TYPE_NOT_MATCH_DEVICE, \"message type does not match device\")\n\tErrServerOverload                 = newError(C.ERR_NHP_SERVER_OVERLOAD, \"the packet is dropped due to server overload\")\n\tErrHMACCheckFailed                = newError(C.ERR_NHP_HMAC_CHECK_FAILED, \"HMAC validation failed\")\n\tErrServerHMACCheckFailed          = newError(C.ERR_NHP_SERVER_HMAC_CHECK_FAILED, \"server HMAC validation failed\")\n\tErrDeviceECDHEphermalFailed       = newError(C.ERR_NHP_DEVICE_ECDH_EPHERMAL_FAILED, \"device ECDH failed with ephermal\")\n\tErrPeerIdentityVerificationFailed = newError(C.ERR_NHP_PEER_IDENTITY_VERIFICATION_FAILED, \"failed to verify peer's identity with apk\")\n\tErrAEADDecryptionFailed           = newError(C.ERR_NHP_AEAD_DECRYPTION_FAILED, \"aead decryption failed\")\n\tErrDataDecompressionFailed        = newError(C.ERR_NHP_DATA_DECOMPRESSION_FAILED, \"data decompression failed\")\n\tErrDeviceECDHObtainedPeerFailed   = newError(C.ERR_NHP_DEVICE_ECDH_OBTAINED_PEER_FAILED, \"device ECDH failed with obtained peer\")\n\tErrServerRejectWithCookie         = newError(C.ERR_NHP_SERVER_REJECT_WITH_COOKIE, \"server overload, stop processing packet and return cookie\")\n\tErrReplayPacketReceived           = newError(C.ERR_NHP_REPLAY_PACKET_RECEIVED, \"received replay packet, drop\")\n\tErrFloodPacketReceived            = newError(C.ERR_NHP_FLOOD_PACKET_RECEIVED, \"received flood packet, drop\")\n\tErrStalePacketReceived            = newError(C.ERR_NHP_STALE_PACKET_RECEIVED, \"received stale packet, drop\")\n)\n"
  },
  {
    "path": "nhp/core/initiator.go",
    "content": "package core\n\nimport (\n\t\"bytes\"\n\t\"compress/zlib\"\n\t\"crypto/cipher\"\n\t\"encoding/binary\"\n\t\"fmt\"\n\t\"hash\"\n\t\"net\"\n\t\"time\"\n\n\t\"github.com/OpenNHP/opennhp/nhp/common\"\n\t\"github.com/OpenNHP/opennhp/nhp/log\"\n)\n\ntype InitiatorScheme interface {\n\tCreateMsgAssemblerData(d *Device, md *MsgData) (mad *MsgAssemblerData, err error)\n\tDeriveMsgAssemblerDataFromPrevParserData(ppd *PacketParserData, t int, message []byte) (mad *MsgAssemblerData)\n\tSetPeerPublicKey(d *Device, mad *MsgAssemblerData, peerPk []byte) (err error)\n\tEncryptBody(d *Device, mad *MsgAssemblerData) (err error)\n}\n\ntype MsgData struct {\n\tRemoteAddr     *net.UDPAddr      // used by agent and ac create a new connection or pick an existing connection for msg sending\n\tConnData       *ConnectionData   // used by server to pick an existing connection for msg sending\n\tPrevParserData *PacketParserData // when PrevParserData is set, CipherScheme, RemoteAddr, ConnData, TransactionId and PeerPk will be overridden\n\tCipherScheme   int               // 0: sm2/sm4/sm3, 1: curve25519/chacha20/blake2s\n\tTransactionId  uint64\n\tHeaderType     int\n\tCompress       bool\n\tClPkc          bool // 0: non-CL-PKC extented, 1: CL-PKC extended\n\tExternalPacket *Packet\n\tExternalCookie *[CookieSize]byte\n\tMessage        []byte\n\tPeerPk         []byte\n\tEncryptedPktCh chan *MsgAssemblerData\n\tResponseMsgCh  chan *PacketParserData\n}\n\nfunc (d *Device) validateMsgData(md *MsgData) (err error) {\n\tif md.PrevParserData == nil {\n\t\tif d.deviceType == NHP_SERVER && md.ConnData == nil {\n\t\t\terr = fmt.Errorf(\"missing connection data for server\")\n\t\t} else if d.deviceType != NHP_SERVER && md.RemoteAddr == nil {\n\t\t\terr = fmt.Errorf(\"missing remote address\")\n\t\t}\n\n\t\tif md.PeerPk == nil {\n\t\t\terr = fmt.Errorf(\"missing remote peer public key\")\n\t\t}\n\t}\n\n\treturn err\n}\n\ntype MsgAssemblerData struct {\n\tdevice     *Device\n\tBasePacket *Packet\n\tconnData   *ConnectionData\n\tciphers    *CipherSuite\n\n\tdeviceEcdh     Ecdh\n\tephermeralEcdh Ecdh\n\theader         Header\n\thmacHash       hash.Hash\n\tchainHash      hash.Hash\n\tbodyAead       cipher.AEAD\n\tchainKey       [SymmetricKeySize]byte\n\n\tLocalInitTime int64\n\tTransactionId uint64\n\tnoise         NoiseFactory // int\n\tCipherScheme  int\n\tHeaderType    int\n\tBodySize      int\n\tHeaderFlag    uint16\n\tBodyCompress  bool\n\tClPkc         bool\n\n\tExternalCookie *[CookieSize]byte\n\tRemotePubKey   []byte\n\tbodyMessage    []byte\n\n\tencryptedPktCh chan<- *MsgAssemblerData\n\tResponseMsgCh  chan<- *PacketParserData\n\tError          error\n}\n\nfunc (d *Device) createMsgAssemblerData(md *MsgData) (mad *MsgAssemblerData, err error) {\n\tif md.PrevParserData != nil {\n\t\t// continue from previous received packet to form one transaction\n\t\tmad = md.PrevParserData.deriveMsgAssemblerData(md.HeaderType, md.Compress, md.Message)\n\t} else {\n\t\tmad = &MsgAssemblerData{}\n\t\tmad.device = d\n\t\tmad.CipherScheme = md.CipherScheme\n\t\tmad.HeaderType = md.HeaderType\n\t\tmad.RemotePubKey = md.PeerPk\n\t\tmad.BodyCompress = md.Compress\n\t\tmad.ClPkc = md.ClPkc\n\t\tmad.bodyMessage = md.Message\n\t\tmad.TransactionId = md.TransactionId\n\t\tmad.connData = md.ConnData\n\t\tmad.encryptedPktCh = md.EncryptedPktCh\n\n\t\t// init packet buffer\n\t\tif md.ExternalPacket != nil {\n\t\t\tmad.BasePacket = md.ExternalPacket\n\t\t} else {\n\t\t\tmad.BasePacket = d.AllocatePoolPacket()\n\t\t}\n\t\tmad.BasePacket.HeaderType = mad.HeaderType\n\n\t\t// init cookie if specified\n\t\tif md.ExternalCookie != nil {\n\t\t\tmad.ExternalCookie = md.ExternalCookie\n\t\t}\n\n\t\t// create header and init device ecdh\n\t\tlog.Info(\"start encryption using CIPHER_SCHEME_%d(0: CURVE; 1: GMSM.)\", mad.CipherScheme)\n\t\tmad.header = mad.BasePacket.HeaderWithCipherScheme(mad.CipherScheme)\n\t\tmad.ciphers = NewCipherSuite(mad.CipherScheme)\n\t\tmad.deviceEcdh = d.GetEcdhByCipherScheme(mad.CipherScheme)\n\n\t\t// init version\n\t\tmad.header.SetVersion(ProtocolVersionMajor, ProtocolVersionMinor)\n\n\t\t// init header counter\n\t\tmad.header.SetCounter(mad.TransactionId)\n\n\t\t// init chain hash -> ChainHash0\n\t\tmad.chainHash, err = NewHash(mad.ciphers.HashType)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to create chain hash: %w\", err)\n\t\t}\n\t\tmad.chainHash.Write([]byte(InitialHashString))\n\n\t\t// init chain key -> ChainKey0\n\t\tmad.noise.HashType = mad.ciphers.HashType\n\t\tmad.noise.MixKey(&mad.chainKey, mad.chainHash.Sum(nil), []byte(InitialChainKeyString))\n\t}\n\n\t// init timestamp\n\tmad.LocalInitTime = time.Now().UnixNano()\n\n\t// assign channel\n\tmad.ResponseMsgCh = md.ResponseMsgCh\n\n\t// init hmac hash -> HmacHash0\n\tmad.hmacHash, err = NewHash(mad.ciphers.HashType)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to create HMAC hash: %w\", err)\n\t}\n\tmad.hmacHash.Write([]byte(InitialHashString))\n\n\t// create ephermeral key\n\tephermalEccType := mad.ciphers.EccType\n\tmad.ephermeralEcdh = NewECDH(ephermalEccType)\n\tcopy(mad.header.EphermeralBytes(), mad.ephermeralEcdh.PublicKey())\n\n\treturn mad, nil\n}\n\nfunc (mad *MsgAssemblerData) derivePacketParserData(pkt *Packet, initTime int64) (ppd *PacketParserData) {\n\tppd = &PacketParserData{}\n\tppd.device = mad.device\n\tppd.basePacket = pkt\n\tppd.CipherScheme = mad.CipherScheme\n\tppd.ConnData = mad.connData\n\tppd.LocalInitTime = initTime\n\tppd.feedbackMsgCh = mad.ResponseMsgCh\n\n\t// init header and init device ecdh\n\tppd.HeaderFlag = ppd.basePacket.Flag()\n\tppd.header = ppd.basePacket.HeaderWithCipherScheme(ppd.CipherScheme)\n\tppd.Ciphers = NewCipherSuite(ppd.CipherScheme)\n\tppd.deviceEcdh = ppd.device.GetEcdhByCipherScheme(ppd.CipherScheme)\n\n\t// init chain hash -> ChainHash0\n\tvar err error\n\tppd.chainHash, err = NewHash(ppd.Ciphers.HashType)\n\tif err != nil {\n\t\t// This should never happen with valid CipherSuite parameters\n\t\tpanic(fmt.Sprintf(\"failed to create chain hash in derivePacketParserData: %v\", err))\n\t}\n\tppd.chainHash.Write([]byte(InitialHashString))\n\n\t// continue with initiator's chain key -> ChainKey4\n\tppd.noise.HashType = mad.ciphers.HashType\n\tcopy(ppd.chainKey[:], mad.chainKey[:])\n\n\treturn ppd\n}\n\nfunc (d *Device) createKeepalivePacket(md *MsgData) (mad *MsgAssemblerData, err error) {\n\tmad = &MsgAssemblerData{}\n\tmad.device = d\n\tmad.HeaderType = NHP_KPL\n\tmad.TransactionId = md.TransactionId\n\tmad.connData = md.ConnData\n\n\t// init packet buffer\n\tif md.ExternalPacket != nil {\n\t\tmad.BasePacket = md.ExternalPacket\n\t} else {\n\t\tmad.BasePacket = d.AllocatePoolPacket()\n\t}\n\tmad.BasePacket.HeaderType = NHP_KPL\n\n\t// create header\n\tmad.header = mad.BasePacket.HeaderWithCipherScheme(common.CIPHER_SCHEME_CURVE)\n\tmad.BasePacket.Content = mad.BasePacket.Buf[:mad.header.Size()]\n\n\t// init version\n\tmad.header.SetVersion(ProtocolVersionMajor, ProtocolVersionMinor)\n\n\t// init header counter\n\tmad.header.SetCounter(mad.TransactionId)\n\n\t// set header type and payload size\n\tmad.header.SetTypeAndPayloadSize(mad.HeaderType, 0)\n\n\treturn mad, nil\n}\n\nfunc (mad *MsgAssemblerData) setPeerPublicKey(peerPk []byte) (err error) {\n\t// override peer public key\n\tif peerPk != nil {\n\t\tmad.RemotePubKey = peerPk\n\t}\n\n\tif mad.RemotePubKey == nil {\n\t\tlog.Error(\"remote peer public key is not set\")\n\t\terr = ErrEmptyPeerPublicKey\n\t\treturn err\n\t}\n\n\tlenMismatch := false\n\tswitch mad.CipherScheme {\n\tcase common.CIPHER_SCHEME_CURVE:\n\t\tif len(mad.RemotePubKey) != PublicKeySize {\n\t\t\tlenMismatch = true\n\t\t}\n\n\tcase common.CIPHER_SCHEME_GMSM:\n\t\tif len(mad.RemotePubKey) != PublicKeySizeEx {\n\t\t\tlenMismatch = true\n\t\t}\n\tdefault:\n\t\tlog.Error(\"cipher scheme not implemented\") // should never get here\n\t\terr = ErrDeviceECDHPeerFailed\n\t\treturn err\n\t}\n\n\tif lenMismatch {\n\t\tlog.Error(\"remote peer public key length does not match cipher scheme\")\n\t\terr = ErrDeviceECDHPeerFailed\n\t\treturn err\n\t}\n\n\t// evolve hmac hash HmacHash0 -> HmacHash1\n\tmad.hmacHash.Write(mad.RemotePubKey)\n\n\t// evolve chain hash ChainHash0 -> ChainHash1\n\tmad.chainHash.Write(mad.RemotePubKey)\n\tmad.chainHash.Write(mad.ephermeralEcdh.PublicKey())\n\n\t// evolve chain key ChainKey0 -> ChainKey1 (ChainKey4 -> ChainKey5)\n\tmad.noise.MixKey(&mad.chainKey, mad.chainKey[:], mad.ephermeralEcdh.PublicKey())\n\n\t// init ephermeral shared key\n\tess := mad.ephermeralEcdh.SharedSecret(mad.RemotePubKey)\n\tif ess == nil {\n\t\tlog.Error(\"ephermal ECDH failed with peer\")\n\t\terr = ErrEphermalECDHPeerFailed\n\t\treturn err\n\t}\n\n\t// prepare key for aead\n\tvar key [SymmetricKeySize]byte\n\n\t// generate gcm key and encrypt device pubkey ChainKey1 -> ChainKey2 (ChainKey5 -> ChainKey6)\n\tmad.noise.KeyGen2(&mad.chainKey, &key, mad.chainKey[:], ess[:])\n\tSetZero(ess[:])\n\n\tvar aead cipher.AEAD\n\tvar static []byte\n\t// encrypt initiator's public key and evolve chainhash with the ciphertext\n\tswitch mad.CipherScheme {\n\tcase common.CIPHER_SCHEME_CURVE:\n\t\tfallthrough\n\tcase common.CIPHER_SCHEME_GMSM:\n\t\tfallthrough\n\tdefault:\n\t\taead, err = AeadFromKey(mad.ciphers.GcmType, &key)\n\t\tif err != nil {\n\t\t\tlog.Error(\"failed to create AEAD for static encryption: %v\", err)\n\t\t\treturn err\n\t\t}\n\t\tstatic = aead.Seal(mad.header.StaticBytes()[:0], mad.header.NonceBytes(), mad.deviceEcdh.PublicKey(), mad.chainHash.Sum(nil))\n\t}\n\n\t//log.Debug(\"encrypted pubkey: %v, output: %v\", mad.deviceEcdh.PublicKey(), static)\n\n\t// evolve chainhash ChainHash1 -> ChainHash2\n\tmad.chainHash.Write(static)\n\n\t// init shared key\n\tss := mad.deviceEcdh.SharedSecret(mad.RemotePubKey)\n\tif ss == nil {\n\t\tlog.Error(\"device ECDH failed with peer\")\n\t\terr = ErrDeviceECDHPeerFailed\n\t\treturn err\n\t}\n\n\t// generate gcm key and encrypt timestamp ChainKey2 -> ChainKey3 (ChainKey6 -> ChainKey7)\n\tmad.noise.KeyGen2(&mad.chainKey, &key, mad.chainKey[:], ss[:])\n\tSetZero(ss[:])\n\n\tvar tsBytes [TimestampSize]byte\n\tvar ts []byte\n\tbinary.BigEndian.PutUint64(tsBytes[:], uint64(mad.LocalInitTime))\n\n\tswitch mad.CipherScheme {\n\tcase common.CIPHER_SCHEME_CURVE:\n\t\tfallthrough\n\tcase common.CIPHER_SCHEME_GMSM:\n\t\tfallthrough\n\tdefault:\n\t\taead, err = AeadFromKey(mad.ciphers.GcmType, &key)\n\t\tif err != nil {\n\t\t\tlog.Error(\"failed to create AEAD for timestamp encryption: %v\", err)\n\t\t\treturn err\n\t\t}\n\t\tts = aead.Seal(mad.header.TimestampBytes()[:0], mad.header.NonceBytes(), tsBytes[:], mad.chainHash.Sum(nil))\n\t}\n\n\t// evolve chainhash ChainHash2 -> ChainHash3\n\tmad.chainHash.Write(ts)\n\n\t// generate gcm key for body encryption ChainKey3 -> ChainKey4 (ChainKey7 -> ChainKey8)\n\tmad.noise.KeyGen2(&mad.chainKey, &key, mad.chainKey[:], ts[:])\n\tmad.bodyAead, err = AeadFromKey(mad.ciphers.GcmType, &key)\n\tif err != nil {\n\t\tlog.Error(\"failed to create AEAD for body encryption: %v\", err)\n\t\treturn err\n\t}\n\n\treturn err\n}\n\nfunc (mad *MsgAssemblerData) encryptBody() (err error) {\n\tdefer func() {\n\t\t// clear secrets\n\t\tmad.chainHash.Reset()\n\t\tmad.chainHash = nil\n\t\tSetZero(mad.chainKey[:])\n\t}()\n\n\t// message body is empty, skip encryption. Set header and calculate HMAC\n\tif len(mad.bodyMessage) == 0 {\n\t\t// set header type and payload size\n\t\tmad.header.SetTypeAndPayloadSize(mad.HeaderType, 0)\n\t\t// set HMAC\n\t\tmad.addHMAC(mad.HeaderType == NHP_RKN)\n\t\tmad.BasePacket.Content = mad.BasePacket.Buf[:mad.header.Size()]\n\t\treturn nil\n\t}\n\n\tvar body []byte\n\n\tif mad.BodyCompress {\n\t\t// compress\n\t\tvar buf bytes.Buffer\n\t\tw := zlib.NewWriter(&buf)\n\n\t\t_, err = w.Write(mad.bodyMessage)\n\t\tw.Close()\n\t\tif err != nil {\n\t\t\tlog.Critical(\"message compression failed: %v\", err)\n\t\t\tErrDataCompressionFailed.SetExtraError(err)\n\t\t\terr = ErrDataCompressionFailed\n\t\t\treturn err\n\t\t}\n\t\tbody = buf.Bytes()\n\t\t//log.Debug(\"message compressed: %v -> %v\", mad.bodyMessage, body)\n\t\tmad.BodySize = len(body) + GCMTagSize\n\n\t\t// set header flag\n\t\tmad.HeaderFlag |= common.NHP_FLAG_COMPRESS\n\n\t} else {\n\t\t// no compress\n\t\tbody = mad.bodyMessage\n\t\tmad.BodySize = len(mad.bodyMessage) + GCMTagSize\n\t}\n\n\tif mad.ClPkc {\n\t\tmad.HeaderFlag |= common.NHP_FLAG_CL_PKC\n\t}\n\n\tif mad.BodySize > PacketBufferSize-mad.header.Size() {\n\t\tlog.Critical(\"message too long, send buffer exceeded\")\n\t\terr = ErrPacketSizeExceedsBuffer\n\t\treturn err\n\t}\n\n\t// set header flag\n\tmad.header.SetFlag(mad.HeaderFlag)\n\n\t// calculate total data length\n\tpacketLen := mad.header.Size() + mad.BodySize\n\n\t// set header type and payload size\n\tmad.header.SetTypeAndPayloadSize(mad.HeaderType, mad.BodySize)\n\n\t// set HMAC\n\tmad.addHMAC(mad.HeaderType == NHP_RKN)\n\n\t// encrypt body and write into mad.BasePacket.Buf space\n\tciphertext := mad.bodyAead.Seal(mad.BasePacket.Buf[mad.header.Size():mad.header.Size()], mad.header.NonceBytes(), body, mad.chainHash.Sum(nil))\n\t_ = ciphertext\n\t//log.Debug(\"encrypted body: %v, output: %v\", body, ciphertext)\n\n\t// set valid packet\n\tmad.BasePacket.Content = mad.BasePacket.Buf[:packetLen]\n\n\treturn nil\n}\n\n// must be called after header is filled\nfunc (mad *MsgAssemblerData) addHMAC(sumCookie bool) {\n\tdefer func() {\n\t\tmad.hmacHash.Reset()\n\t\tmad.hmacHash = nil\n\t}()\n\n\tlen := mad.header.Size() - HashSize\n\tmad.hmacHash.Write(mad.header.Bytes()[0:len])\n\n\tif sumCookie {\n\t\t// use specified cookie, otherwise use connection's cookie\n\t\tif mad.ExternalCookie != nil {\n\t\t\tmad.hmacHash.Write((*mad.ExternalCookie)[:])\n\t\t} else {\n\t\t\tmad.connData.Lock()\n\t\t\tmad.hmacHash.Write(mad.connData.CookieStore.CurrCookie[:])\n\t\t\tmad.connData.Unlock()\n\t\t}\n\t}\n\tmad.hmacHash.Sum(mad.header.HMACBytes()[:0])\n}\n\nfunc (mad *MsgAssemblerData) Destroy() {\n\tmad.device.ReleasePoolPacket(mad.BasePacket)\n\tif mad.hmacHash != nil {\n\t\tmad.hmacHash.Reset()\n\t\tmad.hmacHash = nil\n\t}\n\tif mad.chainHash != nil {\n\t\tmad.chainHash.Reset()\n\t\tmad.chainHash = nil\n\t}\n}\n"
  },
  {
    "path": "nhp/core/kdf.go",
    "content": "package core\n\nimport (\n\t\"crypto/hmac\"\n\t\"crypto/subtle\"\n\t\"hash\"\n)\n\ntype NoiseFactory struct {\n\tHashType HashTypeEnum\n}\n\nfunc (n *NoiseFactory) HMAC1(dst *[HashSize]byte, key, in0 []byte) {\n\tnewHash := func() hash.Hash {\n\t\th, err := NewHash(n.HashType)\n\t\tif err != nil {\n\t\t\tpanic(\"failed to create hash for HMAC: \" + err.Error())\n\t\t}\n\t\treturn h\n\t}\n\tmac := hmac.New(newHash, key)\n\tmac.Write(in0)\n\tmac.Sum(dst[:0])\n\tmac.Reset()\n}\n\nfunc (n *NoiseFactory) HMAC2(dst *[HashSize]byte, key, in0, in1 []byte) {\n\tnewHash := func() hash.Hash {\n\t\th, err := NewHash(n.HashType)\n\t\tif err != nil {\n\t\t\tpanic(\"failed to create hash for HMAC: \" + err.Error())\n\t\t}\n\t\treturn h\n\t}\n\tmac := hmac.New(newHash, key)\n\tmac.Write(in0)\n\tmac.Write(in1)\n\tmac.Sum(dst[:0])\n\tmac.Reset()\n}\n\nfunc (n *NoiseFactory) KeyGen1(dst0 *[HashSize]byte, key, input []byte) {\n\tn.HMAC1(dst0, key, input)\n\tn.HMAC1(dst0, dst0[:], []byte{0x1})\n}\n\nfunc (n *NoiseFactory) KeyGen2(dst0, dst1 *[HashSize]byte, key, input []byte) {\n\tvar prk [HashSize]byte\n\tn.HMAC1(&prk, key, input)\n\tn.HMAC1(dst0, prk[:], []byte{0x1})\n\tn.HMAC2(dst1, prk[:], dst0[:], []byte{0x2})\n\tSetZero(prk[:])\n}\n\nfunc (n *NoiseFactory) KeyGen3(dst0, dst1, dst2 *[HashSize]byte, key, input []byte) {\n\tvar prk [HashSize]byte\n\tn.HMAC1(&prk, key, input)\n\tn.HMAC1(dst0, prk[:], []byte{0x1})\n\tn.HMAC2(dst1, prk[:], dst0[:], []byte{0x2})\n\tn.HMAC2(dst2, prk[:], dst1[:], []byte{0x3})\n\tSetZero(prk[:])\n}\n\nfunc (n *NoiseFactory) MixKey(dst *[SymmetricKeySize]byte, key []byte, input []byte) {\n\tn.KeyGen1(dst, key, input)\n}\n\nfunc (n *NoiseFactory) MixHash(dst *[HashSize]byte, key []byte, input []byte) {\n\th, err := NewHash(n.HashType)\n\tif err != nil {\n\t\tpanic(\"failed to create hash for MixHash: \" + err.Error())\n\t}\n\th.Write(key)\n\th.Write(input)\n\th.Sum(dst[:0])\n\th.Reset()\n}\n\nfunc SetZero(arr []byte) {\n\tfor i := range arr {\n\t\tarr[i] = 0\n\t}\n}\n\nfunc IsZero(arr []byte) bool {\n\tfor _, b := range arr {\n\t\tr := subtle.ConstantTimeByteEq(b, 0)\n\t\tif r != 1 {\n\t\t\treturn false\n\t\t}\n\t}\n\treturn true\n}\n"
  },
  {
    "path": "nhp/core/main/main.go",
    "content": "package main\n\nimport \"fmt\"\n\nfunc main() {\n\tfmt.Println(\"this is a demo program\")\n}\n"
  },
  {
    "path": "nhp/core/main/nhpdevice.go",
    "content": "package main\n\n/*\n#include \"nhpdevicedef.h\"\n*/\nimport \"C\"\n\nimport (\n\t\"encoding/base64\"\n\t\"fmt\"\n\t\"unsafe\"\n\n\tcore \"github.com/OpenNHP/opennhp/nhp/core\"\n)\n\nvar devices map[string]*core.Device = make(map[string]*core.Device)\nvar handles map[uintptr]*core.Device = make(map[uintptr]*core.Device)\n\n// Release the memory of the string buffer generated by NHPSDK.\n//\n//export nhp_free_cstring\nfunc nhp_free_cstring(ptr *C.char) {\n\tC.free(unsafe.Pointer(ptr))\n}\n\n// Release the memory buffer of the nhpresult structure generated by NHPSDK.\n//\n//export nhp_free_NhpResult\nfunc nhp_free_NhpResult(ptr *C.NhpResult) {\n\tC.free(unsafe.Pointer(ptr.errMsg))\n\tC.free(unsafe.Pointer(ptr))\n}\n\n// Release the memory buffer of the NhpEncryptResult structure generated by NHPSDK.\n//\n//export nhp_free_NhpEncryptResult\nfunc nhp_free_NhpEncryptResult(ptr *C.NhpEncryptResult) {\n\tC.free(unsafe.Pointer(ptr.errMsg))\n\tC.free(unsafe.Pointer(ptr.packet))\n\tC.free(unsafe.Pointer(ptr))\n}\n\n// Release the memory buffer of the NhpDecryptResult structure generated by NHPSDK.\n//\n//export nhp_free_NhpDecryptResult\nfunc nhp_free_NhpDecryptResult(ptr *C.NhpDecryptResult) {\n\tC.free(unsafe.Pointer(ptr.errMsg))\n\tC.free(unsafe.Pointer(ptr.msgId))\n\tC.free(unsafe.Pointer(ptr.data))\n\tC.free(unsafe.Pointer(ptr))\n}\n\n// Initialize the nhp_device instance\n//\n// Input:\n// deviceType: The NHP component represented by this device: 1: nhp-agent, 2: nhp-server, 3: nhp-ac\n// privateKeyBase64: Base64 encoding of the private key\n//\n// Return:\n// NhpResult pointer:\n// errCode 0: nhp device instance initialization successful\n// Non-zero: nhp device instance initialization failed, errMsg: Error description\n//\n// Caller: Release the returned data after the call is completed, refer to the nhp_free_NhpResult function\n//\n//export nhp_device_init\nfunc nhp_device_init(deviceType C.int, privateKeyBase64 string) *C.NhpResult {\n\tresultPtr := (*C.NhpResult)(C.malloc(C.sizeof_NhpResult))\n\tC.memset(unsafe.Pointer(resultPtr), 0, C.sizeof_NhpResult)\n\n\tif _, found := devices[privateKeyBase64]; found {\n\t\tresultPtr.errCode = C.ERR_NHP_DEVICE_ALREADY_CREATED\n\t\tresultPtr.errMsg = C.CString(\"nhp device already created with the given key\")\n\t\treturn resultPtr\n\t}\n\n\tprivateKey, err := base64.StdEncoding.DecodeString(privateKeyBase64)\n\tif err != nil {\n\t\tresultPtr.errCode = C.ERR_NHP_CREATE_DEVICE_FAILED\n\t\tresultPtr.errMsg = C.CString(\"key invalid\")\n\t\treturn resultPtr\n\t}\n\n\tdevice := core.NewDevice(int(deviceType), privateKey, nil)\n\n\thandle := uintptr(unsafe.Pointer(device))\n\tdevices[privateKeyBase64] = device\n\thandles[handle] = device\n\tresultPtr.handle = C.size_t(handle)\n\treturn resultPtr\n}\n\n// Close nhp_device\n// Input:\n// handle: NHP device handle\n//\n//export nhp_device_close\nfunc nhp_device_close(handle uintptr) {\n\tdevice, found := handles[handle]\n\tif found {\n\t\tdelete(handles, handle)\n\t\tfor k, v := range devices {\n\t\t\tif v == device {\n\t\t\t\tdelete(devices, k)\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}\n}\n\n// Perform NHP noise encryption on the payload data (plaintext message) and generate an NHP encrypted message\n//\n// Input:\n// handle: NHP device handle\n// msgType: NHP message type\n// peerPbk: Peer public key\n// peerPbkLen: Length of peer public key\n// data: Plaintext payload\n// dataLen: Length of plaintext payload\n// params: Encryption parameters, refer to the NhpEncryptParams structure\n//\n// Return:\n// Pointer to NhpEncryptResult, refer to the NhpEncryptResult structure\n//\n// Caller: After calling, release the returned data, refer to the nhp_free_NhpEncryptResult function\n//\n//export nhp_device_encrypt_data\nfunc nhp_device_encrypt_data(handle uintptr, msgType C.int, peerPbk *C.uchar, peerPbkLen C.int, data *C.uchar, dataLen C.int, params C.NhpEncryptParams) *C.NhpEncryptResult {\n\tresultPtr := (*C.NhpEncryptResult)(C.malloc(C.sizeof_NhpEncryptResult))\n\tC.memset(unsafe.Pointer(resultPtr), 0, C.sizeof_NhpEncryptResult)\n\n\tdevice, found := handles[handle]\n\tif !found {\n\t\tresultPtr.errCode = C.ERR_NHP_DEVICE_NOT_INITIALIZED\n\t\tresultPtr.errMsg = C.CString(\"nhp device not initialized\")\n\t\treturn resultPtr\n\t}\n\n\tmd := &core.MsgData{\n\t\tHeaderType:     int(msgType),\n\t\tCipherScheme:   int(params.cipherScheme),\n\t\tPeerPk:         C.GoBytes(unsafe.Pointer(peerPbk), peerPbkLen),\n\t\tMessage:        C.GoBytes(unsafe.Pointer(data), dataLen),\n\t\tCompress:       params.compress != 0,\n\t\tTransactionId:  uint64(params.assignTransactionId),\n\t\tExternalCookie: (*[core.CookieSize]byte)(unsafe.Pointer(&params.cookie)),\n\t}\n\n\tmad, err := device.MsgToPacket(md)\n\tif err != nil {\n\t\tnhpError := err.(*core.Error)\n\t\tif nhpError != nil {\n\t\t\tresultPtr.errCode = C.int(nhpError.ErrorNumber())\n\t\t} else {\n\t\t\tresultPtr.errCode = -1\n\t\t}\n\t\tresultPtr.errMsg = C.CString(err.Error())\n\t} else {\n\t\tresultPtr.transactionId = C.ulonglong(mad.TransactionId)\n\t\tresultPtr.packet = (*C.uchar)(C.CBytes(mad.BasePacket.Content))\n\t\tresultPtr.packetLen = C.int(len(mad.BasePacket.Content))\n\t}\n\n\treturn resultPtr\n}\n\n// Perform NHP noise encryption on the payload data (plaintext message) and generate an NHP packet\n//\n// Input:\n// handle: NHP device handle\n// packet: NHP encrypted packet to be parsed\n// packetLen: Length of the NHP encrypted packet\n//\n// Returns:\n// Pointer to NhpDecryptResult, refer to the NhpDecryptResult structure\n//\n// Caller: Release the returned data after the call is complete, refer to the nhp_free_NhpDecryptResult function\n//\n//export nhp_device_decrypt_packet\nfunc nhp_device_decrypt_packet(handle uintptr, packet *C.uchar, packetLen C.int, context C.NhpConnContext) *C.NhpDecryptResult {\n\tresultPtr := (*C.NhpDecryptResult)(C.malloc(C.sizeof_NhpDecryptResult))\n\tC.memset(unsafe.Pointer(resultPtr), 0, C.sizeof_NhpDecryptResult)\n\n\tdevice, found := handles[handle]\n\tif !found {\n\t\tresultPtr.errCode = C.ERR_NHP_DEVICE_NOT_INITIALIZED\n\t\tresultPtr.errMsg = C.CString(\"nhp device not initialized\")\n\t\treturn resultPtr\n\t}\n\n\tvar cookieStore *core.CookieStore\n\tif context.cookieStore != nil {\n\t\tcookieStore = (*core.CookieStore)(unsafe.Pointer(context.cookieStore))\n\t}\n\n\tvar lastPeerSendTime *int64\n\tif context.lastPeerSendTime != nil {\n\t\tlastPeerSendTime = (*int64)(unsafe.Pointer(context.lastPeerSendTime))\n\t}\n\n\tvar peerPbk *[core.PublicKeySizeEx]byte\n\tif context.peerPbk != nil {\n\t\tpeerPbk = (*[core.PublicKeySizeEx]byte)(unsafe.Pointer(context.peerPbk))\n\t}\n\n\tpd := &core.PacketData{\n\t\tBasePacket:             &core.Packet{Content: C.GoBytes(unsafe.Pointer(packet), packetLen)},\n\t\tConnLastRemoteSendTime: lastPeerSendTime,\n\t\tConnCookieStore:        cookieStore,\n\t\tConnPeerPublicKey:      peerPbk,\n\t}\n\n\tppd, err := device.PacketToMsg(pd)\n\n\tif err != nil {\n\t\tnhpError := err.(*core.Error)\n\t\tif nhpError != nil {\n\t\t\tresultPtr.errCode = C.int(nhpError.ErrorNumber())\n\t\t} else {\n\t\t\tresultPtr.errCode = -1\n\t\t}\n\t\tresultPtr.errMsg = C.CString(err.Error())\n\t} else {\n\t\tresultPtr.msgType = C.int(ppd.HeaderType)\n\t\tif ppd.HeaderType != core.NHP_KPL {\n\t\t\tresultPtr.msgTransactionId = C.ulonglong(ppd.SenderTrxId)\n\t\t\tresultPtr.msgId = (*C.uchar)(C.CBytes(ppd.SenderIdentity))\n\t\t\tresultPtr.msgIdLen = C.int(len(ppd.SenderIdentity))\n\t\t\tresultPtr.data = (*C.uchar)(C.CBytes(ppd.BodyMessage))\n\t\t\tresultPtr.dataLen = C.int(len(ppd.BodyMessage))\n\t\t}\n\t}\n\n\treturn resultPtr\n}\n\n// Set overload mode for nhp device\n//\n// Input:\n// handle: Handle to the NHP device\n// overload: Boolean indicating whether to enable overload mode\n//\n// Return:\n// Pointer to NhpResult, refer to NhpResult structure\n//\n// Caller: Release the returned data after the call, refer to nhp_free_NhpResult function\n//\n//export nhp_device_set_overload\nfunc nhp_device_set_overload(handle uintptr, overload bool) *C.NhpResult {\n\tresultPtr := (*C.NhpResult)(C.malloc(C.sizeof_NhpResult))\n\tC.memset(unsafe.Pointer(resultPtr), 0, C.sizeof_NhpResult)\n\n\tdevice, found := handles[handle]\n\tif !found {\n\t\tresultPtr.errCode = C.ERR_NHP_DEVICE_NOT_INITIALIZED\n\t\tresultPtr.errMsg = C.CString(\"nhp device not initialized\")\n\t\treturn resultPtr\n\t}\n\n\tdevice.SetOverload(overload)\n\treturn resultPtr\n}\n\n// Perform SM4 AEAD encryption\n//\n// Input:\n// key: Key buffer\n// keyLen: Key length (the first 16 bytes are used)\n// nonce: Counter value buffer\n// nonceLen: Counter value length (must be 12 bytes)\n// plain: Plain text data\n// plainLen: Plain text length\n// additionalData: Additional authenticated data\n// additionalDataLen: Length of additional authenticated data\n//\n// Return:\n// Pointer to NhpEncryptResult, with the ciphertext represented by packet and packetLen\n//\n// Caller: After the function call, release the returned data, refer to the nhp_free_NhpEncryptResult function\n//\n//export nhp_sm4_aead_encrypt\nfunc nhp_sm4_aead_encrypt(key *C.uchar, keyLen C.int, nonce *C.uchar, nonceLen C.int, plain *C.uchar, plainLen C.int, additionalData *C.uchar, additionalDataLen C.int) *C.NhpEncryptResult {\n\tresultPtr := (*C.NhpEncryptResult)(C.malloc(C.sizeof_NhpEncryptResult))\n\tC.memset(unsafe.Pointer(resultPtr), 0, C.sizeof_NhpEncryptResult)\n\n\tvar aeadKey [core.SymmetricKeySize]byte\n\tbuf := make([]byte, plainLen+16)\n\tcopy(aeadKey[:], C.GoBytes(unsafe.Pointer(key), keyLen))\n\n\taead, err := core.AeadFromKey(core.GCM_SM4, &aeadKey)\n\tif err != nil {\n\t\tresultPtr.errCode = 1\n\t\tresultPtr.errMsg = C.CString(fmt.Sprintf(\"Failed to create AEAD: %s\", err))\n\t\treturn resultPtr\n\t}\n\tcipher := aead.Seal(buf[:0], C.GoBytes(unsafe.Pointer(nonce), nonceLen), C.GoBytes(unsafe.Pointer(plain), plainLen), C.GoBytes(unsafe.Pointer(additionalData), additionalDataLen))\n\tif cipher == nil {\n\t\tresultPtr.errCode = 1\n\t\tresultPtr.errMsg = C.CString(\"GCM encryption failed\")\n\t\treturn resultPtr\n\t}\n\n\tresultPtr.packet = (*C.uchar)(C.CBytes(cipher))\n\tresultPtr.packetLen = C.int(len(cipher))\n\treturn resultPtr\n}\n\n// Perform SM4 AEAD decryption\n//\n// Input:\n// key: Key buffer\n// keyLen: Key length (the first 16 bytes)\n// nonce: Counter value buffer (must be the same as the counter value during encryption)\n// nonceLen: Counter value length (must be 12 bytes)\n// cipher: Ciphertext data\n// cipherLen: Ciphertext length\n// additionalData: Additional verification data\n// additionalDataLen: Length of additional verification data\n//\n// Return:\n// Pointer to NhpDecryptResult, plaintext is represented by data and dataLen\n//\n// Caller: Release the returned data after the call is complete, refer to the nhp_free_NhpEncryptResult function\n//\n//export nhp_sm4_aead_decrypt\nfunc nhp_sm4_aead_decrypt(key *C.uchar, keyLen C.int, nonce *C.uchar, nonceLen C.int, cipher *C.uchar, cipherLen C.int, additionalData *C.uchar, additionalDataLen C.int) *C.NhpDecryptResult {\n\tresultPtr := (*C.NhpDecryptResult)(C.malloc(C.sizeof_NhpDecryptResult))\n\tC.memset(unsafe.Pointer(resultPtr), 0, C.sizeof_NhpDecryptResult)\n\n\tvar aeadKey [core.SymmetricKeySize]byte\n\tbuf := make([]byte, cipherLen)\n\tcopy(aeadKey[:], C.GoBytes(unsafe.Pointer(key), keyLen))\n\n\taead, err := core.AeadFromKey(core.GCM_SM4, &aeadKey)\n\tif err != nil {\n\t\tresultPtr.errCode = 1\n\t\tresultPtr.errMsg = C.CString(fmt.Sprintf(\"Failed to create AEAD: %s\", err))\n\t\treturn resultPtr\n\t}\n\tplain, err := aead.Open(buf[:0], C.GoBytes(unsafe.Pointer(nonce), nonceLen), C.GoBytes(unsafe.Pointer(cipher), cipherLen), C.GoBytes(unsafe.Pointer(additionalData), additionalDataLen))\n\tif err != nil {\n\t\tresultPtr.errCode = 1\n\t\tresultPtr.errMsg = C.CString(fmt.Sprintf(\"GCM decryption failed: %s\", err))\n\t\treturn resultPtr\n\t}\n\n\tresultPtr.data = (*C.uchar)(C.CBytes(plain))\n\tresultPtr.dataLen = C.int(len(plain))\n\treturn resultPtr\n}\n"
  },
  {
    "path": "nhp/core/main/nhpdevicedef.h",
    "content": "#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n#ifndef NHPDEVICEDEF_H\r\n#define NHPDEVICEDEF_H\r\n\r\n#include <stdlib.h>\r\n#include <string.h>\r\n#include <stdarg.h>\r\n\r\n#define NHP_COOKIE_SIZE 32\r\n#define NHP_PUBLIC_KEY_SIZE 64\r\n\r\ntypedef enum _NhpDeviceType {\r\n    NHP_AGENT = 1,\r\n    NHP_SERVER,\r\n    NHP_AC,\r\n} NhpDeviceType;\r\n\r\ntypedef enum _NhpCipherScheme {\r\n    NHP_CIPHER_SCHEME_CURVE,\r\n    NHP_CIPHER_SCHEME_GMSM,\r\n} NhpCipherScheme;\r\n\r\ntypedef enum _NhpMsgType {\r\n    NHP_KPL = 0, // general keepalive packet\r\n\tNHP_KNK,        // agent sends knock to server\r\n\tNHP_ACK,        // server replies knock status to agent\r\n\tNHP_AOP,        // server asks ac for operation\r\n\tNHP_ART,        // ac replies server for operation result\r\n\tNHP_LST,        // agent requests server for listing services and applications\r\n\tNHP_LRT,        // server replies to agent with services and applications result\r\n\tNHP_COK,        // server sends cookie to agent\r\n\tNHP_RKN,        // agent sends reknock to server\r\n\tNHP_RLY,        // relay sends relayed packet to server\r\n\tNHP_AOL,        // ac sends online status to server\r\n\tNHP_AAK,        // server sends ack to ac after receving ac's online status\r\n\tNHP_OTP,        // agent requests server for one-time-password\r\n\tNHP_REG,        // agent asks server for registering\r\n\tNHP_RAK,        // server sends back ack when agent registers correctly\r\n\tNHP_ACC,        // agent sends to ac/resource for actual ip access\r\n\tNHP_EXT,        // agent requests immediate disconnection\r\n} NhpMsgType;\r\n\r\ntypedef struct _NhpResult {\r\n   size_t handle; // The handle of the nhp device returned after initialization\r\n   int errCode;   // Error code: 0 for no error, non-zero values indicate errors\r\n   char *errMsg;  // Error message: NULL for no error, a value indicates an error description\r\n} NhpResult;\r\n\r\ntypedef struct _NhpEncryptParams {\r\n    // Specifies the encryption scheme used for the message:\r\n    // 0: curve25519/chacha20poly1305/blake2s\r\n    // 1: sm2/sm4/sm3\r\n    unsigned char cipherScheme;\r\n    // true: Use zlib to compress the plaintext message\r\n    unsigned char compress;\r\n    // reserved\r\n    unsigned char reserved0;\r\n    // reserved\r\n    unsigned char reserved1;\r\n    // If responding to a previously received NHP packet, this specifies the last transaction ID of the sender.\r\n    // if set to 0, a new transaction ID is generated locally\r\n    unsigned long long assignTransactionId;\r\n    // The cookie value specified by the remote peer for re-knocking.\r\n    // note: the device has a different cookie for each peer connection\r\n    unsigned char cookie[NHP_COOKIE_SIZE]; \r\n} NhpEncryptParams;\r\n\r\ntypedef struct _NhpEncryptResult {\r\n    int errCode;                        // Error code\r\n    int packetLen;                      // Packet length\r\n    unsigned long long transactionId;   // Local transaction ID\r\n    char *errMsg;                       // Error message\r\n    unsigned char *packet;              // Packet data\r\n} NhpEncryptResult;\r\n\r\ntypedef struct _NhpPubicKey {\r\n    unsigned char data[NHP_PUBLIC_KEY_SIZE];\r\n} NhpPubicKey;\r\n\r\ntypedef struct _NhpCookieStore {\r\n    unsigned char currCookie[NHP_COOKIE_SIZE];\r\n    unsigned char prevCookie[NHP_COOKIE_SIZE];\r\n    long long lastCookieTime;\r\n} NhpCookieStore;\r\n\r\ntypedef struct _NhpConnContext {\r\n    NhpPubicKey *peerPbk;\r\n    NhpCookieStore *cookieStore;\r\n    long long *lastPeerSendTime;\r\n} NhpConnContext;\r\n\r\ntypedef struct _NhpDecryptResult {\r\n    int errCode;                            // Error code\r\n    int msgType;                            // Message type\r\n    int msgIdLen;                           // Sender identification length\r\n    int dataLen;                            // Payload length\r\n    unsigned long long msgTransactionId;    // Message sender transaction ID\r\n    char *errMsg;                           // Error description\r\n    unsigned char *msgId;                   // Message sender identification\r\n    unsigned char *data;                    // Payload data\r\n} NhpDecryptResult;\r\n\r\ntypedef enum _NhpError {\r\n    // general\r\n    ERR_NHP_SUCCESS = 0,\r\n    ERR_NHP_DEVICE_NOT_INITIALIZED = 30000,\r\n    ERR_NHP_DEVICE_ALREADY_CREATED,\r\n    ERR_NHP_CIPHER_NOT_SUPPORTED,\r\n    ERR_NHP_OPERATION_NOT_APPLICABLE,\r\n    ERR_NHP_CREATE_DEVICE_FAILED,\r\n    ERR_NHP_CLOSE_DEVICE_FAILED,\r\n    ERR_NHP_SDK_RUNTIME_PANIC,\r\n\r\n    // encryption\r\n    ERR_NHP_WRONG_CIPHER_SCHEME = 31000,\r\n    ERR_NHP_EMPTY_PEER_PUBLIC_KEY,\r\n    ERR_NHP_EPHERMAL_ECDH_PEER_FAILED,\r\n    ERR_NHP_DEVICE_ECDH_PEER_FAILED,\r\n    ERR_NHP_IDENTITY_TOO_LONG,\r\n    ERR_NHP_DATA_COMPRESSION_FAILED,\r\n    ERR_NHP_PACKET_SIZE_EXCEEDS_BUFFER,\r\n\r\n    // decryption\r\n    ERR_NHP_CLOSE_CONNECTION = 32001,\r\n    ERR_NHP_INCORRECT_PACKET_SIZE,\r\n    ERR_NHP_MESSAGE_TYPE_NOT_MATCH_DEVICE,\r\n    ERR_NHP_SERVER_OVERLOAD,\r\n    ERR_NHP_HMAC_CHECK_FAILED,\r\n    ERR_NHP_SERVER_HMAC_CHECK_FAILED,\r\n    ERR_NHP_DEVICE_ECDH_EPHERMAL_FAILED,\r\n    ERR_NHP_PEER_IDENTITY_VERIFICATION_FAILED,\r\n    ERR_NHP_AEAD_DECRYPTION_FAILED,\r\n    ERR_NHP_DATA_DECOMPRESSION_FAILED,\r\n    ERR_NHP_DEVICE_ECDH_OBTAINED_PEER_FAILED,\r\n    ERR_NHP_SERVER_REJECT_WITH_COOKIE,\r\n    ERR_NHP_REPLAY_PACKET_RECEIVED,\r\n    ERR_NHP_FLOOD_PACKET_RECEIVED,\r\n    ERR_NHP_STALE_PACKET_RECEIVED,\r\n\r\n} NhpError;\r\n\r\n\r\n#endif // NHPDEVICEDEF_H\r\n#ifdef __cplusplus\r\n}\r\n#endif\r\n"
  },
  {
    "path": "nhp/core/packet.go",
    "content": "package core\n\nimport (\n\t\"encoding/binary\"\n\t\"fmt\"\n\t\"unsafe\"\n\n\t\"github.com/OpenNHP/opennhp/nhp/common\"\n\t\"github.com/OpenNHP/opennhp/nhp/core/scheme/curve\"\n\t\"github.com/OpenNHP/opennhp/nhp/core/scheme/gmsm\"\n\tlog \"github.com/OpenNHP/opennhp/nhp/log\"\n\tutils \"github.com/OpenNHP/opennhp/nhp/utils\"\n)\n\nconst (\n\tNHP_KPL = iota // general keepalive packet\n\tNHP_KNK        // agent sends knock to server\n\tNHP_ACK        // server replies knock status to agent\n\tNHP_AOP        // server asks ac for operation\n\tNHP_ART        // ac replies server for operation result\n\tNHP_LST        // agent requests server for listing services and applications\n\tNHP_LRT        // server replies to agent with services and applications result\n\tNHP_COK        // server sends cookie to agent\n\tNHP_RKN        // agent sends reknock to server\n\tNHP_RLY        // relay sends relayed packet to server\n\tNHP_AOL        // ac sends online status to server\n\tNHP_AAK        // server sends ack to ac after receiving ac's online status\n\tNHP_OTP        // agent requests server for one-time-password\n\tNHP_REG        // agent asks server for registering\n\tNHP_RAK        // server sends back ack when agent registers correctly\n\tNHP_ACC        // agent sends to ac/resource for actual ip access\n\tNHP_EXT        // agent requests immediate disconnection\n\t//DHP\n\tNHP_DRG // DB sends a message to register a data object file to the NHP Server\n\tNHP_DAK // NHP-Server sends a result of the NHP_DRG registration request to the DB.\n\tNHP_DAR // NHP Agent sends messages to get access to the file and then work with it.\n\tNHP_DAG // The NHP Server sends  the authorization status of the data object to NHP Agent.\n\tNHP_DSA // The NHP Server sends a self attestation requiestr to the NHP Agent\n\tNHP_DAV // The NHP Agent sends the attestation proof to the NHP Server.\n\tNHP_DWR // The NHP Server sends a request to the NHP DB to get the wrapping of the data private key\n\tNHP_DWA // The NHP DB sends the data private key to the NHP Server\n\tNHP_DOL // DB sends online status to server\n\tNHP_DBA // server send ack to db after receiving db's online status\n\tDHP_KNK // agent sends dhp knock to server\n)\n\nvar nhpHeaderTypeStrings []string = []string{\n\t\"NHP-KPL\", // general keepalive packet\n\t\"NHP-KNK\", // agent sends knock to server\n\t\"NHP-ACK\", // server replies knock status to agent\n\t\"NHP-AOP\", // server asks ac for operation\n\t\"NHP-ART\", // ac replies server for operation result\n\t\"NHP-LST\", // agent requests server for listing services and applications\n\t\"NHP-LRT\", // server replies to agent with services and applications result\n\t\"NHP-COK\", // server sends cookie to agent\n\t\"NHP-RKN\", // agent sends reknock to server\n\t\"NHP-RLY\", // relay sends relayed packet to server\n\t\"NHP-AOL\", // ac sends online status to server\n\t\"NHP-AAK\", // server sends ack to ac after receiving ac's online status\n\t\"NHP-OTP\", // agent requests server for one-time-password\n\t\"NHP-REG\", // agent asks server for registering\n\t\"NHP-RAK\", // server sends back ack when agent registers correctly\n\t\"NHP-ACC\", // agent sends to ac/resource for actual ip access\n\t\"NHP-EXT\", // agent requests immediate disconnection\n\t\"NHP_DRG\", //DB sends a message to register a data object file to the NHP Server\n\t\"NHP_DAK\", //NHP-Server sends a result of the NHP_DRG registration request to the DB.\n\t\"NHP_DAR\", //NHP Agent sends messages to get access to the file and then work with it.\n\t\"NHP_DAG\", //The NHP Server sends  the authorization status of the data object to NHP Agent.\n\t\"NHP_DSA\", //The NHP Server sends a self attestation request to the NHP Agent\n\t\"NHP_DAV\", //The NHP Agent sends the attestation proof to the NHP Server.\n\t\"NHP_DWR\", //The NHP Server sends a request to the NHP DB to get the wrapping of the data private key\n\t\"NHP_DWA\", //The NHP DB sends the data private key to the NHP Server\n\t\"NHP_DOL\", //DB sends online status to server\n\t\"NHP_DBA\", //server send ack to db after receiving db's online status\n\t\"DHP-KNK\", //agent sends dhp knock to server\n}\n\nfunc HeaderTypeToString(t int) string {\n\tif t >= 0 && t < len(nhpHeaderTypeStrings) {\n\t\treturn nhpHeaderTypeStrings[t]\n\t}\n\treturn \"UNKNOWN\"\n}\n\nfunc HeaderTypeToDeviceType(t int) int {\n\tswitch t {\n\tcase NHP_KNK, NHP_LST, NHP_RKN, NHP_OTP, NHP_REG, NHP_ACC, NHP_EXT:\n\t\treturn NHP_AGENT\n\tcase NHP_ACK, NHP_AOP, NHP_LRT, NHP_COK, NHP_AAK, NHP_RAK, NHP_DAK, NHP_DAG, NHP_DBA, NHP_DWR, NHP_DSA:\n\t\treturn NHP_SERVER\n\n\tcase NHP_AOL, NHP_ART:\n\t\treturn NHP_AC\n\n\tcase NHP_RLY:\n\t\treturn NHP_RELAY\n\tcase NHP_DRG, NHP_DOL, NHP_DWA:\n\t\treturn NHP_DB\n\tcase NHP_DAR, NHP_DAV, DHP_KNK:\n\t\treturn DHP_AGENT\n\t}\n\n\treturn NHP_NO_DEVICE\n}\n\ntype PacketBuffer = [PacketBufferSize]byte\n\n// packet buffer pool\ntype PacketBufferPool struct {\n\tpool *utils.WaitPool\n}\n\nfunc (bp *PacketBufferPool) Init(max uint32) {\n\tbp.pool = utils.NewWaitPool(max, func() any { return new(PacketBuffer) })\n}\n\n// must be called after Init()\nfunc (bp *PacketBufferPool) Get() *PacketBuffer {\n\treturn bp.pool.Get().(*PacketBuffer)\n}\n\n// must be called after Init()\nfunc (bp *PacketBufferPool) Put(packet *PacketBuffer) {\n\tbp.pool.Put(packet)\n}\n\ntype Packet struct {\n\tBuf           *PacketBuffer\n\tHeaderType    int\n\tPoolAllocated bool\n\tKeepAfterSend bool // only applicable for sending\n\tContent       []byte\n}\n\ntype Header interface {\n\tSetTypeAndPayloadSize(int, int)\n\tTypeAndPayloadSize() (int, int)\n\tSize() int\n\tSetVersion(int, int)\n\tVersion() (int, int)\n\tSetFlag(uint16)\n\tFlag() uint16\n\tSetCounter(uint64)\n\tCounter() uint64\n\tBytes() []byte\n\tNonceBytes() []byte\n\tEphermeralBytes() []byte\n\tStaticBytes() []byte\n\tTimestampBytes() []byte\n\tIdentityBytes() []byte\n\tHMACBytes() []byte\n\tCipherScheme() int\n}\n\nfunc (pkt *Packet) Flag() uint16 {\n\treturn binary.BigEndian.Uint16(pkt.Content[10:12])\n}\n\nfunc (pkt *Packet) Header() Header {\n\tif pkt.Flag()&common.NHP_FLAG_EXTENDEDLENGTH == 0 {\n\t\t//nolint:gosec // G103: Intentional unsafe pointer for zero-copy packet header access\n\t\treturn (*curve.HeaderCurve)(unsafe.Pointer(&pkt.Content[0]))\n\t} else {\n\t\tswitch pkt.Flag() & (0xF << 12) {\n\t\tcase common.NHP_FLAG_SCHEME_GMSM:\n\t\t\tfallthrough\n\t\tdefault:\n\t\t\t//nolint:gosec // G103: Intentional unsafe pointer for zero-copy packet header access\n\t\t\treturn (*gmsm.HeaderGmsm)(unsafe.Pointer(&pkt.Content[0]))\n\t\t}\n\t}\n}\n\nfunc (pkt *Packet) HeaderWithCipherScheme(cipherScheme int) Header {\n\tswitch cipherScheme {\n\tcase common.CIPHER_SCHEME_GMSM:\n\t\t//nolint:gosec // G103: Intentional unsafe pointer for zero-copy packet header access\n\t\treturn (*gmsm.HeaderGmsm)(unsafe.Pointer(&pkt.Content[0]))\n\tcase common.CIPHER_SCHEME_CURVE:\n\t\tfallthrough\n\tdefault:\n\t\t//nolint:gosec // G103: Intentional unsafe pointer for zero-copy packet header access\n\t\treturn (*curve.HeaderCurve)(unsafe.Pointer(&pkt.Content[0]))\n\t}\n}\n\nfunc (pkt *Packet) HeaderTypeAndSize() (t int, s int) {\n\tpreamble := binary.BigEndian.Uint32(pkt.Content[0:4])\n\ttns := preamble ^ binary.BigEndian.Uint32(pkt.Content[4:8])\n\tt = int((tns & 0xFFFF0000) >> 16)\n\ts = int(tns & 0x0000FFFF)\n\tpkt.HeaderType = t\n\n\treturn t, s\n}\n\nfunc (pkt *Packet) Counter() uint64 {\n\treturn binary.BigEndian.Uint64(pkt.Content[16:24])\n}\n\nfunc (pkt *Packet) MinimalLength() int {\n\treturn pkt.HeaderWithCipherScheme(common.CIPHER_SCHEME_CURVE).Size()\n}\n\n// Data Receiver  allowed message types\nfunc (d *Device) CheckRecvHeaderType(t int) bool {\n\t// NHP_KPL is handled elsewhere\n\tswitch d.deviceType {\n\tcase NHP_AGENT:\n\t\tswitch t {\n\t\tcase NHP_ACK, NHP_LRT, NHP_COK, NHP_RAK, NHP_DAG, NHP_DSA:\n\t\t\treturn true\n\t\t}\n\tcase NHP_SERVER:\n\t\tswitch t {\n\t\tcase NHP_REG, NHP_KNK, DHP_KNK, NHP_LST, NHP_RKN, NHP_EXT, NHP_ART, NHP_RLY, NHP_AOL, NHP_OTP, NHP_DRG, NHP_DAR, NHP_DAV, NHP_DOL, NHP_DWA:\n\t\t\treturn true\n\t\t}\n\tcase NHP_AC:\n\t\tswitch t {\n\t\tcase NHP_AOP, NHP_LRT, NHP_AAK:\n\t\t\treturn true\n\t\t}\n\tcase NHP_RELAY:\n\t\tswitch t {\n\t\tcase NHP_REG, NHP_KNK, NHP_ACK, NHP_LST, NHP_LRT, NHP_COK, NHP_RKN, NHP_EXT:\n\t\t\treturn true\n\t\t}\n\n\tcase NHP_DB:\n\t\tswitch t {\n\t\tcase NHP_DRG, NHP_DAG, NHP_DAK, NHP_DBA, NHP_DWR:\n\t\t\treturn true\n\t\t}\n\t}\n\tlog.Info(\"Device type: %d, recv header type %d not allowed\", d.deviceType, t)\n\treturn false\n}\n\nfunc (d *Device) RecvPrecheck(pkt *Packet) (int, int, error) {\n\theaderSize := pkt.Header().Size()\n\n\t// check type and payload size\n\tt, s := pkt.HeaderTypeAndSize()\n\tif t == NHP_KPL {\n\t\tif s == 0 {\n\t\t\treturn t, s, nil\n\t\t} else {\n\t\t\treturn t, s, fmt.Errorf(\"keepalive packet size is incorrect\")\n\t\t}\n\t}\n\tif !d.CheckRecvHeaderType(t) {\n\t\treturn t, s, fmt.Errorf(\"packet header type does not match device\")\n\t}\n\n\ttotalLen := len(pkt.Content)\n\tif totalLen != headerSize+s {\n\t\treturn t, s, fmt.Errorf(\"packet total size is incorrect\")\n\t}\n\n\treturn t, s, nil\n}\n\nfunc (d *Device) AllocatePoolPacket() *Packet {\n\tbuf := d.pool.Get()\n\treturn &Packet{Buf: buf, Content: buf[:], PoolAllocated: true}\n}\n\nfunc (d *Device) ReleasePoolPacket(pkt *Packet) {\n\tif pkt != nil && pkt.Buf != nil && pkt.PoolAllocated {\n\t\td.pool.Put(pkt.Buf)\n\t\tpkt.Buf = nil\n\t\tpkt.Content = nil\n\t}\n}\n"
  },
  {
    "path": "nhp/core/peer.go",
    "content": "package core\n\nimport (\n\t\"encoding/base64\"\n\t\"fmt\"\n\t\"net\"\n\t\"sync\"\n\t\"time\"\n)\n\ntype Peer interface {\n\tDeviceType() int\n\tName() string\n\tPublicKey() []byte\n\tPublicKeyBase64() string\n\n\tIsExpired() bool\n\n\tResolveHost() string\n\tResolvedIps() []string\n\tHost() string\n\tSendAddr() net.Addr\n\tLastSendTime() int64\n\tUpdateSend(currTime int64)\n\n\tRecvAddr() net.Addr\n\tLastRecvTime() int64\n\tUpdateRecv(currTime int64, currAddr net.Addr)\n\tCheckRecvAddress(currTime int64, currAddr net.Addr) bool\n}\n\ntype UdpPeer struct {\n\tsync.Mutex\n\n\t// immutable fields. Don't change them after creation, so no lock is required\n\tPubKeyBase64 string `json:\"pubKeyBase64\"`\n\tHostname     string `json:\"host,omitempty\"`\n\tIp           string `json:\"ip\"` // static ip, it may be different from primaryResolvedIp\n\tPort         int    `json:\"port\"`\n\tType         int    `json:\"type\"`\n\tExpireTime   int64  `json:\"expireTime\"`\n\tname         string\n\tpubKey       []byte\n\n\t// mutable fields\n\tlastSendTime                     int64\n\tlastRecvTime                     int64\n\tlastNSLookupTime                 int64\n\tresolvedIpArr                    []string\n\tprimaryResolvedIp                string\n\trecvAddr                         *net.UDPAddr\n\tteePublicKeyBase64               string\n\tconsumerEphemeralPublicKeyBase64 string\n}\n\nfunc (p *UdpPeer) DeviceType() DeviceTypeEnum {\n\treturn p.Type\n}\n\nfunc (p *UdpPeer) PublicKey() []byte {\n\tp.Lock()\n\tdefer p.Unlock()\n\n\tif p.pubKey == nil {\n\t\tp.pubKey, _ = base64.StdEncoding.DecodeString(p.PubKeyBase64)\n\t}\n\treturn p.pubKey\n}\n\nfunc (p *UdpPeer) PublicKeyBase64() string {\n\treturn p.PubKeyBase64\n}\n\nfunc (p *UdpPeer) Name() string {\n\tp.Lock()\n\tdefer p.Unlock()\n\n\tif len(p.name) == 0 {\n\t\t// Safely handle short or empty PubKeyBase64 strings\n\t\tif len(p.PubKeyBase64) >= 43 {\n\t\t\tp.name = fmt.Sprintf(\"%s...%s\", p.PubKeyBase64[0:4], p.PubKeyBase64[39:43])\n\t\t} else if len(p.PubKeyBase64) > 0 {\n\t\t\t// For short keys, use what we have\n\t\t\tp.name = p.PubKeyBase64\n\t\t} else {\n\t\t\tp.name = \"unknown\"\n\t\t}\n\t}\n\treturn p.name\n}\n\nfunc (p *UdpPeer) ResolveHost() string {\n\tif len(p.Hostname) == 0 {\n\t\treturn p.Ip\n\t}\n\n\tp.Lock()\n\tdefer p.Unlock()\n\n\tcurrTime := time.Now().UnixNano()\n\tif currTime-p.lastNSLookupTime > MinimalNSLookupInterval*int64(time.Second) {\n\t\taddrs, err := net.LookupHost(p.Hostname)\n\t\tif err == nil {\n\t\t\tp.lastNSLookupTime = currTime\n\t\t\tp.resolvedIpArr = addrs\n\t\t\tp.primaryResolvedIp = addrs[0]\n\t\t}\n\t}\n\n\tif len(p.primaryResolvedIp) > 0 {\n\t\treturn p.primaryResolvedIp\n\t}\n\treturn p.Ip\n}\n\nfunc (p *UdpPeer) Host() string {\n\thostAddr := p.Ip\n\tif len(p.Hostname) > 0 {\n\t\thostAddr = p.Hostname\n\t}\n\tif p.Port == 0 {\n\t\treturn hostAddr\n\t}\n\treturn fmt.Sprintf(\"%s:%d\", hostAddr, p.Port)\n}\n\nfunc (p *UdpPeer) SendAddr() net.Addr {\n\tresolvedIp := p.ResolveHost() // happens only when MinimalNSLookupInterval has passed\n\tip := net.ParseIP(resolvedIp)\n\n\tif ip == nil {\n\t\treturn nil\n\t}\n\treturn &net.UDPAddr{\n\t\tIP:   ip,\n\t\tPort: p.Port,\n\t}\n}\n\nfunc (p *UdpPeer) ResolvedIps() []string {\n\tp.Lock()\n\tdefer p.Unlock()\n\n\treturn p.resolvedIpArr\n}\n\nfunc (p *UdpPeer) IsExpired() bool {\n\tp.Lock()\n\tdefer p.Unlock()\n\n\t// p.ExpireTime is in seconds\n\treturn p.ExpireTime > 0 && time.Now().UnixMilli() > p.ExpireTime*1000\n}\n\nfunc (p *UdpPeer) LastSendTime() int64 {\n\tp.Lock()\n\tdefer p.Unlock()\n\n\treturn p.lastSendTime\n}\n\nfunc (p *UdpPeer) UpdateSend(currTime int64) {\n\tp.Lock()\n\tdefer p.Unlock()\n\n\tp.lastSendTime = currTime\n}\n\n// a peer should not have multiple layer-4 addresses within its hold time\nfunc (p *UdpPeer) CheckRecvAddress(currTime int64, currAddr net.Addr) bool {\n\tp.Lock()\n\tdefer p.Unlock()\n\n\tif currTime > p.lastRecvTime+MinimalPeerAddressHoldTime*int64(time.Second) {\n\t\treturn true\n\t}\n\n\tif p.recvAddr.String() == currAddr.String() {\n\t\treturn true\n\t}\n\n\treturn false\n}\n\nfunc (p *UdpPeer) RecvAddr() net.Addr {\n\tp.Lock()\n\tdefer p.Unlock()\n\n\treturn p.recvAddr\n}\n\nfunc (p *UdpPeer) LastRecvTime() int64 {\n\tp.Lock()\n\tdefer p.Unlock()\n\n\treturn p.lastRecvTime\n}\n\nfunc (p *UdpPeer) UpdateRecv(currTime int64, currAddr net.Addr) {\n\tp.Lock()\n\tdefer p.Unlock()\n\n\tp.lastRecvTime = currTime\n\tp.recvAddr = currAddr.(*net.UDPAddr)\n}\n\nfunc (p *UdpPeer) TeePublicKeyBase64() string {\n\tp.Lock()\n\tdefer p.Unlock()\n\n\treturn p.teePublicKeyBase64\n}\n\nfunc (p *UdpPeer) SetTeePublicKeyBase64(teePublicKeyBase64 string) {\n\tp.Lock()\n\tdefer p.Unlock()\n\n\tp.teePublicKeyBase64 = teePublicKeyBase64\n}\n\nfunc (p *UdpPeer) ConsumerEphemeralPublicKeyBase64() string {\n\tp.Lock()\n\tdefer p.Unlock()\n\n\treturn p.consumerEphemeralPublicKeyBase64\n}\n\nfunc (p *UdpPeer) SetConsumerEphemeralPublicKeyBase64(consumerEphemeralPublicKeyBase64 string) {\n\tp.Lock()\n\tdefer p.Unlock()\n\n\tp.consumerEphemeralPublicKeyBase64 = consumerEphemeralPublicKeyBase64\n}\n"
  },
  {
    "path": "nhp/core/responder.go",
    "content": "package core\n\nimport (\n\t\"bytes\"\n\t\"compress/zlib\"\n\t\"crypto/cipher\"\n\t\"encoding/base64\"\n\t\"encoding/binary\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"hash\"\n\t\"io\"\n\t\"sync/atomic\"\n\t\"time\"\n\n\tcommon \"github.com/OpenNHP/opennhp/nhp/common\"\n\tlog \"github.com/OpenNHP/opennhp/nhp/log\"\n)\n\ntype ResponderScheme interface {\n\tCreatePacketParserData(d *Device, pd *PacketData) (ppd *PacketParserData, err error)\n\tDerivePacketParserDataFromPrevAssemblerData(mad *MsgAssemblerData, pkt *Packet, initTime int64) (ppd *PacketParserData)\n\tvalidatePeer(d *Device, ppd *PacketParserData) (err error)\n\tdecryptBody(d *Device, ppd *PacketParserData) (err error)\n}\n\ntype CookieStore struct {\n\tCurrCookie     [CookieSize]byte\n\tPrevCookie     [CookieSize]byte\n\tLastCookieTime int64\n}\n\nfunc (cs *CookieStore) Set(cookie []byte) {\n\tcopy(cs.PrevCookie[:], cs.CurrCookie[:])\n\tcopy(cs.CurrCookie[:], cookie)\n}\n\nfunc (cs *CookieStore) Clear() {\n\tSetZero(cs.CurrCookie[:])\n\tSetZero(cs.PrevCookie[:])\n}\n\ntype PacketData struct {\n\tBasePacket             *Packet\n\tConnData               *ConnectionData\n\tPrevAssemblerData      *MsgAssemblerData\n\tConnLastRemoteSendTime *int64\n\tConnCookieStore        *CookieStore\n\tConnPeerPublicKey      *[PublicKeySizeEx]byte\n\tInitTime               int64\n\tDecryptedMsgCh         chan *PacketParserData\n}\n\ntype PacketParserData struct {\n\tdevice       *Device\n\tbasePacket   *Packet\n\tConnData     *ConnectionData\n\tCipherScheme int\n\tCiphers      *CipherSuite\n\n\tdeviceEcdh Ecdh\n\theader     Header\n\thmacHash   hash.Hash\n\tchainHash  hash.Hash\n\tbodyAead   cipher.AEAD\n\tchainKey   [SymmetricKeySize]byte\n\n\tLocalInitTime int64\n\tSenderTrxId   uint64\n\n\tnoise        NoiseFactory // int\n\tHeaderType   int\n\tBodySize     int\n\tHeaderFlag   uint16\n\tBodyCompress bool\n\tOverload     bool\n\n\tSenderIdentity         []byte\n\tSenderMidPublicKey     []byte\n\tConnLastRemoteSendTime *int64\n\tConnCookieStore        *CookieStore\n\tConnPeerPublicKey      *[PublicKeySizeEx]byte\n\tRemotePubKey           []byte\n\tBodyMessage            []byte\n\n\tdecryptedMsgCh chan<- *PacketParserData //Plaintext payload dispatched (Decryption cycle completed)\n\tfeedbackMsgCh  chan<- *PacketParserData\n\tError          error\n}\n\nfunc (d *Device) createPacketParserData(pd *PacketData) (ppd *PacketParserData, err error) {\n\tif pd.PrevAssemblerData != nil {\n\t\tppd = pd.PrevAssemblerData.derivePacketParserData(pd.BasePacket, pd.InitTime)\n\t} else {\n\t\tppd = &PacketParserData{}\n\t\tppd.device = d\n\t\tppd.basePacket = pd.BasePacket\n\t\tppd.ConnData = pd.ConnData\n\t\tppd.ConnCookieStore = pd.ConnCookieStore\n\t\tppd.LocalInitTime = pd.InitTime\n\t\tppd.ConnLastRemoteSendTime = pd.ConnLastRemoteSendTime\n\t\tppd.ConnPeerPublicKey = pd.ConnPeerPublicKey\n\t\tppd.decryptedMsgCh = pd.DecryptedMsgCh\n\n\t\t// init header and init device ecdh\n\t\tppd.HeaderFlag = ppd.basePacket.Flag()\n\t\tppd.header = ppd.basePacket.Header()\n\t\tppd.CipherScheme = ppd.header.CipherScheme()\n\t\tlog.Info(\"start decryption using CIPHER_SCHEME_%d(0: CURVE; 1: GMSM.)\", ppd.CipherScheme)\n\t\tppd.Ciphers = NewCipherSuite(ppd.CipherScheme)\n\t\tppd.deviceEcdh = d.GetEcdhByCipherScheme(ppd.CipherScheme)\n\n\t\t// init chain hash -> ChainHash0\n\t\tppd.chainHash, err = NewHash(ppd.Ciphers.HashType)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to create chain hash: %w\", err)\n\t\t}\n\t\tppd.chainHash.Write([]byte(InitialHashString))\n\n\t\t// init chain key -> ChainKey0\n\t\tppd.noise.HashType = ppd.Ciphers.HashType\n\t\tppd.noise.MixKey(&ppd.chainKey, ppd.chainHash.Sum(nil), []byte(InitialChainKeyString))\n\t}\n\n\tppd.HeaderType, ppd.BodySize = ppd.header.TypeAndPayloadSize()\n\n\t// init hmac hash -> HmacHash0\n\tppd.hmacHash, err = NewHash(ppd.Ciphers.HashType)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to create HMAC hash: %w\", err)\n\t}\n\tppd.hmacHash.Write([]byte(InitialHashString))\n\n\t// evolve hmac hash HmacHash0 -> HmacHash1\n\tppd.hmacHash.Write(ppd.deviceEcdh.PublicKey())\n\n\t// check hmac\n\tif ppd.device.deviceType == NHP_SERVER {\n\t\t// server overload handling\n\t\toverload := ppd.device.IsOverload()\n\t\tif overload {\n\t\t\t// overload, further discard unwanted packet type\n\t\t\tppd.Overload = true\n\t\t\tif !ppd.IsAllowedAtOverload() {\n\t\t\t\tlog.Critical(\"discard packet type %d due to overload\", ppd.HeaderType)\n\t\t\t\terr = ErrServerOverload\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\n\t\t// for RKN, check HMAC with cookie. For remaining allowed key messages, check HMAC without cookie.\n\t\tsumCookie := overload && ppd.HeaderType == NHP_RKN\n\t\tif !ppd.checkHMAC(sumCookie) {\n\t\t\tlog.Error(\"HMAC validation failed on server side. sumCookie: %v\", sumCookie)\n\t\t\terr = ErrServerHMACCheckFailed\n\t\t\treturn\n\t\t}\n\n\t} else {\n\t\tif !ppd.checkHMAC(false) {\n\t\t\tlog.Error(\"HMAC validation failed.\")\n\t\t\terr = ErrHMACCheckFailed\n\t\t\treturn\n\t\t}\n\t}\n\n\t// get sender id\n\tppd.SenderTrxId = ppd.header.Counter()\n\n\t// init body message\n\tppd.BodyCompress = ppd.HeaderFlag&common.NHP_FLAG_COMPRESS != 0\n\tppd.BodyMessage = nil\n\n\treturn ppd, nil\n}\n\nfunc (ppd *PacketParserData) deriveMsgAssemblerData(t int, compress bool, message []byte) (mad *MsgAssemblerData) {\n\tmad = &MsgAssemblerData{}\n\tmad.device = ppd.device\n\tmad.connData = ppd.ConnData\n\tmad.HeaderType = t\n\tmad.ciphers = ppd.Ciphers\n\tmad.CipherScheme = ppd.CipherScheme\n\tmad.RemotePubKey = ppd.RemotePubKey\n\tmad.BodyCompress = compress\n\tmad.bodyMessage = message\n\n\t// init packet buffer\n\tmad.BasePacket = mad.device.AllocatePoolPacket()\n\tmad.BasePacket.HeaderType = t\n\n\t// create header and init device ecdh\n\tmad.header = mad.BasePacket.HeaderWithCipherScheme(mad.CipherScheme)\n\tmad.deviceEcdh = mad.device.GetEcdhByCipherScheme(mad.CipherScheme)\n\n\t// continue with the sender's counter\n\tmad.header.SetCounter(ppd.SenderTrxId)\n\n\t// init chain hash -> ChainHash0\n\tvar err error\n\tmad.chainHash, err = NewHash(mad.ciphers.HashType)\n\tif err != nil {\n\t\t// This should never happen with valid CipherSuite parameters\n\t\tpanic(fmt.Sprintf(\"failed to create chain hash in deriveMsgAssemblerData: %v\", err))\n\t}\n\tmad.chainHash.Write([]byte(InitialHashString))\n\n\t// continue with responder's chain key -> ChainKey4\n\tmad.noise.HashType = ppd.Ciphers.HashType\n\tcopy(mad.chainKey[:], ppd.chainKey[:])\n\n\treturn mad\n}\n\nfunc shouldCheckRecvAttack(deviceType int, peerType int, msgType int) bool {\n\tif (deviceType == NHP_SERVER && peerType == NHP_AC && msgType == NHP_ART) ||\n\t\t(deviceType == NHP_AC && peerType == NHP_SERVER && msgType == NHP_AOP) {\n\t\treturn false\n\t}\n\n\treturn true\n}\n\nfunc (ppd *PacketParserData) validatePeer() (err error) {\n\n\tlog.Debug(\"headType:%s,validatePeer pubkey: %s,EphermeralBytes:%s\", HeaderTypeToString(ppd.HeaderType), base64.StdEncoding.EncodeToString(ppd.deviceEcdh.PublicKey()),\n\t\tbase64.StdEncoding.EncodeToString(ppd.header.EphermeralBytes()))\n\t// evolve chain hash ChainHash0 -> ChainHash1\n\tppd.chainHash.Write(ppd.deviceEcdh.PublicKey())\n\tppd.chainHash.Write(ppd.header.EphermeralBytes())\n\n\t// evolve chain key ChainKey0 -> ChainKey1 (ChainKey4 -> ChainKey5)\n\tppd.noise.MixKey(&ppd.chainKey, ppd.chainKey[:], ppd.header.EphermeralBytes())\n\t// get ephermeral shared key\n\tess := ppd.deviceEcdh.SharedSecret(ppd.header.EphermeralBytes())\n\tif ess == nil {\n\t\tlog.Error(\"device ECDH failed with ephermal\")\n\t\terr = ErrDeviceECDHEphermalFailed\n\t\treturn err\n\t}\n\n\t// prepare key for aead\n\tvar key [SymmetricKeySize]byte\n\tvar aead cipher.AEAD\n\n\t// generate gcm key and decrypt device pubkey ChainKey1 -> ChainKey2 (ChainKey5 -> ChainKey6)\n\tppd.noise.KeyGen2(&ppd.chainKey, &key, ppd.chainKey[:], ess[:])\n\tSetZero(ess[:])\n\tpeerPk := make([]byte, PublicKeySizeEx)\n\tswitch ppd.CipherScheme {\n\tcase common.CIPHER_SCHEME_CURVE:\n\t\tfallthrough\n\tcase common.CIPHER_SCHEME_GMSM:\n\t\tfallthrough\n\tdefault:\n\t\tKeyByteSlice := key[:]\n\t\tlog.Debug(\"ppd.Ciphers.GcmType:%d,&key:%s,NonceBytes:%s,StaticBytes:%s\", ppd.Ciphers.GcmType, base64.StdEncoding.EncodeToString(KeyByteSlice), base64.StdEncoding.EncodeToString(ppd.header.NonceBytes()), base64.StdEncoding.EncodeToString(ppd.header.StaticBytes()))\n\t\taead, err = AeadFromKey(ppd.Ciphers.GcmType, &key)\n\t\tif err != nil {\n\t\t\tlog.Error(\"failed to create AEAD for peer pubkey decryption: %v\", err)\n\t\t\treturn err\n\t\t}\n\t\t_, err = aead.Open(peerPk[:0], ppd.header.NonceBytes(), ppd.header.StaticBytes(), ppd.chainHash.Sum(nil))\n\t\tif err != nil {\n\t\t\tlog.Error(\"failed to decrypt peer pubkey\")\n\t\t\treturn err\n\t\t}\n\t}\n\n\tif ppd.CipherScheme == common.CIPHER_SCHEME_CURVE {\n\t\tpeerPk = peerPk[:PublicKeySize]\n\t}\n\n\t//log.Debug(\"decrypted pubkey: %v, input: %v\", peerPk, ppd.header.StaticBytes())\n\n\t// validate peer public key if they already exists in peer pool\n\t// also validate peer address if it has been changed\n\t// NOTE: to relieve ac from managing arbitrary agent peers,\n\t// ac does not validate nor store agent public key. Related msgtype: NHP_ACC.\n\tvar peer Peer\n\tvar toValidate bool\n\tvar peerDeviceType int\n\n\tppd.device.optionMutex.Lock()\n\toption := ppd.device.option\n\tppd.device.optionMutex.Unlock()\n\n\tpeerDeviceType = HeaderTypeToDeviceType(ppd.HeaderType)\n\tswitch peerDeviceType {\n\tcase NHP_AGENT:\n\t\ttoValidate = !option.DisableAgentPeerValidation\n\n\tcase NHP_SERVER:\n\t\ttoValidate = !option.DisableServerPeerValidation\n\n\tcase NHP_AC:\n\t\ttoValidate = !option.DisableACPeerValidation\n\n\tcase NHP_RELAY:\n\t\ttoValidate = !option.DisableRelayPeerValidation\n\tcase NHP_DB:\n\t\ttoValidate = !option.DisableDePeerValidation\n\tcase DHP_AGENT:\n\t\ttoValidate = !option.DisableAgentPeerValidation\n\t}\n\n\tif toValidate {\n\t\tpeer = ppd.device.LookupPeer(peerPk)\n\t\tif peer == nil {\n\t\t\tlog.Error(\"peer not found in peer pool\")\n\t\t\terr = fmt.Errorf(\"peer not found in peer pool\")\n\t\t\treturn err\n\t\t}\n\n\t\tif peer.IsExpired() {\n\t\t\tlog.Error(\"peer expired\")\n\t\t\terr = fmt.Errorf(\"peer expired\")\n\t\t\treturn err\n\t\t}\n\n\t\tif !peer.CheckRecvAddress(ppd.LocalInitTime, ppd.ConnData.RemoteAddr) {\n\t\t\tlog.Error(\"peer does not match its previous address\")\n\t\t\terr = fmt.Errorf(\"peer does not match its previous address\")\n\t\t\treturn err\n\t\t}\n\t\tpeer.UpdateRecv(ppd.LocalInitTime, ppd.ConnData.RemoteAddr)\n\t}\n\n\tppd.RemotePubKey = peerPk\n\tif ppd.ConnPeerPublicKey != nil {\n\t\tcopy((*ppd.ConnPeerPublicKey)[:], peerPk)\n\t}\n\n\t// evolve chainhash ChainHash1 -> ChainHash2\n\tppd.chainHash.Write(ppd.header.StaticBytes())\n\n\t// init shared key\n\tss := ppd.deviceEcdh.SharedSecret(peerPk)\n\tif ss == nil {\n\t\tlog.Error(\"device ECDH failed with obtained peer\")\n\t\terr = ErrDeviceECDHObtainedPeerFailed\n\t\treturn err\n\t}\n\n\t// generate gcm key and decrypt timestamp ChainKey2 -> ChainKey3 (ChainKey6 -> ChainKey7)\n\tppd.noise.KeyGen2(&ppd.chainKey, &key, ppd.chainKey[:], ss[:])\n\tSetZero(ss[:])\n\n\tvar tsBytes [TimestampSize]byte\n\tswitch ppd.CipherScheme {\n\tcase common.CIPHER_SCHEME_CURVE:\n\t\tfallthrough\n\tcase common.CIPHER_SCHEME_GMSM:\n\t\tfallthrough\n\tdefault:\n\t\taead, err = AeadFromKey(ppd.Ciphers.GcmType, &key)\n\t\tif err != nil {\n\t\t\tlog.Error(\"failed to create AEAD for timestamp decryption: %v\", err)\n\t\t\treturn err\n\t\t}\n\t\t_, err = aead.Open(tsBytes[:0], ppd.header.NonceBytes(), ppd.header.TimestampBytes(), ppd.chainHash.Sum(nil))\n\t\tif err != nil {\n\t\t\tlog.Error(\"failed to decrypt timestamp\")\n\t\t\treturn err\n\t\t}\n\t}\n\n\tremoteSendTime := int64(binary.BigEndian.Uint64(tsBytes[:]))\n\n\tif shouldCheckRecvAttack(ppd.device.deviceType, peerDeviceType, ppd.HeaderType) {\n\t\t// block remote if threat level is reached\n\t\tif remoteSendTime < ppd.ConnData.LastRemoteSendTime {\n\t\t\t// replay packet, drop\n\t\t\tlog.Critical(\"received replay packet from %s, drop packet\", ppd.ConnData.RemoteAddr.String())\n\t\t\t// threat plus 1\n\t\t\tthreat := atomic.AddInt32(&ppd.ConnData.RecvThreatCount, 1)\n\t\t\t// with high queue number, the device may use ConnData channels when conn is already closed\n\t\t\tif threat > ThreatCountBeforeBlock && !ppd.ConnData.IsClosed() {\n\t\t\t\t// clamp threat count to avoid overflow\n\t\t\t\tatomic.StoreInt32(&ppd.ConnData.RecvThreatCount, ThreatCountBeforeBlock)\n\t\t\t\t// block source address\n\t\t\t\tppd.ConnData.SendBlockSignal()\n\t\t\t}\n\t\t\terr = fmt.Errorf(\"received replay packet\")\n\t\t\treturn err\n\t\t}\n\t\tif remoteSendTime < ppd.ConnData.LastRemoteSendTime+MinimalRecvIntervalMs*int64(time.Millisecond) {\n\t\t\t// flood packet, drop\n\t\t\tlog.Critical(\"received flood packet from %s, drop packet\", ppd.ConnData.RemoteAddr.String())\n\t\t\t// threat plus 1\n\t\t\tthreat := atomic.AddInt32(&ppd.ConnData.RecvThreatCount, 1)\n\t\t\tif threat > ThreatCountBeforeBlock && !ppd.ConnData.IsClosed() {\n\t\t\t\t// clamp threat count to avoid overflow\n\t\t\t\tatomic.StoreInt32(&ppd.ConnData.RecvThreatCount, ThreatCountBeforeBlock)\n\t\t\t\t// block source address\n\t\t\t\tppd.ConnData.SendBlockSignal()\n\t\t\t}\n\t\t\terr = fmt.Errorf(\"received flood packet\")\n\t\t\treturn err\n\t\t}\n\t}\n\tif remoteSendTime < (ppd.LocalInitTime - 600*int64(time.Second)) {\n\t\t// send remote timestamp is too old than receive local time, drop\n\t\t// note there might be time calibration error between remote and local devices\n\t\tlog.Critical(\"received stale packet from %s, drop packet\", ppd.ConnData.RemoteAddr.String())\n\t\tthreat := atomic.AddInt32(&ppd.ConnData.RecvThreatCount, 1)\n\t\tif threat > ThreatCountBeforeBlock && !ppd.ConnData.IsClosed() {\n\t\t\t// clamp threat count to avoid overflow\n\t\t\tatomic.StoreInt32(&ppd.ConnData.RecvThreatCount, ThreatCountBeforeBlock)\n\t\t\t// block source address\n\t\t\tppd.ConnData.SendBlockSignal()\n\t\t}\n\t\terr = fmt.Errorf(\"received stale packet\")\n\t\treturn err\n\t}\n\n\t// update remote last send time\n\tatomic.StoreInt64(&ppd.ConnData.LastRemoteSendTime, remoteSendTime)\n\t// clear threat\n\tatomic.StoreInt32(&ppd.ConnData.RecvThreatCount, 0)\n\n\t// handle knock packet at overload before going into body decryption\n\tif ppd.device.deviceType == NHP_SERVER && ppd.Overload && (ppd.HeaderType == NHP_KNK || ppd.HeaderType == DHP_KNK) {\n\t\tswitch ppd.CipherScheme {\n\t\tcase common.CIPHER_SCHEME_CURVE:\n\t\t\tfallthrough\n\t\tcase common.CIPHER_SCHEME_GMSM:\n\t\t\tfallthrough\n\t\tdefault:\n\t\t\tppd.generateCookie()\n\t\t\tppd.sendCookie()\n\t\t\terr = ErrServerRejectWithCookie\n\t\t}\n\n\t\treturn err\n\t}\n\n\t// evolve chainhash ChainHash2 -> ChainHash3\n\tppd.chainHash.Write(ppd.header.TimestampBytes())\n\n\t// generate gcm key for body decryption ChainKey3 -> ChainKey4 (ChainKey7 -> ChainKey8)\n\tppd.noise.KeyGen2(&ppd.chainKey, &key, ppd.chainKey[:], ppd.header.TimestampBytes())\n\tppd.bodyAead, err = AeadFromKey(ppd.Ciphers.GcmType, &key)\n\tif err != nil {\n\t\tlog.Error(\"failed to create AEAD for body decryption: %v\", err)\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\nfunc (ppd *PacketParserData) decryptBody() (err error) {\n\tdefer func() {\n\t\t// clear secrets\n\t\tppd.chainHash.Reset()\n\t\tppd.chainHash = nil\n\t\tSetZero(ppd.chainKey[:])\n\t}()\n\n\t// message body is empty, skip decryption\n\tif len(ppd.basePacket.Content) == ppd.header.Size() {\n\t\treturn nil\n\t}\n\n\t// decrypt body and reuse ppd.BasePacket.Content space\n\tbody, err := ppd.bodyAead.Open(ppd.basePacket.Content[ppd.header.Size():ppd.header.Size()], ppd.header.NonceBytes(), ppd.basePacket.Content[ppd.header.Size():], ppd.chainHash.Sum(nil))\n\tif err != nil {\n\t\tlog.Critical(\"decrypt body failed: %v\", err)\n\t\tErrAEADDecryptionFailed.SetExtraError(err)\n\t\terr = ErrAEADDecryptionFailed\n\t\treturn err\n\t}\n\n\t//log.Debug(\"decrypted body: %v, input: %v\", body, ppd.basePacket.Content[ppd.header.Size():])\n\n\t// Note: ppd.BodyMessage must be a separate []byte slice because ppd.BasePacket.Buf will be released later\n\tif ppd.BodyCompress {\n\t\t// decompress with size limit to prevent decompression bombs\n\t\tvar buf bytes.Buffer\n\t\tbr := bytes.NewReader(body)\n\t\tr, err := zlib.NewReader(br)\n\t\tif err != nil {\n\t\t\tlog.Critical(\"invalid compressed data: %v\", err)\n\t\t\tErrDataDecompressionFailed.SetExtraError(err)\n\t\t\treturn ErrDataDecompressionFailed\n\t\t}\n\t\tdefer r.Close()\n\n\t\t// Limit decompressed size to 10MB to prevent DoS via decompression bomb\n\t\tconst maxDecompressedSize = 10 * 1024 * 1024\n\t\tlimitedReader := io.LimitReader(r, maxDecompressedSize+1) // +1 to detect overflow\n\t\tn, err := io.Copy(&buf, limitedReader)\n\t\tif err != nil {\n\t\t\tlog.Critical(\"message decompression failed: %v\", err)\n\t\t\tErrDataDecompressionFailed.SetExtraError(err)\n\t\t\treturn ErrDataDecompressionFailed\n\t\t}\n\t\tif n > maxDecompressedSize {\n\t\t\tlog.Critical(\"decompressed data exceeds maximum size limit (%d bytes)\", maxDecompressedSize)\n\t\t\tErrDataDecompressionFailed.SetExtraError(fmt.Errorf(\"decompressed size %d exceeds limit %d\", n, maxDecompressedSize))\n\t\t\treturn ErrDataDecompressionFailed\n\t\t}\n\n\t\tppd.BodyMessage = buf.Bytes() // separately allocated memory\n\t\t//log.Debug(\"message decompressed %v -> %v\", body, ppd.BodyMessage)\n\t} else {\n\t\tppd.BodyMessage = append(ppd.BodyMessage, body...) // deep copy\n\t}\n\n\treturn nil\n}\n\nfunc (ppd *PacketParserData) makeCookieStore(cookieStore *CookieStore) *CookieStore {\n\tif cookieStore != nil {\n\t\tvar tsBytes [TimestampSize]byte\n\t\tcurrTime := time.Now().UnixNano()\n\t\tif (currTime - cookieStore.LastCookieTime) > CookieRegenerateTime*int64(time.Second) {\n\t\t\tcopy(cookieStore.PrevCookie[:], cookieStore.CurrCookie[:])\n\t\t\tbinary.BigEndian.PutUint64(tsBytes[:], uint64(currTime))\n\t\t\tppd.noise.KeyGen1(&cookieStore.CurrCookie, ppd.header.EphermeralBytes(), tsBytes[:])\n\t\t\tcookieStore.LastCookieTime = currTime\n\t\t}\n\t\treturn cookieStore\n\t}\n\n\treturn nil\n}\n\nfunc (ppd *PacketParserData) generateCookie() {\n\tvar tsBytes [TimestampSize]byte\n\tcurrTime := time.Now().UnixNano()\n\n\tppd.ConnData.Lock()\n\tdefer ppd.ConnData.Unlock()\n\n\tif (currTime - ppd.ConnData.CookieStore.LastCookieTime) > CookieRegenerateTime*int64(time.Second) {\n\t\tcopy(ppd.ConnData.CookieStore.PrevCookie[:], ppd.ConnData.CookieStore.CurrCookie[:])\n\t\tbinary.BigEndian.PutUint64(tsBytes[:], uint64(currTime))\n\t\tppd.noise.KeyGen1(&ppd.ConnData.CookieStore.CurrCookie, ppd.header.EphermeralBytes(), tsBytes[:])\n\t\tppd.ConnData.CookieStore.LastCookieTime = currTime\n\t}\n}\n\nfunc (ppd *PacketParserData) sendCookie() {\n\tcokStr := base64.StdEncoding.EncodeToString(ppd.ConnData.CookieStore.CurrCookie[:])\n\tcokMsg := &common.ServerCookieMsg{\n\t\tTransactionId: ppd.SenderTrxId,\n\t\tCookie:        cokStr,\n\t}\n\tcokBytes, _ := json.Marshal(cokMsg)\n\n\tmd := &MsgData{\n\t\tHeaderType:    NHP_COK,\n\t\tCipherScheme:  ppd.CipherScheme,\n\t\tTransactionId: ppd.device.NextCounterIndex(),\n\t\tCompress:      true,\n\t\tConnData:      ppd.ConnData,\n\t\tPeerPk:        ppd.RemotePubKey,\n\t\tMessage:       cokBytes,\n\t}\n\n\tlog.Debug(\"Send cookie back to %s: %s \", ppd.ConnData.RemoteAddr, string(md.Message))\n\tppd.device.SendMsgToPacket(md)\n}\n\nfunc (ppd *PacketParserData) checkHMAC(sumCookie bool) bool {\n\tdefer func() {\n\t\tppd.hmacHash.Reset()\n\t\tppd.hmacHash = nil\n\t}()\n\n\tlen := ppd.header.Size() - HashSize\n\tppd.hmacHash.Write(ppd.header.Bytes()[0:len])\n\n\tif sumCookie {\n\t\tswitch ppd.CipherScheme {\n\t\tcase common.CIPHER_SCHEME_CURVE:\n\t\t\tfallthrough\n\t\tcase common.CIPHER_SCHEME_GMSM:\n\t\t\tfallthrough\n\t\tdefault:\n\t\t\tppd.ConnData.Lock()\n\t\t\tdefer ppd.ConnData.Unlock()\n\n\t\t\tif ppd.LocalInitTime < ppd.ConnData.CookieStore.LastCookieTime+CookieRoundTripTimeMs*int64(time.Millisecond) {\n\t\t\t\t// cookie has already or nearly been updated, use previous cookie\n\t\t\t\tppd.hmacHash.Write(ppd.ConnData.CookieStore.PrevCookie[:])\n\t\t\t\tprevCookieHmac := ppd.hmacHash.Sum(nil)\n\t\t\t\treturn bytes.Equal(prevCookieHmac, ppd.header.HMACBytes())\n\t\t\t} else {\n\t\t\t\t// use current cookie\n\t\t\t\tppd.hmacHash.Write(ppd.ConnData.CookieStore.CurrCookie[:])\n\t\t\t\tcookieHmac := ppd.hmacHash.Sum(nil)\n\t\t\t\treturn bytes.Equal(cookieHmac, ppd.header.HMACBytes())\n\t\t\t}\n\t\t}\n\t} else {\n\t\tcalculatedHmac := ppd.hmacHash.Sum(nil)\n\t\treturn bytes.Equal(calculatedHmac, ppd.header.HMACBytes())\n\t}\n}\n\nfunc (ppd *PacketParserData) Destroy() {\n\tppd.device.ReleasePoolPacket(ppd.basePacket)\n\tif ppd.hmacHash != nil {\n\t\tppd.hmacHash.Reset()\n\t\tppd.hmacHash = nil\n\t}\n\tif ppd.chainHash != nil {\n\t\tppd.chainHash.Reset()\n\t\tppd.chainHash = nil\n\t}\n}\n\nfunc (ppd *PacketParserData) IsAllowedAtOverload() bool {\n\tswitch ppd.HeaderType {\n\tcase NHP_KNK, DHP_KNK, NHP_RKN, NHP_EXT, NHP_AOL, NHP_ART:\n\t\treturn true\n\tdefault:\n\t\treturn false\n\t}\n}\n"
  },
  {
    "path": "nhp/core/scheme/curve/curve.go",
    "content": "package curve\n\nimport (\n\t\"crypto/rand\"\n\t\"encoding/base64\"\n\t\"fmt\"\n\n\t\"golang.org/x/crypto/curve25519\"\n)\n\nconst (\n\tPrivateKeySize = 32\n\tPublicKeySize  = 32\n)\n\ntype Curve25519ECDH struct {\n\tPrivKey       [PrivateKeySize]byte\n\tPubKey        [PublicKeySize]byte\n\tPrivKeyBase64 string\n\tPubKeyBase64  string\n\tBriefName     string\n}\n\nfunc (c *Curve25519ECDH) SetPrivateKey(prk []byte) (err error) {\n\tif len(prk) < PrivateKeySize {\n\t\treturn fmt.Errorf(\"private key too short: got %d bytes, need %d\", len(prk), PrivateKeySize)\n\t}\n\tcopy(c.PrivKey[:], prk[:PrivateKeySize])\n\tpbk, err := curve25519.X25519(c.PrivKey[:], curve25519.Basepoint)\n\tif err != nil {\n\t\treturn err\n\t}\n\tcopy(c.PubKey[:], pbk)\n\tc.PrivKeyBase64 = base64.StdEncoding.EncodeToString(c.PrivKey[:])\n\tc.PubKeyBase64 = base64.StdEncoding.EncodeToString(c.PubKey[:])\n\tc.BriefName = fmt.Sprintf(\"%s...%s\", c.PubKeyBase64[0:4], c.PubKeyBase64[39:43])\n\n\treturn nil\n}\n\nfunc (c *Curve25519ECDH) PrivateKey() []byte {\n\treturn c.PrivKey[:]\n}\n\nfunc (c *Curve25519ECDH) PrivateKeyBase64() string {\n\treturn c.PrivKeyBase64\n}\n\nfunc (c *Curve25519ECDH) PublicKey() []byte {\n\treturn c.PubKey[:]\n}\n\nfunc (c *Curve25519ECDH) PublicKeyBase64() string {\n\treturn c.PubKeyBase64\n}\n\nfunc (c *Curve25519ECDH) SharedSecret(pbk []byte) []byte {\n\tif len(pbk) != PublicKeySize {\n\t\treturn nil\n\t}\n\n\tsk, err := curve25519.X25519(c.PrivKey[:], pbk)\n\tif err != nil {\n\t\treturn nil\n\t}\n\n\t// 32 bytes key\n\treturn sk[:]\n}\n\nfunc (c *Curve25519ECDH) Name() string {\n\treturn c.BriefName\n}\n\nfunc (c *Curve25519ECDH) Identity() []byte {\n\treturn nil\n}\n\nfunc (c *Curve25519ECDH) MidPublicKey() []byte {\n\treturn nil\n}\n\nfunc NewECDH() *Curve25519ECDH {\n\tkey := make([]byte, PrivateKeySize)\n\t_, err := rand.Read(key)\n\tif err != nil {\n\t\treturn nil\n\t}\n\t// clamp\n\tkey[0] &= 248\n\tkey[31] = (key[31] & 127) | 64\n\tvar c Curve25519ECDH\n\tif err := c.SetPrivateKey(key); err != nil {\n\t\treturn nil\n\t}\n\n\treturn &c\n}\n"
  },
  {
    "path": "nhp/core/scheme/curve/header.go",
    "content": "package curve\n\nimport (\n\t\"encoding/binary\"\n\t\"unsafe\"\n\n\t\"github.com/OpenNHP/opennhp/nhp/common\"\n\tutils \"github.com/OpenNHP/opennhp/nhp/utils\"\n)\n\nconst (\n\tHeaderCommonSize    = 24\n\tHashSize            = 32\n\tGCMNonceSize        = 12\n\tGCMTagSize          = 16\n\tTimestampSize       = 8\n\tMaximumIdentitySize = 64\n\tHeaderSize          = HeaderCommonSize + PublicKeySize + MaximumIdentitySize + GCMTagSize + PublicKeySize + GCMTagSize + TimestampSize + GCMTagSize + HashSize\n)\n\ntype HeaderCurve struct {\n\tHeaderCommon [HeaderCommonSize]byte\n\tEphermeral   [PublicKeySize]byte\n\tIdentity     [MaximumIdentitySize + GCMTagSize]byte\n\tStatic       [PublicKeySize + GCMTagSize]byte\n\tTimestamp    [TimestampSize + GCMTagSize]byte\n\tHMAC         [HashSize]byte\n}\n\n// curve header implementations\nfunc (h *HeaderCurve) TypeAndPayloadSize() (t int, s int) {\n\tpreamble := binary.BigEndian.Uint32(h.HeaderCommon[0:4])\n\ttns := preamble ^ binary.BigEndian.Uint32(h.HeaderCommon[4:8])\n\tt = int((tns & 0xFFFF0000) >> 16)\n\ts = int(tns & 0x0000FFFF)\n\treturn t, s\n}\n\nfunc (h *HeaderCurve) SetTypeAndPayloadSize(t int, s int) {\n\tpreamble := utils.GetRandomUint32()\n\t//nolint:gosec // G115: Values are masked to 16 bits before conversion, preventing overflow\n\tt32 := uint32((t & 0x0000FFFF) << 16)\n\t//nolint:gosec // G115: Values are masked to 16 bits before conversion, preventing overflow\n\ts32 := uint32(s & 0x0000FFFF)\n\ttns := preamble ^ (s32 | t32)\n\tbinary.BigEndian.PutUint32(h.HeaderCommon[0:4], preamble)\n\tbinary.BigEndian.PutUint32(h.HeaderCommon[4:8], tns)\n}\n\nfunc (h *HeaderCurve) Size() int {\n\treturn HeaderSize\n}\n\nfunc (h *HeaderCurve) Version() (int, int) {\n\tmajor := h.HeaderCommon[8]\n\tminor := h.HeaderCommon[9]\n\treturn int(major), int(minor)\n}\n\nfunc (h *HeaderCurve) SetVersion(major int, minor int) {\n\t//nolint:gosec // G115: Protocol version values are always 0-255 by design\n\th.HeaderCommon[8] = uint8(major & 0xFF)\n\t//nolint:gosec // G115: Protocol version values are always 0-255 by design\n\th.HeaderCommon[9] = uint8(minor & 0xFF)\n}\n\nfunc (h *HeaderCurve) Flag() uint16 {\n\treturn binary.BigEndian.Uint16(h.HeaderCommon[10:12])\n}\n\nfunc (h *HeaderCurve) SetFlag(flag uint16) {\n\tflag &= ^uint16(common.NHP_FLAG_EXTENDEDLENGTH)\n\tflag &= 0x0FFF\n\tbinary.BigEndian.PutUint16(h.HeaderCommon[10:12], flag)\n}\n\nfunc (h *HeaderCurve) NonceBytes() []byte {\n\tvar nonce [GCMNonceSize]byte\n\tcopy(nonce[4:GCMNonceSize], h.HeaderCommon[16:24])\n\treturn nonce[:]\n}\n\nfunc (h *HeaderCurve) SetCounter(counter uint64) {\n\tbinary.BigEndian.PutUint64(h.HeaderCommon[16:24], counter)\n}\n\nfunc (h *HeaderCurve) Counter() uint64 {\n\treturn binary.BigEndian.Uint64(h.HeaderCommon[16:24])\n}\n\nfunc (h *HeaderCurve) Bytes() []byte {\n\t//nolint:gosec // G103: Intentional unsafe pointer for zero-copy header serialization\n\tpHeader := (*[HeaderSize]byte)(unsafe.Pointer(&h.HeaderCommon))\n\treturn pHeader[:]\n}\n\nfunc (h *HeaderCurve) EphermeralBytes() []byte {\n\treturn h.Ephermeral[:]\n}\n\nfunc (h *HeaderCurve) StaticBytes() []byte {\n\treturn h.Static[:]\n}\n\nfunc (h *HeaderCurve) TimestampBytes() []byte {\n\treturn h.Timestamp[:]\n}\n\nfunc (h *HeaderCurve) IdentityBytes() []byte {\n\treturn h.Identity[:]\n}\n\nfunc (h *HeaderCurve) HMACBytes() []byte {\n\treturn h.HMAC[:]\n}\n\nfunc (h *HeaderCurve) CipherScheme() int {\n\treturn common.CIPHER_SCHEME_CURVE\n}\n"
  },
  {
    "path": "nhp/core/scheme/curve/responder.go",
    "content": "package curve\n"
  },
  {
    "path": "nhp/core/scheme/gmsm/gmsm.go",
    "content": "package gmsm\n\nimport (\n\t\"crypto/ecdsa\"\n\t\"crypto/rand\"\n\t\"encoding/base64\"\n\t\"fmt\"\n\t\"math/big\"\n\n\t\"github.com/emmansun/gmsm/ecdh\"\n\t\"github.com/emmansun/gmsm/sm2\"\n)\n\nconst (\n\tPrivateKeySize = 32\n\tPublicKeySize  = 64\n)\n\ntype SM2ECDH struct {\n\tPrivKey       [PrivateKeySize]byte\n\tPubKey        [PublicKeySize]byte\n\tprvK          *ecdh.PrivateKey\n\tPrivKeyBase64 string\n\tPubKeyBase64  string\n\tBriefName     string\n}\n\nfunc (s *SM2ECDH) SetPrivateKey(prk []byte) (err error) {\n\tif len(prk) < PrivateKeySize {\n\t\treturn fmt.Errorf(\"private key too short: got %d bytes, need %d\", len(prk), PrivateKeySize)\n\t}\n\tcopy(s.PrivKey[:], prk[:PrivateKeySize])\n\ts.prvK, err = ecdh.P256().NewPrivateKey(prk)\n\tif err != nil {\n\t\treturn err\n\t}\n\tcopy(s.PubKey[:], s.prvK.PublicKey().Bytes()[1:1+PublicKeySize])\n\ts.PrivKeyBase64 = base64.StdEncoding.EncodeToString(s.PrivKey[:])\n\ts.PubKeyBase64 = base64.StdEncoding.EncodeToString(s.PubKey[:])\n\ts.BriefName = fmt.Sprintf(\"%s...%s\", s.PubKeyBase64[0:4], s.PubKeyBase64[39:43])\n\n\treturn nil\n}\n\nfunc (s *SM2ECDH) PrivateKey() []byte {\n\treturn s.PrivKey[:]\n}\n\nfunc (s *SM2ECDH) PrivateKeyBase64() string {\n\treturn s.PrivKeyBase64\n}\n\nfunc (s *SM2ECDH) PublicKey() []byte {\n\treturn s.PubKey[:]\n}\n\nfunc (s *SM2ECDH) PublicKeyBase64() string {\n\treturn s.PubKeyBase64\n}\n\nfunc (s *SM2ECDH) SharedSecret(pbk []byte) []byte {\n\tif len(pbk) != PublicKeySize {\n\t\treturn nil\n\t}\n\n\tvar pkBytes [1 + PublicKeySize]byte\n\tpkBytes[0] = 4 // uncompressed header\n\tcopy(pkBytes[1:1+PublicKeySize], pbk[:PublicKeySize])\n\n\tpubK, err := ecdh.P256().NewPublicKey(pkBytes[:])\n\tif err != nil {\n\t\treturn nil\n\t}\n\n\tsk, err := s.prvK.ECDH(pubK)\n\tif err != nil {\n\t\treturn nil\n\t}\n\n\t// 32 bytes key\n\treturn sk[:]\n}\n\nfunc (s *SM2ECDH) Name() string {\n\treturn s.BriefName\n}\n\nfunc (s *SM2ECDH) Identity() []byte {\n\treturn nil\n}\n\nfunc (c *SM2ECDH) MidPublicKey() []byte {\n\treturn nil\n}\n\nfunc NewECDH() *SM2ECDH {\n\tvar err error\n\tvar s SM2ECDH\n\ts.prvK, err = ecdh.P256().GenerateKey(rand.Reader)\n\tif err != nil {\n\t\treturn nil\n\t}\n\tcopy(s.PrivKey[:], s.prvK.Bytes())\n\tcopy(s.PubKey[:], s.prvK.PublicKey().Bytes()[1:1+PublicKeySize])\n\ts.PrivKeyBase64 = base64.StdEncoding.EncodeToString(s.PrivKey[:])\n\ts.PubKeyBase64 = base64.StdEncoding.EncodeToString(s.PubKey[:])\n\ts.BriefName = fmt.Sprintf(\"%s...%s\", s.PubKeyBase64[0:4], s.PubKeyBase64[39:43])\n\treturn &s\n}\n\n// Generate SM2 public and private key pairs for ECDH.\nfunc GenerateSM2ECDHKeypair() (string, string) {\n\tvar err error\n\tvar pubKey [64]byte\n\tvar privKey [32]byte\n\n\tpKey, err := ecdh.P256().GenerateKey(rand.Reader)\n\tif err != nil {\n\t\treturn \"\", \"\"\n\t}\n\tcopy(privKey[:32], pKey.Bytes()[:32])             // Private Key 32 bytes\n\tcopy(pubKey[:64], pKey.PublicKey().Bytes()[1:65]) // Public Key 64 bytes\n\n\treturn base64.StdEncoding.EncodeToString(pubKey[:]),\n\t\tbase64.StdEncoding.EncodeToString(privKey[:])\n}\n\nfunc Base64DecodeSM2ECDHPrivateKey(privStr string) (*ecdh.PrivateKey, error) {\n\tprivKeyBytes, err := base64.StdEncoding.DecodeString(privStr)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif len(privKeyBytes) != 32 {\n\t\treturn nil, fmt.Errorf(\"size incorrect\")\n\t}\n\tprivKey, err := ecdh.P256().NewPrivateKey(privKeyBytes)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn privKey, nil\n}\n\nfunc Base64DecodeSM2ECDHPublicKey(pubStr string) (*ecdh.PublicKey, error) {\n\tpubKeyBytes, err := base64.StdEncoding.DecodeString(pubStr)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif len(pubKeyBytes) != 64 {\n\t\treturn nil, fmt.Errorf(\"size incorrect\")\n\t}\n\tbuf := make([]byte, 65)\n\tbuf[0] = 4 // public key first byte means uncompressed\n\tcopy(buf[1:], pubKeyBytes[:])\n\tpubKey, err := ecdh.P256().NewPublicKey(buf[:])\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn pubKey, nil\n}\n\n// Generate SM2 public and private key pairs for ECDSA.\nfunc GenerateSM2ECDSAKeypair() (*sm2.PrivateKey, string, string) {\n\tvar err error\n\tvar pubKeyBytes [64]byte\n\tvar privKeyBytes [32]byte\n\tprivKey := new(sm2.PrivateKey)\n\n\tfor {\n\t\tprivKey, err = sm2.GenerateKey(rand.Reader)\n\t\tif err == nil {\n\t\t\tbreak\n\t\t}\n\t}\n\tcopy(privKeyBytes[:], privKey.D.Bytes()[:])            // 32 bytes D\n\tcopy(pubKeyBytes[:32], privKey.PublicKey.X.Bytes()[:]) // 32 bytes X\n\tcopy(pubKeyBytes[32:], privKey.PublicKey.Y.Bytes()[:]) // 32 bytes Y\n\n\treturn privKey,\n\t\tbase64.StdEncoding.EncodeToString(pubKeyBytes[:]),\n\t\tbase64.StdEncoding.EncodeToString(privKeyBytes[:])\n}\n\nfunc Base64DecodeSM2ECDSAPrivateKey(pubKeyStr string, privKeyStr string) (*sm2.PrivateKey, error) {\n\tprivKeyBytes, err := base64.StdEncoding.DecodeString(privKeyStr)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif len(privKeyBytes) != 32 {\n\t\treturn nil, fmt.Errorf(\"size incorrect\")\n\t}\n\tpubKeyBytes, err := base64.StdEncoding.DecodeString(pubKeyStr)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif len(pubKeyBytes) != 64 {\n\t\treturn nil, fmt.Errorf(\"size incorrect\")\n\t}\n\n\tprivKey := &sm2.PrivateKey{}\n\tprivKey.D = new(big.Int)\n\tprivKey.D.SetBytes(privKeyBytes[:])\n\n\tprivKey.PublicKey.Curve = sm2.P256()\n\tprivKey.PublicKey.X = new(big.Int)\n\tprivKey.PublicKey.Y = new(big.Int)\n\tprivKey.PublicKey.X.SetBytes(pubKeyBytes[:32])\n\tprivKey.PublicKey.Y.SetBytes(pubKeyBytes[32:])\n\n\treturn privKey, nil\n}\n\nfunc Base64DecodeSM2ECDSAPublicKey(pubKeyStr string) (*ecdsa.PublicKey, error) {\n\tpubKeyBytes, err := base64.StdEncoding.DecodeString(pubKeyStr)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif len(pubKeyBytes) != 64 {\n\t\treturn nil, fmt.Errorf(\"size incorrect\")\n\t}\n\n\tpubKey := &ecdsa.PublicKey{\n\t\tCurve: sm2.P256(),\n\t\tX:     new(big.Int),\n\t\tY:     new(big.Int),\n\t}\n\n\tpubKey.X.SetBytes(pubKeyBytes[:32])\n\tpubKey.Y.SetBytes(pubKeyBytes[32:])\n\n\treturn pubKey, nil\n}\n"
  },
  {
    "path": "nhp/core/scheme/gmsm/header.go",
    "content": "package gmsm\n\nimport (\n\t\"encoding/binary\"\n\t\"unsafe\"\n\n\t\"github.com/OpenNHP/opennhp/nhp/common\"\n\tutils \"github.com/OpenNHP/opennhp/nhp/utils\"\n)\n\nconst (\n\tHeaderCommonSize    = 24\n\tHashSize            = 32\n\tGCMNonceSize        = 12\n\tGCMTagSize          = 16\n\tTimestampSize       = 8\n\tMaximumIdentitySize = 64\n\tHeaderSize          = HeaderCommonSize + PublicKeySize + MaximumIdentitySize + GCMTagSize + PublicKeySize + GCMTagSize + TimestampSize + GCMTagSize + HashSize\n)\n\ntype HeaderGmsm struct {\n\tHeaderCommon [HeaderCommonSize]byte\n\tEphermeral   [PublicKeySize]byte\n\tIdentity     [MaximumIdentitySize + GCMTagSize]byte\n\tStatic       [PublicKeySize + GCMTagSize]byte\n\tTimestamp    [TimestampSize + GCMTagSize]byte\n\tHMAC         [HashSize]byte\n}\n\n// gmsm header implementations\nfunc (h *HeaderGmsm) TypeAndPayloadSize() (t int, s int) {\n\tpreamble := binary.BigEndian.Uint32(h.HeaderCommon[0:4])\n\ttns := preamble ^ binary.BigEndian.Uint32(h.HeaderCommon[4:8])\n\tt = int((tns & 0xFFFF0000) >> 16)\n\ts = int(tns & 0x0000FFFF)\n\treturn t, s\n}\n\nfunc (h *HeaderGmsm) SetTypeAndPayloadSize(t int, s int) {\n\tpreamble := utils.GetRandomUint32()\n\t//nolint:gosec // G115: Values are masked to 16 bits before conversion, preventing overflow\n\tt32 := uint32((t & 0x0000FFFF) << 16)\n\t//nolint:gosec // G115: Values are masked to 16 bits before conversion, preventing overflow\n\ts32 := uint32(s & 0x0000FFFF)\n\ttns := preamble ^ (s32 | t32)\n\tbinary.BigEndian.PutUint32(h.HeaderCommon[0:4], preamble)\n\tbinary.BigEndian.PutUint32(h.HeaderCommon[4:8], tns)\n}\n\nfunc (h *HeaderGmsm) Size() int {\n\treturn HeaderSize\n}\n\nfunc (h *HeaderGmsm) Version() (int, int) {\n\tmajor := h.HeaderCommon[8]\n\tminor := h.HeaderCommon[9]\n\treturn int(major), int(minor)\n}\n\nfunc (h *HeaderGmsm) SetVersion(major int, minor int) {\n\t//nolint:gosec // G115: Protocol version values are always 0-255 by design\n\th.HeaderCommon[8] = uint8(major & 0xFF)\n\t//nolint:gosec // G115: Protocol version values are always 0-255 by design\n\th.HeaderCommon[9] = uint8(minor & 0xFF)\n}\n\nfunc (h *HeaderGmsm) Flag() uint16 {\n\treturn binary.BigEndian.Uint16(h.HeaderCommon[10:12])\n}\n\nfunc (h *HeaderGmsm) SetFlag(flag uint16) {\n\tflag |= uint16(common.NHP_FLAG_EXTENDEDLENGTH)\n\tflag &= 0x0FFF\n\tflag |= uint16(common.NHP_FLAG_SCHEME_GMSM)\n\tbinary.BigEndian.PutUint16(h.HeaderCommon[10:12], flag)\n}\n\nfunc (h *HeaderGmsm) NonceBytes() []byte {\n\tvar nonce [GCMNonceSize]byte\n\tcopy(nonce[4:GCMNonceSize], h.HeaderCommon[16:24])\n\treturn nonce[:]\n}\n\nfunc (h *HeaderGmsm) SetCounter(counter uint64) {\n\tbinary.BigEndian.PutUint64(h.HeaderCommon[16:24], counter)\n}\n\nfunc (h *HeaderGmsm) Counter() uint64 {\n\treturn binary.BigEndian.Uint64(h.HeaderCommon[16:24])\n}\n\nfunc (h *HeaderGmsm) Bytes() []byte {\n\t//nolint:gosec // G103: Intentional unsafe pointer for zero-copy header serialization\n\tpHeader := (*[HeaderSize]byte)(unsafe.Pointer(&h.HeaderCommon))\n\treturn pHeader[:]\n}\n\nfunc (h *HeaderGmsm) EphermeralBytes() []byte {\n\treturn h.Ephermeral[:]\n}\n\nfunc (h *HeaderGmsm) StaticBytes() []byte {\n\treturn h.Static[:]\n}\n\nfunc (h *HeaderGmsm) TimestampBytes() []byte {\n\treturn h.Timestamp[:]\n}\n\nfunc (h *HeaderGmsm) IdentityBytes() []byte {\n\treturn h.Identity[:]\n}\n\nfunc (h *HeaderGmsm) HMACBytes() []byte {\n\treturn h.HMAC[:]\n}\n\nfunc (h *HeaderGmsm) CipherScheme() int {\n\treturn common.CIPHER_SCHEME_GMSM\n}\n"
  },
  {
    "path": "nhp/core/scheme/gmsm/responder.go",
    "content": "package gmsm\n"
  },
  {
    "path": "nhp/core/tcpconn.go",
    "content": "package core\n"
  },
  {
    "path": "nhp/core/transaction.go",
    "content": "package core\n\nimport (\n\t\"time\"\n\n\tcommon \"github.com/OpenNHP/opennhp/nhp/common\"\n\tlog \"github.com/OpenNHP/opennhp/nhp/log\"\n)\n\ntype LocalTransaction struct {\n\ttransactionId uint64\n\tconnData      *ConnectionData\n\tmad           *MsgAssemblerData\n\tNextPacketCh  chan *Packet           // higher level entities should redirect packet to this channel\n\tExternalMsgCh chan *PacketParserData // a channel to receive an external msg to complete the transaction\n\ttimeout       int\n}\n\ntype RemoteTransaction struct {\n\ttransactionId uint64\n\tconnData      *ConnectionData\n\tparserData    *PacketParserData\n\tNextMsgCh     chan *MsgData // higher level entities should redirect message to this channel\n\ttimeout       int\n}\n\nfunc (d *Device) IsTransactionRequest(t int) bool {\n\n\t// NHP_KPL is handled separately\n\tlog.Info(\"IsTransactionRequest: deviceType:%d\", d.deviceType)\n\tswitch d.deviceType {\n\tcase NHP_AGENT:\n\t\tswitch t {\n\t\tcase NHP_REG, NHP_LST, NHP_KNK, DHP_KNK, NHP_RKN, NHP_EXT, NHP_DAR, NHP_DAV:\n\t\t\treturn true\n\t\t}\n\tcase NHP_SERVER:\n\t\tswitch t {\n\t\tcase NHP_REG, NHP_LST, NHP_KNK, DHP_KNK, NHP_RKN, NHP_EXT, NHP_AOL, NHP_AOP, NHP_DAK, NHP_DAG, NHP_DSA, NHP_DAR, NHP_DAV, NHP_DRG, NHP_DOL, NHP_DWR:\n\t\t\treturn true\n\t\t}\n\tcase NHP_AC:\n\t\tswitch t {\n\t\tcase NHP_AOL, NHP_AOP:\n\t\t\treturn true\n\t\t}\n\tcase NHP_DB:\n\t\tswitch t {\n\t\tcase NHP_DRG, NHP_DOL, NHP_DWR:\n\t\t\treturn true\n\t\t}\n\tcase NHP_RELAY:\n\n\t\t// no transaction request for relay\n\t}\n\n\treturn false\n}\n\nfunc (d *Device) LocalTransactionTimeout() int {\n\t// NHP_KPL is handled separately\n\tswitch d.deviceType {\n\tcase NHP_AGENT:\n\t\treturn AgentLocalTransactionResponseTimeoutMs\n\tcase NHP_SERVER:\n\t\treturn ServerLocalTransactionResponseTimeoutMs\n\tcase NHP_AC:\n\t\treturn ACLocalTransactionResponseTimeoutMs\n\tcase NHP_DB:\n\t\treturn DELocalTransactionResponseTimeoutMs\n\tcase NHP_RELAY:\n\t\t// no transaction request for relay\n\t}\n\n\treturn 0\n}\n\nfunc (d *Device) RemoteTransactionTimeout() int {\n\treturn RemoteTransactionProcessTimeoutMs\n}\n\nfunc (d *Device) IsTransactionResponse(t int) bool {\n\t// NHP_KPL is handled separately\n\tswitch d.deviceType {\n\tcase NHP_AGENT:\n\t\tswitch t {\n\t\tcase NHP_RAK, NHP_LRT, NHP_ACK, NHP_DAG, NHP_DSA:\n\t\t\t// note NHP_COK is not handled as transaction for agent\n\t\t\treturn true\n\t\t}\n\tcase NHP_SERVER:\n\t\tswitch t {\n\t\tcase NHP_RAK, NHP_LRT, NHP_ACK, NHP_AAK, NHP_ART, NHP_DAK, NHP_DWA:\n\t\t\t// note NHP_COK is not handled as transaction for server\n\t\t\treturn true\n\t\t}\n\tcase NHP_AC:\n\t\tswitch t {\n\t\tcase NHP_AAK, NHP_ART:\n\t\t\treturn true\n\t\t}\n\tcase NHP_DB:\n\t\tswitch t {\n\t\tcase NHP_DAK, NHP_DBA:\n\t\t\treturn true\n\t\t}\n\tcase NHP_RELAY:\n\t\t// no transaction response for relay\n\t}\n\n\treturn false\n}\n\n// LocalTransaction\nfunc (d *Device) AddLocalTransaction(t *LocalTransaction) {\n\td.localTransactionMutex.Lock()\n\tdefer d.localTransactionMutex.Unlock()\n\n\td.localTransactionMap[t.transactionId] = t\n\n\td.wg.Add(1)\n\tgo t.Run()\n}\n\nfunc (d *Device) FindLocalTransaction(id uint64) *LocalTransaction {\n\td.localTransactionMutex.Lock()\n\tdefer d.localTransactionMutex.Unlock()\n\n\tt, found := d.localTransactionMap[id]\n\tif found {\n\t\treturn t\n\t}\n\n\treturn nil\n}\n\nfunc (t *LocalTransaction) Run() {\n\tlog.Debug(\"Local transaction %d start\", t.transactionId)\n\tdefer log.Debug(\"Local transaction %d quit\", t.transactionId)\n\n\tdevice := t.mad.device\n\tvar err error\n\n\tt.ExternalMsgCh = make(chan *PacketParserData)\n\n\t// clear up\n\tdefer func() {\n\t\tt.mad.Destroy()\n\t\tclose(t.NextPacketCh)\n\t\tclose(t.ExternalMsgCh)\n\n\t\tdevice.localTransactionMutex.Lock()\n\t\tdelete(device.localTransactionMap, t.transactionId)\n\t\tdevice.localTransactionMutex.Unlock()\n\n\t\t// if local transaction is expecting a response, return an error\n\t\tif err != nil && t.mad.ResponseMsgCh != nil {\n\t\t\tt.mad.ResponseMsgCh <- &PacketParserData{Error: err}\n\t\t}\n\n\t\tdevice.wg.Done()\n\t}()\n\n\tselect {\n\tcase pkt := <-t.NextPacketCh:\n\t\tpd := &PacketData{\n\t\t\tBasePacket:        pkt,\n\t\t\tPrevAssemblerData: t.mad,\n\t\t\tInitTime:          time.Now().UnixNano(),\n\t\t}\n\n\t\tdevice.RecvPacketToMsg(pd)\n\t\treturn\n\n\tcase ppd := <-t.ExternalMsgCh:\n\t\t// redirect it to mad.ResponseMsgCh and complete the transaction externally\n\t\tif t.mad.ResponseMsgCh != nil {\n\t\t\tt.mad.ResponseMsgCh <- ppd\n\t\t}\n\t\treturn\n\n\tcase <-t.connData.StopSignal:\n\t\tlog.Warning(\"Local transaction %d stopped due to closed connection\", t.transactionId)\n\t\terr = common.ErrTransactionFailedByClosedConnection\n\t\treturn\n\n\tcase <-device.signals.stop:\n\t\t// not needed in most case, just in case the device is closed first than connection by mistake\n\t\tlog.Warning(\"Local transaction %d stopped due to closed device\", t.transactionId)\n\t\terr = common.ErrTransactionFailedByClosedDevice\n\t\treturn\n\n\tcase <-time.After(time.Duration(t.timeout) * time.Millisecond):\n\t\tlog.Warning(\"Local transaction %d stopped due to timeout\", t.transactionId)\n\t\terr = common.ErrTransactionFailedByTimeout\n\t\treturn\n\t}\n}\n\n// RemoteTransaction\nfunc (c *ConnectionData) AddRemoteTransaction(t *RemoteTransaction) {\n\tc.RemoteTransactionMutex.Lock()\n\tdefer c.RemoteTransactionMutex.Unlock()\n\n\tc.RemoteTransactionMap[t.transactionId] = t\n\n\tc.Add(1)\n\tgo t.Run()\n}\n\nfunc (c *ConnectionData) FindRemoteTransaction(id uint64) *RemoteTransaction {\n\tif c.IsClosed() {\n\t\tlog.Warning(\"connection is closed, all transactions are cleared\")\n\t\treturn nil\n\t}\n\n\tc.RemoteTransactionMutex.Lock()\n\tdefer c.RemoteTransactionMutex.Unlock()\n\n\tt, found := c.RemoteTransactionMap[id]\n\tif found {\n\t\treturn t\n\t}\n\n\treturn nil\n}\n\nfunc (t *RemoteTransaction) Run() {\n\tlog.Debug(\"Remote transaction %d start\", t.transactionId)\n\tdefer log.Debug(\"Remote transaction %d quit\", t.transactionId)\n\n\tconn := t.connData\n\n\tdefer func() {\n\t\tt.parserData.Destroy()\n\t\tclose(t.NextMsgCh)\n\n\t\tconn.RemoteTransactionMutex.Lock()\n\t\tdelete(conn.RemoteTransactionMap, t.transactionId)\n\t\tconn.RemoteTransactionMutex.Unlock()\n\n\t\tconn.Done()\n\t}()\n\n\tselect {\n\tcase md := <-t.NextMsgCh:\n\t\tmd.PrevParserData = t.parserData\n\t\tconn.Device.SendMsgToPacket(md)\n\t\treturn\n\n\tcase <-conn.StopSignal:\n\t\tlog.Warning(\"Remote transaction %d stopped due to closed connection\", t.transactionId)\n\t\treturn\n\n\tcase <-time.After(time.Duration(t.timeout) * time.Millisecond):\n\t\tlog.Warning(\"Remote transaction %d stopped due to timeout\", t.transactionId)\n\t\treturn\n\t}\n}\n"
  },
  {
    "path": "nhp/core/udpconn.go",
    "content": "package core\n\nimport (\n\t\"net\"\n\t\"sync\"\n\t\"sync/atomic\"\n\n\t\"github.com/OpenNHP/opennhp/nhp/log\"\n)\n\ntype ConnectionData struct {\n\t// atomic data, keep 64bit(8-bytes) alignment for 32-bit system compatibility\n\tInitTime           int64 // local connection setup time. immutable after created\n\tLastRemoteSendTime int64\n\tLastLocalSendTime  int64\n\tLastLocalRecvTime  int64\n\n\tsync.Mutex\n\tsync.WaitGroup\n\n\t// common\n\tDevice           *Device\n\tLocalAddr        *net.UDPAddr\n\tRemoteAddr       *net.UDPAddr\n\tCookieStore      *CookieStore\n\tTimeoutMs        int\n\tSendQueue        chan *Packet\n\tRecvQueue        chan *Packet\n\tBlockSignal      chan struct{}\n\tSetTimeoutSignal chan struct{}\n\tStopSignal       chan struct{}\n\n\tclosed atomic.Bool\n\n\t// remote transactions\n\tRemoteTransactionMutex sync.Mutex\n\tRemoteTransactionMap   map[uint64]*RemoteTransaction\n\n\t// specific\n\tRecvThreatCount int32\n}\n\nfunc (c *ConnectionData) Equal(other *ConnectionData) bool {\n\t// use nanosecond timestamp for comparison\n\treturn c.InitTime == other.InitTime\n\t//return c.RemoteAddr.String() == other.RemoteAddr.String()\n}\n\nfunc (c *ConnectionData) SetTimeout(ms int) {\n\tc.TimeoutMs = ms\n\tc.SetTimeoutSignal <- struct{}{}\n}\n\nfunc (c *ConnectionData) Close() {\n\tif c.IsClosed() {\n\t\treturn\n\t}\n\n\t// close all running transactions\n\tclose(c.StopSignal)\n\n\tc.closed.Store(true)\n\n\t// flush connection remaining packet and close connection thread channels\nflush:\n\tfor {\n\t\tselect {\n\t\tcase pkt := <-c.SendQueue:\n\t\t\tc.Device.ReleasePoolPacket(pkt)\n\t\tcase pkt := <-c.RecvQueue:\n\t\t\tc.Device.ReleasePoolPacket(pkt)\n\t\tcase <-c.BlockSignal:\n\t\tdefault:\n\t\t\tbreak flush\n\t\t}\n\t}\n\n\tclose(c.SendQueue)\n\tclose(c.RecvQueue)\n\tclose(c.BlockSignal)\n\tclose(c.SetTimeoutSignal)\n\tc.SendQueue = nil\n\tc.RecvQueue = nil\n\tc.BlockSignal = nil\n\tc.SetTimeoutSignal = nil\n\n\tc.Wait()\n}\n\nfunc (c *ConnectionData) IsClosed() bool {\n\treturn c.closed.Load()\n}\n\nfunc (c *ConnectionData) ForwardOutboundPacket(pkt *Packet) {\n\tif c.IsClosed() {\n\t\tlog.Warning(\"connection %s is closed, discard outbound packet\", c.RemoteAddr.String())\n\t\tc.Device.ReleasePoolPacket(pkt)\n\t\treturn\n\t}\n\n\tselect {\n\tcase c.SendQueue <- pkt:\n\t\t// fully encrypted packet will be forwarded to higher level entity for physical sending\n\t\t// may block when send queue is full\n\tcase <-c.StopSignal:\n\t\t// discard pending packets when connection is closed\n\t\tlog.Warning(\"connection %s stopped, discard pending outbound packet\", c.RemoteAddr.String())\n\t\tc.Device.ReleasePoolPacket(pkt)\n\t}\n}\n\nfunc (c *ConnectionData) ForwardInboundPacket(pkt *Packet) {\n\tif c.IsClosed() {\n\t\tlog.Warning(\"connection %s is closed, discard inbound packet\", c.RemoteAddr.String())\n\t\tc.Device.ReleasePoolPacket(pkt)\n\t\treturn\n\t}\n\n\tselect {\n\tcase c.RecvQueue <- pkt:\n\t\t// raw packet will be forwarded to connection routine for packet parsing and decrytion\n\t\t// may block when recv queue is full\n\tcase <-c.StopSignal:\n\t\t// discard pending packets when connection is closed\n\t\tlog.Warning(\"connection %s stopped, discard pending inbound packet\", c.RemoteAddr.String())\n\t\tc.Device.ReleasePoolPacket(pkt)\n\t}\n}\n\nfunc (c *ConnectionData) SendBlockSignal() {\n\tif c.IsClosed() {\n\t\tlog.Warning(\"connection is closed, discard block signal\")\n\t\treturn\n\t}\n\n\tselect {\n\tcase c.BlockSignal <- struct{}{}:\n\t\t// trigger connection to close itself immediately and ask higher level entity to record the blocking connection\n\tdefault:\n\t\tlog.Warning(\"old block signal not processed\")\n\t}\n}\n"
  },
  {
    "path": "nhp/core/verifier/csv/csv.go",
    "content": "package csv\n\nimport (\n\t\"bytes\"\n\t\"crypto/ecdsa\"\n\t\"encoding/binary\"\n\t\"encoding/hex\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io\"\n\t\"math/big\"\n\t\"net/http\"\n\t\"unsafe\"\n\n\t\"github.com/emmansun/gmsm/sm2\"\n\t\"github.com/emmansun/gmsm/sm3\"\n)\n\nvar (\n\tSM2A                  = \"fffffffeffffffffffffffffffffffffffffffff00000000fffffffffffffffc\"\n\tSM2B                  = \"28e9fa9e9d9f5e344d5a9e4bcf6509a7f39789f515ab8f92ddbcbd414d940e93\"\n\tSM2GX                 = \"32c4ae2c1f1981195f9904466a39c9948fe30bbff2660be1715a4589334c74c7\"\n\tSM2GY                 = \"bc3736a2f4f6779c59bdcee36b692153d0a9877cc62a474002df32e52139f0a0\"\n\tECKEY                 = SM2A + SM2B + SM2GX + SM2GY\n\tVerifier *Attestation = nil\n)\n\ntype AttestationBody struct {\n\tUserPubKeyDigest [32]byte `json:\"user_pubkey_digest\"`\n\tVmId             [16]byte `json:\"vm_id\"`\n\tVmVersion        [16]byte `json:\"vm_version\"`\n\tReportData       [64]byte `json:\"report_data\"`\n\tMnonce           [16]byte `json:\"mnonce\"`\n\tMeasure          [32]byte `json:\"measure\"`\n\tPolicy           uint32   `json:\"policy\"`\n}\n\ntype Signature struct {\n\tR [72]byte `json:\"r\"`\n\tS [72]byte `json:\"s\"`\n}\n\ntype AttestationReport struct {\n\tAttestationBody AttestationBody `json:\"body\"`\n\tSigUsage        uint32          `json:\"sig_usage\"`\n\tSigAlgo         uint32          `json:\"sig_algo\"`\n\tAnonce          uint32          `json:\"anonce\"`\n\tSig             Signature       `json:\"sig\"`\n}\n\ntype CertificateData struct {\n\tKid      [16]byte `json:\"kid\"`\n\tSid      [16]byte `json:\"sid\"`\n\tUsage    uint32   `json:\"usage\"`\n\tReserved [24]byte `json:\"reserved\"`\n}\n\ntype PubKey struct {\n\tG uint32   `json:\"g\"`\n\tX [72]byte `json:\"x\"`\n\tY [72]byte `json:\"y\"`\n}\n\ntype CertificatePreamble struct {\n\tVersion uint32          `json:\"ver\"`\n\tData    CertificateData `json:\"data\"`\n}\n\ntype CaCertificateBody struct {\n\tPreamble CertificatePreamble `json:\"preamble\"`\n\tPubKey   PubKey              `json:\"pubkey\"`\n\tUidSize  uint16              `json:\"uid_size\"`\n\tUserId   [254]byte           `json:\"user_id\"`\n\tReserved [108]byte           `json:\"reserved\"`\n}\n\ntype Version struct {\n\tMajor uint8 `json:\"major\"`\n\tMinor uint8 `json:\"minor\"`\n}\n\ntype CsvPubkey struct {\n\tUsage uint32 `json:\"usage\"`\n\tAlgo  uint32 `json:\"algo\"`\n\tKey   PubKey `json:\"key\"`\n}\n\ntype CsvCertificateData struct {\n\tFirmware  Version   `json:\"firmware\"`\n\tReserved1 uint16    `json:\"reserved1\"`\n\tPubKey    CsvPubkey `json:\"pubkey\"`\n\tUidSize   uint16    `json:\"uid_size\"`\n\tUserId    [254]byte `json:\"user_id\"`\n\tSid       [16]byte  `json:\"sid\"`\n\tReserved2 [608]byte `json:\"reserved2\"`\n}\n\ntype CsvCertificateBody struct {\n\tVersion uint32             `json:\"ver\"`\n\tData    CsvCertificateData `json:\"data\"`\n}\n\ntype CsvSignature struct {\n\tUsage     uint32    `json:\"usage\"`\n\tAlgo      uint32    `json:\"algo\"`\n\tSignature Signature `json:\"signature\"`\n\tReserved  [368]byte `json:\"_reserved\"`\n}\n\ntype CsvCertificate struct {\n\tBody      CsvCertificateBody `json:\"body\"`\n\tSignature [2]CsvSignature    `json:\"sigs\"`\n}\n\ntype CaCertificate struct {\n\tBody      CaCertificateBody `json:\"body\"`\n\tSignature Signature         `json:\"signature\"`\n\tReserved  [112]byte         `json:\"_reserved\"`\n}\n\ntype CertificateChain struct {\n\tHsk CaCertificate  `json:\"hsk\"`\n\tCek CsvCertificate `json:\"cek\"`\n\tPek CsvCertificate `json:\"pek\"`\n}\n\ntype CsvEvidence struct {\n\tAttestationReport AttestationReport `json:\"attestation_report\"`\n\tCertificateChain  CertificateChain  `json:\"cert_chain\"`\n\tSerialNumber      []byte            `json:\"serial_number\"`\n}\n\ntype Attestation struct {\n\tevidence *CsvEvidence\n\thrk      []byte\n\thskCek   map[string][]byte\n}\n\nfunc ReverseBytes(b []byte) []byte {\n\treversed := make([]byte, len(b))\n\tfor i := range b {\n\t\treversed[len(b)-1-i] = b[i]\n\t}\n\treturn reversed\n}\n\nfunc buildIDMsg(id []byte, idLen int, ecKeyHex string, pubkeyHex string) []byte {\n\t// 计算 (id_len * 8) >> 8 % 256 和 (id_len * 8) % 256\n\tidLenBits := idLen * 8\n\tfirstByte := byte((idLenBits >> 8) % 256)\n\tsecondByte := byte(idLenBits % 256)\n\n\t// 转换十六进制字符串为字节\n\tecKeyBytes, _ := hex.DecodeString(ecKeyHex)\n\tpubkeyBytes, _ := hex.DecodeString(pubkeyHex)\n\n\t// 拼接所有字节切片\n\tvar result []byte\n\tresult = append(result, firstByte)\n\tresult = append(result, secondByte)\n\tresult = append(result, id...)\n\tresult = append(result, ecKeyBytes...)\n\tresult = append(result, pubkeyBytes...)\n\n\treturn result\n}\n\nfunc Sm3Digest(hrkData []byte) ([]byte, error) {\n\thash := sm3.New()\n\tif _, err := hash.Write(hrkData); err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to write HRK data to SM3: %v\", err)\n\t}\n\tdigest := hash.Sum(nil)\n\treturn digest, nil\n}\n\nfunc Sm3Hmac(data []byte, key []byte) []byte {\n\t// Block size of SM3 is 64 bytes (as specified in GM/T 0004-2012)\n\tconst blockSize = 64\n\n\t// Ensure key is not longer than block size by hashing if necessary\n\tif len(key) > blockSize {\n\t\thash := sm3.Sum(key)\n\t\tkey = hash[:]\n\t}\n\n\t// Pad key to block size with zeros\n\tpaddedKey := make([]byte, blockSize)\n\tcopy(paddedKey, key)\n\n\t// Create inner and outer padding\n\tinnerPad := make([]byte, blockSize)\n\touterPad := make([]byte, blockSize)\n\tfor i := 0; i < blockSize; i++ {\n\t\tinnerPad[i] = paddedKey[i] ^ 0x36 // Inner padding: 0x36 repeated\n\t\touterPad[i] = paddedKey[i] ^ 0x5C // Outer padding: 0x5C repeated\n\t}\n\n\t// Compute inner hash: SM3(innerPad || data)\n\tinnerHash := sm3.New()\n\tinnerHash.Write(innerPad)\n\tinnerHash.Write(data)\n\tinnerResult := innerHash.Sum(nil)\n\n\t// Compute outer hash: SM3(outerPad || innerResult)\n\touterHash := sm3.New()\n\touterHash.Write(outerPad)\n\touterHash.Write(innerResult)\n\treturn outerHash.Sum(nil)\n}\n\n// refer to 7.1 in GB/T32918.2—2016\nfunc VerifySignature(pub *ecdsa.PublicKey, hash []byte, r, s *big.Int) bool {\n\tn := pub.Curve.Params().N\n\n\tif r.Sign() <= 0 || s.Sign() <= 0 || r.Cmp(n) >= 0 || s.Cmp(n) >= 0 {\n\t\treturn false\n\t}\n\n\tsm2_N := pub.Params().N\n\n\t// t = (r + s) % n\n\tt := new(big.Int).Mod(new(big.Int).Add(r, s), sm2_N)\n\n\te := new(big.Int).SetBytes(hash)\n\n\t// x1, y1 = [r]G\n\t// x2, y2 = [s]PubKey\n\tx1, y1 := pub.Curve.ScalarBaseMult(s.Bytes())\n\tx2, y2 := pub.Curve.ScalarMult(pub.X, pub.Y, t.Bytes())\n\n\tif x1.Cmp(x2) == 0 && y1.Cmp(y2) == 0 {\n\t\t// x1, y1 = Double(x1, y1)\n\t\tx1, y1 = pub.Curve.Double(x1, y1)\n\t} else {\n\t\t// x1, y1 = x1 + x2, y1 + y2\n\t\tx1, y1 = pub.Curve.Add(x1, y1, x2, y2)\n\t}\n\n\treturn r.Cmp(new(big.Int).Mod(new(big.Int).Add(x1, e), sm2_N)) == 0\n}\n\nfunc (a *Attestation) verifySm2SignatureWithId(qx, qy, r, s []byte, id []byte, msg []byte) error {\n\tif len(qx) != 32 || len(qy) != 32 {\n\t\treturn fmt.Errorf(\"invalid public key length: got %d, want 32\", len(qx))\n\t}\n\n\tif len(r) != 32 || len(s) != 32 {\n\t\treturn fmt.Errorf(\"invalid signature length: got %d, want 32\", len(r))\n\t}\n\n\tqx = ReverseBytes(qx)\n\tqy = ReverseBytes(qy)\n\tr = ReverseBytes(r)\n\ts = ReverseBytes(s)\n\n\tpubKeyBytes := append(qx, qy...)\n\tpubKeyHex := hex.EncodeToString(pubKeyBytes)\n\n\tid_msg := buildIDMsg(id, len(id), ECKEY, pubKeyHex)\n\n\tza, err := Sm3Digest(id_msg)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tmsgAll := append(za, msg...)\n\tmsgAllDigest, err := Sm3Digest(msgAll)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\txBig := new(big.Int).SetBytes(qx)\n\tyBig := new(big.Int).SetBytes(qy)\n\n\tpubKey := &ecdsa.PublicKey{\n\t\tCurve: sm2.P256(),\n\t\tX:     xBig,\n\t\tY:     yBig,\n\t}\n\n\trBig := new(big.Int).SetBytes(r)\n\tsBig := new(big.Int).SetBytes(s)\n\n\tif VerifySignature(pubKey, msgAllDigest, rBig, sBig) {\n\t\treturn nil\n\t} else {\n\t\treturn fmt.Errorf(\"failed to verify signature\")\n\t}\n}\n\nfunc (a *Attestation) verifyCertChain(chipId string) error {\n\t// Download HRK from Hygon's certificate server\n\tif a.hrk == nil {\n\t\tresp, err := http.Get(\"https://cert.hygon.cn/hrk\")\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"failed to download HRK: %v\", err)\n\t\t}\n\t\tdefer resp.Body.Close()\n\n\t\tif resp.StatusCode != http.StatusOK {\n\t\t\treturn fmt.Errorf(\"unexpected status code when download HRK: %d\", resp.StatusCode)\n\t\t}\n\n\t\t// Read the response body (HRK content)\n\t\thrkData, err := io.ReadAll(resp.Body)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"failed to read HRK data: %v\", err)\n\t\t}\n\n\t\ta.hrk = hrkData\n\t}\n\n\tdigest, err := Sm3Digest(a.hrk)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\texpectedDigest, _ := hex.DecodeString(\"f5a46663059fdb4cdd06d097ed21782142923bb3430b3b938f23d54292094e3a\")\n\tif !bytes.Equal(digest, expectedDigest) {\n\t\treturn fmt.Errorf(\"HRK digest verification failed: got %x, want %x\", digest, expectedDigest)\n\t}\n\n\tif err := a.verifyHygonCertInfo(a.hrk, 0x03, 0, a.hrk[0x04:0x14]); err != nil {\n\t\treturn err\n\t}\n\n\t// verify hrk cert signature (self-signed)\n\thrkIdLen := int(binary.LittleEndian.Uint16(a.hrk[0xd4:0xd6]))\n\tif err := a.verifySm2SignatureWithId(\n\t\ta.hrk[0x44:0x64], a.hrk[0x8c:0xac],\n\t\ta.hrk[0x240:0x260], a.hrk[0x288:0x2a8],\n\t\ta.hrk[0xd6:0xd6+hrkIdLen], a.hrk[:0x240],\n\t); err != nil {\n\t\treturn err\n\t}\n\n\tif _, ok := a.hskCek[chipId]; !ok {\n\t\tresp, err := http.Get(fmt.Sprintf(\"https://cert.hygon.cn/hsk_cek?snumber=%s\", chipId))\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"failed to download hsk_cek: %v\", err)\n\t\t}\n\t\tdefer resp.Body.Close()\n\n\t\tif resp.StatusCode != http.StatusOK {\n\t\t\treturn fmt.Errorf(\"unexpected status code when download hsk_cek: %d\", resp.StatusCode)\n\t\t}\n\n\t\thskCekData, err := io.ReadAll(resp.Body)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"failed to read hsk_cek data: %v\", err)\n\t\t}\n\n\t\ta.hskCek[chipId] = hskCekData\n\t}\n\n\thskData := a.hskCek[chipId][:0x340]\n\tcekData := a.hskCek[chipId][0x340:]\n\n\t// verify hsk cert info\n\tif err := a.verifyHygonCertInfo(hskData, 0x03, 0x13, a.hrk[0x04:0x14]); err != nil {\n\t\treturn err\n\t}\n\n\t// verify hsk cert signature (self-signed)\n\tif err := a.verifySm2SignatureWithId(\n\t\ta.hrk[0x44:0x64], a.hrk[0x8c:0xac],\n\t\ta.hskCek[chipId][0x240:0x260], a.hskCek[chipId][0x288:0x2a8],\n\t\ta.hrk[0xd6:0xd6+hrkIdLen], a.hskCek[chipId][:0x240],\n\t); err != nil {\n\t\treturn err\n\t}\n\n\t// verify csv cert info\n\tif err := a.verifyCSVCertInfo(cekData, 0x13, 0x04, 0x1004, hskData[0x04:0x14]); err != nil {\n\t\treturn err\n\t}\n\n\t// verify csv cert signature (self-signed)\n\thskIdLen := int(binary.LittleEndian.Uint16(hskData[0xd4:0xd6]))\n\tif err := a.verifySm2SignatureWithId(\n\t\thskData[0x44:0x64], hskData[0x8c:0xac],\n\t\tcekData[0x41c:0x43c], cekData[0x464:0x484],\n\t\thskData[0xd6:0xd6+hskIdLen], cekData[:0x414],\n\t); err != nil {\n\t\treturn err\n\t}\n\n\t// verify pek cert info\n\tpek := a.evidence.CertificateChain.Pek\n\tpekDataLen := unsafe.Sizeof(pek)\n\tpekData := (*[1 << 20]byte)(unsafe.Pointer(&pek))[:pekDataLen]\n\n\t// fmt.Printf(\"pek: %x\\n\", pekData)\n\t// fmt.Printf(\"body len of pek: %d\\n\", unsafe.Sizeof(pek.Body))\n\n\tif err := a.verifyCSVCertInfo(pekData, 0x1004, 0x04, 0x1002, hskData[0x1a4:0x1b4]); err != nil {\n\t\treturn err\n\t}\n\n\t// verify pek cert signature (self-signed)\n\tcekIdLen := int(binary.LittleEndian.Uint16(cekData[0xa4:0xa6]))\n\tif err := a.verifySm2SignatureWithId(\n\t\tcekData[0x14:0x34], cekData[0x5c:0x7c],\n\t\tpekData[0x41c:0x43c], pekData[0x464:0x484],\n\t\tcekData[0xa6:0xa6+cekIdLen], pekData[:0x414],\n\t); err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\nfunc (a *Attestation) verifyHygonCertInfo(hrk []byte, curveId, keyUsage int, keyId []byte) error {\n\thygonKeyUsage := hrk[0x24:0x28]\n\n\thygonKeyUsageInt := int(binary.LittleEndian.Uint32(hygonKeyUsage))\n\tif hygonKeyUsageInt != keyUsage {\n\t\treturn fmt.Errorf(\"key usage mismatch: got %d, want %d\", keyUsage, keyUsage)\n\t}\n\n\thygonCurveId := hrk[0x40:0x44]\n\thygonCurveIdInt := int(binary.LittleEndian.Uint32(hygonCurveId))\n\tif hygonCurveIdInt != curveId {\n\t\treturn fmt.Errorf(\"curve id mismatch: got %d, want %d\", curveId, curveId)\n\t}\n\n\thygonCertifyingId := hrk[0x14:0x24]\n\tif !bytes.Equal(hygonCertifyingId, keyId) {\n\t\treturn fmt.Errorf(\"certifying id mismatch: got %x, want %x\", hygonCertifyingId, keyId)\n\t}\n\n\treturn nil\n}\n\nfunc (a *Attestation) verifyCSVCertInfo(csvCert []byte, sigUsage int, sigAlgo int, keyUsage int, keyId []byte) error {\n\tcsvKeyUsage := csvCert[0x08:0x0C]\n\tcsvKeyUsageInt := int(binary.LittleEndian.Uint32(csvKeyUsage))\n\tif csvKeyUsageInt != keyUsage {\n\t\treturn fmt.Errorf(\"key usage mismatch: got %d, want %d\", csvKeyUsageInt, sigUsage)\n\t}\n\n\tcsvSigUsage := csvCert[0x414:0x418]\n\tcsvSigUsageInt := int(binary.LittleEndian.Uint32(csvSigUsage))\n\tif csvSigUsageInt != sigUsage {\n\t\treturn fmt.Errorf(\"sig usage mismatch: got %d, want %d\", csvSigUsageInt, sigAlgo)\n\t}\n\n\tcsvSigAlgo := csvCert[0x418:0x41C]\n\tcsvSigAlgoInt := int(binary.LittleEndian.Uint32(csvSigAlgo))\n\tif csvSigAlgoInt != sigAlgo {\n\t\treturn fmt.Errorf(\"sig algo mismatch: got %d, want %d\", csvSigAlgoInt, sigAlgo)\n\t}\n\n\tcsvCertifyingId := csvCert[0x1a4:0x1b4]\n\tif !bytes.Equal(csvCertifyingId, keyId) {\n\t\treturn fmt.Errorf(\"certifying id mismatch: got %x, want %x\", csvCertifyingId, keyId)\n\t}\n\n\treturn nil\n}\n\nfunc (a *Attestation) Verify() error {\n\tif err := a.verifyCertChain(a.GetSerialNumber()); err != nil {\n\t\treturn err\n\t}\n\n\tpek := a.evidence.CertificateChain.Pek\n\tattestationReport := a.evidence.AttestationReport\n\tattestationReportDataLen := unsafe.Sizeof(attestationReport)\n\tattestationReportData := (*[1 << 20]byte)(unsafe.Pointer(&attestationReport))[:attestationReportDataLen]\n\n\tif err := a.verifySm2SignatureWithId(\n\t\tpek.Body.Data.PubKey.Key.X[:32], pek.Body.Data.PubKey.Key.Y[:32],\n\t\tattestationReport.Sig.R[:32],\n\t\tattestationReport.Sig.S[:32],\n\t\tpek.Body.Data.UserId[:pek.Body.Data.UidSize],\n\t\tattestationReportData[:unsafe.Sizeof(attestationReport.AttestationBody)],\n\t); err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\nfunc (a *Attestation) GetSerialNumber() string {\n\treturn string(bytes.TrimRight(a.evidence.SerialNumber, \"\\x00\"))\n}\n\nfunc (a *Attestation) performXORBy4BytesGroup(data []byte, anouce uint32) []byte {\n\tresult := make([]byte, 0, len(data))\n\n\t// Iterate through data in 4-byte steps\n\tfor i := 0; i < len(data); i += 4 {\n\t\t// Create a 4-byte buffer\n\t\tvar group [4]byte\n\n\t\t// Copy up to 4 bytes (handles partial last group)\n\t\tcopy(group[:], data[i:min(i+4, len(data))])\n\n\t\t// Convert 4-byte group to int32 (using little-endian byte order)\n\t\tgroupInt := binary.LittleEndian.Uint32(group[:])\n\n\t\t// Perform XOR with the key\n\t\tprocessedInt := groupInt ^ anouce\n\n\t\t// Convert back to bytes\n\t\tvar processedGroup [4]byte\n\t\tbinary.LittleEndian.PutUint32(processedGroup[:], processedInt)\n\n\t\t// Add to result, truncating if it's the last partial group\n\t\tend := i + 4\n\t\tif end > len(data) {\n\t\t\tend = len(data)\n\t\t\tresult = append(result, processedGroup[:end-i]...)\n\t\t} else {\n\t\t\tresult = append(result, processedGroup[:]...)\n\t\t}\n\t}\n\n\treturn result\n}\n\nfunc (a *Attestation) GetMeasure() string {\n\tmeasure := a.performXORBy4BytesGroup(a.evidence.AttestationReport.AttestationBody.Measure[:], a.evidence.AttestationReport.Anonce)\n\n\treturn hex.EncodeToString(measure)\n}\n\nfunc NewAttestation(attestationJsonStr string) (*Attestation, error) {\n\tvar attestation *Attestation\n\tvar evidence *CsvEvidence\n\n\tif Verifier == nil {\n\t\tattestation = &Attestation{}\n\t\tVerifier = attestation\n\t} else {\n\t\tattestation = Verifier\n\t}\n\n\tif err := json.Unmarshal([]byte(attestationJsonStr), &evidence); err != nil {\n\t\treturn nil, err\n\t}\n\n\tattestation.hskCek = make(map[string][]byte)\n\n\tattestation.evidence = evidence\n\n\treturn attestation, nil\n}\n"
  },
  {
    "path": "nhp/core/verifier/verifier.go",
    "content": "package verifier\n\nimport (\n\t\"bytes\"\n\t\"compress/zlib\"\n\t\"encoding/base64\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io\"\n\n\t\"github.com/OpenNHP/opennhp/nhp/core/verifier/csv\"\n)\n\ntype Verifier interface {\n\t// This interface is used to ask verifier to verify the attestation report\n\t// which is collected from attestor which is NHP Agent in DHP.\n\t// After receiving the attestation result, NHP Server makes application-specific decisions.\n\tVerify() error\n\n\t// GetSerialNumber returns the serial number from the attestation report\n\tGetSerialNumber() string\n\n\t// GetMeasure returns the measure from the attestation report\n\tGetMeasure() string\n}\n\ntype FallbackVerifier struct {\n\tTestPurpose  string `json:\"test_purpose\"`\n\tMeasure      string `json:\"measure\"`\n\tSerialNumber string `json:\"serial_number\"`\n}\n\nfunc (f *FallbackVerifier) Verify() error {\n\treturn nil\n}\n\nfunc (f *FallbackVerifier) GetSerialNumber() string {\n\treturn f.Measure\n}\n\nfunc (f *FallbackVerifier) GetMeasure() string {\n\treturn f.SerialNumber\n}\n\nfunc NewFallbackVerifier(evidence []byte) (*FallbackVerifier, error) {\n\tfallbackVerifier := &FallbackVerifier{}\n\n\terr := json.Unmarshal(evidence, fallbackVerifier)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn fallbackVerifier, nil\n}\n\nfunc NewVerifier(compressedEvienceBase64 string) (Verifier, error) {\n\tcompressedEvidence, err := base64.StdEncoding.DecodeString(compressedEvienceBase64)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to decode evidence: %v\", err)\n\t}\n\n\tr, err := zlib.NewReader(bytes.NewReader(compressedEvidence))\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to create zlib reader: %v\", err)\n\t}\n\tdefer r.Close()\n\tevidenceBytes, err := io.ReadAll(r)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to read evidence: %v\", err)\n\t}\n\n\tvar evidence map[string]any\n\n\terr = json.Unmarshal(evidenceBytes, &evidence)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to unmarshal evidence: %v\", err)\n\t}\n\n\tvar verifier Verifier\n\n\tif _, ok := evidence[\"test_purpose\"]; ok {\n\t\tverifier, err = NewFallbackVerifier(evidenceBytes)\n\t} else {\n\t\tverifier, err = csv.NewAttestation(string(evidenceBytes))\n\t}\n\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to create csv verifier: %v\", err)\n\t} else {\n\t\treturn verifier, nil\n\t}\n}\n"
  },
  {
    "path": "nhp/core/wasm/engine/engine.go",
    "content": "package engine\n\nimport (\n\t\"context\"\n\t\"log\"\n\n\t\"github.com/tetratelabs/wazero\"\n\t\"github.com/tetratelabs/wazero/api\"\n\t\"github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1\"\n)\n\ntype Engine struct {\n\tctx    context.Context\n\tr      wazero.Runtime\n\tmod    api.Module\n\tmalloc api.Function\n\tfree   api.Function\n}\n\nfunc NewEngine() *Engine {\n\treturn &Engine{}\n}\n\n// LoadWasm loads and instantiates a WASM module from the given byte slice.\n// It sets up the necessary host functions (including logging) and WASI environment.\n// The instantiated module is stored in the Engine for later execution.\n// Returns an error if the WASM module fails to instantiate.\nfunc (e *Engine) LoadWasm(wasmBytes []byte) error {\n\tctx := context.Background()\n\n\tr := wazero.NewRuntime(ctx)\n\n\t_, err := r.NewHostModuleBuilder(\"env\").\n\t\tNewFunctionBuilder().WithFunc(logString).Export(\"log\").\n\t\tInstantiate(ctx)\n\tif err != nil {\n\t\tlog.Panicln(err)\n\t}\n\n\t// Instantiate WASI\n\twasi_snapshot_preview1.MustInstantiate(ctx, r)\n\n\t// Configure the module to initialize the reactor\n\tconfig := wazero.NewModuleConfig().WithStartFunctions(\"_initialize\")\n\n\t// Instantiate the wasm\n\tmod, err := r.InstantiateWithConfig(ctx, wasmBytes, config)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\te.ctx = ctx\n\te.r = r\n\te.mod = mod\n\te.malloc = mod.ExportedFunction(\"malloc\")\n\te.free = mod.ExportedFunction(\"free\")\n\n\treturn nil\n}\n\n// Close terminates the engine's resources by closing the underlying runner.\n// It should be called to clean up resources when the engine is no longer needed.\nfunc (e *Engine) Close() {\n\te.r.Close(e.ctx)\n}\n\nfunc (e *Engine) ReadContentFromVMMemory(memPos uint32, memLen uint32) []byte {\n\tif bytes, ok := e.mod.Memory().Read(memPos, memLen); !ok {\n\t\tlog.Panicf(\"error reading memory at 0x%x with length %d\", memPos, memLen)\n\t\treturn nil\n\t} else {\n\t\treturn bytes\n\t}\n}\n\nfunc (e *Engine) WriteContentToVMMemory(content string) (memPos uint64, memLen uint64) {\n\tmemLen = uint64(len(content))\n\n\tresults, err := e.malloc.Call(e.ctx, memLen)\n\tif err != nil {\n\t\tlog.Panicln(err)\n\t}\n\n\tmemPos = results[0]\n\n\tif !e.mod.Memory().Write(uint32(memPos), []byte(content)) {\n\t\tlog.Panicln(\"out of range of memory size\")\n\t}\n\n\treturn\n}\n\nfunc (e *Engine) OnAttestationCollect() (attestation string) {\n\tonAttestationCollectFunc := e.mod.ExportedFunction(\"onAttestationCollect\")\n\n\tresult, err := onAttestationCollectFunc.Call(e.ctx)\n\tif err != nil {\n\t\tlog.Panicln(err)\n\t}\n\n\tmemPos := uint32(result[0] >> 32)\n\tmemLen := uint32(result[0])\n\n\tattestationBytes := e.ReadContentFromVMMemory(memPos, memLen)\n\tif attestationBytes == nil {\n\t\tlog.Panicln(\"error reading attestation bytes\")\n\t}\n\n\treturn string(attestationBytes)\n}\n\nfunc (e *Engine) OnAttestationVerify(attestation string) bool {\n\tonAttestationVerifyFunc := e.mod.ExportedFunction(\"onAttestationVerify\")\n\n\tattestationPos, attestationLen := e.WriteContentToVMMemory(attestation)\n\n\tresult, err := onAttestationVerifyFunc.Call(e.ctx, attestationPos, attestationLen)\n\tif err != nil {\n\t\tlog.Panicln(err)\n\t}\n\n\tif result[0] == 1 {\n\t\treturn true\n\t}\n\n\treturn false\n}\n\nfunc (e *Engine) OnDataPreprocess(metadata string, rawData string, filter string) (processedData string) {\n\tonDataPreprocessFunc := e.mod.ExportedFunction(\"onDataPreprocess\")\n\n\tmetadataPos, metadataLen := e.WriteContentToVMMemory(metadata)\n\trawDataPos, rawDataLen := e.WriteContentToVMMemory(rawData)\n\tfilterPos, filterLen := e.WriteContentToVMMemory(filter)\n\n\tresult, err := onDataPreprocessFunc.Call(e.ctx, metadataPos, metadataLen, rawDataPos, rawDataLen, filterPos, filterLen)\n\tif err != nil {\n\t\tlog.Panicln(err)\n\t}\n\n\tmemPos := uint32(result[0] >> 32)\n\tmemLen := uint32(result[0])\n\n\tprocessedDataBytes := e.ReadContentFromVMMemory(memPos, memLen)\n\tif processedDataBytes == nil {\n\t\tlog.Panicln(\"error reading processed data bytes\")\n\t}\n\n\treturn string(processedDataBytes)\n}\n\nfunc (e *Engine) OnDataPostprocess(rawOutput string) (processedOutput string) {\n\tonDataPostprocessFunc := e.mod.ExportedFunction(\"onDataPostprocess\")\n\n\trawOutputPos, rawOutputLen := e.WriteContentToVMMemory(rawOutput)\n\n\tresult, err := onDataPostprocessFunc.Call(e.ctx, rawOutputPos, rawOutputLen)\n\tif err != nil {\n\t\tlog.Panicln(err)\n\t}\n\n\tmemPos := uint32(result[0] >> 32)\n\tmemLen := uint32(result[0])\n\n\tprocessedOutputBytes := e.ReadContentFromVMMemory(memPos, memLen)\n\tif processedOutputBytes == nil {\n\t\tlog.Panicln(\"error reading processed output bytes\")\n\t}\n\n\treturn string(processedOutputBytes)\n}\n"
  },
  {
    "path": "nhp/core/wasm/engine/host.go",
    "content": "// Package engine provides host functions that can be called from within a WebAssembly (WASM) virtual machine.\n// These functions enable interaction between the WASM runtime and the host environment,\n// such as logging operations or other system-level interactions.\n\npackage engine\n\nimport (\n\t\"bytes\"\n\t\"compress/zlib\"\n\t\"context\"\n\t\"crypto/sha256\"\n\t\"encoding/base64\"\n\t\"encoding/hex\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io\"\n\t\"log\"\n\t\"net/http\"\n\t\"os\"\n\t\"time\"\n\n\t\"github.com/tetratelabs/wazero/api\"\n)\n\nvar (\n\tconfidentialContainerEvidenceUrl = \"http://127.0.0.1:8006/aa/evidence?runtime_data=dhp\"\n)\n\nfunc logString(_ context.Context, m api.Module, offset, byteCount uint32) {\n\tbuf, ok := m.Memory().Read(offset, byteCount)\n\tif !ok {\n\t\tlog.Panicf(\"Memory.Read(%d, %d) out of range\", offset, byteCount)\n\t}\n\tfmt.Println(string(buf))\n}\n\nfunc GetEvidenceWithCCUrl() ([]byte, error) {\n\tclient := &http.Client{Timeout: 3 * time.Second}\n\n\tresp, err := client.Get(confidentialContainerEvidenceUrl)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"http request failed: %w\", err)\n\t}\n\n\tdefer resp.Body.Close()\n\n\tif resp.StatusCode != http.StatusOK {\n\t\treturn nil, fmt.Errorf(\"unexpected status code: %d\", resp.StatusCode)\n\t}\n\n\tbody, err := io.ReadAll(resp.Body)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to read response body: %w\", err)\n\t}\n\n\tvar buf bytes.Buffer\n\tw := zlib.NewWriter(&buf)\n\t_, err = w.Write(body)\n\tw.Close()\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to compress response body: %w\", err)\n\t}\n\n\tcompressedBody := buf.Bytes()\n\n\treturn compressedBody, nil\n}\n\nfunc GetEvidenceWithAgentUuid() ([]byte, error) {\n\tagentUniqueId, err := CalculateAgentUniqueId()\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to get agent unique id: %v\", err)\n\t}\n\n\tevidence := map[string]any{\n\t\t\"test_purpose\":  \"this evidence is for testing purposes only\",\n\t\t\"measure\":       agentUniqueId,\n\t\t\"serial_number\": agentUniqueId,\n\t}\n\n\tevidenceBytes, err := json.Marshal(evidence)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to marshal evidence: %v\", err)\n\t}\n\n\tvar buf bytes.Buffer\n\tw := zlib.NewWriter(&buf)\n\t_, err = w.Write(evidenceBytes)\n\tw.Close()\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to compress response body: %w\", err)\n\t}\n\n\treturn buf.Bytes(), nil\n}\n\nfunc GetEvidence() (string, error) {\n\tevidence, err := GetEvidenceWithCCUrl()\n\tif err != nil {\n\t\tevidence, err = GetEvidenceWithAgentUuid()\n\t\tif err != nil {\n\t\t\treturn \"\", fmt.Errorf(\"failed to get evidence from CC or agent uuid\")\n\t\t}\n\t}\n\n\treturn base64.StdEncoding.EncodeToString(evidence), nil\n}\n\nfunc CalculateAgentUniqueId() (string, error) {\n\thostname, err := os.Hostname()\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\tcgroup, _ := os.ReadFile(\"/proc/self/cgroup\")\n\tcombined := hostname + string(cgroup)\n\tsum := sha256.Sum256([]byte(combined))\n\n\treturn hex.EncodeToString(sum[:]), nil\n}\n"
  },
  {
    "path": "nhp/core/wasm/engine/host_test.go",
    "content": "package engine\n\nimport (\n\t\"testing\"\n)\n\nfunc TestGetEvidence(t *testing.T) {\n\tevidence, err := GetEvidence()\n\tif err != nil {\n\t\tt.Errorf(\"GetEvidence() error = %v\", err)\n\t\treturn\n\t}\n\n\tt.Logf(\"GetEvidence() = %v\", evidence)\n}\n"
  },
  {
    "path": "nhp/core/wasm/policy/host.go",
    "content": "//go:build wasip1 || wasm\n\n// this package is used to import host function\n\npackage policy\n\nimport (\n\t\"runtime\"\n\n\t\"github.com/OpenNHP/opennhp/nhp/core/wasm/policy/memory\"\n)\n\n// _log is a WebAssembly import which prints a string (linear memory offset,\n// byteCount) to the console.\n//\n//go:wasmimport env log\nfunc _log(ptr, size uint32)\n\nfunc Log(message string) {\n\tptr, size := memory.StringToPtr(message)\n\t_log(ptr, size)\n\truntime.KeepAlive(message)\n}\n"
  },
  {
    "path": "nhp/core/wasm/policy/impl/policy.go",
    "content": "//go:build wasip1 || wasm\n\n// This file contains the concrete implementation of the policy interface.\n// User should focus on implementing the Policy interface methods in this package\n// to define their specific policy logic.\n//\n// After finished, user should import this package in their policy.go file,\n// and create the corresponding policy instance to override PolicyInstance\n// which is defined in pkg/policy/main/policy.go.\n//\n// Policy interface is defined in pkg/policy/interface.go\n\npackage impl\n\nimport (\n\t\"encoding/json\"\n\n\t\"github.com/OpenNHP/opennhp/nhp/core/wasm/policy\"\n)\n\ntype Attestation struct {\n\tKernelVersion   string `json:\"kernelVersion\"`\n\tInKataContainer bool   `json:\"inKataContainer\"`\n\tCanDialIn       bool   `json:\"canDialIn\"`\n\tCPUModel        string `json:\"cpuModel\"`\n\tProductName     string `json:\"productName\"`\n\tManufacturer    string `json:\"manufacturer\"`\n}\n\ntype PolicyImpl struct {\n}\n\nfunc NewPolicy() policy.Policy {\n\treturn &PolicyImpl{}\n}\n\nfunc (p *PolicyImpl) OnAttestationCollect() (attestation string) {\n\tattestationStruct := Attestation{\n\t\tKernelVersion:   \"4.19.121-linuxkit\",\n\t\tInKataContainer: true,\n\t\tCanDialIn:       true,\n\t\tCPUModel:        \"Intel(R) Core(TM) i7-8550U CPU @ 1.80GHz\",\n\t\tProductName:     \"Intel(R) Core(TM) i7-8550U CPU @ 1.80GHz\",\n\t}\n\n\tattestationJson, _ := json.Marshal(attestationStruct)\n\n\treturn string(attestationJson)\n}\n\nfunc (p *PolicyImpl) OnAttestationVerify(attestation string) bool {\n\tpolicy.Log(\"OnAttestationVerify: log attestation in wasm vm: \" + attestation)\n\n\treturn true\n}\n\nfunc (p *PolicyImpl) OnDataPreprocess(metadata string, rawData string, filter string) (processedData string) {\n\tpolicy.Log(\"log metadata in wasm vm: \" + metadata)\n\tpolicy.Log(\"log rawData in wasm vm: \" + rawData)\n\tpolicy.Log(\"log filter in wasm vm: \" + filter)\n\n\treturn \"{\\\"preprocessData\\\": \\\"example\\\"}\"\n}\n\nfunc (p *PolicyImpl) OnDataPostprocess(rawOutput string) (processedOutput string) {\n\tpolicy.Log(\"OnDataPostprocess: log rawOutput in wasm vm: \" + rawOutput)\n\n\treturn rawOutput\n}\n"
  },
  {
    "path": "nhp/core/wasm/policy/interface.go",
    "content": "package policy\n\n// Policy interface implemented in Go, designed for interaction between host and a WebAssembly (WASM) virtual machine.\n// That means that caller (here called engine) implements this interface to interact with WebAssembly (WASM) virtual machine.\n// Policy provider implments this interface for concrete policy.\n// It is intended to be language-agnostic: equivalent interfaces should be implemented in other\n// languages (e.g., Rust, C, AssemblyScript) to support the same behavior in cross-platform WASM environments.\n\n// Notes: the format of all string parameters is JSON.\n\ntype Policy interface {\n\t// Collect attestation, policy provider needs to implement this method to collect any required attestation\n\tOnAttestationCollect() (attestation string)\n\n\t// Verify attestation, policy provider needs to implement this method to verify attestation which is collected by OnAttestationCollect\n\tOnAttestationVerify(attestation string) bool\n\n\t// Preprocess data. The policy provider must implement this method to transform or sanitize the data, ensuring it is safe and compliant for use by the data consumer.\n\tOnDataPreprocess(metadata string, rawData string, filter string) (processedData string)\n\n\t// Postprocess data. The policy provider must implement this method to validate data returned by the data consumer, ensuring it remains safe and policy-compliant.\n\tOnDataPostprocess(rawOutput string) (processedOutput string)\n}\n"
  },
  {
    "path": "nhp/core/wasm/policy/main/main.go",
    "content": "//go:build wasip1 || wasm\n\npackage main\n\nimport (\n\t\"github.com/OpenNHP/opennhp/nhp/core/wasm/policy/impl\"\n\t\"github.com/OpenNHP/opennhp/nhp/core/wasm/policy/memory\"\n)\n\nvar PolicyInstance = impl.NewPolicy()\n\n// Use `tinygo build -o policy.wasm -scheduler=none --no-debug -buildmode=c-shared -target=wasi main.go` to build the wasm file\n\n// entrypoint of policy which will be compiled to wasm, in general, don't change this file. Write the policy in policy.go.\nfunc main() {}\n\n//go:wasmexport onAttestationCollect\nfunc onAttestationCollect() uint64 {\n\tattestationJson := PolicyInstance.OnAttestationCollect()\n\n\tposSizePair := memory.CopyBufferToMemory([]byte(attestationJson))\n\n\treturn posSizePair\n}\n\n//go:wasmexport onAttestationVerify\nfunc onAttestationVerify(attestationPosition *uint32, attestationLength uint32) bool {\n\tattestationJson := memory.ReadBufferFromMemory(attestationPosition, attestationLength)\n\n\treturn PolicyInstance.OnAttestationVerify(string(attestationJson))\n}\n\n//go:wasmexport onDataPreprocess\nfunc onDataPreprocess(metaDataPosition *uint32, metaDataLength uint32, rawDataPosition *uint32, rawDataLength uint32, filterPosition *uint32, filterLength uint32) uint64 {\n\tmetaDataJson := memory.ReadBufferFromMemory(metaDataPosition, metaDataLength)\n\trawDataJson := memory.ReadBufferFromMemory(rawDataPosition, rawDataLength)\n\tfilterJson := memory.ReadBufferFromMemory(filterPosition, filterLength)\n\n\tprocessed_data := PolicyInstance.OnDataPreprocess(string(metaDataJson), string(rawDataJson), string(filterJson))\n\n\treturn memory.CopyBufferToMemory([]byte(processed_data))\n}\n\n//go:wasmexport onDataPostprocess\nfunc onDataPostprocess(rawDataPosition *uint32, rawDataLength uint32) uint64 {\n\trawData := memory.ReadBufferFromMemory(rawDataPosition, rawDataLength)\n\n\tprocessedData := PolicyInstance.OnDataPostprocess(string(rawData))\n\n\treturn memory.CopyBufferToMemory([]byte(processedData))\n}\n"
  },
  {
    "path": "nhp/core/wasm/policy/memory/memory.go",
    "content": "package memory\n\nimport (\n\t\"unsafe\"\n)\n\n// ReadBufferFromMemory returns a buffer from memory of WebAssembly VM\nfunc ReadBufferFromMemory(bufferPosition *uint32, length uint32) []byte {\n\tsubjectBuffer := make([]byte, length)\n\t// Convert the pointer to a byte slice pointer first\n\t//nolint:gosec // G103: Required for WASM memory access - pointer comes from WASM runtime\n\tdata := unsafe.Slice((*byte)(unsafe.Pointer(bufferPosition)), length)\n\tfor i := range subjectBuffer {\n\t\tsubjectBuffer[i] = data[i]\n\t}\n\treturn subjectBuffer\n}\n\n// CopyBufferToMemory returns a single value\n// (a kind of pair with position and length)\nfunc CopyBufferToMemory(buffer []byte) uint64 {\n\tbufferPtr := &buffer[0]\n\t//nolint:gosec // G103: Required for WASM memory access - returns pointer to Go memory for WASM\n\tunsafePtr := uintptr(unsafe.Pointer(bufferPtr))\n\n\t//nolint:gosec // G115: Pointer truncation is intentional for 32-bit WASM address space\n\tptr := uint32(unsafePtr)\n\t//nolint:gosec // G115: Buffer length is always within uint32 range for WASM\n\tsize := uint32(len(buffer))\n\n\treturn (uint64(ptr) << uint64(32)) | uint64(size)\n}\n\nfunc StringToPtr(s string) (uint32, uint32) {\n\t//nolint:gosec // G103: Required for WASM string passing - pointer to string data for WASM\n\tptr := unsafe.Pointer(unsafe.StringData(s))\n\t//nolint:gosec // G115: Pointer truncation is intentional for 32-bit WASM address space\n\treturn uint32(uintptr(ptr)), uint32(len(s))\n}\n"
  },
  {
    "path": "nhp/core/ztdo/noise.go",
    "content": "package ztdo\n\nimport (\n\t\"crypto/aes\"\n\t\"crypto/cipher\"\n\t\"crypto/rand\"\n\t\"encoding/base64\"\n\t\"fmt\"\n\n\t\"github.com/emmansun/gmsm/sm4\"\n\n\t\"github.com/OpenNHP/opennhp/nhp/core\"\n)\n\nconst (\n\tInitialDHPKeyWrappingString = \"DHP Data Private Key Wrapping\"\n)\n\n// Data Key Pair generation interface\n// - Support locally stored key generation by DB\n// - Support KMS (Key Management Service) integration for secure key generation and management\n// - Add TPM (Trusted Platform Module) based key derivation for hardware-backed security\n// These extensions can be implemented by creating new types that satisfy the DataKeyPairGenerator interface.\ntype DataKeyPairGenerator interface {\n\tGenerate(mode DataKeyPairECCMode) (privateKey []byte)\n}\n\n// Symmetric cipher mode provides symmetric encryption and decryption and supports Chinese standards and International standards.\ntype SymmetricCipherMode uint8\n\nconst (\n\tAES256GCM64Tag  SymmetricCipherMode = iota // 0x00\n\tAES256GCM96Tag                             // 0x01\n\tAES256GCM104Tag                            // 0x02\n\tAES256GCM112Tag                            // 0x03\n\tAES256GCM120Tag                            // 0x04\n\tAES256GCM128Tag                            // 0x05\n\tSM4GCM64Tag                                // 0x06\n\tSM4GCM128Tag                               // 0x07\n)\n\nfunc (m SymmetricCipherMode) String() string {\n\tswitch m {\n\tcase AES256GCM64Tag:\n\t\treturn \"AES-256-GCM-64\"\n\tcase AES256GCM96Tag:\n\t\treturn \"AES-256-GCM-96\"\n\tcase AES256GCM104Tag:\n\t\treturn \"AES-256-GCM-104\"\n\tcase AES256GCM112Tag:\n\t\treturn \"AES-256-GCM-112\"\n\tcase AES256GCM120Tag:\n\t\treturn \"AES-256-GCM-120\"\n\tcase AES256GCM128Tag:\n\t\treturn \"AES-256-GCM-128\"\n\tcase SM4GCM64Tag:\n\t\treturn \"SM4-GCM-64\"\n\tcase SM4GCM128Tag:\n\t\treturn \"SM4-GCM-128\"\n\tdefault:\n\t\treturn \"Unknown\"\n\t}\n}\n\nfunc (m SymmetricCipherMode) TagSize() int {\n\tswitch m {\n\tcase AES256GCM64Tag, SM4GCM64Tag:\n\t\treturn 8\n\tcase AES256GCM96Tag:\n\t\treturn 12\n\tcase AES256GCM104Tag:\n\t\treturn 13\n\tcase AES256GCM112Tag:\n\t\treturn 14\n\tcase AES256GCM120Tag:\n\t\treturn 15\n\tcase AES256GCM128Tag, SM4GCM128Tag:\n\t\treturn 16\n\tdefault:\n\t\treturn 0\n\t}\n}\n\nfunc NewSymmetricCipherMode(mode string) (SymmetricCipherMode, error) {\n\tswitch mode {\n\tcase \"AES-256-GCM-64\":\n\t\treturn AES256GCM64Tag, nil\n\tcase \"AES-256-GCM-96\":\n\t\treturn AES256GCM96Tag, nil\n\tcase \"AES-256-GCM-104\":\n\t\treturn AES256GCM104Tag, nil\n\tcase \"AES-256-GCM-112\":\n\t\treturn AES256GCM112Tag, nil\n\tcase \"AES-256-GCM-120\":\n\t\treturn AES256GCM120Tag, nil\n\tcase \"AES-256-GCM-128\":\n\t\treturn AES256GCM128Tag, nil\n\tcase \"SM4-GCM-64\":\n\t\treturn SM4GCM64Tag, nil\n\tcase \"SM4-GCM-128\":\n\t\treturn SM4GCM128Tag, nil\n\tdefault:\n\t\treturn 0, fmt.Errorf(\"unknown symmetric mode name: %s\", mode)\n\t}\n}\nfunc (mode SymmetricCipherMode) newCipherBlock(key []byte) (cipher.Block, error) {\n\tswitch mode {\n\tcase AES256GCM64Tag, AES256GCM96Tag, AES256GCM104Tag,\n\t\tAES256GCM112Tag, AES256GCM120Tag, AES256GCM128Tag:\n\t\tif len(key) != 32 {\n\t\t\treturn nil, fmt.Errorf(\"invalid key length for AES-256-GCM\")\n\t\t}\n\t\treturn aes.NewCipher(key)\n\tcase SM4GCM64Tag, SM4GCM128Tag:\n\t\tif len(key) < 16 {\n\t\t\treturn nil, fmt.Errorf(\"invalid key length for SM4-GCM\")\n\t\t} else {\n\t\t\tkey = key[:16]\n\t\t}\n\t\treturn sm4.NewCipher(key)\n\tdefault:\n\t\treturn nil, fmt.Errorf(\"unsupported mode: %v\", mode)\n\t}\n}\n\nfunc (mode SymmetricCipherMode) Encrypt(key, nonce, plaintext, ad []byte) ([]byte, error) {\n\ttagSize := mode.TagSize()\n\n\tcipherBlock, err := mode.newCipherBlock(key)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\taead, err := cipher.NewGCMWithTagSize(cipherBlock, tagSize)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tciphertext := aead.Seal(plaintext[:0], nonce, plaintext, ad)\n\n\treturn ciphertext, nil\n}\n\nfunc (mode SymmetricCipherMode) Decrypt(key, nonce, ciphertext, ad []byte) ([]byte, error) {\n\ttagSize := mode.TagSize()\n\n\tcipherBlock, err := mode.newCipherBlock(key)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\taead, err := cipher.NewGCMWithTagSize(cipherBlock, tagSize)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tplaintext, err := aead.Open(ciphertext[:0], nonce, ciphertext, ad)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn plaintext, nil\n}\n\n// DataKeyPairECCMode is a adapter for ECC key pair generation\ntype DataKeyPairECCMode uint8\n\nconst (\n\tCURVE25519 DataKeyPairECCMode = iota\n\tSM2\n\tUNKNOWN\n)\n\nfunc (d DataKeyPairECCMode) String() string {\n\tswitch d {\n\tcase CURVE25519:\n\t\treturn \"CURVE25519\"\n\tcase SM2:\n\t\treturn \"SM2\"\n\tdefault:\n\t\treturn \"UNKNOWN\"\n\t}\n}\n\nfunc (d DataKeyPairECCMode) ToEccType() core.EccTypeEnum {\n\tswitch d {\n\tcase CURVE25519:\n\t\treturn core.ECC_CURVE25519\n\tcase SM2:\n\t\treturn core.ECC_SM2\n\tdefault:\n\t\treturn core.ECC_UMI\n\t}\n}\n\nfunc (d DataKeyPairECCMode) ToHashType() core.HashTypeEnum {\n\tswitch d {\n\tcase CURVE25519:\n\t\treturn core.HASH_SHA256\n\tcase SM2:\n\t\treturn core.HASH_SM3\n\tdefault:\n\t\treturn core.HASH_SHA256\n\t}\n}\n\nfunc NewDataKeyPairECCModeWithName(mode string) (DataKeyPairECCMode, error) {\n\tswitch mode {\n\tcase \"CURVE25519\":\n\t\treturn CURVE25519, nil\n\tcase \"SM2\":\n\t\treturn SM2, nil\n\tdefault:\n\t\treturn 0, fmt.Errorf(\"unknown mode: %s\", mode)\n\t}\n}\n\nfunc NewDataKeyPairECCMode(eccMode core.EccTypeEnum) (DataKeyPairECCMode, error) {\n\tswitch eccMode {\n\tcase core.ECC_CURVE25519:\n\t\treturn CURVE25519, nil\n\tcase core.ECC_SM2:\n\t\treturn SM2, nil\n\tdefault:\n\t\treturn 0, fmt.Errorf(\"unknown mode: %d\", eccMode)\n\t}\n}\n\nfunc (d DataKeyPairECCMode) ECDHFromKey(prk []byte) core.Ecdh {\n\treturn core.ECDHFromKey(d.ToEccType(), prk)\n}\n\nfunc (d DataKeyPairECCMode) PublicKeyFromKey(prk []byte) []byte {\n\treturn core.ECDHFromKey(d.ToEccType(), prk).PublicKey()\n}\n\n// MessagePattern defines a set of tokens which are used during symmetric key agreement\ntype MessagePattern int\n\nconst (\n\tMessagePatternS MessagePattern = iota\n\tMessagePatternE\n\tMessagePatternRS\n\tMessagePatternRE\n\tMessagePatternDHEE\n\tMessagePatternDHES\n\tMessagePatternDHSE\n\tMessagePatternDHSS\n)\n\ntype SymmetricAgreement struct {\n\tss              core.NoiseFactory\n\ts               core.Ecdh          // local static key pair\n\te               core.Ecdh          // local ephemeral key pair\n\trs              []byte             // remote static key\n\tre              []byte             // remote ephemeral key\n\tmessagePatterns [][]MessagePattern // 1st row is for provider, 2nd row for consumer\n\tpsk             []byte             // pre-shared key\n\tisPskUsed       bool\n\tprovider        bool               // provider or consumer\n\teccMode         DataKeyPairECCMode // need to keep the same with NHP agent and NHP-DB\n}\n\nfunc NewSymmetricAgreement(eccMode DataKeyPairECCMode, provider bool) *SymmetricAgreement {\n\tsa := &SymmetricAgreement{\n\t\tpsk:       []byte(\"\"),\n\t\tisPskUsed: false,\n\t\tprovider:  provider,\n\t\teccMode:   eccMode,\n\t}\n\n\tsa.ss.HashType = eccMode.ToHashType()\n\n\treturn sa\n}\n\nfunc (sa *SymmetricAgreement) SetPsk(psk []byte) {\n\tsa.psk = psk\n\tsa.isPskUsed = true\n}\n\nfunc (sa *SymmetricAgreement) SetStaticKeyPair(s core.Ecdh) {\n\tsa.s = s\n}\n\nfunc (sa *SymmetricAgreement) SetEphemeralKeyPair(e core.Ecdh) {\n\tsa.e = e\n}\n\nfunc (sa *SymmetricAgreement) SetRemoteStaticPublicKey(rs []byte) {\n\tsa.rs = rs\n}\n\nfunc (sa *SymmetricAgreement) SetRemoteEphemeralPublicKey(re []byte) {\n\tsa.re = re\n}\n\nfunc (sa *SymmetricAgreement) SetMessagePatterns(msgPatterns [][]MessagePattern) {\n\tsa.messagePatterns = msgPatterns\n}\n\nfunc (sa *SymmetricAgreement) AgreeSymmetricKey() (gcmKey [core.SymmetricKeySize]byte, ad []byte) {\n\t// ck is chaining key that hashes all previous DH outputs\n\tck := [core.SymmetricKeySize]byte{}\n\n\t// adHash hashes all the involved public key, the final value will be used as associated data for AEAD authentication\n\tadHash, err := core.NewHash(sa.eccMode.ToHashType())\n\tif err != nil {\n\t\tpanic(\"failed to create hash for symmetric agreement: \" + err.Error())\n\t}\n\n\tif sa.isPskUsed {\n\t\tadHash.Write(sa.psk)\n\t\tsa.ss.KeyGen1(&ck, adHash.Sum(nil), sa.psk)\n\t}\n\n\tvar msgPatterns []MessagePattern\n\n\tif sa.provider {\n\t\tmsgPatterns = sa.messagePatterns[0]\n\t} else {\n\t\tmsgPatterns = sa.messagePatterns[1]\n\t}\n\n\tfor idx, pattern := range msgPatterns {\n\t\tswitch pattern {\n\t\tcase MessagePatternS:\n\t\t\tadHash.Write(sa.s.PublicKey())\n\t\tcase MessagePatternE:\n\t\t\tadHash.Write(sa.e.PublicKey())\n\t\tcase MessagePatternRS:\n\t\t\tadHash.Write(sa.rs)\n\t\tcase MessagePatternRE:\n\t\t\tadHash.Write(sa.re)\n\t\tcase MessagePatternDHSS:\n\t\t\tss := sa.s.SharedSecret(sa.rs)\n\t\t\tif sa.provider {\n\t\t\t\tadHash.Write(sa.rs)\n\t\t\t\tsa.ss.MixKey(&ck, ck[:], sa.rs)\n\t\t\t} else {\n\t\t\t\tadHash.Write(sa.s.PublicKey())\n\t\t\t\tsa.ss.MixKey(&ck, ck[:], sa.s.PublicKey())\n\t\t\t}\n\t\t\tif idx == len(msgPatterns)-1 {\n\t\t\t\tsa.ss.KeyGen2(&ck, &gcmKey, ck[:], ss[:])\n\t\t\t} else {\n\t\t\t\tsa.ss.MixKey(&ck, ck[:], ss[:])\n\t\t\t}\n\t\tcase MessagePatternDHSE:\n\t\t\tse := sa.s.SharedSecret(sa.re)\n\t\t\tif sa.provider {\n\t\t\t\tadHash.Write(sa.re)\n\t\t\t\tsa.ss.MixKey(&ck, ck[:], sa.re)\n\t\t\t} else {\n\t\t\t\tadHash.Write(sa.s.PublicKey())\n\t\t\t\tsa.ss.MixKey(&ck, ck[:], sa.s.PublicKey())\n\t\t\t}\n\t\t\tif idx == len(msgPatterns)-1 {\n\t\t\t\tsa.ss.KeyGen2(&ck, &gcmKey, ck[:], se[:])\n\t\t\t} else {\n\t\t\t\tsa.ss.MixKey(&ck, ck[:], se[:])\n\t\t\t}\n\t\tcase MessagePatternDHEE:\n\t\t\tee := sa.e.SharedSecret(sa.re)\n\t\t\tif sa.provider {\n\t\t\t\tadHash.Write(sa.re)\n\t\t\t\tsa.ss.MixKey(&ck, ck[:], sa.re)\n\t\t\t} else {\n\t\t\t\tadHash.Write(sa.e.PublicKey())\n\t\t\t\tsa.ss.MixKey(&ck, ck[:], sa.e.PublicKey())\n\t\t\t}\n\t\t\tif idx == len(msgPatterns)-1 {\n\t\t\t\tsa.ss.KeyGen2(&ck, &gcmKey, ck[:], ee[:])\n\t\t\t} else {\n\t\t\t\tsa.ss.MixKey(&ck, ck[:], ee[:])\n\t\t\t}\n\t\tcase MessagePatternDHES:\n\t\t\tes := sa.e.SharedSecret(sa.rs)\n\t\t\tif sa.provider {\n\t\t\t\tadHash.Write(sa.rs)\n\t\t\t\tsa.ss.MixKey(&ck, ck[:], sa.rs)\n\t\t\t} else {\n\t\t\t\tadHash.Write(sa.e.PublicKey())\n\t\t\t\tsa.ss.MixKey(&ck, ck[:], sa.e.PublicKey())\n\t\t\t}\n\t\t\tif idx == len(msgPatterns)-1 {\n\t\t\t\tsa.ss.KeyGen2(&ck, &gcmKey, ck[:], es[:])\n\t\t\t} else {\n\t\t\t\tsa.ss.MixKey(&ck, ck[:], es[:])\n\t\t\t}\n\t\t}\n\t}\n\n\tad = adHash.Sum(nil)\n\n\treturn\n}\n\n// Message patterns that are used for agreeing symmetric key to be used for data private key encryption and decryption.\nvar DataPrivateKeyWrappingPatterns = [][]MessagePattern{\n\t{MessagePatternDHSS, MessagePatternS, MessagePatternDHSE},\n\t{MessagePatternDHSS, MessagePatternRS, MessagePatternDHES},\n}\n\ntype DataPrivateKeyWrapping struct {\n\tProviderPublicKeyBase64 string `json:\"providerPublicKeyBase64\"`\n\tIvBase64                string `json:\"ivBase64\"`\n\tPrkWrapping             string `json:\"prkWrapping\"`\n}\n\nfunc NewDataPrivateKeyWrapping(providerPublicKeyBase64 string, dataPrivateKeyBase64 string, key, ad []byte) *DataPrivateKeyWrapping {\n\tsymmetricCipherMode := AES256GCM128Tag\n\tvar Iv [core.GCMNonceSize]byte\n\tif _, err := rand.Read(Iv[:]); err != nil {\n\t\tpanic(\"crypto/rand.Read failed: \" + err.Error())\n\t}\n\n\tcipherText, _ := symmetricCipherMode.Encrypt(key, Iv[:], []byte(dataPrivateKeyBase64), ad) //nolint:gosec // G104: Encrypt with valid key/IV doesn't fail\n\n\treturn &DataPrivateKeyWrapping{\n\t\tProviderPublicKeyBase64: providerPublicKeyBase64,\n\t\tIvBase64:                base64.StdEncoding.EncodeToString(Iv[:]),\n\t\tPrkWrapping:             base64.StdEncoding.EncodeToString(cipherText),\n\t}\n}\n\nfunc (d *DataPrivateKeyWrapping) Unwrap(key, ad []byte) (dataPrivateKeyBase64 string, err error) {\n\tsymmetricCipherMode := AES256GCM128Tag\n\n\tIv, err := base64.StdEncoding.DecodeString(d.IvBase64)\n\tif err != nil {\n\t\treturn\n\t}\n\n\tcipherText, err := base64.StdEncoding.DecodeString(d.PrkWrapping)\n\tif err != nil {\n\t\treturn\n\t}\n\n\tdataPrk, err := symmetricCipherMode.Decrypt(key, Iv, cipherText, ad)\n\tif err != nil {\n\t\treturn\n\t}\n\n\tdataPrivateKeyBase64 = string(dataPrk)\n\n\treturn\n}\n"
  },
  {
    "path": "nhp/core/ztdo/ztdo.go",
    "content": "package ztdo\n\nimport (\n\t\"bytes\"\n\t\"crypto/hmac\"\n\t\"crypto/rand\"\n\t\"encoding/binary\"\n\t\"fmt\"\n\t\"hash\"\n\t\"io\"\n\t\"math\"\n\t\"os\"\n\t\"reflect\"\n\n\t\"github.com/google/uuid\"\n\n\t\"github.com/OpenNHP/opennhp/nhp/core\"\n)\n\nconst (\n\tMagicNumberSize      = 4\n\tObjectIDSize         = 16\n\tVersionSize          = 2\n\tNhpServerLenSize     = 1\n\tNhpServerMaxSize     = 255\n\tCipherConfigSize     = 1\n\tMetadataLenSize      = 2\n\tMetadataChunkMaxSize = 32767\n\tPayloadLengthSize    = 3\n\tIVSize               = 12\n\tSIGNATURELenSize     = 32\n\tLENGTHFOR            = \"lengthFor\"\n\tLENGTHCONTINUE       = \"lengthContinue\"\n\tSUBTRACTFROM         = \"subtractFrom\"\n\tDATACHUNKSIZE        = 16777187 // this is calculated by 2 ** 24 - 1 - IVSize (12 bytes) - MaxTagSize (16 bytes)\n)\n\nvar lengthMap map[string]uint32 // map to store result after parsing the lengthFor tag\nvar lengthContinueIndicator bool = false\nvar littleEndian bool = true\n\n// Endianness hides the endianness handling to make it easier to change the endianness of ztdo\ntype Endianness struct {\n\tlittleEndian bool\n}\n\nfunc (e *Endianness) PutUint32(b []byte, v uint32) {\n\tif littleEndian {\n\t\tbinary.LittleEndian.PutUint32(b, v)\n\t} else {\n\t\tbinary.BigEndian.PutUint32(b, v)\n\t}\n}\n\nfunc (e *Endianness) Uint32(b []byte) uint32 {\n\tif littleEndian {\n\t\treturn binary.LittleEndian.Uint32(b)\n\t} else {\n\t\treturn binary.BigEndian.Uint32(b)\n\t}\n}\n\nvar endianness = Endianness{littleEndian: littleEndian}\n\ntype ZtdoMetadata struct {\n\tMetadataLen [MetadataLenSize]byte `lengthFor:\"Metadata\" lengthContinue:\"true\"`\n\t// Metadata with variable length from 2 to 65508 bytes\n\tMetadata []byte\n}\n\ntype ZtdoHeader struct {\n\tMagicNumber  [MagicNumberSize]byte\n\tObjectID     [ObjectIDSize]byte\n\tVersion      [VersionSize]byte\n\tNhpServerLen [NhpServerLenSize]byte `lengthFor:\"NhpServer\"`\n\t// NhpServer with variable length from 0 to 255 bytes\n\tNhpServer    []byte\n\tCipherConfig [CipherConfigSize]byte\n\tMetadata     []ZtdoMetadata\n}\n\ntype ZtdoContent struct {\n\tIv         [IVSize]byte `subtractFrom:\"CipherText\"`\n\tCipherText []byte\n}\n\ntype ZtdoPayload struct {\n\tLength  [PayloadLengthSize]byte `lengthFor:\"CipherText\"`\n\tContent ZtdoContent\n}\n\ntype ZtdoSignature struct {\n\tSignature [SIGNATURELenSize]byte\n}\n\ntype Ztdo struct {\n\theader ZtdoHeader\n\t// No ZtdoPayload here, because it has variable length\n\tsignature ZtdoSignature\n}\n\nfunc (header *ZtdoHeader) SetObjectID() {\n\t// generate uuid\n\tuuid := uuid.New()\n\theader.ObjectID = [ObjectIDSize]byte(uuid)\n\n\t// User first 4 bytes to set magic number\n\theader.MagicNumber = [MagicNumberSize]byte(uuid[0:4])\n}\n\nfunc (header *ZtdoHeader) GetObjectID() string {\n\treturn uuid.UUID(header.ObjectID).String()\n}\n\nfunc (header *ZtdoHeader) SetVersion() {\n\theader.Version = [VersionSize]byte{0x00, 0x01}\n}\n\nfunc (header *ZtdoHeader) SetNhpServer(nhpServer string) error {\n\tif len(nhpServer) > NhpServerMaxSize {\n\t\treturn fmt.Errorf(\"nhp server length is too long\")\n\t}\n\n\theader.NhpServerLen[0] = byte(len(nhpServer))\n\theader.NhpServer = []byte(nhpServer)\n\n\treturn nil\n}\n\n// SetMetadata supports variable length of metadata\nfunc (header *ZtdoHeader) SetMetadata(metadata string) error {\n\theader.Metadata = []ZtdoMetadata{}\n\n\ttotalLen := len(metadata)\n\tchunkNum := totalLen / MetadataChunkMaxSize\n\n\tfor i := 0; i < chunkNum; i++ {\n\t\tchunk := metadata[i*MetadataChunkMaxSize : (i+1)*MetadataChunkMaxSize]\n\t\tchunkEncodedLen, err := encodeMetadataLength(len(chunk), true)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\theader.Metadata = append(header.Metadata, ZtdoMetadata{\n\t\t\tMetadata:    []byte(chunk),\n\t\t\tMetadataLen: chunkEncodedLen,\n\t\t})\n\t}\n\n\tchunk := metadata[chunkNum*MetadataChunkMaxSize:]\n\tchunkEncodedLen, _ := encodeMetadataLength(len(chunk), false)\n\theader.Metadata = append(header.Metadata, ZtdoMetadata{\n\t\tMetadata:    []byte(chunk),\n\t\tMetadataLen: chunkEncodedLen,\n\t})\n\n\treturn nil\n}\n\nfunc (header *ZtdoHeader) GetMetadata() []byte {\n\tvar metadata []byte\n\n\tfor _, metadataChunk := range header.Metadata {\n\t\tmetadata = append(metadata, metadataChunk.Metadata...)\n\t}\n\n\treturn metadata\n}\n\nfunc (header *ZtdoHeader) SetCipherConfig(hasSignature bool, mode SymmetricCipherMode, eccMode DataKeyPairECCMode) {\n\tif hasSignature {\n\t\theader.CipherConfig[0] |= 0x80\n\t} else {\n\t\theader.CipherConfig[0] |= 0\n\t}\n\n\theader.CipherConfig[0] |= byte(mode)\n\theader.CipherConfig[0] |= byte(eccMode) << 4\n}\n\nfunc (header *ZtdoHeader) HasSignature() bool {\n\treturn header.CipherConfig[0]&0x80 != 0\n}\n\nfunc (header *ZtdoHeader) GetCipherMode() SymmetricCipherMode {\n\treturn SymmetricCipherMode(header.CipherConfig[0] & 0x0F)\n}\n\nfunc (header *ZtdoHeader) GetECCMode() DataKeyPairECCMode {\n\treturn DataKeyPairECCMode((header.CipherConfig[0] & 0x7F) >> 4)\n}\n\nfunc (payload *ZtdoPayload) SetIV() {\n\tif _, err := rand.Read(payload.Content.Iv[:]); err != nil {\n\t\tpanic(\"crypto/rand.Read failed: \" + err.Error())\n\t}\n}\n\nfunc (payload *ZtdoPayload) SetCipherText(mode SymmetricCipherMode, key, plaintext []byte, ad []byte) error {\n\tvar err error\n\n\tpayload.Content.CipherText, err = mode.Encrypt(key, payload.Content.Iv[:], plaintext, ad)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\nfunc (payload *ZtdoPayload) GetPlainText(mode SymmetricCipherMode, key []byte, ad []byte) ([]byte, error) {\n\treturn mode.Decrypt(key, payload.Content.Iv[:], payload.Content.CipherText, ad)\n}\n\nfunc (payload *ZtdoPayload) SetLength() {\n\tpayloadLen := IVSize + len(payload.Content.CipherText)\n\n\ttmp := make([]byte, 4)\n\tendianness.PutUint32(tmp, uint32(payloadLen))\n\n\tcopy(payload.Length[:], tmp[:PayloadLengthSize])\n}\n\nfunc (payload *ZtdoPayload) GetLength() uint32 {\n\ttmp := make([]byte, 4)\n\n\tcopy(tmp[:3], payload.Length[:])\n\n\treturn endianness.Uint32(tmp[:])\n}\n\nfunc NewZtdoHeader() *ZtdoHeader {\n\theader := &ZtdoHeader{}\n\n\theader.SetObjectID()\n\theader.SetVersion()\n\t// header.SetNhpServer(\"\")\n\n\treturn header\n}\n\nfunc NewZtdoPayload() *ZtdoPayload {\n\tpayload := &ZtdoPayload{}\n\n\tpayload.SetIV()\n\n\treturn payload\n}\n\nfunc NewZtdoSignature() *ZtdoSignature {\n\tsignature := &ZtdoSignature{}\n\n\treturn signature\n}\n\nfunc (signature *ZtdoSignature) mixHash(buf *bytes.Buffer) {\n\thashSig, err := core.NewHash(core.HASH_SHA256)\n\tif err != nil {\n\t\tpanic(\"failed to create hash for signature mixing: \" + err.Error())\n\t}\n\n\thashSig.Write(signature.Signature[:])\n\thashSig.Write(buf.Bytes())\n\tcopy(signature.Signature[:], hashSig.Sum(nil))\n}\n\nfunc (signature *ZtdoSignature) sign(key []byte) {\n\tnewHash := func() hash.Hash {\n\t\th, err := core.NewHash(core.HASH_SHA256)\n\t\tif err != nil {\n\t\t\tpanic(\"failed to create hash for HMAC signing: \" + err.Error())\n\t\t}\n\t\treturn h\n\t}\n\n\thmac := hmac.New(newHash, key)\n\thmac.Write(signature.Signature[:])\n\tcopy(signature.Signature[:], hmac.Sum(nil))\n\n\thmac.Reset()\n}\n\nfunc (signature *ZtdoSignature) verify(in *ZtdoSignature) bool {\n\treturn bytes.Equal(signature.Signature[:], in.Signature[:])\n}\n\nfunc NewZtdo() *Ztdo {\n\treturn &Ztdo{\n\t\theader:    *NewZtdoHeader(),\n\t\tsignature: *NewZtdoSignature(),\n\t}\n}\n\nfunc (ztdo *Ztdo) Generate(mode DataKeyPairECCMode) (privateKey []byte) {\n\tecdh := core.NewECDH(mode.ToEccType())\n\treturn ecdh.PrivateKey()\n}\n\nfunc (ztdo *Ztdo) SetNhpServer(nhpServer string) error {\n\treturn ztdo.header.SetNhpServer(nhpServer)\n}\n\nfunc (ztdo *Ztdo) SetCipherConfig(hasSignature bool, mode SymmetricCipherMode, eccMode DataKeyPairECCMode) {\n\tztdo.header.SetCipherConfig(hasSignature, mode, eccMode)\n}\n\nfunc (ztdo *Ztdo) SetMetadata(metadata string) error {\n\treturn ztdo.header.SetMetadata(metadata)\n}\n\nfunc (ztdo *Ztdo) GetObjectID() string {\n\treturn ztdo.header.GetObjectID()\n}\n\nfunc (ztdo *Ztdo) GetCipherMode() SymmetricCipherMode {\n\treturn ztdo.header.GetCipherMode()\n}\n\nfunc (ztdo *Ztdo) GetECCMode() DataKeyPairECCMode {\n\treturn ztdo.header.GetECCMode()\n}\n\nfunc (ztdo *Ztdo) EncryptZtdoFile(plaintextPath, ciphertextPath string, gcmKey []byte, ad []byte) error {\n\tplaintextFile, err := os.OpenFile(plaintextPath, os.O_RDONLY, 0666)\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer plaintextFile.Close()\n\n\tciphertextFile, err := os.Create(ciphertextPath)\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer ciphertextFile.Close()\n\n\t// If metadata is empty, set it to an empty string\n\tif len(ztdo.header.GetMetadata()) == 0 {\n\t\tif err := ztdo.SetMetadata(\"\"); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\t// Write header\n\theaderBuf := toBuffer(ztdo.header)\n\tztdo.signature.mixHash(headerBuf)\n\tif _, err := ciphertextFile.Write(headerBuf.Bytes()); err != nil {\n\t\treturn err\n\t}\n\n\t// Write payloads\n\tfor {\n\t\tchunkSize := getSecureRandomChunkSize()\n\t\tbuf := make([]byte, chunkSize)\n\t\tn, err := plaintextFile.Read(buf)\n\t\tif err != nil {\n\t\t\tif err != io.EOF {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif n == 0 { // protect\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\n\t\tpayload := NewZtdoPayload()\n\t\tif err := payload.SetCipherText(ztdo.header.GetCipherMode(), gcmKey, buf[:n], ad); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tpayload.SetLength()\n\t\tpayloadBuf := toBuffer(payload)\n\t\tztdo.signature.mixHash(payloadBuf)\n\t\tif _, err := ciphertextFile.Write(payloadBuf.Bytes()); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\t// update signature\n\tztdo.signature.sign(gcmKey)\n\tif _, err := ciphertextFile.Write(toBuffer(ztdo.signature).Bytes()); err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\nfunc (ztdo *Ztdo) ParseHeader(ciphertextPath string) error {\n\tciphertextFile, err := os.OpenFile(ciphertextPath, os.O_RDONLY, 0666)\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer ciphertextFile.Close()\n\n\t// always initialize header\n\tztdo.header = *NewZtdoHeader()\n\n\t// read header\n\tif err := toStructure(ciphertextFile, &ztdo.header); err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\nfunc (ztdo *Ztdo) DecryptZtdoFile(ciphertextPath, plaintextPath string, gcmKey []byte, ad []byte) error {\n\tciphertextFile, err := os.OpenFile(ciphertextPath, os.O_RDONLY, 0666)\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer ciphertextFile.Close()\n\n\tciphertextFileInfo, err := ciphertextFile.Stat()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tremainingCiphertextFileSize := ciphertextFileInfo.Size()\n\n\tplaintextFile, err := os.Create(plaintextPath)\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer plaintextFile.Close()\n\n\trecalcSig := NewZtdoSignature()\n\n\t// always initialize header\n\tztdo.header = *NewZtdoHeader()\n\n\t// read header\n\tif err := toStructure(ciphertextFile, &ztdo.header); err != nil {\n\t\treturn err\n\t}\n\theaderBuf := toBuffer(ztdo.header)\n\trecalcSig.mixHash(headerBuf)\n\tremainingCiphertextFileSize -= int64(headerBuf.Len())\n\n\t// read payload\n\tfor {\n\t\tpayload := NewZtdoPayload()\n\t\tif err := toStructure(ciphertextFile, payload); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tpayloadBuf := toBuffer(payload)\n\t\trecalcSig.mixHash(payloadBuf)\n\t\tremainingCiphertextFileSize -= int64(payloadBuf.Len())\n\n\t\tplaintext, err := payload.GetPlainText(ztdo.header.GetCipherMode(), gcmKey, ad)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif _, err := plaintextFile.Write(plaintext); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tif ztdo.header.HasSignature() {\n\t\t\tif remainingCiphertextFileSize == SIGNATURELenSize {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tif remainingCiphertextFileSize == 0 {\n\t\t\t\treturn fmt.Errorf(\"invalid ztdo file\")\n\t\t\t}\n\t\t} else {\n\t\t\tif remainingCiphertextFileSize == 0 {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n\t// update recalculated signature\n\trecalcSig.sign(gcmKey)\n\n\tif ztdo.header.HasSignature() {\n\t\tif err := toStructure(ciphertextFile, &ztdo.signature); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tif !ztdo.signature.verify(recalcSig) {\n\t\t\treturn fmt.Errorf(\"signature verification failed\")\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// marshal searilizs Go struct into bytes buffer\nfunc marshal(buf *bytes.Buffer, data any) error {\n\trData := reflect.ValueOf(data)\n\tif rData.Kind() == reflect.Ptr {\n\t\trData = rData.Elem()\n\t}\n\n\tif rData.Kind() != reflect.Struct {\n\t\treturn fmt.Errorf(\"data must be a struct\")\n\t}\n\n\tfor i := range rData.NumField() {\n\t\tfield := rData.Field(i)\n\t\tif field.Type().Kind() == reflect.Struct {\n\t\t\tif err := marshal(buf, field.Interface()); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t} else {\n\t\t\tvar bytes []byte\n\t\t\tif field.Type().Kind() == reflect.Array { // here assume it's an array of byte.\n\t\t\t\tbytes = make([]byte, field.Len())\n\t\t\t\treflect.Copy(reflect.ValueOf(bytes), field)\n\t\t\t} else if field.Type().Kind() == reflect.Slice {\n\t\t\t\tif field.Type().Elem().Kind() == reflect.Struct {\n\t\t\t\t\tfor j := range field.Len() {\n\t\t\t\t\t\tif err := marshal(buf, field.Index(j).Interface()); err != nil {\n\t\t\t\t\t\t\treturn err\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else if field.Type().Elem().Kind() == reflect.Uint8 {\n\t\t\t\t\tbytes = field.Interface().([]byte)\n\t\t\t\t} else {\n\t\t\t\t\treturn fmt.Errorf(\"unsupported field type: %v in slice\", field.Type().Elem().Kind())\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\treturn fmt.Errorf(\"unsupported field type: %v\", field.Type().Kind())\n\t\t\t}\n\n\t\t\tif _, err := buf.Write(bytes); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// unmarshal recursively deserializes binary data from a file into a Go struct\nfunc unmarshal(f *os.File, data any) error {\n\trValues := reflect.ValueOf(data)\n\trTypes := reflect.TypeOf(data)\n\tif rValues.Kind() == reflect.Ptr {\n\t\trTypes = rTypes.Elem()\n\t\trValues = rValues.Elem()\n\t}\n\n\tif rValues.Kind() != reflect.Struct {\n\t\treturn fmt.Errorf(\"data must be a struct\")\n\t}\n\n\tfor i := range rTypes.NumField() {\n\t\tfield := rTypes.Field(i)\n\t\tvalue := rValues.Field(i)\n\t\tif field.Type.Kind() == reflect.Struct {\n\t\t\tif err := unmarshal(f, value.Addr().Interface()); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t} else {\n\t\t\tif field.Type.Kind() == reflect.Array {\n\t\t\t\tlength := value.Len()\n\t\t\t\tbytes := make([]byte, length)\n\t\t\t\t_, err := f.Read(bytes)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn err\n\t\t\t\t}\n\n\t\t\t\tsetBytes(value, bytes)\n\n\t\t\t\t// parse lengthFor and lengthContinue tag\n\t\t\t\t// lengthFor tag means that this field represents the length of the field which is specified in the lengthFor tag\n\t\t\t\t// lengthContinue tag is usually used for slices which don't have fixed length.\n\t\t\t\t// lengthContinue tag means that the MSB (most significant bit) of this field indicates that there is still more data to be read\n\t\t\t\tlengthFor := field.Tag.Get(LENGTHFOR)\n\t\t\t\tlengthContinue := field.Tag.Get(LENGTHCONTINUE)\n\n\t\t\t\tif lengthContinue != \"\" {\n\t\t\t\t\tlengthContinueIndicator = preprocessContinuation(bytes)\n\t\t\t\t}\n\n\t\t\t\tif lengthFor != \"\" {\n\t\t\t\t\texpandedBytes := [4]byte{}\n\t\t\t\t\tcopy(expandedBytes[:], bytes)\n\t\t\t\t\tlengthMap[lengthFor] = endianness.Uint32(expandedBytes[:])\n\t\t\t\t}\n\n\t\t\t\tsubtractFrom := field.Tag.Get(SUBTRACTFROM)\n\t\t\t\tif subtractFrom != \"\" {\n\t\t\t\t\tlengthMap[subtractFrom] -= uint32(length)\n\t\t\t\t}\n\t\t\t} else if field.Type.Kind() == reflect.Slice {\n\t\t\t\tif field.Type.Elem().Kind() == reflect.Struct {\n\t\t\t\t\tfor {\n\t\t\t\t\t\tins := reflect.New(field.Type.Elem()).Elem()\n\t\t\t\t\t\tnewValue := reflect.Append(value, ins)\n\t\t\t\t\t\tvalue.Set(newValue)\n\t\t\t\t\t\terr := unmarshal(f, value.Index(value.Len()-1).Addr().Interface())\n\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\treturn err\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif !lengthContinueIndicator { // more data to be read to construct element in current slice\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else if field.Type.Elem().Kind() == reflect.Uint8 { // if the elment in slice is a byte, there MUST be lengthFor tag to be parsed before.\n\t\t\t\t\tlength := lengthMap[field.Name]\n\t\t\t\t\tbytes := make([]byte, length)\n\t\t\t\t\t_, err := f.Read(bytes)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn err\n\t\t\t\t\t}\n\t\t\t\t\tsetBytes(value, bytes)\n\t\t\t\t} else {\n\t\t\t\t\treturn fmt.Errorf(\"unsupported element type: %v in slice\", field.Type.Elem().Kind())\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\treturn fmt.Errorf(\"unsupported field type: %v\", field.Type.Kind())\n\t\t\t}\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// toBuffer provides unified way to serialize a Go struct into bytes buffer\nfunc toBuffer(data any) *bytes.Buffer {\n\tbuf := bytes.NewBuffer(nil)\n\t_ = marshal(buf, data)\n\treturn buf\n}\n\n// toStructure provides unified way to deserialize bytes from a file into a Go struct\nfunc toStructure(f *os.File, data any) error {\n\tlengthMap = make(map[string]uint32)\n\trValues := reflect.ValueOf(data)\n\tif rValues.Kind() != reflect.Ptr {\n\t\treturn fmt.Errorf(\"data must be a pointer\")\n\t}\n\treturn unmarshal(f, data)\n}\n\n// setBytes provides unified way to set bytes to a slice or array\nfunc setBytes(rvalue reflect.Value, dst []byte) {\n\tif rvalue.Kind() == reflect.Slice {\n\t\trvalue.SetBytes(dst)\n\t} else if rvalue.Kind() == reflect.Array {\n\t\tlen := rvalue.Len()\n\t\telType := rvalue.Type().Elem()\n\n\t\tarrayType := reflect.ArrayOf(len, elType)\n\t\tnewArray := reflect.New(arrayType).Elem()\n\n\t\tfor i := range len {\n\t\t\tnewArray.Index(i).SetUint(uint64(dst[i]))\n\t\t}\n\n\t\trvalue.Set(newArray)\n\n\t} else {\n\t\tpanic(\"not support\")\n\t}\n}\n\n// encodeMetadataLength encodes a length continuation bit into the MSB of metadata length\nfunc encodeMetadataLength(length int, continuation bool) ([2]byte, error) {\n\tvar result [2]byte\n\n\tif length > MetadataChunkMaxSize {\n\t\treturn result, fmt.Errorf(\"length %d exceeds maximum encoded value (%d)\", length, MetadataChunkMaxSize)\n\t}\n\n\tif length < 0 {\n\t\treturn result, fmt.Errorf(\"length %d is negative\", length)\n\t}\n\n\t//nolint:gosec // G602: result is [2]byte array, indices 0 and 1 are always valid\n\tresult[0] = byte((length >> 8) & 0x7F)\n\tif continuation {\n\t\tresult[0] |= 0x80\n\t}\n\tresult[1] = byte(length & 0xFF)\n\n\tif littleEndian {\n\t\tresult[0], result[1] = result[1], result[0]\n\t}\n\n\treturn result, nil\n}\n\n// preprocessContinuation decodes a length continuation bit from the MSB of metadata length\nfunc preprocessContinuation(encoded []byte) (continuation bool) {\n\tif littleEndian {\n\t\tcontinuation = encoded[len(encoded)-1]&0x80 != 0\n\t\tencoded[len(encoded)-1] &= 0x7F\n\t} else {\n\t\tcontinuation = encoded[0]&0x80 != 0\n\t\tencoded[0] &= 0x7F\n\t}\n\n\treturn\n}\n\n// getSecureRandomChunkSize generates a random chunk size within a specified range\nfunc getSecureRandomChunkSize() int {\n\tvar buf [8]byte\n\t_, err := rand.Read(buf[:])\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\t// Get random float between 0 and 1\n\tr := float64(binary.BigEndian.Uint64(buf[:])) / math.MaxUint64\n\n\t// Scale to desired range (e.g., 80% to 100% of base size)\n\tmin := float64(DATACHUNKSIZE) * 0.8\n\tmax := float64(DATACHUNKSIZE) * 1.0\n\treturn int(min + r*(max-min))\n}\n"
  },
  {
    "path": "nhp/core/ztdo/ztdo_test.go",
    "content": "package ztdo\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n)\n\nfunc TestEncodeMetadataLength(t *testing.T) {\n\ttestCases := []struct {\n\t\tname            string\n\t\tlength          int\n\t\tcontinuation    bool\n\t\texpectedEncoded [2]byte\n\t\texpectedError   bool\n\t}{\n\t\t{\n\t\t\tname:            \"length 0\",\n\t\t\tlength:          0,\n\t\t\tcontinuation:    false,\n\t\t\texpectedEncoded: [2]byte{0x00, 0x00},\n\t\t\texpectedError:   false,\n\t\t},\n\t\t{\n\t\t\tname:            \"Length 15036 (0x3ABC), with continuation\",\n\t\t\tlength:          15036,\n\t\t\tcontinuation:    true,\n\t\t\texpectedEncoded: [2]byte{0xBC, 0xBA},\n\t\t\texpectedError:   false,\n\t\t},\n\t\t{\n\t\t\tname:            \"Length 32767 (max 15-bit), no continuation\",\n\t\t\tlength:          32767,\n\t\t\tcontinuation:    false,\n\t\t\texpectedEncoded: [2]byte{0xFF, 0x7F},\n\t\t\texpectedError:   false,\n\t\t},\n\t\t// Error cases\n\t\t{\n\t\t\tname:            \"Length too large (32768)\",\n\t\t\tlength:          32768,\n\t\t\tcontinuation:    false,\n\t\t\texpectedEncoded: [2]byte{},\n\t\t\texpectedError:   true,\n\t\t},\n\t\t{\n\t\t\tname:            \"Negative length (-1)\",\n\t\t\tlength:          -1,\n\t\t\tcontinuation:    false,\n\t\t\texpectedEncoded: [2]byte{},\n\t\t\texpectedError:   true,\n\t\t},\n\t}\n\n\tfor _, tc := range testCases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\tencoded, err := encodeMetadataLength(tc.length, tc.continuation)\n\t\t\tif tc.expectedError {\n\t\t\t\tif err == nil {\n\t\t\t\t\tt.Errorf(\"Expected error, but got none\")\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Errorf(\"Unexpected error: %v\", err)\n\t\t\t\t}\n\t\t\t\tif !bytes.Equal(encoded[:], tc.expectedEncoded[:]) {\n\t\t\t\t\tt.Errorf(\"Expected encoded length %v, got %v\", tc.expectedEncoded, encoded)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n"
  },
  {
    "path": "nhp/ebpf/xdp/nhp_ebpf_xdp.c",
    "content": "#include \"vmlinux.h\"\n#include <bpf/bpf_helpers.h>\n#include <bpf/bpf_core_read.h>\n#include <bpf/bpf_endian.h>\n\n#define ETH_P_ARP 0x0806\n#define ETH_P_IP    0x0800\n#define IPPROTO_ICMP 1\n#define IPPROTO_TCP 6\n#define ICMP_ECHO 8\n#define ICMP_ECHOREPLY 0\n#define ETH_P_IPV6   0x86DD\n#define IPPROTO_UDP 17\n#define MAX_ENTRIES 1000000\n#define MIN_PORT 0\n#define MAX_PORT 65535\n#define DNS_PORT 53\n#define DHCP_PORT_R 67\n#define DHCP_PORT_O 68\n\nenum {\n    CT_NEW,\n    CT_ESTABLISHED,\n};\n\nenum {\n    CT_FLAG_NONE = 0,\n    CT_FLAG_SYN = 1 << 0,\n    CT_FLAG_FIN = 1 << 1,\n    CT_FLAG_RST = 1 << 2,\n    CT_FLAG_ACK = 1 << 3,\n};\n\nenum {\n    CT_DIR_INGRESS = 0,\n    CT_DIR_EGRESS = 1,\n};\n\nstruct whitelist_key {\n    __be32 src_ip;\n    __be32 dst_ip;\n    __be16 dst_port;\n    __u8 protocol;\n} __attribute__((packed));\n\nstruct src_port_list_key {\n    __be32 src_ip;\n    __be16 dst_port;\n} __attribute__((packed));\n\nstruct port_list_key {\n    __be32 src_ip;\n    __be16 min_port;\n    __be16 max_port;\n} __attribute__((packed));\n\nstruct protocol_port_key {\n    __be16 dst_port;\n    __u8 protocol;\n} __attribute__((packed));\n\nstruct icmpwhitelist_key {\n    __be32 src_ip;\n    __be32 dst_ip;\n} __attribute__((packed));\n\nstruct sdwhitelist_key {\n    __be32 src_ip;\n    __be32 dst_ip;\n} __attribute__((packed));\n\nstruct whitelist_value {\n    __u8 allowed;\n    __u64 expire_time;\n};\n\nstruct icmpwhitelist_value {\n    __u8 allowed;\n    __u64 expire_time;\n};\n\nstruct sdwhitelist_value {\n    __u8 allowed;\n    __u64 expire_time;\n};\n\nstruct src_port_list_value {\n    __u8 allowed;\n    __u64 expire_time;\n};\n\nstruct port_list_value {\n    __u8 allowed;\n    __u64 expire_time;\n};\n\nstruct protocol_port_value {\n    __u8 allowed;\n    __u64 expire_time;\n} __attribute__((packed));\n\nstruct {\n    __uint(type, BPF_MAP_TYPE_LRU_HASH);\n    __type(key, struct whitelist_key);\n    __type(value, struct whitelist_value);\n    __uint(max_entries, MAX_ENTRIES);\n    __uint(pinning, LIBBPF_PIN_BY_NAME);\n} spp SEC(\".maps\");\n\nstruct {\n    __uint(type, BPF_MAP_TYPE_LRU_HASH);\n    __type(key, struct src_port_list_key);\n    __type(value, struct src_port_list_value);\n    __uint(max_entries, MAX_ENTRIES);\n    __uint(pinning, LIBBPF_PIN_BY_NAME);\n} src_port SEC(\".maps\");\n\nstruct {\n    __uint(type, BPF_MAP_TYPE_HASH);\n    __type(key, struct icmpwhitelist_key);\n    __type(value,  struct icmpwhitelist_value);\n    __uint(max_entries, MAX_ENTRIES);\n    __uint(pinning, LIBBPF_PIN_BY_NAME);\n} icmpwhitelist SEC(\".maps\");\n\nstruct {\n    __uint(type, BPF_MAP_TYPE_LRU_HASH);\n    __type(key, struct sdwhitelist_key);\n    __type(value, struct sdwhitelist_value);\n    __uint(max_entries, MAX_ENTRIES);\n    __uint(pinning, LIBBPF_PIN_BY_NAME);\n} sdwhitelist SEC(\".maps\");\n\nstruct {\n    __uint(type, BPF_MAP_TYPE_LRU_HASH);\n    __type(key, struct port_list_key);\n    __type(value,struct port_list_value);\n    __uint(max_entries, MAX_ENTRIES);\n    __uint(pinning, LIBBPF_PIN_BY_NAME);\n} port_list SEC(\".maps\");\n\nstruct {\n    __uint(type, BPF_MAP_TYPE_LRU_HASH);\n    __type(key, struct protocol_port_key);\n    __type(value,struct protocol_port_value);\n    __uint(max_entries, MAX_ENTRIES);\n    __uint(pinning, LIBBPF_PIN_BY_NAME);\n} protocol_port SEC(\".maps\");\n\nstruct ipv4_ct_tuple {\n    __be32 daddr;\n    __be32 saddr;\n    __be16 dport;\n    __be16 sport;\n    __u8 nexthdr;\n    __u8 flags;\n} __packed;\n\nstruct conn_value {\n    __u64 timestamp;\n    __u64 last_timestamp;\n    __u64 ttl_ns;   \n    __u8 state;\n    __u8 flags;\n    __u32 rx_packets;\n    __u32 tx_packets;\n};\n\nstruct {\n    __uint(type, BPF_MAP_TYPE_LRU_HASH);\n    __uint(max_entries, MAX_ENTRIES);\n    __type(key, struct ipv4_ct_tuple);\n    __type(value, struct conn_value);\n    __uint(pinning, LIBBPF_PIN_BY_NAME);\n} conn_track SEC(\".maps\");\n\nstruct event_t {\n    __u64 timestamp;    \n    __u8 action;        \n    __be32 src_ip;\n    __be32 dst_ip;\n    __be16 src_port;    \n    __be16 dst_port;    \n    __u8 protocol;      \n    __be16 len;\n} __attribute__((packed));\n\nstruct {\n    __uint(type, BPF_MAP_TYPE_PERF_EVENT_ARRAY);\n    __uint(max_entries, 1024);\n} events SEC(\".maps\");\n\n// Submit the event details including source and destination IP addresses, source and destination ports, protocol, and total packet length to the user space.\nstatic __always_inline int submit_event(void *ctx, __u8 action, __be32 src_ip, __be32 dst_ip, __be16 src_port, __be16 dst_port, __u8 protocol, __be16 len) {\n    struct event_t ev = {};\n    ev.timestamp = bpf_ktime_get_ns();\n    ev.action = action; // 0 = DENY, 1 = ACCEPT\n    ev.src_ip = src_ip;\n    ev.dst_ip = dst_ip;\n    ev.src_port = src_port;\n    ev.dst_port = dst_port;\n    ev.protocol = protocol;\n    ev.len = len;\n\n    // Submit the event details to the user space Perf Buffer.\n    return bpf_perf_event_output(ctx, &events, BPF_F_CURRENT_CPU, &ev, sizeof(ev));\n}\n\nstatic __always_inline void reverseTuple(struct ipv4_ct_tuple *key) {\n    __u32 tmp_ip = key->daddr;\n    __u16 tmp_port = key->dport;\n    key->flags = !key->flags;\n    key->daddr = key->saddr;\n    key->saddr = tmp_ip;\n    key->dport = key->sport;\n    key->sport = tmp_port;\n}\n\n#ifndef __constant_htons\n#define __constant_htons(x) ((__u16)((((x) & 0xFF00) >> 8) | (((x) & 0x00FF) << 8)))\n#endif\n\nstatic __always_inline bool check_conn_expiry(struct conn_value *val) {\n    __u64 now = bpf_ktime_get_ns();\n    return (now > val->timestamp + val->ttl_ns);\n}\n\nSEC(\"xdp\")\nstatic __always_inline int xdp_white_prog(struct xdp_md *ctx) {\n    void *data = (void *)(long)ctx->data;\n    void *data_end = (void *)(long)ctx->data_end;\n    struct tcphdr *tcp;\n    struct ipv4_ct_tuple ct_key = {};\n    struct ethhdr *eth = data;\n    \n    if (data + sizeof(*eth) > data_end) {\n        return XDP_DROP;\n    }   \n    \n    if ((void *)(eth + 1) > data_end)\n        return XDP_DROP;\n\n    switch (bpf_ntohs(eth->h_proto)) {\n        case ETH_P_ARP:  return XDP_PASS;\n        case ETH_P_IP:   break;\n        case ETH_P_IPV6: return XDP_PASS;\n        default:         return XDP_DROP;\n    }\n\n    struct iphdr *iph = (void *)(eth + 1);\n    if ((void *)(iph + 1) > data_end)\n        return XDP_DROP;\n\n    if (iph->ihl < 5)\n        return XDP_DROP;\n\n    if (iph->protocol == IPPROTO_TCP) {\n        tcp = (void *)(iph + 1);\n        if ((void *)(tcp + 1) > data_end) {\n            return XDP_DROP;\n        }\n        ct_key.nexthdr = IPPROTO_TCP;\n        ct_key.sport = tcp->source;\n        ct_key.dport = tcp->dest;\n        // ct_key.dport = bpf_htons(tcp->dest);\n    } else if (iph->protocol == IPPROTO_UDP) {\n        struct udphdr *udp = (void *)(iph + 1);\n        if ((void *)(udp + 1) > data_end)\n            return XDP_DROP;\n        ct_key.nexthdr = IPPROTO_UDP;\n        ct_key.sport = udp->source;\n        ct_key.dport = udp->dest;\n        // ct_key.dport = bpf_htons(udp->dest);\n    } \n\n    \n    if (iph->protocol == IPPROTO_TCP) {\n        void *tcp_start = (void *)iph + (iph->ihl * 4);\n        if ((void *)(tcp_start + sizeof(struct tcphdr)) > data_end)\n            return XDP_DROP;\n\n        struct tcphdr *tcp = tcp_start;\n        if (__constant_htons(tcp->dest) == 22) {\n            return XDP_PASS;\n        }\n    }\n    \n    if (iph->protocol == IPPROTO_UDP && \n        (ct_key.dport == bpf_htons(DHCP_PORT_R) || ct_key.dport == bpf_htons(DHCP_PORT_O) || ct_key.sport == bpf_htons(DNS_PORT))) {\n        return XDP_PASS;\n    }\n    __u64 now = bpf_ktime_get_ns();\n\n    // ICMP\n    if (iph->protocol == IPPROTO_ICMP) {\n        struct icmphdr *icmp = (void *)iph + (iph->ihl * 4);\n        if ((void *)(icmp + 1) > data_end)\n            return XDP_DROP;\n        struct icmpwhitelist_key icmpkey = {\n            .src_ip = iph->saddr,\n            .dst_ip = iph->daddr,\n        };\n        //only processes ICMP Echo Requests (type 8, code 0) and ICMP Echo Replies (type 0, code 0)\n        if ((icmp->type == ICMP_ECHO && icmp->code == 0) || \n            (icmp->type == ICMP_ECHOREPLY && icmp->code == 0)) {\n            \n            if (icmp->type == ICMP_ECHO) {\n                //Lookup icmpwhitelist entry\n                struct icmpwhitelist_value *iw_val = bpf_map_lookup_elem(&icmpwhitelist, &icmpkey);\n                if (!iw_val) {\n                    return XDP_DROP;\n                }   \n                __u64 now = bpf_ktime_get_ns();\n                // Check if whitelist entry has expired\n                if (iw_val->expire_time < now) {\n                    bpf_map_delete_elem(&icmpwhitelist, &icmpkey);\n                    return XDP_DROP;\n                }\n                // Check if source IP is icmpwhitelisted and allowed\n                if (iw_val->allowed == 1) {\n                    return XDP_PASS;\n                }\n            }  else {\n                return XDP_PASS;\n            }\n        }\n    }\n\n    ct_key.saddr = iph->saddr;\n    ct_key.daddr = iph->daddr;\n    ct_key.flags = CT_DIR_INGRESS;\n    struct conn_value *existing_val;\n\n    existing_val = bpf_map_lookup_elem(&conn_track, &ct_key);\n    if (existing_val) {\n        if (check_conn_expiry(existing_val)) {\n            bpf_map_delete_elem(&conn_track, &ct_key);\n            return XDP_DROP;\n        }\n        struct conn_value new_val = *existing_val;\n        new_val.tx_packets++;\n        new_val.last_timestamp = bpf_ktime_get_ns();\n        bpf_map_update_elem(&conn_track, &ct_key, &new_val, BPF_EXIST);\n        return XDP_PASS;\n    }\n    reverseTuple(&ct_key);\n    existing_val = bpf_map_lookup_elem(&conn_track, &ct_key);\n    if (existing_val) {\n        if (check_conn_expiry(existing_val)) {\n            bpf_map_delete_elem(&conn_track, &ct_key);\n            reverseTuple(&ct_key);\n            return XDP_DROP;\n        }\n        struct conn_value new_val = *existing_val;\n        new_val.rx_packets++;\n        new_val.last_timestamp = bpf_ktime_get_ns();\n        bpf_map_update_elem(&conn_track, &ct_key, &new_val, BPF_EXIST);\n        reverseTuple(&ct_key);\n        return XDP_PASS;\n    }\n    reverseTuple(&ct_key);\n\n    struct whitelist_key key = {\n        .src_ip = iph->saddr,\n        .dst_ip = iph->daddr,\n        .dst_port = ct_key.dport,\n        .protocol = iph->protocol\n    };\n\n    struct sdwhitelist_key sdkey = {\n        .src_ip = iph->saddr,\n        .dst_ip = iph->daddr\n    };\n\n    struct src_port_list_key spkey = {\n        .src_ip = iph->saddr,\n        .dst_port = ct_key.dport\n    };\n\n    struct port_list_key pl_key = {\n        .src_ip = iph->saddr,\n        .min_port = MIN_PORT,\n        .max_port = MAX_PORT\n    };\n    __u16 dst_port = bpf_ntohs(ct_key.dport);\n\n    struct protocol_port_key pp_key = {\n        .dst_port = ct_key.dport,\n        .protocol = iph->protocol\n    };\n\n    //Lookup whitelist entry\n    struct whitelist_value *w_val = bpf_map_lookup_elem(&spp, &key);\n    //Lookup sdwhitelist entry\n    struct sdwhitelist_value *sd_val = bpf_map_lookup_elem(&sdwhitelist, &sdkey);\n    //Lookup src_port_list entry\n    struct src_port_list_value *sp_val = bpf_map_lookup_elem(&src_port, &spkey);\n    //Lookup port_list entry\n    struct port_list_value *pl_val= bpf_map_lookup_elem(&port_list, &pl_key);\n    //Lookup protocol_port entry\n    struct protocol_port_value *pp_val= bpf_map_lookup_elem(&protocol_port, &pp_key);\n\n    if (w_val) {\n        __u64 expire_time = w_val->expire_time;\n        if (expire_time < now) {\n            bpf_map_delete_elem(&spp, &key);\n            return XDP_DROP;\n        }\n        if (w_val->allowed == 1) {\n            submit_event(ctx, 1, iph->saddr, iph->daddr, ct_key.sport, ct_key.dport, iph->protocol, iph->tot_len);\n            struct conn_value new_val = {\n                .timestamp = bpf_ktime_get_ns(),\n                .last_timestamp = bpf_ktime_get_ns(),\n                .ttl_ns = expire_time - now,\n                .state = CT_ESTABLISHED,\n                .flags = CT_FLAG_NONE,\n                .rx_packets = 1,\n                .tx_packets = 0,\n            };\n            bpf_map_update_elem(&conn_track, &ct_key, &new_val, BPF_ANY);\n            return XDP_PASS;\n        }\n    }\n    if (sd_val) {\n        __u64 expire_time = sd_val->expire_time;\n        if (expire_time < now) {\n            bpf_map_delete_elem(&sdwhitelist, &sdkey);\n            return XDP_DROP;\n        }\n        if (sd_val->allowed == 1) {\n            submit_event(ctx, 1, iph->saddr, iph->daddr, ct_key.sport, ct_key.dport, iph->protocol, iph->tot_len);\n            struct conn_value new_val = {\n                .timestamp = bpf_ktime_get_ns(),\n                .last_timestamp = bpf_ktime_get_ns(),\n                .ttl_ns = sd_val->expire_time - now,\n                .state = CT_ESTABLISHED,\n                .flags = CT_FLAG_NONE,\n                .rx_packets = 1,\n                .tx_packets = 0,\n            };\n            bpf_map_update_elem(&conn_track, &ct_key, &new_val, BPF_ANY);\n            return XDP_PASS;\n        }       \n    }\n\n    if (sp_val) {\n        __u64 expire_time = sp_val->expire_time;\n        if (expire_time < now) {\n            bpf_map_delete_elem(&src_port, &spkey);\n            return XDP_DROP;\n        }\n        if (sp_val->allowed == 1) {\n            submit_event(ctx, 1, iph->saddr, iph->daddr, ct_key.sport, ct_key.dport, iph->protocol, iph->tot_len);\n            struct conn_value new_val = {\n                .timestamp = bpf_ktime_get_ns(),\n                .last_timestamp = bpf_ktime_get_ns(), \n                .ttl_ns = sp_val->expire_time - now,\n                .state = CT_ESTABLISHED,\n                .flags = CT_FLAG_NONE,\n                .rx_packets = 1,\n                .tx_packets = 0,\n            };\n            bpf_map_update_elem(&conn_track, &ct_key, &new_val, BPF_ANY);\n            return XDP_PASS;\n        }\n    }\n\n    if (pl_val) {\n        __u64 expire_time = pl_val->expire_time;\n        if (expire_time < now) {\n            bpf_map_delete_elem(&port_list, &pl_key);\n            return XDP_DROP;\n        }\n        if (pl_val->allowed == 1) {\n            submit_event(ctx, 1, iph->saddr, iph->daddr, ct_key.sport, ct_key.dport, iph->protocol, iph->tot_len);\n            struct conn_value new_val = {\n                .timestamp = bpf_ktime_get_ns(),\n                .last_timestamp = bpf_ktime_get_ns(), \n                .ttl_ns = pl_val->expire_time - now,\n                .state = CT_ESTABLISHED,\n                .flags = CT_FLAG_NONE,\n                .rx_packets = 1,\n                .tx_packets = 0,\n            };\n            bpf_map_update_elem(&conn_track, &ct_key, &new_val, BPF_ANY);\n            return XDP_PASS;\n        }\n    }\n    if (pp_val) {\n        __u64 expire_time = pp_val->expire_time;\n        if (expire_time < now) {\n            bpf_map_delete_elem(&protocol_port, &pp_key);\n            return XDP_DROP;\n        }\n        if (pp_val->allowed == 1) {\n            submit_event(ctx, 1, iph->saddr, iph->daddr, ct_key.sport, ct_key.dport, iph->protocol, iph->tot_len);\n            struct conn_value new_val = {\n                .timestamp = bpf_ktime_get_ns(),\n                .last_timestamp = bpf_ktime_get_ns(), \n                .ttl_ns = pp_val->expire_time - now,\n                .state = CT_ESTABLISHED,\n                .flags = CT_FLAG_NONE,\n                .rx_packets = 1,\n                .tx_packets = 0,\n            };\n            bpf_map_update_elem(&conn_track, &ct_key, &new_val, BPF_ANY);\n            return XDP_PASS;\n        }\n    }\n    submit_event(ctx, 0, iph->saddr, iph->daddr, ct_key.sport, ct_key.dport, iph->protocol, iph->tot_len);\n    return XDP_DROP;\n}\n\nchar _license[] SEC(\"license\") = \"Dual BSD/GPL\";"
  },
  {
    "path": "nhp/ebpf/xdp/tc_egress.c",
    "content": "#include \"vmlinux.h\"\n#include <bpf/bpf_helpers.h>\n#include <bpf/bpf_core_read.h>\n#include <bpf/bpf_endian.h>\n\n#define TC_ACT_UNSPEC         (-1)\n#define TC_ACT_OK               0\n#define TC_ACT_SHOT             2\n#define TC_ACT_STOLEN           4\n\n#define ETH_P_IP    0x0800\n#define ETH_P_IPV6  0x86DD\n#define IPPROTO_TCP 6\n#define IPPROTO_UDP 17\n#define IPPROTO_ICMP 1\n#define KEY_EXPIRE_TIME_SECONDS 180 * 1000000000ULL\n#define MAX_ENTRIES 1000000\n\nstruct whitelist_key {\n    __be32 src_ip;\n    __be32 dst_ip;\n    __be16 dst_port;\n    __u8 protocol;\n} __attribute__((packed));\n\nstruct whitelist_value {\n    __u8 allowed;\n    __u64 expire_time;\n};\n\nstruct {\n    __uint(type, BPF_MAP_TYPE_LRU_HASH);\n    __type(key, struct whitelist_key);\n    __type(value, struct whitelist_value);\n    __uint(max_entries, MAX_ENTRIES);\n    __uint(pinning, LIBBPF_PIN_BY_NAME);\n} spp SEC(\".maps\");\n\nSEC(\"tc/egress\")\nint tc_egress_prog(struct __sk_buff *ctx)\n{\n\n    void *data = (void *)(long)ctx->data;\n    void *data_end = (void *)(long)ctx->data_end;\n    struct ethhdr *eth = data;\n\n    if (data + sizeof(*eth) > data_end)\n        return TC_ACT_OK;\n\n    if (bpf_ntohs(eth->h_proto) != ETH_P_IP)\n        return TC_ACT_OK;\n\n    struct iphdr *iph = (void *)(eth + 1);\n    if ((void *)(iph + 1) > data_end)\n        return TC_ACT_OK;\n\n    if (iph->ihl < 5 || iph->version != 4)\n        return TC_ACT_OK;\n\n    __be32 src_ip = iph->saddr;\n    __be32 dst_ip = iph->daddr;\n    __u8 protocol = iph->protocol;\n\n    __be16 sport = 0, dport = 0;\n\n    if (protocol == IPPROTO_TCP) {\n        struct tcphdr *tcp = (void *)iph + (iph->ihl * 4);\n        if ((void *)(tcp + 1) > data_end)\n            return TC_ACT_OK;\n        sport = tcp->source;\n        dport = tcp->dest;\n    } else if (protocol == IPPROTO_UDP) {\n        struct udphdr *udp = (void *)iph + (iph->ihl * 4);\n        if ((void *)(udp + 1) > data_end)\n            return TC_ACT_OK;\n        sport = udp->source;\n        dport = udp->dest;\n    } else if (protocol == IPPROTO_ICMP) {\n        sport = 0;\n        dport = 0;\n    } else {\n        return TC_ACT_OK;\n    }\n\n    struct whitelist_key spp_key = {\n        .src_ip = dst_ip,\n        .dst_ip = src_ip,\n        .dst_port = sport,\n        .protocol = protocol,\n    };\n\n    struct whitelist_value spp_value = {\n        .allowed = 1,\n        .expire_time = bpf_ktime_get_ns() + KEY_EXPIRE_TIME_SECONDS,\n    };\n    bpf_map_update_elem(&spp, &spp_key, &spp_value, BPF_ANY);\n\n    return TC_ACT_OK;\n}\n\n\nchar _license[] SEC(\"license\") = \"Dual BSD/GPL\";"
  },
  {
    "path": "nhp/ebpf/xdp/vmlinux.h",
    "content": "#ifndef __VMLINUX_H__\n#define __VMLINUX_H__\n\n#ifndef BPF_NO_PRESERVE_ACCESS_INDEX\n#pragma clang attribute push (__attribute__((preserve_access_index)), apply_to = record)\n#endif\n\n#ifndef __ksym\n#define __ksym __attribute__((section(\".ksyms\")))\n#endif\n\n#ifndef __weak\n#define __weak __attribute__((weak))\n#endif\n\nenum {\n\tACPI_BATTERY_ALARM_PRESENT = 0,\n\tACPI_BATTERY_XINFO_PRESENT = 1,\n\tACPI_BATTERY_QUIRK_PERCENTAGE_CAPACITY = 2,\n\tACPI_BATTERY_QUIRK_THINKPAD_MAH = 3,\n\tACPI_BATTERY_QUIRK_DEGRADED_FULL_CHARGE = 4,\n};\n\nenum {\n\tACPI_BUTTON_LID_INIT_IGNORE = 0,\n\tACPI_BUTTON_LID_INIT_OPEN = 1,\n\tACPI_BUTTON_LID_INIT_METHOD = 2,\n\tACPI_BUTTON_LID_INIT_DISABLED = 3,\n};\n\nenum {\n\tACPI_GENL_ATTR_UNSPEC = 0,\n\tACPI_GENL_ATTR_EVENT = 1,\n\t__ACPI_GENL_ATTR_MAX = 2,\n};\n\nenum {\n\tACPI_GENL_CMD_UNSPEC = 0,\n\tACPI_GENL_CMD_EVENT = 1,\n\t__ACPI_GENL_CMD_MAX = 2,\n};\n\nenum {\n\tACPI_REFCLASS_LOCAL = 0,\n\tACPI_REFCLASS_ARG = 1,\n\tACPI_REFCLASS_REFOF = 2,\n\tACPI_REFCLASS_INDEX = 3,\n\tACPI_REFCLASS_TABLE = 4,\n\tACPI_REFCLASS_NAME = 5,\n\tACPI_REFCLASS_DEBUG = 6,\n\tACPI_REFCLASS_MAX = 6,\n};\n\nenum {\n\tACPI_RSC_INITGET = 0,\n\tACPI_RSC_INITSET = 1,\n\tACPI_RSC_FLAGINIT = 2,\n\tACPI_RSC_1BITFLAG = 3,\n\tACPI_RSC_2BITFLAG = 4,\n\tACPI_RSC_3BITFLAG = 5,\n\tACPI_RSC_6BITFLAG = 6,\n\tACPI_RSC_ADDRESS = 7,\n\tACPI_RSC_BITMASK = 8,\n\tACPI_RSC_BITMASK16 = 9,\n\tACPI_RSC_COUNT = 10,\n\tACPI_RSC_COUNT16 = 11,\n\tACPI_RSC_COUNT_GPIO_PIN = 12,\n\tACPI_RSC_COUNT_GPIO_RES = 13,\n\tACPI_RSC_COUNT_GPIO_VEN = 14,\n\tACPI_RSC_COUNT_SERIAL_RES = 15,\n\tACPI_RSC_COUNT_SERIAL_VEN = 16,\n\tACPI_RSC_DATA8 = 17,\n\tACPI_RSC_EXIT_EQ = 18,\n\tACPI_RSC_EXIT_LE = 19,\n\tACPI_RSC_EXIT_NE = 20,\n\tACPI_RSC_LENGTH = 21,\n\tACPI_RSC_MOVE_GPIO_PIN = 22,\n\tACPI_RSC_MOVE_GPIO_RES = 23,\n\tACPI_RSC_MOVE_SERIAL_RES = 24,\n\tACPI_RSC_MOVE_SERIAL_VEN = 25,\n\tACPI_RSC_MOVE8 = 26,\n\tACPI_RSC_MOVE16 = 27,\n\tACPI_RSC_MOVE32 = 28,\n\tACPI_RSC_MOVE64 = 29,\n\tACPI_RSC_SET8 = 30,\n\tACPI_RSC_SOURCE = 31,\n\tACPI_RSC_SOURCEX = 32,\n};\n\nenum {\n\tACPI_RSD_TITLE = 0,\n\tACPI_RSD_1BITFLAG = 1,\n\tACPI_RSD_2BITFLAG = 2,\n\tACPI_RSD_3BITFLAG = 3,\n\tACPI_RSD_6BITFLAG = 4,\n\tACPI_RSD_ADDRESS = 5,\n\tACPI_RSD_DWORDLIST = 6,\n\tACPI_RSD_LITERAL = 7,\n\tACPI_RSD_LONGLIST = 8,\n\tACPI_RSD_SHORTLIST = 9,\n\tACPI_RSD_SHORTLISTX = 10,\n\tACPI_RSD_SOURCE = 11,\n\tACPI_RSD_STRING = 12,\n\tACPI_RSD_UINT8 = 13,\n\tACPI_RSD_UINT16 = 14,\n\tACPI_RSD_UINT32 = 15,\n\tACPI_RSD_UINT64 = 16,\n\tACPI_RSD_WORDLIST = 17,\n\tACPI_RSD_LABEL = 18,\n\tACPI_RSD_SOURCE_LABEL = 19,\n};\n\nenum {\n\tACTION_FAIL = 0,\n\tACTION_REPREP = 1,\n\tACTION_DELAYED_REPREP = 2,\n\tACTION_RETRY = 3,\n\tACTION_DELAYED_RETRY = 4,\n};\n\nenum {\n\tAFFINITY = 0,\n\tAFFINITY_LIST = 1,\n\tEFFECTIVE = 2,\n\tEFFECTIVE_LIST = 3,\n};\n\nenum {\n\tAML_FIELD_ACCESS_ANY = 0,\n\tAML_FIELD_ACCESS_BYTE = 1,\n\tAML_FIELD_ACCESS_WORD = 2,\n\tAML_FIELD_ACCESS_DWORD = 3,\n\tAML_FIELD_ACCESS_QWORD = 4,\n\tAML_FIELD_ACCESS_BUFFER = 5,\n};\n\nenum {\n\tAML_FIELD_ATTRIB_QUICK = 2,\n\tAML_FIELD_ATTRIB_SEND_RECEIVE = 4,\n\tAML_FIELD_ATTRIB_BYTE = 6,\n\tAML_FIELD_ATTRIB_WORD = 8,\n\tAML_FIELD_ATTRIB_BLOCK = 10,\n\tAML_FIELD_ATTRIB_BYTES = 11,\n\tAML_FIELD_ATTRIB_PROCESS_CALL = 12,\n\tAML_FIELD_ATTRIB_BLOCK_PROCESS_CALL = 13,\n\tAML_FIELD_ATTRIB_RAW_BYTES = 14,\n\tAML_FIELD_ATTRIB_RAW_PROCESS_BYTES = 15,\n};\n\nenum {\n\tAML_FIELD_UPDATE_PRESERVE = 0,\n\tAML_FIELD_UPDATE_WRITE_AS_ONES = 32,\n\tAML_FIELD_UPDATE_WRITE_AS_ZEROS = 64,\n};\n\nenum {\n\tARCH_LBR_BR_TYPE_JCC = 0,\n\tARCH_LBR_BR_TYPE_NEAR_IND_JMP = 1,\n\tARCH_LBR_BR_TYPE_NEAR_REL_JMP = 2,\n\tARCH_LBR_BR_TYPE_NEAR_IND_CALL = 3,\n\tARCH_LBR_BR_TYPE_NEAR_REL_CALL = 4,\n\tARCH_LBR_BR_TYPE_NEAR_RET = 5,\n\tARCH_LBR_BR_TYPE_KNOWN_MAX = 5,\n\tARCH_LBR_BR_TYPE_MAP_MAX = 16,\n};\n\nenum {\n\tAS3711_REGULATOR = 0,\n\tAS3711_BACKLIGHT = 1,\n};\n\nenum {\n\tAS3711_REGULATOR_SD_1 = 0,\n\tAS3711_REGULATOR_SD_2 = 1,\n\tAS3711_REGULATOR_SD_3 = 2,\n\tAS3711_REGULATOR_SD_4 = 3,\n\tAS3711_REGULATOR_LDO_1 = 4,\n\tAS3711_REGULATOR_LDO_2 = 5,\n\tAS3711_REGULATOR_LDO_3 = 6,\n\tAS3711_REGULATOR_LDO_4 = 7,\n\tAS3711_REGULATOR_LDO_5 = 8,\n\tAS3711_REGULATOR_LDO_6 = 9,\n\tAS3711_REGULATOR_LDO_7 = 10,\n\tAS3711_REGULATOR_LDO_8 = 11,\n\tAS3711_REGULATOR_MAX = 12,\n};\n\nenum {\n\tASCII_NULL = 0,\n\tASCII_BELL = 7,\n\tASCII_BACKSPACE = 8,\n\tASCII_IGNORE_FIRST = 8,\n\tASCII_HTAB = 9,\n\tASCII_LINEFEED = 10,\n\tASCII_VTAB = 11,\n\tASCII_FORMFEED = 12,\n\tASCII_CAR_RET = 13,\n\tASCII_IGNORE_LAST = 13,\n\tASCII_SHIFTOUT = 14,\n\tASCII_SHIFTIN = 15,\n\tASCII_CANCEL = 24,\n\tASCII_SUBSTITUTE = 26,\n\tASCII_ESCAPE = 27,\n\tASCII_CSI_IGNORE_FIRST = 32,\n\tASCII_CSI_IGNORE_LAST = 63,\n\tASCII_DEL = 127,\n\tASCII_EXT_CSI = 155,\n};\n\nenum {\n\tATA_EH_SPDN_NCQ_OFF = 1,\n\tATA_EH_SPDN_SPEED_DOWN = 2,\n\tATA_EH_SPDN_FALLBACK_TO_PIO = 4,\n\tATA_EH_SPDN_KEEP_ERRORS = 8,\n\tATA_EFLAG_IS_IO = 1,\n\tATA_EFLAG_DUBIOUS_XFER = 2,\n\tATA_EFLAG_OLD_ER = -2147483648,\n\tATA_ECAT_NONE = 0,\n\tATA_ECAT_ATA_BUS = 1,\n\tATA_ECAT_TOUT_HSM = 2,\n\tATA_ECAT_UNK_DEV = 3,\n\tATA_ECAT_DUBIOUS_NONE = 4,\n\tATA_ECAT_DUBIOUS_ATA_BUS = 5,\n\tATA_ECAT_DUBIOUS_TOUT_HSM = 6,\n\tATA_ECAT_DUBIOUS_UNK_DEV = 7,\n\tATA_ECAT_NR = 8,\n\tATA_EH_CMD_DFL_TIMEOUT = 5000,\n\tATA_EH_RESET_COOL_DOWN = 5000,\n\tATA_EH_PRERESET_TIMEOUT = 10000,\n\tATA_EH_FASTDRAIN_INTERVAL = 3000,\n\tATA_EH_UA_TRIES = 5,\n\tATA_EH_PROBE_TRIAL_INTERVAL = 60000,\n\tATA_EH_PROBE_TRIALS = 2,\n};\n\nenum {\n\tATA_GEN_CLASS_MATCH = 1,\n\tATA_GEN_FORCE_DMA = 2,\n\tATA_GEN_INTEL_IDER = 4,\n};\n\nenum {\n\tATA_MAX_DEVICES = 2,\n\tATA_MAX_PRD = 256,\n\tATA_SECT_SIZE = 512,\n\tATA_MAX_SECTORS_128 = 128,\n\tATA_MAX_SECTORS = 256,\n\tATA_MAX_SECTORS_1024 = 1024,\n\tATA_MAX_SECTORS_LBA48 = 65535,\n\tATA_MAX_SECTORS_TAPE = 65535,\n\tATA_MAX_TRIM_RNUM = 64,\n\tATA_ID_WORDS = 256,\n\tATA_ID_CONFIG = 0,\n\tATA_ID_CYLS = 1,\n\tATA_ID_HEADS = 3,\n\tATA_ID_SECTORS = 6,\n\tATA_ID_SERNO = 10,\n\tATA_ID_BUF_SIZE = 21,\n\tATA_ID_FW_REV = 23,\n\tATA_ID_PROD = 27,\n\tATA_ID_MAX_MULTSECT = 47,\n\tATA_ID_DWORD_IO = 48,\n\tATA_ID_TRUSTED = 48,\n\tATA_ID_CAPABILITY = 49,\n\tATA_ID_OLD_PIO_MODES = 51,\n\tATA_ID_OLD_DMA_MODES = 52,\n\tATA_ID_FIELD_VALID = 53,\n\tATA_ID_CUR_CYLS = 54,\n\tATA_ID_CUR_HEADS = 55,\n\tATA_ID_CUR_SECTORS = 56,\n\tATA_ID_MULTSECT = 59,\n\tATA_ID_LBA_CAPACITY = 60,\n\tATA_ID_SWDMA_MODES = 62,\n\tATA_ID_MWDMA_MODES = 63,\n\tATA_ID_PIO_MODES = 64,\n\tATA_ID_EIDE_DMA_MIN = 65,\n\tATA_ID_EIDE_DMA_TIME = 66,\n\tATA_ID_EIDE_PIO = 67,\n\tATA_ID_EIDE_PIO_IORDY = 68,\n\tATA_ID_ADDITIONAL_SUPP = 69,\n\tATA_ID_QUEUE_DEPTH = 75,\n\tATA_ID_SATA_CAPABILITY = 76,\n\tATA_ID_SATA_CAPABILITY_2 = 77,\n\tATA_ID_FEATURE_SUPP = 78,\n\tATA_ID_MAJOR_VER = 80,\n\tATA_ID_COMMAND_SET_1 = 82,\n\tATA_ID_COMMAND_SET_2 = 83,\n\tATA_ID_CFSSE = 84,\n\tATA_ID_CFS_ENABLE_1 = 85,\n\tATA_ID_CFS_ENABLE_2 = 86,\n\tATA_ID_CSF_DEFAULT = 87,\n\tATA_ID_UDMA_MODES = 88,\n\tATA_ID_HW_CONFIG = 93,\n\tATA_ID_SPG = 98,\n\tATA_ID_LBA_CAPACITY_2 = 100,\n\tATA_ID_SECTOR_SIZE = 106,\n\tATA_ID_WWN = 108,\n\tATA_ID_LOGICAL_SECTOR_SIZE = 117,\n\tATA_ID_COMMAND_SET_3 = 119,\n\tATA_ID_COMMAND_SET_4 = 120,\n\tATA_ID_LAST_LUN = 126,\n\tATA_ID_DLF = 128,\n\tATA_ID_CSFO = 129,\n\tATA_ID_CFA_POWER = 160,\n\tATA_ID_CFA_KEY_MGMT = 162,\n\tATA_ID_CFA_MODES = 163,\n\tATA_ID_DATA_SET_MGMT = 169,\n\tATA_ID_SCT_CMD_XPORT = 206,\n\tATA_ID_ROT_SPEED = 217,\n\tATA_ID_PIO4 = 2,\n\tATA_ID_SERNO_LEN = 20,\n\tATA_ID_FW_REV_LEN = 8,\n\tATA_ID_PROD_LEN = 40,\n\tATA_ID_WWN_LEN = 8,\n\tATA_PCI_CTL_OFS = 2,\n\tATA_PIO0 = 1,\n\tATA_PIO1 = 3,\n\tATA_PIO2 = 7,\n\tATA_PIO3 = 15,\n\tATA_PIO4 = 31,\n\tATA_PIO5 = 63,\n\tATA_PIO6 = 127,\n\tATA_PIO4_ONLY = 16,\n\tATA_SWDMA0 = 1,\n\tATA_SWDMA1 = 3,\n\tATA_SWDMA2 = 7,\n\tATA_SWDMA2_ONLY = 4,\n\tATA_MWDMA0 = 1,\n\tATA_MWDMA1 = 3,\n\tATA_MWDMA2 = 7,\n\tATA_MWDMA3 = 15,\n\tATA_MWDMA4 = 31,\n\tATA_MWDMA12_ONLY = 6,\n\tATA_MWDMA2_ONLY = 4,\n\tATA_UDMA0 = 1,\n\tATA_UDMA1 = 3,\n\tATA_UDMA2 = 7,\n\tATA_UDMA3 = 15,\n\tATA_UDMA4 = 31,\n\tATA_UDMA5 = 63,\n\tATA_UDMA6 = 127,\n\tATA_UDMA7 = 255,\n\tATA_UDMA24_ONLY = 20,\n\tATA_UDMA_MASK_40C = 7,\n\tATA_PRD_SZ = 8,\n\tATA_PRD_TBL_SZ = 2048,\n\tATA_PRD_EOT = -2147483648,\n\tATA_DMA_TABLE_OFS = 4,\n\tATA_DMA_STATUS = 2,\n\tATA_DMA_CMD = 0,\n\tATA_DMA_WR = 8,\n\tATA_DMA_START = 1,\n\tATA_DMA_INTR = 4,\n\tATA_DMA_ERR = 2,\n\tATA_DMA_ACTIVE = 1,\n\tATA_HOB = 128,\n\tATA_NIEN = 2,\n\tATA_LBA = 64,\n\tATA_DEV1 = 16,\n\tATA_DEVICE_OBS = 160,\n\tATA_DEVCTL_OBS = 8,\n\tATA_BUSY = 128,\n\tATA_DRDY = 64,\n\tATA_DF = 32,\n\tATA_DSC = 16,\n\tATA_DRQ = 8,\n\tATA_CORR = 4,\n\tATA_SENSE = 2,\n\tATA_ERR = 1,\n\tATA_SRST = 4,\n\tATA_ICRC = 128,\n\tATA_BBK = 128,\n\tATA_UNC = 64,\n\tATA_MC = 32,\n\tATA_IDNF = 16,\n\tATA_MCR = 8,\n\tATA_ABORTED = 4,\n\tATA_TRK0NF = 2,\n\tATA_AMNF = 1,\n\tATAPI_LFS = 240,\n\tATAPI_EOM = 2,\n\tATAPI_ILI = 1,\n\tATAPI_IO = 2,\n\tATAPI_COD = 1,\n\tATA_REG_DATA = 0,\n\tATA_REG_ERR = 1,\n\tATA_REG_NSECT = 2,\n\tATA_REG_LBAL = 3,\n\tATA_REG_LBAM = 4,\n\tATA_REG_LBAH = 5,\n\tATA_REG_DEVICE = 6,\n\tATA_REG_STATUS = 7,\n\tATA_REG_FEATURE = 1,\n\tATA_REG_CMD = 7,\n\tATA_REG_BYTEL = 4,\n\tATA_REG_BYTEH = 5,\n\tATA_REG_DEVSEL = 6,\n\tATA_REG_IRQ = 2,\n\tATA_CMD_DEV_RESET = 8,\n\tATA_CMD_CHK_POWER = 229,\n\tATA_CMD_STANDBY = 226,\n\tATA_CMD_IDLE = 227,\n\tATA_CMD_EDD = 144,\n\tATA_CMD_DOWNLOAD_MICRO = 146,\n\tATA_CMD_DOWNLOAD_MICRO_DMA = 147,\n\tATA_CMD_NOP = 0,\n\tATA_CMD_FLUSH = 231,\n\tATA_CMD_FLUSH_EXT = 234,\n\tATA_CMD_ID_ATA = 236,\n\tATA_CMD_ID_ATAPI = 161,\n\tATA_CMD_SERVICE = 162,\n\tATA_CMD_READ = 200,\n\tATA_CMD_READ_EXT = 37,\n\tATA_CMD_READ_QUEUED = 38,\n\tATA_CMD_READ_STREAM_EXT = 43,\n\tATA_CMD_READ_STREAM_DMA_EXT = 42,\n\tATA_CMD_WRITE = 202,\n\tATA_CMD_WRITE_EXT = 53,\n\tATA_CMD_WRITE_QUEUED = 54,\n\tATA_CMD_WRITE_STREAM_EXT = 59,\n\tATA_CMD_WRITE_STREAM_DMA_EXT = 58,\n\tATA_CMD_WRITE_FUA_EXT = 61,\n\tATA_CMD_WRITE_QUEUED_FUA_EXT = 62,\n\tATA_CMD_FPDMA_READ = 96,\n\tATA_CMD_FPDMA_WRITE = 97,\n\tATA_CMD_NCQ_NON_DATA = 99,\n\tATA_CMD_FPDMA_SEND = 100,\n\tATA_CMD_FPDMA_RECV = 101,\n\tATA_CMD_PIO_READ = 32,\n\tATA_CMD_PIO_READ_EXT = 36,\n\tATA_CMD_PIO_WRITE = 48,\n\tATA_CMD_PIO_WRITE_EXT = 52,\n\tATA_CMD_READ_MULTI = 196,\n\tATA_CMD_READ_MULTI_EXT = 41,\n\tATA_CMD_WRITE_MULTI = 197,\n\tATA_CMD_WRITE_MULTI_EXT = 57,\n\tATA_CMD_WRITE_MULTI_FUA_EXT = 206,\n\tATA_CMD_SET_FEATURES = 239,\n\tATA_CMD_SET_MULTI = 198,\n\tATA_CMD_PACKET = 160,\n\tATA_CMD_VERIFY = 64,\n\tATA_CMD_VERIFY_EXT = 66,\n\tATA_CMD_WRITE_UNCORR_EXT = 69,\n\tATA_CMD_STANDBYNOW1 = 224,\n\tATA_CMD_IDLEIMMEDIATE = 225,\n\tATA_CMD_SLEEP = 230,\n\tATA_CMD_INIT_DEV_PARAMS = 145,\n\tATA_CMD_READ_NATIVE_MAX = 248,\n\tATA_CMD_READ_NATIVE_MAX_EXT = 39,\n\tATA_CMD_SET_MAX = 249,\n\tATA_CMD_SET_MAX_EXT = 55,\n\tATA_CMD_READ_LOG_EXT = 47,\n\tATA_CMD_WRITE_LOG_EXT = 63,\n\tATA_CMD_READ_LOG_DMA_EXT = 71,\n\tATA_CMD_WRITE_LOG_DMA_EXT = 87,\n\tATA_CMD_TRUSTED_NONDATA = 91,\n\tATA_CMD_TRUSTED_RCV = 92,\n\tATA_CMD_TRUSTED_RCV_DMA = 93,\n\tATA_CMD_TRUSTED_SND = 94,\n\tATA_CMD_TRUSTED_SND_DMA = 95,\n\tATA_CMD_PMP_READ = 228,\n\tATA_CMD_PMP_READ_DMA = 233,\n\tATA_CMD_PMP_WRITE = 232,\n\tATA_CMD_PMP_WRITE_DMA = 235,\n\tATA_CMD_CONF_OVERLAY = 177,\n\tATA_CMD_SEC_SET_PASS = 241,\n\tATA_CMD_SEC_UNLOCK = 242,\n\tATA_CMD_SEC_ERASE_PREP = 243,\n\tATA_CMD_SEC_ERASE_UNIT = 244,\n\tATA_CMD_SEC_FREEZE_LOCK = 245,\n\tATA_CMD_SEC_DISABLE_PASS = 246,\n\tATA_CMD_CONFIG_STREAM = 81,\n\tATA_CMD_SMART = 176,\n\tATA_CMD_MEDIA_LOCK = 222,\n\tATA_CMD_MEDIA_UNLOCK = 223,\n\tATA_CMD_DSM = 6,\n\tATA_CMD_CHK_MED_CRD_TYP = 209,\n\tATA_CMD_CFA_REQ_EXT_ERR = 3,\n\tATA_CMD_CFA_WRITE_NE = 56,\n\tATA_CMD_CFA_TRANS_SECT = 135,\n\tATA_CMD_CFA_ERASE = 192,\n\tATA_CMD_CFA_WRITE_MULT_NE = 205,\n\tATA_CMD_REQ_SENSE_DATA = 11,\n\tATA_CMD_SANITIZE_DEVICE = 180,\n\tATA_CMD_ZAC_MGMT_IN = 74,\n\tATA_CMD_ZAC_MGMT_OUT = 159,\n\tATA_CMD_RESTORE = 16,\n\tATA_SUBCMD_FPDMA_RECV_RD_LOG_DMA_EXT = 1,\n\tATA_SUBCMD_FPDMA_RECV_ZAC_MGMT_IN = 2,\n\tATA_SUBCMD_FPDMA_SEND_DSM = 0,\n\tATA_SUBCMD_FPDMA_SEND_WR_LOG_DMA_EXT = 2,\n\tATA_SUBCMD_NCQ_NON_DATA_ABORT_QUEUE = 0,\n\tATA_SUBCMD_NCQ_NON_DATA_SET_FEATURES = 5,\n\tATA_SUBCMD_NCQ_NON_DATA_ZERO_EXT = 6,\n\tATA_SUBCMD_NCQ_NON_DATA_ZAC_MGMT_OUT = 7,\n\tATA_SUBCMD_ZAC_MGMT_IN_REPORT_ZONES = 0,\n\tATA_SUBCMD_ZAC_MGMT_OUT_CLOSE_ZONE = 1,\n\tATA_SUBCMD_ZAC_MGMT_OUT_FINISH_ZONE = 2,\n\tATA_SUBCMD_ZAC_MGMT_OUT_OPEN_ZONE = 3,\n\tATA_SUBCMD_ZAC_MGMT_OUT_RESET_WRITE_POINTER = 4,\n\tATA_LOG_DIRECTORY = 0,\n\tATA_LOG_SATA_NCQ = 16,\n\tATA_LOG_NCQ_NON_DATA = 18,\n\tATA_LOG_NCQ_SEND_RECV = 19,\n\tATA_LOG_CDL = 24,\n\tATA_LOG_CDL_SIZE = 512,\n\tATA_LOG_IDENTIFY_DEVICE = 48,\n\tATA_LOG_SENSE_NCQ = 15,\n\tATA_LOG_SENSE_NCQ_SIZE = 1024,\n\tATA_LOG_CONCURRENT_POSITIONING_RANGES = 71,\n\tATA_LOG_SUPPORTED_CAPABILITIES = 3,\n\tATA_LOG_CURRENT_SETTINGS = 4,\n\tATA_LOG_SECURITY = 6,\n\tATA_LOG_SATA_SETTINGS = 8,\n\tATA_LOG_ZONED_INFORMATION = 9,\n\tATA_LOG_DEVSLP_OFFSET = 48,\n\tATA_LOG_DEVSLP_SIZE = 8,\n\tATA_LOG_DEVSLP_MDAT = 0,\n\tATA_LOG_DEVSLP_MDAT_MASK = 31,\n\tATA_LOG_DEVSLP_DETO = 1,\n\tATA_LOG_DEVSLP_VALID = 7,\n\tATA_LOG_DEVSLP_VALID_MASK = 128,\n\tATA_LOG_NCQ_PRIO_OFFSET = 9,\n\tATA_LOG_NCQ_SEND_RECV_SUBCMDS_OFFSET = 0,\n\tATA_LOG_NCQ_SEND_RECV_SUBCMDS_DSM = 1,\n\tATA_LOG_NCQ_SEND_RECV_DSM_OFFSET = 4,\n\tATA_LOG_NCQ_SEND_RECV_DSM_TRIM = 1,\n\tATA_LOG_NCQ_SEND_RECV_RD_LOG_OFFSET = 8,\n\tATA_LOG_NCQ_SEND_RECV_RD_LOG_SUPPORTED = 1,\n\tATA_LOG_NCQ_SEND_RECV_WR_LOG_OFFSET = 12,\n\tATA_LOG_NCQ_SEND_RECV_WR_LOG_SUPPORTED = 1,\n\tATA_LOG_NCQ_SEND_RECV_ZAC_MGMT_OFFSET = 16,\n\tATA_LOG_NCQ_SEND_RECV_ZAC_MGMT_OUT_SUPPORTED = 1,\n\tATA_LOG_NCQ_SEND_RECV_ZAC_MGMT_IN_SUPPORTED = 2,\n\tATA_LOG_NCQ_SEND_RECV_SIZE = 20,\n\tATA_LOG_NCQ_NON_DATA_SUBCMDS_OFFSET = 0,\n\tATA_LOG_NCQ_NON_DATA_ABORT_OFFSET = 0,\n\tATA_LOG_NCQ_NON_DATA_ABORT_NCQ = 1,\n\tATA_LOG_NCQ_NON_DATA_ABORT_ALL = 2,\n\tATA_LOG_NCQ_NON_DATA_ABORT_STREAMING = 4,\n\tATA_LOG_NCQ_NON_DATA_ABORT_NON_STREAMING = 8,\n\tATA_LOG_NCQ_NON_DATA_ABORT_SELECTED = 16,\n\tATA_LOG_NCQ_NON_DATA_ZAC_MGMT_OFFSET = 28,\n\tATA_LOG_NCQ_NON_DATA_ZAC_MGMT_OUT = 1,\n\tATA_LOG_NCQ_NON_DATA_SIZE = 64,\n\tATA_CMD_READ_LONG = 34,\n\tATA_CMD_READ_LONG_ONCE = 35,\n\tATA_CMD_WRITE_LONG = 50,\n\tATA_CMD_WRITE_LONG_ONCE = 51,\n\tSETFEATURES_XFER = 3,\n\tXFER_UDMA_7 = 71,\n\tXFER_UDMA_6 = 70,\n\tXFER_UDMA_5 = 69,\n\tXFER_UDMA_4 = 68,\n\tXFER_UDMA_3 = 67,\n\tXFER_UDMA_2 = 66,\n\tXFER_UDMA_1 = 65,\n\tXFER_UDMA_0 = 64,\n\tXFER_MW_DMA_4 = 36,\n\tXFER_MW_DMA_3 = 35,\n\tXFER_MW_DMA_2 = 34,\n\tXFER_MW_DMA_1 = 33,\n\tXFER_MW_DMA_0 = 32,\n\tXFER_SW_DMA_2 = 18,\n\tXFER_SW_DMA_1 = 17,\n\tXFER_SW_DMA_0 = 16,\n\tXFER_PIO_6 = 14,\n\tXFER_PIO_5 = 13,\n\tXFER_PIO_4 = 12,\n\tXFER_PIO_3 = 11,\n\tXFER_PIO_2 = 10,\n\tXFER_PIO_1 = 9,\n\tXFER_PIO_0 = 8,\n\tXFER_PIO_SLOW = 0,\n\tSETFEATURES_WC_ON = 2,\n\tSETFEATURES_WC_OFF = 130,\n\tSETFEATURES_RA_ON = 170,\n\tSETFEATURES_RA_OFF = 85,\n\tSETFEATURES_AAM_ON = 66,\n\tSETFEATURES_AAM_OFF = 194,\n\tSETFEATURES_SPINUP = 7,\n\tSETFEATURES_SPINUP_TIMEOUT = 30000,\n\tSETFEATURES_SATA_ENABLE = 16,\n\tSETFEATURES_SATA_DISABLE = 144,\n\tSETFEATURES_CDL = 13,\n\tSATA_FPDMA_OFFSET = 1,\n\tSATA_FPDMA_AA = 2,\n\tSATA_DIPM = 3,\n\tSATA_FPDMA_IN_ORDER = 4,\n\tSATA_AN = 5,\n\tSATA_SSP = 6,\n\tSATA_DEVSLP = 9,\n\tSETFEATURE_SENSE_DATA = 195,\n\tSETFEATURE_SENSE_DATA_SUCC_NCQ = 196,\n\tATA_SET_MAX_ADDR = 0,\n\tATA_SET_MAX_PASSWD = 1,\n\tATA_SET_MAX_LOCK = 2,\n\tATA_SET_MAX_UNLOCK = 3,\n\tATA_SET_MAX_FREEZE_LOCK = 4,\n\tATA_SET_MAX_PASSWD_DMA = 5,\n\tATA_SET_MAX_UNLOCK_DMA = 6,\n\tATA_DCO_RESTORE = 192,\n\tATA_DCO_FREEZE_LOCK = 193,\n\tATA_DCO_IDENTIFY = 194,\n\tATA_DCO_SET = 195,\n\tATA_SMART_ENABLE = 216,\n\tATA_SMART_READ_VALUES = 208,\n\tATA_SMART_READ_THRESHOLDS = 209,\n\tATA_DSM_TRIM = 1,\n\tATA_SMART_LBAM_PASS = 79,\n\tATA_SMART_LBAH_PASS = 194,\n\tATAPI_PKT_DMA = 1,\n\tATAPI_DMADIR = 4,\n\tATAPI_CDB_LEN = 16,\n\tSATA_PMP_MAX_PORTS = 15,\n\tSATA_PMP_CTRL_PORT = 15,\n\tSATA_PMP_GSCR_DWORDS = 128,\n\tSATA_PMP_GSCR_PROD_ID = 0,\n\tSATA_PMP_GSCR_REV = 1,\n\tSATA_PMP_GSCR_PORT_INFO = 2,\n\tSATA_PMP_GSCR_ERROR = 32,\n\tSATA_PMP_GSCR_ERROR_EN = 33,\n\tSATA_PMP_GSCR_FEAT = 64,\n\tSATA_PMP_GSCR_FEAT_EN = 96,\n\tSATA_PMP_PSCR_STATUS = 0,\n\tSATA_PMP_PSCR_ERROR = 1,\n\tSATA_PMP_PSCR_CONTROL = 2,\n\tSATA_PMP_FEAT_BIST = 1,\n\tSATA_PMP_FEAT_PMREQ = 2,\n\tSATA_PMP_FEAT_DYNSSC = 4,\n\tSATA_PMP_FEAT_NOTIFY = 8,\n\tATA_CBL_NONE = 0,\n\tATA_CBL_PATA40 = 1,\n\tATA_CBL_PATA80 = 2,\n\tATA_CBL_PATA40_SHORT = 3,\n\tATA_CBL_PATA_UNK = 4,\n\tATA_CBL_PATA_IGN = 5,\n\tATA_CBL_SATA = 6,\n\tSCR_STATUS = 0,\n\tSCR_ERROR = 1,\n\tSCR_CONTROL = 2,\n\tSCR_ACTIVE = 3,\n\tSCR_NOTIFICATION = 4,\n\tSERR_DATA_RECOVERED = 1,\n\tSERR_COMM_RECOVERED = 2,\n\tSERR_DATA = 256,\n\tSERR_PERSISTENT = 512,\n\tSERR_PROTOCOL = 1024,\n\tSERR_INTERNAL = 2048,\n\tSERR_PHYRDY_CHG = 65536,\n\tSERR_PHY_INT_ERR = 131072,\n\tSERR_COMM_WAKE = 262144,\n\tSERR_10B_8B_ERR = 524288,\n\tSERR_DISPARITY = 1048576,\n\tSERR_CRC = 2097152,\n\tSERR_HANDSHAKE = 4194304,\n\tSERR_LINK_SEQ_ERR = 8388608,\n\tSERR_TRANS_ST_ERROR = 16777216,\n\tSERR_UNRECOG_FIS = 33554432,\n\tSERR_DEV_XCHG = 67108864,\n};\n\nenum {\n\tATA_READID_POSTRESET = 1,\n\tATA_DNXFER_PIO = 0,\n\tATA_DNXFER_DMA = 1,\n\tATA_DNXFER_40C = 2,\n\tATA_DNXFER_FORCE_PIO = 3,\n\tATA_DNXFER_FORCE_PIO0 = 4,\n\tATA_DNXFER_QUIET = -2147483648,\n};\n\nenum {\n\tAT_PKT_END = -1,\n\tBEYOND_PKT_END = -2,\n};\n\nenum {\n\tAUTOP_INVALID = 0,\n\tAUTOP_HDD = 1,\n\tAUTOP_SSD_QD1 = 2,\n\tAUTOP_SSD_DFL = 3,\n\tAUTOP_SSD_FAST = 4,\n};\n\nenum {\n\tAX25_VALUES_IPDEFMODE = 0,\n\tAX25_VALUES_AXDEFMODE = 1,\n\tAX25_VALUES_BACKOFF = 2,\n\tAX25_VALUES_CONMODE = 3,\n\tAX25_VALUES_WINDOW = 4,\n\tAX25_VALUES_EWINDOW = 5,\n\tAX25_VALUES_T1 = 6,\n\tAX25_VALUES_T2 = 7,\n\tAX25_VALUES_T3 = 8,\n\tAX25_VALUES_IDLE = 9,\n\tAX25_VALUES_N2 = 10,\n\tAX25_VALUES_PACLEN = 11,\n\tAX25_VALUES_PROTOCOL = 12,\n\tAX25_VALUES_DS_TIMEOUT = 13,\n\tAX25_MAX_VALUES = 14,\n};\n\nenum {\n\tAudit_equal = 0,\n\tAudit_not_equal = 1,\n\tAudit_bitmask = 2,\n\tAudit_bittest = 3,\n\tAudit_lt = 4,\n\tAudit_gt = 5,\n\tAudit_le = 6,\n\tAudit_ge = 7,\n\tAudit_bad = 8,\n};\n\nenum {\n\tBAD_STACK = -1,\n\tNOT_STACK = 0,\n\tGOOD_FRAME = 1,\n\tGOOD_STACK = 2,\n};\n\nenum {\n\tBDX_PCI_UNCORE_HA = 0,\n\tBDX_PCI_UNCORE_IMC = 1,\n\tBDX_PCI_UNCORE_IRP = 2,\n\tBDX_PCI_UNCORE_QPI = 3,\n\tBDX_PCI_UNCORE_R2PCIE = 4,\n\tBDX_PCI_UNCORE_R3QPI = 5,\n};\n\nenum {\n\tBIAS = 2147483648,\n};\n\nenum {\n\tBIOSET_NEED_BVECS = 1,\n\tBIOSET_NEED_RESCUER = 2,\n\tBIOSET_PERCPU_CACHE = 4,\n};\n\nenum {\n\tBIOS_FREQ_BASE_PLATFORM = 0,\n\tBIOS_FREQ_BASE_INTERVAL_TIMER = 1,\n\tBIOS_FREQ_BASE_REALTIME_CLOCK = 2,\n};\n\nenum {\n\tBIOS_STATUS_MORE_PASSES = 1,\n\tBIOS_STATUS_SUCCESS = 0,\n\tBIOS_STATUS_UNIMPLEMENTED = -38,\n\tBIOS_STATUS_EINVAL = -22,\n\tBIOS_STATUS_UNAVAIL = -16,\n\tBIOS_STATUS_ABORT = -4,\n};\n\nenum {\n\tBIO_PAGE_PINNED = 0,\n\tBIO_CLONED = 1,\n\tBIO_BOUNCED = 2,\n\tBIO_QUIET = 3,\n\tBIO_CHAIN = 4,\n\tBIO_REFFED = 5,\n\tBIO_BPS_THROTTLED = 6,\n\tBIO_TRACE_COMPLETION = 7,\n\tBIO_CGROUP_ACCT = 8,\n\tBIO_QOS_THROTTLED = 9,\n\tBIO_QOS_MERGED = 10,\n\tBIO_REMAPPED = 11,\n\tBIO_ZONE_WRITE_PLUGGING = 12,\n\tBIO_EMULATES_ZONE_APPEND = 13,\n\tBIO_FLAG_LAST = 14,\n};\n\nenum {\n\tBLK_MQ_F_SHOULD_MERGE = 1,\n\tBLK_MQ_F_TAG_QUEUE_SHARED = 2,\n\tBLK_MQ_F_STACKING = 4,\n\tBLK_MQ_F_TAG_HCTX_SHARED = 8,\n\tBLK_MQ_F_BLOCKING = 16,\n\tBLK_MQ_F_NO_SCHED = 32,\n\tBLK_MQ_F_NO_SCHED_BY_DEFAULT = 64,\n\tBLK_MQ_F_ALLOC_POLICY_START_BIT = 7,\n\tBLK_MQ_F_ALLOC_POLICY_BITS = 1,\n};\n\nenum {\n\tBLK_MQ_NO_TAG = 4294967295,\n\tBLK_MQ_TAG_MIN = 1,\n\tBLK_MQ_TAG_MAX = 4294967294,\n};\n\nenum {\n\tBLK_MQ_REQ_NOWAIT = 1,\n\tBLK_MQ_REQ_RESERVED = 2,\n\tBLK_MQ_REQ_PM = 4,\n};\n\nenum {\n\tBLK_MQ_S_STOPPED = 0,\n\tBLK_MQ_S_TAG_ACTIVE = 1,\n\tBLK_MQ_S_SCHED_RESTART = 2,\n\tBLK_MQ_S_INACTIVE = 3,\n\tBLK_MQ_S_MAX = 4,\n};\n\nenum {\n\tBLK_MQ_UNIQUE_TAG_BITS = 16,\n\tBLK_MQ_UNIQUE_TAG_MASK = 65535,\n};\n\nenum {\n\tBLK_TAG_ALLOC_FIFO = 0,\n\tBLK_TAG_ALLOC_RR = 1,\n\tBLK_TAG_ALLOC_MAX = 2,\n};\n\nenum {\n\tBLOCK_BITMAP = 0,\n\tINODE_BITMAP = 1,\n\tINODE_TABLE = 2,\n\tGROUP_TABLE_COUNT = 3,\n};\n\nenum {\n\tBPF_ADJ_ROOM_ENCAP_L2_MASK = 255,\n\tBPF_ADJ_ROOM_ENCAP_L2_SHIFT = 56,\n};\n\nenum {\n\tBPF_ANY = 0,\n\tBPF_NOEXIST = 1,\n\tBPF_EXIST = 2,\n\tBPF_F_LOCK = 4,\n};\n\nenum {\n\tBPF_CSUM_LEVEL_QUERY = 0,\n\tBPF_CSUM_LEVEL_INC = 1,\n\tBPF_CSUM_LEVEL_DEC = 2,\n\tBPF_CSUM_LEVEL_RESET = 3,\n};\n\nenum {\n\tBPF_FIB_LKUP_RET_SUCCESS = 0,\n\tBPF_FIB_LKUP_RET_BLACKHOLE = 1,\n\tBPF_FIB_LKUP_RET_UNREACHABLE = 2,\n\tBPF_FIB_LKUP_RET_PROHIBIT = 3,\n\tBPF_FIB_LKUP_RET_NOT_FWDED = 4,\n\tBPF_FIB_LKUP_RET_FWD_DISABLED = 5,\n\tBPF_FIB_LKUP_RET_UNSUPP_LWT = 6,\n\tBPF_FIB_LKUP_RET_NO_NEIGH = 7,\n\tBPF_FIB_LKUP_RET_FRAG_NEEDED = 8,\n\tBPF_FIB_LKUP_RET_NO_SRC_ADDR = 9,\n};\n\nenum {\n\tBPF_FIB_LOOKUP_DIRECT = 1,\n\tBPF_FIB_LOOKUP_OUTPUT = 2,\n\tBPF_FIB_LOOKUP_SKIP_NEIGH = 4,\n\tBPF_FIB_LOOKUP_TBID = 8,\n\tBPF_FIB_LOOKUP_SRC = 16,\n\tBPF_FIB_LOOKUP_MARK = 32,\n};\n\nenum {\n\tBPF_FLOW_DISSECTOR_F_PARSE_1ST_FRAG = 1,\n\tBPF_FLOW_DISSECTOR_F_STOP_AT_FLOW_LABEL = 2,\n\tBPF_FLOW_DISSECTOR_F_STOP_AT_ENCAP = 4,\n};\n\nenum {\n\tBPF_F_ADJ_ROOM_FIXED_GSO = 1,\n\tBPF_F_ADJ_ROOM_ENCAP_L3_IPV4 = 2,\n\tBPF_F_ADJ_ROOM_ENCAP_L3_IPV6 = 4,\n\tBPF_F_ADJ_ROOM_ENCAP_L4_GRE = 8,\n\tBPF_F_ADJ_ROOM_ENCAP_L4_UDP = 16,\n\tBPF_F_ADJ_ROOM_NO_CSUM_RESET = 32,\n\tBPF_F_ADJ_ROOM_ENCAP_L2_ETH = 64,\n\tBPF_F_ADJ_ROOM_DECAP_L3_IPV4 = 128,\n\tBPF_F_ADJ_ROOM_DECAP_L3_IPV6 = 256,\n};\n\nenum {\n\tBPF_F_BPRM_SECUREEXEC = 1,\n};\n\nenum {\n\tBPF_F_CURRENT_NETNS = -1,\n};\n\nenum {\n\tBPF_F_GET_BRANCH_RECORDS_SIZE = 1,\n};\n\nenum {\n\tBPF_F_HDR_FIELD_MASK = 15,\n};\n\nenum {\n\tBPF_F_INDEX_MASK = 4294967295ULL,\n\tBPF_F_CURRENT_CPU = 4294967295ULL,\n\tBPF_F_CTXLEN_MASK = 4503595332403200ULL,\n};\n\nenum {\n\tBPF_F_INGRESS = 1,\n\tBPF_F_BROADCAST = 8,\n\tBPF_F_EXCLUDE_INGRESS = 16,\n};\n\nenum {\n\tBPF_F_KPROBE_MULTI_RETURN = 1,\n};\n\nenum {\n\tBPF_F_NEIGH = 65536,\n\tBPF_F_PEER = 131072,\n\tBPF_F_NEXTHOP = 262144,\n};\n\nenum {\n\tBPF_F_NO_PREALLOC = 1,\n\tBPF_F_NO_COMMON_LRU = 2,\n\tBPF_F_NUMA_NODE = 4,\n\tBPF_F_RDONLY = 8,\n\tBPF_F_WRONLY = 16,\n\tBPF_F_STACK_BUILD_ID = 32,\n\tBPF_F_ZERO_SEED = 64,\n\tBPF_F_RDONLY_PROG = 128,\n\tBPF_F_WRONLY_PROG = 256,\n\tBPF_F_CLONE = 512,\n\tBPF_F_MMAPABLE = 1024,\n\tBPF_F_PRESERVE_ELEMS = 2048,\n\tBPF_F_INNER_MAP = 4096,\n\tBPF_F_LINK = 8192,\n\tBPF_F_PATH_FD = 16384,\n\tBPF_F_VTYPE_BTF_OBJ_FD = 32768,\n\tBPF_F_TOKEN_FD = 65536,\n\tBPF_F_SEGV_ON_FAULT = 131072,\n\tBPF_F_NO_USER_CONV = 262144,\n};\n\nenum {\n\tBPF_F_PSEUDO_HDR = 16,\n\tBPF_F_MARK_MANGLED_0 = 32,\n\tBPF_F_MARK_ENFORCE = 64,\n};\n\nenum {\n\tBPF_F_RECOMPUTE_CSUM = 1,\n\tBPF_F_INVALIDATE_HASH = 2,\n};\n\nenum {\n\tBPF_F_SKIP_FIELD_MASK = 255,\n\tBPF_F_USER_STACK = 256,\n\tBPF_F_FAST_STACK_CMP = 512,\n\tBPF_F_REUSE_STACKID = 1024,\n\tBPF_F_USER_BUILD_ID = 2048,\n};\n\nenum {\n\tBPF_F_SYSCTL_BASE_NAME = 1,\n};\n\nenum {\n\tBPF_F_TIMER_ABS = 1,\n\tBPF_F_TIMER_CPU_PIN = 2,\n};\n\nenum {\n\tBPF_F_TUNINFO_FLAGS = 16,\n};\n\nenum {\n\tBPF_F_TUNINFO_IPV6 = 1,\n};\n\nenum {\n\tBPF_F_UPROBE_MULTI_RETURN = 1,\n};\n\nenum {\n\tBPF_F_ZERO_CSUM_TX = 2,\n\tBPF_F_DONT_FRAGMENT = 4,\n\tBPF_F_SEQ_NUMBER = 8,\n\tBPF_F_NO_TUNNEL_KEY = 16,\n};\n\nenum {\n\tBPF_LOAD_HDR_OPT_TCP_SYN = 1,\n};\n\nenum {\n\tBPF_LOCAL_STORAGE_GET_F_CREATE = 1,\n\tBPF_SK_STORAGE_GET_F_CREATE = 1,\n};\n\nenum {\n\tBPF_MAX_LOOPS = 8388608,\n};\n\nenum {\n\tBPF_MAX_TRAMP_LINKS = 38,\n};\n\nenum {\n\tBPF_RB_AVAIL_DATA = 0,\n\tBPF_RB_RING_SIZE = 1,\n\tBPF_RB_CONS_POS = 2,\n\tBPF_RB_PROD_POS = 3,\n};\n\nenum {\n\tBPF_RB_NO_WAKEUP = 1,\n\tBPF_RB_FORCE_WAKEUP = 2,\n};\n\nenum {\n\tBPF_REG_0 = 0,\n\tBPF_REG_1 = 1,\n\tBPF_REG_2 = 2,\n\tBPF_REG_3 = 3,\n\tBPF_REG_4 = 4,\n\tBPF_REG_5 = 5,\n\tBPF_REG_6 = 6,\n\tBPF_REG_7 = 7,\n\tBPF_REG_8 = 8,\n\tBPF_REG_9 = 9,\n\tBPF_REG_10 = 10,\n\t__MAX_BPF_REG = 11,\n};\n\nenum {\n\tBPF_RINGBUF_BUSY_BIT = 2147483648,\n\tBPF_RINGBUF_DISCARD_BIT = 1073741824,\n\tBPF_RINGBUF_HDR_SZ = 8,\n};\n\nenum {\n\tBPF_SKB_TSTAMP_UNSPEC = 0,\n\tBPF_SKB_TSTAMP_DELIVERY_MONO = 1,\n\tBPF_SKB_CLOCK_REALTIME = 0,\n\tBPF_SKB_CLOCK_MONOTONIC = 1,\n\tBPF_SKB_CLOCK_TAI = 2,\n};\n\nenum {\n\tBPF_SK_LOOKUP_F_REPLACE = 1,\n\tBPF_SK_LOOKUP_F_NO_REUSEPORT = 2,\n};\n\nenum {\n\tBPF_SOCK_OPS_RTO_CB_FLAG = 1,\n\tBPF_SOCK_OPS_RETRANS_CB_FLAG = 2,\n\tBPF_SOCK_OPS_STATE_CB_FLAG = 4,\n\tBPF_SOCK_OPS_RTT_CB_FLAG = 8,\n\tBPF_SOCK_OPS_PARSE_ALL_HDR_OPT_CB_FLAG = 16,\n\tBPF_SOCK_OPS_PARSE_UNKNOWN_HDR_OPT_CB_FLAG = 32,\n\tBPF_SOCK_OPS_WRITE_HDR_OPT_CB_FLAG = 64,\n\tBPF_SOCK_OPS_ALL_CB_FLAGS = 127,\n};\n\nenum {\n\tBPF_SOCK_OPS_VOID = 0,\n\tBPF_SOCK_OPS_TIMEOUT_INIT = 1,\n\tBPF_SOCK_OPS_RWND_INIT = 2,\n\tBPF_SOCK_OPS_TCP_CONNECT_CB = 3,\n\tBPF_SOCK_OPS_ACTIVE_ESTABLISHED_CB = 4,\n\tBPF_SOCK_OPS_PASSIVE_ESTABLISHED_CB = 5,\n\tBPF_SOCK_OPS_NEEDS_ECN = 6,\n\tBPF_SOCK_OPS_BASE_RTT = 7,\n\tBPF_SOCK_OPS_RTO_CB = 8,\n\tBPF_SOCK_OPS_RETRANS_CB = 9,\n\tBPF_SOCK_OPS_STATE_CB = 10,\n\tBPF_SOCK_OPS_TCP_LISTEN_CB = 11,\n\tBPF_SOCK_OPS_RTT_CB = 12,\n\tBPF_SOCK_OPS_PARSE_HDR_OPT_CB = 13,\n\tBPF_SOCK_OPS_HDR_OPT_LEN_CB = 14,\n\tBPF_SOCK_OPS_WRITE_HDR_OPT_CB = 15,\n};\n\nenum {\n\tBPF_TASK_ITER_ALL_PROCS = 0,\n\tBPF_TASK_ITER_ALL_THREADS = 1,\n\tBPF_TASK_ITER_PROC_THREADS = 2,\n};\n\nenum {\n\tBPF_TCP_ESTABLISHED = 1,\n\tBPF_TCP_SYN_SENT = 2,\n\tBPF_TCP_SYN_RECV = 3,\n\tBPF_TCP_FIN_WAIT1 = 4,\n\tBPF_TCP_FIN_WAIT2 = 5,\n\tBPF_TCP_TIME_WAIT = 6,\n\tBPF_TCP_CLOSE = 7,\n\tBPF_TCP_CLOSE_WAIT = 8,\n\tBPF_TCP_LAST_ACK = 9,\n\tBPF_TCP_LISTEN = 10,\n\tBPF_TCP_CLOSING = 11,\n\tBPF_TCP_NEW_SYN_RECV = 12,\n\tBPF_TCP_BOUND_INACTIVE = 13,\n\tBPF_TCP_MAX_STATES = 14,\n};\n\nenum {\n\tBPF_WRITE_HDR_TCP_CURRENT_MSS = 1,\n\tBPF_WRITE_HDR_TCP_SYNACK_COOKIE = 2,\n};\n\nenum {\n\tBPF_XFRM_STATE_OPTS_SZ = 36,\n};\n\nenum {\n\tBR_MCAST_DIR_RX = 0,\n\tBR_MCAST_DIR_TX = 1,\n\tBR_MCAST_DIR_SIZE = 2,\n};\n\nenum {\n\tBTF_FIELDS_MAX = 11,\n};\n\nenum {\n\tBTF_FIELD_IGNORE = 0,\n\tBTF_FIELD_FOUND = 1,\n};\n\nenum {\n\tBTF_F_COMPACT = 1,\n\tBTF_F_NONAME = 2,\n\tBTF_F_PTR_RAW = 4,\n\tBTF_F_ZERO = 8,\n};\n\nenum {\n\tBTF_KFUNC_SET_MAX_CNT = 256,\n\tBTF_DTOR_KFUNC_MAX_CNT = 256,\n\tBTF_KFUNC_FILTER_MAX_CNT = 16,\n};\n\nenum {\n\tBTF_KIND_UNKN = 0,\n\tBTF_KIND_INT = 1,\n\tBTF_KIND_PTR = 2,\n\tBTF_KIND_ARRAY = 3,\n\tBTF_KIND_STRUCT = 4,\n\tBTF_KIND_UNION = 5,\n\tBTF_KIND_ENUM = 6,\n\tBTF_KIND_FWD = 7,\n\tBTF_KIND_TYPEDEF = 8,\n\tBTF_KIND_VOLATILE = 9,\n\tBTF_KIND_CONST = 10,\n\tBTF_KIND_RESTRICT = 11,\n\tBTF_KIND_FUNC = 12,\n\tBTF_KIND_FUNC_PROTO = 13,\n\tBTF_KIND_VAR = 14,\n\tBTF_KIND_DATASEC = 15,\n\tBTF_KIND_FLOAT = 16,\n\tBTF_KIND_DECL_TAG = 17,\n\tBTF_KIND_TYPE_TAG = 18,\n\tBTF_KIND_ENUM64 = 19,\n\tNR_BTF_KINDS = 20,\n\tBTF_KIND_MAX = 19,\n};\n\nenum {\n\tBTF_MODULE_F_LIVE = 1,\n};\n\nenum {\n\tBTF_SOCK_TYPE_INET = 0,\n\tBTF_SOCK_TYPE_INET_CONN = 1,\n\tBTF_SOCK_TYPE_INET_REQ = 2,\n\tBTF_SOCK_TYPE_INET_TW = 3,\n\tBTF_SOCK_TYPE_REQ = 4,\n\tBTF_SOCK_TYPE_SOCK = 5,\n\tBTF_SOCK_TYPE_SOCK_COMMON = 6,\n\tBTF_SOCK_TYPE_TCP = 7,\n\tBTF_SOCK_TYPE_TCP_REQ = 8,\n\tBTF_SOCK_TYPE_TCP_TW = 9,\n\tBTF_SOCK_TYPE_TCP6 = 10,\n\tBTF_SOCK_TYPE_UDP = 11,\n\tBTF_SOCK_TYPE_UDP6 = 12,\n\tBTF_SOCK_TYPE_UNIX = 13,\n\tBTF_SOCK_TYPE_MPTCP = 14,\n\tBTF_SOCK_TYPE_SOCKET = 15,\n\tMAX_BTF_SOCK_TYPE = 16,\n};\n\nenum {\n\tBTF_TRACING_TYPE_TASK = 0,\n\tBTF_TRACING_TYPE_FILE = 1,\n\tBTF_TRACING_TYPE_VMA = 2,\n\tMAX_BTF_TRACING_TYPE = 3,\n};\n\nenum {\n\tBTF_VAR_STATIC = 0,\n\tBTF_VAR_GLOBAL_ALLOCATED = 1,\n\tBTF_VAR_GLOBAL_EXTERN = 2,\n};\n\nenum {\n\tBTS_STATE_STOPPED = 0,\n\tBTS_STATE_INACTIVE = 1,\n\tBTS_STATE_ACTIVE = 2,\n};\n\nenum {\n\tBlktrace_setup = 1,\n\tBlktrace_running = 2,\n\tBlktrace_stopped = 3,\n};\n\nenum {\n\tC1E_PROMOTION_PRESERVE = 0,\n\tC1E_PROMOTION_ENABLE = 1,\n\tC1E_PROMOTION_DISABLE = 2,\n};\n\nenum {\n\tCACHE_RH_CNT = 14,\n};\n\nenum {\n\tCACHE_WH_CNT = 15,\n};\n\nenum {\n\tCFTYPE_ONLY_ON_ROOT = 1,\n\tCFTYPE_NOT_ON_ROOT = 2,\n\tCFTYPE_NS_DELEGATABLE = 4,\n\tCFTYPE_NO_PREFIX = 8,\n\tCFTYPE_WORLD_WRITABLE = 16,\n\tCFTYPE_DEBUG = 32,\n\t__CFTYPE_ONLY_ON_DFL = 65536,\n\t__CFTYPE_NOT_ON_DFL = 131072,\n\t__CFTYPE_ADDED = 262144,\n};\n\nenum {\n\tCGROUPSTATS_CMD_ATTR_UNSPEC = 0,\n\tCGROUPSTATS_CMD_ATTR_FD = 1,\n\t__CGROUPSTATS_CMD_ATTR_MAX = 2,\n};\n\nenum {\n\tCGROUPSTATS_CMD_UNSPEC = 3,\n\tCGROUPSTATS_CMD_GET = 4,\n\tCGROUPSTATS_CMD_NEW = 5,\n\t__CGROUPSTATS_CMD_MAX = 6,\n};\n\nenum {\n\tCGROUPSTATS_TYPE_UNSPEC = 0,\n\tCGROUPSTATS_TYPE_CGROUP_STATS = 1,\n\t__CGROUPSTATS_TYPE_MAX = 2,\n};\n\nenum {\n\tCGRP_NOTIFY_ON_RELEASE = 0,\n\tCGRP_CPUSET_CLONE_CHILDREN = 1,\n\tCGRP_FREEZE = 2,\n\tCGRP_FROZEN = 3,\n\tCGRP_KILL = 4,\n};\n\nenum {\n\tCGRP_ROOT_NOPREFIX = 2,\n\tCGRP_ROOT_XATTR = 4,\n\tCGRP_ROOT_NS_DELEGATE = 8,\n\tCGRP_ROOT_FAVOR_DYNMODS = 16,\n\tCGRP_ROOT_CPUSET_V2_MODE = 65536,\n\tCGRP_ROOT_MEMORY_LOCAL_EVENTS = 131072,\n\tCGRP_ROOT_MEMORY_RECURSIVE_PROT = 262144,\n\tCGRP_ROOT_MEMORY_HUGETLB_ACCOUNTING = 524288,\n\tCGRP_ROOT_PIDS_LOCAL_EVENTS = 1048576,\n};\n\nenum {\n\tCHIP_INVALID = 0,\n\tCHIP_PM8606 = 1,\n\tCHIP_PM8607 = 2,\n\tCHIP_MAX = 3,\n};\n\nenum {\n\tCHT_WC_PWRSRC_IRQ = 0,\n\tCHT_WC_THRM_IRQ = 1,\n\tCHT_WC_BCU_IRQ = 2,\n\tCHT_WC_ADC_IRQ = 3,\n\tCHT_WC_EXT_CHGR_IRQ = 4,\n\tCHT_WC_GPIO_IRQ = 5,\n\tCHT_WC_CRIT_IRQ = 7,\n};\n\nenum {\n\tCLKCTL = 2,\n\tSYNCCTL = 3,\n\tHSYNCPOS = 4,\n\tPWRMNGMT = 5,\n\tDACOP = 6,\n\tPALETCTL = 7,\n\tSYSCLKCTL = 8,\n\tPIXFMT = 10,\n\tBPP8 = 11,\n\tBPP16 = 12,\n\tBPP24 = 13,\n\tBPP32 = 14,\n\tPIXCTL1 = 16,\n\tPIXCTL2 = 17,\n\tSYSCLKN = 21,\n\tSYSCLKM = 22,\n\tSYSCLKP = 23,\n\tSYSCLKC = 24,\n\tPIXM0 = 32,\n\tPIXN0 = 33,\n\tPIXP0 = 34,\n\tPIXC0 = 35,\n\tCURSCTL = 48,\n\tCURSXLO = 49,\n\tCURSXHI = 50,\n\tCURSYLO = 51,\n\tCURSYHI = 52,\n\tCURSHOTX = 53,\n\tCURSHOTY = 54,\n\tCURSACCTL = 55,\n\tCURSACATTR = 56,\n\tCURS1R = 64,\n\tCURS1G = 65,\n\tCURS1B = 66,\n\tCURS2R = 67,\n\tCURS2G = 68,\n\tCURS2B = 69,\n\tCURS3R = 70,\n\tCURS3G = 71,\n\tCURS3B = 72,\n\tBORDR = 96,\n\tBORDG = 97,\n\tBORDB = 98,\n\tMISCTL1 = 112,\n\tMISCTL2 = 113,\n\tMISCTL3 = 114,\n\tKEYCTL = 120,\n};\n\nenum {\n\tCMIS_MODULE_LOW_PWR = 1,\n\tCMIS_MODULE_READY = 3,\n};\n\nenum {\n\tCOST_CTRL = 0,\n\tCOST_MODEL = 1,\n\tNR_COST_CTRL_PARAMS = 2,\n};\n\nenum {\n\tCPER_SEV_RECOVERABLE = 0,\n\tCPER_SEV_FATAL = 1,\n\tCPER_SEV_CORRECTED = 2,\n\tCPER_SEV_INFORMATIONAL = 3,\n};\n\nenum {\n\tCPU_BANIAS = 0,\n\tCPU_DOTHAN_A1 = 1,\n\tCPU_DOTHAN_A2 = 2,\n\tCPU_DOTHAN_B0 = 3,\n\tCPU_MP4HT_D0 = 4,\n\tCPU_MP4HT_E0 = 5,\n};\n\nenum {\n\tCRI_RES_UTIL = 5,\n};\n\nenum {\n\tCRNG_EMPTY = 0,\n\tCRNG_EARLY = 1,\n\tCRNG_READY = 2,\n};\n\nenum {\n\tCRNG_RESEED_START_INTERVAL = 1000,\n\tCRNG_RESEED_INTERVAL = 60000,\n};\n\nenum {\n\tCRYPTOA_UNSPEC = 0,\n\tCRYPTOA_ALG = 1,\n\tCRYPTOA_TYPE = 2,\n\t__CRYPTOA_MAX = 3,\n};\n\nenum {\n\tCRYPTO_KPP_SECRET_TYPE_UNKNOWN = 0,\n\tCRYPTO_KPP_SECRET_TYPE_DH = 1,\n\tCRYPTO_KPP_SECRET_TYPE_ECDH = 2,\n};\n\nenum {\n\tCRYPTO_MSG_ALG_REQUEST = 0,\n\tCRYPTO_MSG_ALG_REGISTER = 1,\n\tCRYPTO_MSG_ALG_LOADED = 2,\n};\n\nenum {\n\tCSD_FLAG_LOCK = 1,\n\tIRQ_WORK_PENDING = 1,\n\tIRQ_WORK_BUSY = 2,\n\tIRQ_WORK_LAZY = 4,\n\tIRQ_WORK_HARD_IRQ = 8,\n\tIRQ_WORK_CLAIMED = 3,\n\tCSD_TYPE_ASYNC = 0,\n\tCSD_TYPE_SYNC = 16,\n\tCSD_TYPE_IRQ_WORK = 32,\n\tCSD_TYPE_TTWU = 48,\n\tCSD_FLAG_TYPE_MASK = 240,\n};\n\nenum {\n\tCSI_DEC_hl_CURSOR_KEYS = 1,\n\tCSI_DEC_hl_132_COLUMNS = 3,\n\tCSI_DEC_hl_REVERSE_VIDEO = 5,\n\tCSI_DEC_hl_ORIGIN_MODE = 6,\n\tCSI_DEC_hl_AUTOWRAP = 7,\n\tCSI_DEC_hl_AUTOREPEAT = 8,\n\tCSI_DEC_hl_MOUSE_X10 = 9,\n\tCSI_DEC_hl_SHOW_CURSOR = 25,\n\tCSI_DEC_hl_MOUSE_VT200 = 1000,\n};\n\nenum {\n\tCSI_K_CURSOR_TO_LINEEND = 0,\n\tCSI_K_LINESTART_TO_CURSOR = 1,\n\tCSI_K_LINE = 2,\n};\n\nenum {\n\tCSI_hl_DISPLAY_CTRL = 3,\n\tCSI_hl_INSERT = 4,\n\tCSI_hl_AUTO_NL = 20,\n};\n\nenum {\n\tCSI_m_DEFAULT = 0,\n\tCSI_m_BOLD = 1,\n\tCSI_m_HALF_BRIGHT = 2,\n\tCSI_m_ITALIC = 3,\n\tCSI_m_UNDERLINE = 4,\n\tCSI_m_BLINK = 5,\n\tCSI_m_REVERSE = 7,\n\tCSI_m_PRI_FONT = 10,\n\tCSI_m_ALT_FONT1 = 11,\n\tCSI_m_ALT_FONT2 = 12,\n\tCSI_m_DOUBLE_UNDERLINE = 21,\n\tCSI_m_NORMAL_INTENSITY = 22,\n\tCSI_m_NO_ITALIC = 23,\n\tCSI_m_NO_UNDERLINE = 24,\n\tCSI_m_NO_BLINK = 25,\n\tCSI_m_NO_REVERSE = 27,\n\tCSI_m_FG_COLOR_BEG = 30,\n\tCSI_m_FG_COLOR_END = 37,\n\tCSI_m_FG_COLOR = 38,\n\tCSI_m_DEFAULT_FG_COLOR = 39,\n\tCSI_m_BG_COLOR_BEG = 40,\n\tCSI_m_BG_COLOR_END = 47,\n\tCSI_m_BG_COLOR = 48,\n\tCSI_m_DEFAULT_BG_COLOR = 49,\n\tCSI_m_BRIGHT_FG_COLOR_BEG = 90,\n\tCSI_m_BRIGHT_FG_COLOR_END = 97,\n\tCSI_m_BRIGHT_FG_COLOR_OFF = 60,\n\tCSI_m_BRIGHT_BG_COLOR_BEG = 100,\n\tCSI_m_BRIGHT_BG_COLOR_END = 107,\n\tCSI_m_BRIGHT_BG_COLOR_OFF = 60,\n};\n\nenum {\n\tCSS_NO_REF = 1,\n\tCSS_ONLINE = 2,\n\tCSS_RELEASED = 4,\n\tCSS_VISIBLE = 8,\n\tCSS_DYING = 16,\n};\n\nenum {\n\tCSS_TASK_ITER_PROCS = 1,\n\tCSS_TASK_ITER_THREADED = 2,\n\tCSS_TASK_ITER_SKIPPED = 65536,\n};\n\nenum {\n\tCTL_RES_CNT = 1,\n};\n\nenum {\n\tCTL_RES_TM = 2,\n};\n\nenum {\n\tCTRL_ATTR_MCAST_GRP_UNSPEC = 0,\n\tCTRL_ATTR_MCAST_GRP_NAME = 1,\n\tCTRL_ATTR_MCAST_GRP_ID = 2,\n\t__CTRL_ATTR_MCAST_GRP_MAX = 3,\n};\n\nenum {\n\tCTRL_ATTR_OP_UNSPEC = 0,\n\tCTRL_ATTR_OP_ID = 1,\n\tCTRL_ATTR_OP_FLAGS = 2,\n\t__CTRL_ATTR_OP_MAX = 3,\n};\n\nenum {\n\tCTRL_ATTR_POLICY_UNSPEC = 0,\n\tCTRL_ATTR_POLICY_DO = 1,\n\tCTRL_ATTR_POLICY_DUMP = 2,\n\t__CTRL_ATTR_POLICY_DUMP_MAX = 3,\n\tCTRL_ATTR_POLICY_DUMP_MAX = 2,\n};\n\nenum {\n\tCTRL_ATTR_UNSPEC = 0,\n\tCTRL_ATTR_FAMILY_ID = 1,\n\tCTRL_ATTR_FAMILY_NAME = 2,\n\tCTRL_ATTR_VERSION = 3,\n\tCTRL_ATTR_HDRSIZE = 4,\n\tCTRL_ATTR_MAXATTR = 5,\n\tCTRL_ATTR_OPS = 6,\n\tCTRL_ATTR_MCAST_GROUPS = 7,\n\tCTRL_ATTR_POLICY = 8,\n\tCTRL_ATTR_OP_POLICY = 9,\n\tCTRL_ATTR_OP = 10,\n\t__CTRL_ATTR_MAX = 11,\n};\n\nenum {\n\tCTRL_CMD_UNSPEC = 0,\n\tCTRL_CMD_NEWFAMILY = 1,\n\tCTRL_CMD_DELFAMILY = 2,\n\tCTRL_CMD_GETFAMILY = 3,\n\tCTRL_CMD_NEWOPS = 4,\n\tCTRL_CMD_DELOPS = 5,\n\tCTRL_CMD_GETOPS = 6,\n\tCTRL_CMD_NEWMCAST_GRP = 7,\n\tCTRL_CMD_DELMCAST_GRP = 8,\n\tCTRL_CMD_GETMCAST_GRP = 9,\n\tCTRL_CMD_GETPOLICY = 10,\n\t__CTRL_CMD_MAX = 11,\n};\n\nenum {\n\tCXL_MEM_COMMAND_ID_INVALID = 0,\n\tCXL_MEM_COMMAND_ID_IDENTIFY = 1,\n\tCXL_MEM_COMMAND_ID_RAW = 2,\n\tCXL_MEM_COMMAND_ID_GET_SUPPORTED_LOGS = 3,\n\tCXL_MEM_COMMAND_ID_GET_FW_INFO = 4,\n\tCXL_MEM_COMMAND_ID_GET_PARTITION_INFO = 5,\n\tCXL_MEM_COMMAND_ID_GET_LSA = 6,\n\tCXL_MEM_COMMAND_ID_GET_HEALTH_INFO = 7,\n\tCXL_MEM_COMMAND_ID_GET_LOG = 8,\n\tCXL_MEM_COMMAND_ID_SET_PARTITION_INFO = 9,\n\tCXL_MEM_COMMAND_ID_SET_LSA = 10,\n\tCXL_MEM_COMMAND_ID_GET_ALERT_CONFIG = 11,\n\tCXL_MEM_COMMAND_ID_SET_ALERT_CONFIG = 12,\n\tCXL_MEM_COMMAND_ID_GET_SHUTDOWN_STATE = 13,\n\tCXL_MEM_COMMAND_ID_SET_SHUTDOWN_STATE = 14,\n\tCXL_MEM_DEPRECATED_ID_GET_POISON = 15,\n\tCXL_MEM_DEPRECATED_ID_INJECT_POISON = 16,\n\tCXL_MEM_DEPRECATED_ID_CLEAR_POISON = 17,\n\tCXL_MEM_COMMAND_ID_GET_SCAN_MEDIA_CAPS = 18,\n\tCXL_MEM_DEPRECATED_ID_SCAN_MEDIA = 19,\n\tCXL_MEM_DEPRECATED_ID_GET_SCAN_MEDIA = 20,\n\tCXL_MEM_COMMAND_ID_GET_TIMESTAMP = 21,\n\tCXL_MEM_COMMAND_ID_GET_LOG_CAPS = 22,\n\tCXL_MEM_COMMAND_ID_CLEAR_LOG = 23,\n\tCXL_MEM_COMMAND_ID_GET_SUP_LOG_SUBLIST = 24,\n\tCXL_MEM_COMMAND_ID_MAX = 25,\n};\n\nenum {\n\tDA9063_DEV_ID_REG = 0,\n\tDA9063_VAR_ID_REG = 1,\n\tDA9063_CHIP_ID_REGS = 2,\n};\n\nenum {\n\tDAD_PROCESS = 0,\n\tDAD_BEGIN = 1,\n\tDAD_ABORT = 2,\n};\n\nenum {\n\tDD_DIR_COUNT = 2,\n};\n\nenum {\n\tDD_PRIO_COUNT = 3,\n};\n\nenum {\n\tDELL_INSPIRON_7375 = 0,\n\tDELL_LATITUDE_5495 = 1,\n\tLENOVO_IDEAPAD_330S_15ARR = 2,\n};\n\nenum {\n\tDESC_TSS = 9,\n\tDESC_LDT = 2,\n\tDESCTYPE_S = 16,\n};\n\nenum {\n\tDEVCONF_FORWARDING = 0,\n\tDEVCONF_HOPLIMIT = 1,\n\tDEVCONF_MTU6 = 2,\n\tDEVCONF_ACCEPT_RA = 3,\n\tDEVCONF_ACCEPT_REDIRECTS = 4,\n\tDEVCONF_AUTOCONF = 5,\n\tDEVCONF_DAD_TRANSMITS = 6,\n\tDEVCONF_RTR_SOLICITS = 7,\n\tDEVCONF_RTR_SOLICIT_INTERVAL = 8,\n\tDEVCONF_RTR_SOLICIT_DELAY = 9,\n\tDEVCONF_USE_TEMPADDR = 10,\n\tDEVCONF_TEMP_VALID_LFT = 11,\n\tDEVCONF_TEMP_PREFERED_LFT = 12,\n\tDEVCONF_REGEN_MAX_RETRY = 13,\n\tDEVCONF_MAX_DESYNC_FACTOR = 14,\n\tDEVCONF_MAX_ADDRESSES = 15,\n\tDEVCONF_FORCE_MLD_VERSION = 16,\n\tDEVCONF_ACCEPT_RA_DEFRTR = 17,\n\tDEVCONF_ACCEPT_RA_PINFO = 18,\n\tDEVCONF_ACCEPT_RA_RTR_PREF = 19,\n\tDEVCONF_RTR_PROBE_INTERVAL = 20,\n\tDEVCONF_ACCEPT_RA_RT_INFO_MAX_PLEN = 21,\n\tDEVCONF_PROXY_NDP = 22,\n\tDEVCONF_OPTIMISTIC_DAD = 23,\n\tDEVCONF_ACCEPT_SOURCE_ROUTE = 24,\n\tDEVCONF_MC_FORWARDING = 25,\n\tDEVCONF_DISABLE_IPV6 = 26,\n\tDEVCONF_ACCEPT_DAD = 27,\n\tDEVCONF_FORCE_TLLAO = 28,\n\tDEVCONF_NDISC_NOTIFY = 29,\n\tDEVCONF_MLDV1_UNSOLICITED_REPORT_INTERVAL = 30,\n\tDEVCONF_MLDV2_UNSOLICITED_REPORT_INTERVAL = 31,\n\tDEVCONF_SUPPRESS_FRAG_NDISC = 32,\n\tDEVCONF_ACCEPT_RA_FROM_LOCAL = 33,\n\tDEVCONF_USE_OPTIMISTIC = 34,\n\tDEVCONF_ACCEPT_RA_MTU = 35,\n\tDEVCONF_STABLE_SECRET = 36,\n\tDEVCONF_USE_OIF_ADDRS_ONLY = 37,\n\tDEVCONF_ACCEPT_RA_MIN_HOP_LIMIT = 38,\n\tDEVCONF_IGNORE_ROUTES_WITH_LINKDOWN = 39,\n\tDEVCONF_DROP_UNICAST_IN_L2_MULTICAST = 40,\n\tDEVCONF_DROP_UNSOLICITED_NA = 41,\n\tDEVCONF_KEEP_ADDR_ON_DOWN = 42,\n\tDEVCONF_RTR_SOLICIT_MAX_INTERVAL = 43,\n\tDEVCONF_SEG6_ENABLED = 44,\n\tDEVCONF_SEG6_REQUIRE_HMAC = 45,\n\tDEVCONF_ENHANCED_DAD = 46,\n\tDEVCONF_ADDR_GEN_MODE = 47,\n\tDEVCONF_DISABLE_POLICY = 48,\n\tDEVCONF_ACCEPT_RA_RT_INFO_MIN_PLEN = 49,\n\tDEVCONF_NDISC_TCLASS = 50,\n\tDEVCONF_RPL_SEG_ENABLED = 51,\n\tDEVCONF_RA_DEFRTR_METRIC = 52,\n\tDEVCONF_IOAM6_ENABLED = 53,\n\tDEVCONF_IOAM6_ID = 54,\n\tDEVCONF_IOAM6_ID_WIDE = 55,\n\tDEVCONF_NDISC_EVICT_NOCARRIER = 56,\n\tDEVCONF_ACCEPT_UNTRACKED_NA = 57,\n\tDEVCONF_ACCEPT_RA_MIN_LFT = 58,\n\tDEVCONF_MAX = 59,\n};\n\nenum {\n\tDEVLINK_ATTR_STATS_RX_PACKETS = 0,\n\tDEVLINK_ATTR_STATS_RX_BYTES = 1,\n\tDEVLINK_ATTR_STATS_RX_DROPPED = 2,\n\t__DEVLINK_ATTR_STATS_MAX = 3,\n\tDEVLINK_ATTR_STATS_MAX = 2,\n};\n\nenum {\n\tDEVLINK_ATTR_TRAP_METADATA_TYPE_IN_PORT = 0,\n\tDEVLINK_ATTR_TRAP_METADATA_TYPE_FA_COOKIE = 1,\n};\n\nenum {\n\tDIO_LOCKING = 1,\n\tDIO_SKIP_HOLES = 2,\n};\n\nenum {\n\tDIO_SHOULD_DIRTY = 1,\n\tDIO_IS_SYNC = 2,\n};\n\nenum {\n\tDIR_OFFSET_FIRST = 2,\n\tDIR_OFFSET_EOD = 2147483647,\n};\n\nenum {\n\tDIR_OFFSET_MIN = 3,\n\tDIR_OFFSET_MAX = 2147483646,\n};\n\nenum {\n\tDISCOVERED = 16,\n\tEXPLORED = 32,\n\tFALLTHROUGH = 1,\n\tBRANCH = 2,\n};\n\nenum {\n\tDISK_EVENT_FLAG_POLL = 1,\n\tDISK_EVENT_FLAG_UEVENT = 2,\n\tDISK_EVENT_FLAG_BLOCK_ON_EXCL_WRITE = 4,\n};\n\nenum {\n\tDISK_EVENT_MEDIA_CHANGE = 1,\n\tDISK_EVENT_EJECT_REQUEST = 2,\n};\n\nenum {\n\tDMA_TYPE_TX = 0,\n\tDMA_TYPE_RX = 1,\n\tDMA_TYPE_MCPY = 2,\n};\n\nenum {\n\tDM_IO_ACCOUNTED = 0,\n\tDM_IO_WAS_SPLIT = 1,\n\tDM_IO_BLK_STAT = 2,\n};\n\nenum {\n\tDM_TIO_INSIDE_DM_IO = 0,\n\tDM_TIO_IS_DUPLICATE_BIO = 1,\n};\n\nenum {\n\tDM_VERSION_CMD = 0,\n\tDM_REMOVE_ALL_CMD = 1,\n\tDM_LIST_DEVICES_CMD = 2,\n\tDM_DEV_CREATE_CMD = 3,\n\tDM_DEV_REMOVE_CMD = 4,\n\tDM_DEV_RENAME_CMD = 5,\n\tDM_DEV_SUSPEND_CMD = 6,\n\tDM_DEV_STATUS_CMD = 7,\n\tDM_DEV_WAIT_CMD = 8,\n\tDM_TABLE_LOAD_CMD = 9,\n\tDM_TABLE_CLEAR_CMD = 10,\n\tDM_TABLE_DEPS_CMD = 11,\n\tDM_TABLE_STATUS_CMD = 12,\n\tDM_LIST_VERSIONS_CMD = 13,\n\tDM_TARGET_MSG_CMD = 14,\n\tDM_DEV_SET_GEOMETRY_CMD = 15,\n\tDM_DEV_ARM_POLL_CMD = 16,\n\tDM_GET_TARGET_VERSION_CMD = 17,\n};\n\nenum {\n\tDONE_EXPLORING = 0,\n\tKEEP_EXPLORING = 1,\n};\n\nenum {\n\tDPLL_NLGRP_MONITOR = 0,\n};\n\nenum {\n\tDQF_INFO_DIRTY_B = 17,\n};\n\nenum {\n\tDQF_ROOT_SQUASH_B = 0,\n\tDQF_SYS_FILE_B = 16,\n\tDQF_PRIVATE = 17,\n};\n\nenum {\n\tDQST_LOOKUPS = 0,\n\tDQST_DROPS = 1,\n\tDQST_READS = 2,\n\tDQST_WRITES = 3,\n\tDQST_CACHE_HITS = 4,\n\tDQST_ALLOC_DQUOTS = 5,\n\tDQST_FREE_DQUOTS = 6,\n\tDQST_SYNCS = 7,\n\t_DQST_DQSTAT_LAST = 8,\n};\n\nenum {\n\tDUMP_PREFIX_NONE = 0,\n\tDUMP_PREFIX_ADDRESS = 1,\n\tDUMP_PREFIX_OFFSET = 2,\n};\n\nenum {\n\tEC_FLAGS_QUERY_ENABLED = 0,\n\tEC_FLAGS_EVENT_HANDLER_INSTALLED = 1,\n\tEC_FLAGS_EC_HANDLER_INSTALLED = 2,\n\tEC_FLAGS_EC_REG_CALLED = 3,\n\tEC_FLAGS_QUERY_METHODS_INSTALLED = 4,\n\tEC_FLAGS_STARTED = 5,\n\tEC_FLAGS_STOPPED = 6,\n\tEC_FLAGS_EVENTS_MASKED = 7,\n};\n\nenum {\n\tEC_MSG_TX_HEADER_BYTES = 3,\n\tEC_MSG_TX_TRAILER_BYTES = 1,\n\tEC_MSG_TX_PROTO_BYTES = 4,\n\tEC_MSG_RX_PROTO_BYTES = 3,\n\tEC_PROTO2_MSG_BYTES = 256,\n\tEC_MAX_MSG_BYTES = 65536,\n};\n\nenum {\n\tEI_ETYPE_NULL = 0,\n\tEI_ETYPE_ERRNO = 1,\n\tEI_ETYPE_ERRNO_NULL = 2,\n\tEI_ETYPE_TRUE = 3,\n};\n\nenum {\n\tEMULATE = 0,\n\tXONLY = 1,\n\tNONE = 2,\n};\n\nenum {\n\tEPecma = 0,\n\tEPdec = 1,\n\tEPeq = 2,\n\tEPgt = 3,\n\tEPlt = 4,\n};\n\nenum {\n\tERASE = 0,\n\tWERASE = 1,\n\tKILL = 2,\n};\n\nenum {\n\tES_WRITTEN_B = 0,\n\tES_UNWRITTEN_B = 1,\n\tES_DELAYED_B = 2,\n\tES_HOLE_B = 3,\n\tES_REFERENCED_B = 4,\n\tES_FLAGS = 5,\n};\n\nenum {\n\tETHTOOL_A_BITSET_BITS_UNSPEC = 0,\n\tETHTOOL_A_BITSET_BITS_BIT = 1,\n\t__ETHTOOL_A_BITSET_BITS_CNT = 2,\n\tETHTOOL_A_BITSET_BITS_MAX = 1,\n};\n\nenum {\n\tETHTOOL_A_BITSET_BIT_UNSPEC = 0,\n\tETHTOOL_A_BITSET_BIT_INDEX = 1,\n\tETHTOOL_A_BITSET_BIT_NAME = 2,\n\tETHTOOL_A_BITSET_BIT_VALUE = 3,\n\t__ETHTOOL_A_BITSET_BIT_CNT = 4,\n\tETHTOOL_A_BITSET_BIT_MAX = 3,\n};\n\nenum {\n\tETHTOOL_A_BITSET_UNSPEC = 0,\n\tETHTOOL_A_BITSET_NOMASK = 1,\n\tETHTOOL_A_BITSET_SIZE = 2,\n\tETHTOOL_A_BITSET_BITS = 3,\n\tETHTOOL_A_BITSET_VALUE = 4,\n\tETHTOOL_A_BITSET_MASK = 5,\n\t__ETHTOOL_A_BITSET_CNT = 6,\n\tETHTOOL_A_BITSET_MAX = 5,\n};\n\nenum {\n\tETHTOOL_A_C33_PSE_PW_LIMIT_UNSPEC = 0,\n\tETHTOOL_A_C33_PSE_PW_LIMIT_MIN = 1,\n\tETHTOOL_A_C33_PSE_PW_LIMIT_MAX = 2,\n};\n\nenum {\n\tETHTOOL_A_CABLE_AMPLITUDE_UNSPEC = 0,\n\tETHTOOL_A_CABLE_AMPLITUDE_PAIR = 1,\n\tETHTOOL_A_CABLE_AMPLITUDE_mV = 2,\n\t__ETHTOOL_A_CABLE_AMPLITUDE_CNT = 3,\n\tETHTOOL_A_CABLE_AMPLITUDE_MAX = 2,\n};\n\nenum {\n\tETHTOOL_A_CABLE_FAULT_LENGTH_UNSPEC = 0,\n\tETHTOOL_A_CABLE_FAULT_LENGTH_PAIR = 1,\n\tETHTOOL_A_CABLE_FAULT_LENGTH_CM = 2,\n\t__ETHTOOL_A_CABLE_FAULT_LENGTH_CNT = 3,\n\tETHTOOL_A_CABLE_FAULT_LENGTH_MAX = 2,\n};\n\nenum {\n\tETHTOOL_A_CABLE_NEST_UNSPEC = 0,\n\tETHTOOL_A_CABLE_NEST_RESULT = 1,\n\tETHTOOL_A_CABLE_NEST_FAULT_LENGTH = 2,\n\t__ETHTOOL_A_CABLE_NEST_CNT = 3,\n\tETHTOOL_A_CABLE_NEST_MAX = 2,\n};\n\nenum {\n\tETHTOOL_A_CABLE_PAIR_A = 0,\n\tETHTOOL_A_CABLE_PAIR_B = 1,\n\tETHTOOL_A_CABLE_PAIR_C = 2,\n\tETHTOOL_A_CABLE_PAIR_D = 3,\n};\n\nenum {\n\tETHTOOL_A_CABLE_PULSE_UNSPEC = 0,\n\tETHTOOL_A_CABLE_PULSE_mV = 1,\n\t__ETHTOOL_A_CABLE_PULSE_CNT = 2,\n\tETHTOOL_A_CABLE_PULSE_MAX = 1,\n};\n\nenum {\n\tETHTOOL_A_CABLE_RESULT_UNSPEC = 0,\n\tETHTOOL_A_CABLE_RESULT_PAIR = 1,\n\tETHTOOL_A_CABLE_RESULT_CODE = 2,\n\t__ETHTOOL_A_CABLE_RESULT_CNT = 3,\n\tETHTOOL_A_CABLE_RESULT_MAX = 2,\n};\n\nenum {\n\tETHTOOL_A_CABLE_STEP_UNSPEC = 0,\n\tETHTOOL_A_CABLE_STEP_FIRST_DISTANCE = 1,\n\tETHTOOL_A_CABLE_STEP_LAST_DISTANCE = 2,\n\tETHTOOL_A_CABLE_STEP_STEP_DISTANCE = 3,\n\t__ETHTOOL_A_CABLE_STEP_CNT = 4,\n\tETHTOOL_A_CABLE_STEP_MAX = 3,\n};\n\nenum {\n\tETHTOOL_A_CABLE_TDR_NEST_UNSPEC = 0,\n\tETHTOOL_A_CABLE_TDR_NEST_STEP = 1,\n\tETHTOOL_A_CABLE_TDR_NEST_AMPLITUDE = 2,\n\tETHTOOL_A_CABLE_TDR_NEST_PULSE = 3,\n\t__ETHTOOL_A_CABLE_TDR_NEST_CNT = 4,\n\tETHTOOL_A_CABLE_TDR_NEST_MAX = 3,\n};\n\nenum {\n\tETHTOOL_A_CABLE_TEST_NTF_STATUS_UNSPEC = 0,\n\tETHTOOL_A_CABLE_TEST_NTF_STATUS_STARTED = 1,\n\tETHTOOL_A_CABLE_TEST_NTF_STATUS_COMPLETED = 2,\n};\n\nenum {\n\tETHTOOL_A_CABLE_TEST_NTF_UNSPEC = 0,\n\tETHTOOL_A_CABLE_TEST_NTF_HEADER = 1,\n\tETHTOOL_A_CABLE_TEST_NTF_STATUS = 2,\n\tETHTOOL_A_CABLE_TEST_NTF_NEST = 3,\n\t__ETHTOOL_A_CABLE_TEST_NTF_CNT = 4,\n\tETHTOOL_A_CABLE_TEST_NTF_MAX = 3,\n};\n\nenum {\n\tETHTOOL_A_CABLE_TEST_TDR_CFG_UNSPEC = 0,\n\tETHTOOL_A_CABLE_TEST_TDR_CFG_FIRST = 1,\n\tETHTOOL_A_CABLE_TEST_TDR_CFG_LAST = 2,\n\tETHTOOL_A_CABLE_TEST_TDR_CFG_STEP = 3,\n\tETHTOOL_A_CABLE_TEST_TDR_CFG_PAIR = 4,\n\t__ETHTOOL_A_CABLE_TEST_TDR_CFG_CNT = 5,\n\tETHTOOL_A_CABLE_TEST_TDR_CFG_MAX = 4,\n};\n\nenum {\n\tETHTOOL_A_CABLE_TEST_TDR_UNSPEC = 0,\n\tETHTOOL_A_CABLE_TEST_TDR_HEADER = 1,\n\tETHTOOL_A_CABLE_TEST_TDR_CFG = 2,\n\t__ETHTOOL_A_CABLE_TEST_TDR_CNT = 3,\n\tETHTOOL_A_CABLE_TEST_TDR_MAX = 2,\n};\n\nenum {\n\tETHTOOL_A_CABLE_TEST_UNSPEC = 0,\n\tETHTOOL_A_CABLE_TEST_HEADER = 1,\n\t__ETHTOOL_A_CABLE_TEST_CNT = 2,\n\tETHTOOL_A_CABLE_TEST_MAX = 1,\n};\n\nenum {\n\tETHTOOL_A_CHANNELS_UNSPEC = 0,\n\tETHTOOL_A_CHANNELS_HEADER = 1,\n\tETHTOOL_A_CHANNELS_RX_MAX = 2,\n\tETHTOOL_A_CHANNELS_TX_MAX = 3,\n\tETHTOOL_A_CHANNELS_OTHER_MAX = 4,\n\tETHTOOL_A_CHANNELS_COMBINED_MAX = 5,\n\tETHTOOL_A_CHANNELS_RX_COUNT = 6,\n\tETHTOOL_A_CHANNELS_TX_COUNT = 7,\n\tETHTOOL_A_CHANNELS_OTHER_COUNT = 8,\n\tETHTOOL_A_CHANNELS_COMBINED_COUNT = 9,\n\t__ETHTOOL_A_CHANNELS_CNT = 10,\n\tETHTOOL_A_CHANNELS_MAX = 9,\n};\n\nenum {\n\tETHTOOL_A_COALESCE_UNSPEC = 0,\n\tETHTOOL_A_COALESCE_HEADER = 1,\n\tETHTOOL_A_COALESCE_RX_USECS = 2,\n\tETHTOOL_A_COALESCE_RX_MAX_FRAMES = 3,\n\tETHTOOL_A_COALESCE_RX_USECS_IRQ = 4,\n\tETHTOOL_A_COALESCE_RX_MAX_FRAMES_IRQ = 5,\n\tETHTOOL_A_COALESCE_TX_USECS = 6,\n\tETHTOOL_A_COALESCE_TX_MAX_FRAMES = 7,\n\tETHTOOL_A_COALESCE_TX_USECS_IRQ = 8,\n\tETHTOOL_A_COALESCE_TX_MAX_FRAMES_IRQ = 9,\n\tETHTOOL_A_COALESCE_STATS_BLOCK_USECS = 10,\n\tETHTOOL_A_COALESCE_USE_ADAPTIVE_RX = 11,\n\tETHTOOL_A_COALESCE_USE_ADAPTIVE_TX = 12,\n\tETHTOOL_A_COALESCE_PKT_RATE_LOW = 13,\n\tETHTOOL_A_COALESCE_RX_USECS_LOW = 14,\n\tETHTOOL_A_COALESCE_RX_MAX_FRAMES_LOW = 15,\n\tETHTOOL_A_COALESCE_TX_USECS_LOW = 16,\n\tETHTOOL_A_COALESCE_TX_MAX_FRAMES_LOW = 17,\n\tETHTOOL_A_COALESCE_PKT_RATE_HIGH = 18,\n\tETHTOOL_A_COALESCE_RX_USECS_HIGH = 19,\n\tETHTOOL_A_COALESCE_RX_MAX_FRAMES_HIGH = 20,\n\tETHTOOL_A_COALESCE_TX_USECS_HIGH = 21,\n\tETHTOOL_A_COALESCE_TX_MAX_FRAMES_HIGH = 22,\n\tETHTOOL_A_COALESCE_RATE_SAMPLE_INTERVAL = 23,\n\tETHTOOL_A_COALESCE_USE_CQE_MODE_TX = 24,\n\tETHTOOL_A_COALESCE_USE_CQE_MODE_RX = 25,\n\tETHTOOL_A_COALESCE_TX_AGGR_MAX_BYTES = 26,\n\tETHTOOL_A_COALESCE_TX_AGGR_MAX_FRAMES = 27,\n\tETHTOOL_A_COALESCE_TX_AGGR_TIME_USECS = 28,\n\tETHTOOL_A_COALESCE_RX_PROFILE = 29,\n\tETHTOOL_A_COALESCE_TX_PROFILE = 30,\n\t__ETHTOOL_A_COALESCE_CNT = 31,\n\tETHTOOL_A_COALESCE_MAX = 30,\n};\n\nenum {\n\tETHTOOL_A_DEBUG_UNSPEC = 0,\n\tETHTOOL_A_DEBUG_HEADER = 1,\n\tETHTOOL_A_DEBUG_MSGMASK = 2,\n\t__ETHTOOL_A_DEBUG_CNT = 3,\n\tETHTOOL_A_DEBUG_MAX = 2,\n};\n\nenum {\n\tETHTOOL_A_EEE_UNSPEC = 0,\n\tETHTOOL_A_EEE_HEADER = 1,\n\tETHTOOL_A_EEE_MODES_OURS = 2,\n\tETHTOOL_A_EEE_MODES_PEER = 3,\n\tETHTOOL_A_EEE_ACTIVE = 4,\n\tETHTOOL_A_EEE_ENABLED = 5,\n\tETHTOOL_A_EEE_TX_LPI_ENABLED = 6,\n\tETHTOOL_A_EEE_TX_LPI_TIMER = 7,\n\t__ETHTOOL_A_EEE_CNT = 8,\n\tETHTOOL_A_EEE_MAX = 7,\n};\n\nenum {\n\tETHTOOL_A_FEATURES_UNSPEC = 0,\n\tETHTOOL_A_FEATURES_HEADER = 1,\n\tETHTOOL_A_FEATURES_HW = 2,\n\tETHTOOL_A_FEATURES_WANTED = 3,\n\tETHTOOL_A_FEATURES_ACTIVE = 4,\n\tETHTOOL_A_FEATURES_NOCHANGE = 5,\n\t__ETHTOOL_A_FEATURES_CNT = 6,\n\tETHTOOL_A_FEATURES_MAX = 5,\n};\n\nenum {\n\tETHTOOL_A_FEC_STAT_UNSPEC = 0,\n\tETHTOOL_A_FEC_STAT_PAD = 1,\n\tETHTOOL_A_FEC_STAT_CORRECTED = 2,\n\tETHTOOL_A_FEC_STAT_UNCORR = 3,\n\tETHTOOL_A_FEC_STAT_CORR_BITS = 4,\n\t__ETHTOOL_A_FEC_STAT_CNT = 5,\n\tETHTOOL_A_FEC_STAT_MAX = 4,\n};\n\nenum {\n\tETHTOOL_A_FEC_UNSPEC = 0,\n\tETHTOOL_A_FEC_HEADER = 1,\n\tETHTOOL_A_FEC_MODES = 2,\n\tETHTOOL_A_FEC_AUTO = 3,\n\tETHTOOL_A_FEC_ACTIVE = 4,\n\tETHTOOL_A_FEC_STATS = 5,\n\t__ETHTOOL_A_FEC_CNT = 6,\n\tETHTOOL_A_FEC_MAX = 5,\n};\n\nenum {\n\tETHTOOL_A_HEADER_UNSPEC = 0,\n\tETHTOOL_A_HEADER_DEV_INDEX = 1,\n\tETHTOOL_A_HEADER_DEV_NAME = 2,\n\tETHTOOL_A_HEADER_FLAGS = 3,\n\t__ETHTOOL_A_HEADER_CNT = 4,\n\tETHTOOL_A_HEADER_MAX = 3,\n};\n\nenum {\n\tETHTOOL_A_IRQ_MODERATION_UNSPEC = 0,\n\tETHTOOL_A_IRQ_MODERATION_USEC = 1,\n\tETHTOOL_A_IRQ_MODERATION_PKTS = 2,\n\tETHTOOL_A_IRQ_MODERATION_COMPS = 3,\n\t__ETHTOOL_A_IRQ_MODERATION_CNT = 4,\n\tETHTOOL_A_IRQ_MODERATION_MAX = 3,\n};\n\nenum {\n\tETHTOOL_A_LINKINFO_UNSPEC = 0,\n\tETHTOOL_A_LINKINFO_HEADER = 1,\n\tETHTOOL_A_LINKINFO_PORT = 2,\n\tETHTOOL_A_LINKINFO_PHYADDR = 3,\n\tETHTOOL_A_LINKINFO_TP_MDIX = 4,\n\tETHTOOL_A_LINKINFO_TP_MDIX_CTRL = 5,\n\tETHTOOL_A_LINKINFO_TRANSCEIVER = 6,\n\t__ETHTOOL_A_LINKINFO_CNT = 7,\n\tETHTOOL_A_LINKINFO_MAX = 6,\n};\n\nenum {\n\tETHTOOL_A_LINKMODES_UNSPEC = 0,\n\tETHTOOL_A_LINKMODES_HEADER = 1,\n\tETHTOOL_A_LINKMODES_AUTONEG = 2,\n\tETHTOOL_A_LINKMODES_OURS = 3,\n\tETHTOOL_A_LINKMODES_PEER = 4,\n\tETHTOOL_A_LINKMODES_SPEED = 5,\n\tETHTOOL_A_LINKMODES_DUPLEX = 6,\n\tETHTOOL_A_LINKMODES_MASTER_SLAVE_CFG = 7,\n\tETHTOOL_A_LINKMODES_MASTER_SLAVE_STATE = 8,\n\tETHTOOL_A_LINKMODES_LANES = 9,\n\tETHTOOL_A_LINKMODES_RATE_MATCHING = 10,\n\t__ETHTOOL_A_LINKMODES_CNT = 11,\n\tETHTOOL_A_LINKMODES_MAX = 10,\n};\n\nenum {\n\tETHTOOL_A_LINKSTATE_UNSPEC = 0,\n\tETHTOOL_A_LINKSTATE_HEADER = 1,\n\tETHTOOL_A_LINKSTATE_LINK = 2,\n\tETHTOOL_A_LINKSTATE_SQI = 3,\n\tETHTOOL_A_LINKSTATE_SQI_MAX = 4,\n\tETHTOOL_A_LINKSTATE_EXT_STATE = 5,\n\tETHTOOL_A_LINKSTATE_EXT_SUBSTATE = 6,\n\tETHTOOL_A_LINKSTATE_EXT_DOWN_CNT = 7,\n\t__ETHTOOL_A_LINKSTATE_CNT = 8,\n\tETHTOOL_A_LINKSTATE_MAX = 7,\n};\n\nenum {\n\tETHTOOL_A_MM_STAT_UNSPEC = 0,\n\tETHTOOL_A_MM_STAT_PAD = 1,\n\tETHTOOL_A_MM_STAT_REASSEMBLY_ERRORS = 2,\n\tETHTOOL_A_MM_STAT_SMD_ERRORS = 3,\n\tETHTOOL_A_MM_STAT_REASSEMBLY_OK = 4,\n\tETHTOOL_A_MM_STAT_RX_FRAG_COUNT = 5,\n\tETHTOOL_A_MM_STAT_TX_FRAG_COUNT = 6,\n\tETHTOOL_A_MM_STAT_HOLD_COUNT = 7,\n\t__ETHTOOL_A_MM_STAT_CNT = 8,\n\tETHTOOL_A_MM_STAT_MAX = 7,\n};\n\nenum {\n\tETHTOOL_A_MM_UNSPEC = 0,\n\tETHTOOL_A_MM_HEADER = 1,\n\tETHTOOL_A_MM_PMAC_ENABLED = 2,\n\tETHTOOL_A_MM_TX_ENABLED = 3,\n\tETHTOOL_A_MM_TX_ACTIVE = 4,\n\tETHTOOL_A_MM_TX_MIN_FRAG_SIZE = 5,\n\tETHTOOL_A_MM_RX_MIN_FRAG_SIZE = 6,\n\tETHTOOL_A_MM_VERIFY_ENABLED = 7,\n\tETHTOOL_A_MM_VERIFY_STATUS = 8,\n\tETHTOOL_A_MM_VERIFY_TIME = 9,\n\tETHTOOL_A_MM_MAX_VERIFY_TIME = 10,\n\tETHTOOL_A_MM_STATS = 11,\n\t__ETHTOOL_A_MM_CNT = 12,\n\tETHTOOL_A_MM_MAX = 11,\n};\n\nenum {\n\tETHTOOL_A_MODULE_EEPROM_UNSPEC = 0,\n\tETHTOOL_A_MODULE_EEPROM_HEADER = 1,\n\tETHTOOL_A_MODULE_EEPROM_OFFSET = 2,\n\tETHTOOL_A_MODULE_EEPROM_LENGTH = 3,\n\tETHTOOL_A_MODULE_EEPROM_PAGE = 4,\n\tETHTOOL_A_MODULE_EEPROM_BANK = 5,\n\tETHTOOL_A_MODULE_EEPROM_I2C_ADDRESS = 6,\n\tETHTOOL_A_MODULE_EEPROM_DATA = 7,\n\t__ETHTOOL_A_MODULE_EEPROM_CNT = 8,\n\tETHTOOL_A_MODULE_EEPROM_MAX = 7,\n};\n\nenum {\n\tETHTOOL_A_MODULE_FW_FLASH_UNSPEC = 0,\n\tETHTOOL_A_MODULE_FW_FLASH_HEADER = 1,\n\tETHTOOL_A_MODULE_FW_FLASH_FILE_NAME = 2,\n\tETHTOOL_A_MODULE_FW_FLASH_PASSWORD = 3,\n\tETHTOOL_A_MODULE_FW_FLASH_STATUS = 4,\n\tETHTOOL_A_MODULE_FW_FLASH_STATUS_MSG = 5,\n\tETHTOOL_A_MODULE_FW_FLASH_DONE = 6,\n\tETHTOOL_A_MODULE_FW_FLASH_TOTAL = 7,\n\t__ETHTOOL_A_MODULE_FW_FLASH_CNT = 8,\n\tETHTOOL_A_MODULE_FW_FLASH_MAX = 7,\n};\n\nenum {\n\tETHTOOL_A_MODULE_UNSPEC = 0,\n\tETHTOOL_A_MODULE_HEADER = 1,\n\tETHTOOL_A_MODULE_POWER_MODE_POLICY = 2,\n\tETHTOOL_A_MODULE_POWER_MODE = 3,\n\t__ETHTOOL_A_MODULE_CNT = 4,\n\tETHTOOL_A_MODULE_MAX = 3,\n};\n\nenum {\n\tETHTOOL_A_PAUSE_STAT_UNSPEC = 0,\n\tETHTOOL_A_PAUSE_STAT_PAD = 1,\n\tETHTOOL_A_PAUSE_STAT_TX_FRAMES = 2,\n\tETHTOOL_A_PAUSE_STAT_RX_FRAMES = 3,\n\t__ETHTOOL_A_PAUSE_STAT_CNT = 4,\n\tETHTOOL_A_PAUSE_STAT_MAX = 3,\n};\n\nenum {\n\tETHTOOL_A_PAUSE_UNSPEC = 0,\n\tETHTOOL_A_PAUSE_HEADER = 1,\n\tETHTOOL_A_PAUSE_AUTONEG = 2,\n\tETHTOOL_A_PAUSE_RX = 3,\n\tETHTOOL_A_PAUSE_TX = 4,\n\tETHTOOL_A_PAUSE_STATS = 5,\n\tETHTOOL_A_PAUSE_STATS_SRC = 6,\n\t__ETHTOOL_A_PAUSE_CNT = 7,\n\tETHTOOL_A_PAUSE_MAX = 6,\n};\n\nenum {\n\tETHTOOL_A_PHC_VCLOCKS_UNSPEC = 0,\n\tETHTOOL_A_PHC_VCLOCKS_HEADER = 1,\n\tETHTOOL_A_PHC_VCLOCKS_NUM = 2,\n\tETHTOOL_A_PHC_VCLOCKS_INDEX = 3,\n\t__ETHTOOL_A_PHC_VCLOCKS_CNT = 4,\n\tETHTOOL_A_PHC_VCLOCKS_MAX = 3,\n};\n\nenum {\n\tETHTOOL_A_PLCA_UNSPEC = 0,\n\tETHTOOL_A_PLCA_HEADER = 1,\n\tETHTOOL_A_PLCA_VERSION = 2,\n\tETHTOOL_A_PLCA_ENABLED = 3,\n\tETHTOOL_A_PLCA_STATUS = 4,\n\tETHTOOL_A_PLCA_NODE_CNT = 5,\n\tETHTOOL_A_PLCA_NODE_ID = 6,\n\tETHTOOL_A_PLCA_TO_TMR = 7,\n\tETHTOOL_A_PLCA_BURST_CNT = 8,\n\tETHTOOL_A_PLCA_BURST_TMR = 9,\n\t__ETHTOOL_A_PLCA_CNT = 10,\n\tETHTOOL_A_PLCA_MAX = 9,\n};\n\nenum {\n\tETHTOOL_A_PRIVFLAGS_UNSPEC = 0,\n\tETHTOOL_A_PRIVFLAGS_HEADER = 1,\n\tETHTOOL_A_PRIVFLAGS_FLAGS = 2,\n\t__ETHTOOL_A_PRIVFLAGS_CNT = 3,\n\tETHTOOL_A_PRIVFLAGS_MAX = 2,\n};\n\nenum {\n\tETHTOOL_A_PROFILE_UNSPEC = 0,\n\tETHTOOL_A_PROFILE_IRQ_MODERATION = 1,\n\t__ETHTOOL_A_PROFILE_CNT = 2,\n\tETHTOOL_A_PROFILE_MAX = 1,\n};\n\nenum {\n\tETHTOOL_A_PSE_UNSPEC = 0,\n\tETHTOOL_A_PSE_HEADER = 1,\n\tETHTOOL_A_PODL_PSE_ADMIN_STATE = 2,\n\tETHTOOL_A_PODL_PSE_ADMIN_CONTROL = 3,\n\tETHTOOL_A_PODL_PSE_PW_D_STATUS = 4,\n\tETHTOOL_A_C33_PSE_ADMIN_STATE = 5,\n\tETHTOOL_A_C33_PSE_ADMIN_CONTROL = 6,\n\tETHTOOL_A_C33_PSE_PW_D_STATUS = 7,\n\tETHTOOL_A_C33_PSE_PW_CLASS = 8,\n\tETHTOOL_A_C33_PSE_ACTUAL_PW = 9,\n\tETHTOOL_A_C33_PSE_EXT_STATE = 10,\n\tETHTOOL_A_C33_PSE_EXT_SUBSTATE = 11,\n\tETHTOOL_A_C33_PSE_AVAIL_PW_LIMIT = 12,\n\tETHTOOL_A_C33_PSE_PW_LIMIT_RANGES = 13,\n\t__ETHTOOL_A_PSE_CNT = 14,\n\tETHTOOL_A_PSE_MAX = 13,\n};\n\nenum {\n\tETHTOOL_A_RINGS_UNSPEC = 0,\n\tETHTOOL_A_RINGS_HEADER = 1,\n\tETHTOOL_A_RINGS_RX_MAX = 2,\n\tETHTOOL_A_RINGS_RX_MINI_MAX = 3,\n\tETHTOOL_A_RINGS_RX_JUMBO_MAX = 4,\n\tETHTOOL_A_RINGS_TX_MAX = 5,\n\tETHTOOL_A_RINGS_RX = 6,\n\tETHTOOL_A_RINGS_RX_MINI = 7,\n\tETHTOOL_A_RINGS_RX_JUMBO = 8,\n\tETHTOOL_A_RINGS_TX = 9,\n\tETHTOOL_A_RINGS_RX_BUF_LEN = 10,\n\tETHTOOL_A_RINGS_TCP_DATA_SPLIT = 11,\n\tETHTOOL_A_RINGS_CQE_SIZE = 12,\n\tETHTOOL_A_RINGS_TX_PUSH = 13,\n\tETHTOOL_A_RINGS_RX_PUSH = 14,\n\tETHTOOL_A_RINGS_TX_PUSH_BUF_LEN = 15,\n\tETHTOOL_A_RINGS_TX_PUSH_BUF_LEN_MAX = 16,\n\t__ETHTOOL_A_RINGS_CNT = 17,\n\tETHTOOL_A_RINGS_MAX = 16,\n};\n\nenum {\n\tETHTOOL_A_RSS_UNSPEC = 0,\n\tETHTOOL_A_RSS_HEADER = 1,\n\tETHTOOL_A_RSS_CONTEXT = 2,\n\tETHTOOL_A_RSS_HFUNC = 3,\n\tETHTOOL_A_RSS_INDIR = 4,\n\tETHTOOL_A_RSS_HKEY = 5,\n\tETHTOOL_A_RSS_INPUT_XFRM = 6,\n\t__ETHTOOL_A_RSS_CNT = 7,\n\tETHTOOL_A_RSS_MAX = 6,\n};\n\nenum {\n\tETHTOOL_A_STATS_ETH_CTRL_3_TX = 0,\n\tETHTOOL_A_STATS_ETH_CTRL_4_RX = 1,\n\tETHTOOL_A_STATS_ETH_CTRL_5_RX_UNSUP = 2,\n\t__ETHTOOL_A_STATS_ETH_CTRL_CNT = 3,\n\tETHTOOL_A_STATS_ETH_CTRL_MAX = 2,\n};\n\nenum {\n\tETHTOOL_A_STATS_ETH_MAC_2_TX_PKT = 0,\n\tETHTOOL_A_STATS_ETH_MAC_3_SINGLE_COL = 1,\n\tETHTOOL_A_STATS_ETH_MAC_4_MULTI_COL = 2,\n\tETHTOOL_A_STATS_ETH_MAC_5_RX_PKT = 3,\n\tETHTOOL_A_STATS_ETH_MAC_6_FCS_ERR = 4,\n\tETHTOOL_A_STATS_ETH_MAC_7_ALIGN_ERR = 5,\n\tETHTOOL_A_STATS_ETH_MAC_8_TX_BYTES = 6,\n\tETHTOOL_A_STATS_ETH_MAC_9_TX_DEFER = 7,\n\tETHTOOL_A_STATS_ETH_MAC_10_LATE_COL = 8,\n\tETHTOOL_A_STATS_ETH_MAC_11_XS_COL = 9,\n\tETHTOOL_A_STATS_ETH_MAC_12_TX_INT_ERR = 10,\n\tETHTOOL_A_STATS_ETH_MAC_13_CS_ERR = 11,\n\tETHTOOL_A_STATS_ETH_MAC_14_RX_BYTES = 12,\n\tETHTOOL_A_STATS_ETH_MAC_15_RX_INT_ERR = 13,\n\tETHTOOL_A_STATS_ETH_MAC_18_TX_MCAST = 14,\n\tETHTOOL_A_STATS_ETH_MAC_19_TX_BCAST = 15,\n\tETHTOOL_A_STATS_ETH_MAC_20_XS_DEFER = 16,\n\tETHTOOL_A_STATS_ETH_MAC_21_RX_MCAST = 17,\n\tETHTOOL_A_STATS_ETH_MAC_22_RX_BCAST = 18,\n\tETHTOOL_A_STATS_ETH_MAC_23_IR_LEN_ERR = 19,\n\tETHTOOL_A_STATS_ETH_MAC_24_OOR_LEN = 20,\n\tETHTOOL_A_STATS_ETH_MAC_25_TOO_LONG_ERR = 21,\n\t__ETHTOOL_A_STATS_ETH_MAC_CNT = 22,\n\tETHTOOL_A_STATS_ETH_MAC_MAX = 21,\n};\n\nenum {\n\tETHTOOL_A_STATS_ETH_PHY_5_SYM_ERR = 0,\n\t__ETHTOOL_A_STATS_ETH_PHY_CNT = 1,\n\tETHTOOL_A_STATS_ETH_PHY_MAX = 0,\n};\n\nenum {\n\tETHTOOL_A_STATS_GRP_UNSPEC = 0,\n\tETHTOOL_A_STATS_GRP_PAD = 1,\n\tETHTOOL_A_STATS_GRP_ID = 2,\n\tETHTOOL_A_STATS_GRP_SS_ID = 3,\n\tETHTOOL_A_STATS_GRP_STAT = 4,\n\tETHTOOL_A_STATS_GRP_HIST_RX = 5,\n\tETHTOOL_A_STATS_GRP_HIST_TX = 6,\n\tETHTOOL_A_STATS_GRP_HIST_BKT_LOW = 7,\n\tETHTOOL_A_STATS_GRP_HIST_BKT_HI = 8,\n\tETHTOOL_A_STATS_GRP_HIST_VAL = 9,\n\t__ETHTOOL_A_STATS_GRP_CNT = 10,\n\tETHTOOL_A_STATS_GRP_MAX = 9,\n};\n\nenum {\n\tETHTOOL_A_STATS_RMON_UNDERSIZE = 0,\n\tETHTOOL_A_STATS_RMON_OVERSIZE = 1,\n\tETHTOOL_A_STATS_RMON_FRAG = 2,\n\tETHTOOL_A_STATS_RMON_JABBER = 3,\n\t__ETHTOOL_A_STATS_RMON_CNT = 4,\n\tETHTOOL_A_STATS_RMON_MAX = 3,\n};\n\nenum {\n\tETHTOOL_A_STATS_UNSPEC = 0,\n\tETHTOOL_A_STATS_PAD = 1,\n\tETHTOOL_A_STATS_HEADER = 2,\n\tETHTOOL_A_STATS_GROUPS = 3,\n\tETHTOOL_A_STATS_GRP = 4,\n\tETHTOOL_A_STATS_SRC = 5,\n\t__ETHTOOL_A_STATS_CNT = 6,\n\tETHTOOL_A_STATS_MAX = 5,\n};\n\nenum {\n\tETHTOOL_A_STRINGSETS_UNSPEC = 0,\n\tETHTOOL_A_STRINGSETS_STRINGSET = 1,\n\t__ETHTOOL_A_STRINGSETS_CNT = 2,\n\tETHTOOL_A_STRINGSETS_MAX = 1,\n};\n\nenum {\n\tETHTOOL_A_STRINGSET_UNSPEC = 0,\n\tETHTOOL_A_STRINGSET_ID = 1,\n\tETHTOOL_A_STRINGSET_COUNT = 2,\n\tETHTOOL_A_STRINGSET_STRINGS = 3,\n\t__ETHTOOL_A_STRINGSET_CNT = 4,\n\tETHTOOL_A_STRINGSET_MAX = 3,\n};\n\nenum {\n\tETHTOOL_A_STRINGS_UNSPEC = 0,\n\tETHTOOL_A_STRINGS_STRING = 1,\n\t__ETHTOOL_A_STRINGS_CNT = 2,\n\tETHTOOL_A_STRINGS_MAX = 1,\n};\n\nenum {\n\tETHTOOL_A_STRING_UNSPEC = 0,\n\tETHTOOL_A_STRING_INDEX = 1,\n\tETHTOOL_A_STRING_VALUE = 2,\n\t__ETHTOOL_A_STRING_CNT = 3,\n\tETHTOOL_A_STRING_MAX = 2,\n};\n\nenum {\n\tETHTOOL_A_STRSET_UNSPEC = 0,\n\tETHTOOL_A_STRSET_HEADER = 1,\n\tETHTOOL_A_STRSET_STRINGSETS = 2,\n\tETHTOOL_A_STRSET_COUNTS_ONLY = 3,\n\t__ETHTOOL_A_STRSET_CNT = 4,\n\tETHTOOL_A_STRSET_MAX = 3,\n};\n\nenum {\n\tETHTOOL_A_TSINFO_UNSPEC = 0,\n\tETHTOOL_A_TSINFO_HEADER = 1,\n\tETHTOOL_A_TSINFO_TIMESTAMPING = 2,\n\tETHTOOL_A_TSINFO_TX_TYPES = 3,\n\tETHTOOL_A_TSINFO_RX_FILTERS = 4,\n\tETHTOOL_A_TSINFO_PHC_INDEX = 5,\n\tETHTOOL_A_TSINFO_STATS = 6,\n\t__ETHTOOL_A_TSINFO_CNT = 7,\n\tETHTOOL_A_TSINFO_MAX = 6,\n};\n\nenum {\n\tETHTOOL_A_TS_STAT_UNSPEC = 0,\n\tETHTOOL_A_TS_STAT_TX_PKTS = 1,\n\tETHTOOL_A_TS_STAT_TX_LOST = 2,\n\tETHTOOL_A_TS_STAT_TX_ERR = 3,\n\t__ETHTOOL_A_TS_STAT_CNT = 4,\n\tETHTOOL_A_TS_STAT_MAX = 3,\n};\n\nenum {\n\tETHTOOL_A_TUNNEL_INFO_UNSPEC = 0,\n\tETHTOOL_A_TUNNEL_INFO_HEADER = 1,\n\tETHTOOL_A_TUNNEL_INFO_UDP_PORTS = 2,\n\t__ETHTOOL_A_TUNNEL_INFO_CNT = 3,\n\tETHTOOL_A_TUNNEL_INFO_MAX = 2,\n};\n\nenum {\n\tETHTOOL_A_TUNNEL_UDP_ENTRY_UNSPEC = 0,\n\tETHTOOL_A_TUNNEL_UDP_ENTRY_PORT = 1,\n\tETHTOOL_A_TUNNEL_UDP_ENTRY_TYPE = 2,\n\t__ETHTOOL_A_TUNNEL_UDP_ENTRY_CNT = 3,\n\tETHTOOL_A_TUNNEL_UDP_ENTRY_MAX = 2,\n};\n\nenum {\n\tETHTOOL_A_TUNNEL_UDP_TABLE_UNSPEC = 0,\n\tETHTOOL_A_TUNNEL_UDP_TABLE_SIZE = 1,\n\tETHTOOL_A_TUNNEL_UDP_TABLE_TYPES = 2,\n\tETHTOOL_A_TUNNEL_UDP_TABLE_ENTRY = 3,\n\t__ETHTOOL_A_TUNNEL_UDP_TABLE_CNT = 4,\n\tETHTOOL_A_TUNNEL_UDP_TABLE_MAX = 3,\n};\n\nenum {\n\tETHTOOL_A_TUNNEL_UDP_UNSPEC = 0,\n\tETHTOOL_A_TUNNEL_UDP_TABLE = 1,\n\t__ETHTOOL_A_TUNNEL_UDP_CNT = 2,\n\tETHTOOL_A_TUNNEL_UDP_MAX = 1,\n};\n\nenum {\n\tETHTOOL_A_WOL_UNSPEC = 0,\n\tETHTOOL_A_WOL_HEADER = 1,\n\tETHTOOL_A_WOL_MODES = 2,\n\tETHTOOL_A_WOL_SOPASS = 3,\n\t__ETHTOOL_A_WOL_CNT = 4,\n\tETHTOOL_A_WOL_MAX = 3,\n};\n\nenum {\n\tETHTOOL_MSG_KERNEL_NONE = 0,\n\tETHTOOL_MSG_STRSET_GET_REPLY = 1,\n\tETHTOOL_MSG_LINKINFO_GET_REPLY = 2,\n\tETHTOOL_MSG_LINKINFO_NTF = 3,\n\tETHTOOL_MSG_LINKMODES_GET_REPLY = 4,\n\tETHTOOL_MSG_LINKMODES_NTF = 5,\n\tETHTOOL_MSG_LINKSTATE_GET_REPLY = 6,\n\tETHTOOL_MSG_DEBUG_GET_REPLY = 7,\n\tETHTOOL_MSG_DEBUG_NTF = 8,\n\tETHTOOL_MSG_WOL_GET_REPLY = 9,\n\tETHTOOL_MSG_WOL_NTF = 10,\n\tETHTOOL_MSG_FEATURES_GET_REPLY = 11,\n\tETHTOOL_MSG_FEATURES_SET_REPLY = 12,\n\tETHTOOL_MSG_FEATURES_NTF = 13,\n\tETHTOOL_MSG_PRIVFLAGS_GET_REPLY = 14,\n\tETHTOOL_MSG_PRIVFLAGS_NTF = 15,\n\tETHTOOL_MSG_RINGS_GET_REPLY = 16,\n\tETHTOOL_MSG_RINGS_NTF = 17,\n\tETHTOOL_MSG_CHANNELS_GET_REPLY = 18,\n\tETHTOOL_MSG_CHANNELS_NTF = 19,\n\tETHTOOL_MSG_COALESCE_GET_REPLY = 20,\n\tETHTOOL_MSG_COALESCE_NTF = 21,\n\tETHTOOL_MSG_PAUSE_GET_REPLY = 22,\n\tETHTOOL_MSG_PAUSE_NTF = 23,\n\tETHTOOL_MSG_EEE_GET_REPLY = 24,\n\tETHTOOL_MSG_EEE_NTF = 25,\n\tETHTOOL_MSG_TSINFO_GET_REPLY = 26,\n\tETHTOOL_MSG_CABLE_TEST_NTF = 27,\n\tETHTOOL_MSG_CABLE_TEST_TDR_NTF = 28,\n\tETHTOOL_MSG_TUNNEL_INFO_GET_REPLY = 29,\n\tETHTOOL_MSG_FEC_GET_REPLY = 30,\n\tETHTOOL_MSG_FEC_NTF = 31,\n\tETHTOOL_MSG_MODULE_EEPROM_GET_REPLY = 32,\n\tETHTOOL_MSG_STATS_GET_REPLY = 33,\n\tETHTOOL_MSG_PHC_VCLOCKS_GET_REPLY = 34,\n\tETHTOOL_MSG_MODULE_GET_REPLY = 35,\n\tETHTOOL_MSG_MODULE_NTF = 36,\n\tETHTOOL_MSG_PSE_GET_REPLY = 37,\n\tETHTOOL_MSG_RSS_GET_REPLY = 38,\n\tETHTOOL_MSG_PLCA_GET_CFG_REPLY = 39,\n\tETHTOOL_MSG_PLCA_GET_STATUS_REPLY = 40,\n\tETHTOOL_MSG_PLCA_NTF = 41,\n\tETHTOOL_MSG_MM_GET_REPLY = 42,\n\tETHTOOL_MSG_MM_NTF = 43,\n\tETHTOOL_MSG_MODULE_FW_FLASH_NTF = 44,\n\t__ETHTOOL_MSG_KERNEL_CNT = 45,\n\tETHTOOL_MSG_KERNEL_MAX = 44,\n};\n\nenum {\n\tETHTOOL_MSG_USER_NONE = 0,\n\tETHTOOL_MSG_STRSET_GET = 1,\n\tETHTOOL_MSG_LINKINFO_GET = 2,\n\tETHTOOL_MSG_LINKINFO_SET = 3,\n\tETHTOOL_MSG_LINKMODES_GET = 4,\n\tETHTOOL_MSG_LINKMODES_SET = 5,\n\tETHTOOL_MSG_LINKSTATE_GET = 6,\n\tETHTOOL_MSG_DEBUG_GET = 7,\n\tETHTOOL_MSG_DEBUG_SET = 8,\n\tETHTOOL_MSG_WOL_GET = 9,\n\tETHTOOL_MSG_WOL_SET = 10,\n\tETHTOOL_MSG_FEATURES_GET = 11,\n\tETHTOOL_MSG_FEATURES_SET = 12,\n\tETHTOOL_MSG_PRIVFLAGS_GET = 13,\n\tETHTOOL_MSG_PRIVFLAGS_SET = 14,\n\tETHTOOL_MSG_RINGS_GET = 15,\n\tETHTOOL_MSG_RINGS_SET = 16,\n\tETHTOOL_MSG_CHANNELS_GET = 17,\n\tETHTOOL_MSG_CHANNELS_SET = 18,\n\tETHTOOL_MSG_COALESCE_GET = 19,\n\tETHTOOL_MSG_COALESCE_SET = 20,\n\tETHTOOL_MSG_PAUSE_GET = 21,\n\tETHTOOL_MSG_PAUSE_SET = 22,\n\tETHTOOL_MSG_EEE_GET = 23,\n\tETHTOOL_MSG_EEE_SET = 24,\n\tETHTOOL_MSG_TSINFO_GET = 25,\n\tETHTOOL_MSG_CABLE_TEST_ACT = 26,\n\tETHTOOL_MSG_CABLE_TEST_TDR_ACT = 27,\n\tETHTOOL_MSG_TUNNEL_INFO_GET = 28,\n\tETHTOOL_MSG_FEC_GET = 29,\n\tETHTOOL_MSG_FEC_SET = 30,\n\tETHTOOL_MSG_MODULE_EEPROM_GET = 31,\n\tETHTOOL_MSG_STATS_GET = 32,\n\tETHTOOL_MSG_PHC_VCLOCKS_GET = 33,\n\tETHTOOL_MSG_MODULE_GET = 34,\n\tETHTOOL_MSG_MODULE_SET = 35,\n\tETHTOOL_MSG_PSE_GET = 36,\n\tETHTOOL_MSG_PSE_SET = 37,\n\tETHTOOL_MSG_RSS_GET = 38,\n\tETHTOOL_MSG_PLCA_GET_CFG = 39,\n\tETHTOOL_MSG_PLCA_SET_CFG = 40,\n\tETHTOOL_MSG_PLCA_GET_STATUS = 41,\n\tETHTOOL_MSG_MM_GET = 42,\n\tETHTOOL_MSG_MM_SET = 43,\n\tETHTOOL_MSG_MODULE_FW_FLASH_ACT = 44,\n\t__ETHTOOL_MSG_USER_CNT = 45,\n\tETHTOOL_MSG_USER_MAX = 44,\n};\n\nenum {\n\tETHTOOL_STATS_ETH_PHY = 0,\n\tETHTOOL_STATS_ETH_MAC = 1,\n\tETHTOOL_STATS_ETH_CTRL = 2,\n\tETHTOOL_STATS_RMON = 3,\n\t__ETHTOOL_STATS_CNT = 4,\n};\n\nenum {\n\tETHTOOL_TCP_DATA_SPLIT_UNKNOWN = 0,\n\tETHTOOL_TCP_DATA_SPLIT_DISABLED = 1,\n\tETHTOOL_TCP_DATA_SPLIT_ENABLED = 2,\n};\n\nenum {\n\tETHTOOL_UDP_TUNNEL_TYPE_VXLAN = 0,\n\tETHTOOL_UDP_TUNNEL_TYPE_GENEVE = 1,\n\tETHTOOL_UDP_TUNNEL_TYPE_VXLAN_GPE = 2,\n\t__ETHTOOL_UDP_TUNNEL_TYPE_CNT = 3,\n};\n\nenum {\n\tETH_RSS_HASH_TOP_BIT = 0,\n\tETH_RSS_HASH_XOR_BIT = 1,\n\tETH_RSS_HASH_CRC32_BIT = 2,\n\tETH_RSS_HASH_FUNCS_COUNT = 3,\n};\n\nenum {\n\tEVENTFS_SAVE_MODE = 65536,\n\tEVENTFS_SAVE_UID = 131072,\n\tEVENTFS_SAVE_GID = 262144,\n};\n\nenum {\n\tEVENT_FILE_FL_ENABLED = 1,\n\tEVENT_FILE_FL_RECORDED_CMD = 2,\n\tEVENT_FILE_FL_RECORDED_TGID = 4,\n\tEVENT_FILE_FL_FILTERED = 8,\n\tEVENT_FILE_FL_NO_SET_FILTER = 16,\n\tEVENT_FILE_FL_SOFT_MODE = 32,\n\tEVENT_FILE_FL_SOFT_DISABLED = 64,\n\tEVENT_FILE_FL_TRIGGER_MODE = 128,\n\tEVENT_FILE_FL_TRIGGER_COND = 256,\n\tEVENT_FILE_FL_PID_FILTER = 512,\n\tEVENT_FILE_FL_WAS_ENABLED = 1024,\n\tEVENT_FILE_FL_FREED = 2048,\n};\n\nenum {\n\tEVENT_FILE_FL_ENABLED_BIT = 0,\n\tEVENT_FILE_FL_RECORDED_CMD_BIT = 1,\n\tEVENT_FILE_FL_RECORDED_TGID_BIT = 2,\n\tEVENT_FILE_FL_FILTERED_BIT = 3,\n\tEVENT_FILE_FL_NO_SET_FILTER_BIT = 4,\n\tEVENT_FILE_FL_SOFT_MODE_BIT = 5,\n\tEVENT_FILE_FL_SOFT_DISABLED_BIT = 6,\n\tEVENT_FILE_FL_TRIGGER_MODE_BIT = 7,\n\tEVENT_FILE_FL_TRIGGER_COND_BIT = 8,\n\tEVENT_FILE_FL_PID_FILTER_BIT = 9,\n\tEVENT_FILE_FL_WAS_ENABLED_BIT = 10,\n\tEVENT_FILE_FL_FREED_BIT = 11,\n};\n\nenum {\n\tEVENT_TRIGGER_FL_PROBE = 1,\n};\n\nenum {\n\tEXT4_FC_REASON_XATTR = 0,\n\tEXT4_FC_REASON_CROSS_RENAME = 1,\n\tEXT4_FC_REASON_JOURNAL_FLAG_CHANGE = 2,\n\tEXT4_FC_REASON_NOMEM = 3,\n\tEXT4_FC_REASON_SWAP_BOOT = 4,\n\tEXT4_FC_REASON_RESIZE = 5,\n\tEXT4_FC_REASON_RENAME_DIR = 6,\n\tEXT4_FC_REASON_FALLOC_RANGE = 7,\n\tEXT4_FC_REASON_INODE_JOURNAL_DATA = 8,\n\tEXT4_FC_REASON_ENCRYPTED_FILENAME = 9,\n\tEXT4_FC_REASON_MAX = 10,\n};\n\nenum {\n\tEXT4_FC_STATUS_OK = 0,\n\tEXT4_FC_STATUS_INELIGIBLE = 1,\n\tEXT4_FC_STATUS_SKIPPED = 2,\n\tEXT4_FC_STATUS_FAILED = 3,\n};\n\nenum {\n\tEXT4_INODE_SECRM = 0,\n\tEXT4_INODE_UNRM = 1,\n\tEXT4_INODE_COMPR = 2,\n\tEXT4_INODE_SYNC = 3,\n\tEXT4_INODE_IMMUTABLE = 4,\n\tEXT4_INODE_APPEND = 5,\n\tEXT4_INODE_NODUMP = 6,\n\tEXT4_INODE_NOATIME = 7,\n\tEXT4_INODE_DIRTY = 8,\n\tEXT4_INODE_COMPRBLK = 9,\n\tEXT4_INODE_NOCOMPR = 10,\n\tEXT4_INODE_ENCRYPT = 11,\n\tEXT4_INODE_INDEX = 12,\n\tEXT4_INODE_IMAGIC = 13,\n\tEXT4_INODE_JOURNAL_DATA = 14,\n\tEXT4_INODE_NOTAIL = 15,\n\tEXT4_INODE_DIRSYNC = 16,\n\tEXT4_INODE_TOPDIR = 17,\n\tEXT4_INODE_HUGE_FILE = 18,\n\tEXT4_INODE_EXTENTS = 19,\n\tEXT4_INODE_VERITY = 20,\n\tEXT4_INODE_EA_INODE = 21,\n\tEXT4_INODE_DAX = 25,\n\tEXT4_INODE_INLINE_DATA = 28,\n\tEXT4_INODE_PROJINHERIT = 29,\n\tEXT4_INODE_CASEFOLD = 30,\n\tEXT4_INODE_RESERVED = 31,\n};\n\nenum {\n\tEXT4_MF_MNTDIR_SAMPLED = 0,\n\tEXT4_MF_FC_INELIGIBLE = 1,\n};\n\nenum {\n\tEXT4_STATE_NEW = 0,\n\tEXT4_STATE_XATTR = 1,\n\tEXT4_STATE_NO_EXPAND = 2,\n\tEXT4_STATE_DA_ALLOC_CLOSE = 3,\n\tEXT4_STATE_EXT_MIGRATE = 4,\n\tEXT4_STATE_NEWENTRY = 5,\n\tEXT4_STATE_MAY_INLINE_DATA = 6,\n\tEXT4_STATE_EXT_PRECACHED = 7,\n\tEXT4_STATE_LUSTRE_EA_INODE = 8,\n\tEXT4_STATE_VERITY_IN_PROGRESS = 9,\n\tEXT4_STATE_FC_COMMITTING = 10,\n\tEXT4_STATE_ORPHAN_FILE = 11,\n};\n\nenum {\n\tEXTRA_REG_NHMEX_M_FILTER = 0,\n\tEXTRA_REG_NHMEX_M_DSP = 1,\n\tEXTRA_REG_NHMEX_M_ISS = 2,\n\tEXTRA_REG_NHMEX_M_MAP = 3,\n\tEXTRA_REG_NHMEX_M_MSC_THR = 4,\n\tEXTRA_REG_NHMEX_M_PGT = 5,\n\tEXTRA_REG_NHMEX_M_PLD = 6,\n\tEXTRA_REG_NHMEX_M_ZDP_CTL_FVC = 7,\n};\n\nenum {\n\tFAN_EVENT_INIT = 0,\n\tFAN_EVENT_REPORTED = 1,\n\tFAN_EVENT_ANSWERED = 2,\n\tFAN_EVENT_CANCELED = 3,\n};\n\nenum {\n\tFAST_W_CNT = 16,\n};\n\nenum {\n\tFBCON_LOGO_CANSHOW = -1,\n\tFBCON_LOGO_DRAW = -2,\n\tFBCON_LOGO_DONTSHOW = -3,\n};\n\nenum {\n\tFB_BLANK_UNBLANK = 0,\n\tFB_BLANK_NORMAL = 1,\n\tFB_BLANK_VSYNC_SUSPEND = 2,\n\tFB_BLANK_HSYNC_SUSPEND = 3,\n\tFB_BLANK_POWERDOWN = 4,\n};\n\nenum {\n\tFGRAPH_TYPE_RESERVED = 0,\n\tFGRAPH_TYPE_BITMAP = 1,\n\tFGRAPH_TYPE_DATA = 2,\n};\n\nenum {\n\tFIB6_NO_SERNUM_CHANGE = 0,\n};\n\nenum {\n\tFILTER_OTHER = 0,\n\tFILTER_STATIC_STRING = 1,\n\tFILTER_DYN_STRING = 2,\n\tFILTER_RDYN_STRING = 3,\n\tFILTER_PTR_STRING = 4,\n\tFILTER_TRACE_FN = 5,\n\tFILTER_CPUMASK = 6,\n\tFILTER_COMM = 7,\n\tFILTER_CPU = 8,\n\tFILTER_STACKTRACE = 9,\n};\n\nenum {\n\tFILT_ERR_NONE = 0,\n\tFILT_ERR_INVALID_OP = 1,\n\tFILT_ERR_TOO_MANY_OPEN = 2,\n\tFILT_ERR_TOO_MANY_CLOSE = 3,\n\tFILT_ERR_MISSING_QUOTE = 4,\n\tFILT_ERR_MISSING_BRACE_OPEN = 5,\n\tFILT_ERR_MISSING_BRACE_CLOSE = 6,\n\tFILT_ERR_OPERAND_TOO_LONG = 7,\n\tFILT_ERR_EXPECT_STRING = 8,\n\tFILT_ERR_EXPECT_DIGIT = 9,\n\tFILT_ERR_ILLEGAL_FIELD_OP = 10,\n\tFILT_ERR_FIELD_NOT_FOUND = 11,\n\tFILT_ERR_ILLEGAL_INTVAL = 12,\n\tFILT_ERR_BAD_SUBSYS_FILTER = 13,\n\tFILT_ERR_TOO_MANY_PREDS = 14,\n\tFILT_ERR_INVALID_FILTER = 15,\n\tFILT_ERR_INVALID_CPULIST = 16,\n\tFILT_ERR_IP_FIELD_ONLY = 17,\n\tFILT_ERR_INVALID_VALUE = 18,\n\tFILT_ERR_NO_FUNCTION = 19,\n\tFILT_ERR_ERRNO = 20,\n\tFILT_ERR_NO_FILTER = 21,\n};\n\nenum {\n\tFLAGS_ADC = 1,\n\tFLAGS_RTC = 2,\n};\n\nenum {\n\tFLAGS_FILL_FULL = 268435456,\n\tFLAGS_FILL_START = 536870912,\n\tFLAGS_FILL_END = 805306368,\n};\n\nenum {\n\tFOLL_TOUCH = 65536,\n\tFOLL_TRIED = 131072,\n\tFOLL_REMOTE = 262144,\n\tFOLL_PIN = 524288,\n\tFOLL_FAST_ONLY = 1048576,\n\tFOLL_UNLOCKABLE = 2097152,\n\tFOLL_MADV_POPULATE = 4194304,\n};\n\nenum {\n\tFOLL_WRITE = 1,\n\tFOLL_GET = 2,\n\tFOLL_DUMP = 4,\n\tFOLL_FORCE = 8,\n\tFOLL_NOWAIT = 16,\n\tFOLL_NOFAULT = 32,\n\tFOLL_HWPOISON = 64,\n\tFOLL_ANON = 128,\n\tFOLL_LONGTERM = 256,\n\tFOLL_SPLIT_PMD = 512,\n\tFOLL_PCI_P2PDMA = 1024,\n\tFOLL_INTERRUPTIBLE = 2048,\n\tFOLL_HONOR_NUMA_FAULT = 4096,\n};\n\nenum {\n\tFORMAT_HEADER = 1,\n\tFORMAT_FIELD_SEPERATOR = 2,\n\tFORMAT_PRINTFMT = 3,\n};\n\nenum {\n\tFRACTION_DENOM = 128,\n};\n\nenum {\n\tFRA_UNSPEC = 0,\n\tFRA_DST = 1,\n\tFRA_SRC = 2,\n\tFRA_IIFNAME = 3,\n\tFRA_GOTO = 4,\n\tFRA_UNUSED2 = 5,\n\tFRA_PRIORITY = 6,\n\tFRA_UNUSED3 = 7,\n\tFRA_UNUSED4 = 8,\n\tFRA_UNUSED5 = 9,\n\tFRA_FWMARK = 10,\n\tFRA_FLOW = 11,\n\tFRA_TUN_ID = 12,\n\tFRA_SUPPRESS_IFGROUP = 13,\n\tFRA_SUPPRESS_PREFIXLEN = 14,\n\tFRA_TABLE = 15,\n\tFRA_FWMASK = 16,\n\tFRA_OIFNAME = 17,\n\tFRA_PAD = 18,\n\tFRA_L3MDEV = 19,\n\tFRA_UID_RANGE = 20,\n\tFRA_PROTOCOL = 21,\n\tFRA_IP_PROTO = 22,\n\tFRA_SPORT_RANGE = 23,\n\tFRA_DPORT_RANGE = 24,\n\t__FRA_MAX = 25,\n};\n\nenum {\n\tFR_ACT_UNSPEC = 0,\n\tFR_ACT_TO_TBL = 1,\n\tFR_ACT_GOTO = 2,\n\tFR_ACT_NOP = 3,\n\tFR_ACT_RES3 = 4,\n\tFR_ACT_RES4 = 5,\n\tFR_ACT_BLACKHOLE = 6,\n\tFR_ACT_UNREACHABLE = 7,\n\tFR_ACT_PROHIBIT = 8,\n\t__FR_ACT_MAX = 9,\n};\n\nenum {\n\tFTRACE_FL_ENABLED = 2147483648,\n\tFTRACE_FL_REGS = 1073741824,\n\tFTRACE_FL_REGS_EN = 536870912,\n\tFTRACE_FL_TRAMP = 268435456,\n\tFTRACE_FL_TRAMP_EN = 134217728,\n\tFTRACE_FL_IPMODIFY = 67108864,\n\tFTRACE_FL_DISABLED = 33554432,\n\tFTRACE_FL_DIRECT = 16777216,\n\tFTRACE_FL_DIRECT_EN = 8388608,\n\tFTRACE_FL_CALL_OPS = 4194304,\n\tFTRACE_FL_CALL_OPS_EN = 2097152,\n\tFTRACE_FL_TOUCHED = 1048576,\n\tFTRACE_FL_MODIFIED = 524288,\n};\n\nenum {\n\tFTRACE_HASH_FL_MOD = 1,\n};\n\nenum {\n\tFTRACE_ITER_FILTER = 1,\n\tFTRACE_ITER_NOTRACE = 2,\n\tFTRACE_ITER_PRINTALL = 4,\n\tFTRACE_ITER_DO_PROBES = 8,\n\tFTRACE_ITER_PROBE = 16,\n\tFTRACE_ITER_MOD = 32,\n\tFTRACE_ITER_ENABLED = 64,\n\tFTRACE_ITER_TOUCHED = 128,\n\tFTRACE_ITER_ADDRS = 256,\n};\n\nenum {\n\tFTRACE_MODIFY_ENABLE_FL = 1,\n\tFTRACE_MODIFY_MAY_SLEEP_FL = 2,\n};\n\nenum {\n\tFTRACE_OPS_FL_ENABLED = 1,\n\tFTRACE_OPS_FL_DYNAMIC = 2,\n\tFTRACE_OPS_FL_SAVE_REGS = 4,\n\tFTRACE_OPS_FL_SAVE_REGS_IF_SUPPORTED = 8,\n\tFTRACE_OPS_FL_RECURSION = 16,\n\tFTRACE_OPS_FL_STUB = 32,\n\tFTRACE_OPS_FL_INITIALIZED = 64,\n\tFTRACE_OPS_FL_DELETED = 128,\n\tFTRACE_OPS_FL_ADDING = 256,\n\tFTRACE_OPS_FL_REMOVING = 512,\n\tFTRACE_OPS_FL_MODIFYING = 1024,\n\tFTRACE_OPS_FL_ALLOC_TRAMP = 2048,\n\tFTRACE_OPS_FL_IPMODIFY = 4096,\n\tFTRACE_OPS_FL_PID = 8192,\n\tFTRACE_OPS_FL_RCU = 16384,\n\tFTRACE_OPS_FL_TRACE_ARRAY = 32768,\n\tFTRACE_OPS_FL_PERMANENT = 65536,\n\tFTRACE_OPS_FL_DIRECT = 131072,\n\tFTRACE_OPS_FL_SUBOP = 262144,\n};\n\nenum {\n\tFTRACE_UPDATE_CALLS = 1,\n\tFTRACE_DISABLE_CALLS = 2,\n\tFTRACE_UPDATE_TRACE_FUNC = 4,\n\tFTRACE_START_FUNC_RET = 8,\n\tFTRACE_STOP_FUNC_RET = 16,\n\tFTRACE_MAY_SLEEP = 32,\n};\n\nenum {\n\tFTRACE_UPDATE_IGNORE = 0,\n\tFTRACE_UPDATE_MAKE_CALL = 1,\n\tFTRACE_UPDATE_MODIFY_CALL = 2,\n\tFTRACE_UPDATE_MAKE_NOP = 3,\n};\n\nenum {\n\tFUSE_I_ADVISE_RDPLUS = 0,\n\tFUSE_I_INIT_RDPLUS = 1,\n\tFUSE_I_SIZE_UNSTABLE = 2,\n\tFUSE_I_BAD = 3,\n\tFUSE_I_BTIME = 4,\n\tFUSE_I_CACHE_IO_MODE = 5,\n};\n\nenum {\n\tFUTEX_STATE_OK = 0,\n\tFUTEX_STATE_EXITING = 1,\n\tFUTEX_STATE_DEAD = 2,\n};\n\nenum {\n\tGATE_INTERRUPT = 14,\n\tGATE_TRAP = 15,\n\tGATE_CALL = 12,\n\tGATE_TASK = 5,\n};\n\nenum {\n\tGENHD_FL_REMOVABLE = 1,\n\tGENHD_FL_HIDDEN = 2,\n\tGENHD_FL_NO_PART = 4,\n};\n\nenum {\n\tGHES_SEV_NO = 0,\n\tGHES_SEV_CORRECTED = 1,\n\tGHES_SEV_RECOVERABLE = 2,\n\tGHES_SEV_PANIC = 3,\n};\n\nenum {\n\tGI2C_PORT = 0,\n\tPI2C_PORT = 1,\n};\n\nenum {\n\tGPIOLINE_CHANGED_REQUESTED = 1,\n\tGPIOLINE_CHANGED_RELEASED = 2,\n\tGPIOLINE_CHANGED_CONFIG = 3,\n};\n\nenum {\n\tGP_IDLE = 0,\n\tGP_ENTER = 1,\n\tGP_PASSED = 2,\n\tGP_EXIT = 3,\n\tGP_REPLAY = 4,\n};\n\nenum {\n\tHANDSHAKE_A_ACCEPT_SOCKFD = 1,\n\tHANDSHAKE_A_ACCEPT_HANDLER_CLASS = 2,\n\tHANDSHAKE_A_ACCEPT_MESSAGE_TYPE = 3,\n\tHANDSHAKE_A_ACCEPT_TIMEOUT = 4,\n\tHANDSHAKE_A_ACCEPT_AUTH_MODE = 5,\n\tHANDSHAKE_A_ACCEPT_PEER_IDENTITY = 6,\n\tHANDSHAKE_A_ACCEPT_CERTIFICATE = 7,\n\tHANDSHAKE_A_ACCEPT_PEERNAME = 8,\n\t__HANDSHAKE_A_ACCEPT_MAX = 9,\n\tHANDSHAKE_A_ACCEPT_MAX = 8,\n};\n\nenum {\n\tHANDSHAKE_A_DONE_STATUS = 1,\n\tHANDSHAKE_A_DONE_SOCKFD = 2,\n\tHANDSHAKE_A_DONE_REMOTE_AUTH = 3,\n\t__HANDSHAKE_A_DONE_MAX = 4,\n\tHANDSHAKE_A_DONE_MAX = 3,\n};\n\nenum {\n\tHANDSHAKE_A_X509_CERT = 1,\n\tHANDSHAKE_A_X509_PRIVKEY = 2,\n\t__HANDSHAKE_A_X509_MAX = 3,\n\tHANDSHAKE_A_X509_MAX = 2,\n};\n\nenum {\n\tHANDSHAKE_CMD_READY = 1,\n\tHANDSHAKE_CMD_ACCEPT = 2,\n\tHANDSHAKE_CMD_DONE = 3,\n\t__HANDSHAKE_CMD_MAX = 4,\n\tHANDSHAKE_CMD_MAX = 3,\n};\n\nenum {\n\tHANDSHAKE_NLGRP_NONE = 0,\n\tHANDSHAKE_NLGRP_TLSHD = 1,\n};\n\nenum {\n\tHASH_SIZE = 128,\n};\n\nenum {\n\tHIBERNATION_INVALID = 0,\n\tHIBERNATION_PLATFORM = 1,\n\tHIBERNATION_SHUTDOWN = 2,\n\tHIBERNATION_REBOOT = 3,\n\tHIBERNATION_SUSPEND = 4,\n\tHIBERNATION_TEST_RESUME = 5,\n\t__HIBERNATION_AFTER_LAST = 6,\n};\n\nenum {\n\tHIST_ERR_NONE = 0,\n\tHIST_ERR_DUPLICATE_VAR = 1,\n\tHIST_ERR_VAR_NOT_UNIQUE = 2,\n\tHIST_ERR_TOO_MANY_VARS = 3,\n\tHIST_ERR_MALFORMED_ASSIGNMENT = 4,\n\tHIST_ERR_NAMED_MISMATCH = 5,\n\tHIST_ERR_TRIGGER_EEXIST = 6,\n\tHIST_ERR_TRIGGER_ENOENT_CLEAR = 7,\n\tHIST_ERR_SET_CLOCK_FAIL = 8,\n\tHIST_ERR_BAD_FIELD_MODIFIER = 9,\n\tHIST_ERR_TOO_MANY_SUBEXPR = 10,\n\tHIST_ERR_TIMESTAMP_MISMATCH = 11,\n\tHIST_ERR_TOO_MANY_FIELD_VARS = 12,\n\tHIST_ERR_EVENT_FILE_NOT_FOUND = 13,\n\tHIST_ERR_HIST_NOT_FOUND = 14,\n\tHIST_ERR_HIST_CREATE_FAIL = 15,\n\tHIST_ERR_SYNTH_VAR_NOT_FOUND = 16,\n\tHIST_ERR_SYNTH_EVENT_NOT_FOUND = 17,\n\tHIST_ERR_SYNTH_TYPE_MISMATCH = 18,\n\tHIST_ERR_SYNTH_COUNT_MISMATCH = 19,\n\tHIST_ERR_FIELD_VAR_PARSE_FAIL = 20,\n\tHIST_ERR_VAR_CREATE_FIND_FAIL = 21,\n\tHIST_ERR_ONX_NOT_VAR = 22,\n\tHIST_ERR_ONX_VAR_NOT_FOUND = 23,\n\tHIST_ERR_ONX_VAR_CREATE_FAIL = 24,\n\tHIST_ERR_FIELD_VAR_CREATE_FAIL = 25,\n\tHIST_ERR_TOO_MANY_PARAMS = 26,\n\tHIST_ERR_PARAM_NOT_FOUND = 27,\n\tHIST_ERR_INVALID_PARAM = 28,\n\tHIST_ERR_ACTION_NOT_FOUND = 29,\n\tHIST_ERR_NO_SAVE_PARAMS = 30,\n\tHIST_ERR_TOO_MANY_SAVE_ACTIONS = 31,\n\tHIST_ERR_ACTION_MISMATCH = 32,\n\tHIST_ERR_NO_CLOSING_PAREN = 33,\n\tHIST_ERR_SUBSYS_NOT_FOUND = 34,\n\tHIST_ERR_INVALID_SUBSYS_EVENT = 35,\n\tHIST_ERR_INVALID_REF_KEY = 36,\n\tHIST_ERR_VAR_NOT_FOUND = 37,\n\tHIST_ERR_FIELD_NOT_FOUND = 38,\n\tHIST_ERR_EMPTY_ASSIGNMENT = 39,\n\tHIST_ERR_INVALID_SORT_MODIFIER = 40,\n\tHIST_ERR_EMPTY_SORT_FIELD = 41,\n\tHIST_ERR_TOO_MANY_SORT_FIELDS = 42,\n\tHIST_ERR_INVALID_SORT_FIELD = 43,\n\tHIST_ERR_INVALID_STR_OPERAND = 44,\n\tHIST_ERR_EXPECT_NUMBER = 45,\n\tHIST_ERR_UNARY_MINUS_SUBEXPR = 46,\n\tHIST_ERR_DIVISION_BY_ZERO = 47,\n\tHIST_ERR_NEED_NOHC_VAL = 48,\n};\n\nenum {\n\tHI_SOFTIRQ = 0,\n\tTIMER_SOFTIRQ = 1,\n\tNET_TX_SOFTIRQ = 2,\n\tNET_RX_SOFTIRQ = 3,\n\tBLOCK_SOFTIRQ = 4,\n\tIRQ_POLL_SOFTIRQ = 5,\n\tTASKLET_SOFTIRQ = 6,\n\tSCHED_SOFTIRQ = 7,\n\tHRTIMER_SOFTIRQ = 8,\n\tRCU_SOFTIRQ = 9,\n\tNR_SOFTIRQS = 10,\n};\n\nenum {\n\tHMM_NEED_FAULT = 1,\n\tHMM_NEED_WRITE_FAULT = 2,\n\tHMM_NEED_ALL_BITS = 3,\n};\n\nenum {\n\tHOST_L_CNT = 6,\n};\n\nenum {\n\tHOST_L_DUR = 9,\n};\n\nenum {\n\tHOST_S_CNT = 7,\n};\n\nenum {\n\tHOST_S_DUR = 8,\n};\n\nenum {\n\tHP_THREAD_NONE = 0,\n\tHP_THREAD_ACTIVE = 1,\n\tHP_THREAD_PARKED = 2,\n};\n\nenum {\n\tHSWEP_PCI_UNCORE_HA = 0,\n\tHSWEP_PCI_UNCORE_IMC = 1,\n\tHSWEP_PCI_UNCORE_IRP = 2,\n\tHSWEP_PCI_UNCORE_QPI = 3,\n\tHSWEP_PCI_UNCORE_R2PCIE = 4,\n\tHSWEP_PCI_UNCORE_R3QPI = 5,\n};\n\nenum {\n\tHTE_TS_REGISTERED = 0,\n\tHTE_TS_REQ = 1,\n\tHTE_TS_DISABLE = 2,\n\tHTE_TS_QUEUE_WK = 3,\n};\n\nenum {\n\tHUGETLB_SHMFS_INODE = 1,\n\tHUGETLB_ANONHUGE_INODE = 2,\n};\n\nenum {\n\tHW_BREAKPOINT_EMPTY = 0,\n\tHW_BREAKPOINT_R = 1,\n\tHW_BREAKPOINT_W = 2,\n\tHW_BREAKPOINT_RW = 3,\n\tHW_BREAKPOINT_X = 4,\n\tHW_BREAKPOINT_INVALID = 7,\n};\n\nenum {\n\tHW_BREAKPOINT_LEN_1 = 1,\n\tHW_BREAKPOINT_LEN_2 = 2,\n\tHW_BREAKPOINT_LEN_3 = 3,\n\tHW_BREAKPOINT_LEN_4 = 4,\n\tHW_BREAKPOINT_LEN_5 = 5,\n\tHW_BREAKPOINT_LEN_6 = 6,\n\tHW_BREAKPOINT_LEN_7 = 7,\n\tHW_BREAKPOINT_LEN_8 = 8,\n};\n\nenum {\n\tIBM = 0,\n\tTVP = 1,\n};\n\nenum {\n\tICMP6_MIB_NUM = 0,\n\tICMP6_MIB_INMSGS = 1,\n\tICMP6_MIB_INERRORS = 2,\n\tICMP6_MIB_OUTMSGS = 3,\n\tICMP6_MIB_OUTERRORS = 4,\n\tICMP6_MIB_CSUMERRORS = 5,\n\tICMP6_MIB_RATELIMITHOST = 6,\n\t__ICMP6_MIB_MAX = 7,\n};\n\nenum {\n\tICMP_MIB_NUM = 0,\n\tICMP_MIB_INMSGS = 1,\n\tICMP_MIB_INERRORS = 2,\n\tICMP_MIB_INDESTUNREACHS = 3,\n\tICMP_MIB_INTIMEEXCDS = 4,\n\tICMP_MIB_INPARMPROBS = 5,\n\tICMP_MIB_INSRCQUENCHS = 6,\n\tICMP_MIB_INREDIRECTS = 7,\n\tICMP_MIB_INECHOS = 8,\n\tICMP_MIB_INECHOREPS = 9,\n\tICMP_MIB_INTIMESTAMPS = 10,\n\tICMP_MIB_INTIMESTAMPREPS = 11,\n\tICMP_MIB_INADDRMASKS = 12,\n\tICMP_MIB_INADDRMASKREPS = 13,\n\tICMP_MIB_OUTMSGS = 14,\n\tICMP_MIB_OUTERRORS = 15,\n\tICMP_MIB_OUTDESTUNREACHS = 16,\n\tICMP_MIB_OUTTIMEEXCDS = 17,\n\tICMP_MIB_OUTPARMPROBS = 18,\n\tICMP_MIB_OUTSRCQUENCHS = 19,\n\tICMP_MIB_OUTREDIRECTS = 20,\n\tICMP_MIB_OUTECHOS = 21,\n\tICMP_MIB_OUTECHOREPS = 22,\n\tICMP_MIB_OUTTIMESTAMPS = 23,\n\tICMP_MIB_OUTTIMESTAMPREPS = 24,\n\tICMP_MIB_OUTADDRMASKS = 25,\n\tICMP_MIB_OUTADDRMASKREPS = 26,\n\tICMP_MIB_CSUMERRORS = 27,\n\tICMP_MIB_RATELIMITGLOBAL = 28,\n\tICMP_MIB_RATELIMITHOST = 29,\n\t__ICMP_MIB_MAX = 30,\n};\n\nenum {\n\tICQ_EXITED = 4,\n\tICQ_DESTROYED = 8,\n};\n\nenum {\n\tICX_PCIE1_PMON_ID = 0,\n\tICX_PCIE2_PMON_ID = 1,\n\tICX_PCIE3_PMON_ID = 2,\n\tICX_PCIE4_PMON_ID = 3,\n\tICX_PCIE5_PMON_ID = 4,\n\tICX_CBDMA_DMI_PMON_ID = 5,\n};\n\nenum {\n\tICX_PCI_UNCORE_M2M = 0,\n\tICX_PCI_UNCORE_UPI = 1,\n\tICX_PCI_UNCORE_M3UPI = 2,\n};\n\nenum {\n\tIDX_MODULE_ID = 0,\n\tIDX_ST_OPS_COMMON_VALUE_ID = 1,\n};\n\nenum {\n\tIFAL_ADDRESS = 1,\n\tIFAL_LABEL = 2,\n\t__IFAL_MAX = 3,\n};\n\nenum {\n\tIFA_UNSPEC = 0,\n\tIFA_ADDRESS = 1,\n\tIFA_LOCAL = 2,\n\tIFA_LABEL = 3,\n\tIFA_BROADCAST = 4,\n\tIFA_ANYCAST = 5,\n\tIFA_CACHEINFO = 6,\n\tIFA_MULTICAST = 7,\n\tIFA_FLAGS = 8,\n\tIFA_RT_PRIORITY = 9,\n\tIFA_TARGET_NETNSID = 10,\n\tIFA_PROTO = 11,\n\t__IFA_MAX = 12,\n};\n\nenum {\n\tIFLA_BRIDGE_FLAGS = 0,\n\tIFLA_BRIDGE_MODE = 1,\n\tIFLA_BRIDGE_VLAN_INFO = 2,\n\tIFLA_BRIDGE_VLAN_TUNNEL_INFO = 3,\n\tIFLA_BRIDGE_MRP = 4,\n\tIFLA_BRIDGE_CFM = 5,\n\tIFLA_BRIDGE_MST = 6,\n\t__IFLA_BRIDGE_MAX = 7,\n};\n\nenum {\n\tIFLA_BRPORT_UNSPEC = 0,\n\tIFLA_BRPORT_STATE = 1,\n\tIFLA_BRPORT_PRIORITY = 2,\n\tIFLA_BRPORT_COST = 3,\n\tIFLA_BRPORT_MODE = 4,\n\tIFLA_BRPORT_GUARD = 5,\n\tIFLA_BRPORT_PROTECT = 6,\n\tIFLA_BRPORT_FAST_LEAVE = 7,\n\tIFLA_BRPORT_LEARNING = 8,\n\tIFLA_BRPORT_UNICAST_FLOOD = 9,\n\tIFLA_BRPORT_PROXYARP = 10,\n\tIFLA_BRPORT_LEARNING_SYNC = 11,\n\tIFLA_BRPORT_PROXYARP_WIFI = 12,\n\tIFLA_BRPORT_ROOT_ID = 13,\n\tIFLA_BRPORT_BRIDGE_ID = 14,\n\tIFLA_BRPORT_DESIGNATED_PORT = 15,\n\tIFLA_BRPORT_DESIGNATED_COST = 16,\n\tIFLA_BRPORT_ID = 17,\n\tIFLA_BRPORT_NO = 18,\n\tIFLA_BRPORT_TOPOLOGY_CHANGE_ACK = 19,\n\tIFLA_BRPORT_CONFIG_PENDING = 20,\n\tIFLA_BRPORT_MESSAGE_AGE_TIMER = 21,\n\tIFLA_BRPORT_FORWARD_DELAY_TIMER = 22,\n\tIFLA_BRPORT_HOLD_TIMER = 23,\n\tIFLA_BRPORT_FLUSH = 24,\n\tIFLA_BRPORT_MULTICAST_ROUTER = 25,\n\tIFLA_BRPORT_PAD = 26,\n\tIFLA_BRPORT_MCAST_FLOOD = 27,\n\tIFLA_BRPORT_MCAST_TO_UCAST = 28,\n\tIFLA_BRPORT_VLAN_TUNNEL = 29,\n\tIFLA_BRPORT_BCAST_FLOOD = 30,\n\tIFLA_BRPORT_GROUP_FWD_MASK = 31,\n\tIFLA_BRPORT_NEIGH_SUPPRESS = 32,\n\tIFLA_BRPORT_ISOLATED = 33,\n\tIFLA_BRPORT_BACKUP_PORT = 34,\n\tIFLA_BRPORT_MRP_RING_OPEN = 35,\n\tIFLA_BRPORT_MRP_IN_OPEN = 36,\n\tIFLA_BRPORT_MCAST_EHT_HOSTS_LIMIT = 37,\n\tIFLA_BRPORT_MCAST_EHT_HOSTS_CNT = 38,\n\tIFLA_BRPORT_LOCKED = 39,\n\tIFLA_BRPORT_MAB = 40,\n\tIFLA_BRPORT_MCAST_N_GROUPS = 41,\n\tIFLA_BRPORT_MCAST_MAX_GROUPS = 42,\n\tIFLA_BRPORT_NEIGH_VLAN_SUPPRESS = 43,\n\tIFLA_BRPORT_BACKUP_NHID = 44,\n\t__IFLA_BRPORT_MAX = 45,\n};\n\nenum {\n\tIFLA_EVENT_NONE = 0,\n\tIFLA_EVENT_REBOOT = 1,\n\tIFLA_EVENT_FEATURES = 2,\n\tIFLA_EVENT_BONDING_FAILOVER = 3,\n\tIFLA_EVENT_NOTIFY_PEERS = 4,\n\tIFLA_EVENT_IGMP_RESEND = 5,\n\tIFLA_EVENT_BONDING_OPTIONS = 6,\n};\n\nenum {\n\tIFLA_INET6_UNSPEC = 0,\n\tIFLA_INET6_FLAGS = 1,\n\tIFLA_INET6_CONF = 2,\n\tIFLA_INET6_STATS = 3,\n\tIFLA_INET6_MCAST = 4,\n\tIFLA_INET6_CACHEINFO = 5,\n\tIFLA_INET6_ICMP6STATS = 6,\n\tIFLA_INET6_TOKEN = 7,\n\tIFLA_INET6_ADDR_GEN_MODE = 8,\n\tIFLA_INET6_RA_MTU = 9,\n\t__IFLA_INET6_MAX = 10,\n};\n\nenum {\n\tIFLA_INET_UNSPEC = 0,\n\tIFLA_INET_CONF = 1,\n\t__IFLA_INET_MAX = 2,\n};\n\nenum {\n\tIFLA_INFO_UNSPEC = 0,\n\tIFLA_INFO_KIND = 1,\n\tIFLA_INFO_DATA = 2,\n\tIFLA_INFO_XSTATS = 3,\n\tIFLA_INFO_SLAVE_KIND = 4,\n\tIFLA_INFO_SLAVE_DATA = 5,\n\t__IFLA_INFO_MAX = 6,\n};\n\nenum {\n\tIFLA_IPTUN_UNSPEC = 0,\n\tIFLA_IPTUN_LINK = 1,\n\tIFLA_IPTUN_LOCAL = 2,\n\tIFLA_IPTUN_REMOTE = 3,\n\tIFLA_IPTUN_TTL = 4,\n\tIFLA_IPTUN_TOS = 5,\n\tIFLA_IPTUN_ENCAP_LIMIT = 6,\n\tIFLA_IPTUN_FLOWINFO = 7,\n\tIFLA_IPTUN_FLAGS = 8,\n\tIFLA_IPTUN_PROTO = 9,\n\tIFLA_IPTUN_PMTUDISC = 10,\n\tIFLA_IPTUN_6RD_PREFIX = 11,\n\tIFLA_IPTUN_6RD_RELAY_PREFIX = 12,\n\tIFLA_IPTUN_6RD_PREFIXLEN = 13,\n\tIFLA_IPTUN_6RD_RELAY_PREFIXLEN = 14,\n\tIFLA_IPTUN_ENCAP_TYPE = 15,\n\tIFLA_IPTUN_ENCAP_FLAGS = 16,\n\tIFLA_IPTUN_ENCAP_SPORT = 17,\n\tIFLA_IPTUN_ENCAP_DPORT = 18,\n\tIFLA_IPTUN_COLLECT_METADATA = 19,\n\tIFLA_IPTUN_FWMARK = 20,\n\t__IFLA_IPTUN_VENDOR_BREAK = 21,\n\tIFLA_IPTUN_FAN_MAP = 33,\n\t__IFLA_IPTUN_MAX = 34,\n};\n\nenum {\n\tIFLA_MCTP_UNSPEC = 0,\n\tIFLA_MCTP_NET = 1,\n\t__IFLA_MCTP_MAX = 2,\n};\n\nenum {\n\tIFLA_NETKIT_UNSPEC = 0,\n\tIFLA_NETKIT_PEER_INFO = 1,\n\tIFLA_NETKIT_PRIMARY = 2,\n\tIFLA_NETKIT_POLICY = 3,\n\tIFLA_NETKIT_PEER_POLICY = 4,\n\tIFLA_NETKIT_MODE = 5,\n\tIFLA_NETKIT_SCRUB = 6,\n\tIFLA_NETKIT_PEER_SCRUB = 7,\n\t__IFLA_NETKIT_MAX = 8,\n};\n\nenum {\n\tIFLA_OFFLOAD_XSTATS_HW_S_INFO_UNSPEC = 0,\n\tIFLA_OFFLOAD_XSTATS_HW_S_INFO_REQUEST = 1,\n\tIFLA_OFFLOAD_XSTATS_HW_S_INFO_USED = 2,\n\t__IFLA_OFFLOAD_XSTATS_HW_S_INFO_MAX = 3,\n};\n\nenum {\n\tIFLA_OFFLOAD_XSTATS_UNSPEC = 0,\n\tIFLA_OFFLOAD_XSTATS_CPU_HIT = 1,\n\tIFLA_OFFLOAD_XSTATS_HW_S_INFO = 2,\n\tIFLA_OFFLOAD_XSTATS_L3_STATS = 3,\n\t__IFLA_OFFLOAD_XSTATS_MAX = 4,\n};\n\nenum {\n\tIFLA_PORT_UNSPEC = 0,\n\tIFLA_PORT_VF = 1,\n\tIFLA_PORT_PROFILE = 2,\n\tIFLA_PORT_VSI_TYPE = 3,\n\tIFLA_PORT_INSTANCE_UUID = 4,\n\tIFLA_PORT_HOST_UUID = 5,\n\tIFLA_PORT_REQUEST = 6,\n\tIFLA_PORT_RESPONSE = 7,\n\t__IFLA_PORT_MAX = 8,\n};\n\nenum {\n\tIFLA_PPP_UNSPEC = 0,\n\tIFLA_PPP_DEV_FD = 1,\n\t__IFLA_PPP_MAX = 2,\n};\n\nenum {\n\tIFLA_PROTO_DOWN_REASON_UNSPEC = 0,\n\tIFLA_PROTO_DOWN_REASON_MASK = 1,\n\tIFLA_PROTO_DOWN_REASON_VALUE = 2,\n\t__IFLA_PROTO_DOWN_REASON_CNT = 3,\n\tIFLA_PROTO_DOWN_REASON_MAX = 2,\n};\n\nenum {\n\tIFLA_STATS_GETSET_UNSPEC = 0,\n\tIFLA_STATS_GET_FILTERS = 1,\n\tIFLA_STATS_SET_OFFLOAD_XSTATS_L3_STATS = 2,\n\t__IFLA_STATS_GETSET_MAX = 3,\n};\n\nenum {\n\tIFLA_STATS_UNSPEC = 0,\n\tIFLA_STATS_LINK_64 = 1,\n\tIFLA_STATS_LINK_XSTATS = 2,\n\tIFLA_STATS_LINK_XSTATS_SLAVE = 3,\n\tIFLA_STATS_LINK_OFFLOAD_XSTATS = 4,\n\tIFLA_STATS_AF_SPEC = 5,\n\t__IFLA_STATS_MAX = 6,\n};\n\nenum {\n\tIFLA_TUN_UNSPEC = 0,\n\tIFLA_TUN_OWNER = 1,\n\tIFLA_TUN_GROUP = 2,\n\tIFLA_TUN_TYPE = 3,\n\tIFLA_TUN_PI = 4,\n\tIFLA_TUN_VNET_HDR = 5,\n\tIFLA_TUN_PERSIST = 6,\n\tIFLA_TUN_MULTI_QUEUE = 7,\n\tIFLA_TUN_NUM_QUEUES = 8,\n\tIFLA_TUN_NUM_DISABLED_QUEUES = 9,\n\t__IFLA_TUN_MAX = 10,\n};\n\nenum {\n\tIFLA_UNSPEC = 0,\n\tIFLA_ADDRESS = 1,\n\tIFLA_BROADCAST = 2,\n\tIFLA_IFNAME = 3,\n\tIFLA_MTU = 4,\n\tIFLA_LINK = 5,\n\tIFLA_QDISC = 6,\n\tIFLA_STATS = 7,\n\tIFLA_COST = 8,\n\tIFLA_PRIORITY = 9,\n\tIFLA_MASTER = 10,\n\tIFLA_WIRELESS = 11,\n\tIFLA_PROTINFO = 12,\n\tIFLA_TXQLEN = 13,\n\tIFLA_MAP = 14,\n\tIFLA_WEIGHT = 15,\n\tIFLA_OPERSTATE = 16,\n\tIFLA_LINKMODE = 17,\n\tIFLA_LINKINFO = 18,\n\tIFLA_NET_NS_PID = 19,\n\tIFLA_IFALIAS = 20,\n\tIFLA_NUM_VF = 21,\n\tIFLA_VFINFO_LIST = 22,\n\tIFLA_STATS64 = 23,\n\tIFLA_VF_PORTS = 24,\n\tIFLA_PORT_SELF = 25,\n\tIFLA_AF_SPEC = 26,\n\tIFLA_GROUP = 27,\n\tIFLA_NET_NS_FD = 28,\n\tIFLA_EXT_MASK = 29,\n\tIFLA_PROMISCUITY = 30,\n\tIFLA_NUM_TX_QUEUES = 31,\n\tIFLA_NUM_RX_QUEUES = 32,\n\tIFLA_CARRIER = 33,\n\tIFLA_PHYS_PORT_ID = 34,\n\tIFLA_CARRIER_CHANGES = 35,\n\tIFLA_PHYS_SWITCH_ID = 36,\n\tIFLA_LINK_NETNSID = 37,\n\tIFLA_PHYS_PORT_NAME = 38,\n\tIFLA_PROTO_DOWN = 39,\n\tIFLA_GSO_MAX_SEGS = 40,\n\tIFLA_GSO_MAX_SIZE = 41,\n\tIFLA_PAD = 42,\n\tIFLA_XDP = 43,\n\tIFLA_EVENT = 44,\n\tIFLA_NEW_NETNSID = 45,\n\tIFLA_IF_NETNSID = 46,\n\tIFLA_TARGET_NETNSID = 46,\n\tIFLA_CARRIER_UP_COUNT = 47,\n\tIFLA_CARRIER_DOWN_COUNT = 48,\n\tIFLA_NEW_IFINDEX = 49,\n\tIFLA_MIN_MTU = 50,\n\tIFLA_MAX_MTU = 51,\n\tIFLA_PROP_LIST = 52,\n\tIFLA_ALT_IFNAME = 53,\n\tIFLA_PERM_ADDRESS = 54,\n\tIFLA_PROTO_DOWN_REASON = 55,\n\tIFLA_PARENT_DEV_NAME = 56,\n\tIFLA_PARENT_DEV_BUS_NAME = 57,\n\tIFLA_GRO_MAX_SIZE = 58,\n\tIFLA_TSO_MAX_SIZE = 59,\n\tIFLA_TSO_MAX_SEGS = 60,\n\tIFLA_ALLMULTI = 61,\n\tIFLA_DEVLINK_PORT = 62,\n\tIFLA_GSO_IPV4_MAX_SIZE = 63,\n\tIFLA_GRO_IPV4_MAX_SIZE = 64,\n\tIFLA_DPLL_PIN = 65,\n\t__IFLA_MAX = 66,\n};\n\nenum {\n\tIFLA_VF_INFO_UNSPEC = 0,\n\tIFLA_VF_INFO = 1,\n\t__IFLA_VF_INFO_MAX = 2,\n};\n\nenum {\n\tIFLA_VF_PORT_UNSPEC = 0,\n\tIFLA_VF_PORT = 1,\n\t__IFLA_VF_PORT_MAX = 2,\n};\n\nenum {\n\tIFLA_VF_STATS_RX_PACKETS = 0,\n\tIFLA_VF_STATS_TX_PACKETS = 1,\n\tIFLA_VF_STATS_RX_BYTES = 2,\n\tIFLA_VF_STATS_TX_BYTES = 3,\n\tIFLA_VF_STATS_BROADCAST = 4,\n\tIFLA_VF_STATS_MULTICAST = 5,\n\tIFLA_VF_STATS_PAD = 6,\n\tIFLA_VF_STATS_RX_DROPPED = 7,\n\tIFLA_VF_STATS_TX_DROPPED = 8,\n\t__IFLA_VF_STATS_MAX = 9,\n};\n\nenum {\n\tIFLA_VF_UNSPEC = 0,\n\tIFLA_VF_MAC = 1,\n\tIFLA_VF_VLAN = 2,\n\tIFLA_VF_TX_RATE = 3,\n\tIFLA_VF_SPOOFCHK = 4,\n\tIFLA_VF_LINK_STATE = 5,\n\tIFLA_VF_RATE = 6,\n\tIFLA_VF_RSS_QUERY_EN = 7,\n\tIFLA_VF_STATS = 8,\n\tIFLA_VF_TRUST = 9,\n\tIFLA_VF_IB_NODE_GUID = 10,\n\tIFLA_VF_IB_PORT_GUID = 11,\n\tIFLA_VF_VLAN_LIST = 12,\n\tIFLA_VF_BROADCAST = 13,\n\t__IFLA_VF_MAX = 14,\n};\n\nenum {\n\tIFLA_VF_VLAN_INFO_UNSPEC = 0,\n\tIFLA_VF_VLAN_INFO = 1,\n\t__IFLA_VF_VLAN_INFO_MAX = 2,\n};\n\nenum {\n\tIFLA_XDP_UNSPEC = 0,\n\tIFLA_XDP_FD = 1,\n\tIFLA_XDP_ATTACHED = 2,\n\tIFLA_XDP_FLAGS = 3,\n\tIFLA_XDP_PROG_ID = 4,\n\tIFLA_XDP_DRV_PROG_ID = 5,\n\tIFLA_XDP_SKB_PROG_ID = 6,\n\tIFLA_XDP_HW_PROG_ID = 7,\n\tIFLA_XDP_EXPECTED_FD = 8,\n\t__IFLA_XDP_MAX = 9,\n};\n\nenum {\n\tIF_ACT_NONE = -1,\n\tIF_ACT_FILTER = 0,\n\tIF_ACT_START = 1,\n\tIF_ACT_STOP = 2,\n\tIF_SRC_FILE = 3,\n\tIF_SRC_KERNEL = 4,\n\tIF_SRC_FILEADDR = 5,\n\tIF_SRC_KERNELADDR = 6,\n};\n\nenum {\n\tIF_LINK_MODE_DEFAULT = 0,\n\tIF_LINK_MODE_DORMANT = 1,\n\tIF_LINK_MODE_TESTING = 2,\n};\n\nenum {\n\tIF_OPER_UNKNOWN = 0,\n\tIF_OPER_NOTPRESENT = 1,\n\tIF_OPER_DOWN = 2,\n\tIF_OPER_LOWERLAYERDOWN = 3,\n\tIF_OPER_TESTING = 4,\n\tIF_OPER_DORMANT = 5,\n\tIF_OPER_UP = 6,\n};\n\nenum {\n\tIF_STATE_ACTION = 0,\n\tIF_STATE_SOURCE = 1,\n\tIF_STATE_END = 2,\n};\n\nenum {\n\tIIO_TOPOLOGY_TYPE = 0,\n\tUPI_TOPOLOGY_TYPE = 1,\n\tTOPOLOGY_MAX = 2,\n};\n\nenum {\n\tINET6_IFADDR_STATE_PREDAD = 0,\n\tINET6_IFADDR_STATE_DAD = 1,\n\tINET6_IFADDR_STATE_POSTDAD = 2,\n\tINET6_IFADDR_STATE_ERRDAD = 3,\n\tINET6_IFADDR_STATE_DEAD = 4,\n};\n\nenum {\n\tINET_DIAG_REQ_NONE = 0,\n\tINET_DIAG_REQ_BYTECODE = 1,\n\tINET_DIAG_REQ_SK_BPF_STORAGES = 2,\n\tINET_DIAG_REQ_PROTOCOL = 3,\n\t__INET_DIAG_REQ_MAX = 4,\n};\n\nenum {\n\tINET_ECN_NOT_ECT = 0,\n\tINET_ECN_ECT_1 = 1,\n\tINET_ECN_ECT_0 = 2,\n\tINET_ECN_CE = 3,\n\tINET_ECN_MASK = 3,\n};\n\nenum {\n\tINET_FLAGS_PKTINFO = 0,\n\tINET_FLAGS_TTL = 1,\n\tINET_FLAGS_TOS = 2,\n\tINET_FLAGS_RECVOPTS = 3,\n\tINET_FLAGS_RETOPTS = 4,\n\tINET_FLAGS_PASSSEC = 5,\n\tINET_FLAGS_ORIGDSTADDR = 6,\n\tINET_FLAGS_CHECKSUM = 7,\n\tINET_FLAGS_RECVFRAGSIZE = 8,\n\tINET_FLAGS_RECVERR = 9,\n\tINET_FLAGS_RECVERR_RFC4884 = 10,\n\tINET_FLAGS_FREEBIND = 11,\n\tINET_FLAGS_HDRINCL = 12,\n\tINET_FLAGS_MC_LOOP = 13,\n\tINET_FLAGS_MC_ALL = 14,\n\tINET_FLAGS_TRANSPARENT = 15,\n\tINET_FLAGS_IS_ICSK = 16,\n\tINET_FLAGS_NODEFRAG = 17,\n\tINET_FLAGS_BIND_ADDRESS_NO_PORT = 18,\n\tINET_FLAGS_DEFER_CONNECT = 19,\n\tINET_FLAGS_MC6_LOOP = 20,\n\tINET_FLAGS_RECVERR6_RFC4884 = 21,\n\tINET_FLAGS_MC6_ALL = 22,\n\tINET_FLAGS_AUTOFLOWLABEL_SET = 23,\n\tINET_FLAGS_AUTOFLOWLABEL = 24,\n\tINET_FLAGS_DONTFRAG = 25,\n\tINET_FLAGS_RECVERR6 = 26,\n\tINET_FLAGS_REPFLOW = 27,\n\tINET_FLAGS_RTALERT_ISOLATE = 28,\n\tINET_FLAGS_SNDFLOW = 29,\n\tINET_FLAGS_RTALERT = 30,\n};\n\nenum {\n\tINET_FRAG_FIRST_IN = 1,\n\tINET_FRAG_LAST_IN = 2,\n\tINET_FRAG_COMPLETE = 4,\n\tINET_FRAG_HASH_DEAD = 8,\n\tINET_FRAG_DROP = 16,\n};\n\nenum {\n\tINET_ULP_INFO_UNSPEC = 0,\n\tINET_ULP_INFO_NAME = 1,\n\tINET_ULP_INFO_TLS = 2,\n\tINET_ULP_INFO_MPTCP = 3,\n\t__INET_ULP_INFO_MAX = 4,\n};\n\nenum {\n\tINSN_F_FRAMENO_MASK = 7,\n\tINSN_F_SPI_MASK = 63,\n\tINSN_F_SPI_SHIFT = 3,\n\tINSN_F_STACK_ACCESS = 512,\n};\n\nenum {\n\tINTEL_GPIO_BASE_ZERO = -2,\n\tINTEL_GPIO_BASE_NOMAP = -1,\n\tINTEL_GPIO_BASE_MATCH = 0,\n};\n\nenum {\n\tINVERT = 1,\n\tPROCESS_AND = 2,\n\tPROCESS_OR = 4,\n};\n\nenum {\n\tIOAM6_ATTR_UNSPEC = 0,\n\tIOAM6_ATTR_NS_ID = 1,\n\tIOAM6_ATTR_NS_DATA = 2,\n\tIOAM6_ATTR_NS_DATA_WIDE = 3,\n\tIOAM6_ATTR_SC_ID = 4,\n\tIOAM6_ATTR_SC_DATA = 5,\n\tIOAM6_ATTR_SC_NONE = 6,\n\tIOAM6_ATTR_PAD = 7,\n\t__IOAM6_ATTR_MAX = 8,\n};\n\nenum {\n\tIOAM6_CMD_UNSPEC = 0,\n\tIOAM6_CMD_ADD_NAMESPACE = 1,\n\tIOAM6_CMD_DEL_NAMESPACE = 2,\n\tIOAM6_CMD_DUMP_NAMESPACES = 3,\n\tIOAM6_CMD_ADD_SCHEMA = 4,\n\tIOAM6_CMD_DEL_SCHEMA = 5,\n\tIOAM6_CMD_DUMP_SCHEMAS = 6,\n\tIOAM6_CMD_NS_SET_SCHEMA = 7,\n\t__IOAM6_CMD_MAX = 8,\n};\n\nenum {\n\tIOAM6_IPTUNNEL_UNSPEC = 0,\n\tIOAM6_IPTUNNEL_MODE = 1,\n\tIOAM6_IPTUNNEL_DST = 2,\n\tIOAM6_IPTUNNEL_TRACE = 3,\n\tIOAM6_IPTUNNEL_FREQ_K = 4,\n\tIOAM6_IPTUNNEL_FREQ_N = 5,\n\t__IOAM6_IPTUNNEL_MAX = 6,\n};\n\nenum {\n\tIOCB_CMD_PREAD = 0,\n\tIOCB_CMD_PWRITE = 1,\n\tIOCB_CMD_FSYNC = 2,\n\tIOCB_CMD_FDSYNC = 3,\n\tIOCB_CMD_POLL = 5,\n\tIOCB_CMD_NOOP = 6,\n\tIOCB_CMD_PREADV = 7,\n\tIOCB_CMD_PWRITEV = 8,\n};\n\nenum {\n\tIOMMU_SET_DOMAIN_MUST_SUCCEED = 1,\n};\n\nenum {\n\tIOPRIO_CLASS_NONE = 0,\n\tIOPRIO_CLASS_RT = 1,\n\tIOPRIO_CLASS_BE = 2,\n\tIOPRIO_CLASS_IDLE = 3,\n\tIOPRIO_CLASS_INVALID = 7,\n};\n\nenum {\n\tIOPRIO_HINT_NONE = 0,\n\tIOPRIO_HINT_DEV_DURATION_LIMIT_1 = 1,\n\tIOPRIO_HINT_DEV_DURATION_LIMIT_2 = 2,\n\tIOPRIO_HINT_DEV_DURATION_LIMIT_3 = 3,\n\tIOPRIO_HINT_DEV_DURATION_LIMIT_4 = 4,\n\tIOPRIO_HINT_DEV_DURATION_LIMIT_5 = 5,\n\tIOPRIO_HINT_DEV_DURATION_LIMIT_6 = 6,\n\tIOPRIO_HINT_DEV_DURATION_LIMIT_7 = 7,\n};\n\nenum {\n\tIOPRIO_WHO_PROCESS = 1,\n\tIOPRIO_WHO_PGRP = 2,\n\tIOPRIO_WHO_USER = 3,\n};\n\nenum {\n\tIORES_DESC_NONE = 0,\n\tIORES_DESC_CRASH_KERNEL = 1,\n\tIORES_DESC_ACPI_TABLES = 2,\n\tIORES_DESC_ACPI_NV_STORAGE = 3,\n\tIORES_DESC_PERSISTENT_MEMORY = 4,\n\tIORES_DESC_PERSISTENT_MEMORY_LEGACY = 5,\n\tIORES_DESC_DEVICE_PRIVATE_MEMORY = 6,\n\tIORES_DESC_RESERVED = 7,\n\tIORES_DESC_SOFT_RESERVED = 8,\n\tIORES_DESC_CXL = 9,\n};\n\nenum {\n\tIORES_MAP_SYSTEM_RAM = 1,\n\tIORES_MAP_ENCRYPTED = 2,\n};\n\nenum {\n\tIORING_RSRC_FILE = 0,\n\tIORING_RSRC_BUFFER = 1,\n};\n\nenum {\n\tIOU_F_TWQ_LAZY_WAKE = 1,\n};\n\nenum {\n\tIOU_OK = 0,\n\tIOU_ISSUE_SKIP_COMPLETE = -529,\n\tIOU_REQUEUE = -3072,\n\tIOU_STOP_MULTISHOT = -125,\n};\n\nenum {\n\tIOU_POLL_DONE = 0,\n\tIOU_POLL_NO_ACTION = 1,\n\tIOU_POLL_REMOVE_POLL_USE_RES = 2,\n\tIOU_POLL_REISSUE = 3,\n\tIOU_POLL_REQUEUE = 4,\n};\n\nenum {\n\tIO_ACCT_STALLED_BIT = 0,\n};\n\nenum {\n\tIO_APOLL_OK = 0,\n\tIO_APOLL_ABORTED = 1,\n\tIO_APOLL_READY = 2,\n};\n\nenum {\n\tIO_CHECK_CQ_OVERFLOW_BIT = 0,\n\tIO_CHECK_CQ_DROPPED_BIT = 1,\n};\n\nenum {\n\tIO_EVENTFD_OP_SIGNAL_BIT = 0,\n};\n\nenum {\n\tIO_SQ_THREAD_SHOULD_STOP = 0,\n\tIO_SQ_THREAD_SHOULD_PARK = 1,\n};\n\nenum {\n\tIO_WORKER_F_UP = 0,\n\tIO_WORKER_F_RUNNING = 1,\n\tIO_WORKER_F_FREE = 2,\n\tIO_WORKER_F_BOUND = 3,\n};\n\nenum {\n\tIO_WQ_ACCT_BOUND = 0,\n\tIO_WQ_ACCT_UNBOUND = 1,\n\tIO_WQ_ACCT_NR = 2,\n};\n\nenum {\n\tIO_WQ_BIT_EXIT = 0,\n};\n\nenum {\n\tIO_WQ_WORK_CANCEL = 1,\n\tIO_WQ_WORK_HASHED = 2,\n\tIO_WQ_WORK_UNBOUND = 4,\n\tIO_WQ_WORK_CONCURRENT = 16,\n\tIO_WQ_HASH_SHIFT = 24,\n};\n\nenum {\n\tIP6MRA_CREPORT_UNSPEC = 0,\n\tIP6MRA_CREPORT_MSGTYPE = 1,\n\tIP6MRA_CREPORT_MIF_ID = 2,\n\tIP6MRA_CREPORT_SRC_ADDR = 3,\n\tIP6MRA_CREPORT_DST_ADDR = 4,\n\tIP6MRA_CREPORT_PKT = 5,\n\t__IP6MRA_CREPORT_MAX = 6,\n};\n\nenum {\n\tIP6_FH_F_FRAG = 1,\n\tIP6_FH_F_AUTH = 2,\n\tIP6_FH_F_SKIP_RH = 4,\n};\n\nenum {\n\tIPMRA_CREPORT_UNSPEC = 0,\n\tIPMRA_CREPORT_MSGTYPE = 1,\n\tIPMRA_CREPORT_VIF_ID = 2,\n\tIPMRA_CREPORT_SRC_ADDR = 3,\n\tIPMRA_CREPORT_DST_ADDR = 4,\n\tIPMRA_CREPORT_PKT = 5,\n\tIPMRA_CREPORT_TABLE = 6,\n\t__IPMRA_CREPORT_MAX = 7,\n};\n\nenum {\n\tIPMRA_TABLE_UNSPEC = 0,\n\tIPMRA_TABLE_ID = 1,\n\tIPMRA_TABLE_CACHE_RES_QUEUE_LEN = 2,\n\tIPMRA_TABLE_MROUTE_REG_VIF_NUM = 3,\n\tIPMRA_TABLE_MROUTE_DO_ASSERT = 4,\n\tIPMRA_TABLE_MROUTE_DO_PIM = 5,\n\tIPMRA_TABLE_VIFS = 6,\n\tIPMRA_TABLE_MROUTE_DO_WRVIFWHOLE = 7,\n\t__IPMRA_TABLE_MAX = 8,\n};\n\nenum {\n\tIPMRA_VIFA_UNSPEC = 0,\n\tIPMRA_VIFA_IFINDEX = 1,\n\tIPMRA_VIFA_VIF_ID = 2,\n\tIPMRA_VIFA_FLAGS = 3,\n\tIPMRA_VIFA_BYTES_IN = 4,\n\tIPMRA_VIFA_BYTES_OUT = 5,\n\tIPMRA_VIFA_PACKETS_IN = 6,\n\tIPMRA_VIFA_PACKETS_OUT = 7,\n\tIPMRA_VIFA_LOCAL_ADDR = 8,\n\tIPMRA_VIFA_REMOTE_ADDR = 9,\n\tIPMRA_VIFA_PAD = 10,\n\t__IPMRA_VIFA_MAX = 11,\n};\n\nenum {\n\tIPMRA_VIF_UNSPEC = 0,\n\tIPMRA_VIF = 1,\n\t__IPMRA_VIF_MAX = 2,\n};\n\nenum {\n\tIPPROTO_IP = 0,\n\tIPPROTO_ICMP = 1,\n\tIPPROTO_IGMP = 2,\n\tIPPROTO_IPIP = 4,\n\tIPPROTO_TCP = 6,\n\tIPPROTO_EGP = 8,\n\tIPPROTO_PUP = 12,\n\tIPPROTO_UDP = 17,\n\tIPPROTO_IDP = 22,\n\tIPPROTO_TP = 29,\n\tIPPROTO_DCCP = 33,\n\tIPPROTO_IPV6 = 41,\n\tIPPROTO_RSVP = 46,\n\tIPPROTO_GRE = 47,\n\tIPPROTO_ESP = 50,\n\tIPPROTO_AH = 51,\n\tIPPROTO_MTP = 92,\n\tIPPROTO_BEETPH = 94,\n\tIPPROTO_ENCAP = 98,\n\tIPPROTO_PIM = 103,\n\tIPPROTO_COMP = 108,\n\tIPPROTO_L2TP = 115,\n\tIPPROTO_SCTP = 132,\n\tIPPROTO_UDPLITE = 136,\n\tIPPROTO_MPLS = 137,\n\tIPPROTO_ETHERNET = 143,\n\tIPPROTO_RAW = 255,\n\tIPPROTO_SMC = 256,\n\tIPPROTO_MPTCP = 262,\n\tIPPROTO_MAX = 263,\n};\n\nenum {\n\tIPSTATS_MIB_NUM = 0,\n\tIPSTATS_MIB_INPKTS = 1,\n\tIPSTATS_MIB_INOCTETS = 2,\n\tIPSTATS_MIB_INDELIVERS = 3,\n\tIPSTATS_MIB_OUTFORWDATAGRAMS = 4,\n\tIPSTATS_MIB_OUTREQUESTS = 5,\n\tIPSTATS_MIB_OUTOCTETS = 6,\n\tIPSTATS_MIB_INHDRERRORS = 7,\n\tIPSTATS_MIB_INTOOBIGERRORS = 8,\n\tIPSTATS_MIB_INNOROUTES = 9,\n\tIPSTATS_MIB_INADDRERRORS = 10,\n\tIPSTATS_MIB_INUNKNOWNPROTOS = 11,\n\tIPSTATS_MIB_INTRUNCATEDPKTS = 12,\n\tIPSTATS_MIB_INDISCARDS = 13,\n\tIPSTATS_MIB_OUTDISCARDS = 14,\n\tIPSTATS_MIB_OUTNOROUTES = 15,\n\tIPSTATS_MIB_REASMTIMEOUT = 16,\n\tIPSTATS_MIB_REASMREQDS = 17,\n\tIPSTATS_MIB_REASMOKS = 18,\n\tIPSTATS_MIB_REASMFAILS = 19,\n\tIPSTATS_MIB_FRAGOKS = 20,\n\tIPSTATS_MIB_FRAGFAILS = 21,\n\tIPSTATS_MIB_FRAGCREATES = 22,\n\tIPSTATS_MIB_INMCASTPKTS = 23,\n\tIPSTATS_MIB_OUTMCASTPKTS = 24,\n\tIPSTATS_MIB_INBCASTPKTS = 25,\n\tIPSTATS_MIB_OUTBCASTPKTS = 26,\n\tIPSTATS_MIB_INMCASTOCTETS = 27,\n\tIPSTATS_MIB_OUTMCASTOCTETS = 28,\n\tIPSTATS_MIB_INBCASTOCTETS = 29,\n\tIPSTATS_MIB_OUTBCASTOCTETS = 30,\n\tIPSTATS_MIB_CSUMERRORS = 31,\n\tIPSTATS_MIB_NOECTPKTS = 32,\n\tIPSTATS_MIB_ECT1PKTS = 33,\n\tIPSTATS_MIB_ECT0PKTS = 34,\n\tIPSTATS_MIB_CEPKTS = 35,\n\tIPSTATS_MIB_REASM_OVERLAPS = 36,\n\tIPSTATS_MIB_OUTPKTS = 37,\n\t__IPSTATS_MIB_MAX = 38,\n};\n\nenum {\n\tIPV4_DEVCONF_FORWARDING = 1,\n\tIPV4_DEVCONF_MC_FORWARDING = 2,\n\tIPV4_DEVCONF_PROXY_ARP = 3,\n\tIPV4_DEVCONF_ACCEPT_REDIRECTS = 4,\n\tIPV4_DEVCONF_SECURE_REDIRECTS = 5,\n\tIPV4_DEVCONF_SEND_REDIRECTS = 6,\n\tIPV4_DEVCONF_SHARED_MEDIA = 7,\n\tIPV4_DEVCONF_RP_FILTER = 8,\n\tIPV4_DEVCONF_ACCEPT_SOURCE_ROUTE = 9,\n\tIPV4_DEVCONF_BOOTP_RELAY = 10,\n\tIPV4_DEVCONF_LOG_MARTIANS = 11,\n\tIPV4_DEVCONF_TAG = 12,\n\tIPV4_DEVCONF_ARPFILTER = 13,\n\tIPV4_DEVCONF_MEDIUM_ID = 14,\n\tIPV4_DEVCONF_NOXFRM = 15,\n\tIPV4_DEVCONF_NOPOLICY = 16,\n\tIPV4_DEVCONF_FORCE_IGMP_VERSION = 17,\n\tIPV4_DEVCONF_ARP_ANNOUNCE = 18,\n\tIPV4_DEVCONF_ARP_IGNORE = 19,\n\tIPV4_DEVCONF_PROMOTE_SECONDARIES = 20,\n\tIPV4_DEVCONF_ARP_ACCEPT = 21,\n\tIPV4_DEVCONF_ARP_NOTIFY = 22,\n\tIPV4_DEVCONF_ACCEPT_LOCAL = 23,\n\tIPV4_DEVCONF_SRC_VMARK = 24,\n\tIPV4_DEVCONF_PROXY_ARP_PVLAN = 25,\n\tIPV4_DEVCONF_ROUTE_LOCALNET = 26,\n\tIPV4_DEVCONF_IGMPV2_UNSOLICITED_REPORT_INTERVAL = 27,\n\tIPV4_DEVCONF_IGMPV3_UNSOLICITED_REPORT_INTERVAL = 28,\n\tIPV4_DEVCONF_IGNORE_ROUTES_WITH_LINKDOWN = 29,\n\tIPV4_DEVCONF_DROP_UNICAST_IN_L2_MULTICAST = 30,\n\tIPV4_DEVCONF_DROP_GRATUITOUS_ARP = 31,\n\tIPV4_DEVCONF_BC_FORWARDING = 32,\n\tIPV4_DEVCONF_ARP_EVICT_NOCARRIER = 33,\n\t__IPV4_DEVCONF_MAX = 34,\n};\n\nenum {\n\tIPV6_SADDR_RULE_INIT = 0,\n\tIPV6_SADDR_RULE_LOCAL = 1,\n\tIPV6_SADDR_RULE_SCOPE = 2,\n\tIPV6_SADDR_RULE_PREFERRED = 3,\n\tIPV6_SADDR_RULE_OIF = 4,\n\tIPV6_SADDR_RULE_LABEL = 5,\n\tIPV6_SADDR_RULE_PRIVACY = 6,\n\tIPV6_SADDR_RULE_ORCHID = 7,\n\tIPV6_SADDR_RULE_PREFIX = 8,\n\tIPV6_SADDR_RULE_MAX = 9,\n};\n\nenum {\n\tIP_TUNNEL_CSUM_BIT = 0,\n\tIP_TUNNEL_ROUTING_BIT = 1,\n\tIP_TUNNEL_KEY_BIT = 2,\n\tIP_TUNNEL_SEQ_BIT = 3,\n\tIP_TUNNEL_STRICT_BIT = 4,\n\tIP_TUNNEL_REC_BIT = 5,\n\tIP_TUNNEL_VERSION_BIT = 6,\n\tIP_TUNNEL_NO_KEY_BIT = 7,\n\tIP_TUNNEL_DONT_FRAGMENT_BIT = 8,\n\tIP_TUNNEL_OAM_BIT = 9,\n\tIP_TUNNEL_CRIT_OPT_BIT = 10,\n\tIP_TUNNEL_GENEVE_OPT_BIT = 11,\n\tIP_TUNNEL_VXLAN_OPT_BIT = 12,\n\tIP_TUNNEL_NOCACHE_BIT = 13,\n\tIP_TUNNEL_ERSPAN_OPT_BIT = 14,\n\tIP_TUNNEL_GTP_OPT_BIT = 15,\n\tIP_TUNNEL_VTI_BIT = 16,\n\tIP_TUNNEL_SIT_ISATAP_BIT = 16,\n\tIP_TUNNEL_PFCP_OPT_BIT = 17,\n\t__IP_TUNNEL_FLAG_NUM = 18,\n};\n\nenum {\n\tIRQCHIP_FWNODE_REAL = 0,\n\tIRQCHIP_FWNODE_NAMED = 1,\n\tIRQCHIP_FWNODE_NAMED_ID = 2,\n};\n\nenum {\n\tIRQCHIP_SET_TYPE_MASKED = 1,\n\tIRQCHIP_EOI_IF_HANDLED = 2,\n\tIRQCHIP_MASK_ON_SUSPEND = 4,\n\tIRQCHIP_ONOFFLINE_ENABLED = 8,\n\tIRQCHIP_SKIP_SET_WAKE = 16,\n\tIRQCHIP_ONESHOT_SAFE = 32,\n\tIRQCHIP_EOI_THREADED = 64,\n\tIRQCHIP_SUPPORTS_LEVEL_MSI = 128,\n\tIRQCHIP_SUPPORTS_NMI = 256,\n\tIRQCHIP_ENABLE_WAKEUP_ON_SUSPEND = 512,\n\tIRQCHIP_AFFINITY_PRE_STARTUP = 1024,\n\tIRQCHIP_IMMUTABLE = 2048,\n};\n\nenum {\n\tIRQC_IS_HARDIRQ = 0,\n\tIRQC_IS_NESTED = 1,\n};\n\nenum {\n\tIRQD_TRIGGER_MASK = 15,\n\tIRQD_SETAFFINITY_PENDING = 256,\n\tIRQD_ACTIVATED = 512,\n\tIRQD_NO_BALANCING = 1024,\n\tIRQD_PER_CPU = 2048,\n\tIRQD_AFFINITY_SET = 4096,\n\tIRQD_LEVEL = 8192,\n\tIRQD_WAKEUP_STATE = 16384,\n\tIRQD_MOVE_PCNTXT = 32768,\n\tIRQD_IRQ_DISABLED = 65536,\n\tIRQD_IRQ_MASKED = 131072,\n\tIRQD_IRQ_INPROGRESS = 262144,\n\tIRQD_WAKEUP_ARMED = 524288,\n\tIRQD_FORWARDED_TO_VCPU = 1048576,\n\tIRQD_AFFINITY_MANAGED = 2097152,\n\tIRQD_IRQ_STARTED = 4194304,\n\tIRQD_MANAGED_SHUTDOWN = 8388608,\n\tIRQD_SINGLE_TARGET = 16777216,\n\tIRQD_DEFAULT_TRIGGER_SET = 33554432,\n\tIRQD_CAN_RESERVE = 67108864,\n\tIRQD_HANDLE_ENFORCE_IRQCTX = 134217728,\n\tIRQD_AFFINITY_ON_ACTIVATE = 268435456,\n\tIRQD_IRQ_ENABLED_ON_SUSPEND = 536870912,\n\tIRQD_RESEND_WHEN_IN_PROGRESS = 1073741824,\n};\n\nenum {\n\tIRQS_AUTODETECT = 1,\n\tIRQS_SPURIOUS_DISABLED = 2,\n\tIRQS_POLL_INPROGRESS = 8,\n\tIRQS_ONESHOT = 32,\n\tIRQS_REPLAY = 64,\n\tIRQS_WAITING = 128,\n\tIRQS_PENDING = 512,\n\tIRQS_SUSPENDED = 2048,\n\tIRQS_TIMINGS = 4096,\n\tIRQS_NMI = 8192,\n\tIRQS_SYSFS = 16384,\n};\n\nenum {\n\tIRQTF_RUNTHREAD = 0,\n\tIRQTF_WARNED = 1,\n\tIRQTF_AFFINITY = 2,\n\tIRQTF_FORCED_THREAD = 3,\n\tIRQTF_READY = 4,\n};\n\nenum {\n\tIRQ_DOMAIN_FLAG_HIERARCHY = 1,\n\tIRQ_DOMAIN_NAME_ALLOCATED = 2,\n\tIRQ_DOMAIN_FLAG_IPI_PER_CPU = 4,\n\tIRQ_DOMAIN_FLAG_IPI_SINGLE = 8,\n\tIRQ_DOMAIN_FLAG_MSI = 16,\n\tIRQ_DOMAIN_FLAG_ISOLATED_MSI = 32,\n\tIRQ_DOMAIN_FLAG_NO_MAP = 64,\n\tIRQ_DOMAIN_FLAG_MSI_PARENT = 256,\n\tIRQ_DOMAIN_FLAG_MSI_DEVICE = 512,\n\tIRQ_DOMAIN_FLAG_DESTROY_GC = 1024,\n\tIRQ_DOMAIN_FLAG_NONCORE = 65536,\n};\n\nenum {\n\tIRQ_POLL_F_SCHED = 0,\n\tIRQ_POLL_F_DISABLE = 1,\n};\n\nenum {\n\tIRQ_REMAP_XAPIC_MODE = 0,\n\tIRQ_REMAP_X2APIC_MODE = 1,\n};\n\nenum {\n\tIRQ_SET_MASK_OK = 0,\n\tIRQ_SET_MASK_OK_NOCOPY = 1,\n\tIRQ_SET_MASK_OK_DONE = 2,\n};\n\nenum {\n\tIRQ_STARTUP_NORMAL = 0,\n\tIRQ_STARTUP_MANAGED = 1,\n\tIRQ_STARTUP_ABORT = 2,\n};\n\nenum {\n\tIRQ_TYPE_NONE = 0,\n\tIRQ_TYPE_EDGE_RISING = 1,\n\tIRQ_TYPE_EDGE_FALLING = 2,\n\tIRQ_TYPE_EDGE_BOTH = 3,\n\tIRQ_TYPE_LEVEL_HIGH = 4,\n\tIRQ_TYPE_LEVEL_LOW = 8,\n\tIRQ_TYPE_LEVEL_MASK = 12,\n\tIRQ_TYPE_SENSE_MASK = 15,\n\tIRQ_TYPE_DEFAULT = 15,\n\tIRQ_TYPE_PROBE = 16,\n\tIRQ_LEVEL = 256,\n\tIRQ_PER_CPU = 512,\n\tIRQ_NOPROBE = 1024,\n\tIRQ_NOREQUEST = 2048,\n\tIRQ_NOAUTOEN = 4096,\n\tIRQ_NO_BALANCING = 8192,\n\tIRQ_MOVE_PCNTXT = 16384,\n\tIRQ_NESTED_THREAD = 32768,\n\tIRQ_NOTHREAD = 65536,\n\tIRQ_PER_CPU_DEVID = 131072,\n\tIRQ_IS_POLLED = 262144,\n\tIRQ_DISABLE_UNLAZY = 524288,\n\tIRQ_HIDDEN = 1048576,\n\tIRQ_NO_DEBUG = 2097152,\n};\n\nenum {\n\tIVBEP_PCI_UNCORE_HA = 0,\n\tIVBEP_PCI_UNCORE_IMC = 1,\n\tIVBEP_PCI_UNCORE_IRP = 2,\n\tIVBEP_PCI_UNCORE_QPI = 3,\n\tIVBEP_PCI_UNCORE_R2PCIE = 4,\n\tIVBEP_PCI_UNCORE_R3QPI = 5,\n};\n\nenum {\n\tI_DATA_SEM_NORMAL = 0,\n\tI_DATA_SEM_OTHER = 1,\n\tI_DATA_SEM_QUOTA = 2,\n\tI_DATA_SEM_EA = 3,\n};\n\nenum {\n\tI_LCOEF_RBPS = 0,\n\tI_LCOEF_RSEQIOPS = 1,\n\tI_LCOEF_RRANDIOPS = 2,\n\tI_LCOEF_WBPS = 3,\n\tI_LCOEF_WSEQIOPS = 4,\n\tI_LCOEF_WRANDIOPS = 5,\n\tNR_I_LCOEFS = 6,\n};\n\nenum {\n\tKBUF_MODE_EXPAND = 1,\n\tKBUF_MODE_FREE = 2,\n};\n\nenum {\n\tKDB_NOT_INITIALIZED = 0,\n\tKDB_INIT_EARLY = 1,\n\tKDB_INIT_FULL = 2,\n};\n\nenum {\n\tKERNEL_PARAM_FL_UNSAFE = 1,\n\tKERNEL_PARAM_FL_HWPARAM = 2,\n};\n\nenum {\n\tKERNEL_PARAM_OPS_FL_NOARG = 1,\n};\n\nenum {\n\tKF_ARG_DYNPTR_ID = 0,\n\tKF_ARG_LIST_HEAD_ID = 1,\n\tKF_ARG_LIST_NODE_ID = 2,\n\tKF_ARG_RB_ROOT_ID = 3,\n\tKF_ARG_RB_NODE_ID = 4,\n\tKF_ARG_WORKQUEUE_ID = 5,\n};\n\nenum {\n\tKNL_PCI_UNCORE_MC_UCLK = 0,\n\tKNL_PCI_UNCORE_MC_DCLK = 1,\n\tKNL_PCI_UNCORE_EDC_UCLK = 2,\n\tKNL_PCI_UNCORE_EDC_ECLK = 3,\n\tKNL_PCI_UNCORE_M2PCIE = 4,\n\tKNL_PCI_UNCORE_IRP = 5,\n};\n\nenum {\n\tKTW_FREEZABLE = 1,\n};\n\nenum {\n\tLAST_NORM = 0,\n\tLAST_ROOT = 1,\n\tLAST_DOT = 2,\n\tLAST_DOTDOT = 3,\n};\n\nenum {\n\tLAT_OK = 1,\n\tLAT_UNKNOWN = 2,\n\tLAT_UNKNOWN_WRITES = 3,\n\tLAT_EXCEEDED = 4,\n};\n\nenum {\n\tLBR_FORMAT_32 = 0,\n\tLBR_FORMAT_LIP = 1,\n\tLBR_FORMAT_EIP = 2,\n\tLBR_FORMAT_EIP_FLAGS = 3,\n\tLBR_FORMAT_EIP_FLAGS2 = 4,\n\tLBR_FORMAT_INFO = 5,\n\tLBR_FORMAT_TIME = 6,\n\tLBR_FORMAT_INFO2 = 7,\n\tLBR_FORMAT_MAX_KNOWN = 7,\n};\n\nenum {\n\tLBR_NONE = 0,\n\tLBR_VALID = 1,\n};\n\nenum {\n\tLCOEF_RPAGE = 0,\n\tLCOEF_RSEQIO = 1,\n\tLCOEF_RRANDIO = 2,\n\tLCOEF_WPAGE = 3,\n\tLCOEF_WSEQIO = 4,\n\tLCOEF_WRANDIO = 5,\n\tNR_LCOEFS = 6,\n};\n\nenum {\n\tLIBATA_MAX_PRD = 128,\n\tLIBATA_DUMB_MAX_PRD = 64,\n\tATA_DEF_QUEUE = 1,\n\tATA_MAX_QUEUE = 32,\n\tATA_TAG_INTERNAL = 32,\n\tATA_SHORT_PAUSE = 16,\n\tATAPI_MAX_DRAIN = 16384,\n\tATA_ALL_DEVICES = 3,\n\tATA_SHT_EMULATED = 1,\n\tATA_SHT_THIS_ID = -1,\n\tATA_TFLAG_LBA48 = 1,\n\tATA_TFLAG_ISADDR = 2,\n\tATA_TFLAG_DEVICE = 4,\n\tATA_TFLAG_WRITE = 8,\n\tATA_TFLAG_LBA = 16,\n\tATA_TFLAG_FUA = 32,\n\tATA_TFLAG_POLLING = 64,\n\tATA_DFLAG_LBA = 1,\n\tATA_DFLAG_LBA48 = 2,\n\tATA_DFLAG_CDB_INTR = 4,\n\tATA_DFLAG_NCQ = 8,\n\tATA_DFLAG_FLUSH_EXT = 16,\n\tATA_DFLAG_ACPI_PENDING = 32,\n\tATA_DFLAG_ACPI_FAILED = 64,\n\tATA_DFLAG_AN = 128,\n\tATA_DFLAG_TRUSTED = 256,\n\tATA_DFLAG_FUA = 512,\n\tATA_DFLAG_DMADIR = 1024,\n\tATA_DFLAG_NCQ_SEND_RECV = 2048,\n\tATA_DFLAG_NCQ_PRIO = 4096,\n\tATA_DFLAG_CDL = 8192,\n\tATA_DFLAG_CFG_MASK = 16383,\n\tATA_DFLAG_PIO = 16384,\n\tATA_DFLAG_NCQ_OFF = 32768,\n\tATA_DFLAG_SLEEPING = 65536,\n\tATA_DFLAG_DUBIOUS_XFER = 131072,\n\tATA_DFLAG_NO_UNLOAD = 262144,\n\tATA_DFLAG_UNLOCK_HPA = 524288,\n\tATA_DFLAG_INIT_MASK = 1048575,\n\tATA_DFLAG_NCQ_PRIO_ENABLED = 1048576,\n\tATA_DFLAG_CDL_ENABLED = 2097152,\n\tATA_DFLAG_RESUMING = 4194304,\n\tATA_DFLAG_DETACH = 16777216,\n\tATA_DFLAG_DETACHED = 33554432,\n\tATA_DFLAG_DA = 67108864,\n\tATA_DFLAG_DEVSLP = 134217728,\n\tATA_DFLAG_ACPI_DISABLED = 268435456,\n\tATA_DFLAG_D_SENSE = 536870912,\n\tATA_DFLAG_ZAC = 1073741824,\n\tATA_DFLAG_FEATURES_MASK = 201341696,\n\tATA_DEV_UNKNOWN = 0,\n\tATA_DEV_ATA = 1,\n\tATA_DEV_ATA_UNSUP = 2,\n\tATA_DEV_ATAPI = 3,\n\tATA_DEV_ATAPI_UNSUP = 4,\n\tATA_DEV_PMP = 5,\n\tATA_DEV_PMP_UNSUP = 6,\n\tATA_DEV_SEMB = 7,\n\tATA_DEV_SEMB_UNSUP = 8,\n\tATA_DEV_ZAC = 9,\n\tATA_DEV_ZAC_UNSUP = 10,\n\tATA_DEV_NONE = 11,\n\tATA_LFLAG_NO_HRST = 2,\n\tATA_LFLAG_NO_SRST = 4,\n\tATA_LFLAG_ASSUME_ATA = 8,\n\tATA_LFLAG_ASSUME_SEMB = 16,\n\tATA_LFLAG_ASSUME_CLASS = 24,\n\tATA_LFLAG_NO_RETRY = 32,\n\tATA_LFLAG_DISABLED = 64,\n\tATA_LFLAG_SW_ACTIVITY = 128,\n\tATA_LFLAG_NO_LPM = 256,\n\tATA_LFLAG_RST_ONCE = 512,\n\tATA_LFLAG_CHANGED = 1024,\n\tATA_LFLAG_NO_DEBOUNCE_DELAY = 2048,\n\tATA_FLAG_SLAVE_POSS = 1,\n\tATA_FLAG_SATA = 2,\n\tATA_FLAG_NO_LPM = 4,\n\tATA_FLAG_NO_LOG_PAGE = 32,\n\tATA_FLAG_NO_ATAPI = 64,\n\tATA_FLAG_PIO_DMA = 128,\n\tATA_FLAG_PIO_LBA48 = 256,\n\tATA_FLAG_PIO_POLLING = 512,\n\tATA_FLAG_NCQ = 1024,\n\tATA_FLAG_NO_POWEROFF_SPINDOWN = 2048,\n\tATA_FLAG_NO_HIBERNATE_SPINDOWN = 4096,\n\tATA_FLAG_DEBUGMSG = 8192,\n\tATA_FLAG_FPDMA_AA = 16384,\n\tATA_FLAG_IGN_SIMPLEX = 32768,\n\tATA_FLAG_NO_IORDY = 65536,\n\tATA_FLAG_ACPI_SATA = 131072,\n\tATA_FLAG_AN = 262144,\n\tATA_FLAG_PMP = 524288,\n\tATA_FLAG_FPDMA_AUX = 1048576,\n\tATA_FLAG_EM = 2097152,\n\tATA_FLAG_SW_ACTIVITY = 4194304,\n\tATA_FLAG_NO_DIPM = 8388608,\n\tATA_FLAG_SAS_HOST = 16777216,\n\tATA_PFLAG_EH_PENDING = 1,\n\tATA_PFLAG_EH_IN_PROGRESS = 2,\n\tATA_PFLAG_FROZEN = 4,\n\tATA_PFLAG_RECOVERED = 8,\n\tATA_PFLAG_LOADING = 16,\n\tATA_PFLAG_SCSI_HOTPLUG = 64,\n\tATA_PFLAG_INITIALIZING = 128,\n\tATA_PFLAG_RESETTING = 256,\n\tATA_PFLAG_UNLOADING = 512,\n\tATA_PFLAG_UNLOADED = 1024,\n\tATA_PFLAG_RESUMING = 65536,\n\tATA_PFLAG_SUSPENDED = 131072,\n\tATA_PFLAG_PM_PENDING = 262144,\n\tATA_PFLAG_INIT_GTM_VALID = 524288,\n\tATA_PFLAG_PIO32 = 1048576,\n\tATA_PFLAG_PIO32CHANGE = 2097152,\n\tATA_PFLAG_EXTERNAL = 4194304,\n\tATA_QCFLAG_ACTIVE = 1,\n\tATA_QCFLAG_DMAMAP = 2,\n\tATA_QCFLAG_RTF_FILLED = 4,\n\tATA_QCFLAG_IO = 8,\n\tATA_QCFLAG_RESULT_TF = 16,\n\tATA_QCFLAG_CLEAR_EXCL = 32,\n\tATA_QCFLAG_QUIET = 64,\n\tATA_QCFLAG_RETRY = 128,\n\tATA_QCFLAG_HAS_CDL = 256,\n\tATA_QCFLAG_EH = 65536,\n\tATA_QCFLAG_SENSE_VALID = 131072,\n\tATA_QCFLAG_EH_SCHEDULED = 262144,\n\tATA_QCFLAG_EH_SUCCESS_CMD = 524288,\n\tATA_HOST_SIMPLEX = 1,\n\tATA_HOST_STARTED = 2,\n\tATA_HOST_PARALLEL_SCAN = 4,\n\tATA_HOST_IGNORE_ATA = 8,\n\tATA_HOST_NO_PART = 16,\n\tATA_HOST_NO_SSC = 32,\n\tATA_HOST_NO_DEVSLP = 64,\n\tATA_TMOUT_BOOT = 30000,\n\tATA_TMOUT_BOOT_QUICK = 7000,\n\tATA_TMOUT_INTERNAL_QUICK = 5000,\n\tATA_TMOUT_MAX_PARK = 30000,\n\tATA_TMOUT_FF_WAIT_LONG = 2000,\n\tATA_TMOUT_FF_WAIT = 800,\n\tATA_WAIT_AFTER_RESET = 150,\n\tATA_TMOUT_PMP_SRST_WAIT = 10000,\n\tATA_TMOUT_SPURIOUS_PHY = 10000,\n\tBUS_UNKNOWN = 0,\n\tBUS_DMA = 1,\n\tBUS_IDLE = 2,\n\tBUS_NOINTR = 3,\n\tBUS_NODATA = 4,\n\tBUS_TIMER = 5,\n\tBUS_PIO = 6,\n\tBUS_EDD = 7,\n\tBUS_IDENTIFY = 8,\n\tBUS_PACKET = 9,\n\tPORT_UNKNOWN = 0,\n\tPORT_ENABLED = 1,\n\tPORT_DISABLED = 2,\n\tATA_NR_PIO_MODES = 7,\n\tATA_NR_MWDMA_MODES = 5,\n\tATA_NR_UDMA_MODES = 8,\n\tATA_SHIFT_PIO = 0,\n\tATA_SHIFT_MWDMA = 7,\n\tATA_SHIFT_UDMA = 12,\n\tATA_SHIFT_PRIO = 6,\n\tATA_PRIO_HIGH = 2,\n\tATA_DMA_PAD_SZ = 4,\n\tATA_ERING_SIZE = 32,\n\tATA_DEFER_LINK = 1,\n\tATA_DEFER_PORT = 2,\n\tATA_EH_DESC_LEN = 80,\n\tATA_EH_REVALIDATE = 1,\n\tATA_EH_SOFTRESET = 2,\n\tATA_EH_HARDRESET = 4,\n\tATA_EH_RESET = 6,\n\tATA_EH_ENABLE_LINK = 8,\n\tATA_EH_PARK = 32,\n\tATA_EH_GET_SUCCESS_SENSE = 64,\n\tATA_EH_SET_ACTIVE = 128,\n\tATA_EH_PERDEV_MASK = 225,\n\tATA_EH_ALL_ACTIONS = 15,\n\tATA_EHI_HOTPLUGGED = 1,\n\tATA_EHI_NO_AUTOPSY = 4,\n\tATA_EHI_QUIET = 8,\n\tATA_EHI_NO_RECOVERY = 16,\n\tATA_EHI_DID_SOFTRESET = 65536,\n\tATA_EHI_DID_HARDRESET = 131072,\n\tATA_EHI_PRINTINFO = 262144,\n\tATA_EHI_SETMODE = 524288,\n\tATA_EHI_POST_SETMODE = 1048576,\n\tATA_EHI_DID_RESET = 196608,\n\tATA_EHI_TO_SLAVE_MASK = 12,\n\tATA_EH_MAX_TRIES = 5,\n\tATA_LINK_RESUME_TRIES = 5,\n\tATA_EH_DEV_TRIES = 3,\n\tATA_EH_PMP_TRIES = 5,\n\tATA_EH_PMP_LINK_TRIES = 3,\n\tSATA_PMP_RW_TIMEOUT = 3000,\n\tATA_EH_CMD_TIMEOUT_TABLE_SIZE = 8,\n\tATA_HORKAGE_DIAGNOSTIC = 1,\n\tATA_HORKAGE_NODMA = 2,\n\tATA_HORKAGE_NONCQ = 4,\n\tATA_HORKAGE_MAX_SEC_128 = 8,\n\tATA_HORKAGE_BROKEN_HPA = 16,\n\tATA_HORKAGE_DISABLE = 32,\n\tATA_HORKAGE_HPA_SIZE = 64,\n\tATA_HORKAGE_IVB = 256,\n\tATA_HORKAGE_STUCK_ERR = 512,\n\tATA_HORKAGE_BRIDGE_OK = 1024,\n\tATA_HORKAGE_ATAPI_MOD16_DMA = 2048,\n\tATA_HORKAGE_FIRMWARE_WARN = 4096,\n\tATA_HORKAGE_1_5_GBPS = 8192,\n\tATA_HORKAGE_NOSETXFER = 16384,\n\tATA_HORKAGE_BROKEN_FPDMA_AA = 32768,\n\tATA_HORKAGE_DUMP_ID = 65536,\n\tATA_HORKAGE_MAX_SEC_LBA48 = 131072,\n\tATA_HORKAGE_ATAPI_DMADIR = 262144,\n\tATA_HORKAGE_NO_NCQ_TRIM = 524288,\n\tATA_HORKAGE_NOLPM = 1048576,\n\tATA_HORKAGE_WD_BROKEN_LPM = 2097152,\n\tATA_HORKAGE_ZERO_AFTER_TRIM = 4194304,\n\tATA_HORKAGE_NO_DMA_LOG = 8388608,\n\tATA_HORKAGE_NOTRIM = 16777216,\n\tATA_HORKAGE_MAX_SEC_1024 = 33554432,\n\tATA_HORKAGE_MAX_TRIM_128M = 67108864,\n\tATA_HORKAGE_NO_NCQ_ON_ATI = 134217728,\n\tATA_HORKAGE_NO_ID_DEV_LOG = 268435456,\n\tATA_HORKAGE_NO_LOG_DIR = 536870912,\n\tATA_HORKAGE_NO_FUA = 1073741824,\n\tATA_DMA_MASK_ATA = 1,\n\tATA_DMA_MASK_ATAPI = 2,\n\tATA_DMA_MASK_CFA = 4,\n\tATAPI_READ = 0,\n\tATAPI_WRITE = 1,\n\tATAPI_READ_CD = 2,\n\tATAPI_PASS_THRU = 3,\n\tATAPI_MISC = 4,\n\tATA_TIMING_SETUP = 1,\n\tATA_TIMING_ACT8B = 2,\n\tATA_TIMING_REC8B = 4,\n\tATA_TIMING_CYC8B = 8,\n\tATA_TIMING_8BIT = 14,\n\tATA_TIMING_ACTIVE = 16,\n\tATA_TIMING_RECOVER = 32,\n\tATA_TIMING_DMACK_HOLD = 64,\n\tATA_TIMING_CYCLE = 128,\n\tATA_TIMING_UDMA = 256,\n\tATA_TIMING_ALL = 511,\n\tATA_ACPI_FILTER_SETXFER = 1,\n\tATA_ACPI_FILTER_LOCK = 2,\n\tATA_ACPI_FILTER_DIPM = 4,\n\tATA_ACPI_FILTER_FPDMA_OFFSET = 8,\n\tATA_ACPI_FILTER_FPDMA_AA = 16,\n\tATA_ACPI_FILTER_DEFAULT = 7,\n};\n\nenum {\n\tLINUX_MIB_NUM = 0,\n\tLINUX_MIB_SYNCOOKIESSENT = 1,\n\tLINUX_MIB_SYNCOOKIESRECV = 2,\n\tLINUX_MIB_SYNCOOKIESFAILED = 3,\n\tLINUX_MIB_EMBRYONICRSTS = 4,\n\tLINUX_MIB_PRUNECALLED = 5,\n\tLINUX_MIB_RCVPRUNED = 6,\n\tLINUX_MIB_OFOPRUNED = 7,\n\tLINUX_MIB_OUTOFWINDOWICMPS = 8,\n\tLINUX_MIB_LOCKDROPPEDICMPS = 9,\n\tLINUX_MIB_ARPFILTER = 10,\n\tLINUX_MIB_TIMEWAITED = 11,\n\tLINUX_MIB_TIMEWAITRECYCLED = 12,\n\tLINUX_MIB_TIMEWAITKILLED = 13,\n\tLINUX_MIB_PAWSACTIVEREJECTED = 14,\n\tLINUX_MIB_PAWSESTABREJECTED = 15,\n\tLINUX_MIB_DELAYEDACKS = 16,\n\tLINUX_MIB_DELAYEDACKLOCKED = 17,\n\tLINUX_MIB_DELAYEDACKLOST = 18,\n\tLINUX_MIB_LISTENOVERFLOWS = 19,\n\tLINUX_MIB_LISTENDROPS = 20,\n\tLINUX_MIB_TCPHPHITS = 21,\n\tLINUX_MIB_TCPPUREACKS = 22,\n\tLINUX_MIB_TCPHPACKS = 23,\n\tLINUX_MIB_TCPRENORECOVERY = 24,\n\tLINUX_MIB_TCPSACKRECOVERY = 25,\n\tLINUX_MIB_TCPSACKRENEGING = 26,\n\tLINUX_MIB_TCPSACKREORDER = 27,\n\tLINUX_MIB_TCPRENOREORDER = 28,\n\tLINUX_MIB_TCPTSREORDER = 29,\n\tLINUX_MIB_TCPFULLUNDO = 30,\n\tLINUX_MIB_TCPPARTIALUNDO = 31,\n\tLINUX_MIB_TCPDSACKUNDO = 32,\n\tLINUX_MIB_TCPLOSSUNDO = 33,\n\tLINUX_MIB_TCPLOSTRETRANSMIT = 34,\n\tLINUX_MIB_TCPRENOFAILURES = 35,\n\tLINUX_MIB_TCPSACKFAILURES = 36,\n\tLINUX_MIB_TCPLOSSFAILURES = 37,\n\tLINUX_MIB_TCPFASTRETRANS = 38,\n\tLINUX_MIB_TCPSLOWSTARTRETRANS = 39,\n\tLINUX_MIB_TCPTIMEOUTS = 40,\n\tLINUX_MIB_TCPLOSSPROBES = 41,\n\tLINUX_MIB_TCPLOSSPROBERECOVERY = 42,\n\tLINUX_MIB_TCPRENORECOVERYFAIL = 43,\n\tLINUX_MIB_TCPSACKRECOVERYFAIL = 44,\n\tLINUX_MIB_TCPRCVCOLLAPSED = 45,\n\tLINUX_MIB_TCPDSACKOLDSENT = 46,\n\tLINUX_MIB_TCPDSACKOFOSENT = 47,\n\tLINUX_MIB_TCPDSACKRECV = 48,\n\tLINUX_MIB_TCPDSACKOFORECV = 49,\n\tLINUX_MIB_TCPABORTONDATA = 50,\n\tLINUX_MIB_TCPABORTONCLOSE = 51,\n\tLINUX_MIB_TCPABORTONMEMORY = 52,\n\tLINUX_MIB_TCPABORTONTIMEOUT = 53,\n\tLINUX_MIB_TCPABORTONLINGER = 54,\n\tLINUX_MIB_TCPABORTFAILED = 55,\n\tLINUX_MIB_TCPMEMORYPRESSURES = 56,\n\tLINUX_MIB_TCPMEMORYPRESSURESCHRONO = 57,\n\tLINUX_MIB_TCPSACKDISCARD = 58,\n\tLINUX_MIB_TCPDSACKIGNOREDOLD = 59,\n\tLINUX_MIB_TCPDSACKIGNOREDNOUNDO = 60,\n\tLINUX_MIB_TCPSPURIOUSRTOS = 61,\n\tLINUX_MIB_TCPMD5NOTFOUND = 62,\n\tLINUX_MIB_TCPMD5UNEXPECTED = 63,\n\tLINUX_MIB_TCPMD5FAILURE = 64,\n\tLINUX_MIB_SACKSHIFTED = 65,\n\tLINUX_MIB_SACKMERGED = 66,\n\tLINUX_MIB_SACKSHIFTFALLBACK = 67,\n\tLINUX_MIB_TCPBACKLOGDROP = 68,\n\tLINUX_MIB_PFMEMALLOCDROP = 69,\n\tLINUX_MIB_TCPMINTTLDROP = 70,\n\tLINUX_MIB_TCPDEFERACCEPTDROP = 71,\n\tLINUX_MIB_IPRPFILTER = 72,\n\tLINUX_MIB_TCPTIMEWAITOVERFLOW = 73,\n\tLINUX_MIB_TCPREQQFULLDOCOOKIES = 74,\n\tLINUX_MIB_TCPREQQFULLDROP = 75,\n\tLINUX_MIB_TCPRETRANSFAIL = 76,\n\tLINUX_MIB_TCPRCVCOALESCE = 77,\n\tLINUX_MIB_TCPBACKLOGCOALESCE = 78,\n\tLINUX_MIB_TCPOFOQUEUE = 79,\n\tLINUX_MIB_TCPOFODROP = 80,\n\tLINUX_MIB_TCPOFOMERGE = 81,\n\tLINUX_MIB_TCPCHALLENGEACK = 82,\n\tLINUX_MIB_TCPSYNCHALLENGE = 83,\n\tLINUX_MIB_TCPFASTOPENACTIVE = 84,\n\tLINUX_MIB_TCPFASTOPENACTIVEFAIL = 85,\n\tLINUX_MIB_TCPFASTOPENPASSIVE = 86,\n\tLINUX_MIB_TCPFASTOPENPASSIVEFAIL = 87,\n\tLINUX_MIB_TCPFASTOPENLISTENOVERFLOW = 88,\n\tLINUX_MIB_TCPFASTOPENCOOKIEREQD = 89,\n\tLINUX_MIB_TCPFASTOPENBLACKHOLE = 90,\n\tLINUX_MIB_TCPSPURIOUS_RTX_HOSTQUEUES = 91,\n\tLINUX_MIB_BUSYPOLLRXPACKETS = 92,\n\tLINUX_MIB_TCPAUTOCORKING = 93,\n\tLINUX_MIB_TCPFROMZEROWINDOWADV = 94,\n\tLINUX_MIB_TCPTOZEROWINDOWADV = 95,\n\tLINUX_MIB_TCPWANTZEROWINDOWADV = 96,\n\tLINUX_MIB_TCPSYNRETRANS = 97,\n\tLINUX_MIB_TCPORIGDATASENT = 98,\n\tLINUX_MIB_TCPHYSTARTTRAINDETECT = 99,\n\tLINUX_MIB_TCPHYSTARTTRAINCWND = 100,\n\tLINUX_MIB_TCPHYSTARTDELAYDETECT = 101,\n\tLINUX_MIB_TCPHYSTARTDELAYCWND = 102,\n\tLINUX_MIB_TCPACKSKIPPEDSYNRECV = 103,\n\tLINUX_MIB_TCPACKSKIPPEDPAWS = 104,\n\tLINUX_MIB_TCPACKSKIPPEDSEQ = 105,\n\tLINUX_MIB_TCPACKSKIPPEDFINWAIT2 = 106,\n\tLINUX_MIB_TCPACKSKIPPEDTIMEWAIT = 107,\n\tLINUX_MIB_TCPACKSKIPPEDCHALLENGE = 108,\n\tLINUX_MIB_TCPWINPROBE = 109,\n\tLINUX_MIB_TCPKEEPALIVE = 110,\n\tLINUX_MIB_TCPMTUPFAIL = 111,\n\tLINUX_MIB_TCPMTUPSUCCESS = 112,\n\tLINUX_MIB_TCPDELIVERED = 113,\n\tLINUX_MIB_TCPDELIVEREDCE = 114,\n\tLINUX_MIB_TCPACKCOMPRESSED = 115,\n\tLINUX_MIB_TCPZEROWINDOWDROP = 116,\n\tLINUX_MIB_TCPRCVQDROP = 117,\n\tLINUX_MIB_TCPWQUEUETOOBIG = 118,\n\tLINUX_MIB_TCPFASTOPENPASSIVEALTKEY = 119,\n\tLINUX_MIB_TCPTIMEOUTREHASH = 120,\n\tLINUX_MIB_TCPDUPLICATEDATAREHASH = 121,\n\tLINUX_MIB_TCPDSACKRECVSEGS = 122,\n\tLINUX_MIB_TCPDSACKIGNOREDDUBIOUS = 123,\n\tLINUX_MIB_TCPMIGRATEREQSUCCESS = 124,\n\tLINUX_MIB_TCPMIGRATEREQFAILURE = 125,\n\tLINUX_MIB_TCPPLBREHASH = 126,\n\tLINUX_MIB_TCPAOREQUIRED = 127,\n\tLINUX_MIB_TCPAOBAD = 128,\n\tLINUX_MIB_TCPAOKEYNOTFOUND = 129,\n\tLINUX_MIB_TCPAOGOOD = 130,\n\tLINUX_MIB_TCPAODROPPEDICMPS = 131,\n\t__LINUX_MIB_MAX = 132,\n};\n\nenum {\n\tLINUX_MIB_TLSNUM = 0,\n\tLINUX_MIB_TLSCURRTXSW = 1,\n\tLINUX_MIB_TLSCURRRXSW = 2,\n\tLINUX_MIB_TLSCURRTXDEVICE = 3,\n\tLINUX_MIB_TLSCURRRXDEVICE = 4,\n\tLINUX_MIB_TLSTXSW = 5,\n\tLINUX_MIB_TLSRXSW = 6,\n\tLINUX_MIB_TLSTXDEVICE = 7,\n\tLINUX_MIB_TLSRXDEVICE = 8,\n\tLINUX_MIB_TLSDECRYPTERROR = 9,\n\tLINUX_MIB_TLSRXDEVICERESYNC = 10,\n\tLINUX_MIB_TLSDECRYPTRETRY = 11,\n\tLINUX_MIB_TLSRXNOPADVIOL = 12,\n\t__LINUX_MIB_TLSMAX = 13,\n};\n\nenum {\n\tLINUX_MIB_XFRMNUM = 0,\n\tLINUX_MIB_XFRMINERROR = 1,\n\tLINUX_MIB_XFRMINBUFFERERROR = 2,\n\tLINUX_MIB_XFRMINHDRERROR = 3,\n\tLINUX_MIB_XFRMINNOSTATES = 4,\n\tLINUX_MIB_XFRMINSTATEPROTOERROR = 5,\n\tLINUX_MIB_XFRMINSTATEMODEERROR = 6,\n\tLINUX_MIB_XFRMINSTATESEQERROR = 7,\n\tLINUX_MIB_XFRMINSTATEEXPIRED = 8,\n\tLINUX_MIB_XFRMINSTATEMISMATCH = 9,\n\tLINUX_MIB_XFRMINSTATEINVALID = 10,\n\tLINUX_MIB_XFRMINTMPLMISMATCH = 11,\n\tLINUX_MIB_XFRMINNOPOLS = 12,\n\tLINUX_MIB_XFRMINPOLBLOCK = 13,\n\tLINUX_MIB_XFRMINPOLERROR = 14,\n\tLINUX_MIB_XFRMOUTERROR = 15,\n\tLINUX_MIB_XFRMOUTBUNDLEGENERROR = 16,\n\tLINUX_MIB_XFRMOUTBUNDLECHECKERROR = 17,\n\tLINUX_MIB_XFRMOUTNOSTATES = 18,\n\tLINUX_MIB_XFRMOUTSTATEPROTOERROR = 19,\n\tLINUX_MIB_XFRMOUTSTATEMODEERROR = 20,\n\tLINUX_MIB_XFRMOUTSTATESEQERROR = 21,\n\tLINUX_MIB_XFRMOUTSTATEEXPIRED = 22,\n\tLINUX_MIB_XFRMOUTPOLBLOCK = 23,\n\tLINUX_MIB_XFRMOUTPOLDEAD = 24,\n\tLINUX_MIB_XFRMOUTPOLERROR = 25,\n\tLINUX_MIB_XFRMFWDHDRERROR = 26,\n\tLINUX_MIB_XFRMOUTSTATEINVALID = 27,\n\tLINUX_MIB_XFRMACQUIREERROR = 28,\n\tLINUX_MIB_XFRMOUTSTATEDIRERROR = 29,\n\tLINUX_MIB_XFRMINSTATEDIRERROR = 30,\n\t__LINUX_MIB_XFRMMAX = 31,\n};\n\nenum {\n\tLINUX_RAID_PARTITION = 253,\n};\n\nenum {\n\tLOGIC_PIO_INDIRECT = 0,\n\tLOGIC_PIO_CPU_MMIO = 1,\n};\n\nenum {\n\tLO_FLAGS_READ_ONLY = 1,\n\tLO_FLAGS_AUTOCLEAR = 4,\n\tLO_FLAGS_PARTSCAN = 8,\n\tLO_FLAGS_DIRECT_IO = 16,\n};\n\nenum {\n\tLRU_GEN_ANON = 0,\n\tLRU_GEN_FILE = 1,\n};\n\nenum {\n\tLRU_GEN_CORE = 0,\n\tLRU_GEN_MM_WALK = 1,\n\tLRU_GEN_NONLEAF_YOUNG = 2,\n\tNR_LRU_GEN_CAPS = 3,\n};\n\nenum {\n\tLWTUNNEL_IP_OPTS_UNSPEC = 0,\n\tLWTUNNEL_IP_OPTS_GENEVE = 1,\n\tLWTUNNEL_IP_OPTS_VXLAN = 2,\n\tLWTUNNEL_IP_OPTS_ERSPAN = 3,\n\t__LWTUNNEL_IP_OPTS_MAX = 4,\n};\n\nenum {\n\tLWTUNNEL_IP_OPT_ERSPAN_UNSPEC = 0,\n\tLWTUNNEL_IP_OPT_ERSPAN_VER = 1,\n\tLWTUNNEL_IP_OPT_ERSPAN_INDEX = 2,\n\tLWTUNNEL_IP_OPT_ERSPAN_DIR = 3,\n\tLWTUNNEL_IP_OPT_ERSPAN_HWID = 4,\n\t__LWTUNNEL_IP_OPT_ERSPAN_MAX = 5,\n};\n\nenum {\n\tLWTUNNEL_IP_OPT_GENEVE_UNSPEC = 0,\n\tLWTUNNEL_IP_OPT_GENEVE_CLASS = 1,\n\tLWTUNNEL_IP_OPT_GENEVE_TYPE = 2,\n\tLWTUNNEL_IP_OPT_GENEVE_DATA = 3,\n\t__LWTUNNEL_IP_OPT_GENEVE_MAX = 4,\n};\n\nenum {\n\tLWTUNNEL_IP_OPT_VXLAN_UNSPEC = 0,\n\tLWTUNNEL_IP_OPT_VXLAN_GBP = 1,\n\t__LWTUNNEL_IP_OPT_VXLAN_MAX = 2,\n};\n\nenum {\n\tLWTUNNEL_XMIT_DONE = 0,\n\tLWTUNNEL_XMIT_CONTINUE = 256,\n};\n\nenum {\n\tLWT_BPF_PROG_UNSPEC = 0,\n\tLWT_BPF_PROG_FD = 1,\n\tLWT_BPF_PROG_NAME = 2,\n\t__LWT_BPF_PROG_MAX = 3,\n};\n\nenum {\n\tLWT_BPF_UNSPEC = 0,\n\tLWT_BPF_IN = 1,\n\tLWT_BPF_OUT = 2,\n\tLWT_BPF_XMIT = 3,\n\tLWT_BPF_XMIT_HEADROOM = 4,\n\t__LWT_BPF_MAX = 5,\n};\n\nenum {\n\tLo_unbound = 0,\n\tLo_bound = 1,\n\tLo_rundown = 2,\n\tLo_deleting = 3,\n};\n\nenum {\n\tMATCH_MTR = 0,\n\tMATCH_MEQ = 1,\n\tMATCH_MLE = 2,\n\tMATCH_MLT = 3,\n\tMATCH_MGE = 4,\n\tMATCH_MGT = 5,\n};\n\nenum {\n\tMAX8925_IRQ_VCHG_DC_OVP = 0,\n\tMAX8925_IRQ_VCHG_DC_F = 1,\n\tMAX8925_IRQ_VCHG_DC_R = 2,\n\tMAX8925_IRQ_VCHG_THM_OK_R = 3,\n\tMAX8925_IRQ_VCHG_THM_OK_F = 4,\n\tMAX8925_IRQ_VCHG_SYSLOW_F = 5,\n\tMAX8925_IRQ_VCHG_SYSLOW_R = 6,\n\tMAX8925_IRQ_VCHG_RST = 7,\n\tMAX8925_IRQ_VCHG_DONE = 8,\n\tMAX8925_IRQ_VCHG_TOPOFF = 9,\n\tMAX8925_IRQ_VCHG_TMR_FAULT = 10,\n\tMAX8925_IRQ_GPM_RSTIN = 11,\n\tMAX8925_IRQ_GPM_MPL = 12,\n\tMAX8925_IRQ_GPM_SW_3SEC = 13,\n\tMAX8925_IRQ_GPM_EXTON_F = 14,\n\tMAX8925_IRQ_GPM_EXTON_R = 15,\n\tMAX8925_IRQ_GPM_SW_1SEC = 16,\n\tMAX8925_IRQ_GPM_SW_F = 17,\n\tMAX8925_IRQ_GPM_SW_R = 18,\n\tMAX8925_IRQ_GPM_SYSCKEN_F = 19,\n\tMAX8925_IRQ_GPM_SYSCKEN_R = 20,\n\tMAX8925_IRQ_RTC_ALARM1 = 21,\n\tMAX8925_IRQ_RTC_ALARM0 = 22,\n\tMAX8925_IRQ_TSC_STICK = 23,\n\tMAX8925_IRQ_TSC_NSTICK = 24,\n\tMAX8925_NR_IRQS = 25,\n};\n\nenum {\n\tMAX8998_IRQ_DCINF = 0,\n\tMAX8998_IRQ_DCINR = 1,\n\tMAX8998_IRQ_JIGF = 2,\n\tMAX8998_IRQ_JIGR = 3,\n\tMAX8998_IRQ_PWRONF = 4,\n\tMAX8998_IRQ_PWRONR = 5,\n\tMAX8998_IRQ_WTSREVNT = 6,\n\tMAX8998_IRQ_SMPLEVNT = 7,\n\tMAX8998_IRQ_ALARM1 = 8,\n\tMAX8998_IRQ_ALARM0 = 9,\n\tMAX8998_IRQ_ONKEY1S = 10,\n\tMAX8998_IRQ_TOPOFFR = 11,\n\tMAX8998_IRQ_DCINOVPR = 12,\n\tMAX8998_IRQ_CHGRSTF = 13,\n\tMAX8998_IRQ_DONER = 14,\n\tMAX8998_IRQ_CHGFAULT = 15,\n\tMAX8998_IRQ_LOBAT1 = 16,\n\tMAX8998_IRQ_LOBAT2 = 17,\n\tMAX8998_IRQ_NR = 18,\n};\n\nenum {\n\tMAX8998_REG_IRQ1 = 0,\n\tMAX8998_REG_IRQ2 = 1,\n\tMAX8998_REG_IRQ3 = 2,\n\tMAX8998_REG_IRQ4 = 3,\n\tMAX8998_REG_IRQM1 = 4,\n\tMAX8998_REG_IRQM2 = 5,\n\tMAX8998_REG_IRQM3 = 6,\n\tMAX8998_REG_IRQM4 = 7,\n\tMAX8998_REG_STATUS1 = 8,\n\tMAX8998_REG_STATUS2 = 9,\n\tMAX8998_REG_STATUSM1 = 10,\n\tMAX8998_REG_STATUSM2 = 11,\n\tMAX8998_REG_CHGR1 = 12,\n\tMAX8998_REG_CHGR2 = 13,\n\tMAX8998_REG_LDO_ACTIVE_DISCHARGE1 = 14,\n\tMAX8998_REG_LDO_ACTIVE_DISCHARGE2 = 15,\n\tMAX8998_REG_BUCK_ACTIVE_DISCHARGE3 = 16,\n\tMAX8998_REG_ONOFF1 = 17,\n\tMAX8998_REG_ONOFF2 = 18,\n\tMAX8998_REG_ONOFF3 = 19,\n\tMAX8998_REG_ONOFF4 = 20,\n\tMAX8998_REG_BUCK1_VOLTAGE1 = 21,\n\tMAX8998_REG_BUCK1_VOLTAGE2 = 22,\n\tMAX8998_REG_BUCK1_VOLTAGE3 = 23,\n\tMAX8998_REG_BUCK1_VOLTAGE4 = 24,\n\tMAX8998_REG_BUCK2_VOLTAGE1 = 25,\n\tMAX8998_REG_BUCK2_VOLTAGE2 = 26,\n\tMAX8998_REG_BUCK3 = 27,\n\tMAX8998_REG_BUCK4 = 28,\n\tMAX8998_REG_LDO2_LDO3 = 29,\n\tMAX8998_REG_LDO4 = 30,\n\tMAX8998_REG_LDO5 = 31,\n\tMAX8998_REG_LDO6 = 32,\n\tMAX8998_REG_LDO7 = 33,\n\tMAX8998_REG_LDO8_LDO9 = 34,\n\tMAX8998_REG_LDO10_LDO11 = 35,\n\tMAX8998_REG_LDO12 = 36,\n\tMAX8998_REG_LDO13 = 37,\n\tMAX8998_REG_LDO14 = 38,\n\tMAX8998_REG_LDO15 = 39,\n\tMAX8998_REG_LDO16 = 40,\n\tMAX8998_REG_LDO17 = 41,\n\tMAX8998_REG_BKCHR = 42,\n\tMAX8998_REG_LBCNFG1 = 43,\n\tMAX8998_REG_LBCNFG2 = 44,\n};\n\nenum {\n\tMAX_IORES_LEVEL = 5,\n};\n\nenum {\n\tMAX_OPT_ARGS = 3,\n};\n\nenum {\n\tMBE_REFERENCED_B = 0,\n\tMBE_REUSABLE_B = 1,\n};\n\nenum {\n\tMB_INODE_PA = 0,\n\tMB_GROUP_PA = 1,\n};\n\nenum {\n\tMCTP_TRACE_KEY_TIMEOUT = 0,\n\tMCTP_TRACE_KEY_REPLIED = 1,\n\tMCTP_TRACE_KEY_INVALIDATED = 2,\n\tMCTP_TRACE_KEY_CLOSED = 3,\n\tMCTP_TRACE_KEY_DROPPED = 4,\n};\n\nenum {\n\tMDBA_GET_ENTRY_UNSPEC = 0,\n\tMDBA_GET_ENTRY = 1,\n\tMDBA_GET_ENTRY_ATTRS = 2,\n\t__MDBA_GET_ENTRY_MAX = 3,\n};\n\nenum {\n\tMDBA_SET_ENTRY_UNSPEC = 0,\n\tMDBA_SET_ENTRY = 1,\n\tMDBA_SET_ENTRY_ATTRS = 2,\n\t__MDBA_SET_ENTRY_MAX = 3,\n};\n\nenum {\n\tMDIO_AN_C22 = 65504,\n};\n\nenum {\n\tMD_RESYNC_NONE = 0,\n\tMD_RESYNC_YIELDED = 1,\n\tMD_RESYNC_DELAYED = 2,\n\tMD_RESYNC_ACTIVE = 3,\n};\n\nenum {\n\tMED_R_CNT = 10,\n};\n\nenum {\n\tMED_R_DUR = 12,\n};\n\nenum {\n\tMED_W_CNT = 11,\n};\n\nenum {\n\tMED_W_DUR = 13,\n};\n\nenum {\n\tMEMBARRIER_FLAG_SYNC_CORE = 1,\n\tMEMBARRIER_FLAG_RSEQ = 2,\n};\n\nenum {\n\tMEMBARRIER_STATE_PRIVATE_EXPEDITED_READY = 1,\n\tMEMBARRIER_STATE_PRIVATE_EXPEDITED = 2,\n\tMEMBARRIER_STATE_GLOBAL_EXPEDITED_READY = 4,\n\tMEMBARRIER_STATE_GLOBAL_EXPEDITED = 8,\n\tMEMBARRIER_STATE_PRIVATE_EXPEDITED_SYNC_CORE_READY = 16,\n\tMEMBARRIER_STATE_PRIVATE_EXPEDITED_SYNC_CORE = 32,\n\tMEMBARRIER_STATE_PRIVATE_EXPEDITED_RSEQ_READY = 64,\n\tMEMBARRIER_STATE_PRIVATE_EXPEDITED_RSEQ = 128,\n};\n\nenum {\n\tMEMCG_LRU_NOP = 0,\n\tMEMCG_LRU_HEAD = 1,\n\tMEMCG_LRU_TAIL = 2,\n\tMEMCG_LRU_OLD = 3,\n\tMEMCG_LRU_YOUNG = 4,\n};\n\nenum {\n\tMEMMAP_ON_MEMORY_DISABLE = 0,\n\tMEMMAP_ON_MEMORY_ENABLE = 1,\n\tMEMMAP_ON_MEMORY_FORCE = 2,\n};\n\nenum {\n\tMEMORY_HOTPLUG_MIN_BOOTMEM_TYPE = 12,\n\tSECTION_INFO = 12,\n\tMIX_SECTION_INFO = 13,\n\tNODE_INFO = 14,\n\tMEMORY_HOTPLUG_MAX_BOOTMEM_TYPE = 14,\n};\n\nenum {\n\tMEMORY_RECLAIM_SWAPPINESS = 0,\n\tMEMORY_RECLAIM_NULL = 1,\n};\n\nenum {\n\tMEMREMAP_WB = 1,\n\tMEMREMAP_WT = 2,\n\tMEMREMAP_WC = 4,\n\tMEMREMAP_ENC = 8,\n\tMEMREMAP_DEC = 16,\n};\n\nenum {\n\tMEMTYPE_EXACT_MATCH = 0,\n\tMEMTYPE_END_MATCH = 1,\n};\n\nenum {\n\tMEM_LIFE = 4,\n};\n\nenum {\n\tMFC_STATIC = 1,\n\tMFC_OFFLOAD = 2,\n};\n\nenum {\n\tMILLION = 1000000,\n\tMIN_PERIOD = 1000,\n\tMAX_PERIOD = 1000000,\n\tMARGIN_MIN_PCT = 10,\n\tMARGIN_LOW_PCT = 20,\n\tMARGIN_TARGET_PCT = 50,\n\tINUSE_ADJ_STEP_PCT = 25,\n\tTIMER_SLACK_PCT = 1,\n\tWEIGHT_ONE = 65536,\n};\n\nenum {\n\tMIPI_DCS_NOP = 0,\n\tMIPI_DCS_SOFT_RESET = 1,\n\tMIPI_DCS_GET_COMPRESSION_MODE = 3,\n\tMIPI_DCS_GET_DISPLAY_ID = 4,\n\tMIPI_DCS_GET_ERROR_COUNT_ON_DSI = 5,\n\tMIPI_DCS_GET_RED_CHANNEL = 6,\n\tMIPI_DCS_GET_GREEN_CHANNEL = 7,\n\tMIPI_DCS_GET_BLUE_CHANNEL = 8,\n\tMIPI_DCS_GET_DISPLAY_STATUS = 9,\n\tMIPI_DCS_GET_POWER_MODE = 10,\n\tMIPI_DCS_GET_ADDRESS_MODE = 11,\n\tMIPI_DCS_GET_PIXEL_FORMAT = 12,\n\tMIPI_DCS_GET_DISPLAY_MODE = 13,\n\tMIPI_DCS_GET_SIGNAL_MODE = 14,\n\tMIPI_DCS_GET_DIAGNOSTIC_RESULT = 15,\n\tMIPI_DCS_ENTER_SLEEP_MODE = 16,\n\tMIPI_DCS_EXIT_SLEEP_MODE = 17,\n\tMIPI_DCS_ENTER_PARTIAL_MODE = 18,\n\tMIPI_DCS_ENTER_NORMAL_MODE = 19,\n\tMIPI_DCS_GET_IMAGE_CHECKSUM_RGB = 20,\n\tMIPI_DCS_GET_IMAGE_CHECKSUM_CT = 21,\n\tMIPI_DCS_EXIT_INVERT_MODE = 32,\n\tMIPI_DCS_ENTER_INVERT_MODE = 33,\n\tMIPI_DCS_SET_GAMMA_CURVE = 38,\n\tMIPI_DCS_SET_DISPLAY_OFF = 40,\n\tMIPI_DCS_SET_DISPLAY_ON = 41,\n\tMIPI_DCS_SET_COLUMN_ADDRESS = 42,\n\tMIPI_DCS_SET_PAGE_ADDRESS = 43,\n\tMIPI_DCS_WRITE_MEMORY_START = 44,\n\tMIPI_DCS_WRITE_LUT = 45,\n\tMIPI_DCS_READ_MEMORY_START = 46,\n\tMIPI_DCS_SET_PARTIAL_ROWS = 48,\n\tMIPI_DCS_SET_PARTIAL_COLUMNS = 49,\n\tMIPI_DCS_SET_SCROLL_AREA = 51,\n\tMIPI_DCS_SET_TEAR_OFF = 52,\n\tMIPI_DCS_SET_TEAR_ON = 53,\n\tMIPI_DCS_SET_ADDRESS_MODE = 54,\n\tMIPI_DCS_SET_SCROLL_START = 55,\n\tMIPI_DCS_EXIT_IDLE_MODE = 56,\n\tMIPI_DCS_ENTER_IDLE_MODE = 57,\n\tMIPI_DCS_SET_PIXEL_FORMAT = 58,\n\tMIPI_DCS_WRITE_MEMORY_CONTINUE = 60,\n\tMIPI_DCS_SET_3D_CONTROL = 61,\n\tMIPI_DCS_READ_MEMORY_CONTINUE = 62,\n\tMIPI_DCS_GET_3D_CONTROL = 63,\n\tMIPI_DCS_SET_VSYNC_TIMING = 64,\n\tMIPI_DCS_SET_TEAR_SCANLINE = 68,\n\tMIPI_DCS_GET_SCANLINE = 69,\n\tMIPI_DCS_SET_DISPLAY_BRIGHTNESS = 81,\n\tMIPI_DCS_GET_DISPLAY_BRIGHTNESS = 82,\n\tMIPI_DCS_WRITE_CONTROL_DISPLAY = 83,\n\tMIPI_DCS_GET_CONTROL_DISPLAY = 84,\n\tMIPI_DCS_WRITE_POWER_SAVE = 85,\n\tMIPI_DCS_GET_POWER_SAVE = 86,\n\tMIPI_DCS_SET_CABC_MIN_BRIGHTNESS = 94,\n\tMIPI_DCS_GET_CABC_MIN_BRIGHTNESS = 95,\n\tMIPI_DCS_READ_DDB_START = 161,\n\tMIPI_DCS_READ_PPS_START = 162,\n\tMIPI_DCS_READ_DDB_CONTINUE = 168,\n\tMIPI_DCS_READ_PPS_CONTINUE = 169,\n};\n\nenum {\n\tMIPI_DSI_V_SYNC_START = 1,\n\tMIPI_DSI_V_SYNC_END = 17,\n\tMIPI_DSI_H_SYNC_START = 33,\n\tMIPI_DSI_H_SYNC_END = 49,\n\tMIPI_DSI_COMPRESSION_MODE = 7,\n\tMIPI_DSI_END_OF_TRANSMISSION = 8,\n\tMIPI_DSI_COLOR_MODE_OFF = 2,\n\tMIPI_DSI_COLOR_MODE_ON = 18,\n\tMIPI_DSI_SHUTDOWN_PERIPHERAL = 34,\n\tMIPI_DSI_TURN_ON_PERIPHERAL = 50,\n\tMIPI_DSI_GENERIC_SHORT_WRITE_0_PARAM = 3,\n\tMIPI_DSI_GENERIC_SHORT_WRITE_1_PARAM = 19,\n\tMIPI_DSI_GENERIC_SHORT_WRITE_2_PARAM = 35,\n\tMIPI_DSI_GENERIC_READ_REQUEST_0_PARAM = 4,\n\tMIPI_DSI_GENERIC_READ_REQUEST_1_PARAM = 20,\n\tMIPI_DSI_GENERIC_READ_REQUEST_2_PARAM = 36,\n\tMIPI_DSI_DCS_SHORT_WRITE = 5,\n\tMIPI_DSI_DCS_SHORT_WRITE_PARAM = 21,\n\tMIPI_DSI_DCS_READ = 6,\n\tMIPI_DSI_EXECUTE_QUEUE = 22,\n\tMIPI_DSI_SET_MAXIMUM_RETURN_PACKET_SIZE = 55,\n\tMIPI_DSI_NULL_PACKET = 9,\n\tMIPI_DSI_BLANKING_PACKET = 25,\n\tMIPI_DSI_GENERIC_LONG_WRITE = 41,\n\tMIPI_DSI_DCS_LONG_WRITE = 57,\n\tMIPI_DSI_PICTURE_PARAMETER_SET = 10,\n\tMIPI_DSI_COMPRESSED_PIXEL_STREAM = 11,\n\tMIPI_DSI_LOOSELY_PACKED_PIXEL_STREAM_YCBCR20 = 12,\n\tMIPI_DSI_PACKED_PIXEL_STREAM_YCBCR24 = 28,\n\tMIPI_DSI_PACKED_PIXEL_STREAM_YCBCR16 = 44,\n\tMIPI_DSI_PACKED_PIXEL_STREAM_30 = 13,\n\tMIPI_DSI_PACKED_PIXEL_STREAM_36 = 29,\n\tMIPI_DSI_PACKED_PIXEL_STREAM_YCBCR12 = 61,\n\tMIPI_DSI_PACKED_PIXEL_STREAM_16 = 14,\n\tMIPI_DSI_PACKED_PIXEL_STREAM_18 = 30,\n\tMIPI_DSI_PIXEL_STREAM_3BYTE_18 = 46,\n\tMIPI_DSI_PACKED_PIXEL_STREAM_24 = 62,\n};\n\nenum {\n\tMIX_INFLIGHT = 2147483648,\n};\n\nenum {\n\tMLX_MC_RBT_SUPPORT = 1,\n\tMLX_MC_RBT_AVL = 8,\n};\n\nenum {\n\tMMOP_OFFLINE = 0,\n\tMMOP_ONLINE = 1,\n\tMMOP_ONLINE_KERNEL = 2,\n\tMMOP_ONLINE_MOVABLE = 3,\n};\n\nenum {\n\tMM_FILEPAGES = 0,\n\tMM_ANONPAGES = 1,\n\tMM_SWAPENTS = 2,\n\tMM_SHMEMPAGES = 3,\n\tNR_MM_COUNTERS = 4,\n};\n\nenum {\n\tMM_LEAF_TOTAL = 0,\n\tMM_LEAF_YOUNG = 1,\n\tMM_NONLEAF_FOUND = 2,\n\tMM_NONLEAF_ADDED = 3,\n\tNR_MM_STATS = 4,\n};\n\nenum {\n\tMODE_NONE = 0,\n\tMODE_ROUND_ROBIN = 1,\n\tMODE_PER_CPU = 2,\n\tMODE_MAX = 3,\n};\n\nenum {\n\tMOXA_SUPP_RS232 = 1,\n\tMOXA_SUPP_RS422 = 2,\n\tMOXA_SUPP_RS485 = 4,\n};\n\nenum {\n\tMPOL_DEFAULT = 0,\n\tMPOL_PREFERRED = 1,\n\tMPOL_BIND = 2,\n\tMPOL_INTERLEAVE = 3,\n\tMPOL_LOCAL = 4,\n\tMPOL_PREFERRED_MANY = 5,\n\tMPOL_WEIGHTED_INTERLEAVE = 6,\n\tMPOL_MAX = 7,\n};\n\nenum {\n\tMPTCP_CMSG_TS = 1,\n\tMPTCP_CMSG_INQ = 2,\n};\n\nenum {\n\tMPTCP_PM_ADDR_ATTR_UNSPEC = 0,\n\tMPTCP_PM_ADDR_ATTR_FAMILY = 1,\n\tMPTCP_PM_ADDR_ATTR_ID = 2,\n\tMPTCP_PM_ADDR_ATTR_ADDR4 = 3,\n\tMPTCP_PM_ADDR_ATTR_ADDR6 = 4,\n\tMPTCP_PM_ADDR_ATTR_PORT = 5,\n\tMPTCP_PM_ADDR_ATTR_FLAGS = 6,\n\tMPTCP_PM_ADDR_ATTR_IF_IDX = 7,\n\t__MPTCP_PM_ADDR_ATTR_MAX = 8,\n};\n\nenum {\n\tMPTCP_PM_ATTR_UNSPEC = 0,\n\tMPTCP_PM_ATTR_ADDR = 1,\n\tMPTCP_PM_ATTR_RCV_ADD_ADDRS = 2,\n\tMPTCP_PM_ATTR_SUBFLOWS = 3,\n\tMPTCP_PM_ATTR_TOKEN = 4,\n\tMPTCP_PM_ATTR_LOC_ID = 5,\n\tMPTCP_PM_ATTR_ADDR_REMOTE = 6,\n\t__MPTCP_ATTR_AFTER_LAST = 7,\n};\n\nenum {\n\tMPTCP_PM_CMD_UNSPEC = 0,\n\tMPTCP_PM_CMD_ADD_ADDR = 1,\n\tMPTCP_PM_CMD_DEL_ADDR = 2,\n\tMPTCP_PM_CMD_GET_ADDR = 3,\n\tMPTCP_PM_CMD_FLUSH_ADDRS = 4,\n\tMPTCP_PM_CMD_SET_LIMITS = 5,\n\tMPTCP_PM_CMD_GET_LIMITS = 6,\n\tMPTCP_PM_CMD_SET_FLAGS = 7,\n\tMPTCP_PM_CMD_ANNOUNCE = 8,\n\tMPTCP_PM_CMD_REMOVE = 9,\n\tMPTCP_PM_CMD_SUBFLOW_CREATE = 10,\n\tMPTCP_PM_CMD_SUBFLOW_DESTROY = 11,\n\t__MPTCP_PM_CMD_AFTER_LAST = 12,\n};\n\nenum {\n\tMPTCP_PM_ENDPOINT_ADDR = 1,\n\t__MPTCP_PM_ENDPOINT_MAX = 2,\n};\n\nenum {\n\tMPTCP_SUBFLOW_ATTR_UNSPEC = 0,\n\tMPTCP_SUBFLOW_ATTR_TOKEN_REM = 1,\n\tMPTCP_SUBFLOW_ATTR_TOKEN_LOC = 2,\n\tMPTCP_SUBFLOW_ATTR_RELWRITE_SEQ = 3,\n\tMPTCP_SUBFLOW_ATTR_MAP_SEQ = 4,\n\tMPTCP_SUBFLOW_ATTR_MAP_SFSEQ = 5,\n\tMPTCP_SUBFLOW_ATTR_SSN_OFFSET = 6,\n\tMPTCP_SUBFLOW_ATTR_MAP_DATALEN = 7,\n\tMPTCP_SUBFLOW_ATTR_FLAGS = 8,\n\tMPTCP_SUBFLOW_ATTR_ID_REM = 9,\n\tMPTCP_SUBFLOW_ATTR_ID_LOC = 10,\n\tMPTCP_SUBFLOW_ATTR_PAD = 11,\n\t__MPTCP_SUBFLOW_ATTR_MAX = 12,\n};\n\nenum {\n\tMSI_FLAG_USE_DEF_DOM_OPS = 1,\n\tMSI_FLAG_USE_DEF_CHIP_OPS = 2,\n\tMSI_FLAG_ACTIVATE_EARLY = 4,\n\tMSI_FLAG_MUST_REACTIVATE = 8,\n\tMSI_FLAG_DEV_SYSFS = 16,\n\tMSI_FLAG_ALLOC_SIMPLE_MSI_DESCS = 32,\n\tMSI_FLAG_FREE_MSI_DESCS = 64,\n\tMSI_FLAG_USE_DEV_FWNODE = 128,\n\tMSI_FLAG_PARENT_PM_DEV = 256,\n\tMSI_FLAG_PCI_MSI_MASK_PARENT = 512,\n\tMSI_GENERIC_FLAGS_MASK = 65535,\n\tMSI_DOMAIN_FLAGS_MASK = 4294901760,\n\tMSI_FLAG_MULTI_PCI_MSI = 65536,\n\tMSI_FLAG_PCI_MSIX = 131072,\n\tMSI_FLAG_LEVEL_CAPABLE = 262144,\n\tMSI_FLAG_MSIX_CONTIGUOUS = 524288,\n\tMSI_FLAG_PCI_MSIX_ALLOC_DYN = 1048576,\n};\n\nenum {\n\tM_I17 = 0,\n\tM_I20 = 1,\n\tM_I20_SR = 2,\n\tM_I24 = 3,\n\tM_I24_8_1 = 4,\n\tM_I24_10_1 = 5,\n\tM_I27_11_1 = 6,\n\tM_MINI = 7,\n\tM_MINI_3_1 = 8,\n\tM_MINI_4_1 = 9,\n\tM_MB = 10,\n\tM_MB_2 = 11,\n\tM_MB_3 = 12,\n\tM_MB_5_1 = 13,\n\tM_MB_6_1 = 14,\n\tM_MB_7_1 = 15,\n\tM_MB_SR = 16,\n\tM_MBA = 17,\n\tM_MBA_3 = 18,\n\tM_MBP = 19,\n\tM_MBP_2 = 20,\n\tM_MBP_2_2 = 21,\n\tM_MBP_SR = 22,\n\tM_MBP_4 = 23,\n\tM_MBP_5_1 = 24,\n\tM_MBP_5_2 = 25,\n\tM_MBP_5_3 = 26,\n\tM_MBP_6_1 = 27,\n\tM_MBP_6_2 = 28,\n\tM_MBP_7_1 = 29,\n\tM_MBP_8_2 = 30,\n\tM_UNKNOWN = 31,\n};\n\nenum {\n\tNAPIF_STATE_SCHED = 1,\n\tNAPIF_STATE_MISSED = 2,\n\tNAPIF_STATE_DISABLE = 4,\n\tNAPIF_STATE_NPSVC = 8,\n\tNAPIF_STATE_LISTED = 16,\n\tNAPIF_STATE_NO_BUSY_POLL = 32,\n\tNAPIF_STATE_IN_BUSY_POLL = 64,\n\tNAPIF_STATE_PREFER_BUSY_POLL = 128,\n\tNAPIF_STATE_THREADED = 256,\n\tNAPIF_STATE_SCHED_THREADED = 512,\n};\n\nenum {\n\tNAPI_F_PREFER_BUSY_POLL = 1,\n\tNAPI_F_END_ON_RESCHED = 2,\n};\n\nenum {\n\tNAPI_STATE_SCHED = 0,\n\tNAPI_STATE_MISSED = 1,\n\tNAPI_STATE_DISABLE = 2,\n\tNAPI_STATE_NPSVC = 3,\n\tNAPI_STATE_LISTED = 4,\n\tNAPI_STATE_NO_BUSY_POLL = 5,\n\tNAPI_STATE_IN_BUSY_POLL = 6,\n\tNAPI_STATE_PREFER_BUSY_POLL = 7,\n\tNAPI_STATE_THREADED = 8,\n\tNAPI_STATE_SCHED_THREADED = 9,\n};\n\nenum {\n\tNCSI_CAP_BASE = 0,\n\tNCSI_CAP_GENERIC = 0,\n\tNCSI_CAP_BC = 1,\n\tNCSI_CAP_MC = 2,\n\tNCSI_CAP_BUFFER = 3,\n\tNCSI_CAP_AEN = 4,\n\tNCSI_CAP_VLAN = 5,\n\tNCSI_CAP_MAX = 6,\n};\n\nenum {\n\tNCSI_CAP_GENERIC_HWA = 1,\n\tNCSI_CAP_GENERIC_HDS = 2,\n\tNCSI_CAP_GENERIC_FC = 4,\n\tNCSI_CAP_GENERIC_FC1 = 8,\n\tNCSI_CAP_GENERIC_MC = 16,\n\tNCSI_CAP_GENERIC_HWA_UNKNOWN = 0,\n\tNCSI_CAP_GENERIC_HWA_SUPPORT = 32,\n\tNCSI_CAP_GENERIC_HWA_NOT_SUPPORT = 64,\n\tNCSI_CAP_GENERIC_HWA_RESERVED = 96,\n\tNCSI_CAP_GENERIC_HWA_MASK = 96,\n\tNCSI_CAP_GENERIC_MASK = 127,\n\tNCSI_CAP_BC_ARP = 1,\n\tNCSI_CAP_BC_DHCPC = 2,\n\tNCSI_CAP_BC_DHCPS = 4,\n\tNCSI_CAP_BC_NETBIOS = 8,\n\tNCSI_CAP_BC_MASK = 15,\n\tNCSI_CAP_MC_IPV6_NEIGHBOR = 1,\n\tNCSI_CAP_MC_IPV6_ROUTER = 2,\n\tNCSI_CAP_MC_DHCPV6_RELAY = 4,\n\tNCSI_CAP_MC_DHCPV6_WELL_KNOWN = 8,\n\tNCSI_CAP_MC_IPV6_MLD = 16,\n\tNCSI_CAP_MC_IPV6_NEIGHBOR_S = 32,\n\tNCSI_CAP_MC_MASK = 63,\n\tNCSI_CAP_AEN_LSC = 1,\n\tNCSI_CAP_AEN_CR = 2,\n\tNCSI_CAP_AEN_HDS = 4,\n\tNCSI_CAP_AEN_MASK = 7,\n\tNCSI_CAP_VLAN_ONLY = 1,\n\tNCSI_CAP_VLAN_NO = 2,\n\tNCSI_CAP_VLAN_ANY = 4,\n\tNCSI_CAP_VLAN_MASK = 7,\n};\n\nenum {\n\tNCSI_MODE_BASE = 0,\n\tNCSI_MODE_ENABLE = 0,\n\tNCSI_MODE_TX_ENABLE = 1,\n\tNCSI_MODE_LINK = 2,\n\tNCSI_MODE_VLAN = 3,\n\tNCSI_MODE_BC = 4,\n\tNCSI_MODE_MC = 5,\n\tNCSI_MODE_AEN = 6,\n\tNCSI_MODE_FC = 7,\n\tNCSI_MODE_MAX = 8,\n};\n\nenum {\n\tNDA_UNSPEC = 0,\n\tNDA_DST = 1,\n\tNDA_LLADDR = 2,\n\tNDA_CACHEINFO = 3,\n\tNDA_PROBES = 4,\n\tNDA_VLAN = 5,\n\tNDA_PORT = 6,\n\tNDA_VNI = 7,\n\tNDA_IFINDEX = 8,\n\tNDA_MASTER = 9,\n\tNDA_LINK_NETNSID = 10,\n\tNDA_SRC_VNI = 11,\n\tNDA_PROTOCOL = 12,\n\tNDA_NH_ID = 13,\n\tNDA_FDB_EXT_ATTRS = 14,\n\tNDA_FLAGS_EXT = 15,\n\tNDA_NDM_STATE_MASK = 16,\n\tNDA_NDM_FLAGS_MASK = 17,\n\t__NDA_MAX = 18,\n};\n\nenum {\n\tNDD_UNARMED = 1,\n\tNDD_LOCKED = 2,\n\tNDD_SECURITY_OVERWRITE = 3,\n\tNDD_WORK_PENDING = 4,\n\tNDD_LABELING = 6,\n\tNDD_INCOHERENT = 7,\n\tNDD_REGISTER_SYNC = 8,\n\tND_IOCTL_MAX_BUFLEN = 4194304,\n\tND_CMD_MAX_ELEM = 5,\n\tND_CMD_MAX_ENVELOPE = 256,\n\tND_MAX_MAPPINGS = 32,\n\tND_REGION_PAGEMAP = 0,\n\tND_REGION_PERSIST_CACHE = 1,\n\tND_REGION_PERSIST_MEMCTRL = 2,\n\tND_REGION_ASYNC = 3,\n\tND_REGION_CXL = 4,\n\tDPA_RESOURCE_ADJUSTED = 1,\n};\n\nenum {\n\tNDTA_UNSPEC = 0,\n\tNDTA_NAME = 1,\n\tNDTA_THRESH1 = 2,\n\tNDTA_THRESH2 = 3,\n\tNDTA_THRESH3 = 4,\n\tNDTA_CONFIG = 5,\n\tNDTA_PARMS = 6,\n\tNDTA_STATS = 7,\n\tNDTA_GC_INTERVAL = 8,\n\tNDTA_PAD = 9,\n\t__NDTA_MAX = 10,\n};\n\nenum {\n\tNDTPA_UNSPEC = 0,\n\tNDTPA_IFINDEX = 1,\n\tNDTPA_REFCNT = 2,\n\tNDTPA_REACHABLE_TIME = 3,\n\tNDTPA_BASE_REACHABLE_TIME = 4,\n\tNDTPA_RETRANS_TIME = 5,\n\tNDTPA_GC_STALETIME = 6,\n\tNDTPA_DELAY_PROBE_TIME = 7,\n\tNDTPA_QUEUE_LEN = 8,\n\tNDTPA_APP_PROBES = 9,\n\tNDTPA_UCAST_PROBES = 10,\n\tNDTPA_MCAST_PROBES = 11,\n\tNDTPA_ANYCAST_DELAY = 12,\n\tNDTPA_PROXY_DELAY = 13,\n\tNDTPA_PROXY_QLEN = 14,\n\tNDTPA_LOCKTIME = 15,\n\tNDTPA_QUEUE_LENBYTES = 16,\n\tNDTPA_MCAST_REPROBES = 17,\n\tNDTPA_PAD = 18,\n\tNDTPA_INTERVAL_PROBE_TIME_MS = 19,\n\t__NDTPA_MAX = 20,\n};\n\nenum {\n\tNDUSEROPT_UNSPEC = 0,\n\tNDUSEROPT_SRCADDR = 1,\n\t__NDUSEROPT_MAX = 2,\n};\n\nenum {\n\tND_CMD_IMPLEMENTED = 0,\n\tND_CMD_ARS_CAP = 1,\n\tND_CMD_ARS_START = 2,\n\tND_CMD_ARS_STATUS = 3,\n\tND_CMD_CLEAR_ERROR = 4,\n\tND_CMD_SMART = 1,\n\tND_CMD_SMART_THRESHOLD = 2,\n\tND_CMD_DIMM_FLAGS = 3,\n\tND_CMD_GET_CONFIG_SIZE = 4,\n\tND_CMD_GET_CONFIG_DATA = 5,\n\tND_CMD_SET_CONFIG_DATA = 6,\n\tND_CMD_VENDOR_EFFECT_LOG_SIZE = 7,\n\tND_CMD_VENDOR_EFFECT_LOG = 8,\n\tND_CMD_VENDOR = 9,\n\tND_CMD_CALL = 10,\n};\n\nenum {\n\tND_MAX_LANES = 256,\n\tINT_LBASIZE_ALIGNMENT = 64,\n\tNVDIMM_IO_ATOMIC = 1,\n};\n\nenum {\n\tND_MIN_NAMESPACE_SIZE = 4096,\n};\n\nenum {\n\tNEIGH_ARP_TABLE = 0,\n\tNEIGH_ND_TABLE = 1,\n\tNEIGH_DN_TABLE = 2,\n\tNEIGH_NR_TABLES = 3,\n\tNEIGH_LINK_TABLE = 3,\n};\n\nenum {\n\tNEIGH_VAR_MCAST_PROBES = 0,\n\tNEIGH_VAR_UCAST_PROBES = 1,\n\tNEIGH_VAR_APP_PROBES = 2,\n\tNEIGH_VAR_MCAST_REPROBES = 3,\n\tNEIGH_VAR_RETRANS_TIME = 4,\n\tNEIGH_VAR_BASE_REACHABLE_TIME = 5,\n\tNEIGH_VAR_DELAY_PROBE_TIME = 6,\n\tNEIGH_VAR_INTERVAL_PROBE_TIME_MS = 7,\n\tNEIGH_VAR_GC_STALETIME = 8,\n\tNEIGH_VAR_QUEUE_LEN_BYTES = 9,\n\tNEIGH_VAR_PROXY_QLEN = 10,\n\tNEIGH_VAR_ANYCAST_DELAY = 11,\n\tNEIGH_VAR_PROXY_DELAY = 12,\n\tNEIGH_VAR_LOCKTIME = 13,\n\tNEIGH_VAR_QUEUE_LEN = 14,\n\tNEIGH_VAR_RETRANS_TIME_MS = 15,\n\tNEIGH_VAR_BASE_REACHABLE_TIME_MS = 16,\n\tNEIGH_VAR_GC_INTERVAL = 17,\n\tNEIGH_VAR_GC_THRESH1 = 18,\n\tNEIGH_VAR_GC_THRESH2 = 19,\n\tNEIGH_VAR_GC_THRESH3 = 20,\n\tNEIGH_VAR_MAX = 21,\n};\n\nenum {\n\tNESTED_SYNC_IMM_BIT = 0,\n\tNESTED_SYNC_TODO_BIT = 1,\n};\n\nenum {\n\tNETCONFA_UNSPEC = 0,\n\tNETCONFA_IFINDEX = 1,\n\tNETCONFA_FORWARDING = 2,\n\tNETCONFA_RP_FILTER = 3,\n\tNETCONFA_MC_FORWARDING = 4,\n\tNETCONFA_PROXY_NEIGH = 5,\n\tNETCONFA_IGNORE_ROUTES_WITH_LINKDOWN = 6,\n\tNETCONFA_INPUT = 7,\n\tNETCONFA_BC_FORWARDING = 8,\n\t__NETCONFA_MAX = 9,\n};\n\nenum {\n\tNETDEV_A_DEV_IFINDEX = 1,\n\tNETDEV_A_DEV_PAD = 2,\n\tNETDEV_A_DEV_XDP_FEATURES = 3,\n\tNETDEV_A_DEV_XDP_ZC_MAX_SEGS = 4,\n\tNETDEV_A_DEV_XDP_RX_METADATA_FEATURES = 5,\n\tNETDEV_A_DEV_XSK_FEATURES = 6,\n\t__NETDEV_A_DEV_MAX = 7,\n\tNETDEV_A_DEV_MAX = 6,\n};\n\nenum {\n\tNETDEV_A_NAPI_IFINDEX = 1,\n\tNETDEV_A_NAPI_ID = 2,\n\tNETDEV_A_NAPI_IRQ = 3,\n\tNETDEV_A_NAPI_PID = 4,\n\t__NETDEV_A_NAPI_MAX = 5,\n\tNETDEV_A_NAPI_MAX = 4,\n};\n\nenum {\n\tNETDEV_A_PAGE_POOL_ID = 1,\n\tNETDEV_A_PAGE_POOL_IFINDEX = 2,\n\tNETDEV_A_PAGE_POOL_NAPI_ID = 3,\n\tNETDEV_A_PAGE_POOL_INFLIGHT = 4,\n\tNETDEV_A_PAGE_POOL_INFLIGHT_MEM = 5,\n\tNETDEV_A_PAGE_POOL_DETACH_TIME = 6,\n\t__NETDEV_A_PAGE_POOL_MAX = 7,\n\tNETDEV_A_PAGE_POOL_MAX = 6,\n};\n\nenum {\n\tNETDEV_A_PAGE_POOL_STATS_INFO = 1,\n\tNETDEV_A_PAGE_POOL_STATS_ALLOC_FAST = 8,\n\tNETDEV_A_PAGE_POOL_STATS_ALLOC_SLOW = 9,\n\tNETDEV_A_PAGE_POOL_STATS_ALLOC_SLOW_HIGH_ORDER = 10,\n\tNETDEV_A_PAGE_POOL_STATS_ALLOC_EMPTY = 11,\n\tNETDEV_A_PAGE_POOL_STATS_ALLOC_REFILL = 12,\n\tNETDEV_A_PAGE_POOL_STATS_ALLOC_WAIVE = 13,\n\tNETDEV_A_PAGE_POOL_STATS_RECYCLE_CACHED = 14,\n\tNETDEV_A_PAGE_POOL_STATS_RECYCLE_CACHE_FULL = 15,\n\tNETDEV_A_PAGE_POOL_STATS_RECYCLE_RING = 16,\n\tNETDEV_A_PAGE_POOL_STATS_RECYCLE_RING_FULL = 17,\n\tNETDEV_A_PAGE_POOL_STATS_RECYCLE_RELEASED_REFCNT = 18,\n\t__NETDEV_A_PAGE_POOL_STATS_MAX = 19,\n\tNETDEV_A_PAGE_POOL_STATS_MAX = 18,\n};\n\nenum {\n\tNETDEV_A_QSTATS_IFINDEX = 1,\n\tNETDEV_A_QSTATS_QUEUE_TYPE = 2,\n\tNETDEV_A_QSTATS_QUEUE_ID = 3,\n\tNETDEV_A_QSTATS_SCOPE = 4,\n\tNETDEV_A_QSTATS_RX_PACKETS = 8,\n\tNETDEV_A_QSTATS_RX_BYTES = 9,\n\tNETDEV_A_QSTATS_TX_PACKETS = 10,\n\tNETDEV_A_QSTATS_TX_BYTES = 11,\n\tNETDEV_A_QSTATS_RX_ALLOC_FAIL = 12,\n\tNETDEV_A_QSTATS_RX_HW_DROPS = 13,\n\tNETDEV_A_QSTATS_RX_HW_DROP_OVERRUNS = 14,\n\tNETDEV_A_QSTATS_RX_CSUM_COMPLETE = 15,\n\tNETDEV_A_QSTATS_RX_CSUM_UNNECESSARY = 16,\n\tNETDEV_A_QSTATS_RX_CSUM_NONE = 17,\n\tNETDEV_A_QSTATS_RX_CSUM_BAD = 18,\n\tNETDEV_A_QSTATS_RX_HW_GRO_PACKETS = 19,\n\tNETDEV_A_QSTATS_RX_HW_GRO_BYTES = 20,\n\tNETDEV_A_QSTATS_RX_HW_GRO_WIRE_PACKETS = 21,\n\tNETDEV_A_QSTATS_RX_HW_GRO_WIRE_BYTES = 22,\n\tNETDEV_A_QSTATS_RX_HW_DROP_RATELIMITS = 23,\n\tNETDEV_A_QSTATS_TX_HW_DROPS = 24,\n\tNETDEV_A_QSTATS_TX_HW_DROP_ERRORS = 25,\n\tNETDEV_A_QSTATS_TX_CSUM_NONE = 26,\n\tNETDEV_A_QSTATS_TX_NEEDS_CSUM = 27,\n\tNETDEV_A_QSTATS_TX_HW_GSO_PACKETS = 28,\n\tNETDEV_A_QSTATS_TX_HW_GSO_BYTES = 29,\n\tNETDEV_A_QSTATS_TX_HW_GSO_WIRE_PACKETS = 30,\n\tNETDEV_A_QSTATS_TX_HW_GSO_WIRE_BYTES = 31,\n\tNETDEV_A_QSTATS_TX_HW_DROP_RATELIMITS = 32,\n\tNETDEV_A_QSTATS_TX_STOP = 33,\n\tNETDEV_A_QSTATS_TX_WAKE = 34,\n\t__NETDEV_A_QSTATS_MAX = 35,\n\tNETDEV_A_QSTATS_MAX = 34,\n};\n\nenum {\n\tNETDEV_A_QUEUE_ID = 1,\n\tNETDEV_A_QUEUE_IFINDEX = 2,\n\tNETDEV_A_QUEUE_TYPE = 3,\n\tNETDEV_A_QUEUE_NAPI_ID = 4,\n\t__NETDEV_A_QUEUE_MAX = 5,\n\tNETDEV_A_QUEUE_MAX = 4,\n};\n\nenum {\n\tNETDEV_CMD_DEV_GET = 1,\n\tNETDEV_CMD_DEV_ADD_NTF = 2,\n\tNETDEV_CMD_DEV_DEL_NTF = 3,\n\tNETDEV_CMD_DEV_CHANGE_NTF = 4,\n\tNETDEV_CMD_PAGE_POOL_GET = 5,\n\tNETDEV_CMD_PAGE_POOL_ADD_NTF = 6,\n\tNETDEV_CMD_PAGE_POOL_DEL_NTF = 7,\n\tNETDEV_CMD_PAGE_POOL_CHANGE_NTF = 8,\n\tNETDEV_CMD_PAGE_POOL_STATS_GET = 9,\n\tNETDEV_CMD_QUEUE_GET = 10,\n\tNETDEV_CMD_NAPI_GET = 11,\n\tNETDEV_CMD_QSTATS_GET = 12,\n\t__NETDEV_CMD_MAX = 13,\n\tNETDEV_CMD_MAX = 12,\n};\n\nenum {\n\tNETDEV_NLGRP_MGMT = 0,\n\tNETDEV_NLGRP_PAGE_POOL = 1,\n};\n\nenum {\n\tNETIF_F_SG_BIT = 0,\n\tNETIF_F_IP_CSUM_BIT = 1,\n\t__UNUSED_NETIF_F_1 = 2,\n\tNETIF_F_HW_CSUM_BIT = 3,\n\tNETIF_F_IPV6_CSUM_BIT = 4,\n\tNETIF_F_HIGHDMA_BIT = 5,\n\tNETIF_F_FRAGLIST_BIT = 6,\n\tNETIF_F_HW_VLAN_CTAG_TX_BIT = 7,\n\tNETIF_F_HW_VLAN_CTAG_RX_BIT = 8,\n\tNETIF_F_HW_VLAN_CTAG_FILTER_BIT = 9,\n\tNETIF_F_VLAN_CHALLENGED_BIT = 10,\n\tNETIF_F_GSO_BIT = 11,\n\tNETIF_F_LLTX_BIT = 12,\n\tNETIF_F_NETNS_LOCAL_BIT = 13,\n\tNETIF_F_GRO_BIT = 14,\n\tNETIF_F_LRO_BIT = 15,\n\tNETIF_F_GSO_SHIFT = 16,\n\tNETIF_F_TSO_BIT = 16,\n\tNETIF_F_GSO_ROBUST_BIT = 17,\n\tNETIF_F_TSO_ECN_BIT = 18,\n\tNETIF_F_TSO_MANGLEID_BIT = 19,\n\tNETIF_F_TSO6_BIT = 20,\n\tNETIF_F_FSO_BIT = 21,\n\tNETIF_F_GSO_GRE_BIT = 22,\n\tNETIF_F_GSO_GRE_CSUM_BIT = 23,\n\tNETIF_F_GSO_IPXIP4_BIT = 24,\n\tNETIF_F_GSO_IPXIP6_BIT = 25,\n\tNETIF_F_GSO_UDP_TUNNEL_BIT = 26,\n\tNETIF_F_GSO_UDP_TUNNEL_CSUM_BIT = 27,\n\tNETIF_F_GSO_PARTIAL_BIT = 28,\n\tNETIF_F_GSO_TUNNEL_REMCSUM_BIT = 29,\n\tNETIF_F_GSO_SCTP_BIT = 30,\n\tNETIF_F_GSO_ESP_BIT = 31,\n\tNETIF_F_GSO_UDP_BIT = 32,\n\tNETIF_F_GSO_UDP_L4_BIT = 33,\n\tNETIF_F_GSO_FRAGLIST_BIT = 34,\n\tNETIF_F_GSO_LAST = 34,\n\tNETIF_F_FCOE_CRC_BIT = 35,\n\tNETIF_F_SCTP_CRC_BIT = 36,\n\tNETIF_F_FCOE_MTU_BIT = 37,\n\tNETIF_F_NTUPLE_BIT = 38,\n\tNETIF_F_RXHASH_BIT = 39,\n\tNETIF_F_RXCSUM_BIT = 40,\n\tNETIF_F_NOCACHE_COPY_BIT = 41,\n\tNETIF_F_LOOPBACK_BIT = 42,\n\tNETIF_F_RXFCS_BIT = 43,\n\tNETIF_F_RXALL_BIT = 44,\n\tNETIF_F_HW_VLAN_STAG_TX_BIT = 45,\n\tNETIF_F_HW_VLAN_STAG_RX_BIT = 46,\n\tNETIF_F_HW_VLAN_STAG_FILTER_BIT = 47,\n\tNETIF_F_HW_L2FW_DOFFLOAD_BIT = 48,\n\tNETIF_F_HW_TC_BIT = 49,\n\tNETIF_F_HW_ESP_BIT = 50,\n\tNETIF_F_HW_ESP_TX_CSUM_BIT = 51,\n\tNETIF_F_RX_UDP_TUNNEL_PORT_BIT = 52,\n\tNETIF_F_HW_TLS_TX_BIT = 53,\n\tNETIF_F_HW_TLS_RX_BIT = 54,\n\tNETIF_F_GRO_HW_BIT = 55,\n\tNETIF_F_HW_TLS_RECORD_BIT = 56,\n\tNETIF_F_GRO_FRAGLIST_BIT = 57,\n\tNETIF_F_HW_MACSEC_BIT = 58,\n\tNETIF_F_GRO_UDP_FWD_BIT = 59,\n\tNETIF_F_HW_HSR_TAG_INS_BIT = 60,\n\tNETIF_F_HW_HSR_TAG_RM_BIT = 61,\n\tNETIF_F_HW_HSR_FWD_BIT = 62,\n\tNETIF_F_HW_HSR_DUP_BIT = 63,\n\tNETDEV_FEATURE_COUNT = 64,\n};\n\nenum {\n\tNETIF_MSG_DRV_BIT = 0,\n\tNETIF_MSG_PROBE_BIT = 1,\n\tNETIF_MSG_LINK_BIT = 2,\n\tNETIF_MSG_TIMER_BIT = 3,\n\tNETIF_MSG_IFDOWN_BIT = 4,\n\tNETIF_MSG_IFUP_BIT = 5,\n\tNETIF_MSG_RX_ERR_BIT = 6,\n\tNETIF_MSG_TX_ERR_BIT = 7,\n\tNETIF_MSG_TX_QUEUED_BIT = 8,\n\tNETIF_MSG_INTR_BIT = 9,\n\tNETIF_MSG_TX_DONE_BIT = 10,\n\tNETIF_MSG_RX_STATUS_BIT = 11,\n\tNETIF_MSG_PKTDATA_BIT = 12,\n\tNETIF_MSG_HW_BIT = 13,\n\tNETIF_MSG_WOL_BIT = 14,\n\tNETIF_MSG_CLASS_COUNT = 15,\n};\n\nenum {\n\tNETLINK_F_KERNEL_SOCKET = 0,\n\tNETLINK_F_RECV_PKTINFO = 1,\n\tNETLINK_F_BROADCAST_SEND_ERROR = 2,\n\tNETLINK_F_RECV_NO_ENOBUFS = 3,\n\tNETLINK_F_LISTEN_ALL_NSID = 4,\n\tNETLINK_F_CAP_ACK = 5,\n\tNETLINK_F_EXT_ACK = 6,\n\tNETLINK_F_STRICT_CHK = 7,\n};\n\nenum {\n\tNETLINK_UNCONNECTED = 0,\n\tNETLINK_CONNECTED = 1,\n};\n\nenum {\n\tNETNSA_NONE = 0,\n\tNETNSA_NSID = 1,\n\tNETNSA_PID = 2,\n\tNETNSA_FD = 3,\n\tNETNSA_TARGET_NSID = 4,\n\tNETNSA_CURRENT_NSID = 5,\n\t__NETNSA_MAX = 6,\n};\n\nenum {\n\tNET_DM_ATTR_PORT_NETDEV_IFINDEX = 0,\n\tNET_DM_ATTR_PORT_NETDEV_NAME = 1,\n\t__NET_DM_ATTR_PORT_MAX = 2,\n\tNET_DM_ATTR_PORT_MAX = 1,\n};\n\nenum {\n\tNET_DM_ATTR_STATS_DROPPED = 0,\n\t__NET_DM_ATTR_STATS_MAX = 1,\n\tNET_DM_ATTR_STATS_MAX = 0,\n};\n\nenum {\n\tNET_DM_CMD_UNSPEC = 0,\n\tNET_DM_CMD_ALERT = 1,\n\tNET_DM_CMD_CONFIG = 2,\n\tNET_DM_CMD_START = 3,\n\tNET_DM_CMD_STOP = 4,\n\tNET_DM_CMD_PACKET_ALERT = 5,\n\tNET_DM_CMD_CONFIG_GET = 6,\n\tNET_DM_CMD_CONFIG_NEW = 7,\n\tNET_DM_CMD_STATS_GET = 8,\n\tNET_DM_CMD_STATS_NEW = 9,\n\t_NET_DM_CMD_MAX = 10,\n};\n\nenum {\n\tNET_NS_INDEX = 0,\n\tUTS_NS_INDEX = 1,\n\tIPC_NS_INDEX = 2,\n\tPID_NS_INDEX = 3,\n\tUSER_NS_INDEX = 4,\n\tMNT_NS_INDEX = 5,\n\tCGROUP_NS_INDEX = 6,\n\tNR_NAMESPACES = 7,\n};\n\nenum {\n\tNEXTHOP_GRP_TYPE_MPATH = 0,\n\tNEXTHOP_GRP_TYPE_RES = 1,\n\t__NEXTHOP_GRP_TYPE_MAX = 2,\n};\n\nenum {\n\tNFPROTO_UNSPEC = 0,\n\tNFPROTO_INET = 1,\n\tNFPROTO_IPV4 = 2,\n\tNFPROTO_ARP = 3,\n\tNFPROTO_NETDEV = 5,\n\tNFPROTO_BRIDGE = 7,\n\tNFPROTO_IPV6 = 10,\n\tNFPROTO_NUMPROTO = 11,\n};\n\nenum {\n\tNHA_GROUP_STATS_ENTRY_UNSPEC = 0,\n\tNHA_GROUP_STATS_ENTRY_ID = 1,\n\tNHA_GROUP_STATS_ENTRY_PACKETS = 2,\n\tNHA_GROUP_STATS_ENTRY_PACKETS_HW = 3,\n\t__NHA_GROUP_STATS_ENTRY_MAX = 4,\n};\n\nenum {\n\tNHA_GROUP_STATS_UNSPEC = 0,\n\tNHA_GROUP_STATS_ENTRY = 1,\n\t__NHA_GROUP_STATS_MAX = 2,\n};\n\nenum {\n\tNHA_RES_BUCKET_UNSPEC = 0,\n\tNHA_RES_BUCKET_PAD = 0,\n\tNHA_RES_BUCKET_INDEX = 1,\n\tNHA_RES_BUCKET_IDLE_TIME = 2,\n\tNHA_RES_BUCKET_NH_ID = 3,\n\t__NHA_RES_BUCKET_MAX = 4,\n};\n\nenum {\n\tNHA_RES_GROUP_UNSPEC = 0,\n\tNHA_RES_GROUP_PAD = 0,\n\tNHA_RES_GROUP_BUCKETS = 1,\n\tNHA_RES_GROUP_IDLE_TIMER = 2,\n\tNHA_RES_GROUP_UNBALANCED_TIMER = 3,\n\tNHA_RES_GROUP_UNBALANCED_TIME = 4,\n\t__NHA_RES_GROUP_MAX = 5,\n};\n\nenum {\n\tNHA_UNSPEC = 0,\n\tNHA_ID = 1,\n\tNHA_GROUP = 2,\n\tNHA_GROUP_TYPE = 3,\n\tNHA_BLACKHOLE = 4,\n\tNHA_OIF = 5,\n\tNHA_GATEWAY = 6,\n\tNHA_ENCAP_TYPE = 7,\n\tNHA_ENCAP = 8,\n\tNHA_GROUPS = 9,\n\tNHA_MASTER = 10,\n\tNHA_FDB = 11,\n\tNHA_RES_GROUP = 12,\n\tNHA_RES_BUCKET = 13,\n\tNHA_OP_FLAGS = 14,\n\tNHA_GROUP_STATS = 15,\n\tNHA_HW_STATS_ENABLE = 16,\n\tNHA_HW_STATS_USED = 17,\n\t__NHA_MAX = 18,\n};\n\nenum {\n\tNLA_UNSPEC = 0,\n\tNLA_U8 = 1,\n\tNLA_U16 = 2,\n\tNLA_U32 = 3,\n\tNLA_U64 = 4,\n\tNLA_STRING = 5,\n\tNLA_FLAG = 6,\n\tNLA_MSECS = 7,\n\tNLA_NESTED = 8,\n\tNLA_NESTED_ARRAY = 9,\n\tNLA_NUL_STRING = 10,\n\tNLA_BINARY = 11,\n\tNLA_S8 = 12,\n\tNLA_S16 = 13,\n\tNLA_S32 = 14,\n\tNLA_S64 = 15,\n\tNLA_BITFIELD32 = 16,\n\tNLA_REJECT = 17,\n\tNLA_BE16 = 18,\n\tNLA_BE32 = 19,\n\tNLA_SINT = 20,\n\tNLA_UINT = 21,\n\t__NLA_TYPE_MAX = 22,\n};\n\nenum {\n\tNLBL_CALIPSO_A_UNSPEC = 0,\n\tNLBL_CALIPSO_A_DOI = 1,\n\tNLBL_CALIPSO_A_MTYPE = 2,\n\t__NLBL_CALIPSO_A_MAX = 3,\n};\n\nenum {\n\tNLBL_CALIPSO_C_UNSPEC = 0,\n\tNLBL_CALIPSO_C_ADD = 1,\n\tNLBL_CALIPSO_C_REMOVE = 2,\n\tNLBL_CALIPSO_C_LIST = 3,\n\tNLBL_CALIPSO_C_LISTALL = 4,\n\t__NLBL_CALIPSO_C_MAX = 5,\n};\n\nenum {\n\tNLBL_CIPSOV4_A_UNSPEC = 0,\n\tNLBL_CIPSOV4_A_DOI = 1,\n\tNLBL_CIPSOV4_A_MTYPE = 2,\n\tNLBL_CIPSOV4_A_TAG = 3,\n\tNLBL_CIPSOV4_A_TAGLST = 4,\n\tNLBL_CIPSOV4_A_MLSLVLLOC = 5,\n\tNLBL_CIPSOV4_A_MLSLVLREM = 6,\n\tNLBL_CIPSOV4_A_MLSLVL = 7,\n\tNLBL_CIPSOV4_A_MLSLVLLST = 8,\n\tNLBL_CIPSOV4_A_MLSCATLOC = 9,\n\tNLBL_CIPSOV4_A_MLSCATREM = 10,\n\tNLBL_CIPSOV4_A_MLSCAT = 11,\n\tNLBL_CIPSOV4_A_MLSCATLST = 12,\n\t__NLBL_CIPSOV4_A_MAX = 13,\n};\n\nenum {\n\tNLBL_CIPSOV4_C_UNSPEC = 0,\n\tNLBL_CIPSOV4_C_ADD = 1,\n\tNLBL_CIPSOV4_C_REMOVE = 2,\n\tNLBL_CIPSOV4_C_LIST = 3,\n\tNLBL_CIPSOV4_C_LISTALL = 4,\n\t__NLBL_CIPSOV4_C_MAX = 5,\n};\n\nenum {\n\tNLBL_MGMT_A_UNSPEC = 0,\n\tNLBL_MGMT_A_DOMAIN = 1,\n\tNLBL_MGMT_A_PROTOCOL = 2,\n\tNLBL_MGMT_A_VERSION = 3,\n\tNLBL_MGMT_A_CV4DOI = 4,\n\tNLBL_MGMT_A_IPV6ADDR = 5,\n\tNLBL_MGMT_A_IPV6MASK = 6,\n\tNLBL_MGMT_A_IPV4ADDR = 7,\n\tNLBL_MGMT_A_IPV4MASK = 8,\n\tNLBL_MGMT_A_ADDRSELECTOR = 9,\n\tNLBL_MGMT_A_SELECTORLIST = 10,\n\tNLBL_MGMT_A_FAMILY = 11,\n\tNLBL_MGMT_A_CLPDOI = 12,\n\t__NLBL_MGMT_A_MAX = 13,\n};\n\nenum {\n\tNLBL_MGMT_C_UNSPEC = 0,\n\tNLBL_MGMT_C_ADD = 1,\n\tNLBL_MGMT_C_REMOVE = 2,\n\tNLBL_MGMT_C_LISTALL = 3,\n\tNLBL_MGMT_C_ADDDEF = 4,\n\tNLBL_MGMT_C_REMOVEDEF = 5,\n\tNLBL_MGMT_C_LISTDEF = 6,\n\tNLBL_MGMT_C_PROTOCOLS = 7,\n\tNLBL_MGMT_C_VERSION = 8,\n\t__NLBL_MGMT_C_MAX = 9,\n};\n\nenum {\n\tNLBL_UNLABEL_A_UNSPEC = 0,\n\tNLBL_UNLABEL_A_ACPTFLG = 1,\n\tNLBL_UNLABEL_A_IPV6ADDR = 2,\n\tNLBL_UNLABEL_A_IPV6MASK = 3,\n\tNLBL_UNLABEL_A_IPV4ADDR = 4,\n\tNLBL_UNLABEL_A_IPV4MASK = 5,\n\tNLBL_UNLABEL_A_IFACE = 6,\n\tNLBL_UNLABEL_A_SECCTX = 7,\n\t__NLBL_UNLABEL_A_MAX = 8,\n};\n\nenum {\n\tNLBL_UNLABEL_C_UNSPEC = 0,\n\tNLBL_UNLABEL_C_ACCEPT = 1,\n\tNLBL_UNLABEL_C_LIST = 2,\n\tNLBL_UNLABEL_C_STATICADD = 3,\n\tNLBL_UNLABEL_C_STATICREMOVE = 4,\n\tNLBL_UNLABEL_C_STATICLIST = 5,\n\tNLBL_UNLABEL_C_STATICADDDEF = 6,\n\tNLBL_UNLABEL_C_STATICREMOVEDEF = 7,\n\tNLBL_UNLABEL_C_STATICLISTDEF = 8,\n\t__NLBL_UNLABEL_C_MAX = 9,\n};\n\nenum {\n\tNMI_LOCAL = 0,\n\tNMI_UNKNOWN = 1,\n\tNMI_SERR = 2,\n\tNMI_IO_CHECK = 3,\n\tNMI_MAX = 4,\n};\n\nenum {\n\tNODE_ACCESS_CLASS_GENPORT_SINK_LOCAL = 2,\n\tNODE_ACCESS_CLASS_GENPORT_SINK_CPU = 3,\n\tNODE_ACCESS_CLASS_MAX = 4,\n};\n\nenum {\n\tNONE_FORCE_HPET_RESUME = 0,\n\tOLD_ICH_FORCE_HPET_RESUME = 1,\n\tICH_FORCE_HPET_RESUME = 2,\n\tVT8237_FORCE_HPET_RESUME = 3,\n\tNVIDIA_FORCE_HPET_RESUME = 4,\n\tATI_FORCE_HPET_RESUME = 5,\n};\n\nenum {\n\tNSINDEX_SIG_LEN = 16,\n\tNSINDEX_ALIGN = 256,\n\tNSINDEX_SEQ_MASK = 3,\n\tNSLABEL_UUID_LEN = 16,\n\tNSLABEL_NAME_LEN = 64,\n\tNSLABEL_FLAG_ROLABEL = 1,\n\tNSLABEL_FLAG_LOCAL = 2,\n\tNSLABEL_FLAG_BTT = 4,\n\tNSLABEL_FLAG_UPDATING = 8,\n\tBTT_ALIGN = 4096,\n\tBTTINFO_SIG_LEN = 16,\n\tBTTINFO_UUID_LEN = 16,\n\tBTTINFO_FLAG_ERROR = 1,\n\tBTTINFO_MAJOR_VERSION = 1,\n\tND_LABEL_MIN_SIZE = 1024,\n\tND_LABEL_ID_SIZE = 50,\n\tND_NSINDEX_INIT = 1,\n};\n\nenum {\n\tNUM_TRIAL_SAMPLES = 8192,\n\tMAX_SAMPLES_PER_BIT = 66,\n};\n\nenum {\n\tNVMEM_ADD = 1,\n\tNVMEM_REMOVE = 2,\n\tNVMEM_CELL_ADD = 3,\n\tNVMEM_CELL_REMOVE = 4,\n\tNVMEM_LAYOUT_ADD = 5,\n\tNVMEM_LAYOUT_REMOVE = 6,\n};\n\nenum {\n\tNVME_AEN_BIT_NS_ATTR = 8,\n\tNVME_AEN_BIT_FW_ACT = 9,\n\tNVME_AEN_BIT_ANA_CHANGE = 11,\n\tNVME_AEN_BIT_DISC_CHANGE = 31,\n};\n\nenum {\n\tNVME_CC_ENABLE = 1,\n\tNVME_CC_EN_SHIFT = 0,\n\tNVME_CC_CSS_SHIFT = 4,\n\tNVME_CC_MPS_SHIFT = 7,\n\tNVME_CC_AMS_SHIFT = 11,\n\tNVME_CC_SHN_SHIFT = 14,\n\tNVME_CC_IOSQES_SHIFT = 16,\n\tNVME_CC_IOCQES_SHIFT = 20,\n\tNVME_CC_CSS_NVM = 0,\n\tNVME_CC_CSS_CSI = 96,\n\tNVME_CC_CSS_MASK = 112,\n\tNVME_CC_AMS_RR = 0,\n\tNVME_CC_AMS_WRRU = 2048,\n\tNVME_CC_AMS_VS = 14336,\n\tNVME_CC_SHN_NONE = 0,\n\tNVME_CC_SHN_NORMAL = 16384,\n\tNVME_CC_SHN_ABRUPT = 32768,\n\tNVME_CC_SHN_MASK = 49152,\n\tNVME_CC_IOSQES = 393216,\n\tNVME_CC_IOCQES = 4194304,\n\tNVME_CC_CRIME = 16777216,\n};\n\nenum {\n\tNVME_CSTS_RDY = 1,\n\tNVME_CSTS_CFS = 2,\n\tNVME_CSTS_NSSRO = 16,\n\tNVME_CSTS_PP = 32,\n\tNVME_CSTS_SHST_NORMAL = 0,\n\tNVME_CSTS_SHST_OCCUR = 4,\n\tNVME_CSTS_SHST_CMPLT = 8,\n\tNVME_CSTS_SHST_MASK = 12,\n};\n\nenum {\n\tNVME_REG_CAP = 0,\n\tNVME_REG_VS = 8,\n\tNVME_REG_INTMS = 12,\n\tNVME_REG_INTMC = 16,\n\tNVME_REG_CC = 20,\n\tNVME_REG_CSTS = 28,\n\tNVME_REG_NSSR = 32,\n\tNVME_REG_AQA = 36,\n\tNVME_REG_ASQ = 40,\n\tNVME_REG_ACQ = 48,\n\tNVME_REG_CMBLOC = 56,\n\tNVME_REG_CMBSZ = 60,\n\tNVME_REG_BPINFO = 64,\n\tNVME_REG_BPRSEL = 68,\n\tNVME_REG_BPMBL = 72,\n\tNVME_REG_CMBMSC = 80,\n\tNVME_REG_CRTO = 104,\n\tNVME_REG_PMRCAP = 3584,\n\tNVME_REG_PMRCTL = 3588,\n\tNVME_REG_PMRSTS = 3592,\n\tNVME_REG_PMREBS = 3596,\n\tNVME_REG_PMRSWTP = 3600,\n\tNVME_REG_DBS = 4096,\n};\n\nenum {\n\tOD_NORMAL_SAMPLE = 0,\n\tOD_SUB_SAMPLE = 1,\n};\n\nenum {\n\tONLINE_POLICY_CONTIG_ZONES = 0,\n\tONLINE_POLICY_AUTO_MOVABLE = 1,\n};\n\nenum {\n\tOPT_SOURCE = 0,\n\tOPT_SUBTYPE = 1,\n\tOPT_FD = 2,\n\tOPT_ROOTMODE = 3,\n\tOPT_USER_ID = 4,\n\tOPT_GROUP_ID = 5,\n\tOPT_DEFAULT_PERMISSIONS = 6,\n\tOPT_ALLOW_OTHER = 7,\n\tOPT_MAX_READ = 8,\n\tOPT_BLKSIZE = 9,\n\tOPT_ERR = 10,\n};\n\nenum {\n\tOPT_UID = 0,\n\tOPT_GID = 1,\n\tOPT_MODE = 2,\n\tOPT_DELEGATE_CMDS = 3,\n\tOPT_DELEGATE_MAPS = 4,\n\tOPT_DELEGATE_PROGS = 5,\n\tOPT_DELEGATE_ATTACHS = 6,\n};\n\nenum {\n\tOVERRIDE_NONE = 0,\n\tOVERRIDE_BASE = 1,\n\tOVERRIDE_STRIDE = 2,\n\tOVERRIDE_HEIGHT = 4,\n\tOVERRIDE_WIDTH = 8,\n};\n\nenum {\n\tOpt_bsd_df = 0,\n\tOpt_minix_df = 1,\n\tOpt_grpid = 2,\n\tOpt_nogrpid = 3,\n\tOpt_resgid = 4,\n\tOpt_resuid = 5,\n\tOpt_sb = 6,\n\tOpt_nouid32 = 7,\n\tOpt_debug = 8,\n\tOpt_removed = 9,\n\tOpt_user_xattr = 10,\n\tOpt_acl = 11,\n\tOpt_auto_da_alloc = 12,\n\tOpt_noauto_da_alloc = 13,\n\tOpt_noload = 14,\n\tOpt_commit = 15,\n\tOpt_min_batch_time = 16,\n\tOpt_max_batch_time = 17,\n\tOpt_journal_dev = 18,\n\tOpt_journal_path = 19,\n\tOpt_journal_checksum = 20,\n\tOpt_journal_async_commit = 21,\n\tOpt_abort = 22,\n\tOpt_data_journal = 23,\n\tOpt_data_ordered = 24,\n\tOpt_data_writeback = 25,\n\tOpt_data_err_abort = 26,\n\tOpt_data_err_ignore = 27,\n\tOpt_test_dummy_encryption = 28,\n\tOpt_inlinecrypt = 29,\n\tOpt_usrjquota = 30,\n\tOpt_grpjquota = 31,\n\tOpt_quota = 32,\n\tOpt_noquota = 33,\n\tOpt_barrier = 34,\n\tOpt_nobarrier = 35,\n\tOpt_err = 36,\n\tOpt_usrquota = 37,\n\tOpt_grpquota = 38,\n\tOpt_prjquota = 39,\n\tOpt_dax = 40,\n\tOpt_dax_always = 41,\n\tOpt_dax_inode = 42,\n\tOpt_dax_never = 43,\n\tOpt_stripe = 44,\n\tOpt_delalloc = 45,\n\tOpt_nodelalloc = 46,\n\tOpt_warn_on_error = 47,\n\tOpt_nowarn_on_error = 48,\n\tOpt_mblk_io_submit = 49,\n\tOpt_debug_want_extra_isize = 50,\n\tOpt_nomblk_io_submit = 51,\n\tOpt_block_validity = 52,\n\tOpt_noblock_validity = 53,\n\tOpt_inode_readahead_blks = 54,\n\tOpt_journal_ioprio = 55,\n\tOpt_dioread_nolock = 56,\n\tOpt_dioread_lock = 57,\n\tOpt_discard = 58,\n\tOpt_nodiscard = 59,\n\tOpt_init_itable = 60,\n\tOpt_noinit_itable = 61,\n\tOpt_max_dir_size_kb = 62,\n\tOpt_nojournal_checksum = 63,\n\tOpt_nombcache = 64,\n\tOpt_no_prefetch_block_bitmaps = 65,\n\tOpt_mb_optimize_scan = 66,\n\tOpt_errors = 67,\n\tOpt_data = 68,\n\tOpt_data_err = 69,\n\tOpt_jqfmt = 70,\n\tOpt_dax_type = 71,\n};\n\nenum {\n\tOpt_check = 0,\n\tOpt_uid = 1,\n\tOpt_gid = 2,\n\tOpt_umask = 3,\n\tOpt_dmask = 4,\n\tOpt_fmask = 5,\n\tOpt_allow_utime = 6,\n\tOpt_codepage = 7,\n\tOpt_usefree = 8,\n\tOpt_nocase = 9,\n\tOpt_quiet = 10,\n\tOpt_showexec = 11,\n\tOpt_debug___2 = 12,\n\tOpt_immutable = 13,\n\tOpt_dots = 14,\n\tOpt_dotsOK = 15,\n\tOpt_charset = 16,\n\tOpt_shortname = 17,\n\tOpt_utf8 = 18,\n\tOpt_utf8_bool = 19,\n\tOpt_uni_xl = 20,\n\tOpt_uni_xl_bool = 21,\n\tOpt_nonumtail = 22,\n\tOpt_nonumtail_bool = 23,\n\tOpt_obsolete = 24,\n\tOpt_flush = 25,\n\tOpt_tz = 26,\n\tOpt_rodir = 27,\n\tOpt_errors___2 = 28,\n\tOpt_discard___2 = 29,\n\tOpt_nfs = 30,\n\tOpt_nfs_enum = 31,\n\tOpt_time_offset = 32,\n\tOpt_dos1xfloppy = 33,\n};\n\nenum {\n\tOpt_default = 0,\n\tOpt_ecryptfs = 1,\n\tOpt_enc32 = 2,\n\tOpt_error = 3,\n};\n\nenum {\n\tOpt_err___2 = 0,\n\tOpt_keyhandle = 1,\n\tOpt_keyauth = 2,\n\tOpt_blobauth = 3,\n\tOpt_pcrinfo = 4,\n\tOpt_pcrlock = 5,\n\tOpt_migratable = 6,\n\tOpt_hash = 7,\n\tOpt_policydigest = 8,\n\tOpt_policyhandle = 9,\n};\n\nenum {\n\tOpt_err___3 = 0,\n\tOpt_enc = 1,\n\tOpt_hash___2 = 2,\n};\n\nenum {\n\tOpt_err___4 = 0,\n\tOpt_new = 1,\n\tOpt_load = 2,\n\tOpt_update = 3,\n};\n\nenum {\n\tOpt_error___2 = -1,\n\tOpt_context = 0,\n\tOpt_defcontext = 1,\n\tOpt_fscontext = 2,\n\tOpt_rootcontext = 3,\n\tOpt_seclabel = 4,\n};\n\nenum {\n\tOpt_error___3 = -1,\n\tOpt_fsdefault = 0,\n\tOpt_fsfloor = 1,\n\tOpt_fshat = 2,\n\tOpt_fsroot = 3,\n\tOpt_fstransmute = 4,\n};\n\nenum {\n\tOpt_kmsg_bytes = 0,\n\tOpt_err___5 = 1,\n};\n\nenum {\n\tOpt_new___2 = 0,\n\tOpt_load___2 = 1,\n\tOpt_update___2 = 2,\n\tOpt_err___6 = 3,\n};\n\nenum {\n\tOpt_uid___2 = 0,\n\tOpt_gid___2 = 1,\n\tOpt_mode = 2,\n\tOpt_ptmxmode = 3,\n\tOpt_newinstance = 4,\n\tOpt_max = 5,\n\tOpt_err___7 = 6,\n};\n\nenum {\n\tOpt_uid___3 = 0,\n\tOpt_gid___3 = 1,\n};\n\nenum {\n\tOpt_uid___4 = 0,\n\tOpt_gid___4 = 1,\n\tOpt_mode___2 = 2,\n\tOpt_source = 3,\n};\n\nenum {\n\tOpt_uid___5 = 0,\n\tOpt_gid___5 = 1,\n\tOpt_mode___3 = 2,\n};\n\nenum {\n\tPADDRW = 0,\n\tPDATA = 4,\n\tPPMASK = 8,\n\tPADDRR = 12,\n\tPIDXLO = 16,\n\tPIDXHI = 20,\n\tPIDXDATA = 24,\n\tPIDXCTL = 28,\n};\n\nenum {\n\tPAD_UNLOCKED = 0,\n\tPAD_LOCKED = 1,\n\tPAD_LOCKED_TX = 2,\n\tPAD_LOCKED_FULL = 3,\n};\n\nenum {\n\tPAGE_REPORTING_IDLE = 0,\n\tPAGE_REPORTING_REQUESTED = 1,\n\tPAGE_REPORTING_ACTIVE = 2,\n};\n\nenum {\n\tPAGE_WAS_MAPPED = 1,\n\tPAGE_WAS_MLOCKED = 2,\n\tPAGE_OLD_STATES = 3,\n};\n\nenum {\n\tPALMAS_EXT_CONTROL_ENABLE1 = 1,\n\tPALMAS_EXT_CONTROL_ENABLE2 = 2,\n\tPALMAS_EXT_CONTROL_NSLEEP = 4,\n};\n\nenum {\n\tPARSE_INVALID = 1,\n\tPARSE_NOT_LONGNAME = 2,\n\tPARSE_EOF = 3,\n};\n\nenum {\n\tPAT_UC = 0,\n\tPAT_WC = 1,\n\tPAT_WT = 4,\n\tPAT_WP = 5,\n\tPAT_WB = 6,\n\tPAT_UC_MINUS = 7,\n};\n\nenum {\n\tPCI_REASSIGN_ALL_RSRC = 1,\n\tPCI_REASSIGN_ALL_BUS = 2,\n\tPCI_PROBE_ONLY = 4,\n\tPCI_CAN_SKIP_ISA_ALIGN = 8,\n\tPCI_ENABLE_PROC_DOMAINS = 16,\n\tPCI_COMPAT_DOMAIN_0 = 32,\n\tPCI_SCAN_ALL_PCIE_DEVS = 64,\n};\n\nenum {\n\tPCI_STD_RESOURCES = 0,\n\tPCI_STD_RESOURCE_END = 5,\n\tPCI_ROM_RESOURCE = 6,\n\tPCI_IOV_RESOURCES = 7,\n\tPCI_IOV_RESOURCE_END = 12,\n\tPCI_BRIDGE_RESOURCES = 13,\n\tPCI_BRIDGE_RESOURCE_END = 16,\n\tPCI_NUM_RESOURCES = 17,\n\tDEVICE_COUNT_RESOURCE = 17,\n};\n\nenum {\n\tPERCPU_REF_INIT_ATOMIC = 1,\n\tPERCPU_REF_INIT_DEAD = 2,\n\tPERCPU_REF_ALLOW_REINIT = 4,\n};\n\nenum {\n\tPERF_BR_SPEC_NA = 0,\n\tPERF_BR_SPEC_WRONG_PATH = 1,\n\tPERF_BR_NON_SPEC_CORRECT_PATH = 2,\n\tPERF_BR_SPEC_CORRECT_PATH = 3,\n\tPERF_BR_SPEC_MAX = 4,\n};\n\nenum {\n\tPERF_BR_UNKNOWN = 0,\n\tPERF_BR_COND = 1,\n\tPERF_BR_UNCOND = 2,\n\tPERF_BR_IND = 3,\n\tPERF_BR_CALL = 4,\n\tPERF_BR_IND_CALL = 5,\n\tPERF_BR_RET = 6,\n\tPERF_BR_SYSCALL = 7,\n\tPERF_BR_SYSRET = 8,\n\tPERF_BR_COND_CALL = 9,\n\tPERF_BR_COND_RET = 10,\n\tPERF_BR_ERET = 11,\n\tPERF_BR_IRQ = 12,\n\tPERF_BR_SERROR = 13,\n\tPERF_BR_NO_TX = 14,\n\tPERF_BR_EXTEND_ABI = 15,\n\tPERF_BR_MAX = 16,\n};\n\nenum {\n\tPERF_TXN_ELISION = 1ULL,\n\tPERF_TXN_TRANSACTION = 2ULL,\n\tPERF_TXN_SYNC = 4ULL,\n\tPERF_TXN_ASYNC = 8ULL,\n\tPERF_TXN_RETRY = 16ULL,\n\tPERF_TXN_CONFLICT = 32ULL,\n\tPERF_TXN_CAPACITY_WRITE = 64ULL,\n\tPERF_TXN_CAPACITY_READ = 128ULL,\n\tPERF_TXN_MAX = 256ULL,\n\tPERF_TXN_ABORT_MASK = 18446744069414584320ULL,\n\tPERF_TXN_ABORT_SHIFT = 32ULL,\n};\n\nenum {\n\tPERF_X86_EVENT_PEBS_LDLAT = 1,\n\tPERF_X86_EVENT_PEBS_ST = 2,\n\tPERF_X86_EVENT_PEBS_ST_HSW = 4,\n\tPERF_X86_EVENT_PEBS_LD_HSW = 8,\n\tPERF_X86_EVENT_PEBS_NA_HSW = 16,\n\tPERF_X86_EVENT_EXCL = 32,\n\tPERF_X86_EVENT_DYNAMIC = 64,\n\tPERF_X86_EVENT_EXCL_ACCT = 256,\n\tPERF_X86_EVENT_AUTO_RELOAD = 512,\n\tPERF_X86_EVENT_LARGE_PEBS = 1024,\n\tPERF_X86_EVENT_PEBS_VIA_PT = 2048,\n\tPERF_X86_EVENT_PAIR = 4096,\n\tPERF_X86_EVENT_LBR_SELECT = 8192,\n\tPERF_X86_EVENT_TOPDOWN = 16384,\n\tPERF_X86_EVENT_PEBS_STLAT = 32768,\n\tPERF_X86_EVENT_AMD_BRS = 65536,\n\tPERF_X86_EVENT_PEBS_LAT_HYBRID = 131072,\n\tPERF_X86_EVENT_NEEDS_BRANCH_STACK = 262144,\n\tPERF_X86_EVENT_BRANCH_COUNTERS = 524288,\n};\n\nenum {\n\tPER_LINUX = 0,\n\tPER_LINUX_32BIT = 8388608,\n\tPER_LINUX_FDPIC = 524288,\n\tPER_SVR4 = 68157441,\n\tPER_SVR3 = 83886082,\n\tPER_SCOSVR3 = 117440515,\n\tPER_OSR5 = 100663299,\n\tPER_WYSEV386 = 83886084,\n\tPER_ISCR4 = 67108869,\n\tPER_BSD = 6,\n\tPER_SUNOS = 67108870,\n\tPER_XENIX = 83886087,\n\tPER_LINUX32 = 8,\n\tPER_LINUX32_3GB = 134217736,\n\tPER_IRIX32 = 67108873,\n\tPER_IRIXN32 = 67108874,\n\tPER_IRIX64 = 67108875,\n\tPER_RISCOS = 12,\n\tPER_SOLARIS = 67108877,\n\tPER_UW7 = 68157454,\n\tPER_OSF4 = 15,\n\tPER_HPUX = 16,\n\tPER_MASK = 255,\n};\n\nenum {\n\tPIIX_IOCFG = 84,\n\tICH5_PMR = 144,\n\tICH5_PCS = 146,\n\tPIIX_SIDPR_BAR = 5,\n\tPIIX_SIDPR_LEN = 16,\n\tPIIX_SIDPR_IDX = 0,\n\tPIIX_SIDPR_DATA = 4,\n\tPIIX_FLAG_CHECKINTR = 268435456,\n\tPIIX_FLAG_SIDPR = 536870912,\n\tPIIX_PATA_FLAGS = 1,\n\tPIIX_SATA_FLAGS = 268435458,\n\tPIIX_FLAG_PIO16 = 1073741824,\n\tPIIX_80C_PRI = 48,\n\tPIIX_80C_SEC = 192,\n\tP0 = 0,\n\tP1 = 1,\n\tP2 = 2,\n\tP3 = 3,\n\tIDE = -1,\n\tNA = -2,\n\tRV = -3,\n\tPIIX_AHCI_DEVICE = 6,\n\tPIIX_HOST_BROKEN_SUSPEND = 16777216,\n};\n\nenum {\n\tPIM_TYPE_HELLO = 0,\n\tPIM_TYPE_REGISTER = 1,\n\tPIM_TYPE_REGISTER_STOP = 2,\n\tPIM_TYPE_JOIN_PRUNE = 3,\n\tPIM_TYPE_BOOTSTRAP = 4,\n\tPIM_TYPE_ASSERT = 5,\n\tPIM_TYPE_GRAFT = 6,\n\tPIM_TYPE_GRAFT_ACK = 7,\n\tPIM_TYPE_CANDIDATE_RP_ADV = 8,\n};\n\nenum {\n\tPLAT8250_DEV_LEGACY = -1,\n\tPLAT8250_DEV_PLATFORM = 0,\n\tPLAT8250_DEV_PLATFORM1 = 1,\n\tPLAT8250_DEV_PLATFORM2 = 2,\n\tPLAT8250_DEV_FOURPORT = 3,\n\tPLAT8250_DEV_ACCENT = 4,\n\tPLAT8250_DEV_BOCA = 5,\n\tPLAT8250_DEV_EXAR_ST16C554 = 6,\n\tPLAT8250_DEV_HUB6 = 7,\n\tPLAT8250_DEV_AU1X00 = 8,\n\tPLAT8250_DEV_SM501 = 9,\n};\n\nenum {\n\tPM8607_IRQ_ONKEY = 0,\n\tPM8607_IRQ_EXTON = 1,\n\tPM8607_IRQ_CHG = 2,\n\tPM8607_IRQ_BAT = 3,\n\tPM8607_IRQ_RTC = 4,\n\tPM8607_IRQ_CC = 5,\n\tPM8607_IRQ_VBAT = 6,\n\tPM8607_IRQ_VCHG = 7,\n\tPM8607_IRQ_VSYS = 8,\n\tPM8607_IRQ_TINT = 9,\n\tPM8607_IRQ_GPADC0 = 10,\n\tPM8607_IRQ_GPADC1 = 11,\n\tPM8607_IRQ_GPADC2 = 12,\n\tPM8607_IRQ_GPADC3 = 13,\n\tPM8607_IRQ_AUDIO_SHORT = 14,\n\tPM8607_IRQ_PEN = 15,\n\tPM8607_IRQ_HEADSET = 16,\n\tPM8607_IRQ_HOOK = 17,\n\tPM8607_IRQ_MICIN = 18,\n\tPM8607_IRQ_CHG_FAIL = 19,\n\tPM8607_IRQ_CHG_DONE = 20,\n\tPM8607_IRQ_CHG_FAULT = 21,\n};\n\nenum {\n\tPOLICYDB_CAP_NETPEER = 0,\n\tPOLICYDB_CAP_OPENPERM = 1,\n\tPOLICYDB_CAP_EXTSOCKCLASS = 2,\n\tPOLICYDB_CAP_ALWAYSNETWORK = 3,\n\tPOLICYDB_CAP_CGROUPSECLABEL = 4,\n\tPOLICYDB_CAP_NNP_NOSUID_TRANSITION = 5,\n\tPOLICYDB_CAP_GENFS_SECLABEL_SYMLINKS = 6,\n\tPOLICYDB_CAP_IOCTL_SKIP_CLOEXEC = 7,\n\tPOLICYDB_CAP_USERSPACE_INITIAL_CONTEXT = 8,\n\t__POLICYDB_CAP_MAX = 9,\n};\n\nenum {\n\tPOOL_BITS = 256,\n\tPOOL_READY_BITS = 256,\n\tPOOL_EARLY_BITS = 128,\n};\n\nenum {\n\tPOWERON_SECS = 3,\n};\n\nenum {\n\tPOWER_SUPPLY_CAPACITY_LEVEL_UNKNOWN = 0,\n\tPOWER_SUPPLY_CAPACITY_LEVEL_CRITICAL = 1,\n\tPOWER_SUPPLY_CAPACITY_LEVEL_LOW = 2,\n\tPOWER_SUPPLY_CAPACITY_LEVEL_NORMAL = 3,\n\tPOWER_SUPPLY_CAPACITY_LEVEL_HIGH = 4,\n\tPOWER_SUPPLY_CAPACITY_LEVEL_FULL = 5,\n};\n\nenum {\n\tPOWER_SUPPLY_CHARGE_TYPE_UNKNOWN = 0,\n\tPOWER_SUPPLY_CHARGE_TYPE_NONE = 1,\n\tPOWER_SUPPLY_CHARGE_TYPE_TRICKLE = 2,\n\tPOWER_SUPPLY_CHARGE_TYPE_FAST = 3,\n\tPOWER_SUPPLY_CHARGE_TYPE_STANDARD = 4,\n\tPOWER_SUPPLY_CHARGE_TYPE_ADAPTIVE = 5,\n\tPOWER_SUPPLY_CHARGE_TYPE_CUSTOM = 6,\n\tPOWER_SUPPLY_CHARGE_TYPE_LONGLIFE = 7,\n\tPOWER_SUPPLY_CHARGE_TYPE_BYPASS = 8,\n};\n\nenum {\n\tPOWER_SUPPLY_HEALTH_UNKNOWN = 0,\n\tPOWER_SUPPLY_HEALTH_GOOD = 1,\n\tPOWER_SUPPLY_HEALTH_OVERHEAT = 2,\n\tPOWER_SUPPLY_HEALTH_DEAD = 3,\n\tPOWER_SUPPLY_HEALTH_OVERVOLTAGE = 4,\n\tPOWER_SUPPLY_HEALTH_UNSPEC_FAILURE = 5,\n\tPOWER_SUPPLY_HEALTH_COLD = 6,\n\tPOWER_SUPPLY_HEALTH_WATCHDOG_TIMER_EXPIRE = 7,\n\tPOWER_SUPPLY_HEALTH_SAFETY_TIMER_EXPIRE = 8,\n\tPOWER_SUPPLY_HEALTH_OVERCURRENT = 9,\n\tPOWER_SUPPLY_HEALTH_CALIBRATION_REQUIRED = 10,\n\tPOWER_SUPPLY_HEALTH_WARM = 11,\n\tPOWER_SUPPLY_HEALTH_COOL = 12,\n\tPOWER_SUPPLY_HEALTH_HOT = 13,\n\tPOWER_SUPPLY_HEALTH_NO_BATTERY = 14,\n};\n\nenum {\n\tPOWER_SUPPLY_SCOPE_UNKNOWN = 0,\n\tPOWER_SUPPLY_SCOPE_SYSTEM = 1,\n\tPOWER_SUPPLY_SCOPE_DEVICE = 2,\n};\n\nenum {\n\tPOWER_SUPPLY_STATUS_UNKNOWN = 0,\n\tPOWER_SUPPLY_STATUS_CHARGING = 1,\n\tPOWER_SUPPLY_STATUS_DISCHARGING = 2,\n\tPOWER_SUPPLY_STATUS_NOT_CHARGING = 3,\n\tPOWER_SUPPLY_STATUS_FULL = 4,\n};\n\nenum {\n\tPOWER_SUPPLY_TECHNOLOGY_UNKNOWN = 0,\n\tPOWER_SUPPLY_TECHNOLOGY_NiMH = 1,\n\tPOWER_SUPPLY_TECHNOLOGY_LION = 2,\n\tPOWER_SUPPLY_TECHNOLOGY_LIPO = 3,\n\tPOWER_SUPPLY_TECHNOLOGY_LiFe = 4,\n\tPOWER_SUPPLY_TECHNOLOGY_NiCd = 5,\n\tPOWER_SUPPLY_TECHNOLOGY_LiMn = 6,\n};\n\nenum {\n\tPREFIX_UNSPEC = 0,\n\tPREFIX_ADDRESS = 1,\n\tPREFIX_CACHEINFO = 2,\n\t__PREFIX_MAX = 3,\n};\n\nenum {\n\tPROC_ENTRY_PERMANENT = 1,\n};\n\nenum {\n\tPROC_ROOT_INO = 1,\n\tPROC_IPC_INIT_INO = 4026531839,\n\tPROC_UTS_INIT_INO = 4026531838,\n\tPROC_USER_INIT_INO = 4026531837,\n\tPROC_PID_INIT_INO = 4026531836,\n\tPROC_CGROUP_INIT_INO = 4026531835,\n\tPROC_TIME_INIT_INO = 4026531834,\n};\n\nenum {\n\tPSS = 0,\n\tPPC = 1,\n};\n\nenum {\n\tPWMF_REQUESTED = 0,\n\tPWMF_EXPORTED = 1,\n};\n\nenum {\n\tQIF_BLIMITS_B = 0,\n\tQIF_SPACE_B = 1,\n\tQIF_ILIMITS_B = 2,\n\tQIF_INODES_B = 3,\n\tQIF_BTIME_B = 4,\n\tQIF_ITIME_B = 5,\n};\n\nenum {\n\tQI_FREE = 0,\n\tQI_IN_USE = 1,\n\tQI_DONE = 2,\n\tQI_ABORT = 3,\n};\n\nenum {\n\tQOS_ENABLE = 0,\n\tQOS_CTRL = 1,\n\tNR_QOS_CTRL_PARAMS = 2,\n};\n\nenum {\n\tQOS_RPPM = 0,\n\tQOS_RLAT = 1,\n\tQOS_WPPM = 2,\n\tQOS_WLAT = 3,\n\tQOS_MIN = 4,\n\tQOS_MAX = 5,\n\tNR_QOS_PARAMS = 6,\n};\n\nenum {\n\tQUEUE_FLAG_DYING = 0,\n\tQUEUE_FLAG_NOMERGES = 1,\n\tQUEUE_FLAG_SAME_COMP = 2,\n\tQUEUE_FLAG_FAIL_IO = 3,\n\tQUEUE_FLAG_NOXMERGES = 4,\n\tQUEUE_FLAG_SAME_FORCE = 5,\n\tQUEUE_FLAG_INIT_DONE = 6,\n\tQUEUE_FLAG_STATS = 7,\n\tQUEUE_FLAG_REGISTERED = 8,\n\tQUEUE_FLAG_QUIESCED = 9,\n\tQUEUE_FLAG_RQ_ALLOC_TIME = 10,\n\tQUEUE_FLAG_HCTX_ACTIVE = 11,\n\tQUEUE_FLAG_SQ_SCHED = 12,\n\tQUEUE_FLAG_MAX = 13,\n};\n\nenum {\n\tQUOTA_NL_A_UNSPEC = 0,\n\tQUOTA_NL_A_QTYPE = 1,\n\tQUOTA_NL_A_EXCESS_ID = 2,\n\tQUOTA_NL_A_WARNING = 3,\n\tQUOTA_NL_A_DEV_MAJOR = 4,\n\tQUOTA_NL_A_DEV_MINOR = 5,\n\tQUOTA_NL_A_CAUSED_ID = 6,\n\tQUOTA_NL_A_PAD = 7,\n\t__QUOTA_NL_A_MAX = 8,\n};\n\nenum {\n\tQUOTA_NL_C_UNSPEC = 0,\n\tQUOTA_NL_C_WARNING = 1,\n\t__QUOTA_NL_C_MAX = 2,\n};\n\nenum {\n\tQ_REQUEUE_PI_NONE = 0,\n\tQ_REQUEUE_PI_IGNORE = 1,\n\tQ_REQUEUE_PI_IN_PROGRESS = 2,\n\tQ_REQUEUE_PI_WAIT = 3,\n\tQ_REQUEUE_PI_DONE = 4,\n\tQ_REQUEUE_PI_LOCKED = 5,\n};\n\nenum {\n\tRADIX_TREE_ITER_TAG_MASK = 15,\n\tRADIX_TREE_ITER_TAGGED = 16,\n\tRADIX_TREE_ITER_CONTIG = 32,\n};\n\nenum {\n\tRB_ADD_STAMP_NONE = 0,\n\tRB_ADD_STAMP_EXTEND = 2,\n\tRB_ADD_STAMP_ABSOLUTE = 4,\n\tRB_ADD_STAMP_FORCE = 8,\n};\n\nenum {\n\tRB_CTX_TRANSITION = 0,\n\tRB_CTX_NMI = 1,\n\tRB_CTX_IRQ = 2,\n\tRB_CTX_SOFTIRQ = 3,\n\tRB_CTX_NORMAL = 4,\n\tRB_CTX_MAX = 5,\n};\n\nenum {\n\tRB_LEN_TIME_EXTEND = 8,\n\tRB_LEN_TIME_STAMP = 8,\n};\n\nenum {\n\tRC5T583_DS_NONE = 0,\n\tRC5T583_DS_DC0 = 1,\n\tRC5T583_DS_DC1 = 2,\n\tRC5T583_DS_DC2 = 3,\n\tRC5T583_DS_DC3 = 4,\n\tRC5T583_DS_LDO0 = 5,\n\tRC5T583_DS_LDO1 = 6,\n\tRC5T583_DS_LDO2 = 7,\n\tRC5T583_DS_LDO3 = 8,\n\tRC5T583_DS_LDO4 = 9,\n\tRC5T583_DS_LDO5 = 10,\n\tRC5T583_DS_LDO6 = 11,\n\tRC5T583_DS_LDO7 = 12,\n\tRC5T583_DS_LDO8 = 13,\n\tRC5T583_DS_LDO9 = 14,\n\tRC5T583_DS_PSO0 = 15,\n\tRC5T583_DS_PSO1 = 16,\n\tRC5T583_DS_PSO2 = 17,\n\tRC5T583_DS_PSO3 = 18,\n\tRC5T583_DS_PSO4 = 19,\n\tRC5T583_DS_PSO5 = 20,\n\tRC5T583_DS_PSO6 = 21,\n\tRC5T583_DS_PSO7 = 22,\n\tRC5T583_DS_MAX = 23,\n};\n\nenum {\n\tRC5T583_EXT_PWRREQ1_CONTROL = 1,\n\tRC5T583_EXT_PWRREQ2_CONTROL = 2,\n};\n\nenum {\n\tRC5T583_GPIO0 = 0,\n\tRC5T583_GPIO1 = 1,\n\tRC5T583_GPIO2 = 2,\n\tRC5T583_GPIO3 = 3,\n\tRC5T583_GPIO4 = 4,\n\tRC5T583_GPIO5 = 5,\n\tRC5T583_GPIO6 = 6,\n\tRC5T583_GPIO7 = 7,\n\tRC5T583_MAX_GPIO = 8,\n};\n\nenum {\n\tRC5T583_IRQ_ONKEY = 0,\n\tRC5T583_IRQ_ACOK = 1,\n\tRC5T583_IRQ_LIDOPEN = 2,\n\tRC5T583_IRQ_PREOT = 3,\n\tRC5T583_IRQ_CLKSTP = 4,\n\tRC5T583_IRQ_ONKEY_OFF = 5,\n\tRC5T583_IRQ_WD = 6,\n\tRC5T583_IRQ_EN_PWRREQ1 = 7,\n\tRC5T583_IRQ_EN_PWRREQ2 = 8,\n\tRC5T583_IRQ_PRE_VINDET = 9,\n\tRC5T583_IRQ_DC0LIM = 10,\n\tRC5T583_IRQ_DC1LIM = 11,\n\tRC5T583_IRQ_DC2LIM = 12,\n\tRC5T583_IRQ_DC3LIM = 13,\n\tRC5T583_IRQ_CTC = 14,\n\tRC5T583_IRQ_YALE = 15,\n\tRC5T583_IRQ_DALE = 16,\n\tRC5T583_IRQ_WALE = 17,\n\tRC5T583_IRQ_AIN1L = 18,\n\tRC5T583_IRQ_AIN2L = 19,\n\tRC5T583_IRQ_AIN3L = 20,\n\tRC5T583_IRQ_VBATL = 21,\n\tRC5T583_IRQ_VIN3L = 22,\n\tRC5T583_IRQ_VIN8L = 23,\n\tRC5T583_IRQ_AIN1H = 24,\n\tRC5T583_IRQ_AIN2H = 25,\n\tRC5T583_IRQ_AIN3H = 26,\n\tRC5T583_IRQ_VBATH = 27,\n\tRC5T583_IRQ_VIN3H = 28,\n\tRC5T583_IRQ_VIN8H = 29,\n\tRC5T583_IRQ_ADCEND = 30,\n\tRC5T583_IRQ_GPIO0 = 31,\n\tRC5T583_IRQ_GPIO1 = 32,\n\tRC5T583_IRQ_GPIO2 = 33,\n\tRC5T583_IRQ_GPIO3 = 34,\n\tRC5T583_IRQ_GPIO4 = 35,\n\tRC5T583_IRQ_GPIO5 = 36,\n\tRC5T583_IRQ_GPIO6 = 37,\n\tRC5T583_IRQ_GPIO7 = 38,\n\tRC5T583_MAX_IRQS = 39,\n};\n\nenum {\n\tRC5T583_REGULATOR_DC0 = 0,\n\tRC5T583_REGULATOR_DC1 = 1,\n\tRC5T583_REGULATOR_DC2 = 2,\n\tRC5T583_REGULATOR_DC3 = 3,\n\tRC5T583_REGULATOR_LDO0 = 4,\n\tRC5T583_REGULATOR_LDO1 = 5,\n\tRC5T583_REGULATOR_LDO2 = 6,\n\tRC5T583_REGULATOR_LDO3 = 7,\n\tRC5T583_REGULATOR_LDO4 = 8,\n\tRC5T583_REGULATOR_LDO5 = 9,\n\tRC5T583_REGULATOR_LDO6 = 10,\n\tRC5T583_REGULATOR_LDO7 = 11,\n\tRC5T583_REGULATOR_LDO8 = 12,\n\tRC5T583_REGULATOR_LDO9 = 13,\n\tRC5T583_REGULATOR_MAX = 14,\n};\n\nenum {\n\tRCD = 0,\n\tRCH_DP = 1,\n\tDEVICE = 2,\n\tLD = 3,\n\tFMLD = 4,\n\tRP = 5,\n\tDSP = 6,\n\tUSP = 7,\n};\n\nenum {\n\tRDT_FLAG_CMT = 0,\n\tRDT_FLAG_MBM_TOTAL = 1,\n\tRDT_FLAG_MBM_LOCAL = 2,\n\tRDT_FLAG_L3_CAT = 3,\n\tRDT_FLAG_L3_CDP = 4,\n\tRDT_FLAG_L2_CAT = 5,\n\tRDT_FLAG_L2_CDP = 6,\n\tRDT_FLAG_MBA = 7,\n\tRDT_FLAG_SMBA = 8,\n\tRDT_FLAG_BMEC = 9,\n};\n\nenum {\n\tREASON_BOUNDS = -1,\n\tREASON_TYPE = -2,\n\tREASON_PATHS = -3,\n\tREASON_LIMIT = -4,\n\tREASON_STACK = -5,\n};\n\nenum {\n\tREGION_INTERSECTS = 0,\n\tREGION_DISJOINT = 1,\n\tREGION_MIXED = 2,\n};\n\nenum {\n\tREGULATOR_ERROR_CLEARED = 0,\n\tREGULATOR_FAILED_RETRY = 1,\n\tREGULATOR_ERROR_ON = 2,\n};\n\nenum {\n\tREG_GENL_ATTR_UNSPEC = 0,\n\tREG_GENL_ATTR_EVENT = 1,\n\t__REG_GENL_ATTR_MAX = 2,\n};\n\nenum {\n\tREG_GENL_CMD_UNSPEC = 0,\n\tREG_GENL_CMD_EVENT = 1,\n\t__REG_GENL_CMD_MAX = 2,\n};\n\nenum {\n\tREQ_FSEQ_PREFLUSH = 1,\n\tREQ_FSEQ_DATA = 2,\n\tREQ_FSEQ_POSTFLUSH = 4,\n\tREQ_FSEQ_DONE = 8,\n\tREQ_FSEQ_ACTIONS = 7,\n\tFLUSH_PENDING_TIMEOUT = 5000,\n};\n\nenum {\n\tREQ_F_FIXED_FILE = 1ULL,\n\tREQ_F_IO_DRAIN = 2ULL,\n\tREQ_F_LINK = 4ULL,\n\tREQ_F_HARDLINK = 8ULL,\n\tREQ_F_FORCE_ASYNC = 16ULL,\n\tREQ_F_BUFFER_SELECT = 32ULL,\n\tREQ_F_CQE_SKIP = 64ULL,\n\tREQ_F_FAIL = 256ULL,\n\tREQ_F_INFLIGHT = 512ULL,\n\tREQ_F_CUR_POS = 1024ULL,\n\tREQ_F_NOWAIT = 2048ULL,\n\tREQ_F_LINK_TIMEOUT = 4096ULL,\n\tREQ_F_NEED_CLEANUP = 8192ULL,\n\tREQ_F_POLLED = 16384ULL,\n\tREQ_F_BUFFER_SELECTED = 32768ULL,\n\tREQ_F_BUFFER_RING = 65536ULL,\n\tREQ_F_REISSUE = 131072ULL,\n\tREQ_F_SUPPORT_NOWAIT = 268435456ULL,\n\tREQ_F_ISREG = 536870912ULL,\n\tREQ_F_CREDS = 262144ULL,\n\tREQ_F_REFCOUNT = 524288ULL,\n\tREQ_F_ARM_LTIMEOUT = 1048576ULL,\n\tREQ_F_ASYNC_DATA = 2097152ULL,\n\tREQ_F_SKIP_LINK_CQES = 4194304ULL,\n\tREQ_F_SINGLE_POLL = 8388608ULL,\n\tREQ_F_DOUBLE_POLL = 16777216ULL,\n\tREQ_F_APOLL_MULTISHOT = 33554432ULL,\n\tREQ_F_CLEAR_POLLIN = 67108864ULL,\n\tREQ_F_HASH_LOCKED = 134217728ULL,\n\tREQ_F_POLL_NO_LAZY = 1073741824ULL,\n\tREQ_F_CAN_POLL = 2147483648ULL,\n\tREQ_F_BL_EMPTY = 4294967296ULL,\n\tREQ_F_BL_NO_RECYCLE = 8589934592ULL,\n\tREQ_F_BUFFERS_COMMIT = 17179869184ULL,\n};\n\nenum {\n\tREQ_F_FIXED_FILE_BIT = 0,\n\tREQ_F_IO_DRAIN_BIT = 1,\n\tREQ_F_LINK_BIT = 2,\n\tREQ_F_HARDLINK_BIT = 3,\n\tREQ_F_FORCE_ASYNC_BIT = 4,\n\tREQ_F_BUFFER_SELECT_BIT = 5,\n\tREQ_F_CQE_SKIP_BIT = 6,\n\tREQ_F_FAIL_BIT = 8,\n\tREQ_F_INFLIGHT_BIT = 9,\n\tREQ_F_CUR_POS_BIT = 10,\n\tREQ_F_NOWAIT_BIT = 11,\n\tREQ_F_LINK_TIMEOUT_BIT = 12,\n\tREQ_F_NEED_CLEANUP_BIT = 13,\n\tREQ_F_POLLED_BIT = 14,\n\tREQ_F_BUFFER_SELECTED_BIT = 15,\n\tREQ_F_BUFFER_RING_BIT = 16,\n\tREQ_F_REISSUE_BIT = 17,\n\tREQ_F_CREDS_BIT = 18,\n\tREQ_F_REFCOUNT_BIT = 19,\n\tREQ_F_ARM_LTIMEOUT_BIT = 20,\n\tREQ_F_ASYNC_DATA_BIT = 21,\n\tREQ_F_SKIP_LINK_CQES_BIT = 22,\n\tREQ_F_SINGLE_POLL_BIT = 23,\n\tREQ_F_DOUBLE_POLL_BIT = 24,\n\tREQ_F_APOLL_MULTISHOT_BIT = 25,\n\tREQ_F_CLEAR_POLLIN_BIT = 26,\n\tREQ_F_HASH_LOCKED_BIT = 27,\n\tREQ_F_SUPPORT_NOWAIT_BIT = 28,\n\tREQ_F_ISREG_BIT = 29,\n\tREQ_F_POLL_NO_LAZY_BIT = 30,\n\tREQ_F_CAN_POLL_BIT = 31,\n\tREQ_F_BL_EMPTY_BIT = 32,\n\tREQ_F_BL_NO_RECYCLE_BIT = 33,\n\tREQ_F_BUFFERS_COMMIT_BIT = 34,\n\t__REQ_F_LAST_BIT = 35,\n};\n\nenum {\n\tRES_USAGE = 0,\n\tRES_RSVD_USAGE = 1,\n\tRES_LIMIT = 2,\n\tRES_RSVD_LIMIT = 3,\n\tRES_MAX_USAGE = 4,\n\tRES_RSVD_MAX_USAGE = 5,\n\tRES_FAILCNT = 6,\n\tRES_RSVD_FAILCNT = 7,\n};\n\nenum {\n\tRNG_SEED_LENGTH = 32,\n};\n\nenum {\n\tRQ_WAIT_BUSY_PCT = 5,\n\tUNBUSY_THR_PCT = 75,\n\tMIN_DELAY_THR_PCT = 500,\n\tMAX_DELAY_THR_PCT = 25000,\n\tMIN_DELAY = 250,\n\tMAX_DELAY = 250000,\n\tDFGV_USAGE_PCT = 50,\n\tDFGV_PERIOD = 100000,\n\tMAX_LAGGING_PERIODS = 10,\n\tIOC_PAGE_SHIFT = 12,\n\tIOC_PAGE_SIZE = 4096,\n\tIOC_SECT_TO_PAGE_SHIFT = 3,\n\tLCOEF_RANDIO_PAGES = 4096,\n};\n\nenum {\n\tRTAX_UNSPEC = 0,\n\tRTAX_LOCK = 1,\n\tRTAX_MTU = 2,\n\tRTAX_WINDOW = 3,\n\tRTAX_RTT = 4,\n\tRTAX_RTTVAR = 5,\n\tRTAX_SSTHRESH = 6,\n\tRTAX_CWND = 7,\n\tRTAX_ADVMSS = 8,\n\tRTAX_REORDERING = 9,\n\tRTAX_HOPLIMIT = 10,\n\tRTAX_INITCWND = 11,\n\tRTAX_FEATURES = 12,\n\tRTAX_RTO_MIN = 13,\n\tRTAX_INITRWND = 14,\n\tRTAX_QUICKACK = 15,\n\tRTAX_CC_ALGO = 16,\n\tRTAX_FASTOPEN_NO_COOKIE = 17,\n\t__RTAX_MAX = 18,\n};\n\nenum {\n\tRTM_BASE = 16,\n\tRTM_NEWLINK = 16,\n\tRTM_DELLINK = 17,\n\tRTM_GETLINK = 18,\n\tRTM_SETLINK = 19,\n\tRTM_NEWADDR = 20,\n\tRTM_DELADDR = 21,\n\tRTM_GETADDR = 22,\n\tRTM_NEWROUTE = 24,\n\tRTM_DELROUTE = 25,\n\tRTM_GETROUTE = 26,\n\tRTM_NEWNEIGH = 28,\n\tRTM_DELNEIGH = 29,\n\tRTM_GETNEIGH = 30,\n\tRTM_NEWRULE = 32,\n\tRTM_DELRULE = 33,\n\tRTM_GETRULE = 34,\n\tRTM_NEWQDISC = 36,\n\tRTM_DELQDISC = 37,\n\tRTM_GETQDISC = 38,\n\tRTM_NEWTCLASS = 40,\n\tRTM_DELTCLASS = 41,\n\tRTM_GETTCLASS = 42,\n\tRTM_NEWTFILTER = 44,\n\tRTM_DELTFILTER = 45,\n\tRTM_GETTFILTER = 46,\n\tRTM_NEWACTION = 48,\n\tRTM_DELACTION = 49,\n\tRTM_GETACTION = 50,\n\tRTM_NEWPREFIX = 52,\n\tRTM_GETMULTICAST = 58,\n\tRTM_GETANYCAST = 62,\n\tRTM_NEWNEIGHTBL = 64,\n\tRTM_GETNEIGHTBL = 66,\n\tRTM_SETNEIGHTBL = 67,\n\tRTM_NEWNDUSEROPT = 68,\n\tRTM_NEWADDRLABEL = 72,\n\tRTM_DELADDRLABEL = 73,\n\tRTM_GETADDRLABEL = 74,\n\tRTM_GETDCB = 78,\n\tRTM_SETDCB = 79,\n\tRTM_NEWNETCONF = 80,\n\tRTM_DELNETCONF = 81,\n\tRTM_GETNETCONF = 82,\n\tRTM_NEWMDB = 84,\n\tRTM_DELMDB = 85,\n\tRTM_GETMDB = 86,\n\tRTM_NEWNSID = 88,\n\tRTM_DELNSID = 89,\n\tRTM_GETNSID = 90,\n\tRTM_NEWSTATS = 92,\n\tRTM_GETSTATS = 94,\n\tRTM_SETSTATS = 95,\n\tRTM_NEWCACHEREPORT = 96,\n\tRTM_NEWCHAIN = 100,\n\tRTM_DELCHAIN = 101,\n\tRTM_GETCHAIN = 102,\n\tRTM_NEWNEXTHOP = 104,\n\tRTM_DELNEXTHOP = 105,\n\tRTM_GETNEXTHOP = 106,\n\tRTM_NEWLINKPROP = 108,\n\tRTM_DELLINKPROP = 109,\n\tRTM_GETLINKPROP = 110,\n\tRTM_NEWVLAN = 112,\n\tRTM_DELVLAN = 113,\n\tRTM_GETVLAN = 114,\n\tRTM_NEWNEXTHOPBUCKET = 116,\n\tRTM_DELNEXTHOPBUCKET = 117,\n\tRTM_GETNEXTHOPBUCKET = 118,\n\tRTM_NEWTUNNEL = 120,\n\tRTM_DELTUNNEL = 121,\n\tRTM_GETTUNNEL = 122,\n\t__RTM_MAX = 123,\n};\n\nenum {\n\tRTN_UNSPEC = 0,\n\tRTN_UNICAST = 1,\n\tRTN_LOCAL = 2,\n\tRTN_BROADCAST = 3,\n\tRTN_ANYCAST = 4,\n\tRTN_MULTICAST = 5,\n\tRTN_BLACKHOLE = 6,\n\tRTN_UNREACHABLE = 7,\n\tRTN_PROHIBIT = 8,\n\tRTN_THROW = 9,\n\tRTN_NAT = 10,\n\tRTN_XRESOLVE = 11,\n\t__RTN_MAX = 12,\n};\n\nenum {\n\tRWB_DEF_DEPTH = 16,\n\tRWB_WINDOW_NSEC = 100000000,\n\tRWB_MIN_WRITE_SAMPLES = 3,\n\tRWB_UNKNOWN_BUMP = 5,\n};\n\nenum {\n\tRoot_NFS = 255,\n\tRoot_CIFS = 254,\n\tRoot_Generic = 253,\n\tRoot_RAM0 = 1048576,\n};\n\nenum {\n\tS1SA = 0,\n\tS2SA = 1,\n\tSP = 2,\n\tDSA = 3,\n\tCNT = 4,\n\tDP_OCTL = 5,\n\tCLR = 6,\n\tBI = 8,\n\tMBC = 9,\n\tBLTCTL = 10,\n\tHES = 12,\n\tHEB = 13,\n\tHSB = 14,\n\tHT = 15,\n\tVES = 16,\n\tVEB = 17,\n\tVSB = 18,\n\tVT = 19,\n\tHCIV = 20,\n\tVCIV = 21,\n\tTCDR = 22,\n\tVIL = 23,\n\tSTGCTL = 24,\n\tSSR = 25,\n\tHRIR = 26,\n\tSPR = 27,\n\tCMR = 28,\n\tSRGCTL = 29,\n\tRRCIV = 30,\n\tRRSC = 31,\n\tRRCR = 34,\n\tGIOE = 32,\n\tGIO = 33,\n\tSCR = 35,\n\tSSTATUS = 36,\n\tPRC = 37,\n};\n\nenum {\n\tSAMPLES = 8,\n\tMIN_CHANGE = 5,\n};\n\nenum {\n\tSB_UNFROZEN = 0,\n\tSB_FREEZE_WRITE = 1,\n\tSB_FREEZE_PAGEFAULT = 2,\n\tSB_FREEZE_FS = 3,\n\tSB_FREEZE_COMPLETE = 4,\n};\n\nenum {\n\tSCM_TSTAMP_SND = 0,\n\tSCM_TSTAMP_SCHED = 1,\n\tSCM_TSTAMP_ACK = 2,\n};\n\nenum {\n\tSCSI_DH_OK = 0,\n\tSCSI_DH_DEV_FAILED = 1,\n\tSCSI_DH_DEV_TEMP_BUSY = 2,\n\tSCSI_DH_DEV_UNSUPP = 3,\n\tSCSI_DH_DEVICE_MAX = 4,\n\tSCSI_DH_NOTCONN = 5,\n\tSCSI_DH_CONN_FAILURE = 6,\n\tSCSI_DH_TRANSPORT_MAX = 7,\n\tSCSI_DH_IO = 8,\n\tSCSI_DH_INVALID_IO = 9,\n\tSCSI_DH_RETRY = 10,\n\tSCSI_DH_IMM_RETRY = 11,\n\tSCSI_DH_TIMED_OUT = 12,\n\tSCSI_DH_RES_TEMP_UNAVAIL = 13,\n\tSCSI_DH_DEV_OFFLINED = 14,\n\tSCSI_DH_NOMEM = 15,\n\tSCSI_DH_NOSYS = 16,\n\tSCSI_DH_DRIVER_MAX = 17,\n};\n\nenum {\n\tSCTP_AUTH_HMAC_ID_RESERVED_0 = 0,\n\tSCTP_AUTH_HMAC_ID_SHA1 = 1,\n\tSCTP_AUTH_HMAC_ID_RESERVED_2 = 2,\n\tSCTP_AUTH_HMAC_ID_SHA256 = 3,\n\t__SCTP_AUTH_HMAC_MAX = 4,\n};\n\nenum {\n\tSCTP_MAX_DUP_TSNS = 16,\n};\n\nenum {\n\tSCTP_MAX_STREAM = 65535,\n};\n\nenum {\n\tSD_BALANCE_NEWIDLE = 1,\n\tSD_BALANCE_EXEC = 2,\n\tSD_BALANCE_FORK = 4,\n\tSD_BALANCE_WAKE = 8,\n\tSD_WAKE_AFFINE = 16,\n\tSD_ASYM_CPUCAPACITY = 32,\n\tSD_ASYM_CPUCAPACITY_FULL = 64,\n\tSD_SHARE_CPUCAPACITY = 128,\n\tSD_CLUSTER = 256,\n\tSD_SHARE_LLC = 512,\n\tSD_SERIALIZE = 1024,\n\tSD_ASYM_PACKING = 2048,\n\tSD_PREFER_SIBLING = 4096,\n\tSD_OVERLAP = 8192,\n\tSD_NUMA = 16384,\n};\n\nenum {\n\tSD_DEF_XFER_BLOCKS = 65535,\n\tSD_MAX_XFER_BLOCKS = 4294967295,\n\tSD_MAX_WS10_BLOCKS = 65535,\n\tSD_MAX_WS16_BLOCKS = 8388607,\n};\n\nenum {\n\tSD_EXT_CDB_SIZE = 32,\n\tSD_MEMPOOL_SIZE = 2,\n};\n\nenum {\n\tSD_LBP_FULL = 0,\n\tSD_LBP_UNMAP = 1,\n\tSD_LBP_WS16 = 2,\n\tSD_LBP_WS10 = 3,\n\tSD_LBP_ZERO = 4,\n\tSD_LBP_DISABLE = 5,\n};\n\nenum {\n\tSD_ZERO_WRITE = 0,\n\tSD_ZERO_WS = 1,\n\tSD_ZERO_WS16_UNMAP = 2,\n\tSD_ZERO_WS10_UNMAP = 3,\n};\n\nenum {\n\tSEAL_keytype = 1,\n\tSRK_keytype = 4,\n};\n\nenum {\n\tSECTION_MARKED_PRESENT_BIT = 0,\n\tSECTION_HAS_MEM_MAP_BIT = 1,\n\tSECTION_IS_ONLINE_BIT = 2,\n\tSECTION_IS_EARLY_BIT = 3,\n\tSECTION_TAINT_ZONE_DEVICE_BIT = 4,\n\tSECTION_MAP_LAST_BIT = 5,\n};\n\nenum {\n\tSEG6_ATTR_UNSPEC = 0,\n\tSEG6_ATTR_DST = 1,\n\tSEG6_ATTR_DSTLEN = 2,\n\tSEG6_ATTR_HMACKEYID = 3,\n\tSEG6_ATTR_SECRET = 4,\n\tSEG6_ATTR_SECRETLEN = 5,\n\tSEG6_ATTR_ALGID = 6,\n\tSEG6_ATTR_HMACINFO = 7,\n\t__SEG6_ATTR_MAX = 8,\n};\n\nenum {\n\tSEG6_CMD_UNSPEC = 0,\n\tSEG6_CMD_SETHMAC = 1,\n\tSEG6_CMD_DUMPHMAC = 2,\n\tSEG6_CMD_SET_TUNSRC = 3,\n\tSEG6_CMD_GET_TUNSRC = 4,\n\t__SEG6_CMD_MAX = 5,\n};\n\nenum {\n\tSEG6_HMAC_ALGO_SHA1 = 1,\n\tSEG6_HMAC_ALGO_SHA256 = 2,\n};\n\nenum {\n\tSEG6_IPTUNNEL_UNSPEC = 0,\n\tSEG6_IPTUNNEL_SRH = 1,\n\t__SEG6_IPTUNNEL_MAX = 2,\n};\n\nenum {\n\tSEG6_IPTUN_MODE_INLINE = 0,\n\tSEG6_IPTUN_MODE_ENCAP = 1,\n\tSEG6_IPTUN_MODE_L2ENCAP = 2,\n\tSEG6_IPTUN_MODE_ENCAP_RED = 3,\n\tSEG6_IPTUN_MODE_L2ENCAP_RED = 4,\n};\n\nenum {\n\tSEG6_LOCAL_ACTION_UNSPEC = 0,\n\tSEG6_LOCAL_ACTION_END = 1,\n\tSEG6_LOCAL_ACTION_END_X = 2,\n\tSEG6_LOCAL_ACTION_END_T = 3,\n\tSEG6_LOCAL_ACTION_END_DX2 = 4,\n\tSEG6_LOCAL_ACTION_END_DX6 = 5,\n\tSEG6_LOCAL_ACTION_END_DX4 = 6,\n\tSEG6_LOCAL_ACTION_END_DT6 = 7,\n\tSEG6_LOCAL_ACTION_END_DT4 = 8,\n\tSEG6_LOCAL_ACTION_END_B6 = 9,\n\tSEG6_LOCAL_ACTION_END_B6_ENCAP = 10,\n\tSEG6_LOCAL_ACTION_END_BM = 11,\n\tSEG6_LOCAL_ACTION_END_S = 12,\n\tSEG6_LOCAL_ACTION_END_AS = 13,\n\tSEG6_LOCAL_ACTION_END_AM = 14,\n\tSEG6_LOCAL_ACTION_END_BPF = 15,\n\tSEG6_LOCAL_ACTION_END_DT46 = 16,\n\t__SEG6_LOCAL_ACTION_MAX = 17,\n};\n\nenum {\n\tSEG6_LOCAL_BPF_PROG_UNSPEC = 0,\n\tSEG6_LOCAL_BPF_PROG = 1,\n\tSEG6_LOCAL_BPF_PROG_NAME = 2,\n\t__SEG6_LOCAL_BPF_PROG_MAX = 3,\n};\n\nenum {\n\tSEG6_LOCAL_CNT_UNSPEC = 0,\n\tSEG6_LOCAL_CNT_PAD = 1,\n\tSEG6_LOCAL_CNT_PACKETS = 2,\n\tSEG6_LOCAL_CNT_BYTES = 3,\n\tSEG6_LOCAL_CNT_ERRORS = 4,\n\t__SEG6_LOCAL_CNT_MAX = 5,\n};\n\nenum {\n\tSEG6_LOCAL_FLV_OP_UNSPEC = 0,\n\tSEG6_LOCAL_FLV_OP_PSP = 1,\n\tSEG6_LOCAL_FLV_OP_USP = 2,\n\tSEG6_LOCAL_FLV_OP_USD = 3,\n\tSEG6_LOCAL_FLV_OP_NEXT_CSID = 4,\n\t__SEG6_LOCAL_FLV_OP_MAX = 5,\n};\n\nenum {\n\tSEG6_LOCAL_FLV_UNSPEC = 0,\n\tSEG6_LOCAL_FLV_OPERATION = 1,\n\tSEG6_LOCAL_FLV_LCBLOCK_BITS = 2,\n\tSEG6_LOCAL_FLV_LCNODE_FN_BITS = 3,\n\t__SEG6_LOCAL_FLV_MAX = 4,\n};\n\nenum {\n\tSEG6_LOCAL_UNSPEC = 0,\n\tSEG6_LOCAL_ACTION = 1,\n\tSEG6_LOCAL_SRH = 2,\n\tSEG6_LOCAL_TABLE = 3,\n\tSEG6_LOCAL_NH4 = 4,\n\tSEG6_LOCAL_NH6 = 5,\n\tSEG6_LOCAL_IIF = 6,\n\tSEG6_LOCAL_OIF = 7,\n\tSEG6_LOCAL_BPF = 8,\n\tSEG6_LOCAL_VRFTABLE = 9,\n\tSEG6_LOCAL_COUNTERS = 10,\n\tSEG6_LOCAL_FLAVORS = 11,\n\t__SEG6_LOCAL_MAX = 12,\n};\n\nenum {\n\tSELNL_MSG_SETENFORCE = 16,\n\tSELNL_MSG_POLICYLOAD = 17,\n\tSELNL_MSG_MAX = 18,\n};\n\nenum {\n\tSEV_RET_NO_FW_CALL = -1,\n\tSEV_RET_SUCCESS = 0,\n\tSEV_RET_INVALID_PLATFORM_STATE = 1,\n\tSEV_RET_INVALID_GUEST_STATE = 2,\n\tSEV_RET_INAVLID_CONFIG = 3,\n\tSEV_RET_INVALID_CONFIG = 3,\n\tSEV_RET_INVALID_LEN = 4,\n\tSEV_RET_ALREADY_OWNED = 5,\n\tSEV_RET_INVALID_CERTIFICATE = 6,\n\tSEV_RET_POLICY_FAILURE = 7,\n\tSEV_RET_INACTIVE = 8,\n\tSEV_RET_INVALID_ADDRESS = 9,\n\tSEV_RET_BAD_SIGNATURE = 10,\n\tSEV_RET_BAD_MEASUREMENT = 11,\n\tSEV_RET_ASID_OWNED = 12,\n\tSEV_RET_INVALID_ASID = 13,\n\tSEV_RET_WBINVD_REQUIRED = 14,\n\tSEV_RET_DFFLUSH_REQUIRED = 15,\n\tSEV_RET_INVALID_GUEST = 16,\n\tSEV_RET_INVALID_COMMAND = 17,\n\tSEV_RET_ACTIVE = 18,\n\tSEV_RET_HWSEV_RET_PLATFORM = 19,\n\tSEV_RET_HWSEV_RET_UNSAFE = 20,\n\tSEV_RET_UNSUPPORTED = 21,\n\tSEV_RET_INVALID_PARAM = 22,\n\tSEV_RET_RESOURCE_LIMIT = 23,\n\tSEV_RET_SECURE_DATA_INVALID = 24,\n\tSEV_RET_INVALID_KEY = 39,\n\tSEV_RET_INVALID_PAGE_SIZE = 40,\n\tSEV_RET_INVALID_PAGE_STATE = 41,\n\tSEV_RET_INVALID_MDATA_ENTRY = 42,\n\tSEV_RET_INVALID_PAGE_OWNER = 43,\n\tSEV_RET_INVALID_PAGE_AEAD_OFLOW = 44,\n\tSEV_RET_RMP_INIT_REQUIRED = 45,\n\tSEV_RET_MAX = 46,\n};\n\nenum {\n\tSFF8024_ID_UNK = 0,\n\tSFF8024_ID_SFF_8472 = 2,\n\tSFF8024_ID_SFP = 3,\n\tSFF8024_ID_DWDM_SFP = 11,\n\tSFF8024_ID_QSFP_8438 = 12,\n\tSFF8024_ID_QSFP_8436_8636 = 13,\n\tSFF8024_ID_QSFP28_8636 = 17,\n\tSFF8024_ID_QSFP_DD = 24,\n\tSFF8024_ID_OSFP = 25,\n\tSFF8024_ID_DSFP = 27,\n\tSFF8024_ID_QSFP_PLUS_CMIS = 30,\n\tSFF8024_ID_SFP_DD_CMIS = 31,\n\tSFF8024_ID_SFP_PLUS_CMIS = 32,\n\tSFF8024_ENCODING_UNSPEC = 0,\n\tSFF8024_ENCODING_8B10B = 1,\n\tSFF8024_ENCODING_4B5B = 2,\n\tSFF8024_ENCODING_NRZ = 3,\n\tSFF8024_ENCODING_8472_MANCHESTER = 4,\n\tSFF8024_ENCODING_8472_SONET = 5,\n\tSFF8024_ENCODING_8472_64B66B = 6,\n\tSFF8024_ENCODING_8436_MANCHESTER = 6,\n\tSFF8024_ENCODING_8436_SONET = 4,\n\tSFF8024_ENCODING_8436_64B66B = 5,\n\tSFF8024_ENCODING_256B257B = 7,\n\tSFF8024_ENCODING_PAM4 = 8,\n\tSFF8024_CONNECTOR_UNSPEC = 0,\n\tSFF8024_CONNECTOR_SC = 1,\n\tSFF8024_CONNECTOR_FIBERJACK = 6,\n\tSFF8024_CONNECTOR_LC = 7,\n\tSFF8024_CONNECTOR_MT_RJ = 8,\n\tSFF8024_CONNECTOR_MU = 9,\n\tSFF8024_CONNECTOR_SG = 10,\n\tSFF8024_CONNECTOR_OPTICAL_PIGTAIL = 11,\n\tSFF8024_CONNECTOR_MPO_1X12 = 12,\n\tSFF8024_CONNECTOR_MPO_2X16 = 13,\n\tSFF8024_CONNECTOR_HSSDC_II = 32,\n\tSFF8024_CONNECTOR_COPPER_PIGTAIL = 33,\n\tSFF8024_CONNECTOR_RJ45 = 34,\n\tSFF8024_CONNECTOR_NOSEPARATE = 35,\n\tSFF8024_CONNECTOR_MXC_2X16 = 36,\n\tSFF8024_ECC_UNSPEC = 0,\n\tSFF8024_ECC_100G_25GAUI_C2M_AOC = 1,\n\tSFF8024_ECC_100GBASE_SR4_25GBASE_SR = 2,\n\tSFF8024_ECC_100GBASE_LR4_25GBASE_LR = 3,\n\tSFF8024_ECC_100GBASE_ER4_25GBASE_ER = 4,\n\tSFF8024_ECC_100GBASE_SR10 = 5,\n\tSFF8024_ECC_100GBASE_CR4 = 11,\n\tSFF8024_ECC_25GBASE_CR_S = 12,\n\tSFF8024_ECC_25GBASE_CR_N = 13,\n\tSFF8024_ECC_10GBASE_T_SFI = 22,\n\tSFF8024_ECC_10GBASE_T_SR = 28,\n\tSFF8024_ECC_5GBASE_T = 29,\n\tSFF8024_ECC_2_5GBASE_T = 30,\n};\n\nenum {\n\tSFP_PHYS_ID = 0,\n\tSFP_PHYS_EXT_ID = 1,\n\tSFP_PHYS_EXT_ID_SFP = 4,\n\tSFP_CONNECTOR = 2,\n\tSFP_COMPLIANCE = 3,\n\tSFP_ENCODING = 11,\n\tSFP_BR_NOMINAL = 12,\n\tSFP_RATE_ID = 13,\n\tSFF_RID_8079 = 1,\n\tSFF_RID_8431_RX_ONLY = 2,\n\tSFF_RID_8431_TX_ONLY = 4,\n\tSFF_RID_8431 = 6,\n\tSFF_RID_10G8G = 14,\n\tSFP_LINK_LEN_SM_KM = 14,\n\tSFP_LINK_LEN_SM_100M = 15,\n\tSFP_LINK_LEN_50UM_OM2_10M = 16,\n\tSFP_LINK_LEN_62_5UM_OM1_10M = 17,\n\tSFP_LINK_LEN_COPPER_1M = 18,\n\tSFP_LINK_LEN_50UM_OM4_10M = 18,\n\tSFP_LINK_LEN_50UM_OM3_10M = 19,\n\tSFP_VENDOR_NAME = 20,\n\tSFP_VENDOR_OUI = 37,\n\tSFP_VENDOR_PN = 40,\n\tSFP_VENDOR_REV = 56,\n\tSFP_OPTICAL_WAVELENGTH_MSB = 60,\n\tSFP_OPTICAL_WAVELENGTH_LSB = 61,\n\tSFP_CABLE_SPEC = 60,\n\tSFP_CC_BASE = 63,\n\tSFP_OPTIONS = 64,\n\tSFP_OPTIONS_HIGH_POWER_LEVEL = 8192,\n\tSFP_OPTIONS_PAGING_A2 = 4096,\n\tSFP_OPTIONS_RETIMER = 2048,\n\tSFP_OPTIONS_COOLED_XCVR = 1024,\n\tSFP_OPTIONS_POWER_DECL = 512,\n\tSFP_OPTIONS_RX_LINEAR_OUT = 256,\n\tSFP_OPTIONS_RX_DECISION_THRESH = 128,\n\tSFP_OPTIONS_TUNABLE_TX = 64,\n\tSFP_OPTIONS_RATE_SELECT = 32,\n\tSFP_OPTIONS_TX_DISABLE = 16,\n\tSFP_OPTIONS_TX_FAULT = 8,\n\tSFP_OPTIONS_LOS_INVERTED = 4,\n\tSFP_OPTIONS_LOS_NORMAL = 2,\n\tSFP_BR_MAX = 66,\n\tSFP_BR_MIN = 67,\n\tSFP_VENDOR_SN = 68,\n\tSFP_DATECODE = 84,\n\tSFP_DIAGMON = 92,\n\tSFP_DIAGMON_DDM = 64,\n\tSFP_DIAGMON_INT_CAL = 32,\n\tSFP_DIAGMON_EXT_CAL = 16,\n\tSFP_DIAGMON_RXPWR_AVG = 8,\n\tSFP_DIAGMON_ADDRMODE = 4,\n\tSFP_ENHOPTS = 93,\n\tSFP_ENHOPTS_ALARMWARN = 128,\n\tSFP_ENHOPTS_SOFT_TX_DISABLE = 64,\n\tSFP_ENHOPTS_SOFT_TX_FAULT = 32,\n\tSFP_ENHOPTS_SOFT_RX_LOS = 16,\n\tSFP_ENHOPTS_SOFT_RATE_SELECT = 8,\n\tSFP_ENHOPTS_APP_SELECT_SFF8079 = 4,\n\tSFP_ENHOPTS_SOFT_RATE_SFF8431 = 2,\n\tSFP_SFF8472_COMPLIANCE = 94,\n\tSFP_SFF8472_COMPLIANCE_NONE = 0,\n\tSFP_SFF8472_COMPLIANCE_REV9_3 = 1,\n\tSFP_SFF8472_COMPLIANCE_REV9_5 = 2,\n\tSFP_SFF8472_COMPLIANCE_REV10_2 = 3,\n\tSFP_SFF8472_COMPLIANCE_REV10_4 = 4,\n\tSFP_SFF8472_COMPLIANCE_REV11_0 = 5,\n\tSFP_SFF8472_COMPLIANCE_REV11_3 = 6,\n\tSFP_SFF8472_COMPLIANCE_REV11_4 = 7,\n\tSFP_SFF8472_COMPLIANCE_REV12_0 = 8,\n\tSFP_CC_EXT = 95,\n};\n\nenum {\n\tSKBFL_ZEROCOPY_ENABLE = 1,\n\tSKBFL_SHARED_FRAG = 2,\n\tSKBFL_PURE_ZEROCOPY = 4,\n\tSKBFL_DONT_ORPHAN = 8,\n\tSKBFL_MANAGED_FRAG_REFS = 16,\n};\n\nenum {\n\tSKBTX_HW_TSTAMP = 1,\n\tSKBTX_SW_TSTAMP = 2,\n\tSKBTX_IN_PROGRESS = 4,\n\tSKBTX_HW_TSTAMP_USE_CYCLES = 8,\n\tSKBTX_WIFI_STATUS = 16,\n\tSKBTX_HW_TSTAMP_NETDEV = 32,\n\tSKBTX_SCHED_TSTAMP = 64,\n};\n\nenum {\n\tSKB_FCLONE_UNAVAILABLE = 0,\n\tSKB_FCLONE_ORIG = 1,\n\tSKB_FCLONE_CLONE = 2,\n};\n\nenum {\n\tSKB_GSO_TCPV4 = 1,\n\tSKB_GSO_DODGY = 2,\n\tSKB_GSO_TCP_ECN = 4,\n\tSKB_GSO_TCP_FIXEDID = 8,\n\tSKB_GSO_TCPV6 = 16,\n\tSKB_GSO_FCOE = 32,\n\tSKB_GSO_GRE = 64,\n\tSKB_GSO_GRE_CSUM = 128,\n\tSKB_GSO_IPXIP4 = 256,\n\tSKB_GSO_IPXIP6 = 512,\n\tSKB_GSO_UDP_TUNNEL = 1024,\n\tSKB_GSO_UDP_TUNNEL_CSUM = 2048,\n\tSKB_GSO_PARTIAL = 4096,\n\tSKB_GSO_TUNNEL_REMCSUM = 8192,\n\tSKB_GSO_SCTP = 16384,\n\tSKB_GSO_ESP = 32768,\n\tSKB_GSO_UDP = 65536,\n\tSKB_GSO_UDP_L4 = 131072,\n\tSKB_GSO_FRAGLIST = 262144,\n};\n\nenum {\n\tSKCIPHER_WALK_PHYS = 1,\n\tSKCIPHER_WALK_SLOW = 2,\n\tSKCIPHER_WALK_COPY = 4,\n\tSKCIPHER_WALK_DIFF = 8,\n\tSKCIPHER_WALK_SLEEP = 16,\n};\n\nenum {\n\tSKX_PCI_UNCORE_IMC = 0,\n\tSKX_PCI_UNCORE_M2M = 1,\n\tSKX_PCI_UNCORE_UPI = 2,\n\tSKX_PCI_UNCORE_M2PCIE = 3,\n\tSKX_PCI_UNCORE_M3UPI = 4,\n};\n\nenum {\n\tSK_DIAG_BPF_STORAGE_NONE = 0,\n\tSK_DIAG_BPF_STORAGE_PAD = 1,\n\tSK_DIAG_BPF_STORAGE_MAP_ID = 2,\n\tSK_DIAG_BPF_STORAGE_MAP_VALUE = 3,\n\t__SK_DIAG_BPF_STORAGE_MAX = 4,\n};\n\nenum {\n\tSK_DIAG_BPF_STORAGE_REP_NONE = 0,\n\tSK_DIAG_BPF_STORAGE = 1,\n\t__SK_DIAG_BPF_STORAGE_REP_MAX = 2,\n};\n\nenum {\n\tSK_DIAG_BPF_STORAGE_REQ_NONE = 0,\n\tSK_DIAG_BPF_STORAGE_REQ_MAP_FD = 1,\n\t__SK_DIAG_BPF_STORAGE_REQ_MAX = 2,\n};\n\nenum {\n\tSK_MEMINFO_RMEM_ALLOC = 0,\n\tSK_MEMINFO_RCVBUF = 1,\n\tSK_MEMINFO_WMEM_ALLOC = 2,\n\tSK_MEMINFO_SNDBUF = 3,\n\tSK_MEMINFO_FWD_ALLOC = 4,\n\tSK_MEMINFO_WMEM_QUEUED = 5,\n\tSK_MEMINFO_OPTMEM = 6,\n\tSK_MEMINFO_BACKLOG = 7,\n\tSK_MEMINFO_DROPS = 8,\n\tSK_MEMINFO_VARS = 9,\n};\n\nenum {\n\tSNBEP_PCI_QPI_PORT0_FILTER = 0,\n\tSNBEP_PCI_QPI_PORT1_FILTER = 1,\n\tBDX_PCI_QPI_PORT2_FILTER = 2,\n};\n\nenum {\n\tSNBEP_PCI_UNCORE_HA = 0,\n\tSNBEP_PCI_UNCORE_IMC = 1,\n\tSNBEP_PCI_UNCORE_QPI = 2,\n\tSNBEP_PCI_UNCORE_R2PCIE = 3,\n\tSNBEP_PCI_UNCORE_R3QPI = 4,\n};\n\nenum {\n\tSNB_PCI_UNCORE_IMC = 0,\n};\n\nenum {\n\tSNR_PCI_UNCORE_M2M = 0,\n\tSNR_PCI_UNCORE_PCIE3 = 1,\n};\n\nenum {\n\tSNR_QAT_PMON_ID = 0,\n\tSNR_CBDMA_DMI_PMON_ID = 1,\n\tSNR_NIS_PMON_ID = 2,\n\tSNR_DLB_PMON_ID = 3,\n\tSNR_PCIE_GEN3_PMON_ID = 4,\n};\n\nenum {\n\tSOCK_WAKE_IO = 0,\n\tSOCK_WAKE_WAITD = 1,\n\tSOCK_WAKE_SPACE = 2,\n\tSOCK_WAKE_URG = 3,\n};\n\nenum {\n\tSOF_TIMESTAMPING_TX_HARDWARE = 1,\n\tSOF_TIMESTAMPING_TX_SOFTWARE = 2,\n\tSOF_TIMESTAMPING_RX_HARDWARE = 4,\n\tSOF_TIMESTAMPING_RX_SOFTWARE = 8,\n\tSOF_TIMESTAMPING_SOFTWARE = 16,\n\tSOF_TIMESTAMPING_SYS_HARDWARE = 32,\n\tSOF_TIMESTAMPING_RAW_HARDWARE = 64,\n\tSOF_TIMESTAMPING_OPT_ID = 128,\n\tSOF_TIMESTAMPING_TX_SCHED = 256,\n\tSOF_TIMESTAMPING_TX_ACK = 512,\n\tSOF_TIMESTAMPING_OPT_CMSG = 1024,\n\tSOF_TIMESTAMPING_OPT_TSONLY = 2048,\n\tSOF_TIMESTAMPING_OPT_STATS = 4096,\n\tSOF_TIMESTAMPING_OPT_PKTINFO = 8192,\n\tSOF_TIMESTAMPING_OPT_TX_SWHW = 16384,\n\tSOF_TIMESTAMPING_BIND_PHC = 32768,\n\tSOF_TIMESTAMPING_OPT_ID_TCP = 65536,\n\tSOF_TIMESTAMPING_LAST = 65536,\n\tSOF_TIMESTAMPING_MASK = 131071,\n};\n\nenum {\n\tSR_DMAR_FECTL_REG = 0,\n\tSR_DMAR_FEDATA_REG = 1,\n\tSR_DMAR_FEADDR_REG = 2,\n\tSR_DMAR_FEUADDR_REG = 3,\n\tMAX_SR_DMAR_REGS = 4,\n};\n\nenum {\n\tSUN_WHOLE_DISK = 5,\n\tLINUX_RAID_PARTITION___2 = 253,\n};\n\nenum {\n\tSWITCHTEC_GAS_MRPC_OFFSET = 0,\n\tSWITCHTEC_GAS_TOP_CFG_OFFSET = 4096,\n\tSWITCHTEC_GAS_SW_EVENT_OFFSET = 6144,\n\tSWITCHTEC_GAS_SYS_INFO_OFFSET = 8192,\n\tSWITCHTEC_GAS_FLASH_INFO_OFFSET = 8704,\n\tSWITCHTEC_GAS_PART_CFG_OFFSET = 16384,\n\tSWITCHTEC_GAS_NTB_OFFSET = 65536,\n\tSWITCHTEC_GAS_PFF_CSR_OFFSET = 1261568,\n};\n\nenum {\n\tSWITCHTEC_NTB_REG_INFO_OFFSET = 0,\n\tSWITCHTEC_NTB_REG_CTRL_OFFSET = 16384,\n\tSWITCHTEC_NTB_REG_DBMSG_OFFSET = 409600,\n};\n\nenum {\n\tSWMII_SPEED_10 = 0,\n\tSWMII_SPEED_100 = 1,\n\tSWMII_SPEED_1000 = 2,\n\tSWMII_DUPLEX_HALF = 0,\n\tSWMII_DUPLEX_FULL = 1,\n};\n\nenum {\n\tSWP_USED = 1,\n\tSWP_WRITEOK = 2,\n\tSWP_DISCARDABLE = 4,\n\tSWP_DISCARDING = 8,\n\tSWP_SOLIDSTATE = 16,\n\tSWP_CONTINUED = 32,\n\tSWP_BLKDEV = 64,\n\tSWP_ACTIVATED = 128,\n\tSWP_FS_OPS = 256,\n\tSWP_AREA_DISCARD = 512,\n\tSWP_PAGE_DISCARD = 1024,\n\tSWP_STABLE_WRITES = 2048,\n\tSWP_SYNCHRONOUS_IO = 4096,\n\tSWP_SCANNING = 16384,\n};\n\nenum {\n\tSX150X_123 = 0,\n\tSX150X_456 = 1,\n\tSX150X_789 = 2,\n};\n\nenum {\n\tSX150X_789_REG_MISC_AUTOCLEAR_OFF = 1,\n\tSX150X_MAX_REGISTER = 173,\n\tSX150X_IRQ_TYPE_EDGE_RISING = 1,\n\tSX150X_IRQ_TYPE_EDGE_FALLING = 2,\n\tSX150X_789_RESET_KEY1 = 18,\n\tSX150X_789_RESET_KEY2 = 52,\n};\n\nenum {\n\tSYNTH_ERR_BAD_NAME = 0,\n\tSYNTH_ERR_INVALID_CMD = 1,\n\tSYNTH_ERR_INVALID_DYN_CMD = 2,\n\tSYNTH_ERR_EVENT_EXISTS = 3,\n\tSYNTH_ERR_TOO_MANY_FIELDS = 4,\n\tSYNTH_ERR_INCOMPLETE_TYPE = 5,\n\tSYNTH_ERR_INVALID_TYPE = 6,\n\tSYNTH_ERR_INVALID_FIELD = 7,\n\tSYNTH_ERR_INVALID_ARRAY_SPEC = 8,\n};\n\nenum {\n\tTASKLET_STATE_SCHED = 0,\n\tTASKLET_STATE_RUN = 1,\n};\n\nenum {\n\tTASKSTATS_CMD_ATTR_UNSPEC = 0,\n\tTASKSTATS_CMD_ATTR_PID = 1,\n\tTASKSTATS_CMD_ATTR_TGID = 2,\n\tTASKSTATS_CMD_ATTR_REGISTER_CPUMASK = 3,\n\tTASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 4,\n\t__TASKSTATS_CMD_ATTR_MAX = 5,\n};\n\nenum {\n\tTASKSTATS_CMD_UNSPEC = 0,\n\tTASKSTATS_CMD_GET = 1,\n\tTASKSTATS_CMD_NEW = 2,\n\t__TASKSTATS_CMD_MAX = 3,\n};\n\nenum {\n\tTASKSTATS_TYPE_UNSPEC = 0,\n\tTASKSTATS_TYPE_PID = 1,\n\tTASKSTATS_TYPE_TGID = 2,\n\tTASKSTATS_TYPE_STATS = 3,\n\tTASKSTATS_TYPE_AGGR_PID = 4,\n\tTASKSTATS_TYPE_AGGR_TGID = 5,\n\tTASKSTATS_TYPE_NULL = 6,\n\t__TASKSTATS_TYPE_MAX = 7,\n};\n\nenum {\n\tTASK_COMM_LEN = 16,\n};\n\nenum {\n\tTB_SHUTDOWN_REBOOT = 0,\n\tTB_SHUTDOWN_S5 = 1,\n\tTB_SHUTDOWN_S4 = 2,\n\tTB_SHUTDOWN_S3 = 3,\n\tTB_SHUTDOWN_HALT = 4,\n\tTB_SHUTDOWN_WFS = 5,\n};\n\nenum {\n\tTCA_ACT_UNSPEC = 0,\n\tTCA_ACT_KIND = 1,\n\tTCA_ACT_OPTIONS = 2,\n\tTCA_ACT_INDEX = 3,\n\tTCA_ACT_STATS = 4,\n\tTCA_ACT_PAD = 5,\n\tTCA_ACT_COOKIE = 6,\n\tTCA_ACT_FLAGS = 7,\n\tTCA_ACT_HW_STATS = 8,\n\tTCA_ACT_USED_HW_STATS = 9,\n\tTCA_ACT_IN_HW_COUNT = 10,\n\t__TCA_ACT_MAX = 11,\n};\n\nenum {\n\tTCA_EMATCH_TREE_UNSPEC = 0,\n\tTCA_EMATCH_TREE_HDR = 1,\n\tTCA_EMATCH_TREE_LIST = 2,\n\t__TCA_EMATCH_TREE_MAX = 3,\n};\n\nenum {\n\tTCA_FLOWER_KEY_CT_FLAGS_NEW = 1,\n\tTCA_FLOWER_KEY_CT_FLAGS_ESTABLISHED = 2,\n\tTCA_FLOWER_KEY_CT_FLAGS_RELATED = 4,\n\tTCA_FLOWER_KEY_CT_FLAGS_TRACKED = 8,\n\tTCA_FLOWER_KEY_CT_FLAGS_INVALID = 16,\n\tTCA_FLOWER_KEY_CT_FLAGS_REPLY = 32,\n\t__TCA_FLOWER_KEY_CT_FLAGS_MAX = 33,\n};\n\nenum {\n\tTCA_FLOWER_KEY_FLAGS_IS_FRAGMENT = 1,\n\tTCA_FLOWER_KEY_FLAGS_FRAG_IS_FIRST = 2,\n\tTCA_FLOWER_KEY_FLAGS_TUNNEL_CSUM = 4,\n\tTCA_FLOWER_KEY_FLAGS_TUNNEL_DONT_FRAGMENT = 8,\n\tTCA_FLOWER_KEY_FLAGS_TUNNEL_OAM = 16,\n\tTCA_FLOWER_KEY_FLAGS_TUNNEL_CRIT_OPT = 32,\n\t__TCA_FLOWER_KEY_FLAGS_MAX = 33,\n};\n\nenum {\n\tTCA_ROOT_UNSPEC = 0,\n\tTCA_ROOT_TAB = 1,\n\tTCA_ROOT_FLAGS = 2,\n\tTCA_ROOT_COUNT = 3,\n\tTCA_ROOT_TIME_DELTA = 4,\n\tTCA_ROOT_EXT_WARN_MSG = 5,\n\t__TCA_ROOT_MAX = 6,\n};\n\nenum {\n\tTCA_STAB_UNSPEC = 0,\n\tTCA_STAB_BASE = 1,\n\tTCA_STAB_DATA = 2,\n\t__TCA_STAB_MAX = 3,\n};\n\nenum {\n\tTCA_STATS_UNSPEC = 0,\n\tTCA_STATS_BASIC = 1,\n\tTCA_STATS_RATE_EST = 2,\n\tTCA_STATS_QUEUE = 3,\n\tTCA_STATS_APP = 4,\n\tTCA_STATS_RATE_EST64 = 5,\n\tTCA_STATS_PAD = 6,\n\tTCA_STATS_BASIC_HW = 7,\n\tTCA_STATS_PKT64 = 8,\n\t__TCA_STATS_MAX = 9,\n};\n\nenum {\n\tTCA_UNSPEC = 0,\n\tTCA_KIND = 1,\n\tTCA_OPTIONS = 2,\n\tTCA_STATS = 3,\n\tTCA_XSTATS = 4,\n\tTCA_RATE = 5,\n\tTCA_FCNT = 6,\n\tTCA_STATS2 = 7,\n\tTCA_STAB = 8,\n\tTCA_PAD = 9,\n\tTCA_DUMP_INVISIBLE = 10,\n\tTCA_CHAIN = 11,\n\tTCA_HW_OFFLOAD = 12,\n\tTCA_INGRESS_BLOCK = 13,\n\tTCA_EGRESS_BLOCK = 14,\n\tTCA_DUMP_FLAGS = 15,\n\tTCA_EXT_WARN_MSG = 16,\n\t__TCA_MAX = 17,\n};\n\nenum {\n\tTCG_SECP_00 = 0,\n\tTCG_SECP_01 = 1,\n};\n\nenum {\n\tTCPF_ESTABLISHED = 2,\n\tTCPF_SYN_SENT = 4,\n\tTCPF_SYN_RECV = 8,\n\tTCPF_FIN_WAIT1 = 16,\n\tTCPF_FIN_WAIT2 = 32,\n\tTCPF_TIME_WAIT = 64,\n\tTCPF_CLOSE = 128,\n\tTCPF_CLOSE_WAIT = 256,\n\tTCPF_LAST_ACK = 512,\n\tTCPF_LISTEN = 1024,\n\tTCPF_CLOSING = 2048,\n\tTCPF_NEW_SYN_RECV = 4096,\n\tTCPF_BOUND_INACTIVE = 8192,\n};\n\nenum {\n\tTCP_BPF_BASE = 0,\n\tTCP_BPF_TX = 1,\n\tTCP_BPF_RX = 2,\n\tTCP_BPF_TXRX = 3,\n\tTCP_BPF_NUM_CFGS = 4,\n};\n\nenum {\n\tTCP_BPF_IPV4 = 0,\n\tTCP_BPF_IPV6 = 1,\n\tTCP_BPF_NUM_PROTS = 2,\n};\n\nenum {\n\tTCP_BPF_IW = 1001,\n\tTCP_BPF_SNDCWND_CLAMP = 1002,\n\tTCP_BPF_DELACK_MAX = 1003,\n\tTCP_BPF_RTO_MIN = 1004,\n\tTCP_BPF_SYN = 1005,\n\tTCP_BPF_SYN_IP = 1006,\n\tTCP_BPF_SYN_MAC = 1007,\n};\n\nenum {\n\tTCP_CMSG_INQ = 1,\n\tTCP_CMSG_TS = 2,\n};\n\nenum {\n\tTCP_ESTABLISHED = 1,\n\tTCP_SYN_SENT = 2,\n\tTCP_SYN_RECV = 3,\n\tTCP_FIN_WAIT1 = 4,\n\tTCP_FIN_WAIT2 = 5,\n\tTCP_TIME_WAIT = 6,\n\tTCP_CLOSE = 7,\n\tTCP_CLOSE_WAIT = 8,\n\tTCP_LAST_ACK = 9,\n\tTCP_LISTEN = 10,\n\tTCP_CLOSING = 11,\n\tTCP_NEW_SYN_RECV = 12,\n\tTCP_BOUND_INACTIVE = 13,\n\tTCP_MAX_STATES = 14,\n};\n\nenum {\n\tTCP_FLAG_CWR = 32768,\n\tTCP_FLAG_ECE = 16384,\n\tTCP_FLAG_URG = 8192,\n\tTCP_FLAG_ACK = 4096,\n\tTCP_FLAG_PSH = 2048,\n\tTCP_FLAG_RST = 1024,\n\tTCP_FLAG_SYN = 512,\n\tTCP_FLAG_FIN = 256,\n\tTCP_RESERVED_BITS = 15,\n\tTCP_DATA_OFFSET = 240,\n};\n\nenum {\n\tTCP_METRICS_ATTR_UNSPEC = 0,\n\tTCP_METRICS_ATTR_ADDR_IPV4 = 1,\n\tTCP_METRICS_ATTR_ADDR_IPV6 = 2,\n\tTCP_METRICS_ATTR_AGE = 3,\n\tTCP_METRICS_ATTR_TW_TSVAL = 4,\n\tTCP_METRICS_ATTR_TW_TS_STAMP = 5,\n\tTCP_METRICS_ATTR_VALS = 6,\n\tTCP_METRICS_ATTR_FOPEN_MSS = 7,\n\tTCP_METRICS_ATTR_FOPEN_SYN_DROPS = 8,\n\tTCP_METRICS_ATTR_FOPEN_SYN_DROP_TS = 9,\n\tTCP_METRICS_ATTR_FOPEN_COOKIE = 10,\n\tTCP_METRICS_ATTR_SADDR_IPV4 = 11,\n\tTCP_METRICS_ATTR_SADDR_IPV6 = 12,\n\tTCP_METRICS_ATTR_PAD = 13,\n\t__TCP_METRICS_ATTR_MAX = 14,\n};\n\nenum {\n\tTCP_METRICS_CMD_UNSPEC = 0,\n\tTCP_METRICS_CMD_GET = 1,\n\tTCP_METRICS_CMD_DEL = 2,\n\t__TCP_METRICS_CMD_MAX = 3,\n};\n\nenum {\n\tTCP_MIB_NUM = 0,\n\tTCP_MIB_RTOALGORITHM = 1,\n\tTCP_MIB_RTOMIN = 2,\n\tTCP_MIB_RTOMAX = 3,\n\tTCP_MIB_MAXCONN = 4,\n\tTCP_MIB_ACTIVEOPENS = 5,\n\tTCP_MIB_PASSIVEOPENS = 6,\n\tTCP_MIB_ATTEMPTFAILS = 7,\n\tTCP_MIB_ESTABRESETS = 8,\n\tTCP_MIB_CURRESTAB = 9,\n\tTCP_MIB_INSEGS = 10,\n\tTCP_MIB_OUTSEGS = 11,\n\tTCP_MIB_RETRANSSEGS = 12,\n\tTCP_MIB_INERRS = 13,\n\tTCP_MIB_OUTRSTS = 14,\n\tTCP_MIB_CSUMERRORS = 15,\n\t__TCP_MIB_MAX = 16,\n};\n\nenum {\n\tTCP_NLA_PAD = 0,\n\tTCP_NLA_BUSY = 1,\n\tTCP_NLA_RWND_LIMITED = 2,\n\tTCP_NLA_SNDBUF_LIMITED = 3,\n\tTCP_NLA_DATA_SEGS_OUT = 4,\n\tTCP_NLA_TOTAL_RETRANS = 5,\n\tTCP_NLA_PACING_RATE = 6,\n\tTCP_NLA_DELIVERY_RATE = 7,\n\tTCP_NLA_SND_CWND = 8,\n\tTCP_NLA_REORDERING = 9,\n\tTCP_NLA_MIN_RTT = 10,\n\tTCP_NLA_RECUR_RETRANS = 11,\n\tTCP_NLA_DELIVERY_RATE_APP_LMT = 12,\n\tTCP_NLA_SNDQ_SIZE = 13,\n\tTCP_NLA_CA_STATE = 14,\n\tTCP_NLA_SND_SSTHRESH = 15,\n\tTCP_NLA_DELIVERED = 16,\n\tTCP_NLA_DELIVERED_CE = 17,\n\tTCP_NLA_BYTES_SENT = 18,\n\tTCP_NLA_BYTES_RETRANS = 19,\n\tTCP_NLA_DSACK_DUPS = 20,\n\tTCP_NLA_REORD_SEEN = 21,\n\tTCP_NLA_SRTT = 22,\n\tTCP_NLA_TIMEOUT_REHASH = 23,\n\tTCP_NLA_BYTES_NOTSENT = 24,\n\tTCP_NLA_EDT = 25,\n\tTCP_NLA_TTL = 26,\n\tTCP_NLA_REHASH = 27,\n};\n\nenum {\n\tTCP_NO_QUEUE = 0,\n\tTCP_RECV_QUEUE = 1,\n\tTCP_SEND_QUEUE = 2,\n\tTCP_QUEUES_NR = 3,\n};\n\nenum {\n\tTEST_NONE = 0,\n\tTEST_CORE = 1,\n\tTEST_CPUS = 2,\n\tTEST_PLATFORM = 3,\n\tTEST_DEVICES = 4,\n\tTEST_FREEZER = 5,\n\t__TEST_AFTER_LAST = 6,\n};\n\nenum {\n\tTLS_ALERT_DESC_CLOSE_NOTIFY = 0,\n\tTLS_ALERT_DESC_UNEXPECTED_MESSAGE = 10,\n\tTLS_ALERT_DESC_BAD_RECORD_MAC = 20,\n\tTLS_ALERT_DESC_RECORD_OVERFLOW = 22,\n\tTLS_ALERT_DESC_HANDSHAKE_FAILURE = 40,\n\tTLS_ALERT_DESC_BAD_CERTIFICATE = 42,\n\tTLS_ALERT_DESC_UNSUPPORTED_CERTIFICATE = 43,\n\tTLS_ALERT_DESC_CERTIFICATE_REVOKED = 44,\n\tTLS_ALERT_DESC_CERTIFICATE_EXPIRED = 45,\n\tTLS_ALERT_DESC_CERTIFICATE_UNKNOWN = 46,\n\tTLS_ALERT_DESC_ILLEGAL_PARAMETER = 47,\n\tTLS_ALERT_DESC_UNKNOWN_CA = 48,\n\tTLS_ALERT_DESC_ACCESS_DENIED = 49,\n\tTLS_ALERT_DESC_DECODE_ERROR = 50,\n\tTLS_ALERT_DESC_DECRYPT_ERROR = 51,\n\tTLS_ALERT_DESC_TOO_MANY_CIDS_REQUESTED = 52,\n\tTLS_ALERT_DESC_PROTOCOL_VERSION = 70,\n\tTLS_ALERT_DESC_INSUFFICIENT_SECURITY = 71,\n\tTLS_ALERT_DESC_INTERNAL_ERROR = 80,\n\tTLS_ALERT_DESC_INAPPROPRIATE_FALLBACK = 86,\n\tTLS_ALERT_DESC_USER_CANCELED = 90,\n\tTLS_ALERT_DESC_MISSING_EXTENSION = 109,\n\tTLS_ALERT_DESC_UNSUPPORTED_EXTENSION = 110,\n\tTLS_ALERT_DESC_UNRECOGNIZED_NAME = 112,\n\tTLS_ALERT_DESC_BAD_CERTIFICATE_STATUS_RESPONSE = 113,\n\tTLS_ALERT_DESC_UNKNOWN_PSK_IDENTITY = 115,\n\tTLS_ALERT_DESC_CERTIFICATE_REQUIRED = 116,\n\tTLS_ALERT_DESC_NO_APPLICATION_PROTOCOL = 120,\n};\n\nenum {\n\tTLS_ALERT_LEVEL_WARNING = 1,\n\tTLS_ALERT_LEVEL_FATAL = 2,\n};\n\nenum {\n\tTLS_NO_KEYRING = 0,\n\tTLS_NO_PEERID = 0,\n\tTLS_NO_CERT = 0,\n\tTLS_NO_PRIVKEY = 0,\n};\n\nenum {\n\tTLS_RECORD_TYPE_CHANGE_CIPHER_SPEC = 20,\n\tTLS_RECORD_TYPE_ALERT = 21,\n\tTLS_RECORD_TYPE_HANDSHAKE = 22,\n\tTLS_RECORD_TYPE_DATA = 23,\n\tTLS_RECORD_TYPE_HEARTBEAT = 24,\n\tTLS_RECORD_TYPE_TLS12_CID = 25,\n\tTLS_RECORD_TYPE_ACK = 26,\n};\n\nenum {\n\tTOO_MANY_CLOSE = -1,\n\tTOO_MANY_OPEN = -2,\n\tMISSING_QUOTE = -3,\n};\n\nenum {\n\tTPS65090_IRQ_INTERRUPT = 0,\n\tTPS65090_IRQ_VAC_STATUS_CHANGE = 1,\n\tTPS65090_IRQ_VSYS_STATUS_CHANGE = 2,\n\tTPS65090_IRQ_BAT_STATUS_CHANGE = 3,\n\tTPS65090_IRQ_CHARGING_STATUS_CHANGE = 4,\n\tTPS65090_IRQ_CHARGING_COMPLETE = 5,\n\tTPS65090_IRQ_OVERLOAD_DCDC1 = 6,\n\tTPS65090_IRQ_OVERLOAD_DCDC2 = 7,\n\tTPS65090_IRQ_OVERLOAD_DCDC3 = 8,\n\tTPS65090_IRQ_OVERLOAD_FET1 = 9,\n\tTPS65090_IRQ_OVERLOAD_FET2 = 10,\n\tTPS65090_IRQ_OVERLOAD_FET3 = 11,\n\tTPS65090_IRQ_OVERLOAD_FET4 = 12,\n\tTPS65090_IRQ_OVERLOAD_FET5 = 13,\n\tTPS65090_IRQ_OVERLOAD_FET6 = 14,\n\tTPS65090_IRQ_OVERLOAD_FET7 = 15,\n};\n\nenum {\n\tTPS65090_REGULATOR_DCDC1 = 0,\n\tTPS65090_REGULATOR_DCDC2 = 1,\n\tTPS65090_REGULATOR_DCDC3 = 2,\n\tTPS65090_REGULATOR_FET1 = 3,\n\tTPS65090_REGULATOR_FET2 = 4,\n\tTPS65090_REGULATOR_FET3 = 5,\n\tTPS65090_REGULATOR_FET4 = 6,\n\tTPS65090_REGULATOR_FET5 = 7,\n\tTPS65090_REGULATOR_FET6 = 8,\n\tTPS65090_REGULATOR_FET7 = 9,\n\tTPS65090_REGULATOR_LDO1 = 10,\n\tTPS65090_REGULATOR_LDO2 = 11,\n\tTPS65090_REGULATOR_MAX = 12,\n};\n\nenum {\n\tTPS6586X_ID_SYS = 0,\n\tTPS6586X_ID_SM_0 = 1,\n\tTPS6586X_ID_SM_1 = 2,\n\tTPS6586X_ID_SM_2 = 3,\n\tTPS6586X_ID_LDO_0 = 4,\n\tTPS6586X_ID_LDO_1 = 5,\n\tTPS6586X_ID_LDO_2 = 6,\n\tTPS6586X_ID_LDO_3 = 7,\n\tTPS6586X_ID_LDO_4 = 8,\n\tTPS6586X_ID_LDO_5 = 9,\n\tTPS6586X_ID_LDO_6 = 10,\n\tTPS6586X_ID_LDO_7 = 11,\n\tTPS6586X_ID_LDO_8 = 12,\n\tTPS6586X_ID_LDO_9 = 13,\n\tTPS6586X_ID_LDO_RTC = 14,\n\tTPS6586X_ID_MAX_REGULATOR = 15,\n};\n\nenum {\n\tTPS6586X_INT_PLDO_0 = 0,\n\tTPS6586X_INT_PLDO_1 = 1,\n\tTPS6586X_INT_PLDO_2 = 2,\n\tTPS6586X_INT_PLDO_3 = 3,\n\tTPS6586X_INT_PLDO_4 = 4,\n\tTPS6586X_INT_PLDO_5 = 5,\n\tTPS6586X_INT_PLDO_6 = 6,\n\tTPS6586X_INT_PLDO_7 = 7,\n\tTPS6586X_INT_COMP_DET = 8,\n\tTPS6586X_INT_ADC = 9,\n\tTPS6586X_INT_PLDO_8 = 10,\n\tTPS6586X_INT_PLDO_9 = 11,\n\tTPS6586X_INT_PSM_0 = 12,\n\tTPS6586X_INT_PSM_1 = 13,\n\tTPS6586X_INT_PSM_2 = 14,\n\tTPS6586X_INT_PSM_3 = 15,\n\tTPS6586X_INT_RTC_ALM1 = 16,\n\tTPS6586X_INT_ACUSB_OVP = 17,\n\tTPS6586X_INT_USB_DET = 18,\n\tTPS6586X_INT_AC_DET = 19,\n\tTPS6586X_INT_BAT_DET = 20,\n\tTPS6586X_INT_CHG_STAT = 21,\n\tTPS6586X_INT_CHG_TEMP = 22,\n\tTPS6586X_INT_PP = 23,\n\tTPS6586X_INT_RESUME = 24,\n\tTPS6586X_INT_LOW_SYS = 25,\n\tTPS6586X_INT_RTC_ALM2 = 26,\n};\n\nenum {\n\tTP_ERR_FILE_NOT_FOUND = 0,\n\tTP_ERR_NO_REGULAR_FILE = 1,\n\tTP_ERR_BAD_REFCNT = 2,\n\tTP_ERR_REFCNT_OPEN_BRACE = 3,\n\tTP_ERR_BAD_REFCNT_SUFFIX = 4,\n\tTP_ERR_BAD_UPROBE_OFFS = 5,\n\tTP_ERR_BAD_MAXACT_TYPE = 6,\n\tTP_ERR_BAD_MAXACT = 7,\n\tTP_ERR_MAXACT_TOO_BIG = 8,\n\tTP_ERR_BAD_PROBE_ADDR = 9,\n\tTP_ERR_NON_UNIQ_SYMBOL = 10,\n\tTP_ERR_BAD_RETPROBE = 11,\n\tTP_ERR_NO_TRACEPOINT = 12,\n\tTP_ERR_BAD_ADDR_SUFFIX = 13,\n\tTP_ERR_NO_GROUP_NAME = 14,\n\tTP_ERR_GROUP_TOO_LONG = 15,\n\tTP_ERR_BAD_GROUP_NAME = 16,\n\tTP_ERR_NO_EVENT_NAME = 17,\n\tTP_ERR_EVENT_TOO_LONG = 18,\n\tTP_ERR_BAD_EVENT_NAME = 19,\n\tTP_ERR_EVENT_EXIST = 20,\n\tTP_ERR_RETVAL_ON_PROBE = 21,\n\tTP_ERR_NO_RETVAL = 22,\n\tTP_ERR_BAD_STACK_NUM = 23,\n\tTP_ERR_BAD_ARG_NUM = 24,\n\tTP_ERR_BAD_VAR = 25,\n\tTP_ERR_BAD_REG_NAME = 26,\n\tTP_ERR_BAD_MEM_ADDR = 27,\n\tTP_ERR_BAD_IMM = 28,\n\tTP_ERR_IMMSTR_NO_CLOSE = 29,\n\tTP_ERR_FILE_ON_KPROBE = 30,\n\tTP_ERR_BAD_FILE_OFFS = 31,\n\tTP_ERR_SYM_ON_UPROBE = 32,\n\tTP_ERR_TOO_MANY_OPS = 33,\n\tTP_ERR_DEREF_NEED_BRACE = 34,\n\tTP_ERR_BAD_DEREF_OFFS = 35,\n\tTP_ERR_DEREF_OPEN_BRACE = 36,\n\tTP_ERR_COMM_CANT_DEREF = 37,\n\tTP_ERR_BAD_FETCH_ARG = 38,\n\tTP_ERR_ARRAY_NO_CLOSE = 39,\n\tTP_ERR_BAD_ARRAY_SUFFIX = 40,\n\tTP_ERR_BAD_ARRAY_NUM = 41,\n\tTP_ERR_ARRAY_TOO_BIG = 42,\n\tTP_ERR_BAD_TYPE = 43,\n\tTP_ERR_BAD_STRING = 44,\n\tTP_ERR_BAD_SYMSTRING = 45,\n\tTP_ERR_BAD_BITFIELD = 46,\n\tTP_ERR_ARG_NAME_TOO_LONG = 47,\n\tTP_ERR_NO_ARG_NAME = 48,\n\tTP_ERR_BAD_ARG_NAME = 49,\n\tTP_ERR_USED_ARG_NAME = 50,\n\tTP_ERR_ARG_TOO_LONG = 51,\n\tTP_ERR_NO_ARG_BODY = 52,\n\tTP_ERR_BAD_INSN_BNDRY = 53,\n\tTP_ERR_FAIL_REG_PROBE = 54,\n\tTP_ERR_DIFF_PROBE_TYPE = 55,\n\tTP_ERR_DIFF_ARG_TYPE = 56,\n\tTP_ERR_SAME_PROBE = 57,\n\tTP_ERR_NO_EVENT_INFO = 58,\n\tTP_ERR_BAD_ATTACH_EVENT = 59,\n\tTP_ERR_BAD_ATTACH_ARG = 60,\n\tTP_ERR_NO_EP_FILTER = 61,\n\tTP_ERR_NOSUP_BTFARG = 62,\n\tTP_ERR_NO_BTFARG = 63,\n\tTP_ERR_NO_BTF_ENTRY = 64,\n\tTP_ERR_BAD_VAR_ARGS = 65,\n\tTP_ERR_NOFENTRY_ARGS = 66,\n\tTP_ERR_DOUBLE_ARGS = 67,\n\tTP_ERR_ARGS_2LONG = 68,\n\tTP_ERR_ARGIDX_2BIG = 69,\n\tTP_ERR_NO_PTR_STRCT = 70,\n\tTP_ERR_NOSUP_DAT_ARG = 71,\n\tTP_ERR_BAD_HYPHEN = 72,\n\tTP_ERR_NO_BTF_FIELD = 73,\n\tTP_ERR_BAD_BTF_TID = 74,\n\tTP_ERR_BAD_TYPE4STR = 75,\n\tTP_ERR_NEED_STRING_TYPE = 76,\n};\n\nenum {\n\tTRACEFS_EVENT_INODE = 2,\n\tTRACEFS_GID_PERM_SET = 4,\n\tTRACEFS_UID_PERM_SET = 8,\n\tTRACEFS_INSTANCE_INODE = 16,\n};\n\nenum {\n\tTRACE_ARRAY_FL_GLOBAL = 1,\n};\n\nenum {\n\tTRACE_CTX_NMI = 0,\n\tTRACE_CTX_IRQ = 1,\n\tTRACE_CTX_SOFTIRQ = 2,\n\tTRACE_CTX_NORMAL = 3,\n\tTRACE_CTX_TRANSITION = 4,\n};\n\nenum {\n\tTRACE_EVENT_FL_FILTERED = 1,\n\tTRACE_EVENT_FL_CAP_ANY = 2,\n\tTRACE_EVENT_FL_NO_SET_FILTER = 4,\n\tTRACE_EVENT_FL_IGNORE_ENABLE = 8,\n\tTRACE_EVENT_FL_TRACEPOINT = 16,\n\tTRACE_EVENT_FL_DYNAMIC = 32,\n\tTRACE_EVENT_FL_KPROBE = 64,\n\tTRACE_EVENT_FL_UPROBE = 128,\n\tTRACE_EVENT_FL_EPROBE = 256,\n\tTRACE_EVENT_FL_FPROBE = 512,\n\tTRACE_EVENT_FL_CUSTOM = 1024,\n\tTRACE_EVENT_FL_TEST_STR = 2048,\n};\n\nenum {\n\tTRACE_EVENT_FL_FILTERED_BIT = 0,\n\tTRACE_EVENT_FL_CAP_ANY_BIT = 1,\n\tTRACE_EVENT_FL_NO_SET_FILTER_BIT = 2,\n\tTRACE_EVENT_FL_IGNORE_ENABLE_BIT = 3,\n\tTRACE_EVENT_FL_TRACEPOINT_BIT = 4,\n\tTRACE_EVENT_FL_DYNAMIC_BIT = 5,\n\tTRACE_EVENT_FL_KPROBE_BIT = 6,\n\tTRACE_EVENT_FL_UPROBE_BIT = 7,\n\tTRACE_EVENT_FL_EPROBE_BIT = 8,\n\tTRACE_EVENT_FL_FPROBE_BIT = 9,\n\tTRACE_EVENT_FL_CUSTOM_BIT = 10,\n\tTRACE_EVENT_FL_TEST_STR_BIT = 11,\n};\n\nenum {\n\tTRACE_FTRACE_BIT = 0,\n\tTRACE_FTRACE_NMI_BIT = 1,\n\tTRACE_FTRACE_IRQ_BIT = 2,\n\tTRACE_FTRACE_SIRQ_BIT = 3,\n\tTRACE_FTRACE_TRANSITION_BIT = 4,\n\tTRACE_INTERNAL_BIT = 5,\n\tTRACE_INTERNAL_NMI_BIT = 6,\n\tTRACE_INTERNAL_IRQ_BIT = 7,\n\tTRACE_INTERNAL_SIRQ_BIT = 8,\n\tTRACE_INTERNAL_TRANSITION_BIT = 9,\n\tTRACE_BRANCH_BIT = 10,\n\tTRACE_IRQ_BIT = 11,\n\tTRACE_RECORD_RECURSION_BIT = 12,\n};\n\nenum {\n\tTRACE_FUNC_NO_OPTS = 0,\n\tTRACE_FUNC_OPT_STACK = 1,\n\tTRACE_FUNC_OPT_NO_REPEATS = 2,\n\tTRACE_FUNC_OPT_HIGHEST_BIT = 4,\n};\n\nenum {\n\tTRACE_GRAPH_FL = 1,\n\tTRACE_GRAPH_DEPTH_START_BIT = 2,\n\tTRACE_GRAPH_DEPTH_END_BIT = 3,\n\tTRACE_GRAPH_NOTRACE_BIT = 4,\n};\n\nenum {\n\tTRACE_NOP_OPT_ACCEPT = 1,\n\tTRACE_NOP_OPT_REFUSE = 2,\n};\n\nenum {\n\tTRACE_PIDS = 1,\n\tTRACE_NO_PIDS = 2,\n};\n\nenum {\n\tTRACE_SIGNAL_DELIVERED = 0,\n\tTRACE_SIGNAL_IGNORED = 1,\n\tTRACE_SIGNAL_ALREADY_PENDING = 2,\n\tTRACE_SIGNAL_OVERFLOW_FAIL = 3,\n\tTRACE_SIGNAL_LOSE_INFO = 4,\n};\n\nenum {\n\tTVPADDRW = 0,\n\tTVPPDATA = 4,\n\tTVPPMASK = 8,\n\tTVPPADRR = 12,\n\tTVPCADRW = 16,\n\tTVPCDATA = 20,\n\tTVPCADRR = 28,\n\tTVPDCCTL = 36,\n\tTVPIDATA = 40,\n\tTVPCRDAT = 44,\n\tTVPCXPOL = 48,\n\tTVPCXPOH = 52,\n\tTVPCYPOL = 56,\n\tTVPCYPOH = 60,\n};\n\nenum {\n\tTVPIRREV = 1,\n\tTVPIRICC = 6,\n\tTVPIRBRC = 7,\n\tTVPIRLAC = 15,\n\tTVPIRTCC = 24,\n\tTVPIRMXC = 25,\n\tTVPIRCLS = 26,\n\tTVPIRPPG = 28,\n\tTVPIRGEC = 29,\n\tTVPIRMIC = 30,\n\tTVPIRPLA = 44,\n\tTVPIRPPD = 45,\n\tTVPIRMPD = 46,\n\tTVPIRLPD = 47,\n\tTVPIRCKL = 48,\n\tTVPIRCKH = 49,\n\tTVPIRCRL = 50,\n\tTVPIRCRH = 51,\n\tTVPIRCGL = 52,\n\tTVPIRCGH = 53,\n\tTVPIRCBL = 54,\n\tTVPIRCBH = 55,\n\tTVPIRCKC = 56,\n\tTVPIRMLC = 57,\n\tTVPIRSEN = 58,\n\tTVPIRTMD = 59,\n\tTVPIRRML = 60,\n\tTVPIRRMM = 61,\n\tTVPIRRMS = 62,\n\tTVPIRDID = 63,\n\tTVPIRRES = 255,\n};\n\nenum {\n\tTYPE_MAX8998 = 0,\n\tTYPE_LP3974 = 1,\n\tTYPE_LP3979 = 2,\n};\n\nenum {\n\tUDP_BPF_IPV4 = 0,\n\tUDP_BPF_IPV6 = 1,\n\tUDP_BPF_NUM_PROTS = 2,\n};\n\nenum {\n\tUDP_FLAGS_CORK = 0,\n\tUDP_FLAGS_NO_CHECK6_TX = 1,\n\tUDP_FLAGS_NO_CHECK6_RX = 2,\n\tUDP_FLAGS_GRO_ENABLED = 3,\n\tUDP_FLAGS_ACCEPT_FRAGLIST = 4,\n\tUDP_FLAGS_ACCEPT_L4 = 5,\n\tUDP_FLAGS_ENCAP_ENABLED = 6,\n\tUDP_FLAGS_UDPLITE_SEND_CC = 7,\n\tUDP_FLAGS_UDPLITE_RECV_CC = 8,\n};\n\nenum {\n\tUDP_MIB_NUM = 0,\n\tUDP_MIB_INDATAGRAMS = 1,\n\tUDP_MIB_NOPORTS = 2,\n\tUDP_MIB_INERRORS = 3,\n\tUDP_MIB_OUTDATAGRAMS = 4,\n\tUDP_MIB_RCVBUFERRORS = 5,\n\tUDP_MIB_SNDBUFERRORS = 6,\n\tUDP_MIB_CSUMERRORS = 7,\n\tUDP_MIB_IGNOREDMULTI = 8,\n\tUDP_MIB_MEMERRORS = 9,\n\t__UDP_MIB_MAX = 10,\n};\n\nenum {\n\tUNAME26 = 131072,\n\tADDR_NO_RANDOMIZE = 262144,\n\tFDPIC_FUNCPTRS = 524288,\n\tMMAP_PAGE_ZERO = 1048576,\n\tADDR_COMPAT_LAYOUT = 2097152,\n\tREAD_IMPLIES_EXEC = 4194304,\n\tADDR_LIMIT_32BIT = 8388608,\n\tSHORT_INODE = 16777216,\n\tWHOLE_SECONDS = 33554432,\n\tSTICKY_TIMEOUTS = 67108864,\n\tADDR_LIMIT_3GB = 134217728,\n};\n\nenum {\n\tUNDEFINED_CAPABLE = 0,\n\tSYSTEM_INTEL_MSR_CAPABLE = 1,\n\tSYSTEM_AMD_MSR_CAPABLE = 2,\n\tSYSTEM_IO_CAPABLE = 3,\n};\n\nenum {\n\tUV_AFFINITY_ALL = 0,\n\tUV_AFFINITY_NODE = 1,\n\tUV_AFFINITY_CPU = 2,\n};\n\nenum {\n\tVP_MSIX_CONFIG_VECTOR = 0,\n\tVP_MSIX_VQ_VECTOR = 1,\n};\n\nenum {\n\tVTIME_PER_SEC_SHIFT = 37ULL,\n\tVTIME_PER_SEC = 137438953472ULL,\n\tVTIME_PER_USEC = 137438ULL,\n\tVTIME_PER_NSEC = 137ULL,\n\tVRATE_MIN_PPM = 10000ULL,\n\tVRATE_MAX_PPM = 100000000ULL,\n\tVRATE_MIN = 1374ULL,\n\tVRATE_CLAMP_ADJ_PCT = 4ULL,\n\tAUTOP_CYCLE_NSEC = 10000000000ULL,\n};\n\nenum {\n\tWALK_TRAILING = 1,\n\tWALK_MORE = 2,\n\tWALK_NOFOLLOW = 4,\n};\n\nenum {\n\tWBT_RWQ_BG = 0,\n\tWBT_RWQ_SWAP = 1,\n\tWBT_RWQ_DISCARD = 2,\n\tWBT_NUM_RWQ = 3,\n};\n\nenum {\n\tWBT_STATE_ON_DEFAULT = 1,\n\tWBT_STATE_ON_MANUAL = 2,\n\tWBT_STATE_OFF_DEFAULT = 3,\n\tWBT_STATE_OFF_MANUAL = 4,\n};\n\nenum {\n\tX2APIC_OFF = 0,\n\tX2APIC_DISABLED = 1,\n\tX2APIC_ON = 2,\n\tX2APIC_ON_LOCKED = 3,\n};\n\nenum {\n\tX86_BR_NONE = 0,\n\tX86_BR_USER = 1,\n\tX86_BR_KERNEL = 2,\n\tX86_BR_CALL = 4,\n\tX86_BR_RET = 8,\n\tX86_BR_SYSCALL = 16,\n\tX86_BR_SYSRET = 32,\n\tX86_BR_INT = 64,\n\tX86_BR_IRET = 128,\n\tX86_BR_JCC = 256,\n\tX86_BR_JMP = 512,\n\tX86_BR_IRQ = 1024,\n\tX86_BR_IND_CALL = 2048,\n\tX86_BR_ABORT = 4096,\n\tX86_BR_IN_TX = 8192,\n\tX86_BR_NO_TX = 16384,\n\tX86_BR_ZERO_CALL = 32768,\n\tX86_BR_CALL_STACK = 65536,\n\tX86_BR_IND_JMP = 131072,\n\tX86_BR_TYPE_SAVE = 262144,\n};\n\nenum {\n\tX86_IRQ_ALLOC_LEGACY = 1,\n};\n\nenum {\n\tX86_PERF_KFREE_SHARED = 0,\n\tX86_PERF_KFREE_EXCL = 1,\n\tX86_PERF_KFREE_MAX = 2,\n};\n\nenum {\n\tXA_CHECK_SCHED = 4096,\n};\n\nenum {\n\tXDP_ATTACHED_NONE = 0,\n\tXDP_ATTACHED_DRV = 1,\n\tXDP_ATTACHED_SKB = 2,\n\tXDP_ATTACHED_HW = 3,\n\tXDP_ATTACHED_MULTI = 4,\n};\n\nenum {\n\tXFRM_DEV_OFFLOAD_FLAG_ACQ = 1,\n};\n\nenum {\n\tXFRM_DEV_OFFLOAD_IN = 1,\n\tXFRM_DEV_OFFLOAD_OUT = 2,\n\tXFRM_DEV_OFFLOAD_FWD = 3,\n};\n\nenum {\n\tXFRM_DEV_OFFLOAD_UNSPECIFIED = 0,\n\tXFRM_DEV_OFFLOAD_CRYPTO = 1,\n\tXFRM_DEV_OFFLOAD_PACKET = 2,\n};\n\nenum {\n\tXFRM_LOOKUP_ICMP = 1,\n\tXFRM_LOOKUP_QUEUE = 2,\n\tXFRM_LOOKUP_KEEP_DST_REF = 4,\n};\n\nenum {\n\tXFRM_MODE_FLAG_TUNNEL = 1,\n};\n\nenum {\n\tXFRM_MSG_BASE = 16,\n\tXFRM_MSG_NEWSA = 16,\n\tXFRM_MSG_DELSA = 17,\n\tXFRM_MSG_GETSA = 18,\n\tXFRM_MSG_NEWPOLICY = 19,\n\tXFRM_MSG_DELPOLICY = 20,\n\tXFRM_MSG_GETPOLICY = 21,\n\tXFRM_MSG_ALLOCSPI = 22,\n\tXFRM_MSG_ACQUIRE = 23,\n\tXFRM_MSG_EXPIRE = 24,\n\tXFRM_MSG_UPDPOLICY = 25,\n\tXFRM_MSG_UPDSA = 26,\n\tXFRM_MSG_POLEXPIRE = 27,\n\tXFRM_MSG_FLUSHSA = 28,\n\tXFRM_MSG_FLUSHPOLICY = 29,\n\tXFRM_MSG_NEWAE = 30,\n\tXFRM_MSG_GETAE = 31,\n\tXFRM_MSG_REPORT = 32,\n\tXFRM_MSG_MIGRATE = 33,\n\tXFRM_MSG_NEWSADINFO = 34,\n\tXFRM_MSG_GETSADINFO = 35,\n\tXFRM_MSG_NEWSPDINFO = 36,\n\tXFRM_MSG_GETSPDINFO = 37,\n\tXFRM_MSG_MAPPING = 38,\n\tXFRM_MSG_SETDEFAULT = 39,\n\tXFRM_MSG_GETDEFAULT = 40,\n\t__XFRM_MSG_MAX = 41,\n};\n\nenum {\n\tXFRM_POLICY_IN = 0,\n\tXFRM_POLICY_OUT = 1,\n\tXFRM_POLICY_FWD = 2,\n\tXFRM_POLICY_MASK = 3,\n\tXFRM_POLICY_MAX = 3,\n};\n\nenum {\n\tXFRM_POLICY_TYPE_MAIN = 0,\n\tXFRM_POLICY_TYPE_SUB = 1,\n\tXFRM_POLICY_TYPE_MAX = 2,\n\tXFRM_POLICY_TYPE_ANY = 255,\n};\n\nenum {\n\tXFRM_STATE_VOID = 0,\n\tXFRM_STATE_ACQ = 1,\n\tXFRM_STATE_VALID = 2,\n\tXFRM_STATE_ERROR = 3,\n\tXFRM_STATE_EXPIRED = 4,\n\tXFRM_STATE_DEAD = 5,\n};\n\nenum {\n\tZONELIST_FALLBACK = 0,\n\tZONELIST_NOFALLBACK = 1,\n\tMAX_ZONELISTS = 2,\n};\n\nenum {\n\tZSTDbss_compress = 0,\n\tZSTDbss_noCompress = 1,\n};\n\nenum {\n\t_DQUOT_USAGE_ENABLED = 0,\n\t_DQUOT_LIMITS_ENABLED = 1,\n\t_DQUOT_SUSPENDED = 2,\n\t_DQUOT_STATE_FLAGS = 3,\n};\n\nenum {\n\t_IRQ_DEFAULT_INIT_FLAGS = 0,\n\t_IRQ_PER_CPU = 512,\n\t_IRQ_LEVEL = 256,\n\t_IRQ_NOPROBE = 1024,\n\t_IRQ_NOREQUEST = 2048,\n\t_IRQ_NOTHREAD = 65536,\n\t_IRQ_NOAUTOEN = 4096,\n\t_IRQ_MOVE_PCNTXT = 16384,\n\t_IRQ_NO_BALANCING = 8192,\n\t_IRQ_NESTED_THREAD = 32768,\n\t_IRQ_PER_CPU_DEVID = 131072,\n\t_IRQ_IS_POLLED = 262144,\n\t_IRQ_DISABLE_UNLAZY = 524288,\n\t_IRQ_HIDDEN = 1048576,\n\t_IRQ_NO_DEBUG = 2097152,\n\t_IRQF_MODIFY_MASK = 2096911,\n};\n\nenum {\n\t__IOAM6_IPTUNNEL_MODE_MIN = 0,\n\tIOAM6_IPTUNNEL_MODE_INLINE = 1,\n\tIOAM6_IPTUNNEL_MODE_ENCAP = 2,\n\tIOAM6_IPTUNNEL_MODE_AUTO = 3,\n\t__IOAM6_IPTUNNEL_MODE_MAX = 4,\n};\n\nenum {\n\t__ND_OPT_PREFIX_INFO_END = 0,\n\tND_OPT_SOURCE_LL_ADDR = 1,\n\tND_OPT_TARGET_LL_ADDR = 2,\n\tND_OPT_PREFIX_INFO = 3,\n\tND_OPT_REDIRECT_HDR = 4,\n\tND_OPT_MTU = 5,\n\tND_OPT_NONCE = 14,\n\t__ND_OPT_ARRAY_MAX = 15,\n\tND_OPT_ROUTE_INFO = 24,\n\tND_OPT_RDNSS = 25,\n\tND_OPT_DNSSL = 31,\n\tND_OPT_6CO = 34,\n\tND_OPT_CAPTIVE_PORTAL = 37,\n\tND_OPT_PREF64 = 38,\n\t__ND_OPT_MAX = 39,\n};\n\nenum {\n\t__PERCPU_REF_ATOMIC = 1,\n\t__PERCPU_REF_DEAD = 2,\n\t__PERCPU_REF_ATOMIC_DEAD = 3,\n\t__PERCPU_REF_FLAG_BITS = 2,\n};\n\nenum {\n\t__RQF_STARTED = 0,\n\t__RQF_FLUSH_SEQ = 1,\n\t__RQF_MIXED_MERGE = 2,\n\t__RQF_DONTPREP = 3,\n\t__RQF_SCHED_TAGS = 4,\n\t__RQF_USE_SCHED = 5,\n\t__RQF_FAILED = 6,\n\t__RQF_QUIET = 7,\n\t__RQF_IO_STAT = 8,\n\t__RQF_PM = 9,\n\t__RQF_HASHED = 10,\n\t__RQF_STATS = 11,\n\t__RQF_SPECIAL_PAYLOAD = 12,\n\t__RQF_ZONE_WRITE_PLUGGING = 13,\n\t__RQF_TIMED_OUT = 14,\n\t__RQF_RESV = 15,\n\t__RQF_BITS = 16,\n};\n\nenum {\n\t__SCHED_FEAT_PLACE_LAG = 0,\n\t__SCHED_FEAT_PLACE_DEADLINE_INITIAL = 1,\n\t__SCHED_FEAT_RUN_TO_PARITY = 2,\n\t__SCHED_FEAT_NEXT_BUDDY = 3,\n\t__SCHED_FEAT_CACHE_HOT_BUDDY = 4,\n\t__SCHED_FEAT_WAKEUP_PREEMPTION = 5,\n\t__SCHED_FEAT_HRTICK = 6,\n\t__SCHED_FEAT_HRTICK_DL = 7,\n\t__SCHED_FEAT_DOUBLE_TICK = 8,\n\t__SCHED_FEAT_NONTASK_CAPACITY = 9,\n\t__SCHED_FEAT_TTWU_QUEUE = 10,\n\t__SCHED_FEAT_SIS_UTIL = 11,\n\t__SCHED_FEAT_WARN_DOUBLE_CLOCK = 12,\n\t__SCHED_FEAT_RT_PUSH_IPI = 13,\n\t__SCHED_FEAT_RT_RUNTIME_SHARE = 14,\n\t__SCHED_FEAT_LB_MIN = 15,\n\t__SCHED_FEAT_ATTACH_AGE_LOAD = 16,\n\t__SCHED_FEAT_WA_IDLE = 17,\n\t__SCHED_FEAT_WA_WEIGHT = 18,\n\t__SCHED_FEAT_WA_BIAS = 19,\n\t__SCHED_FEAT_UTIL_EST = 20,\n\t__SCHED_FEAT_LATENCY_WARN = 21,\n\t__SCHED_FEAT_HZ_BW = 22,\n\t__SCHED_FEAT_NR = 23,\n};\n\nenum {\n\t__SD_BALANCE_NEWIDLE = 0,\n\t__SD_BALANCE_EXEC = 1,\n\t__SD_BALANCE_FORK = 2,\n\t__SD_BALANCE_WAKE = 3,\n\t__SD_WAKE_AFFINE = 4,\n\t__SD_ASYM_CPUCAPACITY = 5,\n\t__SD_ASYM_CPUCAPACITY_FULL = 6,\n\t__SD_SHARE_CPUCAPACITY = 7,\n\t__SD_CLUSTER = 8,\n\t__SD_SHARE_LLC = 9,\n\t__SD_SERIALIZE = 10,\n\t__SD_ASYM_PACKING = 11,\n\t__SD_PREFER_SIBLING = 12,\n\t__SD_OVERLAP = 13,\n\t__SD_NUMA = 14,\n\t__SD_FLAG_CNT = 15,\n};\n\nenum {\n\t___GFP_DMA_BIT = 0,\n\t___GFP_HIGHMEM_BIT = 1,\n\t___GFP_DMA32_BIT = 2,\n\t___GFP_MOVABLE_BIT = 3,\n\t___GFP_RECLAIMABLE_BIT = 4,\n\t___GFP_HIGH_BIT = 5,\n\t___GFP_IO_BIT = 6,\n\t___GFP_FS_BIT = 7,\n\t___GFP_ZERO_BIT = 8,\n\t___GFP_UNUSED_BIT = 9,\n\t___GFP_DIRECT_RECLAIM_BIT = 10,\n\t___GFP_KSWAPD_RECLAIM_BIT = 11,\n\t___GFP_WRITE_BIT = 12,\n\t___GFP_NOWARN_BIT = 13,\n\t___GFP_RETRY_MAYFAIL_BIT = 14,\n\t___GFP_NOFAIL_BIT = 15,\n\t___GFP_NORETRY_BIT = 16,\n\t___GFP_MEMALLOC_BIT = 17,\n\t___GFP_COMP_BIT = 18,\n\t___GFP_NOMEMALLOC_BIT = 19,\n\t___GFP_HARDWALL_BIT = 20,\n\t___GFP_THISNODE_BIT = 21,\n\t___GFP_ACCOUNT_BIT = 22,\n\t___GFP_ZEROTAGS_BIT = 23,\n\t___GFP_NO_OBJ_EXT_BIT = 24,\n\t___GFP_LAST_BIT = 25,\n};\n\nenum {\n\t__ctx_convertBPF_PROG_TYPE_SOCKET_FILTER = 0,\n\t__ctx_convertBPF_PROG_TYPE_SCHED_CLS = 1,\n\t__ctx_convertBPF_PROG_TYPE_SCHED_ACT = 2,\n\t__ctx_convertBPF_PROG_TYPE_XDP = 3,\n\t__ctx_convertBPF_PROG_TYPE_CGROUP_SKB = 4,\n\t__ctx_convertBPF_PROG_TYPE_CGROUP_SOCK = 5,\n\t__ctx_convertBPF_PROG_TYPE_CGROUP_SOCK_ADDR = 6,\n\t__ctx_convertBPF_PROG_TYPE_LWT_IN = 7,\n\t__ctx_convertBPF_PROG_TYPE_LWT_OUT = 8,\n\t__ctx_convertBPF_PROG_TYPE_LWT_XMIT = 9,\n\t__ctx_convertBPF_PROG_TYPE_LWT_SEG6LOCAL = 10,\n\t__ctx_convertBPF_PROG_TYPE_SOCK_OPS = 11,\n\t__ctx_convertBPF_PROG_TYPE_SK_SKB = 12,\n\t__ctx_convertBPF_PROG_TYPE_SK_MSG = 13,\n\t__ctx_convertBPF_PROG_TYPE_FLOW_DISSECTOR = 14,\n\t__ctx_convertBPF_PROG_TYPE_KPROBE = 15,\n\t__ctx_convertBPF_PROG_TYPE_TRACEPOINT = 16,\n\t__ctx_convertBPF_PROG_TYPE_PERF_EVENT = 17,\n\t__ctx_convertBPF_PROG_TYPE_RAW_TRACEPOINT = 18,\n\t__ctx_convertBPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE = 19,\n\t__ctx_convertBPF_PROG_TYPE_TRACING = 20,\n\t__ctx_convertBPF_PROG_TYPE_CGROUP_DEVICE = 21,\n\t__ctx_convertBPF_PROG_TYPE_CGROUP_SYSCTL = 22,\n\t__ctx_convertBPF_PROG_TYPE_CGROUP_SOCKOPT = 23,\n\t__ctx_convertBPF_PROG_TYPE_SK_REUSEPORT = 24,\n\t__ctx_convertBPF_PROG_TYPE_SK_LOOKUP = 25,\n\t__ctx_convertBPF_PROG_TYPE_STRUCT_OPS = 26,\n\t__ctx_convertBPF_PROG_TYPE_EXT = 27,\n\t__ctx_convertBPF_PROG_TYPE_LSM = 28,\n\t__ctx_convertBPF_PROG_TYPE_SYSCALL = 29,\n\t__ctx_convertBPF_PROG_TYPE_NETFILTER = 30,\n\t__ctx_convert_unused = 31,\n};\n\nenum {\n\targ_AL = 0,\n\targ_CL = 1,\n\targ_DL = 2,\n\targ_BL = 3,\n\targ_AH = 4,\n\targ_CH = 5,\n\targ_DH = 6,\n\targ_BH = 7,\n\targ_AX = 0,\n\targ_CX = 1,\n\targ_DX = 2,\n\targ_BX = 3,\n\targ_SP = 4,\n\targ_BP = 5,\n\targ_SI = 6,\n\targ_DI = 7,\n\targ_R8 = 8,\n\targ_R9 = 9,\n\targ_R10 = 10,\n\targ_R11 = 11,\n\targ_R12 = 12,\n\targ_R13 = 13,\n\targ_R14 = 14,\n\targ_R15 = 15,\n};\n\nenum {\n\tattr_noop = 0,\n\tattr_delayed_allocation_blocks = 1,\n\tattr_session_write_kbytes = 2,\n\tattr_lifetime_write_kbytes = 3,\n\tattr_reserved_clusters = 4,\n\tattr_sra_exceeded_retry_limit = 5,\n\tattr_inode_readahead = 6,\n\tattr_trigger_test_error = 7,\n\tattr_first_error_time = 8,\n\tattr_last_error_time = 9,\n\tattr_clusters_in_group = 10,\n\tattr_mb_order = 11,\n\tattr_feature = 12,\n\tattr_pointer_pi = 13,\n\tattr_pointer_ui = 14,\n\tattr_pointer_ul = 15,\n\tattr_pointer_u64 = 16,\n\tattr_pointer_u8 = 17,\n\tattr_pointer_string = 18,\n\tattr_pointer_atomic = 19,\n\tattr_journal_task = 20,\n};\n\nenum {\n\tblank_off = 0,\n\tblank_normal_wait = 1,\n\tblank_vesa_wait = 2,\n};\n\nenum {\n\tcpuset = 0,\n\tpossible = 1,\n\tfail = 2,\n};\n\nenum {\n\tdns_key_data = 0,\n\tdns_key_error = 1,\n};\n\nenum {\n\tecryptfs_opt_sig = 0,\n\tecryptfs_opt_ecryptfs_sig = 1,\n\tecryptfs_opt_cipher = 2,\n\tecryptfs_opt_ecryptfs_cipher = 3,\n\tecryptfs_opt_ecryptfs_key_bytes = 4,\n\tecryptfs_opt_passthrough = 5,\n\tecryptfs_opt_xattr_metadata = 6,\n\tecryptfs_opt_encrypted_view = 7,\n\tecryptfs_opt_fnek_sig = 8,\n\tecryptfs_opt_fn_cipher = 9,\n\tecryptfs_opt_fn_cipher_key_bytes = 10,\n\tecryptfs_opt_unlink_sigs = 11,\n\tecryptfs_opt_mount_auth_tok_only = 12,\n\tecryptfs_opt_check_dev_ruid = 13,\n\tecryptfs_opt_err = 14,\n};\n\nenum {\n\tfalse = 0,\n\ttrue = 1,\n};\n\nenum {\n\tmechtype_caddy = 0,\n\tmechtype_tray = 1,\n\tmechtype_popup = 2,\n\tmechtype_individual_changer = 4,\n\tmechtype_cartridge_changer = 5,\n};\n\nenum {\n\tncsi_dev_state_major = 65280,\n\tncsi_dev_state_minor = 255,\n\tncsi_dev_state_probe_deselect = 513,\n\tncsi_dev_state_probe_package = 514,\n\tncsi_dev_state_probe_channel = 515,\n\tncsi_dev_state_probe_mlx_gma = 516,\n\tncsi_dev_state_probe_mlx_smaf = 517,\n\tncsi_dev_state_probe_cis = 518,\n\tncsi_dev_state_probe_keep_phy = 519,\n\tncsi_dev_state_probe_gvi = 520,\n\tncsi_dev_state_probe_gc = 521,\n\tncsi_dev_state_probe_gls = 522,\n\tncsi_dev_state_probe_dp = 523,\n\tncsi_dev_state_config_sp = 769,\n\tncsi_dev_state_config_cis = 770,\n\tncsi_dev_state_config_oem_gma = 771,\n\tncsi_dev_state_config_apply_mac = 772,\n\tncsi_dev_state_config_clear_vids = 773,\n\tncsi_dev_state_config_svf = 774,\n\tncsi_dev_state_config_ev = 775,\n\tncsi_dev_state_config_sma = 776,\n\tncsi_dev_state_config_ebf = 777,\n\tncsi_dev_state_config_dgmf = 778,\n\tncsi_dev_state_config_ecnt = 779,\n\tncsi_dev_state_config_ec = 780,\n\tncsi_dev_state_config_ae = 781,\n\tncsi_dev_state_config_gls = 782,\n\tncsi_dev_state_config_done = 783,\n\tncsi_dev_state_suspend_select = 1025,\n\tncsi_dev_state_suspend_gls = 1026,\n\tncsi_dev_state_suspend_dcnt = 1027,\n\tncsi_dev_state_suspend_dc = 1028,\n\tncsi_dev_state_suspend_deselect = 1029,\n\tncsi_dev_state_suspend_done = 1030,\n};\n\nenum {\n\tncsi_dev_state_registered = 0,\n\tncsi_dev_state_functional = 256,\n\tncsi_dev_state_probe = 512,\n\tncsi_dev_state_config = 768,\n\tncsi_dev_state_suspend = 1024,\n};\n\nenum {\n\tnone = 0,\n\tday = 1,\n\tmonth = 2,\n\tyear = 3,\n};\n\nenum {\n\tpci_channel_io_normal = 1,\n\tpci_channel_io_frozen = 2,\n\tpci_channel_io_perm_failure = 3,\n};\n\nenum {\n\tpreempt_dynamic_undefined = -1,\n\tpreempt_dynamic_none = 0,\n\tpreempt_dynamic_voluntary = 1,\n\tpreempt_dynamic_full = 2,\n};\n\nenum {\n\tptr_explicit = 0,\n\tptr_ext4_sb_info_offset = 1,\n\tptr_ext4_super_block_offset = 2,\n};\n\nenum {\n\tst_wordstart = 0,\n\tst_wordcmp = 1,\n\tst_wordskip = 2,\n\tst_bufcpy = 3,\n};\n\nenum {\n\tst_wordstart___2 = 0,\n\tst_wordcmp___2 = 1,\n\tst_wordskip___2 = 2,\n};\n\nenum {\n\ttype_kind_int = 0,\n\ttype_kind_float = 1,\n\ttype_unknown = 65535,\n};\n\nenum {\n\tx86_lbr_exclusive_lbr = 0,\n\tx86_lbr_exclusive_bts = 1,\n\tx86_lbr_exclusive_pt = 2,\n\tx86_lbr_exclusive_max = 3,\n};\n\ntypedef enum {\n\tBIT_DStream_unfinished = 0,\n\tBIT_DStream_endOfBuffer = 1,\n\tBIT_DStream_completed = 2,\n\tBIT_DStream_overflow = 3,\n} BIT_DStream_status;\n\ntypedef enum {\n\tZSTD_error_no_error = 0,\n\tZSTD_error_GENERIC = 1,\n\tZSTD_error_prefix_unknown = 10,\n\tZSTD_error_version_unsupported = 12,\n\tZSTD_error_frameParameter_unsupported = 14,\n\tZSTD_error_frameParameter_windowTooLarge = 16,\n\tZSTD_error_corruption_detected = 20,\n\tZSTD_error_checksum_wrong = 22,\n\tZSTD_error_dictionary_corrupted = 30,\n\tZSTD_error_dictionary_wrong = 32,\n\tZSTD_error_dictionaryCreation_failed = 34,\n\tZSTD_error_parameter_unsupported = 40,\n\tZSTD_error_parameter_outOfBound = 42,\n\tZSTD_error_tableLog_tooLarge = 44,\n\tZSTD_error_maxSymbolValue_tooLarge = 46,\n\tZSTD_error_maxSymbolValue_tooSmall = 48,\n\tZSTD_error_stage_wrong = 60,\n\tZSTD_error_init_missing = 62,\n\tZSTD_error_memory_allocation = 64,\n\tZSTD_error_workSpace_tooSmall = 66,\n\tZSTD_error_dstSize_tooSmall = 70,\n\tZSTD_error_srcSize_wrong = 72,\n\tZSTD_error_dstBuffer_null = 74,\n\tZSTD_error_frameIndex_tooLarge = 100,\n\tZSTD_error_seekableIO = 102,\n\tZSTD_error_dstBuffer_wrong = 104,\n\tZSTD_error_srcBuffer_wrong = 105,\n\tZSTD_error_maxCode = 120,\n} ZSTD_ErrorCode;\n\ntypedef ZSTD_ErrorCode ERR_enum;\n\ntypedef enum {\n\tFSE_repeat_none = 0,\n\tFSE_repeat_check = 1,\n\tFSE_repeat_valid = 2,\n} FSE_repeat;\n\ntypedef enum {\n\ttrustInput = 0,\n\tcheckMaxSymbolValue = 1,\n} HIST_checkInput_e;\n\ntypedef enum {\n\tHUF_singleStream = 0,\n\tHUF_fourStreams = 1,\n} HUF_nbStreams_e;\n\ntypedef enum {\n\tHUF_repeat_none = 0,\n\tHUF_repeat_check = 1,\n\tHUF_repeat_valid = 2,\n} HUF_repeat;\n\ntypedef enum {\n\tZSTD_e_continue = 0,\n\tZSTD_e_flush = 1,\n\tZSTD_e_end = 2,\n} ZSTD_EndDirective;\n\ntypedef enum {\n\tzop_dynamic = 0,\n\tzop_predef = 1,\n} ZSTD_OptPrice_e;\n\ntypedef enum {\n\tZSTD_reset_session_only = 1,\n\tZSTD_reset_parameters = 2,\n\tZSTD_reset_session_and_parameters = 3,\n} ZSTD_ResetDirective;\n\ntypedef enum {\n\tZSTD_bm_buffered = 0,\n\tZSTD_bm_stable = 1,\n} ZSTD_bufferMode_e;\n\ntypedef enum {\n\tZSTDb_not_buffered = 0,\n\tZSTDb_buffered = 1,\n} ZSTD_buffered_policy_e;\n\ntypedef enum {\n\tZSTD_cpm_noAttachDict = 0,\n\tZSTD_cpm_attachDict = 1,\n\tZSTD_cpm_createCDict = 2,\n\tZSTD_cpm_unknown = 3,\n} ZSTD_cParamMode_e;\n\ntypedef enum {\n\tZSTD_c_compressionLevel = 100,\n\tZSTD_c_windowLog = 101,\n\tZSTD_c_hashLog = 102,\n\tZSTD_c_chainLog = 103,\n\tZSTD_c_searchLog = 104,\n\tZSTD_c_minMatch = 105,\n\tZSTD_c_targetLength = 106,\n\tZSTD_c_strategy = 107,\n\tZSTD_c_enableLongDistanceMatching = 160,\n\tZSTD_c_ldmHashLog = 161,\n\tZSTD_c_ldmMinMatch = 162,\n\tZSTD_c_ldmBucketSizeLog = 163,\n\tZSTD_c_ldmHashRateLog = 164,\n\tZSTD_c_contentSizeFlag = 200,\n\tZSTD_c_checksumFlag = 201,\n\tZSTD_c_dictIDFlag = 202,\n\tZSTD_c_nbWorkers = 400,\n\tZSTD_c_jobSize = 401,\n\tZSTD_c_overlapLog = 402,\n\tZSTD_c_experimentalParam1 = 500,\n\tZSTD_c_experimentalParam2 = 10,\n\tZSTD_c_experimentalParam3 = 1000,\n\tZSTD_c_experimentalParam4 = 1001,\n\tZSTD_c_experimentalParam5 = 1002,\n\tZSTD_c_experimentalParam6 = 1003,\n\tZSTD_c_experimentalParam7 = 1004,\n\tZSTD_c_experimentalParam8 = 1005,\n\tZSTD_c_experimentalParam9 = 1006,\n\tZSTD_c_experimentalParam10 = 1007,\n\tZSTD_c_experimentalParam11 = 1008,\n\tZSTD_c_experimentalParam12 = 1009,\n\tZSTD_c_experimentalParam13 = 1010,\n\tZSTD_c_experimentalParam14 = 1011,\n\tZSTD_c_experimentalParam15 = 1012,\n} ZSTD_cParameter;\n\ntypedef enum {\n\tzcss_init = 0,\n\tzcss_load = 1,\n\tzcss_flush = 2,\n} ZSTD_cStreamStage;\n\ntypedef enum {\n\tZSTDcrp_makeClean = 0,\n\tZSTDcrp_leaveDirty = 1,\n} ZSTD_compResetPolicy_e;\n\ntypedef enum {\n\tZSTDcs_created = 0,\n\tZSTDcs_init = 1,\n\tZSTDcs_ongoing = 2,\n\tZSTDcs_ending = 3,\n} ZSTD_compressionStage_e;\n\ntypedef enum {\n\tZSTD_cwksp_alloc_objects = 0,\n\tZSTD_cwksp_alloc_buffers = 1,\n\tZSTD_cwksp_alloc_aligned = 2,\n} ZSTD_cwksp_alloc_phase_e;\n\ntypedef enum {\n\tZSTD_cwksp_dynamic_alloc = 0,\n\tZSTD_cwksp_static_alloc = 1,\n} ZSTD_cwksp_static_alloc_e;\n\ntypedef enum {\n\tZSTD_d_windowLogMax = 100,\n\tZSTD_d_experimentalParam1 = 1000,\n\tZSTD_d_experimentalParam2 = 1001,\n\tZSTD_d_experimentalParam3 = 1002,\n\tZSTD_d_experimentalParam4 = 1003,\n} ZSTD_dParameter;\n\ntypedef enum {\n\tZSTDds_getFrameHeaderSize = 0,\n\tZSTDds_decodeFrameHeader = 1,\n\tZSTDds_decodeBlockHeader = 2,\n\tZSTDds_decompressBlock = 3,\n\tZSTDds_decompressLastBlock = 4,\n\tZSTDds_checkChecksum = 5,\n\tZSTDds_decodeSkippableHeader = 6,\n\tZSTDds_skipFrame = 7,\n} ZSTD_dStage;\n\ntypedef enum {\n\tzdss_init = 0,\n\tzdss_loadHeader = 1,\n\tzdss_read = 2,\n\tzdss_load = 3,\n\tzdss_flush = 4,\n} ZSTD_dStreamStage;\n\ntypedef enum {\n\tZSTD_defaultDisallowed = 0,\n\tZSTD_defaultAllowed = 1,\n} ZSTD_defaultPolicy_e;\n\ntypedef enum {\n\tZSTD_dictDefaultAttach = 0,\n\tZSTD_dictForceAttach = 1,\n\tZSTD_dictForceCopy = 2,\n\tZSTD_dictForceLoad = 3,\n} ZSTD_dictAttachPref_e;\n\ntypedef enum {\n\tZSTD_dct_auto = 0,\n\tZSTD_dct_rawContent = 1,\n\tZSTD_dct_fullDict = 2,\n} ZSTD_dictContentType_e;\n\ntypedef enum {\n\tZSTD_dlm_byCopy = 0,\n\tZSTD_dlm_byRef = 1,\n} ZSTD_dictLoadMethod_e;\n\ntypedef enum {\n\tZSTD_noDict = 0,\n\tZSTD_extDict = 1,\n\tZSTD_dictMatchState = 2,\n\tZSTD_dedicatedDictSearch = 3,\n} ZSTD_dictMode_e;\n\ntypedef enum {\n\tZSTD_dtlm_fast = 0,\n\tZSTD_dtlm_full = 1,\n} ZSTD_dictTableLoadMethod_e;\n\ntypedef enum {\n\tZSTD_use_indefinitely = -1,\n\tZSTD_dont_use = 0,\n\tZSTD_use_once = 1,\n} ZSTD_dictUses_e;\n\ntypedef enum {\n\tZSTD_d_validateChecksum = 0,\n\tZSTD_d_ignoreChecksum = 1,\n} ZSTD_forceIgnoreChecksum_e;\n\ntypedef enum {\n\tZSTD_f_zstd1 = 0,\n\tZSTD_f_zstd1_magicless = 1,\n} ZSTD_format_e;\n\ntypedef enum {\n\tZSTD_frame = 0,\n\tZSTD_skippableFrame = 1,\n} ZSTD_frameType_e;\n\ntypedef enum {\n\tZSTDirp_continue = 0,\n\tZSTDirp_reset = 1,\n} ZSTD_indexResetPolicy_e;\n\ntypedef enum {\n\tZSTD_not_in_dst = 0,\n\tZSTD_in_dst = 1,\n\tZSTD_split = 2,\n} ZSTD_litLocation_e;\n\ntypedef enum {\n\tZSTD_llt_none = 0,\n\tZSTD_llt_literalLength = 1,\n\tZSTD_llt_matchLength = 2,\n} ZSTD_longLengthType_e;\n\ntypedef enum {\n\tZSTD_lo_isRegularOffset = 0,\n\tZSTD_lo_isLongOffset = 1,\n} ZSTD_longOffset_e;\n\ntypedef enum {\n\tZSTDnit_frameHeader = 0,\n\tZSTDnit_blockHeader = 1,\n\tZSTDnit_block = 2,\n\tZSTDnit_lastBlock = 3,\n\tZSTDnit_checksum = 4,\n\tZSTDnit_skippableFrame = 5,\n} ZSTD_nextInputType_e;\n\ntypedef enum {\n\tZSTD_no_overlap = 0,\n\tZSTD_overlap_src_before_dst = 1,\n} ZSTD_overlap_e;\n\ntypedef enum {\n\tZSTD_ps_auto = 0,\n\tZSTD_ps_enable = 1,\n\tZSTD_ps_disable = 2,\n} ZSTD_paramSwitch_e;\n\ntypedef enum {\n\tZSTD_rmd_refSingleDDict = 0,\n\tZSTD_rmd_refMultipleDDicts = 1,\n} ZSTD_refMultipleDDicts_e;\n\ntypedef enum {\n\tZSTD_resetTarget_CDict = 0,\n\tZSTD_resetTarget_CCtx = 1,\n} ZSTD_resetTarget_e;\n\ntypedef enum {\n\tZSTD_sf_noBlockDelimiters = 0,\n\tZSTD_sf_explicitBlockDelimiters = 1,\n} ZSTD_sequenceFormat_e;\n\ntypedef enum {\n\tZSTD_fast = 1,\n\tZSTD_dfast = 2,\n\tZSTD_greedy = 3,\n\tZSTD_lazy = 4,\n\tZSTD_lazy2 = 5,\n\tZSTD_btlazy2 = 6,\n\tZSTD_btopt = 7,\n\tZSTD_btultra = 8,\n\tZSTD_btultra2 = 9,\n} ZSTD_strategy;\n\ntypedef enum {\n\tOSL_GLOBAL_LOCK_HANDLER = 0,\n\tOSL_NOTIFY_HANDLER = 1,\n\tOSL_GPE_HANDLER = 2,\n\tOSL_DEBUGGER_MAIN_THREAD = 3,\n\tOSL_DEBUGGER_EXEC_THREAD = 4,\n\tOSL_EC_POLL_HANDLER = 5,\n\tOSL_EC_BURST_HANDLER = 6,\n} acpi_execute_type;\n\ntypedef enum {\n\tACPI_IMODE_LOAD_PASS1 = 1,\n\tACPI_IMODE_LOAD_PASS2 = 2,\n\tACPI_IMODE_EXECUTE = 3,\n} acpi_interpreter_mode;\n\ntypedef enum {\n\tACPI_TRACE_AML_METHOD = 0,\n\tACPI_TRACE_AML_OPCODE = 1,\n\tACPI_TRACE_AML_REGION = 2,\n} acpi_trace_event_type;\n\ntypedef enum {\n\tbt_raw = 0,\n\tbt_rle = 1,\n\tbt_compressed = 2,\n\tbt_reserved = 3,\n} blockType_e;\n\ntypedef enum {\n\tneed_more = 0,\n\tblock_done = 1,\n\tfinish_started = 2,\n\tfinish_done = 3,\n} block_state;\n\ntypedef enum {\n\tCODES = 0,\n\tLENS = 1,\n\tDISTS = 2,\n} codetype;\n\ntypedef enum {\n\tFILE_MEMORY_MIGRATE = 0,\n\tFILE_CPULIST = 1,\n\tFILE_MEMLIST = 2,\n\tFILE_EFFECTIVE_CPULIST = 3,\n\tFILE_EFFECTIVE_MEMLIST = 4,\n\tFILE_SUBPARTS_CPULIST = 5,\n\tFILE_EXCLUSIVE_CPULIST = 6,\n\tFILE_EFFECTIVE_XCPULIST = 7,\n\tFILE_ISOLATED_CPULIST = 8,\n\tFILE_CPU_EXCLUSIVE = 9,\n\tFILE_MEM_EXCLUSIVE = 10,\n\tFILE_MEM_HARDWALL = 11,\n\tFILE_SCHED_LOAD_BALANCE = 12,\n\tFILE_PARTITION_ROOT = 13,\n\tFILE_SCHED_RELAX_DOMAIN_LEVEL = 14,\n\tFILE_MEMORY_PRESSURE_ENABLED = 15,\n\tFILE_MEMORY_PRESSURE = 16,\n\tFILE_SPREAD_PAGE = 17,\n\tFILE_SPREAD_SLAB = 18,\n} cpuset_filetype_t;\n\ntypedef enum {\n\tCS_ONLINE = 0,\n\tCS_CPU_EXCLUSIVE = 1,\n\tCS_MEM_EXCLUSIVE = 2,\n\tCS_MEM_HARDWALL = 3,\n\tCS_MEMORY_MIGRATE = 4,\n\tCS_SCHED_LOAD_BALANCE = 5,\n\tCS_SPREAD_PAGE = 6,\n\tCS_SPREAD_SLAB = 7,\n} cpuset_flagbits_t;\n\ntypedef enum {\n\tnoDict = 0,\n\twithPrefix64k = 1,\n\tusingExtDict = 2,\n} dict_directive;\n\ntypedef enum {\n\tEITHER = 0,\n\tINDEX = 1,\n\tDIRENT = 2,\n\tDIRENT_HTREE = 3,\n} dirblock_type_t;\n\ntypedef enum {\n\tdecode_full_block = 0,\n\tpartial_decode = 1,\n} earlyEnd_directive;\n\ntypedef enum {\n\tendOnOutputSize = 0,\n\tendOnInputSize = 1,\n} endCondition_directive;\n\ntypedef enum {\n\tEXT4_IGET_NORMAL = 0,\n\tEXT4_IGET_SPECIAL = 1,\n\tEXT4_IGET_HANDLE = 2,\n\tEXT4_IGET_BAD = 4,\n\tEXT4_IGET_EA_INODE = 8,\n} ext4_iget_flags;\n\ntypedef enum {\n\tFS_DECRYPT = 0,\n\tFS_ENCRYPT = 1,\n} fscrypt_direction_t;\n\ntypedef enum {\n\tHEAD = 0,\n\tFLAGS = 1,\n\tTIME = 2,\n\tOS = 3,\n\tEXLEN = 4,\n\tEXTRA = 5,\n\tNAME = 6,\n\tCOMMENT = 7,\n\tHCRC = 8,\n\tDICTID = 9,\n\tDICT = 10,\n\tTYPE = 11,\n\tTYPEDO = 12,\n\tSTORED = 13,\n\tCOPY = 14,\n\tTABLE = 15,\n\tLENLENS = 16,\n\tCODELENS = 17,\n\tLEN = 18,\n\tLENEXT = 19,\n\tDIST = 20,\n\tDISTEXT = 21,\n\tMATCH = 22,\n\tLIT = 23,\n\tCHECK = 24,\n\tLENGTH = 25,\n\tDONE = 26,\n\tBAD = 27,\n\tMEM = 28,\n\tSYNC = 29,\n} inflate_mode;\n\ntypedef enum {\n\tISOLATE_ABORT = 0,\n\tISOLATE_NONE = 1,\n\tISOLATE_SUCCESS = 2,\n} isolate_migrate_t;\n\ntypedef enum {\n\tKDB_ENABLE_ALL = 1,\n\tKDB_ENABLE_MEM_READ = 2,\n\tKDB_ENABLE_MEM_WRITE = 4,\n\tKDB_ENABLE_REG_READ = 8,\n\tKDB_ENABLE_REG_WRITE = 16,\n\tKDB_ENABLE_INSPECT = 32,\n\tKDB_ENABLE_FLOW_CTRL = 64,\n\tKDB_ENABLE_SIGNAL = 128,\n\tKDB_ENABLE_REBOOT = 256,\n\tKDB_ENABLE_ALWAYS_SAFE = 512,\n\tKDB_ENABLE_MASK = 1023,\n\tKDB_ENABLE_ALL_NO_ARGS = 1024,\n\tKDB_ENABLE_MEM_READ_NO_ARGS = 2048,\n\tKDB_ENABLE_MEM_WRITE_NO_ARGS = 4096,\n\tKDB_ENABLE_REG_READ_NO_ARGS = 8192,\n\tKDB_ENABLE_REG_WRITE_NO_ARGS = 16384,\n\tKDB_ENABLE_INSPECT_NO_ARGS = 32768,\n\tKDB_ENABLE_FLOW_CTRL_NO_ARGS = 65536,\n\tKDB_ENABLE_SIGNAL_NO_ARGS = 131072,\n\tKDB_ENABLE_REBOOT_NO_ARGS = 262144,\n\tKDB_ENABLE_ALWAYS_SAFE_NO_ARGS = 524288,\n\tKDB_ENABLE_MASK_NO_ARGS = 1047552,\n\tKDB_REPEAT_NO_ARGS = 1073741824,\n\tKDB_REPEAT_WITH_ARGS = 2147483648,\n} kdb_cmdflags_t;\n\ntypedef enum {\n\tKDB_DB_BPT = 0,\n\tKDB_DB_SS = 1,\n\tKDB_DB_SSBPT = 2,\n\tKDB_DB_NOBPT = 3,\n} kdb_dbtrap_t;\n\ntypedef enum {\n\tKDB_REASON_ENTER = 1,\n\tKDB_REASON_ENTER_SLAVE = 2,\n\tKDB_REASON_BREAK = 3,\n\tKDB_REASON_DEBUG = 4,\n\tKDB_REASON_OOPS = 5,\n\tKDB_REASON_SWITCH = 6,\n\tKDB_REASON_KEYBOARD = 7,\n\tKDB_REASON_NMI = 8,\n\tKDB_REASON_RECURSE = 9,\n\tKDB_REASON_SSTEP = 10,\n\tKDB_REASON_SYSTEM_NMI = 11,\n} kdb_reason_t;\n\ntypedef enum {\n\tPAGE_KEEP = 0,\n\tPAGE_ACTIVATE = 1,\n\tPAGE_SUCCESS = 2,\n\tPAGE_CLEAN = 3,\n} pageout_t;\n\ntypedef enum {\n\tPHY_INTERFACE_MODE_NA = 0,\n\tPHY_INTERFACE_MODE_INTERNAL = 1,\n\tPHY_INTERFACE_MODE_MII = 2,\n\tPHY_INTERFACE_MODE_GMII = 3,\n\tPHY_INTERFACE_MODE_SGMII = 4,\n\tPHY_INTERFACE_MODE_TBI = 5,\n\tPHY_INTERFACE_MODE_REVMII = 6,\n\tPHY_INTERFACE_MODE_RMII = 7,\n\tPHY_INTERFACE_MODE_REVRMII = 8,\n\tPHY_INTERFACE_MODE_RGMII = 9,\n\tPHY_INTERFACE_MODE_RGMII_ID = 10,\n\tPHY_INTERFACE_MODE_RGMII_RXID = 11,\n\tPHY_INTERFACE_MODE_RGMII_TXID = 12,\n\tPHY_INTERFACE_MODE_RTBI = 13,\n\tPHY_INTERFACE_MODE_SMII = 14,\n\tPHY_INTERFACE_MODE_XGMII = 15,\n\tPHY_INTERFACE_MODE_XLGMII = 16,\n\tPHY_INTERFACE_MODE_MOCA = 17,\n\tPHY_INTERFACE_MODE_PSGMII = 18,\n\tPHY_INTERFACE_MODE_QSGMII = 19,\n\tPHY_INTERFACE_MODE_TRGMII = 20,\n\tPHY_INTERFACE_MODE_100BASEX = 21,\n\tPHY_INTERFACE_MODE_1000BASEX = 22,\n\tPHY_INTERFACE_MODE_2500BASEX = 23,\n\tPHY_INTERFACE_MODE_5GBASER = 24,\n\tPHY_INTERFACE_MODE_RXAUI = 25,\n\tPHY_INTERFACE_MODE_XAUI = 26,\n\tPHY_INTERFACE_MODE_10GBASER = 27,\n\tPHY_INTERFACE_MODE_25GBASER = 28,\n\tPHY_INTERFACE_MODE_USXGMII = 29,\n\tPHY_INTERFACE_MODE_10GKR = 30,\n\tPHY_INTERFACE_MODE_QUSGMII = 31,\n\tPHY_INTERFACE_MODE_1000BASEKX = 32,\n\tPHY_INTERFACE_MODE_10G_QXGMII = 33,\n\tPHY_INTERFACE_MODE_MAX = 34,\n} phy_interface_t;\n\ntypedef enum {\n\tsearch_hashChain = 0,\n\tsearch_binaryTree = 1,\n\tsearch_rowHash = 2,\n} searchMethod_e;\n\ntypedef enum {\n\tSS_FREE = 0,\n\tSS_UNCONNECTED = 1,\n\tSS_CONNECTING = 2,\n\tSS_CONNECTED = 3,\n\tSS_DISCONNECTING = 4,\n} socket_state;\n\ntypedef enum {\n\tSTATUSTYPE_INFO = 0,\n\tSTATUSTYPE_TABLE = 1,\n\tSTATUSTYPE_IMA = 2,\n} status_type_t;\n\ntypedef enum {\n\tnot_streaming = 0,\n\tis_streaming = 1,\n} streaming_operation;\n\ntypedef enum {\n\tset_basic = 0,\n\tset_rle = 1,\n\tset_compressed = 2,\n\tset_repeat = 3,\n} symbolEncodingType_e;\n\ntypedef ZSTD_ErrorCode zstd_error_code;\n\nenum CSI_J {\n\tCSI_J_CURSOR_TO_END = 0,\n\tCSI_J_START_TO_CURSOR = 1,\n\tCSI_J_VISIBLE = 2,\n\tCSI_J_FULL = 3,\n};\n\nenum CSI_right_square_bracket {\n\tCSI_RSB_COLOR_FOR_UNDERLINE = 1,\n\tCSI_RSB_COLOR_FOR_HALF_BRIGHT = 2,\n\tCSI_RSB_MAKE_CUR_COLOR_DEFAULT = 8,\n\tCSI_RSB_BLANKING_INTERVAL = 9,\n\tCSI_RSB_BELL_FREQUENCY = 10,\n\tCSI_RSB_BELL_DURATION = 11,\n\tCSI_RSB_BRING_CONSOLE_TO_FRONT = 12,\n\tCSI_RSB_UNBLANK = 13,\n\tCSI_RSB_VESA_OFF_INTERVAL = 14,\n\tCSI_RSB_BRING_PREV_CONSOLE_TO_FRONT = 15,\n\tCSI_RSB_CURSOR_BLINK_INTERVAL = 16,\n};\n\nenum HV_GENERIC_SET_FORMAT {\n\tHV_GENERIC_SET_SPARSE_4K = 0,\n\tHV_GENERIC_SET_ALL = 1,\n};\n\nenum HV_SUBNODE_TYPE {\n\tHvSubnodeAny = 0,\n\tHvSubnodeSocket = 1,\n\tHvSubnodeAmdNode = 2,\n\tHvSubnodeL3 = 3,\n\tHvSubnodeCount = 4,\n\tHvSubnodeInvalid = -1,\n};\n\nenum KTHREAD_BITS {\n\tKTHREAD_IS_PER_CPU = 0,\n\tKTHREAD_SHOULD_STOP = 1,\n\tKTHREAD_SHOULD_PARK = 2,\n};\n\nenum NPmode {\n\tNPMODE_PASS = 0,\n\tNPMODE_DROP = 1,\n\tNPMODE_ERROR = 2,\n\tNPMODE_QUEUE = 3,\n};\n\nenum OID {\n\tOID_id_dsa_with_sha1 = 0,\n\tOID_id_dsa = 1,\n\tOID_id_ecPublicKey = 2,\n\tOID_id_prime192v1 = 3,\n\tOID_id_prime256v1 = 4,\n\tOID_id_ecdsa_with_sha1 = 5,\n\tOID_id_ecdsa_with_sha224 = 6,\n\tOID_id_ecdsa_with_sha256 = 7,\n\tOID_id_ecdsa_with_sha384 = 8,\n\tOID_id_ecdsa_with_sha512 = 9,\n\tOID_rsaEncryption = 10,\n\tOID_sha1WithRSAEncryption = 11,\n\tOID_sha256WithRSAEncryption = 12,\n\tOID_sha384WithRSAEncryption = 13,\n\tOID_sha512WithRSAEncryption = 14,\n\tOID_sha224WithRSAEncryption = 15,\n\tOID_data = 16,\n\tOID_signed_data = 17,\n\tOID_email_address = 18,\n\tOID_contentType = 19,\n\tOID_messageDigest = 20,\n\tOID_signingTime = 21,\n\tOID_smimeCapabilites = 22,\n\tOID_smimeAuthenticatedAttrs = 23,\n\tOID_mskrb5 = 24,\n\tOID_krb5 = 25,\n\tOID_krb5u2u = 26,\n\tOID_msIndirectData = 27,\n\tOID_msStatementType = 28,\n\tOID_msSpOpusInfo = 29,\n\tOID_msPeImageDataObjId = 30,\n\tOID_msIndividualSPKeyPurpose = 31,\n\tOID_msOutlookExpress = 32,\n\tOID_ntlmssp = 33,\n\tOID_negoex = 34,\n\tOID_spnego = 35,\n\tOID_IAKerb = 36,\n\tOID_PKU2U = 37,\n\tOID_Scram = 38,\n\tOID_certAuthInfoAccess = 39,\n\tOID_sha1 = 40,\n\tOID_id_ansip384r1 = 41,\n\tOID_id_ansip521r1 = 42,\n\tOID_sha256 = 43,\n\tOID_sha384 = 44,\n\tOID_sha512 = 45,\n\tOID_sha224 = 46,\n\tOID_commonName = 47,\n\tOID_surname = 48,\n\tOID_countryName = 49,\n\tOID_locality = 50,\n\tOID_stateOrProvinceName = 51,\n\tOID_organizationName = 52,\n\tOID_organizationUnitName = 53,\n\tOID_title = 54,\n\tOID_description = 55,\n\tOID_name = 56,\n\tOID_givenName = 57,\n\tOID_initials = 58,\n\tOID_generationalQualifier = 59,\n\tOID_subjectKeyIdentifier = 60,\n\tOID_keyUsage = 61,\n\tOID_subjectAltName = 62,\n\tOID_issuerAltName = 63,\n\tOID_basicConstraints = 64,\n\tOID_crlDistributionPoints = 65,\n\tOID_certPolicies = 66,\n\tOID_authorityKeyIdentifier = 67,\n\tOID_extKeyUsage = 68,\n\tOID_NetlogonMechanism = 69,\n\tOID_appleLocalKdcSupported = 70,\n\tOID_gostCPSignA = 71,\n\tOID_gostCPSignB = 72,\n\tOID_gostCPSignC = 73,\n\tOID_gost2012PKey256 = 74,\n\tOID_gost2012PKey512 = 75,\n\tOID_gost2012Digest256 = 76,\n\tOID_gost2012Digest512 = 77,\n\tOID_gost2012Signature256 = 78,\n\tOID_gost2012Signature512 = 79,\n\tOID_gostTC26Sign256A = 80,\n\tOID_gostTC26Sign256B = 81,\n\tOID_gostTC26Sign256C = 82,\n\tOID_gostTC26Sign256D = 83,\n\tOID_gostTC26Sign512A = 84,\n\tOID_gostTC26Sign512B = 85,\n\tOID_gostTC26Sign512C = 86,\n\tOID_sm2 = 87,\n\tOID_sm3 = 88,\n\tOID_SM2_with_SM3 = 89,\n\tOID_sm3WithRSAEncryption = 90,\n\tOID_TPMLoadableKey = 91,\n\tOID_TPMImportableKey = 92,\n\tOID_TPMSealedData = 93,\n\tOID_sha3_256 = 94,\n\tOID_sha3_384 = 95,\n\tOID_sha3_512 = 96,\n\tOID_id_ecdsa_with_sha3_256 = 97,\n\tOID_id_ecdsa_with_sha3_384 = 98,\n\tOID_id_ecdsa_with_sha3_512 = 99,\n\tOID_id_rsassa_pkcs1_v1_5_with_sha3_256 = 100,\n\tOID_id_rsassa_pkcs1_v1_5_with_sha3_384 = 101,\n\tOID_id_rsassa_pkcs1_v1_5_with_sha3_512 = 102,\n\tOID__NR = 103,\n};\n\nenum Opt_errors {\n\tOpt_errors_continue = 0,\n\tOpt_errors_panic = 1,\n};\n\nenum P4_ESCR_EMASKS {\n\tP4_EVENT_TC_DELIVER_MODE__DD = 512,\n\tP4_EVENT_TC_DELIVER_MODE__DB = 1024,\n\tP4_EVENT_TC_DELIVER_MODE__DI = 2048,\n\tP4_EVENT_TC_DELIVER_MODE__BD = 4096,\n\tP4_EVENT_TC_DELIVER_MODE__BB = 8192,\n\tP4_EVENT_TC_DELIVER_MODE__BI = 16384,\n\tP4_EVENT_TC_DELIVER_MODE__ID = 32768,\n\tP4_EVENT_BPU_FETCH_REQUEST__TCMISS = 512,\n\tP4_EVENT_ITLB_REFERENCE__HIT = 512,\n\tP4_EVENT_ITLB_REFERENCE__MISS = 1024,\n\tP4_EVENT_ITLB_REFERENCE__HIT_UK = 2048,\n\tP4_EVENT_MEMORY_CANCEL__ST_RB_FULL = 2048,\n\tP4_EVENT_MEMORY_CANCEL__64K_CONF = 4096,\n\tP4_EVENT_MEMORY_COMPLETE__LSC = 512,\n\tP4_EVENT_MEMORY_COMPLETE__SSC = 1024,\n\tP4_EVENT_LOAD_PORT_REPLAY__SPLIT_LD = 1024,\n\tP4_EVENT_STORE_PORT_REPLAY__SPLIT_ST = 1024,\n\tP4_EVENT_MOB_LOAD_REPLAY__NO_STA = 1024,\n\tP4_EVENT_MOB_LOAD_REPLAY__NO_STD = 4096,\n\tP4_EVENT_MOB_LOAD_REPLAY__PARTIAL_DATA = 8192,\n\tP4_EVENT_MOB_LOAD_REPLAY__UNALGN_ADDR = 16384,\n\tP4_EVENT_PAGE_WALK_TYPE__DTMISS = 512,\n\tP4_EVENT_PAGE_WALK_TYPE__ITMISS = 1024,\n\tP4_EVENT_BSQ_CACHE_REFERENCE__RD_2ndL_HITS = 512,\n\tP4_EVENT_BSQ_CACHE_REFERENCE__RD_2ndL_HITE = 1024,\n\tP4_EVENT_BSQ_CACHE_REFERENCE__RD_2ndL_HITM = 2048,\n\tP4_EVENT_BSQ_CACHE_REFERENCE__RD_3rdL_HITS = 4096,\n\tP4_EVENT_BSQ_CACHE_REFERENCE__RD_3rdL_HITE = 8192,\n\tP4_EVENT_BSQ_CACHE_REFERENCE__RD_3rdL_HITM = 16384,\n\tP4_EVENT_BSQ_CACHE_REFERENCE__RD_2ndL_MISS = 131072,\n\tP4_EVENT_BSQ_CACHE_REFERENCE__RD_3rdL_MISS = 262144,\n\tP4_EVENT_BSQ_CACHE_REFERENCE__WR_2ndL_MISS = 524288,\n\tP4_EVENT_IOQ_ALLOCATION__DEFAULT = 512,\n\tP4_EVENT_IOQ_ALLOCATION__ALL_READ = 16384,\n\tP4_EVENT_IOQ_ALLOCATION__ALL_WRITE = 32768,\n\tP4_EVENT_IOQ_ALLOCATION__MEM_UC = 65536,\n\tP4_EVENT_IOQ_ALLOCATION__MEM_WC = 131072,\n\tP4_EVENT_IOQ_ALLOCATION__MEM_WT = 262144,\n\tP4_EVENT_IOQ_ALLOCATION__MEM_WP = 524288,\n\tP4_EVENT_IOQ_ALLOCATION__MEM_WB = 1048576,\n\tP4_EVENT_IOQ_ALLOCATION__OWN = 4194304,\n\tP4_EVENT_IOQ_ALLOCATION__OTHER = 8388608,\n\tP4_EVENT_IOQ_ALLOCATION__PREFETCH = 16777216,\n\tP4_EVENT_IOQ_ACTIVE_ENTRIES__DEFAULT = 512,\n\tP4_EVENT_IOQ_ACTIVE_ENTRIES__ALL_READ = 16384,\n\tP4_EVENT_IOQ_ACTIVE_ENTRIES__ALL_WRITE = 32768,\n\tP4_EVENT_IOQ_ACTIVE_ENTRIES__MEM_UC = 65536,\n\tP4_EVENT_IOQ_ACTIVE_ENTRIES__MEM_WC = 131072,\n\tP4_EVENT_IOQ_ACTIVE_ENTRIES__MEM_WT = 262144,\n\tP4_EVENT_IOQ_ACTIVE_ENTRIES__MEM_WP = 524288,\n\tP4_EVENT_IOQ_ACTIVE_ENTRIES__MEM_WB = 1048576,\n\tP4_EVENT_IOQ_ACTIVE_ENTRIES__OWN = 4194304,\n\tP4_EVENT_IOQ_ACTIVE_ENTRIES__OTHER = 8388608,\n\tP4_EVENT_IOQ_ACTIVE_ENTRIES__PREFETCH = 16777216,\n\tP4_EVENT_FSB_DATA_ACTIVITY__DRDY_DRV = 512,\n\tP4_EVENT_FSB_DATA_ACTIVITY__DRDY_OWN = 1024,\n\tP4_EVENT_FSB_DATA_ACTIVITY__DRDY_OTHER = 2048,\n\tP4_EVENT_FSB_DATA_ACTIVITY__DBSY_DRV = 4096,\n\tP4_EVENT_FSB_DATA_ACTIVITY__DBSY_OWN = 8192,\n\tP4_EVENT_FSB_DATA_ACTIVITY__DBSY_OTHER = 16384,\n\tP4_EVENT_BSQ_ALLOCATION__REQ_TYPE0 = 512,\n\tP4_EVENT_BSQ_ALLOCATION__REQ_TYPE1 = 1024,\n\tP4_EVENT_BSQ_ALLOCATION__REQ_LEN0 = 2048,\n\tP4_EVENT_BSQ_ALLOCATION__REQ_LEN1 = 4096,\n\tP4_EVENT_BSQ_ALLOCATION__REQ_IO_TYPE = 16384,\n\tP4_EVENT_BSQ_ALLOCATION__REQ_LOCK_TYPE = 32768,\n\tP4_EVENT_BSQ_ALLOCATION__REQ_CACHE_TYPE = 65536,\n\tP4_EVENT_BSQ_ALLOCATION__REQ_SPLIT_TYPE = 131072,\n\tP4_EVENT_BSQ_ALLOCATION__REQ_DEM_TYPE = 262144,\n\tP4_EVENT_BSQ_ALLOCATION__REQ_ORD_TYPE = 524288,\n\tP4_EVENT_BSQ_ALLOCATION__MEM_TYPE0 = 1048576,\n\tP4_EVENT_BSQ_ALLOCATION__MEM_TYPE1 = 2097152,\n\tP4_EVENT_BSQ_ALLOCATION__MEM_TYPE2 = 4194304,\n\tP4_EVENT_BSQ_ACTIVE_ENTRIES__REQ_TYPE0 = 512,\n\tP4_EVENT_BSQ_ACTIVE_ENTRIES__REQ_TYPE1 = 1024,\n\tP4_EVENT_BSQ_ACTIVE_ENTRIES__REQ_LEN0 = 2048,\n\tP4_EVENT_BSQ_ACTIVE_ENTRIES__REQ_LEN1 = 4096,\n\tP4_EVENT_BSQ_ACTIVE_ENTRIES__REQ_IO_TYPE = 16384,\n\tP4_EVENT_BSQ_ACTIVE_ENTRIES__REQ_LOCK_TYPE = 32768,\n\tP4_EVENT_BSQ_ACTIVE_ENTRIES__REQ_CACHE_TYPE = 65536,\n\tP4_EVENT_BSQ_ACTIVE_ENTRIES__REQ_SPLIT_TYPE = 131072,\n\tP4_EVENT_BSQ_ACTIVE_ENTRIES__REQ_DEM_TYPE = 262144,\n\tP4_EVENT_BSQ_ACTIVE_ENTRIES__REQ_ORD_TYPE = 524288,\n\tP4_EVENT_BSQ_ACTIVE_ENTRIES__MEM_TYPE0 = 1048576,\n\tP4_EVENT_BSQ_ACTIVE_ENTRIES__MEM_TYPE1 = 2097152,\n\tP4_EVENT_BSQ_ACTIVE_ENTRIES__MEM_TYPE2 = 4194304,\n\tP4_EVENT_SSE_INPUT_ASSIST__ALL = 16777216,\n\tP4_EVENT_PACKED_SP_UOP__ALL = 16777216,\n\tP4_EVENT_PACKED_DP_UOP__ALL = 16777216,\n\tP4_EVENT_SCALAR_SP_UOP__ALL = 16777216,\n\tP4_EVENT_SCALAR_DP_UOP__ALL = 16777216,\n\tP4_EVENT_64BIT_MMX_UOP__ALL = 16777216,\n\tP4_EVENT_128BIT_MMX_UOP__ALL = 16777216,\n\tP4_EVENT_X87_FP_UOP__ALL = 16777216,\n\tP4_EVENT_TC_MISC__FLUSH = 8192,\n\tP4_EVENT_GLOBAL_POWER_EVENTS__RUNNING = 512,\n\tP4_EVENT_TC_MS_XFER__CISC = 512,\n\tP4_EVENT_UOP_QUEUE_WRITES__FROM_TC_BUILD = 512,\n\tP4_EVENT_UOP_QUEUE_WRITES__FROM_TC_DELIVER = 1024,\n\tP4_EVENT_UOP_QUEUE_WRITES__FROM_ROM = 2048,\n\tP4_EVENT_RETIRED_MISPRED_BRANCH_TYPE__CONDITIONAL = 1024,\n\tP4_EVENT_RETIRED_MISPRED_BRANCH_TYPE__CALL = 2048,\n\tP4_EVENT_RETIRED_MISPRED_BRANCH_TYPE__RETURN = 4096,\n\tP4_EVENT_RETIRED_MISPRED_BRANCH_TYPE__INDIRECT = 8192,\n\tP4_EVENT_RETIRED_BRANCH_TYPE__CONDITIONAL = 1024,\n\tP4_EVENT_RETIRED_BRANCH_TYPE__CALL = 2048,\n\tP4_EVENT_RETIRED_BRANCH_TYPE__RETURN = 4096,\n\tP4_EVENT_RETIRED_BRANCH_TYPE__INDIRECT = 8192,\n\tP4_EVENT_RESOURCE_STALL__SBFULL = 16384,\n\tP4_EVENT_WC_BUFFER__WCB_EVICTS = 512,\n\tP4_EVENT_WC_BUFFER__WCB_FULL_EVICTS = 1024,\n\tP4_EVENT_FRONT_END_EVENT__NBOGUS = 512,\n\tP4_EVENT_FRONT_END_EVENT__BOGUS = 1024,\n\tP4_EVENT_EXECUTION_EVENT__NBOGUS0 = 512,\n\tP4_EVENT_EXECUTION_EVENT__NBOGUS1 = 1024,\n\tP4_EVENT_EXECUTION_EVENT__NBOGUS2 = 2048,\n\tP4_EVENT_EXECUTION_EVENT__NBOGUS3 = 4096,\n\tP4_EVENT_EXECUTION_EVENT__BOGUS0 = 8192,\n\tP4_EVENT_EXECUTION_EVENT__BOGUS1 = 16384,\n\tP4_EVENT_EXECUTION_EVENT__BOGUS2 = 32768,\n\tP4_EVENT_EXECUTION_EVENT__BOGUS3 = 65536,\n\tP4_EVENT_REPLAY_EVENT__NBOGUS = 512,\n\tP4_EVENT_REPLAY_EVENT__BOGUS = 1024,\n\tP4_EVENT_INSTR_RETIRED__NBOGUSNTAG = 512,\n\tP4_EVENT_INSTR_RETIRED__NBOGUSTAG = 1024,\n\tP4_EVENT_INSTR_RETIRED__BOGUSNTAG = 2048,\n\tP4_EVENT_INSTR_RETIRED__BOGUSTAG = 4096,\n\tP4_EVENT_UOPS_RETIRED__NBOGUS = 512,\n\tP4_EVENT_UOPS_RETIRED__BOGUS = 1024,\n\tP4_EVENT_UOP_TYPE__TAGLOADS = 1024,\n\tP4_EVENT_UOP_TYPE__TAGSTORES = 2048,\n\tP4_EVENT_BRANCH_RETIRED__MMNP = 512,\n\tP4_EVENT_BRANCH_RETIRED__MMNM = 1024,\n\tP4_EVENT_BRANCH_RETIRED__MMTP = 2048,\n\tP4_EVENT_BRANCH_RETIRED__MMTM = 4096,\n\tP4_EVENT_MISPRED_BRANCH_RETIRED__NBOGUS = 512,\n\tP4_EVENT_X87_ASSIST__FPSU = 512,\n\tP4_EVENT_X87_ASSIST__FPSO = 1024,\n\tP4_EVENT_X87_ASSIST__POAO = 2048,\n\tP4_EVENT_X87_ASSIST__POAU = 4096,\n\tP4_EVENT_X87_ASSIST__PREA = 8192,\n\tP4_EVENT_MACHINE_CLEAR__CLEAR = 512,\n\tP4_EVENT_MACHINE_CLEAR__MOCLEAR = 1024,\n\tP4_EVENT_MACHINE_CLEAR__SMCLEAR = 2048,\n\tP4_EVENT_INSTR_COMPLETED__NBOGUS = 512,\n\tP4_EVENT_INSTR_COMPLETED__BOGUS = 1024,\n};\n\nenum P4_EVENTS {\n\tP4_EVENT_TC_DELIVER_MODE = 0,\n\tP4_EVENT_BPU_FETCH_REQUEST = 1,\n\tP4_EVENT_ITLB_REFERENCE = 2,\n\tP4_EVENT_MEMORY_CANCEL = 3,\n\tP4_EVENT_MEMORY_COMPLETE = 4,\n\tP4_EVENT_LOAD_PORT_REPLAY = 5,\n\tP4_EVENT_STORE_PORT_REPLAY = 6,\n\tP4_EVENT_MOB_LOAD_REPLAY = 7,\n\tP4_EVENT_PAGE_WALK_TYPE = 8,\n\tP4_EVENT_BSQ_CACHE_REFERENCE = 9,\n\tP4_EVENT_IOQ_ALLOCATION = 10,\n\tP4_EVENT_IOQ_ACTIVE_ENTRIES = 11,\n\tP4_EVENT_FSB_DATA_ACTIVITY = 12,\n\tP4_EVENT_BSQ_ALLOCATION = 13,\n\tP4_EVENT_BSQ_ACTIVE_ENTRIES = 14,\n\tP4_EVENT_SSE_INPUT_ASSIST = 15,\n\tP4_EVENT_PACKED_SP_UOP = 16,\n\tP4_EVENT_PACKED_DP_UOP = 17,\n\tP4_EVENT_SCALAR_SP_UOP = 18,\n\tP4_EVENT_SCALAR_DP_UOP = 19,\n\tP4_EVENT_64BIT_MMX_UOP = 20,\n\tP4_EVENT_128BIT_MMX_UOP = 21,\n\tP4_EVENT_X87_FP_UOP = 22,\n\tP4_EVENT_TC_MISC = 23,\n\tP4_EVENT_GLOBAL_POWER_EVENTS = 24,\n\tP4_EVENT_TC_MS_XFER = 25,\n\tP4_EVENT_UOP_QUEUE_WRITES = 26,\n\tP4_EVENT_RETIRED_MISPRED_BRANCH_TYPE = 27,\n\tP4_EVENT_RETIRED_BRANCH_TYPE = 28,\n\tP4_EVENT_RESOURCE_STALL = 29,\n\tP4_EVENT_WC_BUFFER = 30,\n\tP4_EVENT_B2B_CYCLES = 31,\n\tP4_EVENT_BNR = 32,\n\tP4_EVENT_SNOOP = 33,\n\tP4_EVENT_RESPONSE = 34,\n\tP4_EVENT_FRONT_END_EVENT = 35,\n\tP4_EVENT_EXECUTION_EVENT = 36,\n\tP4_EVENT_REPLAY_EVENT = 37,\n\tP4_EVENT_INSTR_RETIRED = 38,\n\tP4_EVENT_UOPS_RETIRED = 39,\n\tP4_EVENT_UOP_TYPE = 40,\n\tP4_EVENT_BRANCH_RETIRED = 41,\n\tP4_EVENT_MISPRED_BRANCH_RETIRED = 42,\n\tP4_EVENT_X87_ASSIST = 43,\n\tP4_EVENT_MACHINE_CLEAR = 44,\n\tP4_EVENT_INSTR_COMPLETED = 45,\n};\n\nenum P4_EVENT_OPCODES {\n\tP4_EVENT_TC_DELIVER_MODE_OPCODE = 257,\n\tP4_EVENT_BPU_FETCH_REQUEST_OPCODE = 768,\n\tP4_EVENT_ITLB_REFERENCE_OPCODE = 6147,\n\tP4_EVENT_MEMORY_CANCEL_OPCODE = 517,\n\tP4_EVENT_MEMORY_COMPLETE_OPCODE = 2050,\n\tP4_EVENT_LOAD_PORT_REPLAY_OPCODE = 1026,\n\tP4_EVENT_STORE_PORT_REPLAY_OPCODE = 1282,\n\tP4_EVENT_MOB_LOAD_REPLAY_OPCODE = 770,\n\tP4_EVENT_PAGE_WALK_TYPE_OPCODE = 260,\n\tP4_EVENT_BSQ_CACHE_REFERENCE_OPCODE = 3079,\n\tP4_EVENT_IOQ_ALLOCATION_OPCODE = 774,\n\tP4_EVENT_IOQ_ACTIVE_ENTRIES_OPCODE = 6662,\n\tP4_EVENT_FSB_DATA_ACTIVITY_OPCODE = 5894,\n\tP4_EVENT_BSQ_ALLOCATION_OPCODE = 1287,\n\tP4_EVENT_BSQ_ACTIVE_ENTRIES_OPCODE = 1543,\n\tP4_EVENT_SSE_INPUT_ASSIST_OPCODE = 13313,\n\tP4_EVENT_PACKED_SP_UOP_OPCODE = 2049,\n\tP4_EVENT_PACKED_DP_UOP_OPCODE = 3073,\n\tP4_EVENT_SCALAR_SP_UOP_OPCODE = 2561,\n\tP4_EVENT_SCALAR_DP_UOP_OPCODE = 3585,\n\tP4_EVENT_64BIT_MMX_UOP_OPCODE = 513,\n\tP4_EVENT_128BIT_MMX_UOP_OPCODE = 6657,\n\tP4_EVENT_X87_FP_UOP_OPCODE = 1025,\n\tP4_EVENT_TC_MISC_OPCODE = 1537,\n\tP4_EVENT_GLOBAL_POWER_EVENTS_OPCODE = 4870,\n\tP4_EVENT_TC_MS_XFER_OPCODE = 1280,\n\tP4_EVENT_UOP_QUEUE_WRITES_OPCODE = 2304,\n\tP4_EVENT_RETIRED_MISPRED_BRANCH_TYPE_OPCODE = 1282,\n\tP4_EVENT_RETIRED_BRANCH_TYPE_OPCODE = 1026,\n\tP4_EVENT_RESOURCE_STALL_OPCODE = 257,\n\tP4_EVENT_WC_BUFFER_OPCODE = 1285,\n\tP4_EVENT_B2B_CYCLES_OPCODE = 5635,\n\tP4_EVENT_BNR_OPCODE = 2051,\n\tP4_EVENT_SNOOP_OPCODE = 1539,\n\tP4_EVENT_RESPONSE_OPCODE = 1027,\n\tP4_EVENT_FRONT_END_EVENT_OPCODE = 2053,\n\tP4_EVENT_EXECUTION_EVENT_OPCODE = 3077,\n\tP4_EVENT_REPLAY_EVENT_OPCODE = 2309,\n\tP4_EVENT_INSTR_RETIRED_OPCODE = 516,\n\tP4_EVENT_UOPS_RETIRED_OPCODE = 260,\n\tP4_EVENT_UOP_TYPE_OPCODE = 514,\n\tP4_EVENT_BRANCH_RETIRED_OPCODE = 1541,\n\tP4_EVENT_MISPRED_BRANCH_RETIRED_OPCODE = 772,\n\tP4_EVENT_X87_ASSIST_OPCODE = 773,\n\tP4_EVENT_MACHINE_CLEAR_OPCODE = 517,\n\tP4_EVENT_INSTR_COMPLETED_OPCODE = 1796,\n};\n\nenum P4_PEBS_METRIC {\n\tP4_PEBS_METRIC__none = 0,\n\tP4_PEBS_METRIC__1stl_cache_load_miss_retired = 1,\n\tP4_PEBS_METRIC__2ndl_cache_load_miss_retired = 2,\n\tP4_PEBS_METRIC__dtlb_load_miss_retired = 3,\n\tP4_PEBS_METRIC__dtlb_store_miss_retired = 4,\n\tP4_PEBS_METRIC__dtlb_all_miss_retired = 5,\n\tP4_PEBS_METRIC__tagged_mispred_branch = 6,\n\tP4_PEBS_METRIC__mob_load_replay_retired = 7,\n\tP4_PEBS_METRIC__split_load_retired = 8,\n\tP4_PEBS_METRIC__split_store_retired = 9,\n\tP4_PEBS_METRIC__max = 10,\n};\n\nenum SHIFT_DIRECTION {\n\tSHIFT_LEFT = 0,\n\tSHIFT_RIGHT = 1,\n};\n\nenum TPM_OPS_FLAGS {\n\tTPM_OPS_AUTO_STARTUP = 1,\n};\n\nenum __sk_action {\n\t__SK_DROP = 0,\n\t__SK_PASS = 1,\n\t__SK_REDIRECT = 2,\n\t__SK_NONE = 3,\n};\n\nenum _cache_type {\n\tCTYPE_NULL = 0,\n\tCTYPE_DATA = 1,\n\tCTYPE_INST = 2,\n\tCTYPE_UNIFIED = 3,\n};\n\nenum _slab_flag_bits {\n\t_SLAB_CONSISTENCY_CHECKS = 0,\n\t_SLAB_RED_ZONE = 1,\n\t_SLAB_POISON = 2,\n\t_SLAB_KMALLOC = 3,\n\t_SLAB_HWCACHE_ALIGN = 4,\n\t_SLAB_CACHE_DMA = 5,\n\t_SLAB_CACHE_DMA32 = 6,\n\t_SLAB_STORE_USER = 7,\n\t_SLAB_PANIC = 8,\n\t_SLAB_TYPESAFE_BY_RCU = 9,\n\t_SLAB_TRACE = 10,\n\t_SLAB_NOLEAKTRACE = 11,\n\t_SLAB_NO_MERGE = 12,\n\t_SLAB_ACCOUNT = 13,\n\t_SLAB_NO_USER_FLAGS = 14,\n\t_SLAB_SKIP_KFENCE = 15,\n\t_SLAB_RECLAIM_ACCOUNT = 16,\n\t_SLAB_OBJECT_POISON = 17,\n\t_SLAB_CMPXCHG_DOUBLE = 18,\n\t_SLAB_NO_OBJ_EXT = 19,\n\t_SLAB_FLAGS_LAST_BIT = 20,\n};\n\nenum aa_code {\n\tAA_U8 = 0,\n\tAA_U16 = 1,\n\tAA_U32 = 2,\n\tAA_U64 = 3,\n\tAA_NAME = 4,\n\tAA_STRING = 5,\n\tAA_BLOB = 6,\n\tAA_STRUCT = 7,\n\tAA_STRUCTEND = 8,\n\tAA_LIST = 9,\n\tAA_LISTEND = 10,\n\tAA_ARRAY = 11,\n\tAA_ARRAYEND = 12,\n};\n\nenum aa_sfs_type {\n\tAA_SFS_TYPE_BOOLEAN = 0,\n\tAA_SFS_TYPE_STRING = 1,\n\tAA_SFS_TYPE_U64 = 2,\n\tAA_SFS_TYPE_FOPS = 3,\n\tAA_SFS_TYPE_DIR = 4,\n};\n\nenum aafs_ns_type {\n\tAAFS_NS_DIR = 0,\n\tAAFS_NS_PROFS = 1,\n\tAAFS_NS_NS = 2,\n\tAAFS_NS_RAW_DATA = 3,\n\tAAFS_NS_LOAD = 4,\n\tAAFS_NS_REPLACE = 5,\n\tAAFS_NS_REMOVE = 6,\n\tAAFS_NS_REVISION = 7,\n\tAAFS_NS_COUNT = 8,\n\tAAFS_NS_MAX_COUNT = 9,\n\tAAFS_NS_SIZE = 10,\n\tAAFS_NS_MAX_SIZE = 11,\n\tAAFS_NS_OWNER = 12,\n\tAAFS_NS_SIZEOF = 13,\n};\n\nenum aafs_prof_type {\n\tAAFS_PROF_DIR = 0,\n\tAAFS_PROF_PROFS = 1,\n\tAAFS_PROF_NAME = 2,\n\tAAFS_PROF_MODE = 3,\n\tAAFS_PROF_ATTACH = 4,\n\tAAFS_PROF_HASH = 5,\n\tAAFS_PROF_RAW_DATA = 6,\n\tAAFS_PROF_RAW_HASH = 7,\n\tAAFS_PROF_RAW_ABI = 8,\n\tAAFS_PROF_LEARNING_COUNT = 9,\n\tAAFS_PROF_SIZEOF = 10,\n};\n\nenum aat2870_id {\n\tAAT2870_ID_BL = 0,\n\tAAT2870_ID_LDOA = 1,\n\tAAT2870_ID_LDOB = 2,\n\tAAT2870_ID_LDOC = 3,\n\tAAT2870_ID_LDOD = 4,\n};\n\nenum access_coordinate_class {\n\tACCESS_COORDINATE_LOCAL = 0,\n\tACCESS_COORDINATE_CPU = 1,\n\tACCESS_COORDINATE_MAX = 2,\n};\n\nenum acpi_attr_enum {\n\tACPI_ATTR_LABEL_SHOW = 0,\n\tACPI_ATTR_INDEX_SHOW = 1,\n};\n\nenum acpi_bridge_type {\n\tACPI_BRIDGE_TYPE_PCIE = 1,\n\tACPI_BRIDGE_TYPE_CXL = 2,\n};\n\nenum acpi_bus_device_type {\n\tACPI_BUS_TYPE_DEVICE = 0,\n\tACPI_BUS_TYPE_POWER = 1,\n\tACPI_BUS_TYPE_PROCESSOR = 2,\n\tACPI_BUS_TYPE_THERMAL = 3,\n\tACPI_BUS_TYPE_POWER_BUTTON = 4,\n\tACPI_BUS_TYPE_SLEEP_BUTTON = 5,\n\tACPI_BUS_TYPE_ECDT_EC = 6,\n\tACPI_BUS_DEVICE_TYPE_COUNT = 7,\n};\n\nenum acpi_cdat_type {\n\tACPI_CDAT_TYPE_DSMAS = 0,\n\tACPI_CDAT_TYPE_DSLBIS = 1,\n\tACPI_CDAT_TYPE_DSMSCIS = 2,\n\tACPI_CDAT_TYPE_DSIS = 3,\n\tACPI_CDAT_TYPE_DSEMTS = 4,\n\tACPI_CDAT_TYPE_SSLBIS = 5,\n\tACPI_CDAT_TYPE_RESERVED = 6,\n};\n\nenum acpi_cedt_type {\n\tACPI_CEDT_TYPE_CHBS = 0,\n\tACPI_CEDT_TYPE_CFMWS = 1,\n\tACPI_CEDT_TYPE_CXIMS = 2,\n\tACPI_CEDT_TYPE_RDPAS = 3,\n\tACPI_CEDT_TYPE_RESERVED = 4,\n};\n\nenum acpi_device_swnode_dev_props {\n\tACPI_DEVICE_SWNODE_DEV_ROTATION = 0,\n\tACPI_DEVICE_SWNODE_DEV_CLOCK_FREQUENCY = 1,\n\tACPI_DEVICE_SWNODE_DEV_LED_MAX_MICROAMP = 2,\n\tACPI_DEVICE_SWNODE_DEV_FLASH_MAX_MICROAMP = 3,\n\tACPI_DEVICE_SWNODE_DEV_FLASH_MAX_TIMEOUT_US = 4,\n\tACPI_DEVICE_SWNODE_DEV_NUM_OF = 5,\n\tACPI_DEVICE_SWNODE_DEV_NUM_ENTRIES = 6,\n};\n\nenum acpi_device_swnode_ep_props {\n\tACPI_DEVICE_SWNODE_EP_REMOTE_EP = 0,\n\tACPI_DEVICE_SWNODE_EP_BUS_TYPE = 1,\n\tACPI_DEVICE_SWNODE_EP_REG = 2,\n\tACPI_DEVICE_SWNODE_EP_CLOCK_LANES = 3,\n\tACPI_DEVICE_SWNODE_EP_DATA_LANES = 4,\n\tACPI_DEVICE_SWNODE_EP_LANE_POLARITIES = 5,\n\tACPI_DEVICE_SWNODE_EP_LINK_FREQUENCIES = 6,\n\tACPI_DEVICE_SWNODE_EP_NUM_OF = 7,\n\tACPI_DEVICE_SWNODE_EP_NUM_ENTRIES = 8,\n};\n\nenum acpi_device_swnode_port_props {\n\tACPI_DEVICE_SWNODE_PORT_REG = 0,\n\tACPI_DEVICE_SWNODE_PORT_NUM_OF = 1,\n\tACPI_DEVICE_SWNODE_PORT_NUM_ENTRIES = 2,\n};\n\nenum acpi_dmar_scope_type {\n\tACPI_DMAR_SCOPE_TYPE_NOT_USED = 0,\n\tACPI_DMAR_SCOPE_TYPE_ENDPOINT = 1,\n\tACPI_DMAR_SCOPE_TYPE_BRIDGE = 2,\n\tACPI_DMAR_SCOPE_TYPE_IOAPIC = 3,\n\tACPI_DMAR_SCOPE_TYPE_HPET = 4,\n\tACPI_DMAR_SCOPE_TYPE_NAMESPACE = 5,\n\tACPI_DMAR_SCOPE_TYPE_RESERVED = 6,\n};\n\nenum acpi_dmar_type {\n\tACPI_DMAR_TYPE_HARDWARE_UNIT = 0,\n\tACPI_DMAR_TYPE_RESERVED_MEMORY = 1,\n\tACPI_DMAR_TYPE_ROOT_ATS = 2,\n\tACPI_DMAR_TYPE_HARDWARE_AFFINITY = 3,\n\tACPI_DMAR_TYPE_NAMESPACE = 4,\n\tACPI_DMAR_TYPE_SATC = 5,\n\tACPI_DMAR_TYPE_RESERVED = 6,\n};\n\nenum acpi_ec_event_state {\n\tEC_EVENT_READY = 0,\n\tEC_EVENT_IN_PROGRESS = 1,\n\tEC_EVENT_COMPLETE = 2,\n};\n\nenum acpi_erst_actions {\n\tACPI_ERST_BEGIN_WRITE = 0,\n\tACPI_ERST_BEGIN_READ = 1,\n\tACPI_ERST_BEGIN_CLEAR = 2,\n\tACPI_ERST_END = 3,\n\tACPI_ERST_SET_RECORD_OFFSET = 4,\n\tACPI_ERST_EXECUTE_OPERATION = 5,\n\tACPI_ERST_CHECK_BUSY_STATUS = 6,\n\tACPI_ERST_GET_COMMAND_STATUS = 7,\n\tACPI_ERST_GET_RECORD_ID = 8,\n\tACPI_ERST_SET_RECORD_ID = 9,\n\tACPI_ERST_GET_RECORD_COUNT = 10,\n\tACPI_ERST_BEGIN_DUMMY_WRIITE = 11,\n\tACPI_ERST_NOT_USED = 12,\n\tACPI_ERST_GET_ERROR_RANGE = 13,\n\tACPI_ERST_GET_ERROR_LENGTH = 14,\n\tACPI_ERST_GET_ERROR_ATTRIBUTES = 15,\n\tACPI_ERST_EXECUTE_TIMINGS = 16,\n\tACPI_ERST_ACTION_RESERVED = 17,\n};\n\nenum acpi_erst_instructions {\n\tACPI_ERST_READ_REGISTER = 0,\n\tACPI_ERST_READ_REGISTER_VALUE = 1,\n\tACPI_ERST_WRITE_REGISTER = 2,\n\tACPI_ERST_WRITE_REGISTER_VALUE = 3,\n\tACPI_ERST_NOOP = 4,\n\tACPI_ERST_LOAD_VAR1 = 5,\n\tACPI_ERST_LOAD_VAR2 = 6,\n\tACPI_ERST_STORE_VAR1 = 7,\n\tACPI_ERST_ADD = 8,\n\tACPI_ERST_SUBTRACT = 9,\n\tACPI_ERST_ADD_VALUE = 10,\n\tACPI_ERST_SUBTRACT_VALUE = 11,\n\tACPI_ERST_STALL = 12,\n\tACPI_ERST_STALL_WHILE_TRUE = 13,\n\tACPI_ERST_SKIP_NEXT_IF_TRUE = 14,\n\tACPI_ERST_GOTO = 15,\n\tACPI_ERST_SET_SRC_ADDRESS_BASE = 16,\n\tACPI_ERST_SET_DST_ADDRESS_BASE = 17,\n\tACPI_ERST_MOVE_DATA = 18,\n\tACPI_ERST_INSTRUCTION_RESERVED = 19,\n};\n\nenum acpi_ex_debugger_commands {\n\tCMD_NOT_FOUND = 0,\n\tCMD_NULL = 1,\n\tCMD_ALL = 2,\n\tCMD_ALLOCATIONS = 3,\n\tCMD_ARGS = 4,\n\tCMD_ARGUMENTS = 5,\n\tCMD_BREAKPOINT = 6,\n\tCMD_BUSINFO = 7,\n\tCMD_CALL = 8,\n\tCMD_DEBUG = 9,\n\tCMD_DISASSEMBLE = 10,\n\tCMD_DISASM = 11,\n\tCMD_DUMP = 12,\n\tCMD_EVALUATE = 13,\n\tCMD_EXECUTE = 14,\n\tCMD_EXIT = 15,\n\tCMD_FIELDS = 16,\n\tCMD_FIND = 17,\n\tCMD_GO = 18,\n\tCMD_HANDLERS = 19,\n\tCMD_HELP = 20,\n\tCMD_HELP2 = 21,\n\tCMD_HISTORY = 22,\n\tCMD_HISTORY_EXE = 23,\n\tCMD_HISTORY_LAST = 24,\n\tCMD_INFORMATION = 25,\n\tCMD_INTEGRITY = 26,\n\tCMD_INTO = 27,\n\tCMD_LEVEL = 28,\n\tCMD_LIST = 29,\n\tCMD_LOCALS = 30,\n\tCMD_LOCKS = 31,\n\tCMD_METHODS = 32,\n\tCMD_NAMESPACE = 33,\n\tCMD_NOTIFY = 34,\n\tCMD_OBJECTS = 35,\n\tCMD_OSI = 36,\n\tCMD_OWNER = 37,\n\tCMD_PATHS = 38,\n\tCMD_PREDEFINED = 39,\n\tCMD_PREFIX = 40,\n\tCMD_QUIT = 41,\n\tCMD_REFERENCES = 42,\n\tCMD_RESOURCES = 43,\n\tCMD_RESULTS = 44,\n\tCMD_SET = 45,\n\tCMD_STATS = 46,\n\tCMD_STOP = 47,\n\tCMD_TABLES = 48,\n\tCMD_TEMPLATE = 49,\n\tCMD_TRACE = 50,\n\tCMD_TREE = 51,\n\tCMD_TYPE = 52,\n};\n\nenum acpi_hest_notify_types {\n\tACPI_HEST_NOTIFY_POLLED = 0,\n\tACPI_HEST_NOTIFY_EXTERNAL = 1,\n\tACPI_HEST_NOTIFY_LOCAL = 2,\n\tACPI_HEST_NOTIFY_SCI = 3,\n\tACPI_HEST_NOTIFY_NMI = 4,\n\tACPI_HEST_NOTIFY_CMCI = 5,\n\tACPI_HEST_NOTIFY_MCE = 6,\n\tACPI_HEST_NOTIFY_GPIO = 7,\n\tACPI_HEST_NOTIFY_SEA = 8,\n\tACPI_HEST_NOTIFY_SEI = 9,\n\tACPI_HEST_NOTIFY_GSIV = 10,\n\tACPI_HEST_NOTIFY_SOFTWARE_DELEGATED = 11,\n\tACPI_HEST_NOTIFY_RESERVED = 12,\n};\n\nenum acpi_hest_types {\n\tACPI_HEST_TYPE_IA32_CHECK = 0,\n\tACPI_HEST_TYPE_IA32_CORRECTED_CHECK = 1,\n\tACPI_HEST_TYPE_IA32_NMI = 2,\n\tACPI_HEST_TYPE_NOT_USED3 = 3,\n\tACPI_HEST_TYPE_NOT_USED4 = 4,\n\tACPI_HEST_TYPE_NOT_USED5 = 5,\n\tACPI_HEST_TYPE_AER_ROOT_PORT = 6,\n\tACPI_HEST_TYPE_AER_ENDPOINT = 7,\n\tACPI_HEST_TYPE_AER_BRIDGE = 8,\n\tACPI_HEST_TYPE_GENERIC_ERROR = 9,\n\tACPI_HEST_TYPE_GENERIC_ERROR_V2 = 10,\n\tACPI_HEST_TYPE_IA32_DEFERRED_CHECK = 11,\n\tACPI_HEST_TYPE_RESERVED = 12,\n};\n\nenum acpi_hmat_type {\n\tACPI_HMAT_TYPE_PROXIMITY = 0,\n\tACPI_HMAT_TYPE_LOCALITY = 1,\n\tACPI_HMAT_TYPE_CACHE = 2,\n\tACPI_HMAT_TYPE_RESERVED = 3,\n};\n\nenum acpi_irq_model_id {\n\tACPI_IRQ_MODEL_PIC = 0,\n\tACPI_IRQ_MODEL_IOAPIC = 1,\n\tACPI_IRQ_MODEL_IOSAPIC = 2,\n\tACPI_IRQ_MODEL_PLATFORM = 3,\n\tACPI_IRQ_MODEL_GIC = 4,\n\tACPI_IRQ_MODEL_LPIC = 5,\n\tACPI_IRQ_MODEL_COUNT = 6,\n};\n\nenum acpi_madt_multiproc_wakeup_version {\n\tACPI_MADT_MP_WAKEUP_VERSION_NONE = 0,\n\tACPI_MADT_MP_WAKEUP_VERSION_V1 = 1,\n\tACPI_MADT_MP_WAKEUP_VERSION_RESERVED = 2,\n};\n\nenum acpi_madt_type {\n\tACPI_MADT_TYPE_LOCAL_APIC = 0,\n\tACPI_MADT_TYPE_IO_APIC = 1,\n\tACPI_MADT_TYPE_INTERRUPT_OVERRIDE = 2,\n\tACPI_MADT_TYPE_NMI_SOURCE = 3,\n\tACPI_MADT_TYPE_LOCAL_APIC_NMI = 4,\n\tACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE = 5,\n\tACPI_MADT_TYPE_IO_SAPIC = 6,\n\tACPI_MADT_TYPE_LOCAL_SAPIC = 7,\n\tACPI_MADT_TYPE_INTERRUPT_SOURCE = 8,\n\tACPI_MADT_TYPE_LOCAL_X2APIC = 9,\n\tACPI_MADT_TYPE_LOCAL_X2APIC_NMI = 10,\n\tACPI_MADT_TYPE_GENERIC_INTERRUPT = 11,\n\tACPI_MADT_TYPE_GENERIC_DISTRIBUTOR = 12,\n\tACPI_MADT_TYPE_GENERIC_MSI_FRAME = 13,\n\tACPI_MADT_TYPE_GENERIC_REDISTRIBUTOR = 14,\n\tACPI_MADT_TYPE_GENERIC_TRANSLATOR = 15,\n\tACPI_MADT_TYPE_MULTIPROC_WAKEUP = 16,\n\tACPI_MADT_TYPE_CORE_PIC = 17,\n\tACPI_MADT_TYPE_LIO_PIC = 18,\n\tACPI_MADT_TYPE_HT_PIC = 19,\n\tACPI_MADT_TYPE_EIO_PIC = 20,\n\tACPI_MADT_TYPE_MSI_PIC = 21,\n\tACPI_MADT_TYPE_BIO_PIC = 22,\n\tACPI_MADT_TYPE_LPC_PIC = 23,\n\tACPI_MADT_TYPE_RINTC = 24,\n\tACPI_MADT_TYPE_IMSIC = 25,\n\tACPI_MADT_TYPE_APLIC = 26,\n\tACPI_MADT_TYPE_PLIC = 27,\n\tACPI_MADT_TYPE_RESERVED = 28,\n\tACPI_MADT_TYPE_OEM_RESERVED = 128,\n};\n\nenum acpi_pcct_type {\n\tACPI_PCCT_TYPE_GENERIC_SUBSPACE = 0,\n\tACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE = 1,\n\tACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE_TYPE2 = 2,\n\tACPI_PCCT_TYPE_EXT_PCC_MASTER_SUBSPACE = 3,\n\tACPI_PCCT_TYPE_EXT_PCC_SLAVE_SUBSPACE = 4,\n\tACPI_PCCT_TYPE_HW_REG_COMM_SUBSPACE = 5,\n\tACPI_PCCT_TYPE_RESERVED = 6,\n};\n\nenum acpi_predicate {\n\tall_versions = 0,\n\tless_than_or_equal = 1,\n\tequal = 2,\n\tgreater_than_or_equal = 3,\n};\n\nenum acpi_preferred_pm_profiles {\n\tPM_UNSPECIFIED = 0,\n\tPM_DESKTOP = 1,\n\tPM_MOBILE = 2,\n\tPM_WORKSTATION = 3,\n\tPM_ENTERPRISE_SERVER = 4,\n\tPM_SOHO_SERVER = 5,\n\tPM_APPLIANCE_PC = 6,\n\tPM_PERFORMANCE_SERVER = 7,\n\tPM_TABLET = 8,\n\tNR_PM_PROFILES = 9,\n};\n\nenum acpi_reconfig_event {\n\tACPI_RECONFIG_DEVICE_ADD = 0,\n\tACPI_RECONFIG_DEVICE_REMOVE = 1,\n};\n\nenum acpi_return_package_types {\n\tACPI_PTYPE1_FIXED = 1,\n\tACPI_PTYPE1_VAR = 2,\n\tACPI_PTYPE1_OPTION = 3,\n\tACPI_PTYPE2 = 4,\n\tACPI_PTYPE2_COUNT = 5,\n\tACPI_PTYPE2_PKG_COUNT = 6,\n\tACPI_PTYPE2_FIXED = 7,\n\tACPI_PTYPE2_MIN = 8,\n\tACPI_PTYPE2_REV_FIXED = 9,\n\tACPI_PTYPE2_FIX_VAR = 10,\n\tACPI_PTYPE2_VAR_VAR = 11,\n\tACPI_PTYPE2_UUID_PAIR = 12,\n\tACPI_PTYPE_CUSTOM = 13,\n};\n\nenum acpi_srat_type {\n\tACPI_SRAT_TYPE_CPU_AFFINITY = 0,\n\tACPI_SRAT_TYPE_MEMORY_AFFINITY = 1,\n\tACPI_SRAT_TYPE_X2APIC_CPU_AFFINITY = 2,\n\tACPI_SRAT_TYPE_GICC_AFFINITY = 3,\n\tACPI_SRAT_TYPE_GIC_ITS_AFFINITY = 4,\n\tACPI_SRAT_TYPE_GENERIC_AFFINITY = 5,\n\tACPI_SRAT_TYPE_GENERIC_PORT_AFFINITY = 6,\n\tACPI_SRAT_TYPE_RINTC_AFFINITY = 7,\n\tACPI_SRAT_TYPE_RESERVED = 8,\n};\n\nenum acpi_subtable_type {\n\tACPI_SUBTABLE_COMMON = 0,\n\tACPI_SUBTABLE_HMAT = 1,\n\tACPI_SUBTABLE_PRMT = 2,\n\tACPI_SUBTABLE_CEDT = 3,\n\tCDAT_SUBTABLE = 4,\n};\n\nenum acpi_viot_node_type {\n\tACPI_VIOT_NODE_PCI_RANGE = 1,\n\tACPI_VIOT_NODE_MMIO = 2,\n\tACPI_VIOT_NODE_VIRTIO_IOMMU_PCI = 3,\n\tACPI_VIOT_NODE_VIRTIO_IOMMU_MMIO = 4,\n\tACPI_VIOT_RESERVED = 5,\n};\n\nenum action_id {\n\tACTION_SAVE = 1,\n\tACTION_TRACE = 2,\n\tACTION_SNAPSHOT = 3,\n};\n\nenum action_t {\n\tnmi_act_kdump = 0,\n\tnmi_act_dump = 1,\n\tnmi_act_ips = 2,\n\tnmi_act_kdb = 3,\n\tnmi_act_kgdb = 4,\n\tnmi_act_health = 5,\n\tnmi_act_max = 6,\n};\n\nenum actions {\n\tREGISTER = 0,\n\tDEREGISTER = 1,\n\tCPU_DONT_CARE = 2,\n};\n\nenum addr_type {\n\tADDR_LOCAL = 0,\n\tADDR_LOCAL_PRIV = 1,\n\tADDR_REMOTE = 2,\n};\n\nenum addr_type_t {\n\tUNICAST_ADDR = 0,\n\tMULTICAST_ADDR = 1,\n\tANYCAST_ADDR = 2,\n};\n\nenum address_markers_idx {\n\tUSER_SPACE_NR = 0,\n\tKERNEL_SPACE_NR = 1,\n\tLDT_NR = 2,\n\tLOW_KERNEL_NR = 3,\n\tVMALLOC_START_NR = 4,\n\tVMEMMAP_START_NR = 5,\n\tCPU_ENTRY_AREA_NR = 6,\n\tESPFIX_START_NR = 7,\n\tEFI_END_NR = 8,\n\tHIGH_KERNEL_NR = 9,\n\tMODULES_VADDR_NR = 10,\n\tMODULES_END_NR = 11,\n\tFIXADDR_START_NR = 12,\n\tEND_OF_SPACE_NR = 13,\n};\n\nenum alarmtimer_restart {\n\tALARMTIMER_NORESTART = 0,\n\tALARMTIMER_RESTART = 1,\n};\n\nenum alarmtimer_type {\n\tALARM_REALTIME = 0,\n\tALARM_BOOTTIME = 1,\n\tALARM_NUMTYPE = 2,\n\tALARM_REALTIME_FREEZER = 3,\n\tALARM_BOOTTIME_FREEZER = 4,\n};\n\nenum align_flags {\n\tALIGN_VA_32 = 1,\n\tALIGN_VA_64 = 2,\n};\n\nenum alloc_loc {\n\tALLOC_ERR = 0,\n\tALLOC_BEFORE = 1,\n\tALLOC_MID = 2,\n\tALLOC_AFTER = 3,\n};\n\nenum amd_chipset_gen {\n\tNOT_AMD_CHIPSET = 0,\n\tAMD_CHIPSET_SB600 = 1,\n\tAMD_CHIPSET_SB700 = 2,\n\tAMD_CHIPSET_SB800 = 3,\n\tAMD_CHIPSET_HUDSON2 = 4,\n\tAMD_CHIPSET_BOLTON = 5,\n\tAMD_CHIPSET_YANGTZE = 6,\n\tAMD_CHIPSET_TAISHAN = 7,\n\tAMD_CHIPSET_UNKNOWN = 8,\n};\n\nenum amd_functions {\n\tIMX_F0_GPIO0 = 0,\n\tIMX_F1_GPIO0 = 1,\n\tIMX_F2_GPIO0 = 2,\n\tIMX_F3_GPIO0 = 3,\n\tIMX_F0_GPIO1 = 4,\n\tIMX_F1_GPIO1 = 5,\n\tIMX_F2_GPIO1 = 6,\n\tIMX_F3_GPIO1 = 7,\n\tIMX_F0_GPIO2 = 8,\n\tIMX_F1_GPIO2 = 9,\n\tIMX_F2_GPIO2 = 10,\n\tIMX_F3_GPIO2 = 11,\n\tIMX_F0_GPIO3 = 12,\n\tIMX_F1_GPIO3 = 13,\n\tIMX_F2_GPIO3 = 14,\n\tIMX_F3_GPIO3 = 15,\n\tIMX_F0_GPIO4 = 16,\n\tIMX_F1_GPIO4 = 17,\n\tIMX_F2_GPIO4 = 18,\n\tIMX_F3_GPIO4 = 19,\n\tIMX_F0_GPIO5 = 20,\n\tIMX_F1_GPIO5 = 21,\n\tIMX_F2_GPIO5 = 22,\n\tIMX_F3_GPIO5 = 23,\n\tIMX_F0_GPIO6 = 24,\n\tIMX_F1_GPIO6 = 25,\n\tIMX_F2_GPIO6 = 26,\n\tIMX_F3_GPIO6 = 27,\n\tIMX_F0_GPIO7 = 28,\n\tIMX_F1_GPIO7 = 29,\n\tIMX_F2_GPIO7 = 30,\n\tIMX_F3_GPIO7 = 31,\n\tIMX_F0_GPIO8 = 32,\n\tIMX_F1_GPIO8 = 33,\n\tIMX_F2_GPIO8 = 34,\n\tIMX_F3_GPIO8 = 35,\n\tIMX_F0_GPIO9 = 36,\n\tIMX_F1_GPIO9 = 37,\n\tIMX_F2_GPIO9 = 38,\n\tIMX_F3_GPIO9 = 39,\n\tIMX_F0_GPIO10 = 40,\n\tIMX_F1_GPIO10 = 41,\n\tIMX_F2_GPIO10 = 42,\n\tIMX_F3_GPIO10 = 43,\n\tIMX_F0_GPIO11 = 44,\n\tIMX_F1_GPIO11 = 45,\n\tIMX_F2_GPIO11 = 46,\n\tIMX_F3_GPIO11 = 47,\n\tIMX_F0_GPIO12 = 48,\n\tIMX_F1_GPIO12 = 49,\n\tIMX_F2_GPIO12 = 50,\n\tIMX_F3_GPIO12 = 51,\n\tIMX_F0_GPIO13 = 52,\n\tIMX_F1_GPIO13 = 53,\n\tIMX_F2_GPIO13 = 54,\n\tIMX_F3_GPIO13 = 55,\n\tIMX_F0_GPIO14 = 56,\n\tIMX_F1_GPIO14 = 57,\n\tIMX_F2_GPIO14 = 58,\n\tIMX_F3_GPIO14 = 59,\n\tIMX_F0_GPIO15 = 60,\n\tIMX_F1_GPIO15 = 61,\n\tIMX_F2_GPIO15 = 62,\n\tIMX_F3_GPIO15 = 63,\n\tIMX_F0_GPIO16 = 64,\n\tIMX_F1_GPIO16 = 65,\n\tIMX_F2_GPIO16 = 66,\n\tIMX_F3_GPIO16 = 67,\n\tIMX_F0_GPIO17 = 68,\n\tIMX_F1_GPIO17 = 69,\n\tIMX_F2_GPIO17 = 70,\n\tIMX_F3_GPIO17 = 71,\n\tIMX_F0_GPIO18 = 72,\n\tIMX_F1_GPIO18 = 73,\n\tIMX_F2_GPIO18 = 74,\n\tIMX_F3_GPIO18 = 75,\n\tIMX_F0_GPIO19 = 76,\n\tIMX_F1_GPIO19 = 77,\n\tIMX_F2_GPIO19 = 78,\n\tIMX_F3_GPIO19 = 79,\n\tIMX_F0_GPIO20 = 80,\n\tIMX_F1_GPIO20 = 81,\n\tIMX_F2_GPIO20 = 82,\n\tIMX_F3_GPIO20 = 83,\n\tIMX_F0_GPIO21 = 84,\n\tIMX_F1_GPIO21 = 85,\n\tIMX_F2_GPIO21 = 86,\n\tIMX_F3_GPIO21 = 87,\n\tIMX_F0_GPIO22 = 88,\n\tIMX_F1_GPIO22 = 89,\n\tIMX_F2_GPIO22 = 90,\n\tIMX_F3_GPIO22 = 91,\n\tIMX_F0_GPIO23 = 92,\n\tIMX_F1_GPIO23 = 93,\n\tIMX_F2_GPIO23 = 94,\n\tIMX_F3_GPIO23 = 95,\n\tIMX_F0_GPIO24 = 96,\n\tIMX_F1_GPIO24 = 97,\n\tIMX_F2_GPIO24 = 98,\n\tIMX_F3_GPIO24 = 99,\n\tIMX_F0_GPIO25 = 100,\n\tIMX_F1_GPIO25 = 101,\n\tIMX_F2_GPIO25 = 102,\n\tIMX_F3_GPIO25 = 103,\n\tIMX_F0_GPIO26 = 104,\n\tIMX_F1_GPIO26 = 105,\n\tIMX_F2_GPIO26 = 106,\n\tIMX_F3_GPIO26 = 107,\n\tIMX_F0_GPIO27 = 108,\n\tIMX_F1_GPIO27 = 109,\n\tIMX_F2_GPIO27 = 110,\n\tIMX_F3_GPIO27 = 111,\n\tIMX_F0_GPIO28 = 112,\n\tIMX_F1_GPIO28 = 113,\n\tIMX_F2_GPIO28 = 114,\n\tIMX_F3_GPIO28 = 115,\n\tIMX_F0_GPIO29 = 116,\n\tIMX_F1_GPIO29 = 117,\n\tIMX_F2_GPIO29 = 118,\n\tIMX_F3_GPIO29 = 119,\n\tIMX_F0_GPIO30 = 120,\n\tIMX_F1_GPIO30 = 121,\n\tIMX_F2_GPIO30 = 122,\n\tIMX_F3_GPIO30 = 123,\n\tIMX_F0_GPIO31 = 124,\n\tIMX_F1_GPIO31 = 125,\n\tIMX_F2_GPIO31 = 126,\n\tIMX_F3_GPIO31 = 127,\n\tIMX_F0_GPIO32 = 128,\n\tIMX_F1_GPIO32 = 129,\n\tIMX_F2_GPIO32 = 130,\n\tIMX_F3_GPIO32 = 131,\n\tIMX_F0_GPIO33 = 132,\n\tIMX_F1_GPIO33 = 133,\n\tIMX_F2_GPIO33 = 134,\n\tIMX_F3_GPIO33 = 135,\n\tIMX_F0_GPIO34 = 136,\n\tIMX_F1_GPIO34 = 137,\n\tIMX_F2_GPIO34 = 138,\n\tIMX_F3_GPIO34 = 139,\n\tIMX_F0_GPIO35 = 140,\n\tIMX_F1_GPIO35 = 141,\n\tIMX_F2_GPIO35 = 142,\n\tIMX_F3_GPIO35 = 143,\n\tIMX_F0_GPIO36 = 144,\n\tIMX_F1_GPIO36 = 145,\n\tIMX_F2_GPIO36 = 146,\n\tIMX_F3_GPIO36 = 147,\n\tIMX_F0_GPIO37 = 148,\n\tIMX_F1_GPIO37 = 149,\n\tIMX_F2_GPIO37 = 150,\n\tIMX_F3_GPIO37 = 151,\n\tIMX_F0_GPIO38 = 152,\n\tIMX_F1_GPIO38 = 153,\n\tIMX_F2_GPIO38 = 154,\n\tIMX_F3_GPIO38 = 155,\n\tIMX_F0_GPIO39 = 156,\n\tIMX_F1_GPIO39 = 157,\n\tIMX_F2_GPIO39 = 158,\n\tIMX_F3_GPIO39 = 159,\n\tIMX_F0_GPIO40 = 160,\n\tIMX_F1_GPIO40 = 161,\n\tIMX_F2_GPIO40 = 162,\n\tIMX_F3_GPIO40 = 163,\n\tIMX_F0_GPIO41 = 164,\n\tIMX_F1_GPIO41 = 165,\n\tIMX_F2_GPIO41 = 166,\n\tIMX_F3_GPIO41 = 167,\n\tIMX_F0_GPIO42 = 168,\n\tIMX_F1_GPIO42 = 169,\n\tIMX_F2_GPIO42 = 170,\n\tIMX_F3_GPIO42 = 171,\n\tIMX_F0_GPIO43 = 172,\n\tIMX_F1_GPIO43 = 173,\n\tIMX_F2_GPIO43 = 174,\n\tIMX_F3_GPIO43 = 175,\n\tIMX_F0_GPIO44 = 176,\n\tIMX_F1_GPIO44 = 177,\n\tIMX_F2_GPIO44 = 178,\n\tIMX_F3_GPIO44 = 179,\n\tIMX_F0_GPIO45 = 180,\n\tIMX_F1_GPIO45 = 181,\n\tIMX_F2_GPIO45 = 182,\n\tIMX_F3_GPIO45 = 183,\n\tIMX_F0_GPIO46 = 184,\n\tIMX_F1_GPIO46 = 185,\n\tIMX_F2_GPIO46 = 186,\n\tIMX_F3_GPIO46 = 187,\n\tIMX_F0_GPIO47 = 188,\n\tIMX_F1_GPIO47 = 189,\n\tIMX_F2_GPIO47 = 190,\n\tIMX_F3_GPIO47 = 191,\n\tIMX_F0_GPIO48 = 192,\n\tIMX_F1_GPIO48 = 193,\n\tIMX_F2_GPIO48 = 194,\n\tIMX_F3_GPIO48 = 195,\n\tIMX_F0_GPIO49 = 196,\n\tIMX_F1_GPIO49 = 197,\n\tIMX_F2_GPIO49 = 198,\n\tIMX_F3_GPIO49 = 199,\n\tIMX_F0_GPIO50 = 200,\n\tIMX_F1_GPIO50 = 201,\n\tIMX_F2_GPIO50 = 202,\n\tIMX_F3_GPIO50 = 203,\n\tIMX_F0_GPIO51 = 204,\n\tIMX_F1_GPIO51 = 205,\n\tIMX_F2_GPIO51 = 206,\n\tIMX_F3_GPIO51 = 207,\n\tIMX_F0_GPIO52 = 208,\n\tIMX_F1_GPIO52 = 209,\n\tIMX_F2_GPIO52 = 210,\n\tIMX_F3_GPIO52 = 211,\n\tIMX_F0_GPIO53 = 212,\n\tIMX_F1_GPIO53 = 213,\n\tIMX_F2_GPIO53 = 214,\n\tIMX_F3_GPIO53 = 215,\n\tIMX_F0_GPIO54 = 216,\n\tIMX_F1_GPIO54 = 217,\n\tIMX_F2_GPIO54 = 218,\n\tIMX_F3_GPIO54 = 219,\n\tIMX_F0_GPIO55 = 220,\n\tIMX_F1_GPIO55 = 221,\n\tIMX_F2_GPIO55 = 222,\n\tIMX_F3_GPIO55 = 223,\n\tIMX_F0_GPIO56 = 224,\n\tIMX_F1_GPIO56 = 225,\n\tIMX_F2_GPIO56 = 226,\n\tIMX_F3_GPIO56 = 227,\n\tIMX_F0_GPIO57 = 228,\n\tIMX_F1_GPIO57 = 229,\n\tIMX_F2_GPIO57 = 230,\n\tIMX_F3_GPIO57 = 231,\n\tIMX_F0_GPIO58 = 232,\n\tIMX_F1_GPIO58 = 233,\n\tIMX_F2_GPIO58 = 234,\n\tIMX_F3_GPIO58 = 235,\n\tIMX_F0_GPIO59 = 236,\n\tIMX_F1_GPIO59 = 237,\n\tIMX_F2_GPIO59 = 238,\n\tIMX_F3_GPIO59 = 239,\n\tIMX_F0_GPIO60 = 240,\n\tIMX_F1_GPIO60 = 241,\n\tIMX_F2_GPIO60 = 242,\n\tIMX_F3_GPIO60 = 243,\n\tIMX_F0_GPIO61 = 244,\n\tIMX_F1_GPIO61 = 245,\n\tIMX_F2_GPIO61 = 246,\n\tIMX_F3_GPIO61 = 247,\n\tIMX_F0_GPIO62 = 248,\n\tIMX_F1_GPIO62 = 249,\n\tIMX_F2_GPIO62 = 250,\n\tIMX_F3_GPIO62 = 251,\n\tIMX_F0_GPIO64 = 252,\n\tIMX_F1_GPIO64 = 253,\n\tIMX_F2_GPIO64 = 254,\n\tIMX_F3_GPIO64 = 255,\n\tIMX_F0_GPIO65 = 256,\n\tIMX_F1_GPIO65 = 257,\n\tIMX_F2_GPIO65 = 258,\n\tIMX_F3_GPIO65 = 259,\n\tIMX_F0_GPIO66 = 260,\n\tIMX_F1_GPIO66 = 261,\n\tIMX_F2_GPIO66 = 262,\n\tIMX_F3_GPIO66 = 263,\n\tIMX_F0_GPIO67 = 264,\n\tIMX_F1_GPIO67 = 265,\n\tIMX_F2_GPIO67 = 266,\n\tIMX_F3_GPIO67 = 267,\n\tIMX_F0_GPIO68 = 268,\n\tIMX_F1_GPIO68 = 269,\n\tIMX_F2_GPIO68 = 270,\n\tIMX_F3_GPIO68 = 271,\n\tIMX_F0_GPIO69 = 272,\n\tIMX_F1_GPIO69 = 273,\n\tIMX_F2_GPIO69 = 274,\n\tIMX_F3_GPIO69 = 275,\n\tIMX_F0_GPIO70 = 276,\n\tIMX_F1_GPIO70 = 277,\n\tIMX_F2_GPIO70 = 278,\n\tIMX_F3_GPIO70 = 279,\n\tIMX_F0_GPIO71 = 280,\n\tIMX_F1_GPIO71 = 281,\n\tIMX_F2_GPIO71 = 282,\n\tIMX_F3_GPIO71 = 283,\n\tIMX_F0_GPIO72 = 284,\n\tIMX_F1_GPIO72 = 285,\n\tIMX_F2_GPIO72 = 286,\n\tIMX_F3_GPIO72 = 287,\n\tIMX_F0_GPIO73 = 288,\n\tIMX_F1_GPIO73 = 289,\n\tIMX_F2_GPIO73 = 290,\n\tIMX_F3_GPIO73 = 291,\n\tIMX_F0_GPIO74 = 292,\n\tIMX_F1_GPIO74 = 293,\n\tIMX_F2_GPIO74 = 294,\n\tIMX_F3_GPIO74 = 295,\n\tIMX_F0_GPIO75 = 296,\n\tIMX_F1_GPIO75 = 297,\n\tIMX_F2_GPIO75 = 298,\n\tIMX_F3_GPIO75 = 299,\n\tIMX_F0_GPIO76 = 300,\n\tIMX_F1_GPIO76 = 301,\n\tIMX_F2_GPIO76 = 302,\n\tIMX_F3_GPIO76 = 303,\n\tIMX_F0_GPIO77 = 304,\n\tIMX_F1_GPIO77 = 305,\n\tIMX_F2_GPIO77 = 306,\n\tIMX_F3_GPIO77 = 307,\n\tIMX_F0_GPIO78 = 308,\n\tIMX_F1_GPIO78 = 309,\n\tIMX_F2_GPIO78 = 310,\n\tIMX_F3_GPIO78 = 311,\n\tIMX_F0_GPIO79 = 312,\n\tIMX_F1_GPIO79 = 313,\n\tIMX_F2_GPIO79 = 314,\n\tIMX_F3_GPIO79 = 315,\n\tIMX_F0_GPIO80 = 316,\n\tIMX_F1_GPIO80 = 317,\n\tIMX_F2_GPIO80 = 318,\n\tIMX_F3_GPIO80 = 319,\n\tIMX_F0_GPIO81 = 320,\n\tIMX_F1_GPIO81 = 321,\n\tIMX_F2_GPIO81 = 322,\n\tIMX_F3_GPIO81 = 323,\n\tIMX_F0_GPIO82 = 324,\n\tIMX_F1_GPIO82 = 325,\n\tIMX_F2_GPIO82 = 326,\n\tIMX_F3_GPIO82 = 327,\n\tIMX_F0_GPIO83 = 328,\n\tIMX_F1_GPIO83 = 329,\n\tIMX_F2_GPIO83 = 330,\n\tIMX_F3_GPIO83 = 331,\n\tIMX_F0_GPIO84 = 332,\n\tIMX_F1_GPIO84 = 333,\n\tIMX_F2_GPIO84 = 334,\n\tIMX_F3_GPIO84 = 335,\n\tIMX_F0_GPIO85 = 336,\n\tIMX_F1_GPIO85 = 337,\n\tIMX_F2_GPIO85 = 338,\n\tIMX_F3_GPIO85 = 339,\n\tIMX_F0_GPIO86 = 340,\n\tIMX_F1_GPIO86 = 341,\n\tIMX_F2_GPIO86 = 342,\n\tIMX_F3_GPIO86 = 343,\n\tIMX_F0_GPIO87 = 344,\n\tIMX_F1_GPIO87 = 345,\n\tIMX_F2_GPIO87 = 346,\n\tIMX_F3_GPIO87 = 347,\n\tIMX_F0_GPIO88 = 348,\n\tIMX_F1_GPIO88 = 349,\n\tIMX_F2_GPIO88 = 350,\n\tIMX_F3_GPIO88 = 351,\n\tIMX_F0_GPIO89 = 352,\n\tIMX_F1_GPIO89 = 353,\n\tIMX_F2_GPIO89 = 354,\n\tIMX_F3_GPIO89 = 355,\n\tIMX_F0_GPIO90 = 356,\n\tIMX_F1_GPIO90 = 357,\n\tIMX_F2_GPIO90 = 358,\n\tIMX_F3_GPIO90 = 359,\n\tIMX_F0_GPIO91 = 360,\n\tIMX_F1_GPIO91 = 361,\n\tIMX_F2_GPIO91 = 362,\n\tIMX_F3_GPIO91 = 363,\n\tIMX_F0_GPIO92 = 364,\n\tIMX_F1_GPIO92 = 365,\n\tIMX_F2_GPIO92 = 366,\n\tIMX_F3_GPIO92 = 367,\n\tIMX_F0_GPIO93 = 368,\n\tIMX_F1_GPIO93 = 369,\n\tIMX_F2_GPIO93 = 370,\n\tIMX_F3_GPIO93 = 371,\n\tIMX_F0_GPIO94 = 372,\n\tIMX_F1_GPIO94 = 373,\n\tIMX_F2_GPIO94 = 374,\n\tIMX_F3_GPIO94 = 375,\n\tIMX_F0_GPIO95 = 376,\n\tIMX_F1_GPIO95 = 377,\n\tIMX_F2_GPIO95 = 378,\n\tIMX_F3_GPIO95 = 379,\n\tIMX_F0_GPIO96 = 380,\n\tIMX_F1_GPIO96 = 381,\n\tIMX_F2_GPIO96 = 382,\n\tIMX_F3_GPIO96 = 383,\n\tIMX_F0_GPIO97 = 384,\n\tIMX_F1_GPIO97 = 385,\n\tIMX_F2_GPIO97 = 386,\n\tIMX_F3_GPIO97 = 387,\n\tIMX_F0_GPIO98 = 388,\n\tIMX_F1_GPIO98 = 389,\n\tIMX_F2_GPIO98 = 390,\n\tIMX_F3_GPIO98 = 391,\n\tIMX_F0_GPIO99 = 392,\n\tIMX_F1_GPIO99 = 393,\n\tIMX_F2_GPIO99 = 394,\n\tIMX_F3_GPIO99 = 395,\n\tIMX_F0_GPIO100 = 396,\n\tIMX_F1_GPIO100 = 397,\n\tIMX_F2_GPIO100 = 398,\n\tIMX_F3_GPIO100 = 399,\n\tIMX_F0_GPIO101 = 400,\n\tIMX_F1_GPIO101 = 401,\n\tIMX_F2_GPIO101 = 402,\n\tIMX_F3_GPIO101 = 403,\n\tIMX_F0_GPIO102 = 404,\n\tIMX_F1_GPIO102 = 405,\n\tIMX_F2_GPIO102 = 406,\n\tIMX_F3_GPIO102 = 407,\n\tIMX_F0_GPIO103 = 408,\n\tIMX_F1_GPIO103 = 409,\n\tIMX_F2_GPIO103 = 410,\n\tIMX_F3_GPIO103 = 411,\n\tIMX_F0_GPIO104 = 412,\n\tIMX_F1_GPIO104 = 413,\n\tIMX_F2_GPIO104 = 414,\n\tIMX_F3_GPIO104 = 415,\n\tIMX_F0_GPIO105 = 416,\n\tIMX_F1_GPIO105 = 417,\n\tIMX_F2_GPIO105 = 418,\n\tIMX_F3_GPIO105 = 419,\n\tIMX_F0_GPIO106 = 420,\n\tIMX_F1_GPIO106 = 421,\n\tIMX_F2_GPIO106 = 422,\n\tIMX_F3_GPIO106 = 423,\n\tIMX_F0_GPIO107 = 424,\n\tIMX_F1_GPIO107 = 425,\n\tIMX_F2_GPIO107 = 426,\n\tIMX_F3_GPIO107 = 427,\n\tIMX_F0_GPIO108 = 428,\n\tIMX_F1_GPIO108 = 429,\n\tIMX_F2_GPIO108 = 430,\n\tIMX_F3_GPIO108 = 431,\n\tIMX_F0_GPIO109 = 432,\n\tIMX_F1_GPIO109 = 433,\n\tIMX_F2_GPIO109 = 434,\n\tIMX_F3_GPIO109 = 435,\n\tIMX_F0_GPIO110 = 436,\n\tIMX_F1_GPIO110 = 437,\n\tIMX_F2_GPIO110 = 438,\n\tIMX_F3_GPIO110 = 439,\n\tIMX_F0_GPIO111 = 440,\n\tIMX_F1_GPIO111 = 441,\n\tIMX_F2_GPIO111 = 442,\n\tIMX_F3_GPIO111 = 443,\n\tIMX_F0_GPIO112 = 444,\n\tIMX_F1_GPIO112 = 445,\n\tIMX_F2_GPIO112 = 446,\n\tIMX_F3_GPIO112 = 447,\n\tIMX_F0_GPIO113 = 448,\n\tIMX_F1_GPIO113 = 449,\n\tIMX_F2_GPIO113 = 450,\n\tIMX_F3_GPIO113 = 451,\n\tIMX_F0_GPIO114 = 452,\n\tIMX_F1_GPIO114 = 453,\n\tIMX_F2_GPIO114 = 454,\n\tIMX_F3_GPIO114 = 455,\n\tIMX_F0_GPIO115 = 456,\n\tIMX_F1_GPIO115 = 457,\n\tIMX_F2_GPIO115 = 458,\n\tIMX_F3_GPIO115 = 459,\n\tIMX_F0_GPIO116 = 460,\n\tIMX_F1_GPIO116 = 461,\n\tIMX_F2_GPIO116 = 462,\n\tIMX_F3_GPIO116 = 463,\n\tIMX_F0_GPIO117 = 464,\n\tIMX_F1_GPIO117 = 465,\n\tIMX_F2_GPIO117 = 466,\n\tIMX_F3_GPIO117 = 467,\n\tIMX_F0_GPIO118 = 468,\n\tIMX_F1_GPIO118 = 469,\n\tIMX_F2_GPIO118 = 470,\n\tIMX_F3_GPIO118 = 471,\n\tIMX_F0_GPIO119 = 472,\n\tIMX_F1_GPIO119 = 473,\n\tIMX_F2_GPIO119 = 474,\n\tIMX_F3_GPIO119 = 475,\n\tIMX_F0_GPIO120 = 476,\n\tIMX_F1_GPIO120 = 477,\n\tIMX_F2_GPIO120 = 478,\n\tIMX_F3_GPIO120 = 479,\n\tIMX_F0_GPIO121 = 480,\n\tIMX_F1_GPIO121 = 481,\n\tIMX_F2_GPIO121 = 482,\n\tIMX_F3_GPIO121 = 483,\n\tIMX_F0_GPIO122 = 484,\n\tIMX_F1_GPIO122 = 485,\n\tIMX_F2_GPIO122 = 486,\n\tIMX_F3_GPIO122 = 487,\n\tIMX_F0_GPIO123 = 488,\n\tIMX_F1_GPIO123 = 489,\n\tIMX_F2_GPIO123 = 490,\n\tIMX_F3_GPIO123 = 491,\n\tIMX_F0_GPIO124 = 492,\n\tIMX_F1_GPIO124 = 493,\n\tIMX_F2_GPIO124 = 494,\n\tIMX_F3_GPIO124 = 495,\n\tIMX_F0_GPIO125 = 496,\n\tIMX_F1_GPIO125 = 497,\n\tIMX_F2_GPIO125 = 498,\n\tIMX_F3_GPIO125 = 499,\n\tIMX_F0_GPIO126 = 500,\n\tIMX_F1_GPIO126 = 501,\n\tIMX_F2_GPIO126 = 502,\n\tIMX_F3_GPIO126 = 503,\n\tIMX_F0_GPIO127 = 504,\n\tIMX_F1_GPIO127 = 505,\n\tIMX_F2_GPIO127 = 506,\n\tIMX_F3_GPIO127 = 507,\n\tIMX_F0_GPIO128 = 508,\n\tIMX_F1_GPIO128 = 509,\n\tIMX_F2_GPIO128 = 510,\n\tIMX_F3_GPIO128 = 511,\n\tIMX_F0_GPIO129 = 512,\n\tIMX_F1_GPIO129 = 513,\n\tIMX_F2_GPIO129 = 514,\n\tIMX_F3_GPIO129 = 515,\n\tIMX_F0_GPIO130 = 516,\n\tIMX_F1_GPIO130 = 517,\n\tIMX_F2_GPIO130 = 518,\n\tIMX_F3_GPIO130 = 519,\n\tIMX_F0_GPIO131 = 520,\n\tIMX_F1_GPIO131 = 521,\n\tIMX_F2_GPIO131 = 522,\n\tIMX_F3_GPIO131 = 523,\n\tIMX_F0_GPIO132 = 524,\n\tIMX_F1_GPIO132 = 525,\n\tIMX_F2_GPIO132 = 526,\n\tIMX_F3_GPIO132 = 527,\n\tIMX_F0_GPIO133 = 528,\n\tIMX_F1_GPIO133 = 529,\n\tIMX_F2_GPIO133 = 530,\n\tIMX_F3_GPIO133 = 531,\n\tIMX_F0_GPIO134 = 532,\n\tIMX_F1_GPIO134 = 533,\n\tIMX_F2_GPIO134 = 534,\n\tIMX_F3_GPIO134 = 535,\n\tIMX_F0_GPIO135 = 536,\n\tIMX_F1_GPIO135 = 537,\n\tIMX_F2_GPIO135 = 538,\n\tIMX_F3_GPIO135 = 539,\n\tIMX_F0_GPIO136 = 540,\n\tIMX_F1_GPIO136 = 541,\n\tIMX_F2_GPIO136 = 542,\n\tIMX_F3_GPIO136 = 543,\n\tIMX_F0_GPIO137 = 544,\n\tIMX_F1_GPIO137 = 545,\n\tIMX_F2_GPIO137 = 546,\n\tIMX_F3_GPIO137 = 547,\n\tIMX_F0_GPIO138 = 548,\n\tIMX_F1_GPIO138 = 549,\n\tIMX_F2_GPIO138 = 550,\n\tIMX_F3_GPIO138 = 551,\n\tIMX_F0_GPIO139 = 552,\n\tIMX_F1_GPIO139 = 553,\n\tIMX_F2_GPIO139 = 554,\n\tIMX_F3_GPIO139 = 555,\n\tIMX_F0_GPIO140 = 556,\n\tIMX_F1_GPIO140 = 557,\n\tIMX_F2_GPIO140 = 558,\n\tIMX_F3_GPIO140 = 559,\n\tIMX_F0_GPIO141 = 560,\n\tIMX_F1_GPIO141 = 561,\n\tIMX_F2_GPIO141 = 562,\n\tIMX_F3_GPIO141 = 563,\n\tIMX_F0_GPIO142 = 564,\n\tIMX_F1_GPIO142 = 565,\n\tIMX_F2_GPIO142 = 566,\n\tIMX_F3_GPIO142 = 567,\n\tIMX_F0_GPIO143 = 568,\n\tIMX_F1_GPIO143 = 569,\n\tIMX_F2_GPIO143 = 570,\n\tIMX_F3_GPIO143 = 571,\n\tIMX_F0_GPIO144 = 572,\n\tIMX_F1_GPIO144 = 573,\n\tIMX_F2_GPIO144 = 574,\n\tIMX_F3_GPIO144 = 575,\n};\n\nenum amd_iommu_intr_mode_type {\n\tAMD_IOMMU_GUEST_IR_LEGACY = 0,\n\tAMD_IOMMU_GUEST_IR_LEGACY_GA = 1,\n\tAMD_IOMMU_GUEST_IR_VAPIC = 2,\n};\n\nenum amd_pstate_mode {\n\tAMD_PSTATE_UNDEFINED = 0,\n\tAMD_PSTATE_DISABLE = 1,\n\tAMD_PSTATE_PASSIVE = 2,\n\tAMD_PSTATE_ACTIVE = 3,\n\tAMD_PSTATE_GUIDED = 4,\n\tAMD_PSTATE_MAX = 5,\n};\n\nenum aper_size_type {\n\tU8_APER_SIZE = 0,\n\tU16_APER_SIZE = 1,\n\tU32_APER_SIZE = 2,\n\tLVL2_APER_SIZE = 3,\n\tFIXED_APER_SIZE = 4,\n};\n\nenum apic_intr_mode_id {\n\tAPIC_PIC = 0,\n\tAPIC_VIRTUAL_WIRE = 1,\n\tAPIC_VIRTUAL_WIRE_NO_CONFIG = 2,\n\tAPIC_SYMMETRIC_IO = 3,\n\tAPIC_SYMMETRIC_IO_NO_ROUTING = 4,\n};\n\nenum apparmor_notif_type {\n\tAPPARMOR_NOTIF_RESP_PERM = 0,\n\tAPPARMOR_NOTIF_CANCEL = 1,\n\tAPPARMOR_NOTIF_INTERUPT = 2,\n\tAPPARMOR_NOTIF_ALIVE = 3,\n\tAPPARMOR_NOTIF_OP = 4,\n\tAPPARMOR_NOTIF_RESP_NAME = 5,\n};\n\nenum array_state {\n\tclear = 0,\n\tinactive = 1,\n\tsuspended = 2,\n\treadonly = 3,\n\tread_auto = 4,\n\tclean = 5,\n\tactive = 6,\n\twrite_pending = 7,\n\tactive_idle = 8,\n\tbroken = 9,\n\tbad_word = 10,\n};\n\nenum as3711_su2_fbprot {\n\tAS3711_SU2_LX_SD4 = 0,\n\tAS3711_SU2_GPIO2 = 1,\n\tAS3711_SU2_GPIO3 = 2,\n\tAS3711_SU2_GPIO4 = 3,\n};\n\nenum as3711_su2_feedback {\n\tAS3711_SU2_VOLTAGE = 0,\n\tAS3711_SU2_CURR1 = 1,\n\tAS3711_SU2_CURR2 = 2,\n\tAS3711_SU2_CURR3 = 3,\n\tAS3711_SU2_CURR_AUTO = 4,\n};\n\nenum asn1_class {\n\tASN1_UNIV = 0,\n\tASN1_APPL = 1,\n\tASN1_CONT = 2,\n\tASN1_PRIV = 3,\n};\n\nenum asn1_method {\n\tASN1_PRIM = 0,\n\tASN1_CONS = 1,\n};\n\nenum asn1_opcode {\n\tASN1_OP_MATCH = 0,\n\tASN1_OP_MATCH_OR_SKIP = 1,\n\tASN1_OP_MATCH_ACT = 2,\n\tASN1_OP_MATCH_ACT_OR_SKIP = 3,\n\tASN1_OP_MATCH_JUMP = 4,\n\tASN1_OP_MATCH_JUMP_OR_SKIP = 5,\n\tASN1_OP_MATCH_ANY = 8,\n\tASN1_OP_MATCH_ANY_OR_SKIP = 9,\n\tASN1_OP_MATCH_ANY_ACT = 10,\n\tASN1_OP_MATCH_ANY_ACT_OR_SKIP = 11,\n\tASN1_OP_COND_MATCH_OR_SKIP = 17,\n\tASN1_OP_COND_MATCH_ACT_OR_SKIP = 19,\n\tASN1_OP_COND_MATCH_JUMP_OR_SKIP = 21,\n\tASN1_OP_COND_MATCH_ANY = 24,\n\tASN1_OP_COND_MATCH_ANY_OR_SKIP = 25,\n\tASN1_OP_COND_MATCH_ANY_ACT = 26,\n\tASN1_OP_COND_MATCH_ANY_ACT_OR_SKIP = 27,\n\tASN1_OP_COND_FAIL = 28,\n\tASN1_OP_COMPLETE = 29,\n\tASN1_OP_ACT = 30,\n\tASN1_OP_MAYBE_ACT = 31,\n\tASN1_OP_END_SEQ = 32,\n\tASN1_OP_END_SET = 33,\n\tASN1_OP_END_SEQ_OF = 34,\n\tASN1_OP_END_SET_OF = 35,\n\tASN1_OP_END_SEQ_ACT = 36,\n\tASN1_OP_END_SET_ACT = 37,\n\tASN1_OP_END_SEQ_OF_ACT = 38,\n\tASN1_OP_END_SET_OF_ACT = 39,\n\tASN1_OP_RETURN = 40,\n\tASN1_OP__NR = 41,\n};\n\nenum asn1_tag {\n\tASN1_EOC = 0,\n\tASN1_BOOL = 1,\n\tASN1_INT = 2,\n\tASN1_BTS = 3,\n\tASN1_OTS = 4,\n\tASN1_NULL = 5,\n\tASN1_OID = 6,\n\tASN1_ODE = 7,\n\tASN1_EXT = 8,\n\tASN1_REAL = 9,\n\tASN1_ENUM = 10,\n\tASN1_EPDV = 11,\n\tASN1_UTF8STR = 12,\n\tASN1_RELOID = 13,\n\tASN1_SEQ = 16,\n\tASN1_SET = 17,\n\tASN1_NUMSTR = 18,\n\tASN1_PRNSTR = 19,\n\tASN1_TEXSTR = 20,\n\tASN1_VIDSTR = 21,\n\tASN1_IA5STR = 22,\n\tASN1_UNITIM = 23,\n\tASN1_GENTIM = 24,\n\tASN1_GRASTR = 25,\n\tASN1_VISSTR = 26,\n\tASN1_GENSTR = 27,\n\tASN1_UNISTR = 28,\n\tASN1_CHRSTR = 29,\n\tASN1_BMPSTR = 30,\n\tASN1_LONG_TAG = 31,\n};\n\nenum assoc_array_walk_status {\n\tassoc_array_walk_tree_empty = 0,\n\tassoc_array_walk_found_terminal_node = 1,\n\tassoc_array_walk_found_wrong_shortcut = 2,\n};\n\nenum asymmetric_payload_bits {\n\tasym_crypto = 0,\n\tasym_subtype = 1,\n\tasym_key_ids = 2,\n\tasym_auth = 3,\n};\n\nenum ata_completion_errors {\n\tAC_ERR_OK = 0,\n\tAC_ERR_DEV = 1,\n\tAC_ERR_HSM = 2,\n\tAC_ERR_TIMEOUT = 4,\n\tAC_ERR_MEDIA = 8,\n\tAC_ERR_ATA_BUS = 16,\n\tAC_ERR_HOST_BUS = 32,\n\tAC_ERR_SYSTEM = 64,\n\tAC_ERR_INVALID = 128,\n\tAC_ERR_OTHER = 256,\n\tAC_ERR_NODEV_HINT = 512,\n\tAC_ERR_NCQ = 1024,\n};\n\nenum ata_dev_iter_mode {\n\tATA_DITER_ENABLED = 0,\n\tATA_DITER_ENABLED_REVERSE = 1,\n\tATA_DITER_ALL = 2,\n\tATA_DITER_ALL_REVERSE = 3,\n};\n\nenum ata_link_iter_mode {\n\tATA_LITER_EDGE = 0,\n\tATA_LITER_HOST_FIRST = 1,\n\tATA_LITER_PMP_FIRST = 2,\n};\n\nenum ata_lpm_hints {\n\tATA_LPM_EMPTY = 1,\n\tATA_LPM_HIPM = 2,\n\tATA_LPM_WAKE_ONLY = 4,\n};\n\nenum ata_lpm_policy {\n\tATA_LPM_UNKNOWN = 0,\n\tATA_LPM_MAX_POWER = 1,\n\tATA_LPM_MED_POWER = 2,\n\tATA_LPM_MED_POWER_WITH_DIPM = 3,\n\tATA_LPM_MIN_POWER_WITH_PARTIAL = 4,\n\tATA_LPM_MIN_POWER = 5,\n};\n\nenum ata_prot_flags {\n\tATA_PROT_FLAG_PIO = 1,\n\tATA_PROT_FLAG_DMA = 2,\n\tATA_PROT_FLAG_NCQ = 4,\n\tATA_PROT_FLAG_ATAPI = 8,\n\tATA_PROT_UNKNOWN = 255,\n\tATA_PROT_NODATA = 0,\n\tATA_PROT_PIO = 1,\n\tATA_PROT_DMA = 2,\n\tATA_PROT_NCQ_NODATA = 4,\n\tATA_PROT_NCQ = 6,\n\tATAPI_PROT_NODATA = 8,\n\tATAPI_PROT_PIO = 9,\n\tATAPI_PROT_DMA = 10,\n};\n\nenum ata_xfer_mask {\n\tATA_MASK_PIO = 127,\n\tATA_MASK_MWDMA = 3968,\n\tATA_MASK_UDMA = 1044480,\n};\n\nenum audit_mode {\n\tAUDIT_NORMAL = 0,\n\tAUDIT_QUIET_DENIED = 1,\n\tAUDIT_QUIET = 2,\n\tAUDIT_NOQUIET = 3,\n\tAUDIT_ALL = 4,\n};\n\nenum audit_nfcfgop {\n\tAUDIT_XT_OP_REGISTER = 0,\n\tAUDIT_XT_OP_REPLACE = 1,\n\tAUDIT_XT_OP_UNREGISTER = 2,\n\tAUDIT_NFT_OP_TABLE_REGISTER = 3,\n\tAUDIT_NFT_OP_TABLE_UNREGISTER = 4,\n\tAUDIT_NFT_OP_CHAIN_REGISTER = 5,\n\tAUDIT_NFT_OP_CHAIN_UNREGISTER = 6,\n\tAUDIT_NFT_OP_RULE_REGISTER = 7,\n\tAUDIT_NFT_OP_RULE_UNREGISTER = 8,\n\tAUDIT_NFT_OP_SET_REGISTER = 9,\n\tAUDIT_NFT_OP_SET_UNREGISTER = 10,\n\tAUDIT_NFT_OP_SETELEM_REGISTER = 11,\n\tAUDIT_NFT_OP_SETELEM_UNREGISTER = 12,\n\tAUDIT_NFT_OP_GEN_REGISTER = 13,\n\tAUDIT_NFT_OP_OBJ_REGISTER = 14,\n\tAUDIT_NFT_OP_OBJ_UNREGISTER = 15,\n\tAUDIT_NFT_OP_OBJ_RESET = 16,\n\tAUDIT_NFT_OP_FLOWTABLE_REGISTER = 17,\n\tAUDIT_NFT_OP_FLOWTABLE_UNREGISTER = 18,\n\tAUDIT_NFT_OP_SETELEM_RESET = 19,\n\tAUDIT_NFT_OP_RULE_RESET = 20,\n\tAUDIT_NFT_OP_INVALID = 21,\n};\n\nenum audit_nlgrps {\n\tAUDIT_NLGRP_NONE = 0,\n\tAUDIT_NLGRP_READLOG = 1,\n\t__AUDIT_NLGRP_MAX = 2,\n};\n\nenum audit_ntp_type {\n\tAUDIT_NTP_OFFSET = 0,\n\tAUDIT_NTP_FREQ = 1,\n\tAUDIT_NTP_STATUS = 2,\n\tAUDIT_NTP_TAI = 3,\n\tAUDIT_NTP_TICK = 4,\n\tAUDIT_NTP_ADJUST = 5,\n\tAUDIT_NTP_NVALS = 6,\n};\n\nenum audit_state {\n\tAUDIT_STATE_DISABLED = 0,\n\tAUDIT_STATE_BUILD = 1,\n\tAUDIT_STATE_RECORD = 2,\n};\n\nenum audit_type {\n\tAUDIT_APPARMOR_AUDIT = 0,\n\tAUDIT_APPARMOR_ALLOWED = 1,\n\tAUDIT_APPARMOR_DENIED = 2,\n\tAUDIT_APPARMOR_HINT = 3,\n\tAUDIT_APPARMOR_STATUS = 4,\n\tAUDIT_APPARMOR_ERROR = 5,\n\tAUDIT_APPARMOR_KILL = 6,\n\tAUDIT_APPARMOR_USER = 7,\n\tAUDIT_APPARMOR_AUTO = 8,\n};\n\nenum auditsc_class_t {\n\tAUDITSC_NATIVE = 0,\n\tAUDITSC_COMPAT = 1,\n\tAUDITSC_OPEN = 2,\n\tAUDITSC_OPENAT = 3,\n\tAUDITSC_SOCKETCALL = 4,\n\tAUDITSC_EXECVE = 5,\n\tAUDITSC_OPENAT2 = 6,\n\tAUDITSC_NVALS = 7,\n};\n\nenum backlight_notification {\n\tBACKLIGHT_REGISTERED = 0,\n\tBACKLIGHT_UNREGISTERED = 1,\n};\n\nenum backlight_scale {\n\tBACKLIGHT_SCALE_UNKNOWN = 0,\n\tBACKLIGHT_SCALE_LINEAR = 1,\n\tBACKLIGHT_SCALE_NON_LINEAR = 2,\n};\n\nenum backlight_type {\n\tBACKLIGHT_RAW = 1,\n\tBACKLIGHT_PLATFORM = 2,\n\tBACKLIGHT_FIRMWARE = 3,\n\tBACKLIGHT_TYPE_MAX = 4,\n};\n\nenum backlight_update_reason {\n\tBACKLIGHT_UPDATE_HOTKEY = 0,\n\tBACKLIGHT_UPDATE_SYSFS = 1,\n};\n\nenum batadv_packettype {\n\tBATADV_IV_OGM = 0,\n\tBATADV_BCAST = 1,\n\tBATADV_CODED = 2,\n\tBATADV_ELP = 3,\n\tBATADV_OGM2 = 4,\n\tBATADV_MCAST = 5,\n\tBATADV_UNICAST = 64,\n\tBATADV_UNICAST_FRAG = 65,\n\tBATADV_UNICAST_4ADDR = 66,\n\tBATADV_ICMP = 67,\n\tBATADV_UNICAST_TVLV = 68,\n};\n\nenum behavior {\n\tEXCLUSIVE = 0,\n\tSHARED = 1,\n\tDROP = 2,\n};\n\nenum bh_state_bits {\n\tBH_Uptodate = 0,\n\tBH_Dirty = 1,\n\tBH_Lock = 2,\n\tBH_Req = 3,\n\tBH_Mapped = 4,\n\tBH_New = 5,\n\tBH_Async_Read = 6,\n\tBH_Async_Write = 7,\n\tBH_Delay = 8,\n\tBH_Boundary = 9,\n\tBH_Write_EIO = 10,\n\tBH_Unwritten = 11,\n\tBH_Quiet = 12,\n\tBH_Meta = 13,\n\tBH_Prio = 14,\n\tBH_Defer_Completion = 15,\n\tBH_PrivateStart = 16,\n};\n\nenum bhi_mitigations {\n\tBHI_MITIGATION_OFF = 0,\n\tBHI_MITIGATION_ON = 1,\n\tBHI_MITIGATION_VMEXIT_ONLY = 2,\n};\n\nenum bio_merge_status {\n\tBIO_MERGE_OK = 0,\n\tBIO_MERGE_NONE = 1,\n\tBIO_MERGE_FAILED = 2,\n};\n\nenum bio_post_read_step {\n\tSTEP_INITIAL = 0,\n\tSTEP_DECRYPT = 1,\n\tSTEP_VERITY = 2,\n\tSTEP_MAX = 3,\n};\n\nenum bios_platform_class {\n\tBIOS_CLIENT = 0,\n\tBIOS_SERVER = 1,\n};\n\nenum bip_flags {\n\tBIP_BLOCK_INTEGRITY = 1,\n\tBIP_MAPPED_INTEGRITY = 2,\n\tBIP_CTRL_NOCHECK = 4,\n\tBIP_DISK_NOCHECK = 8,\n\tBIP_IP_CHECKSUM = 16,\n\tBIP_COPY_USER = 32,\n};\n\nenum bitmap_page_attr {\n\tBITMAP_PAGE_DIRTY = 0,\n\tBITMAP_PAGE_PENDING = 1,\n\tBITMAP_PAGE_NEEDWRITE = 2,\n};\n\nenum bitmap_state {\n\tBITMAP_STALE = 1,\n\tBITMAP_WRITE_ERROR = 2,\n\tBITMAP_HOSTENDIAN = 15,\n};\n\nenum blacklist_hash_type {\n\tBLACKLIST_HASH_X509_TBS = 1,\n\tBLACKLIST_HASH_BINARY = 2,\n};\n\nenum blake2s_iv {\n\tBLAKE2S_IV0 = 1779033703,\n\tBLAKE2S_IV1 = 3144134277,\n\tBLAKE2S_IV2 = 1013904242,\n\tBLAKE2S_IV3 = 2773480762,\n\tBLAKE2S_IV4 = 1359893119,\n\tBLAKE2S_IV5 = 2600822924,\n\tBLAKE2S_IV6 = 528734635,\n\tBLAKE2S_IV7 = 1541459225,\n};\n\nenum blake2s_lengths {\n\tBLAKE2S_BLOCK_SIZE = 64,\n\tBLAKE2S_HASH_SIZE = 32,\n\tBLAKE2S_KEY_SIZE = 32,\n\tBLAKE2S_128_HASH_SIZE = 16,\n\tBLAKE2S_160_HASH_SIZE = 20,\n\tBLAKE2S_224_HASH_SIZE = 28,\n\tBLAKE2S_256_HASH_SIZE = 32,\n};\n\nenum blk_crypto_mode_num {\n\tBLK_ENCRYPTION_MODE_INVALID = 0,\n\tBLK_ENCRYPTION_MODE_AES_256_XTS = 1,\n\tBLK_ENCRYPTION_MODE_AES_128_CBC_ESSIV = 2,\n\tBLK_ENCRYPTION_MODE_ADIANTUM = 3,\n\tBLK_ENCRYPTION_MODE_SM4_XTS = 4,\n\tBLK_ENCRYPTION_MODE_MAX = 5,\n};\n\nenum blk_default_limits {\n\tBLK_MAX_SEGMENTS = 128,\n\tBLK_SAFE_MAX_SECTORS = 255,\n\tBLK_MAX_SEGMENT_SIZE = 65536,\n\tBLK_SEG_BOUNDARY_MASK = 4294967295,\n};\n\nenum blk_eh_timer_return {\n\tBLK_EH_DONE = 0,\n\tBLK_EH_RESET_TIMER = 1,\n};\n\nenum blk_integrity_checksum {\n\tBLK_INTEGRITY_CSUM_NONE = 0,\n\tBLK_INTEGRITY_CSUM_IP = 1,\n\tBLK_INTEGRITY_CSUM_CRC = 2,\n\tBLK_INTEGRITY_CSUM_CRC64 = 3,\n} __attribute__((mode(byte)));\n\nenum blk_integrity_flags {\n\tBLK_INTEGRITY_NOVERIFY = 1,\n\tBLK_INTEGRITY_NOGENERATE = 2,\n\tBLK_INTEGRITY_DEVICE_CAPABLE = 4,\n\tBLK_INTEGRITY_REF_TAG = 8,\n\tBLK_INTEGRITY_STACKED = 16,\n};\n\nenum blk_req_status {\n\tREQ_PROCESSING = 0,\n\tREQ_WAITING = 1,\n\tREQ_DONE = 2,\n\tREQ_ERROR = 3,\n\tREQ_EOPNOTSUPP = 4,\n};\n\nenum blk_unique_id {\n\tBLK_UID_T10 = 1,\n\tBLK_UID_EUI64 = 2,\n\tBLK_UID_NAA = 3,\n};\n\nenum blk_zone_cond {\n\tBLK_ZONE_COND_NOT_WP = 0,\n\tBLK_ZONE_COND_EMPTY = 1,\n\tBLK_ZONE_COND_IMP_OPEN = 2,\n\tBLK_ZONE_COND_EXP_OPEN = 3,\n\tBLK_ZONE_COND_CLOSED = 4,\n\tBLK_ZONE_COND_READONLY = 13,\n\tBLK_ZONE_COND_FULL = 14,\n\tBLK_ZONE_COND_OFFLINE = 15,\n};\n\nenum blk_zone_report_flags {\n\tBLK_ZONE_REP_CAPACITY = 1,\n};\n\nenum blk_zone_type {\n\tBLK_ZONE_TYPE_CONVENTIONAL = 1,\n\tBLK_ZONE_TYPE_SEQWRITE_REQ = 2,\n\tBLK_ZONE_TYPE_SEQWRITE_PREF = 3,\n};\n\nenum blkg_iostat_type {\n\tBLKG_IOSTAT_READ = 0,\n\tBLKG_IOSTAT_WRITE = 1,\n\tBLKG_IOSTAT_DISCARD = 2,\n\tBLKG_IOSTAT_NR = 3,\n};\n\nenum blkg_rwstat_type {\n\tBLKG_RWSTAT_READ = 0,\n\tBLKG_RWSTAT_WRITE = 1,\n\tBLKG_RWSTAT_SYNC = 2,\n\tBLKG_RWSTAT_ASYNC = 3,\n\tBLKG_RWSTAT_DISCARD = 4,\n\tBLKG_RWSTAT_NR = 5,\n\tBLKG_RWSTAT_TOTAL = 5,\n};\n\nenum blkif_state {\n\tBLKIF_STATE_DISCONNECTED = 0,\n\tBLKIF_STATE_CONNECTED = 1,\n\tBLKIF_STATE_SUSPENDED = 2,\n\tBLKIF_STATE_ERROR = 3,\n};\n\nenum blktrace_act {\n\t__BLK_TA_QUEUE = 1,\n\t__BLK_TA_BACKMERGE = 2,\n\t__BLK_TA_FRONTMERGE = 3,\n\t__BLK_TA_GETRQ = 4,\n\t__BLK_TA_SLEEPRQ = 5,\n\t__BLK_TA_REQUEUE = 6,\n\t__BLK_TA_ISSUE = 7,\n\t__BLK_TA_COMPLETE = 8,\n\t__BLK_TA_PLUG = 9,\n\t__BLK_TA_UNPLUG_IO = 10,\n\t__BLK_TA_UNPLUG_TIMER = 11,\n\t__BLK_TA_INSERT = 12,\n\t__BLK_TA_SPLIT = 13,\n\t__BLK_TA_BOUNCE = 14,\n\t__BLK_TA_REMAP = 15,\n\t__BLK_TA_ABORT = 16,\n\t__BLK_TA_DRV_DATA = 17,\n\t__BLK_TA_CGROUP = 256,\n};\n\nenum blktrace_cat {\n\tBLK_TC_READ = 1,\n\tBLK_TC_WRITE = 2,\n\tBLK_TC_FLUSH = 4,\n\tBLK_TC_SYNC = 8,\n\tBLK_TC_SYNCIO = 8,\n\tBLK_TC_QUEUE = 16,\n\tBLK_TC_REQUEUE = 32,\n\tBLK_TC_ISSUE = 64,\n\tBLK_TC_COMPLETE = 128,\n\tBLK_TC_FS = 256,\n\tBLK_TC_PC = 512,\n\tBLK_TC_NOTIFY = 1024,\n\tBLK_TC_AHEAD = 2048,\n\tBLK_TC_META = 4096,\n\tBLK_TC_DISCARD = 8192,\n\tBLK_TC_DRV_DATA = 16384,\n\tBLK_TC_FUA = 32768,\n\tBLK_TC_END = 32768,\n};\n\nenum blktrace_notify {\n\t__BLK_TN_PROCESS = 0,\n\t__BLK_TN_TIMESTAMP = 1,\n\t__BLK_TN_MESSAGE = 2,\n\t__BLK_TN_CGROUP = 256,\n};\n\nenum bp_state {\n\tBP_DONE = 0,\n\tBP_WAIT = 1,\n\tBP_EAGAIN = 2,\n\tBP_ECANCELED = 3,\n};\n\nenum bp_type_idx {\n\tTYPE_INST = 0,\n\tTYPE_DATA = 0,\n\tTYPE_MAX = 1,\n};\n\nenum bpf_access_src {\n\tACCESS_DIRECT = 1,\n\tACCESS_HELPER = 2,\n};\n\nenum bpf_access_type {\n\tBPF_READ = 1,\n\tBPF_WRITE = 2,\n};\n\nenum bpf_addr_space_cast {\n\tBPF_ADDR_SPACE_CAST = 1,\n};\n\nenum bpf_adj_room_mode {\n\tBPF_ADJ_ROOM_NET = 0,\n\tBPF_ADJ_ROOM_MAC = 1,\n};\n\nenum bpf_arg_type {\n\tARG_DONTCARE = 0,\n\tARG_CONST_MAP_PTR = 1,\n\tARG_PTR_TO_MAP_KEY = 2,\n\tARG_PTR_TO_MAP_VALUE = 3,\n\tARG_PTR_TO_MEM = 4,\n\tARG_PTR_TO_ARENA = 5,\n\tARG_CONST_SIZE = 6,\n\tARG_CONST_SIZE_OR_ZERO = 7,\n\tARG_PTR_TO_CTX = 8,\n\tARG_ANYTHING = 9,\n\tARG_PTR_TO_SPIN_LOCK = 10,\n\tARG_PTR_TO_SOCK_COMMON = 11,\n\tARG_PTR_TO_SOCKET = 12,\n\tARG_PTR_TO_BTF_ID = 13,\n\tARG_PTR_TO_RINGBUF_MEM = 14,\n\tARG_CONST_ALLOC_SIZE_OR_ZERO = 15,\n\tARG_PTR_TO_BTF_ID_SOCK_COMMON = 16,\n\tARG_PTR_TO_PERCPU_BTF_ID = 17,\n\tARG_PTR_TO_FUNC = 18,\n\tARG_PTR_TO_STACK = 19,\n\tARG_PTR_TO_CONST_STR = 20,\n\tARG_PTR_TO_TIMER = 21,\n\tARG_PTR_TO_KPTR = 22,\n\tARG_PTR_TO_DYNPTR = 23,\n\t__BPF_ARG_TYPE_MAX = 24,\n\tARG_PTR_TO_MAP_VALUE_OR_NULL = 259,\n\tARG_PTR_TO_MEM_OR_NULL = 260,\n\tARG_PTR_TO_CTX_OR_NULL = 264,\n\tARG_PTR_TO_SOCKET_OR_NULL = 268,\n\tARG_PTR_TO_STACK_OR_NULL = 275,\n\tARG_PTR_TO_BTF_ID_OR_NULL = 269,\n\tARG_PTR_TO_UNINIT_MEM = 67141636,\n\tARG_PTR_TO_FIXED_SIZE_MEM = 262148,\n\t__BPF_ARG_TYPE_LIMIT = 134217727,\n};\n\nenum bpf_async_type {\n\tBPF_ASYNC_TYPE_TIMER = 0,\n\tBPF_ASYNC_TYPE_WQ = 1,\n};\n\nenum bpf_attach_type {\n\tBPF_CGROUP_INET_INGRESS = 0,\n\tBPF_CGROUP_INET_EGRESS = 1,\n\tBPF_CGROUP_INET_SOCK_CREATE = 2,\n\tBPF_CGROUP_SOCK_OPS = 3,\n\tBPF_SK_SKB_STREAM_PARSER = 4,\n\tBPF_SK_SKB_STREAM_VERDICT = 5,\n\tBPF_CGROUP_DEVICE = 6,\n\tBPF_SK_MSG_VERDICT = 7,\n\tBPF_CGROUP_INET4_BIND = 8,\n\tBPF_CGROUP_INET6_BIND = 9,\n\tBPF_CGROUP_INET4_CONNECT = 10,\n\tBPF_CGROUP_INET6_CONNECT = 11,\n\tBPF_CGROUP_INET4_POST_BIND = 12,\n\tBPF_CGROUP_INET6_POST_BIND = 13,\n\tBPF_CGROUP_UDP4_SENDMSG = 14,\n\tBPF_CGROUP_UDP6_SENDMSG = 15,\n\tBPF_LIRC_MODE2 = 16,\n\tBPF_FLOW_DISSECTOR = 17,\n\tBPF_CGROUP_SYSCTL = 18,\n\tBPF_CGROUP_UDP4_RECVMSG = 19,\n\tBPF_CGROUP_UDP6_RECVMSG = 20,\n\tBPF_CGROUP_GETSOCKOPT = 21,\n\tBPF_CGROUP_SETSOCKOPT = 22,\n\tBPF_TRACE_RAW_TP = 23,\n\tBPF_TRACE_FENTRY = 24,\n\tBPF_TRACE_FEXIT = 25,\n\tBPF_MODIFY_RETURN = 26,\n\tBPF_LSM_MAC = 27,\n\tBPF_TRACE_ITER = 28,\n\tBPF_CGROUP_INET4_GETPEERNAME = 29,\n\tBPF_CGROUP_INET6_GETPEERNAME = 30,\n\tBPF_CGROUP_INET4_GETSOCKNAME = 31,\n\tBPF_CGROUP_INET6_GETSOCKNAME = 32,\n\tBPF_XDP_DEVMAP = 33,\n\tBPF_CGROUP_INET_SOCK_RELEASE = 34,\n\tBPF_XDP_CPUMAP = 35,\n\tBPF_SK_LOOKUP = 36,\n\tBPF_XDP = 37,\n\tBPF_SK_SKB_VERDICT = 38,\n\tBPF_SK_REUSEPORT_SELECT = 39,\n\tBPF_SK_REUSEPORT_SELECT_OR_MIGRATE = 40,\n\tBPF_PERF_EVENT = 41,\n\tBPF_TRACE_KPROBE_MULTI = 42,\n\tBPF_LSM_CGROUP = 43,\n\tBPF_STRUCT_OPS = 44,\n\tBPF_NETFILTER = 45,\n\tBPF_TCX_INGRESS = 46,\n\tBPF_TCX_EGRESS = 47,\n\tBPF_TRACE_UPROBE_MULTI = 48,\n\tBPF_CGROUP_UNIX_CONNECT = 49,\n\tBPF_CGROUP_UNIX_SENDMSG = 50,\n\tBPF_CGROUP_UNIX_RECVMSG = 51,\n\tBPF_CGROUP_UNIX_GETPEERNAME = 52,\n\tBPF_CGROUP_UNIX_GETSOCKNAME = 53,\n\tBPF_NETKIT_PRIMARY = 54,\n\tBPF_NETKIT_PEER = 55,\n\tBPF_TRACE_KPROBE_SESSION = 56,\n\t__MAX_BPF_ATTACH_TYPE = 57,\n};\n\nenum bpf_audit {\n\tBPF_AUDIT_LOAD = 0,\n\tBPF_AUDIT_UNLOAD = 1,\n\tBPF_AUDIT_MAX = 2,\n};\n\nenum bpf_cgroup_iter_order {\n\tBPF_CGROUP_ITER_ORDER_UNSPEC = 0,\n\tBPF_CGROUP_ITER_SELF_ONLY = 1,\n\tBPF_CGROUP_ITER_DESCENDANTS_PRE = 2,\n\tBPF_CGROUP_ITER_DESCENDANTS_POST = 3,\n\tBPF_CGROUP_ITER_ANCESTORS_UP = 4,\n};\n\nenum bpf_cgroup_storage_type {\n\tBPF_CGROUP_STORAGE_SHARED = 0,\n\tBPF_CGROUP_STORAGE_PERCPU = 1,\n\t__BPF_CGROUP_STORAGE_MAX = 2,\n};\n\nenum bpf_check_mtu_flags {\n\tBPF_MTU_CHK_SEGS = 1,\n};\n\nenum bpf_check_mtu_ret {\n\tBPF_MTU_CHK_RET_SUCCESS = 0,\n\tBPF_MTU_CHK_RET_FRAG_NEEDED = 1,\n\tBPF_MTU_CHK_RET_SEGS_TOOBIG = 2,\n};\n\nenum bpf_cmd {\n\tBPF_MAP_CREATE = 0,\n\tBPF_MAP_LOOKUP_ELEM = 1,\n\tBPF_MAP_UPDATE_ELEM = 2,\n\tBPF_MAP_DELETE_ELEM = 3,\n\tBPF_MAP_GET_NEXT_KEY = 4,\n\tBPF_PROG_LOAD = 5,\n\tBPF_OBJ_PIN = 6,\n\tBPF_OBJ_GET = 7,\n\tBPF_PROG_ATTACH = 8,\n\tBPF_PROG_DETACH = 9,\n\tBPF_PROG_TEST_RUN = 10,\n\tBPF_PROG_RUN = 10,\n\tBPF_PROG_GET_NEXT_ID = 11,\n\tBPF_MAP_GET_NEXT_ID = 12,\n\tBPF_PROG_GET_FD_BY_ID = 13,\n\tBPF_MAP_GET_FD_BY_ID = 14,\n\tBPF_OBJ_GET_INFO_BY_FD = 15,\n\tBPF_PROG_QUERY = 16,\n\tBPF_RAW_TRACEPOINT_OPEN = 17,\n\tBPF_BTF_LOAD = 18,\n\tBPF_BTF_GET_FD_BY_ID = 19,\n\tBPF_TASK_FD_QUERY = 20,\n\tBPF_MAP_LOOKUP_AND_DELETE_ELEM = 21,\n\tBPF_MAP_FREEZE = 22,\n\tBPF_BTF_GET_NEXT_ID = 23,\n\tBPF_MAP_LOOKUP_BATCH = 24,\n\tBPF_MAP_LOOKUP_AND_DELETE_BATCH = 25,\n\tBPF_MAP_UPDATE_BATCH = 26,\n\tBPF_MAP_DELETE_BATCH = 27,\n\tBPF_LINK_CREATE = 28,\n\tBPF_LINK_UPDATE = 29,\n\tBPF_LINK_GET_FD_BY_ID = 30,\n\tBPF_LINK_GET_NEXT_ID = 31,\n\tBPF_ENABLE_STATS = 32,\n\tBPF_ITER_CREATE = 33,\n\tBPF_LINK_DETACH = 34,\n\tBPF_PROG_BIND_MAP = 35,\n\tBPF_TOKEN_CREATE = 36,\n\t__MAX_BPF_CMD = 37,\n};\n\nenum bpf_cond_pseudo_jmp {\n\tBPF_MAY_GOTO = 0,\n};\n\nenum bpf_core_relo_kind {\n\tBPF_CORE_FIELD_BYTE_OFFSET = 0,\n\tBPF_CORE_FIELD_BYTE_SIZE = 1,\n\tBPF_CORE_FIELD_EXISTS = 2,\n\tBPF_CORE_FIELD_SIGNED = 3,\n\tBPF_CORE_FIELD_LSHIFT_U64 = 4,\n\tBPF_CORE_FIELD_RSHIFT_U64 = 5,\n\tBPF_CORE_TYPE_ID_LOCAL = 6,\n\tBPF_CORE_TYPE_ID_TARGET = 7,\n\tBPF_CORE_TYPE_EXISTS = 8,\n\tBPF_CORE_TYPE_SIZE = 9,\n\tBPF_CORE_ENUMVAL_EXISTS = 10,\n\tBPF_CORE_ENUMVAL_VALUE = 11,\n\tBPF_CORE_TYPE_MATCHES = 12,\n};\n\nenum bpf_dynptr_type {\n\tBPF_DYNPTR_TYPE_INVALID = 0,\n\tBPF_DYNPTR_TYPE_LOCAL = 1,\n\tBPF_DYNPTR_TYPE_RINGBUF = 2,\n\tBPF_DYNPTR_TYPE_SKB = 3,\n\tBPF_DYNPTR_TYPE_XDP = 4,\n};\n\nenum bpf_func_id {\n\tBPF_FUNC_unspec = 0,\n\tBPF_FUNC_map_lookup_elem = 1,\n\tBPF_FUNC_map_update_elem = 2,\n\tBPF_FUNC_map_delete_elem = 3,\n\tBPF_FUNC_probe_read = 4,\n\tBPF_FUNC_ktime_get_ns = 5,\n\tBPF_FUNC_trace_printk = 6,\n\tBPF_FUNC_get_prandom_u32 = 7,\n\tBPF_FUNC_get_smp_processor_id = 8,\n\tBPF_FUNC_skb_store_bytes = 9,\n\tBPF_FUNC_l3_csum_replace = 10,\n\tBPF_FUNC_l4_csum_replace = 11,\n\tBPF_FUNC_tail_call = 12,\n\tBPF_FUNC_clone_redirect = 13,\n\tBPF_FUNC_get_current_pid_tgid = 14,\n\tBPF_FUNC_get_current_uid_gid = 15,\n\tBPF_FUNC_get_current_comm = 16,\n\tBPF_FUNC_get_cgroup_classid = 17,\n\tBPF_FUNC_skb_vlan_push = 18,\n\tBPF_FUNC_skb_vlan_pop = 19,\n\tBPF_FUNC_skb_get_tunnel_key = 20,\n\tBPF_FUNC_skb_set_tunnel_key = 21,\n\tBPF_FUNC_perf_event_read = 22,\n\tBPF_FUNC_redirect = 23,\n\tBPF_FUNC_get_route_realm = 24,\n\tBPF_FUNC_perf_event_output = 25,\n\tBPF_FUNC_skb_load_bytes = 26,\n\tBPF_FUNC_get_stackid = 27,\n\tBPF_FUNC_csum_diff = 28,\n\tBPF_FUNC_skb_get_tunnel_opt = 29,\n\tBPF_FUNC_skb_set_tunnel_opt = 30,\n\tBPF_FUNC_skb_change_proto = 31,\n\tBPF_FUNC_skb_change_type = 32,\n\tBPF_FUNC_skb_under_cgroup = 33,\n\tBPF_FUNC_get_hash_recalc = 34,\n\tBPF_FUNC_get_current_task = 35,\n\tBPF_FUNC_probe_write_user = 36,\n\tBPF_FUNC_current_task_under_cgroup = 37,\n\tBPF_FUNC_skb_change_tail = 38,\n\tBPF_FUNC_skb_pull_data = 39,\n\tBPF_FUNC_csum_update = 40,\n\tBPF_FUNC_set_hash_invalid = 41,\n\tBPF_FUNC_get_numa_node_id = 42,\n\tBPF_FUNC_skb_change_head = 43,\n\tBPF_FUNC_xdp_adjust_head = 44,\n\tBPF_FUNC_probe_read_str = 45,\n\tBPF_FUNC_get_socket_cookie = 46,\n\tBPF_FUNC_get_socket_uid = 47,\n\tBPF_FUNC_set_hash = 48,\n\tBPF_FUNC_setsockopt = 49,\n\tBPF_FUNC_skb_adjust_room = 50,\n\tBPF_FUNC_redirect_map = 51,\n\tBPF_FUNC_sk_redirect_map = 52,\n\tBPF_FUNC_sock_map_update = 53,\n\tBPF_FUNC_xdp_adjust_meta = 54,\n\tBPF_FUNC_perf_event_read_value = 55,\n\tBPF_FUNC_perf_prog_read_value = 56,\n\tBPF_FUNC_getsockopt = 57,\n\tBPF_FUNC_override_return = 58,\n\tBPF_FUNC_sock_ops_cb_flags_set = 59,\n\tBPF_FUNC_msg_redirect_map = 60,\n\tBPF_FUNC_msg_apply_bytes = 61,\n\tBPF_FUNC_msg_cork_bytes = 62,\n\tBPF_FUNC_msg_pull_data = 63,\n\tBPF_FUNC_bind = 64,\n\tBPF_FUNC_xdp_adjust_tail = 65,\n\tBPF_FUNC_skb_get_xfrm_state = 66,\n\tBPF_FUNC_get_stack = 67,\n\tBPF_FUNC_skb_load_bytes_relative = 68,\n\tBPF_FUNC_fib_lookup = 69,\n\tBPF_FUNC_sock_hash_update = 70,\n\tBPF_FUNC_msg_redirect_hash = 71,\n\tBPF_FUNC_sk_redirect_hash = 72,\n\tBPF_FUNC_lwt_push_encap = 73,\n\tBPF_FUNC_lwt_seg6_store_bytes = 74,\n\tBPF_FUNC_lwt_seg6_adjust_srh = 75,\n\tBPF_FUNC_lwt_seg6_action = 76,\n\tBPF_FUNC_rc_repeat = 77,\n\tBPF_FUNC_rc_keydown = 78,\n\tBPF_FUNC_skb_cgroup_id = 79,\n\tBPF_FUNC_get_current_cgroup_id = 80,\n\tBPF_FUNC_get_local_storage = 81,\n\tBPF_FUNC_sk_select_reuseport = 82,\n\tBPF_FUNC_skb_ancestor_cgroup_id = 83,\n\tBPF_FUNC_sk_lookup_tcp = 84,\n\tBPF_FUNC_sk_lookup_udp = 85,\n\tBPF_FUNC_sk_release = 86,\n\tBPF_FUNC_map_push_elem = 87,\n\tBPF_FUNC_map_pop_elem = 88,\n\tBPF_FUNC_map_peek_elem = 89,\n\tBPF_FUNC_msg_push_data = 90,\n\tBPF_FUNC_msg_pop_data = 91,\n\tBPF_FUNC_rc_pointer_rel = 92,\n\tBPF_FUNC_spin_lock = 93,\n\tBPF_FUNC_spin_unlock = 94,\n\tBPF_FUNC_sk_fullsock = 95,\n\tBPF_FUNC_tcp_sock = 96,\n\tBPF_FUNC_skb_ecn_set_ce = 97,\n\tBPF_FUNC_get_listener_sock = 98,\n\tBPF_FUNC_skc_lookup_tcp = 99,\n\tBPF_FUNC_tcp_check_syncookie = 100,\n\tBPF_FUNC_sysctl_get_name = 101,\n\tBPF_FUNC_sysctl_get_current_value = 102,\n\tBPF_FUNC_sysctl_get_new_value = 103,\n\tBPF_FUNC_sysctl_set_new_value = 104,\n\tBPF_FUNC_strtol = 105,\n\tBPF_FUNC_strtoul = 106,\n\tBPF_FUNC_sk_storage_get = 107,\n\tBPF_FUNC_sk_storage_delete = 108,\n\tBPF_FUNC_send_signal = 109,\n\tBPF_FUNC_tcp_gen_syncookie = 110,\n\tBPF_FUNC_skb_output = 111,\n\tBPF_FUNC_probe_read_user = 112,\n\tBPF_FUNC_probe_read_kernel = 113,\n\tBPF_FUNC_probe_read_user_str = 114,\n\tBPF_FUNC_probe_read_kernel_str = 115,\n\tBPF_FUNC_tcp_send_ack = 116,\n\tBPF_FUNC_send_signal_thread = 117,\n\tBPF_FUNC_jiffies64 = 118,\n\tBPF_FUNC_read_branch_records = 119,\n\tBPF_FUNC_get_ns_current_pid_tgid = 120,\n\tBPF_FUNC_xdp_output = 121,\n\tBPF_FUNC_get_netns_cookie = 122,\n\tBPF_FUNC_get_current_ancestor_cgroup_id = 123,\n\tBPF_FUNC_sk_assign = 124,\n\tBPF_FUNC_ktime_get_boot_ns = 125,\n\tBPF_FUNC_seq_printf = 126,\n\tBPF_FUNC_seq_write = 127,\n\tBPF_FUNC_sk_cgroup_id = 128,\n\tBPF_FUNC_sk_ancestor_cgroup_id = 129,\n\tBPF_FUNC_ringbuf_output = 130,\n\tBPF_FUNC_ringbuf_reserve = 131,\n\tBPF_FUNC_ringbuf_submit = 132,\n\tBPF_FUNC_ringbuf_discard = 133,\n\tBPF_FUNC_ringbuf_query = 134,\n\tBPF_FUNC_csum_level = 135,\n\tBPF_FUNC_skc_to_tcp6_sock = 136,\n\tBPF_FUNC_skc_to_tcp_sock = 137,\n\tBPF_FUNC_skc_to_tcp_timewait_sock = 138,\n\tBPF_FUNC_skc_to_tcp_request_sock = 139,\n\tBPF_FUNC_skc_to_udp6_sock = 140,\n\tBPF_FUNC_get_task_stack = 141,\n\tBPF_FUNC_load_hdr_opt = 142,\n\tBPF_FUNC_store_hdr_opt = 143,\n\tBPF_FUNC_reserve_hdr_opt = 144,\n\tBPF_FUNC_inode_storage_get = 145,\n\tBPF_FUNC_inode_storage_delete = 146,\n\tBPF_FUNC_d_path = 147,\n\tBPF_FUNC_copy_from_user = 148,\n\tBPF_FUNC_snprintf_btf = 149,\n\tBPF_FUNC_seq_printf_btf = 150,\n\tBPF_FUNC_skb_cgroup_classid = 151,\n\tBPF_FUNC_redirect_neigh = 152,\n\tBPF_FUNC_per_cpu_ptr = 153,\n\tBPF_FUNC_this_cpu_ptr = 154,\n\tBPF_FUNC_redirect_peer = 155,\n\tBPF_FUNC_task_storage_get = 156,\n\tBPF_FUNC_task_storage_delete = 157,\n\tBPF_FUNC_get_current_task_btf = 158,\n\tBPF_FUNC_bprm_opts_set = 159,\n\tBPF_FUNC_ktime_get_coarse_ns = 160,\n\tBPF_FUNC_ima_inode_hash = 161,\n\tBPF_FUNC_sock_from_file = 162,\n\tBPF_FUNC_check_mtu = 163,\n\tBPF_FUNC_for_each_map_elem = 164,\n\tBPF_FUNC_snprintf = 165,\n\tBPF_FUNC_sys_bpf = 166,\n\tBPF_FUNC_btf_find_by_name_kind = 167,\n\tBPF_FUNC_sys_close = 168,\n\tBPF_FUNC_timer_init = 169,\n\tBPF_FUNC_timer_set_callback = 170,\n\tBPF_FUNC_timer_start = 171,\n\tBPF_FUNC_timer_cancel = 172,\n\tBPF_FUNC_get_func_ip = 173,\n\tBPF_FUNC_get_attach_cookie = 174,\n\tBPF_FUNC_task_pt_regs = 175,\n\tBPF_FUNC_get_branch_snapshot = 176,\n\tBPF_FUNC_trace_vprintk = 177,\n\tBPF_FUNC_skc_to_unix_sock = 178,\n\tBPF_FUNC_kallsyms_lookup_name = 179,\n\tBPF_FUNC_find_vma = 180,\n\tBPF_FUNC_loop = 181,\n\tBPF_FUNC_strncmp = 182,\n\tBPF_FUNC_get_func_arg = 183,\n\tBPF_FUNC_get_func_ret = 184,\n\tBPF_FUNC_get_func_arg_cnt = 185,\n\tBPF_FUNC_get_retval = 186,\n\tBPF_FUNC_set_retval = 187,\n\tBPF_FUNC_xdp_get_buff_len = 188,\n\tBPF_FUNC_xdp_load_bytes = 189,\n\tBPF_FUNC_xdp_store_bytes = 190,\n\tBPF_FUNC_copy_from_user_task = 191,\n\tBPF_FUNC_skb_set_tstamp = 192,\n\tBPF_FUNC_ima_file_hash = 193,\n\tBPF_FUNC_kptr_xchg = 194,\n\tBPF_FUNC_map_lookup_percpu_elem = 195,\n\tBPF_FUNC_skc_to_mptcp_sock = 196,\n\tBPF_FUNC_dynptr_from_mem = 197,\n\tBPF_FUNC_ringbuf_reserve_dynptr = 198,\n\tBPF_FUNC_ringbuf_submit_dynptr = 199,\n\tBPF_FUNC_ringbuf_discard_dynptr = 200,\n\tBPF_FUNC_dynptr_read = 201,\n\tBPF_FUNC_dynptr_write = 202,\n\tBPF_FUNC_dynptr_data = 203,\n\tBPF_FUNC_tcp_raw_gen_syncookie_ipv4 = 204,\n\tBPF_FUNC_tcp_raw_gen_syncookie_ipv6 = 205,\n\tBPF_FUNC_tcp_raw_check_syncookie_ipv4 = 206,\n\tBPF_FUNC_tcp_raw_check_syncookie_ipv6 = 207,\n\tBPF_FUNC_ktime_get_tai_ns = 208,\n\tBPF_FUNC_user_ringbuf_drain = 209,\n\tBPF_FUNC_cgrp_storage_get = 210,\n\tBPF_FUNC_cgrp_storage_delete = 211,\n\t__BPF_FUNC_MAX_ID = 212,\n};\n\nenum bpf_hdr_start_off {\n\tBPF_HDR_START_MAC = 0,\n\tBPF_HDR_START_NET = 1,\n};\n\nenum bpf_iter_feature {\n\tBPF_ITER_RESCHED = 1,\n};\n\nenum bpf_iter_state {\n\tBPF_ITER_STATE_INVALID = 0,\n\tBPF_ITER_STATE_ACTIVE = 1,\n\tBPF_ITER_STATE_DRAINED = 2,\n};\n\nenum bpf_iter_task_type {\n\tBPF_TASK_ITER_ALL = 0,\n\tBPF_TASK_ITER_TID = 1,\n\tBPF_TASK_ITER_TGID = 2,\n};\n\nenum bpf_jit_poke_reason {\n\tBPF_POKE_REASON_TAIL_CALL = 0,\n};\n\nenum bpf_link_type {\n\tBPF_LINK_TYPE_UNSPEC = 0,\n\tBPF_LINK_TYPE_RAW_TRACEPOINT = 1,\n\tBPF_LINK_TYPE_TRACING = 2,\n\tBPF_LINK_TYPE_CGROUP = 3,\n\tBPF_LINK_TYPE_ITER = 4,\n\tBPF_LINK_TYPE_NETNS = 5,\n\tBPF_LINK_TYPE_XDP = 6,\n\tBPF_LINK_TYPE_PERF_EVENT = 7,\n\tBPF_LINK_TYPE_KPROBE_MULTI = 8,\n\tBPF_LINK_TYPE_STRUCT_OPS = 9,\n\tBPF_LINK_TYPE_NETFILTER = 10,\n\tBPF_LINK_TYPE_TCX = 11,\n\tBPF_LINK_TYPE_UPROBE_MULTI = 12,\n\tBPF_LINK_TYPE_NETKIT = 13,\n\tBPF_LINK_TYPE_SOCKMAP = 14,\n\t__MAX_BPF_LINK_TYPE = 15,\n};\n\nenum bpf_lru_list_type {\n\tBPF_LRU_LIST_T_ACTIVE = 0,\n\tBPF_LRU_LIST_T_INACTIVE = 1,\n\tBPF_LRU_LIST_T_FREE = 2,\n\tBPF_LRU_LOCAL_LIST_T_FREE = 3,\n\tBPF_LRU_LOCAL_LIST_T_PENDING = 4,\n};\n\nenum bpf_lwt_encap_mode {\n\tBPF_LWT_ENCAP_SEG6 = 0,\n\tBPF_LWT_ENCAP_SEG6_INLINE = 1,\n\tBPF_LWT_ENCAP_IP = 2,\n};\n\nenum bpf_map_type {\n\tBPF_MAP_TYPE_UNSPEC = 0,\n\tBPF_MAP_TYPE_HASH = 1,\n\tBPF_MAP_TYPE_ARRAY = 2,\n\tBPF_MAP_TYPE_PROG_ARRAY = 3,\n\tBPF_MAP_TYPE_PERF_EVENT_ARRAY = 4,\n\tBPF_MAP_TYPE_PERCPU_HASH = 5,\n\tBPF_MAP_TYPE_PERCPU_ARRAY = 6,\n\tBPF_MAP_TYPE_STACK_TRACE = 7,\n\tBPF_MAP_TYPE_CGROUP_ARRAY = 8,\n\tBPF_MAP_TYPE_LRU_HASH = 9,\n\tBPF_MAP_TYPE_LRU_PERCPU_HASH = 10,\n\tBPF_MAP_TYPE_LPM_TRIE = 11,\n\tBPF_MAP_TYPE_ARRAY_OF_MAPS = 12,\n\tBPF_MAP_TYPE_HASH_OF_MAPS = 13,\n\tBPF_MAP_TYPE_DEVMAP = 14,\n\tBPF_MAP_TYPE_SOCKMAP = 15,\n\tBPF_MAP_TYPE_CPUMAP = 16,\n\tBPF_MAP_TYPE_XSKMAP = 17,\n\tBPF_MAP_TYPE_SOCKHASH = 18,\n\tBPF_MAP_TYPE_CGROUP_STORAGE_DEPRECATED = 19,\n\tBPF_MAP_TYPE_CGROUP_STORAGE = 19,\n\tBPF_MAP_TYPE_REUSEPORT_SOCKARRAY = 20,\n\tBPF_MAP_TYPE_PERCPU_CGROUP_STORAGE_DEPRECATED = 21,\n\tBPF_MAP_TYPE_PERCPU_CGROUP_STORAGE = 21,\n\tBPF_MAP_TYPE_QUEUE = 22,\n\tBPF_MAP_TYPE_STACK = 23,\n\tBPF_MAP_TYPE_SK_STORAGE = 24,\n\tBPF_MAP_TYPE_DEVMAP_HASH = 25,\n\tBPF_MAP_TYPE_STRUCT_OPS = 26,\n\tBPF_MAP_TYPE_RINGBUF = 27,\n\tBPF_MAP_TYPE_INODE_STORAGE = 28,\n\tBPF_MAP_TYPE_TASK_STORAGE = 29,\n\tBPF_MAP_TYPE_BLOOM_FILTER = 30,\n\tBPF_MAP_TYPE_USER_RINGBUF = 31,\n\tBPF_MAP_TYPE_CGRP_STORAGE = 32,\n\tBPF_MAP_TYPE_ARENA = 33,\n\t__MAX_BPF_MAP_TYPE = 34,\n};\n\nenum bpf_netdev_command {\n\tXDP_SETUP_PROG = 0,\n\tXDP_SETUP_PROG_HW = 1,\n\tBPF_OFFLOAD_MAP_ALLOC = 2,\n\tBPF_OFFLOAD_MAP_FREE = 3,\n\tXDP_SETUP_XSK_POOL = 4,\n};\n\nenum bpf_perf_event_type {\n\tBPF_PERF_EVENT_UNSPEC = 0,\n\tBPF_PERF_EVENT_UPROBE = 1,\n\tBPF_PERF_EVENT_URETPROBE = 2,\n\tBPF_PERF_EVENT_KPROBE = 3,\n\tBPF_PERF_EVENT_KRETPROBE = 4,\n\tBPF_PERF_EVENT_TRACEPOINT = 5,\n\tBPF_PERF_EVENT_EVENT = 6,\n};\n\nenum bpf_prog_type {\n\tBPF_PROG_TYPE_UNSPEC = 0,\n\tBPF_PROG_TYPE_SOCKET_FILTER = 1,\n\tBPF_PROG_TYPE_KPROBE = 2,\n\tBPF_PROG_TYPE_SCHED_CLS = 3,\n\tBPF_PROG_TYPE_SCHED_ACT = 4,\n\tBPF_PROG_TYPE_TRACEPOINT = 5,\n\tBPF_PROG_TYPE_XDP = 6,\n\tBPF_PROG_TYPE_PERF_EVENT = 7,\n\tBPF_PROG_TYPE_CGROUP_SKB = 8,\n\tBPF_PROG_TYPE_CGROUP_SOCK = 9,\n\tBPF_PROG_TYPE_LWT_IN = 10,\n\tBPF_PROG_TYPE_LWT_OUT = 11,\n\tBPF_PROG_TYPE_LWT_XMIT = 12,\n\tBPF_PROG_TYPE_SOCK_OPS = 13,\n\tBPF_PROG_TYPE_SK_SKB = 14,\n\tBPF_PROG_TYPE_CGROUP_DEVICE = 15,\n\tBPF_PROG_TYPE_SK_MSG = 16,\n\tBPF_PROG_TYPE_RAW_TRACEPOINT = 17,\n\tBPF_PROG_TYPE_CGROUP_SOCK_ADDR = 18,\n\tBPF_PROG_TYPE_LWT_SEG6LOCAL = 19,\n\tBPF_PROG_TYPE_LIRC_MODE2 = 20,\n\tBPF_PROG_TYPE_SK_REUSEPORT = 21,\n\tBPF_PROG_TYPE_FLOW_DISSECTOR = 22,\n\tBPF_PROG_TYPE_CGROUP_SYSCTL = 23,\n\tBPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE = 24,\n\tBPF_PROG_TYPE_CGROUP_SOCKOPT = 25,\n\tBPF_PROG_TYPE_TRACING = 26,\n\tBPF_PROG_TYPE_STRUCT_OPS = 27,\n\tBPF_PROG_TYPE_EXT = 28,\n\tBPF_PROG_TYPE_LSM = 29,\n\tBPF_PROG_TYPE_SK_LOOKUP = 30,\n\tBPF_PROG_TYPE_SYSCALL = 31,\n\tBPF_PROG_TYPE_NETFILTER = 32,\n\t__MAX_BPF_PROG_TYPE = 33,\n};\n\nenum bpf_reg_liveness {\n\tREG_LIVE_NONE = 0,\n\tREG_LIVE_READ32 = 1,\n\tREG_LIVE_READ64 = 2,\n\tREG_LIVE_READ = 3,\n\tREG_LIVE_WRITTEN = 4,\n\tREG_LIVE_DONE = 8,\n};\n\nenum bpf_reg_type {\n\tNOT_INIT = 0,\n\tSCALAR_VALUE = 1,\n\tPTR_TO_CTX = 2,\n\tCONST_PTR_TO_MAP = 3,\n\tPTR_TO_MAP_VALUE = 4,\n\tPTR_TO_MAP_KEY = 5,\n\tPTR_TO_STACK = 6,\n\tPTR_TO_PACKET_META = 7,\n\tPTR_TO_PACKET = 8,\n\tPTR_TO_PACKET_END = 9,\n\tPTR_TO_FLOW_KEYS = 10,\n\tPTR_TO_SOCKET = 11,\n\tPTR_TO_SOCK_COMMON = 12,\n\tPTR_TO_TCP_SOCK = 13,\n\tPTR_TO_TP_BUFFER = 14,\n\tPTR_TO_XDP_SOCK = 15,\n\tPTR_TO_BTF_ID = 16,\n\tPTR_TO_MEM = 17,\n\tPTR_TO_ARENA = 18,\n\tPTR_TO_BUF = 19,\n\tPTR_TO_FUNC = 20,\n\tCONST_PTR_TO_DYNPTR = 21,\n\t__BPF_REG_TYPE_MAX = 22,\n\tPTR_TO_MAP_VALUE_OR_NULL = 260,\n\tPTR_TO_SOCKET_OR_NULL = 267,\n\tPTR_TO_SOCK_COMMON_OR_NULL = 268,\n\tPTR_TO_TCP_SOCK_OR_NULL = 269,\n\tPTR_TO_BTF_ID_OR_NULL = 272,\n\t__BPF_REG_TYPE_LIMIT = 134217727,\n};\n\nenum bpf_ret_code {\n\tBPF_OK = 0,\n\tBPF_DROP = 2,\n\tBPF_REDIRECT = 7,\n\tBPF_LWT_REROUTE = 128,\n\tBPF_FLOW_DISSECTOR_CONTINUE = 129,\n};\n\nenum bpf_return_type {\n\tRET_INTEGER = 0,\n\tRET_VOID = 1,\n\tRET_PTR_TO_MAP_VALUE = 2,\n\tRET_PTR_TO_SOCKET = 3,\n\tRET_PTR_TO_TCP_SOCK = 4,\n\tRET_PTR_TO_SOCK_COMMON = 5,\n\tRET_PTR_TO_MEM = 6,\n\tRET_PTR_TO_MEM_OR_BTF_ID = 7,\n\tRET_PTR_TO_BTF_ID = 8,\n\t__BPF_RET_TYPE_MAX = 9,\n\tRET_PTR_TO_MAP_VALUE_OR_NULL = 258,\n\tRET_PTR_TO_SOCKET_OR_NULL = 259,\n\tRET_PTR_TO_TCP_SOCK_OR_NULL = 260,\n\tRET_PTR_TO_SOCK_COMMON_OR_NULL = 261,\n\tRET_PTR_TO_RINGBUF_MEM_OR_NULL = 1286,\n\tRET_PTR_TO_DYNPTR_MEM_OR_NULL = 262,\n\tRET_PTR_TO_BTF_ID_OR_NULL = 264,\n\tRET_PTR_TO_BTF_ID_TRUSTED = 1048584,\n\t__BPF_RET_TYPE_LIMIT = 134217727,\n};\n\nenum bpf_stack_build_id_status {\n\tBPF_STACK_BUILD_ID_EMPTY = 0,\n\tBPF_STACK_BUILD_ID_VALID = 1,\n\tBPF_STACK_BUILD_ID_IP = 2,\n};\n\nenum bpf_stack_slot_type {\n\tSTACK_INVALID = 0,\n\tSTACK_SPILL = 1,\n\tSTACK_MISC = 2,\n\tSTACK_ZERO = 3,\n\tSTACK_DYNPTR = 4,\n\tSTACK_ITER = 5,\n};\n\nenum bpf_stats_type {\n\tBPF_STATS_RUN_TIME = 0,\n};\n\nenum bpf_struct_ops_state {\n\tBPF_STRUCT_OPS_STATE_INIT = 0,\n\tBPF_STRUCT_OPS_STATE_INUSE = 1,\n\tBPF_STRUCT_OPS_STATE_TOBEFREE = 2,\n\tBPF_STRUCT_OPS_STATE_READY = 3,\n};\n\nenum bpf_struct_walk_result {\n\tWALK_SCALAR = 0,\n\tWALK_PTR = 1,\n\tWALK_STRUCT = 2,\n};\n\nenum bpf_task_fd_type {\n\tBPF_FD_TYPE_RAW_TRACEPOINT = 0,\n\tBPF_FD_TYPE_TRACEPOINT = 1,\n\tBPF_FD_TYPE_KPROBE = 2,\n\tBPF_FD_TYPE_KRETPROBE = 3,\n\tBPF_FD_TYPE_UPROBE = 4,\n\tBPF_FD_TYPE_URETPROBE = 5,\n};\n\nenum bpf_task_vma_iter_find_op {\n\ttask_vma_iter_first_vma = 0,\n\ttask_vma_iter_next_vma = 1,\n\ttask_vma_iter_find_vma = 2,\n};\n\nenum bpf_text_poke_type {\n\tBPF_MOD_CALL = 0,\n\tBPF_MOD_JUMP = 1,\n};\n\nenum bpf_tramp_prog_type {\n\tBPF_TRAMP_FENTRY = 0,\n\tBPF_TRAMP_FEXIT = 1,\n\tBPF_TRAMP_MODIFY_RETURN = 2,\n\tBPF_TRAMP_MAX = 3,\n\tBPF_TRAMP_REPLACE = 4,\n};\n\nenum bpf_type {\n\tBPF_TYPE_UNSPEC = 0,\n\tBPF_TYPE_PROG = 1,\n\tBPF_TYPE_MAP = 2,\n\tBPF_TYPE_LINK = 3,\n};\n\nenum bpf_type_flag {\n\tPTR_MAYBE_NULL = 256,\n\tMEM_RDONLY = 512,\n\tMEM_RINGBUF = 1024,\n\tMEM_USER = 2048,\n\tMEM_PERCPU = 4096,\n\tOBJ_RELEASE = 8192,\n\tPTR_UNTRUSTED = 16384,\n\tMEM_UNINIT = 32768,\n\tDYNPTR_TYPE_LOCAL = 65536,\n\tDYNPTR_TYPE_RINGBUF = 131072,\n\tMEM_FIXED_SIZE = 262144,\n\tMEM_ALLOC = 524288,\n\tPTR_TRUSTED = 1048576,\n\tMEM_RCU = 2097152,\n\tNON_OWN_REF = 4194304,\n\tDYNPTR_TYPE_SKB = 8388608,\n\tDYNPTR_TYPE_XDP = 16777216,\n\tMEM_ALIGNED = 33554432,\n\tMEM_WRITE = 67108864,\n\t__BPF_TYPE_FLAG_MAX = 67108865,\n\t__BPF_TYPE_LAST_FLAG = 67108864,\n};\n\nenum bpf_xdp_mode {\n\tXDP_MODE_SKB = 0,\n\tXDP_MODE_DRV = 1,\n\tXDP_MODE_HW = 2,\n\t__MAX_XDP_MODE = 3,\n};\n\nenum btf_arg_tag {\n\tARG_TAG_CTX = 1,\n\tARG_TAG_NONNULL = 2,\n\tARG_TAG_TRUSTED = 4,\n\tARG_TAG_NULLABLE = 8,\n\tARG_TAG_ARENA = 16,\n};\n\nenum btf_field_iter_kind {\n\tBTF_FIELD_ITER_IDS = 0,\n\tBTF_FIELD_ITER_STRS = 1,\n};\n\nenum btf_field_type {\n\tBPF_SPIN_LOCK = 1,\n\tBPF_TIMER = 2,\n\tBPF_KPTR_UNREF = 4,\n\tBPF_KPTR_REF = 8,\n\tBPF_KPTR_PERCPU = 16,\n\tBPF_KPTR = 28,\n\tBPF_LIST_HEAD = 32,\n\tBPF_LIST_NODE = 64,\n\tBPF_RB_ROOT = 128,\n\tBPF_RB_NODE = 256,\n\tBPF_GRAPH_NODE = 320,\n\tBPF_GRAPH_ROOT = 160,\n\tBPF_REFCOUNT = 512,\n\tBPF_WORKQUEUE = 1024,\n};\n\nenum btf_func_linkage {\n\tBTF_FUNC_STATIC = 0,\n\tBTF_FUNC_GLOBAL = 1,\n\tBTF_FUNC_EXTERN = 2,\n};\n\nenum btf_kfunc_hook {\n\tBTF_KFUNC_HOOK_COMMON = 0,\n\tBTF_KFUNC_HOOK_XDP = 1,\n\tBTF_KFUNC_HOOK_TC = 2,\n\tBTF_KFUNC_HOOK_STRUCT_OPS = 3,\n\tBTF_KFUNC_HOOK_TRACING = 4,\n\tBTF_KFUNC_HOOK_SYSCALL = 5,\n\tBTF_KFUNC_HOOK_FMODRET = 6,\n\tBTF_KFUNC_HOOK_CGROUP_SKB = 7,\n\tBTF_KFUNC_HOOK_SCHED_ACT = 8,\n\tBTF_KFUNC_HOOK_SK_SKB = 9,\n\tBTF_KFUNC_HOOK_SOCKET_FILTER = 10,\n\tBTF_KFUNC_HOOK_LWT = 11,\n\tBTF_KFUNC_HOOK_NETFILTER = 12,\n\tBTF_KFUNC_HOOK_KPROBE = 13,\n\tBTF_KFUNC_HOOK_MAX = 14,\n};\n\nenum buddy {\n\tFIRST = 0,\n\tLAST = 1,\n};\n\nenum bug_trap_type {\n\tBUG_TRAP_TYPE_NONE = 0,\n\tBUG_TRAP_TYPE_WARN = 1,\n\tBUG_TRAP_TYPE_BUG = 2,\n};\n\nenum bus_notifier_event {\n\tBUS_NOTIFY_ADD_DEVICE = 0,\n\tBUS_NOTIFY_DEL_DEVICE = 1,\n\tBUS_NOTIFY_REMOVED_DEVICE = 2,\n\tBUS_NOTIFY_BIND_DRIVER = 3,\n\tBUS_NOTIFY_BOUND_DRIVER = 4,\n\tBUS_NOTIFY_UNBIND_DRIVER = 5,\n\tBUS_NOTIFY_UNBOUND_DRIVER = 6,\n\tBUS_NOTIFY_DRIVER_NOT_BOUND = 7,\n};\n\nenum cache_indexing {\n\tNODE_CACHE_DIRECT_MAP = 0,\n\tNODE_CACHE_INDEXED = 1,\n\tNODE_CACHE_OTHER = 2,\n};\n\nenum cache_tag_type {\n\tCACHE_TAG_IOTLB = 0,\n\tCACHE_TAG_DEVTLB = 1,\n\tCACHE_TAG_NESTING_IOTLB = 2,\n\tCACHE_TAG_NESTING_DEVTLB = 3,\n};\n\nenum cache_type {\n\tCACHE_TYPE_NOCACHE = 0,\n\tCACHE_TYPE_INST = 1,\n\tCACHE_TYPE_DATA = 2,\n\tCACHE_TYPE_SEPARATE = 3,\n\tCACHE_TYPE_UNIFIED = 4,\n};\n\nenum cache_write_policy {\n\tNODE_CACHE_WRITE_BACK = 0,\n\tNODE_CACHE_WRITE_THROUGH = 1,\n\tNODE_CACHE_WRITE_OTHER = 2,\n};\n\nenum cap_audit_type {\n\tCAP_AUDIT_STATIC_DMAR = 0,\n\tCAP_AUDIT_STATIC_IRQR = 1,\n\tCAP_AUDIT_HOTPLUG_DMAR = 2,\n\tCAP_AUDIT_HOTPLUG_IRQR = 3,\n};\n\nenum cc_attr {\n\tCC_ATTR_MEM_ENCRYPT = 0,\n\tCC_ATTR_HOST_MEM_ENCRYPT = 1,\n\tCC_ATTR_GUEST_MEM_ENCRYPT = 2,\n\tCC_ATTR_GUEST_STATE_ENCRYPT = 3,\n\tCC_ATTR_GUEST_UNROLL_STRING_IO = 4,\n\tCC_ATTR_GUEST_SEV_SNP = 5,\n\tCC_ATTR_HOST_SEV_SNP = 6,\n};\n\nenum cc_vendor {\n\tCC_VENDOR_NONE = 0,\n\tCC_VENDOR_AMD = 1,\n\tCC_VENDOR_INTEL = 2,\n};\n\nenum cdrom_print_option {\n\tCTL_NAME = 0,\n\tCTL_SPEED = 1,\n\tCTL_SLOTS = 2,\n\tCTL_CAPABILITY = 3,\n};\n\nenum cee_attrs {\n\tDCB_ATTR_CEE_UNSPEC = 0,\n\tDCB_ATTR_CEE_PEER_PG = 1,\n\tDCB_ATTR_CEE_PEER_PFC = 2,\n\tDCB_ATTR_CEE_PEER_APP_TABLE = 3,\n\tDCB_ATTR_CEE_TX_PG = 4,\n\tDCB_ATTR_CEE_RX_PG = 5,\n\tDCB_ATTR_CEE_PFC = 6,\n\tDCB_ATTR_CEE_APP_TABLE = 7,\n\tDCB_ATTR_CEE_FEAT = 8,\n\t__DCB_ATTR_CEE_MAX = 9,\n};\n\nenum cfg80211_signal_type {\n\tCFG80211_SIGNAL_TYPE_NONE = 0,\n\tCFG80211_SIGNAL_TYPE_MBM = 1,\n\tCFG80211_SIGNAL_TYPE_UNSPEC = 2,\n};\n\nenum cfi_mode {\n\tCFI_AUTO = 0,\n\tCFI_OFF = 1,\n\tCFI_KCFI = 2,\n\tCFI_FINEIBT = 3,\n};\n\nenum cgroup1_param {\n\tOpt_all = 0,\n\tOpt_clone_children = 1,\n\tOpt_cpuset_v2_mode = 2,\n\tOpt_name = 3,\n\tOpt_none = 4,\n\tOpt_noprefix = 5,\n\tOpt_release_agent = 6,\n\tOpt_xattr = 7,\n\tOpt_favordynmods = 8,\n\tOpt_nofavordynmods = 9,\n};\n\nenum cgroup2_param {\n\tOpt_nsdelegate = 0,\n\tOpt_favordynmods___2 = 1,\n\tOpt_memory_localevents = 2,\n\tOpt_memory_recursiveprot = 3,\n\tOpt_memory_hugetlb_accounting = 4,\n\tOpt_pids_localevents = 5,\n\tnr__cgroup2_params = 6,\n};\n\nenum cgroup_bpf_attach_type {\n\tCGROUP_BPF_ATTACH_TYPE_INVALID = -1,\n\tCGROUP_INET_INGRESS = 0,\n\tCGROUP_INET_EGRESS = 1,\n\tCGROUP_INET_SOCK_CREATE = 2,\n\tCGROUP_SOCK_OPS = 3,\n\tCGROUP_DEVICE = 4,\n\tCGROUP_INET4_BIND = 5,\n\tCGROUP_INET6_BIND = 6,\n\tCGROUP_INET4_CONNECT = 7,\n\tCGROUP_INET6_CONNECT = 8,\n\tCGROUP_UNIX_CONNECT = 9,\n\tCGROUP_INET4_POST_BIND = 10,\n\tCGROUP_INET6_POST_BIND = 11,\n\tCGROUP_UDP4_SENDMSG = 12,\n\tCGROUP_UDP6_SENDMSG = 13,\n\tCGROUP_UNIX_SENDMSG = 14,\n\tCGROUP_SYSCTL = 15,\n\tCGROUP_UDP4_RECVMSG = 16,\n\tCGROUP_UDP6_RECVMSG = 17,\n\tCGROUP_UNIX_RECVMSG = 18,\n\tCGROUP_GETSOCKOPT = 19,\n\tCGROUP_SETSOCKOPT = 20,\n\tCGROUP_INET4_GETPEERNAME = 21,\n\tCGROUP_INET6_GETPEERNAME = 22,\n\tCGROUP_UNIX_GETPEERNAME = 23,\n\tCGROUP_INET4_GETSOCKNAME = 24,\n\tCGROUP_INET6_GETSOCKNAME = 25,\n\tCGROUP_UNIX_GETSOCKNAME = 26,\n\tCGROUP_INET_SOCK_RELEASE = 27,\n\tCGROUP_LSM_START = 28,\n\tCGROUP_LSM_END = 37,\n\tMAX_CGROUP_BPF_ATTACH_TYPE = 38,\n};\n\nenum cgroup_filetype {\n\tCGROUP_FILE_PROCS = 0,\n\tCGROUP_FILE_TASKS = 1,\n};\n\nenum cgroup_opt_features {\n\tOPT_FEATURE_PRESSURE = 0,\n\tOPT_FEATURE_COUNT = 1,\n};\n\nenum cgroup_subsys_id {\n\tcpuset_cgrp_id = 0,\n\tcpu_cgrp_id = 1,\n\tcpuacct_cgrp_id = 2,\n\tio_cgrp_id = 3,\n\tmemory_cgrp_id = 4,\n\tdevices_cgrp_id = 5,\n\tfreezer_cgrp_id = 6,\n\tnet_cls_cgrp_id = 7,\n\tperf_event_cgrp_id = 8,\n\tnet_prio_cgrp_id = 9,\n\thugetlb_cgrp_id = 10,\n\tpids_cgrp_id = 11,\n\trdma_cgrp_id = 12,\n\tmisc_cgrp_id = 13,\n\tCGROUP_SUBSYS_COUNT = 14,\n};\n\nenum chacha_constants {\n\tCHACHA_CONSTANT_EXPA = 1634760805,\n\tCHACHA_CONSTANT_ND_3 = 857760878,\n\tCHACHA_CONSTANT_2_BY = 2036477234,\n\tCHACHA_CONSTANT_TE_K = 1797285236,\n};\n\nenum chipset_type {\n\tNOT_SUPPORTED = 0,\n\tSUPPORTED = 1,\n};\n\nenum class_map_type {\n\tDD_CLASS_TYPE_DISJOINT_BITS = 0,\n\tDD_CLASS_TYPE_LEVEL_NUM = 1,\n\tDD_CLASS_TYPE_DISJOINT_NAMES = 2,\n\tDD_CLASS_TYPE_LEVEL_NAMES = 3,\n};\n\nenum class_stat_type {\n\tZS_OBJS_ALLOCATED = 12,\n\tZS_OBJS_INUSE = 13,\n\tNR_CLASS_STAT_TYPES = 14,\n};\n\nenum cleanup_prefix_rt_t {\n\tCLEANUP_PREFIX_RT_NOP = 0,\n\tCLEANUP_PREFIX_RT_DEL = 1,\n\tCLEANUP_PREFIX_RT_EXPIRE = 2,\n};\n\nenum clear_refs_types {\n\tCLEAR_REFS_ALL = 1,\n\tCLEAR_REFS_ANON = 2,\n\tCLEAR_REFS_MAPPED = 3,\n\tCLEAR_REFS_SOFT_DIRTY = 4,\n\tCLEAR_REFS_MM_HIWATER_RSS = 5,\n\tCLEAR_REFS_LAST = 6,\n};\n\nenum clock_event_state {\n\tCLOCK_EVT_STATE_DETACHED = 0,\n\tCLOCK_EVT_STATE_SHUTDOWN = 1,\n\tCLOCK_EVT_STATE_PERIODIC = 2,\n\tCLOCK_EVT_STATE_ONESHOT = 3,\n\tCLOCK_EVT_STATE_ONESHOT_STOPPED = 4,\n};\n\nenum clocksource_ids {\n\tCSID_GENERIC = 0,\n\tCSID_ARM_ARCH_COUNTER = 1,\n\tCSID_X86_TSC_EARLY = 2,\n\tCSID_X86_TSC = 3,\n\tCSID_X86_KVM_CLK = 4,\n\tCSID_X86_ART = 5,\n\tCSID_MAX = 6,\n};\n\nenum closure_state {\n\tCLOSURE_BITS_START = 67108864,\n\tCLOSURE_DESTRUCTOR = 67108864,\n\tCLOSURE_WAITING = 268435456,\n\tCLOSURE_RUNNING = 1073741824,\n};\n\nenum cm_batt_temp {\n\tCM_BATT_OK = 0,\n\tCM_BATT_OVERHEAT = 1,\n\tCM_BATT_COLD = 2,\n};\n\nenum cmd_type {\n\tCMD_ADDR = 1,\n\tCMD_LISTEN = 2,\n\tCMD_OPT = 4,\n};\n\nenum cmis_cdb_fw_write_mechanism {\n\tCMIS_CDB_FW_WRITE_MECHANISM_LPL = 1,\n\tCMIS_CDB_FW_WRITE_MECHANISM_BOTH = 17,\n};\n\nenum compact_priority {\n\tCOMPACT_PRIO_SYNC_FULL = 0,\n\tMIN_COMPACT_PRIORITY = 0,\n\tCOMPACT_PRIO_SYNC_LIGHT = 1,\n\tMIN_COMPACT_COSTLY_PRIORITY = 1,\n\tDEF_COMPACT_PRIORITY = 1,\n\tCOMPACT_PRIO_ASYNC = 2,\n\tINIT_COMPACT_PRIORITY = 2,\n};\n\nenum compact_result {\n\tCOMPACT_NOT_SUITABLE_ZONE = 0,\n\tCOMPACT_SKIPPED = 1,\n\tCOMPACT_DEFERRED = 2,\n\tCOMPACT_NO_SUITABLE_PAGE = 3,\n\tCOMPACT_CONTINUE = 4,\n\tCOMPACT_COMPLETE = 5,\n\tCOMPACT_PARTIAL_SKIPPED = 6,\n\tCOMPACT_CONTENDED = 7,\n\tCOMPACT_SUCCESS = 8,\n};\n\nenum con_flush_mode {\n\tCONSOLE_FLUSH_PENDING = 0,\n\tCONSOLE_REPLAY_ALL = 1,\n};\n\nenum con_msg_format_flags {\n\tMSG_FORMAT_DEFAULT = 0,\n\tMSG_FORMAT_SYSLOG = 1,\n};\n\nenum con_scroll {\n\tSM_UP = 0,\n\tSM_DOWN = 1,\n};\n\nenum cons_flags {\n\tCON_PRINTBUFFER = 1,\n\tCON_CONSDEV = 2,\n\tCON_ENABLED = 4,\n\tCON_BOOT = 8,\n\tCON_ANYTIME = 16,\n\tCON_BRL = 32,\n\tCON_EXTENDED = 64,\n\tCON_SUSPENDED = 128,\n\tCON_NBCON = 256,\n};\n\nenum context {\n\tIN_KERNEL = 1,\n\tIN_USER = 2,\n\tIN_KERNEL_RECOV = 3,\n};\n\nenum cp_error_code {\n\tCP_EC = 32767,\n\tCP_RET = 1,\n\tCP_IRET = 2,\n\tCP_ENDBR = 3,\n\tCP_RSTRORSSP = 4,\n\tCP_SETSSBSY = 5,\n\tCP_ENCL = 32768,\n};\n\nenum cpa_warn {\n\tCPA_CONFLICT = 0,\n\tCPA_PROTECT = 1,\n\tCPA_DETECT = 2,\n};\n\nenum cpio_fields {\n\tC_MAGIC = 0,\n\tC_INO = 1,\n\tC_MODE = 2,\n\tC_UID = 3,\n\tC_GID = 4,\n\tC_NLINK = 5,\n\tC_MTIME = 6,\n\tC_FILESIZE = 7,\n\tC_MAJ = 8,\n\tC_MIN = 9,\n\tC_RMAJ = 10,\n\tC_RMIN = 11,\n\tC_NAMESIZE = 12,\n\tC_CHKSUM = 13,\n\tC_NFIELDS = 14,\n};\n\nenum cppc_regs {\n\tHIGHEST_PERF = 0,\n\tNOMINAL_PERF = 1,\n\tLOW_NON_LINEAR_PERF = 2,\n\tLOWEST_PERF = 3,\n\tGUARANTEED_PERF = 4,\n\tDESIRED_PERF = 5,\n\tMIN_PERF = 6,\n\tMAX_PERF = 7,\n\tPERF_REDUC_TOLERANCE = 8,\n\tTIME_WINDOW = 9,\n\tCTR_WRAP_TIME = 10,\n\tREFERENCE_CTR = 11,\n\tDELIVERED_CTR = 12,\n\tPERF_LIMITED = 13,\n\tENABLE = 14,\n\tAUTO_SEL_ENABLE = 15,\n\tAUTO_ACT_WINDOW = 16,\n\tENERGY_PERF = 17,\n\tREFERENCE_PERF = 18,\n\tLOWEST_FREQ = 19,\n\tNOMINAL_FREQ = 20,\n};\n\nenum cpu_idle_type {\n\t__CPU_NOT_IDLE = 0,\n\tCPU_IDLE = 1,\n\tCPU_NEWLY_IDLE = 2,\n\tCPU_MAX_IDLE_TYPES = 3,\n};\n\nenum cpu_led_event {\n\tCPU_LED_IDLE_START = 0,\n\tCPU_LED_IDLE_END = 1,\n\tCPU_LED_START = 2,\n\tCPU_LED_STOP = 3,\n\tCPU_LED_HALTED = 4,\n};\n\nenum cpu_mitigations {\n\tCPU_MITIGATIONS_OFF = 0,\n\tCPU_MITIGATIONS_AUTO = 1,\n\tCPU_MITIGATIONS_AUTO_NOSMT = 2,\n};\n\nenum cpu_usage_stat {\n\tCPUTIME_USER = 0,\n\tCPUTIME_NICE = 1,\n\tCPUTIME_SYSTEM = 2,\n\tCPUTIME_SOFTIRQ = 3,\n\tCPUTIME_IRQ = 4,\n\tCPUTIME_IDLE = 5,\n\tCPUTIME_IOWAIT = 6,\n\tCPUTIME_STEAL = 7,\n\tCPUTIME_GUEST = 8,\n\tCPUTIME_GUEST_NICE = 9,\n\tCPUTIME_FORCEIDLE = 10,\n\tNR_STATS = 11,\n};\n\nenum cpuacct_stat_index {\n\tCPUACCT_STAT_USER = 0,\n\tCPUACCT_STAT_SYSTEM = 1,\n\tCPUACCT_STAT_NSTATS = 2,\n};\n\nenum cpufreq_table_sorting {\n\tCPUFREQ_TABLE_UNSORTED = 0,\n\tCPUFREQ_TABLE_SORTED_ASCENDING = 1,\n\tCPUFREQ_TABLE_SORTED_DESCENDING = 2,\n};\n\nenum cpuhp_smt_control {\n\tCPU_SMT_ENABLED = 0,\n\tCPU_SMT_DISABLED = 1,\n\tCPU_SMT_FORCE_DISABLED = 2,\n\tCPU_SMT_NOT_SUPPORTED = 3,\n\tCPU_SMT_NOT_IMPLEMENTED = 4,\n};\n\nenum cpuhp_state {\n\tCPUHP_INVALID = -1,\n\tCPUHP_OFFLINE = 0,\n\tCPUHP_CREATE_THREADS = 1,\n\tCPUHP_PERF_PREPARE = 2,\n\tCPUHP_PERF_X86_PREPARE = 3,\n\tCPUHP_PERF_X86_AMD_UNCORE_PREP = 4,\n\tCPUHP_PERF_POWER = 5,\n\tCPUHP_PERF_SUPERH = 6,\n\tCPUHP_X86_HPET_DEAD = 7,\n\tCPUHP_X86_MCE_DEAD = 8,\n\tCPUHP_VIRT_NET_DEAD = 9,\n\tCPUHP_IBMVNIC_DEAD = 10,\n\tCPUHP_SLUB_DEAD = 11,\n\tCPUHP_DEBUG_OBJ_DEAD = 12,\n\tCPUHP_MM_WRITEBACK_DEAD = 13,\n\tCPUHP_MM_VMSTAT_DEAD = 14,\n\tCPUHP_SOFTIRQ_DEAD = 15,\n\tCPUHP_NET_MVNETA_DEAD = 16,\n\tCPUHP_CPUIDLE_DEAD = 17,\n\tCPUHP_ARM64_FPSIMD_DEAD = 18,\n\tCPUHP_ARM_OMAP_WAKE_DEAD = 19,\n\tCPUHP_IRQ_POLL_DEAD = 20,\n\tCPUHP_BLOCK_SOFTIRQ_DEAD = 21,\n\tCPUHP_BIO_DEAD = 22,\n\tCPUHP_ACPI_CPUDRV_DEAD = 23,\n\tCPUHP_S390_PFAULT_DEAD = 24,\n\tCPUHP_BLK_MQ_DEAD = 25,\n\tCPUHP_FS_BUFF_DEAD = 26,\n\tCPUHP_PRINTK_DEAD = 27,\n\tCPUHP_MM_MEMCQ_DEAD = 28,\n\tCPUHP_PERCPU_CNT_DEAD = 29,\n\tCPUHP_RADIX_DEAD = 30,\n\tCPUHP_PAGE_ALLOC = 31,\n\tCPUHP_NET_DEV_DEAD = 32,\n\tCPUHP_PCI_XGENE_DEAD = 33,\n\tCPUHP_IOMMU_IOVA_DEAD = 34,\n\tCPUHP_AP_ARM_CACHE_B15_RAC_DEAD = 35,\n\tCPUHP_PADATA_DEAD = 36,\n\tCPUHP_AP_DTPM_CPU_DEAD = 37,\n\tCPUHP_RANDOM_PREPARE = 38,\n\tCPUHP_WORKQUEUE_PREP = 39,\n\tCPUHP_POWER_NUMA_PREPARE = 40,\n\tCPUHP_HRTIMERS_PREPARE = 41,\n\tCPUHP_X2APIC_PREPARE = 42,\n\tCPUHP_SMPCFD_PREPARE = 43,\n\tCPUHP_RELAY_PREPARE = 44,\n\tCPUHP_MD_RAID5_PREPARE = 45,\n\tCPUHP_RCUTREE_PREP = 46,\n\tCPUHP_CPUIDLE_COUPLED_PREPARE = 47,\n\tCPUHP_POWERPC_PMAC_PREPARE = 48,\n\tCPUHP_POWERPC_MMU_CTX_PREPARE = 49,\n\tCPUHP_XEN_PREPARE = 50,\n\tCPUHP_XEN_EVTCHN_PREPARE = 51,\n\tCPUHP_ARM_SHMOBILE_SCU_PREPARE = 52,\n\tCPUHP_SH_SH3X_PREPARE = 53,\n\tCPUHP_TOPOLOGY_PREPARE = 54,\n\tCPUHP_NET_IUCV_PREPARE = 55,\n\tCPUHP_ARM_BL_PREPARE = 56,\n\tCPUHP_TRACE_RB_PREPARE = 57,\n\tCPUHP_MM_ZS_PREPARE = 58,\n\tCPUHP_MM_ZSWP_POOL_PREPARE = 59,\n\tCPUHP_KVM_PPC_BOOK3S_PREPARE = 60,\n\tCPUHP_ZCOMP_PREPARE = 61,\n\tCPUHP_TIMERS_PREPARE = 62,\n\tCPUHP_TMIGR_PREPARE = 63,\n\tCPUHP_MIPS_SOC_PREPARE = 64,\n\tCPUHP_BP_PREPARE_DYN = 65,\n\tCPUHP_BP_PREPARE_DYN_END = 85,\n\tCPUHP_BP_KICK_AP = 86,\n\tCPUHP_BRINGUP_CPU = 87,\n\tCPUHP_AP_IDLE_DEAD = 88,\n\tCPUHP_AP_OFFLINE = 89,\n\tCPUHP_AP_CACHECTRL_STARTING = 90,\n\tCPUHP_AP_SCHED_STARTING = 91,\n\tCPUHP_AP_RCUTREE_DYING = 92,\n\tCPUHP_AP_CPU_PM_STARTING = 93,\n\tCPUHP_AP_IRQ_GIC_STARTING = 94,\n\tCPUHP_AP_IRQ_HIP04_STARTING = 95,\n\tCPUHP_AP_IRQ_APPLE_AIC_STARTING = 96,\n\tCPUHP_AP_IRQ_ARMADA_XP_STARTING = 97,\n\tCPUHP_AP_IRQ_BCM2836_STARTING = 98,\n\tCPUHP_AP_IRQ_MIPS_GIC_STARTING = 99,\n\tCPUHP_AP_IRQ_LOONGARCH_STARTING = 100,\n\tCPUHP_AP_IRQ_SIFIVE_PLIC_STARTING = 101,\n\tCPUHP_AP_IRQ_RISCV_IMSIC_STARTING = 102,\n\tCPUHP_AP_IRQ_RISCV_SBI_IPI_STARTING = 103,\n\tCPUHP_AP_ARM_MVEBU_COHERENCY = 104,\n\tCPUHP_AP_PERF_X86_AMD_UNCORE_STARTING = 105,\n\tCPUHP_AP_PERF_X86_STARTING = 106,\n\tCPUHP_AP_PERF_X86_AMD_IBS_STARTING = 107,\n\tCPUHP_AP_PERF_X86_CSTATE_STARTING = 108,\n\tCPUHP_AP_PERF_XTENSA_STARTING = 109,\n\tCPUHP_AP_ARM_VFP_STARTING = 110,\n\tCPUHP_AP_ARM64_DEBUG_MONITORS_STARTING = 111,\n\tCPUHP_AP_PERF_ARM_HW_BREAKPOINT_STARTING = 112,\n\tCPUHP_AP_PERF_ARM_ACPI_STARTING = 113,\n\tCPUHP_AP_PERF_ARM_STARTING = 114,\n\tCPUHP_AP_PERF_RISCV_STARTING = 115,\n\tCPUHP_AP_ARM_L2X0_STARTING = 116,\n\tCPUHP_AP_EXYNOS4_MCT_TIMER_STARTING = 117,\n\tCPUHP_AP_ARM_ARCH_TIMER_STARTING = 118,\n\tCPUHP_AP_ARM_ARCH_TIMER_EVTSTRM_STARTING = 119,\n\tCPUHP_AP_ARM_GLOBAL_TIMER_STARTING = 120,\n\tCPUHP_AP_JCORE_TIMER_STARTING = 121,\n\tCPUHP_AP_ARM_TWD_STARTING = 122,\n\tCPUHP_AP_QCOM_TIMER_STARTING = 123,\n\tCPUHP_AP_TEGRA_TIMER_STARTING = 124,\n\tCPUHP_AP_ARMADA_TIMER_STARTING = 125,\n\tCPUHP_AP_MIPS_GIC_TIMER_STARTING = 126,\n\tCPUHP_AP_ARC_TIMER_STARTING = 127,\n\tCPUHP_AP_REALTEK_TIMER_STARTING = 128,\n\tCPUHP_AP_RISCV_TIMER_STARTING = 129,\n\tCPUHP_AP_CLINT_TIMER_STARTING = 130,\n\tCPUHP_AP_CSKY_TIMER_STARTING = 131,\n\tCPUHP_AP_TI_GP_TIMER_STARTING = 132,\n\tCPUHP_AP_HYPERV_TIMER_STARTING = 133,\n\tCPUHP_AP_DUMMY_TIMER_STARTING = 134,\n\tCPUHP_AP_ARM_XEN_STARTING = 135,\n\tCPUHP_AP_ARM_XEN_RUNSTATE_STARTING = 136,\n\tCPUHP_AP_ARM_CORESIGHT_STARTING = 137,\n\tCPUHP_AP_ARM_CORESIGHT_CTI_STARTING = 138,\n\tCPUHP_AP_ARM64_ISNDEP_STARTING = 139,\n\tCPUHP_AP_SMPCFD_DYING = 140,\n\tCPUHP_AP_HRTIMERS_DYING = 141,\n\tCPUHP_AP_TICK_DYING = 142,\n\tCPUHP_AP_X86_TBOOT_DYING = 143,\n\tCPUHP_AP_ARM_CACHE_B15_RAC_DYING = 144,\n\tCPUHP_AP_ONLINE = 145,\n\tCPUHP_TEARDOWN_CPU = 146,\n\tCPUHP_AP_ONLINE_IDLE = 147,\n\tCPUHP_AP_HYPERV_ONLINE = 148,\n\tCPUHP_AP_KVM_ONLINE = 149,\n\tCPUHP_AP_SCHED_WAIT_EMPTY = 150,\n\tCPUHP_AP_SMPBOOT_THREADS = 151,\n\tCPUHP_AP_IRQ_AFFINITY_ONLINE = 152,\n\tCPUHP_AP_BLK_MQ_ONLINE = 153,\n\tCPUHP_AP_ARM_MVEBU_SYNC_CLOCKS = 154,\n\tCPUHP_AP_X86_INTEL_EPB_ONLINE = 155,\n\tCPUHP_AP_PERF_ONLINE = 156,\n\tCPUHP_AP_PERF_X86_ONLINE = 157,\n\tCPUHP_AP_PERF_X86_UNCORE_ONLINE = 158,\n\tCPUHP_AP_PERF_X86_AMD_UNCORE_ONLINE = 159,\n\tCPUHP_AP_PERF_X86_AMD_POWER_ONLINE = 160,\n\tCPUHP_AP_PERF_X86_RAPL_ONLINE = 161,\n\tCPUHP_AP_PERF_X86_CSTATE_ONLINE = 162,\n\tCPUHP_AP_PERF_S390_CF_ONLINE = 163,\n\tCPUHP_AP_PERF_S390_SF_ONLINE = 164,\n\tCPUHP_AP_PERF_ARM_CCI_ONLINE = 165,\n\tCPUHP_AP_PERF_ARM_CCN_ONLINE = 166,\n\tCPUHP_AP_PERF_ARM_HISI_CPA_ONLINE = 167,\n\tCPUHP_AP_PERF_ARM_HISI_DDRC_ONLINE = 168,\n\tCPUHP_AP_PERF_ARM_HISI_HHA_ONLINE = 169,\n\tCPUHP_AP_PERF_ARM_HISI_L3_ONLINE = 170,\n\tCPUHP_AP_PERF_ARM_HISI_PA_ONLINE = 171,\n\tCPUHP_AP_PERF_ARM_HISI_SLLC_ONLINE = 172,\n\tCPUHP_AP_PERF_ARM_HISI_PCIE_PMU_ONLINE = 173,\n\tCPUHP_AP_PERF_ARM_HNS3_PMU_ONLINE = 174,\n\tCPUHP_AP_PERF_ARM_L2X0_ONLINE = 175,\n\tCPUHP_AP_PERF_ARM_QCOM_L2_ONLINE = 176,\n\tCPUHP_AP_PERF_ARM_QCOM_L3_ONLINE = 177,\n\tCPUHP_AP_PERF_ARM_APM_XGENE_ONLINE = 178,\n\tCPUHP_AP_PERF_ARM_CAVIUM_TX2_UNCORE_ONLINE = 179,\n\tCPUHP_AP_PERF_ARM_MARVELL_CN10K_DDR_ONLINE = 180,\n\tCPUHP_AP_PERF_POWERPC_NEST_IMC_ONLINE = 181,\n\tCPUHP_AP_PERF_POWERPC_CORE_IMC_ONLINE = 182,\n\tCPUHP_AP_PERF_POWERPC_THREAD_IMC_ONLINE = 183,\n\tCPUHP_AP_PERF_POWERPC_TRACE_IMC_ONLINE = 184,\n\tCPUHP_AP_PERF_POWERPC_HV_24x7_ONLINE = 185,\n\tCPUHP_AP_PERF_POWERPC_HV_GPCI_ONLINE = 186,\n\tCPUHP_AP_PERF_CSKY_ONLINE = 187,\n\tCPUHP_AP_TMIGR_ONLINE = 188,\n\tCPUHP_AP_WATCHDOG_ONLINE = 189,\n\tCPUHP_AP_WORKQUEUE_ONLINE = 190,\n\tCPUHP_AP_RANDOM_ONLINE = 191,\n\tCPUHP_AP_RCUTREE_ONLINE = 192,\n\tCPUHP_AP_BASE_CACHEINFO_ONLINE = 193,\n\tCPUHP_AP_ONLINE_DYN = 194,\n\tCPUHP_AP_ONLINE_DYN_END = 234,\n\tCPUHP_AP_X86_HPET_ONLINE = 235,\n\tCPUHP_AP_X86_KVM_CLK_ONLINE = 236,\n\tCPUHP_AP_ACTIVE = 237,\n\tCPUHP_ONLINE = 238,\n};\n\nenum cpuhp_sync_state {\n\tSYNC_STATE_DEAD = 0,\n\tSYNC_STATE_KICKED = 1,\n\tSYNC_STATE_SHOULD_DIE = 2,\n\tSYNC_STATE_ALIVE = 3,\n\tSYNC_STATE_SHOULD_ONLINE = 4,\n\tSYNC_STATE_ONLINE = 5,\n};\n\nenum cpuid_leafs {\n\tCPUID_1_EDX = 0,\n\tCPUID_8000_0001_EDX = 1,\n\tCPUID_8086_0001_EDX = 2,\n\tCPUID_LNX_1 = 3,\n\tCPUID_1_ECX = 4,\n\tCPUID_C000_0001_EDX = 5,\n\tCPUID_8000_0001_ECX = 6,\n\tCPUID_LNX_2 = 7,\n\tCPUID_LNX_3 = 8,\n\tCPUID_7_0_EBX = 9,\n\tCPUID_D_1_EAX = 10,\n\tCPUID_LNX_4 = 11,\n\tCPUID_7_1_EAX = 12,\n\tCPUID_8000_0008_EBX = 13,\n\tCPUID_6_EAX = 14,\n\tCPUID_8000_000A_EDX = 15,\n\tCPUID_7_ECX = 16,\n\tCPUID_8000_0007_EBX = 17,\n\tCPUID_7_EDX = 18,\n\tCPUID_8000_001F_EAX = 19,\n\tCPUID_8000_0021_EAX = 20,\n\tCPUID_LNX_5 = 21,\n\tNR_CPUID_WORDS = 22,\n};\n\nenum cpuid_regs_idx {\n\tCPUID_EAX = 0,\n\tCPUID_EBX = 1,\n\tCPUID_ECX = 2,\n\tCPUID_EDX = 3,\n};\n\nenum crb_cancel {\n\tCRB_CANCEL_INVOKE = 1,\n};\n\nenum crb_ctrl_req {\n\tCRB_CTRL_REQ_CMD_READY = 1,\n\tCRB_CTRL_REQ_GO_IDLE = 2,\n};\n\nenum crb_ctrl_sts {\n\tCRB_CTRL_STS_ERROR = 1,\n\tCRB_CTRL_STS_TPM_IDLE = 2,\n};\n\nenum crb_defaults {\n\tCRB_ACPI_START_REVISION_ID = 1,\n\tCRB_ACPI_START_INDEX = 1,\n};\n\nenum crb_loc_ctrl {\n\tCRB_LOC_CTRL_REQUEST_ACCESS = 1,\n\tCRB_LOC_CTRL_RELINQUISH = 2,\n};\n\nenum crb_loc_state {\n\tCRB_LOC_STATE_LOC_ASSIGNED = 2,\n\tCRB_LOC_STATE_TPM_REG_VALID_STS = 128,\n};\n\nenum crb_start {\n\tCRB_START_INVOKE = 1,\n};\n\nenum crb_status {\n\tCRB_DRV_STS_COMPLETE = 1,\n};\n\nenum criteria {\n\tCR_POWER2_ALIGNED = 0,\n\tCR_GOAL_LEN_FAST = 1,\n\tCR_BEST_AVAIL_LEN = 2,\n\tCR_GOAL_LEN_SLOW = 3,\n\tCR_ANY_FREE = 4,\n\tEXT4_MB_NUM_CRS = 5,\n};\n\nenum crypto_attr_type_t {\n\tCRYPTOCFGA_UNSPEC = 0,\n\tCRYPTOCFGA_PRIORITY_VAL = 1,\n\tCRYPTOCFGA_REPORT_LARVAL = 2,\n\tCRYPTOCFGA_REPORT_HASH = 3,\n\tCRYPTOCFGA_REPORT_BLKCIPHER = 4,\n\tCRYPTOCFGA_REPORT_AEAD = 5,\n\tCRYPTOCFGA_REPORT_COMPRESS = 6,\n\tCRYPTOCFGA_REPORT_RNG = 7,\n\tCRYPTOCFGA_REPORT_CIPHER = 8,\n\tCRYPTOCFGA_REPORT_AKCIPHER = 9,\n\tCRYPTOCFGA_REPORT_KPP = 10,\n\tCRYPTOCFGA_REPORT_ACOMP = 11,\n\tCRYPTOCFGA_STAT_LARVAL = 12,\n\tCRYPTOCFGA_STAT_HASH = 13,\n\tCRYPTOCFGA_STAT_BLKCIPHER = 14,\n\tCRYPTOCFGA_STAT_AEAD = 15,\n\tCRYPTOCFGA_STAT_COMPRESS = 16,\n\tCRYPTOCFGA_STAT_RNG = 17,\n\tCRYPTOCFGA_STAT_CIPHER = 18,\n\tCRYPTOCFGA_STAT_AKCIPHER = 19,\n\tCRYPTOCFGA_STAT_KPP = 20,\n\tCRYPTOCFGA_STAT_ACOMP = 21,\n\t__CRYPTOCFGA_MAX = 22,\n};\n\nenum ct_dccp_states {\n\tCT_DCCP_NONE = 0,\n\tCT_DCCP_REQUEST = 1,\n\tCT_DCCP_RESPOND = 2,\n\tCT_DCCP_PARTOPEN = 3,\n\tCT_DCCP_OPEN = 4,\n\tCT_DCCP_CLOSEREQ = 5,\n\tCT_DCCP_CLOSING = 6,\n\tCT_DCCP_TIMEWAIT = 7,\n\tCT_DCCP_IGNORE = 8,\n\tCT_DCCP_INVALID = 9,\n\t__CT_DCCP_MAX = 10,\n};\n\nenum ctrl_offsets {\n\tBASE_OFFSET = 0,\n\tSLOT_AVAIL1 = 4,\n\tSLOT_AVAIL2 = 8,\n\tSLOT_CONFIG = 12,\n\tSEC_BUS_CONFIG = 16,\n\tMSI_CTRL = 18,\n\tPROG_INTERFACE = 19,\n\tCMD = 20,\n\tCMD_STATUS = 22,\n\tINTR_LOC = 24,\n\tSERR_LOC = 28,\n\tSERR_INTR_ENABLE = 32,\n\tSLOT1 = 36,\n};\n\nenum ctrl_register {\n\tCTRL_IN = 0,\n\tCTRL_OUT = 1,\n};\n\nenum ctx_state {\n\tCONTEXT_DISABLED = -1,\n\tCONTEXT_KERNEL = 0,\n\tCONTEXT_IDLE = 1,\n\tCONTEXT_USER = 2,\n\tCONTEXT_GUEST = 3,\n\tCONTEXT_MAX = 4,\n};\n\nenum cxl_event_type {\n\tCXL_CPER_EVENT_GENERIC = 0,\n\tCXL_CPER_EVENT_GEN_MEDIA = 1,\n\tCXL_CPER_EVENT_DRAM = 2,\n\tCXL_CPER_EVENT_MEM_MODULE = 3,\n};\n\nenum d_real_type {\n\tD_REAL_DATA = 0,\n\tD_REAL_METADATA = 1,\n};\n\nenum d_walk_ret {\n\tD_WALK_CONTINUE = 0,\n\tD_WALK_QUIT = 1,\n\tD_WALK_NORETRY = 2,\n\tD_WALK_SKIP = 3,\n};\n\nenum da9052_chip_id {\n\tDA9052 = 0,\n\tDA9053_AA = 1,\n\tDA9053_BA = 2,\n\tDA9053_BB = 3,\n\tDA9053_BC = 4,\n};\n\nenum da9063_irqs {\n\tDA9063_IRQ_ONKEY = 0,\n\tDA9063_IRQ_ALARM = 1,\n\tDA9063_IRQ_TICK = 2,\n\tDA9063_IRQ_ADC_RDY = 3,\n\tDA9063_IRQ_SEQ_RDY = 4,\n\tDA9063_IRQ_WAKE = 5,\n\tDA9063_IRQ_TEMP = 6,\n\tDA9063_IRQ_COMP_1V2 = 7,\n\tDA9063_IRQ_LDO_LIM = 8,\n\tDA9063_IRQ_REG_UVOV = 9,\n\tDA9063_IRQ_DVC_RDY = 10,\n\tDA9063_IRQ_VDD_MON = 11,\n\tDA9063_IRQ_WARN = 12,\n\tDA9063_IRQ_GPI0 = 13,\n\tDA9063_IRQ_GPI1 = 14,\n\tDA9063_IRQ_GPI2 = 15,\n\tDA9063_IRQ_GPI3 = 16,\n\tDA9063_IRQ_GPI4 = 17,\n\tDA9063_IRQ_GPI5 = 18,\n\tDA9063_IRQ_GPI6 = 19,\n\tDA9063_IRQ_GPI7 = 20,\n\tDA9063_IRQ_GPI8 = 21,\n\tDA9063_IRQ_GPI9 = 22,\n\tDA9063_IRQ_GPI10 = 23,\n\tDA9063_IRQ_GPI11 = 24,\n\tDA9063_IRQ_GPI12 = 25,\n\tDA9063_IRQ_GPI13 = 26,\n\tDA9063_IRQ_GPI14 = 27,\n\tDA9063_IRQ_GPI15 = 28,\n};\n\nenum da9063_page_sel_buf_fmt {\n\tDA9063_PAGE_SEL_BUF_PAGE_REG = 0,\n\tDA9063_PAGE_SEL_BUF_PAGE_VAL = 1,\n\tDA9063_PAGE_SEL_BUF_SIZE = 2,\n};\n\nenum da9063_paged_read_msgs {\n\tDA9063_PAGED_READ_MSG_PAGE_SEL = 0,\n\tDA9063_PAGED_READ_MSG_REG_SEL = 1,\n\tDA9063_PAGED_READ_MSG_DATA = 2,\n\tDA9063_PAGED_READ_MSG_CNT = 3,\n};\n\nenum da9063_type {\n\tPMIC_TYPE_DA9063 = 0,\n\tPMIC_TYPE_DA9063L = 1,\n};\n\nenum da9063_variant_codes {\n\tPMIC_DA9063_AD = 3,\n\tPMIC_DA9063_BB = 5,\n\tPMIC_DA9063_CA = 6,\n\tPMIC_DA9063_DA = 7,\n\tPMIC_DA9063_EA = 8,\n};\n\nenum data_formats {\n\tDATA_FMT_DIGEST = 0,\n\tDATA_FMT_DIGEST_WITH_ALGO = 1,\n\tDATA_FMT_DIGEST_WITH_TYPE_AND_ALGO = 2,\n\tDATA_FMT_STRING = 3,\n\tDATA_FMT_HEX = 4,\n\tDATA_FMT_UINT = 5,\n};\n\nenum data_source {\n\tCM_BATTERY_PRESENT = 0,\n\tCM_NO_BATTERY = 1,\n\tCM_FUEL_GAUGE = 2,\n\tCM_CHARGER_STAT = 3,\n};\n\nenum dax_access_mode {\n\tDAX_ACCESS = 0,\n\tDAX_RECOVERY_WRITE = 1,\n};\n\nenum dax_device_flags {\n\tDAXDEV_ALIVE = 0,\n\tDAXDEV_WRITE_CACHE = 1,\n\tDAXDEV_SYNC = 2,\n\tDAXDEV_NOCACHE = 3,\n\tDAXDEV_NOMC = 4,\n};\n\nenum dax_driver_type {\n\tDAXDRV_KMEM_TYPE = 0,\n\tDAXDRV_DEVICE_TYPE = 1,\n};\n\nenum dax_wake_mode {\n\tWAKE_ALL = 0,\n\tWAKE_NEXT = 1,\n};\n\nenum dbc_state {\n\tDS_DISABLED = 0,\n\tDS_INITIALIZED = 1,\n\tDS_ENABLED = 2,\n\tDS_CONNECTED = 3,\n\tDS_CONFIGURED = 4,\n\tDS_MAX = 5,\n};\n\nenum dcb_general_attr_values {\n\tDCB_ATTR_VALUE_UNDEFINED = 255,\n};\n\nenum dcbevent_notif_type {\n\tDCB_APP_EVENT = 1,\n};\n\nenum dcbnl_app_attrs {\n\tDCB_APP_ATTR_UNDEFINED = 0,\n\tDCB_APP_ATTR_IDTYPE = 1,\n\tDCB_APP_ATTR_ID = 2,\n\tDCB_APP_ATTR_PRIORITY = 3,\n\t__DCB_APP_ATTR_ENUM_MAX = 4,\n\tDCB_APP_ATTR_MAX = 3,\n};\n\nenum dcbnl_attrs {\n\tDCB_ATTR_UNDEFINED = 0,\n\tDCB_ATTR_IFNAME = 1,\n\tDCB_ATTR_STATE = 2,\n\tDCB_ATTR_PFC_STATE = 3,\n\tDCB_ATTR_PFC_CFG = 4,\n\tDCB_ATTR_NUM_TC = 5,\n\tDCB_ATTR_PG_CFG = 6,\n\tDCB_ATTR_SET_ALL = 7,\n\tDCB_ATTR_PERM_HWADDR = 8,\n\tDCB_ATTR_CAP = 9,\n\tDCB_ATTR_NUMTCS = 10,\n\tDCB_ATTR_BCN = 11,\n\tDCB_ATTR_APP = 12,\n\tDCB_ATTR_IEEE = 13,\n\tDCB_ATTR_DCBX = 14,\n\tDCB_ATTR_FEATCFG = 15,\n\tDCB_ATTR_CEE = 16,\n\t__DCB_ATTR_ENUM_MAX = 17,\n\tDCB_ATTR_MAX = 16,\n};\n\nenum dcbnl_bcn_attrs {\n\tDCB_BCN_ATTR_UNDEFINED = 0,\n\tDCB_BCN_ATTR_RP_0 = 1,\n\tDCB_BCN_ATTR_RP_1 = 2,\n\tDCB_BCN_ATTR_RP_2 = 3,\n\tDCB_BCN_ATTR_RP_3 = 4,\n\tDCB_BCN_ATTR_RP_4 = 5,\n\tDCB_BCN_ATTR_RP_5 = 6,\n\tDCB_BCN_ATTR_RP_6 = 7,\n\tDCB_BCN_ATTR_RP_7 = 8,\n\tDCB_BCN_ATTR_RP_ALL = 9,\n\tDCB_BCN_ATTR_BCNA_0 = 10,\n\tDCB_BCN_ATTR_BCNA_1 = 11,\n\tDCB_BCN_ATTR_ALPHA = 12,\n\tDCB_BCN_ATTR_BETA = 13,\n\tDCB_BCN_ATTR_GD = 14,\n\tDCB_BCN_ATTR_GI = 15,\n\tDCB_BCN_ATTR_TMAX = 16,\n\tDCB_BCN_ATTR_TD = 17,\n\tDCB_BCN_ATTR_RMIN = 18,\n\tDCB_BCN_ATTR_W = 19,\n\tDCB_BCN_ATTR_RD = 20,\n\tDCB_BCN_ATTR_RU = 21,\n\tDCB_BCN_ATTR_WRTT = 22,\n\tDCB_BCN_ATTR_RI = 23,\n\tDCB_BCN_ATTR_C = 24,\n\tDCB_BCN_ATTR_ALL = 25,\n\t__DCB_BCN_ATTR_ENUM_MAX = 26,\n\tDCB_BCN_ATTR_MAX = 25,\n};\n\nenum dcbnl_cap_attrs {\n\tDCB_CAP_ATTR_UNDEFINED = 0,\n\tDCB_CAP_ATTR_ALL = 1,\n\tDCB_CAP_ATTR_PG = 2,\n\tDCB_CAP_ATTR_PFC = 3,\n\tDCB_CAP_ATTR_UP2TC = 4,\n\tDCB_CAP_ATTR_PG_TCS = 5,\n\tDCB_CAP_ATTR_PFC_TCS = 6,\n\tDCB_CAP_ATTR_GSP = 7,\n\tDCB_CAP_ATTR_BCN = 8,\n\tDCB_CAP_ATTR_DCBX = 9,\n\t__DCB_CAP_ATTR_ENUM_MAX = 10,\n\tDCB_CAP_ATTR_MAX = 9,\n};\n\nenum dcbnl_commands {\n\tDCB_CMD_UNDEFINED = 0,\n\tDCB_CMD_GSTATE = 1,\n\tDCB_CMD_SSTATE = 2,\n\tDCB_CMD_PGTX_GCFG = 3,\n\tDCB_CMD_PGTX_SCFG = 4,\n\tDCB_CMD_PGRX_GCFG = 5,\n\tDCB_CMD_PGRX_SCFG = 6,\n\tDCB_CMD_PFC_GCFG = 7,\n\tDCB_CMD_PFC_SCFG = 8,\n\tDCB_CMD_SET_ALL = 9,\n\tDCB_CMD_GPERM_HWADDR = 10,\n\tDCB_CMD_GCAP = 11,\n\tDCB_CMD_GNUMTCS = 12,\n\tDCB_CMD_SNUMTCS = 13,\n\tDCB_CMD_PFC_GSTATE = 14,\n\tDCB_CMD_PFC_SSTATE = 15,\n\tDCB_CMD_BCN_GCFG = 16,\n\tDCB_CMD_BCN_SCFG = 17,\n\tDCB_CMD_GAPP = 18,\n\tDCB_CMD_SAPP = 19,\n\tDCB_CMD_IEEE_SET = 20,\n\tDCB_CMD_IEEE_GET = 21,\n\tDCB_CMD_GDCBX = 22,\n\tDCB_CMD_SDCBX = 23,\n\tDCB_CMD_GFEATCFG = 24,\n\tDCB_CMD_SFEATCFG = 25,\n\tDCB_CMD_CEE_GET = 26,\n\tDCB_CMD_IEEE_DEL = 27,\n\t__DCB_CMD_ENUM_MAX = 28,\n\tDCB_CMD_MAX = 27,\n};\n\nenum dcbnl_featcfg_attrs {\n\tDCB_FEATCFG_ATTR_UNDEFINED = 0,\n\tDCB_FEATCFG_ATTR_ALL = 1,\n\tDCB_FEATCFG_ATTR_PG = 2,\n\tDCB_FEATCFG_ATTR_PFC = 3,\n\tDCB_FEATCFG_ATTR_APP = 4,\n\t__DCB_FEATCFG_ATTR_ENUM_MAX = 5,\n\tDCB_FEATCFG_ATTR_MAX = 4,\n};\n\nenum dcbnl_numtcs_attrs {\n\tDCB_NUMTCS_ATTR_UNDEFINED = 0,\n\tDCB_NUMTCS_ATTR_ALL = 1,\n\tDCB_NUMTCS_ATTR_PG = 2,\n\tDCB_NUMTCS_ATTR_PFC = 3,\n\t__DCB_NUMTCS_ATTR_ENUM_MAX = 4,\n\tDCB_NUMTCS_ATTR_MAX = 3,\n};\n\nenum dcbnl_pfc_up_attrs {\n\tDCB_PFC_UP_ATTR_UNDEFINED = 0,\n\tDCB_PFC_UP_ATTR_0 = 1,\n\tDCB_PFC_UP_ATTR_1 = 2,\n\tDCB_PFC_UP_ATTR_2 = 3,\n\tDCB_PFC_UP_ATTR_3 = 4,\n\tDCB_PFC_UP_ATTR_4 = 5,\n\tDCB_PFC_UP_ATTR_5 = 6,\n\tDCB_PFC_UP_ATTR_6 = 7,\n\tDCB_PFC_UP_ATTR_7 = 8,\n\tDCB_PFC_UP_ATTR_ALL = 9,\n\t__DCB_PFC_UP_ATTR_ENUM_MAX = 10,\n\tDCB_PFC_UP_ATTR_MAX = 9,\n};\n\nenum dcbnl_pg_attrs {\n\tDCB_PG_ATTR_UNDEFINED = 0,\n\tDCB_PG_ATTR_TC_0 = 1,\n\tDCB_PG_ATTR_TC_1 = 2,\n\tDCB_PG_ATTR_TC_2 = 3,\n\tDCB_PG_ATTR_TC_3 = 4,\n\tDCB_PG_ATTR_TC_4 = 5,\n\tDCB_PG_ATTR_TC_5 = 6,\n\tDCB_PG_ATTR_TC_6 = 7,\n\tDCB_PG_ATTR_TC_7 = 8,\n\tDCB_PG_ATTR_TC_MAX = 9,\n\tDCB_PG_ATTR_TC_ALL = 10,\n\tDCB_PG_ATTR_BW_ID_0 = 11,\n\tDCB_PG_ATTR_BW_ID_1 = 12,\n\tDCB_PG_ATTR_BW_ID_2 = 13,\n\tDCB_PG_ATTR_BW_ID_3 = 14,\n\tDCB_PG_ATTR_BW_ID_4 = 15,\n\tDCB_PG_ATTR_BW_ID_5 = 16,\n\tDCB_PG_ATTR_BW_ID_6 = 17,\n\tDCB_PG_ATTR_BW_ID_7 = 18,\n\tDCB_PG_ATTR_BW_ID_MAX = 19,\n\tDCB_PG_ATTR_BW_ID_ALL = 20,\n\t__DCB_PG_ATTR_ENUM_MAX = 21,\n\tDCB_PG_ATTR_MAX = 20,\n};\n\nenum dcbnl_tc_attrs {\n\tDCB_TC_ATTR_PARAM_UNDEFINED = 0,\n\tDCB_TC_ATTR_PARAM_PGID = 1,\n\tDCB_TC_ATTR_PARAM_UP_MAPPING = 2,\n\tDCB_TC_ATTR_PARAM_STRICT_PRIO = 3,\n\tDCB_TC_ATTR_PARAM_BW_PCT = 4,\n\tDCB_TC_ATTR_PARAM_ALL = 5,\n\t__DCB_TC_ATTR_PARAM_ENUM_MAX = 6,\n\tDCB_TC_ATTR_PARAM_MAX = 5,\n};\n\nenum dccp_state {\n\tDCCP_OPEN = 1,\n\tDCCP_REQUESTING = 2,\n\tDCCP_LISTEN = 10,\n\tDCCP_RESPOND = 3,\n\tDCCP_ACTIVE_CLOSEREQ = 4,\n\tDCCP_PASSIVE_CLOSE = 8,\n\tDCCP_CLOSING = 11,\n\tDCCP_TIME_WAIT = 6,\n\tDCCP_CLOSED = 7,\n\tDCCP_NEW_SYN_RECV = 12,\n\tDCCP_PARTOPEN = 14,\n\tDCCP_PASSIVE_CLOSEREQ = 15,\n\tDCCP_MAX_STATES = 16,\n};\n\nenum dd_data_dir {\n\tDD_READ = 0,\n\tDD_WRITE = 1,\n};\n\nenum dd_prio {\n\tDD_RT_PRIO = 0,\n\tDD_BE_PRIO = 1,\n\tDD_IDLE_PRIO = 2,\n\tDD_PRIO_MAX = 2,\n};\n\nenum dentry_d_lock_class {\n\tDENTRY_D_LOCK_NORMAL = 0,\n\tDENTRY_D_LOCK_NESTED = 1,\n};\n\nenum depot_counter_id {\n\tDEPOT_COUNTER_REFD_ALLOCS = 0,\n\tDEPOT_COUNTER_REFD_FREES = 1,\n\tDEPOT_COUNTER_REFD_INUSE = 2,\n\tDEPOT_COUNTER_FREELIST_SIZE = 3,\n\tDEPOT_COUNTER_PERSIST_COUNT = 4,\n\tDEPOT_COUNTER_PERSIST_BYTES = 5,\n\tDEPOT_COUNTER_COUNT = 6,\n};\n\nenum derived_key_type {\n\tENC_KEY = 0,\n\tAUTH_KEY = 1,\n};\n\nenum desc_state {\n\tdesc_miss = -1,\n\tdesc_reserved = 0,\n\tdesc_committed = 1,\n\tdesc_finalized = 2,\n\tdesc_reusable = 3,\n};\n\nenum dev_dma_attr {\n\tDEV_DMA_NOT_SUPPORTED = 0,\n\tDEV_DMA_NON_COHERENT = 1,\n\tDEV_DMA_COHERENT = 2,\n};\n\nenum dev_pm_opp_event {\n\tOPP_EVENT_ADD = 0,\n\tOPP_EVENT_REMOVE = 1,\n\tOPP_EVENT_ENABLE = 2,\n\tOPP_EVENT_DISABLE = 3,\n\tOPP_EVENT_ADJUST_VOLTAGE = 4,\n};\n\nenum dev_pm_qos_req_type {\n\tDEV_PM_QOS_RESUME_LATENCY = 1,\n\tDEV_PM_QOS_LATENCY_TOLERANCE = 2,\n\tDEV_PM_QOS_MIN_FREQUENCY = 3,\n\tDEV_PM_QOS_MAX_FREQUENCY = 4,\n\tDEV_PM_QOS_FLAGS = 5,\n};\n\nenum dev_prop_type {\n\tDEV_PROP_U8 = 0,\n\tDEV_PROP_U16 = 1,\n\tDEV_PROP_U32 = 2,\n\tDEV_PROP_U64 = 3,\n\tDEV_PROP_STRING = 4,\n\tDEV_PROP_REF = 5,\n};\n\nenum dev_type {\n\tDEV_UNKNOWN = 0,\n\tDEV_X1 = 1,\n\tDEV_X2 = 2,\n\tDEV_X4 = 3,\n\tDEV_X8 = 4,\n\tDEV_X16 = 5,\n\tDEV_X32 = 6,\n\tDEV_X64 = 7,\n};\n\nenum devcg_behavior {\n\tDEVCG_DEFAULT_NONE = 0,\n\tDEVCG_DEFAULT_ALLOW = 1,\n\tDEVCG_DEFAULT_DENY = 2,\n};\n\nenum devfreq_parent_dev_type {\n\tDEVFREQ_PARENT_DEV = 0,\n\tCPUFREQ_PARENT_DEV = 1,\n};\n\nenum devfreq_timer {\n\tDEVFREQ_TIMER_DEFERRABLE = 0,\n\tDEVFREQ_TIMER_DELAYED = 1,\n\tDEVFREQ_TIMER_NUM = 2,\n};\n\nenum device_link_state {\n\tDL_STATE_NONE = -1,\n\tDL_STATE_DORMANT = 0,\n\tDL_STATE_AVAILABLE = 1,\n\tDL_STATE_CONSUMER_PROBE = 2,\n\tDL_STATE_ACTIVE = 3,\n\tDL_STATE_SUPPLIER_UNBIND = 4,\n};\n\nenum device_physical_location_horizontal_position {\n\tDEVICE_HORI_POS_LEFT = 0,\n\tDEVICE_HORI_POS_CENTER = 1,\n\tDEVICE_HORI_POS_RIGHT = 2,\n};\n\nenum device_physical_location_panel {\n\tDEVICE_PANEL_TOP = 0,\n\tDEVICE_PANEL_BOTTOM = 1,\n\tDEVICE_PANEL_LEFT = 2,\n\tDEVICE_PANEL_RIGHT = 3,\n\tDEVICE_PANEL_FRONT = 4,\n\tDEVICE_PANEL_BACK = 5,\n\tDEVICE_PANEL_UNKNOWN = 6,\n};\n\nenum device_physical_location_vertical_position {\n\tDEVICE_VERT_POS_UPPER = 0,\n\tDEVICE_VERT_POS_CENTER = 1,\n\tDEVICE_VERT_POS_LOWER = 2,\n};\n\nenum device_removable {\n\tDEVICE_REMOVABLE_NOT_SUPPORTED = 0,\n\tDEVICE_REMOVABLE_UNKNOWN = 1,\n\tDEVICE_FIXED = 2,\n\tDEVICE_REMOVABLE = 3,\n};\n\nenum devkmsg_log_bits {\n\t__DEVKMSG_LOG_BIT_ON = 0,\n\t__DEVKMSG_LOG_BIT_OFF = 1,\n\t__DEVKMSG_LOG_BIT_LOCK = 2,\n};\n\nenum devkmsg_log_masks {\n\tDEVKMSG_LOG_MASK_ON = 1,\n\tDEVKMSG_LOG_MASK_OFF = 2,\n\tDEVKMSG_LOG_MASK_LOCK = 4,\n};\n\nenum devlink_attr {\n\tDEVLINK_ATTR_UNSPEC = 0,\n\tDEVLINK_ATTR_BUS_NAME = 1,\n\tDEVLINK_ATTR_DEV_NAME = 2,\n\tDEVLINK_ATTR_PORT_INDEX = 3,\n\tDEVLINK_ATTR_PORT_TYPE = 4,\n\tDEVLINK_ATTR_PORT_DESIRED_TYPE = 5,\n\tDEVLINK_ATTR_PORT_NETDEV_IFINDEX = 6,\n\tDEVLINK_ATTR_PORT_NETDEV_NAME = 7,\n\tDEVLINK_ATTR_PORT_IBDEV_NAME = 8,\n\tDEVLINK_ATTR_PORT_SPLIT_COUNT = 9,\n\tDEVLINK_ATTR_PORT_SPLIT_GROUP = 10,\n\tDEVLINK_ATTR_SB_INDEX = 11,\n\tDEVLINK_ATTR_SB_SIZE = 12,\n\tDEVLINK_ATTR_SB_INGRESS_POOL_COUNT = 13,\n\tDEVLINK_ATTR_SB_EGRESS_POOL_COUNT = 14,\n\tDEVLINK_ATTR_SB_INGRESS_TC_COUNT = 15,\n\tDEVLINK_ATTR_SB_EGRESS_TC_COUNT = 16,\n\tDEVLINK_ATTR_SB_POOL_INDEX = 17,\n\tDEVLINK_ATTR_SB_POOL_TYPE = 18,\n\tDEVLINK_ATTR_SB_POOL_SIZE = 19,\n\tDEVLINK_ATTR_SB_POOL_THRESHOLD_TYPE = 20,\n\tDEVLINK_ATTR_SB_THRESHOLD = 21,\n\tDEVLINK_ATTR_SB_TC_INDEX = 22,\n\tDEVLINK_ATTR_SB_OCC_CUR = 23,\n\tDEVLINK_ATTR_SB_OCC_MAX = 24,\n\tDEVLINK_ATTR_ESWITCH_MODE = 25,\n\tDEVLINK_ATTR_ESWITCH_INLINE_MODE = 26,\n\tDEVLINK_ATTR_DPIPE_TABLES = 27,\n\tDEVLINK_ATTR_DPIPE_TABLE = 28,\n\tDEVLINK_ATTR_DPIPE_TABLE_NAME = 29,\n\tDEVLINK_ATTR_DPIPE_TABLE_SIZE = 30,\n\tDEVLINK_ATTR_DPIPE_TABLE_MATCHES = 31,\n\tDEVLINK_ATTR_DPIPE_TABLE_ACTIONS = 32,\n\tDEVLINK_ATTR_DPIPE_TABLE_COUNTERS_ENABLED = 33,\n\tDEVLINK_ATTR_DPIPE_ENTRIES = 34,\n\tDEVLINK_ATTR_DPIPE_ENTRY = 35,\n\tDEVLINK_ATTR_DPIPE_ENTRY_INDEX = 36,\n\tDEVLINK_ATTR_DPIPE_ENTRY_MATCH_VALUES = 37,\n\tDEVLINK_ATTR_DPIPE_ENTRY_ACTION_VALUES = 38,\n\tDEVLINK_ATTR_DPIPE_ENTRY_COUNTER = 39,\n\tDEVLINK_ATTR_DPIPE_MATCH = 40,\n\tDEVLINK_ATTR_DPIPE_MATCH_VALUE = 41,\n\tDEVLINK_ATTR_DPIPE_MATCH_TYPE = 42,\n\tDEVLINK_ATTR_DPIPE_ACTION = 43,\n\tDEVLINK_ATTR_DPIPE_ACTION_VALUE = 44,\n\tDEVLINK_ATTR_DPIPE_ACTION_TYPE = 45,\n\tDEVLINK_ATTR_DPIPE_VALUE = 46,\n\tDEVLINK_ATTR_DPIPE_VALUE_MASK = 47,\n\tDEVLINK_ATTR_DPIPE_VALUE_MAPPING = 48,\n\tDEVLINK_ATTR_DPIPE_HEADERS = 49,\n\tDEVLINK_ATTR_DPIPE_HEADER = 50,\n\tDEVLINK_ATTR_DPIPE_HEADER_NAME = 51,\n\tDEVLINK_ATTR_DPIPE_HEADER_ID = 52,\n\tDEVLINK_ATTR_DPIPE_HEADER_FIELDS = 53,\n\tDEVLINK_ATTR_DPIPE_HEADER_GLOBAL = 54,\n\tDEVLINK_ATTR_DPIPE_HEADER_INDEX = 55,\n\tDEVLINK_ATTR_DPIPE_FIELD = 56,\n\tDEVLINK_ATTR_DPIPE_FIELD_NAME = 57,\n\tDEVLINK_ATTR_DPIPE_FIELD_ID = 58,\n\tDEVLINK_ATTR_DPIPE_FIELD_BITWIDTH = 59,\n\tDEVLINK_ATTR_DPIPE_FIELD_MAPPING_TYPE = 60,\n\tDEVLINK_ATTR_PAD = 61,\n\tDEVLINK_ATTR_ESWITCH_ENCAP_MODE = 62,\n\tDEVLINK_ATTR_RESOURCE_LIST = 63,\n\tDEVLINK_ATTR_RESOURCE = 64,\n\tDEVLINK_ATTR_RESOURCE_NAME = 65,\n\tDEVLINK_ATTR_RESOURCE_ID = 66,\n\tDEVLINK_ATTR_RESOURCE_SIZE = 67,\n\tDEVLINK_ATTR_RESOURCE_SIZE_NEW = 68,\n\tDEVLINK_ATTR_RESOURCE_SIZE_VALID = 69,\n\tDEVLINK_ATTR_RESOURCE_SIZE_MIN = 70,\n\tDEVLINK_ATTR_RESOURCE_SIZE_MAX = 71,\n\tDEVLINK_ATTR_RESOURCE_SIZE_GRAN = 72,\n\tDEVLINK_ATTR_RESOURCE_UNIT = 73,\n\tDEVLINK_ATTR_RESOURCE_OCC = 74,\n\tDEVLINK_ATTR_DPIPE_TABLE_RESOURCE_ID = 75,\n\tDEVLINK_ATTR_DPIPE_TABLE_RESOURCE_UNITS = 76,\n\tDEVLINK_ATTR_PORT_FLAVOUR = 77,\n\tDEVLINK_ATTR_PORT_NUMBER = 78,\n\tDEVLINK_ATTR_PORT_SPLIT_SUBPORT_NUMBER = 79,\n\tDEVLINK_ATTR_PARAM = 80,\n\tDEVLINK_ATTR_PARAM_NAME = 81,\n\tDEVLINK_ATTR_PARAM_GENERIC = 82,\n\tDEVLINK_ATTR_PARAM_TYPE = 83,\n\tDEVLINK_ATTR_PARAM_VALUES_LIST = 84,\n\tDEVLINK_ATTR_PARAM_VALUE = 85,\n\tDEVLINK_ATTR_PARAM_VALUE_DATA = 86,\n\tDEVLINK_ATTR_PARAM_VALUE_CMODE = 87,\n\tDEVLINK_ATTR_REGION_NAME = 88,\n\tDEVLINK_ATTR_REGION_SIZE = 89,\n\tDEVLINK_ATTR_REGION_SNAPSHOTS = 90,\n\tDEVLINK_ATTR_REGION_SNAPSHOT = 91,\n\tDEVLINK_ATTR_REGION_SNAPSHOT_ID = 92,\n\tDEVLINK_ATTR_REGION_CHUNKS = 93,\n\tDEVLINK_ATTR_REGION_CHUNK = 94,\n\tDEVLINK_ATTR_REGION_CHUNK_DATA = 95,\n\tDEVLINK_ATTR_REGION_CHUNK_ADDR = 96,\n\tDEVLINK_ATTR_REGION_CHUNK_LEN = 97,\n\tDEVLINK_ATTR_INFO_DRIVER_NAME = 98,\n\tDEVLINK_ATTR_INFO_SERIAL_NUMBER = 99,\n\tDEVLINK_ATTR_INFO_VERSION_FIXED = 100,\n\tDEVLINK_ATTR_INFO_VERSION_RUNNING = 101,\n\tDEVLINK_ATTR_INFO_VERSION_STORED = 102,\n\tDEVLINK_ATTR_INFO_VERSION_NAME = 103,\n\tDEVLINK_ATTR_INFO_VERSION_VALUE = 104,\n\tDEVLINK_ATTR_SB_POOL_CELL_SIZE = 105,\n\tDEVLINK_ATTR_FMSG = 106,\n\tDEVLINK_ATTR_FMSG_OBJ_NEST_START = 107,\n\tDEVLINK_ATTR_FMSG_PAIR_NEST_START = 108,\n\tDEVLINK_ATTR_FMSG_ARR_NEST_START = 109,\n\tDEVLINK_ATTR_FMSG_NEST_END = 110,\n\tDEVLINK_ATTR_FMSG_OBJ_NAME = 111,\n\tDEVLINK_ATTR_FMSG_OBJ_VALUE_TYPE = 112,\n\tDEVLINK_ATTR_FMSG_OBJ_VALUE_DATA = 113,\n\tDEVLINK_ATTR_HEALTH_REPORTER = 114,\n\tDEVLINK_ATTR_HEALTH_REPORTER_NAME = 115,\n\tDEVLINK_ATTR_HEALTH_REPORTER_STATE = 116,\n\tDEVLINK_ATTR_HEALTH_REPORTER_ERR_COUNT = 117,\n\tDEVLINK_ATTR_HEALTH_REPORTER_RECOVER_COUNT = 118,\n\tDEVLINK_ATTR_HEALTH_REPORTER_DUMP_TS = 119,\n\tDEVLINK_ATTR_HEALTH_REPORTER_GRACEFUL_PERIOD = 120,\n\tDEVLINK_ATTR_HEALTH_REPORTER_AUTO_RECOVER = 121,\n\tDEVLINK_ATTR_FLASH_UPDATE_FILE_NAME = 122,\n\tDEVLINK_ATTR_FLASH_UPDATE_COMPONENT = 123,\n\tDEVLINK_ATTR_FLASH_UPDATE_STATUS_MSG = 124,\n\tDEVLINK_ATTR_FLASH_UPDATE_STATUS_DONE = 125,\n\tDEVLINK_ATTR_FLASH_UPDATE_STATUS_TOTAL = 126,\n\tDEVLINK_ATTR_PORT_PCI_PF_NUMBER = 127,\n\tDEVLINK_ATTR_PORT_PCI_VF_NUMBER = 128,\n\tDEVLINK_ATTR_STATS = 129,\n\tDEVLINK_ATTR_TRAP_NAME = 130,\n\tDEVLINK_ATTR_TRAP_ACTION = 131,\n\tDEVLINK_ATTR_TRAP_TYPE = 132,\n\tDEVLINK_ATTR_TRAP_GENERIC = 133,\n\tDEVLINK_ATTR_TRAP_METADATA = 134,\n\tDEVLINK_ATTR_TRAP_GROUP_NAME = 135,\n\tDEVLINK_ATTR_RELOAD_FAILED = 136,\n\tDEVLINK_ATTR_HEALTH_REPORTER_DUMP_TS_NS = 137,\n\tDEVLINK_ATTR_NETNS_FD = 138,\n\tDEVLINK_ATTR_NETNS_PID = 139,\n\tDEVLINK_ATTR_NETNS_ID = 140,\n\tDEVLINK_ATTR_HEALTH_REPORTER_AUTO_DUMP = 141,\n\tDEVLINK_ATTR_TRAP_POLICER_ID = 142,\n\tDEVLINK_ATTR_TRAP_POLICER_RATE = 143,\n\tDEVLINK_ATTR_TRAP_POLICER_BURST = 144,\n\tDEVLINK_ATTR_PORT_FUNCTION = 145,\n\tDEVLINK_ATTR_INFO_BOARD_SERIAL_NUMBER = 146,\n\tDEVLINK_ATTR_PORT_LANES = 147,\n\tDEVLINK_ATTR_PORT_SPLITTABLE = 148,\n\tDEVLINK_ATTR_PORT_EXTERNAL = 149,\n\tDEVLINK_ATTR_PORT_CONTROLLER_NUMBER = 150,\n\tDEVLINK_ATTR_FLASH_UPDATE_STATUS_TIMEOUT = 151,\n\tDEVLINK_ATTR_FLASH_UPDATE_OVERWRITE_MASK = 152,\n\tDEVLINK_ATTR_RELOAD_ACTION = 153,\n\tDEVLINK_ATTR_RELOAD_ACTIONS_PERFORMED = 154,\n\tDEVLINK_ATTR_RELOAD_LIMITS = 155,\n\tDEVLINK_ATTR_DEV_STATS = 156,\n\tDEVLINK_ATTR_RELOAD_STATS = 157,\n\tDEVLINK_ATTR_RELOAD_STATS_ENTRY = 158,\n\tDEVLINK_ATTR_RELOAD_STATS_LIMIT = 159,\n\tDEVLINK_ATTR_RELOAD_STATS_VALUE = 160,\n\tDEVLINK_ATTR_REMOTE_RELOAD_STATS = 161,\n\tDEVLINK_ATTR_RELOAD_ACTION_INFO = 162,\n\tDEVLINK_ATTR_RELOAD_ACTION_STATS = 163,\n\tDEVLINK_ATTR_PORT_PCI_SF_NUMBER = 164,\n\tDEVLINK_ATTR_RATE_TYPE = 165,\n\tDEVLINK_ATTR_RATE_TX_SHARE = 166,\n\tDEVLINK_ATTR_RATE_TX_MAX = 167,\n\tDEVLINK_ATTR_RATE_NODE_NAME = 168,\n\tDEVLINK_ATTR_RATE_PARENT_NODE_NAME = 169,\n\tDEVLINK_ATTR_REGION_MAX_SNAPSHOTS = 170,\n\tDEVLINK_ATTR_LINECARD_INDEX = 171,\n\tDEVLINK_ATTR_LINECARD_STATE = 172,\n\tDEVLINK_ATTR_LINECARD_TYPE = 173,\n\tDEVLINK_ATTR_LINECARD_SUPPORTED_TYPES = 174,\n\tDEVLINK_ATTR_NESTED_DEVLINK = 175,\n\tDEVLINK_ATTR_SELFTESTS = 176,\n\tDEVLINK_ATTR_RATE_TX_PRIORITY = 177,\n\tDEVLINK_ATTR_RATE_TX_WEIGHT = 178,\n\tDEVLINK_ATTR_REGION_DIRECT = 179,\n\t__DEVLINK_ATTR_MAX = 180,\n\tDEVLINK_ATTR_MAX = 179,\n};\n\nenum devlink_attr_selftest_id {\n\tDEVLINK_ATTR_SELFTEST_ID_UNSPEC = 0,\n\tDEVLINK_ATTR_SELFTEST_ID_FLASH = 1,\n\t__DEVLINK_ATTR_SELFTEST_ID_MAX = 2,\n\tDEVLINK_ATTR_SELFTEST_ID_MAX = 1,\n};\n\nenum devlink_attr_selftest_result {\n\tDEVLINK_ATTR_SELFTEST_RESULT_UNSPEC = 0,\n\tDEVLINK_ATTR_SELFTEST_RESULT = 1,\n\tDEVLINK_ATTR_SELFTEST_RESULT_ID = 2,\n\tDEVLINK_ATTR_SELFTEST_RESULT_STATUS = 3,\n\t__DEVLINK_ATTR_SELFTEST_RESULT_MAX = 4,\n\tDEVLINK_ATTR_SELFTEST_RESULT_MAX = 3,\n};\n\nenum devlink_command {\n\tDEVLINK_CMD_UNSPEC = 0,\n\tDEVLINK_CMD_GET = 1,\n\tDEVLINK_CMD_SET = 2,\n\tDEVLINK_CMD_NEW = 3,\n\tDEVLINK_CMD_DEL = 4,\n\tDEVLINK_CMD_PORT_GET = 5,\n\tDEVLINK_CMD_PORT_SET = 6,\n\tDEVLINK_CMD_PORT_NEW = 7,\n\tDEVLINK_CMD_PORT_DEL = 8,\n\tDEVLINK_CMD_PORT_SPLIT = 9,\n\tDEVLINK_CMD_PORT_UNSPLIT = 10,\n\tDEVLINK_CMD_SB_GET = 11,\n\tDEVLINK_CMD_SB_SET = 12,\n\tDEVLINK_CMD_SB_NEW = 13,\n\tDEVLINK_CMD_SB_DEL = 14,\n\tDEVLINK_CMD_SB_POOL_GET = 15,\n\tDEVLINK_CMD_SB_POOL_SET = 16,\n\tDEVLINK_CMD_SB_POOL_NEW = 17,\n\tDEVLINK_CMD_SB_POOL_DEL = 18,\n\tDEVLINK_CMD_SB_PORT_POOL_GET = 19,\n\tDEVLINK_CMD_SB_PORT_POOL_SET = 20,\n\tDEVLINK_CMD_SB_PORT_POOL_NEW = 21,\n\tDEVLINK_CMD_SB_PORT_POOL_DEL = 22,\n\tDEVLINK_CMD_SB_TC_POOL_BIND_GET = 23,\n\tDEVLINK_CMD_SB_TC_POOL_BIND_SET = 24,\n\tDEVLINK_CMD_SB_TC_POOL_BIND_NEW = 25,\n\tDEVLINK_CMD_SB_TC_POOL_BIND_DEL = 26,\n\tDEVLINK_CMD_SB_OCC_SNAPSHOT = 27,\n\tDEVLINK_CMD_SB_OCC_MAX_CLEAR = 28,\n\tDEVLINK_CMD_ESWITCH_GET = 29,\n\tDEVLINK_CMD_ESWITCH_SET = 30,\n\tDEVLINK_CMD_DPIPE_TABLE_GET = 31,\n\tDEVLINK_CMD_DPIPE_ENTRIES_GET = 32,\n\tDEVLINK_CMD_DPIPE_HEADERS_GET = 33,\n\tDEVLINK_CMD_DPIPE_TABLE_COUNTERS_SET = 34,\n\tDEVLINK_CMD_RESOURCE_SET = 35,\n\tDEVLINK_CMD_RESOURCE_DUMP = 36,\n\tDEVLINK_CMD_RELOAD = 37,\n\tDEVLINK_CMD_PARAM_GET = 38,\n\tDEVLINK_CMD_PARAM_SET = 39,\n\tDEVLINK_CMD_PARAM_NEW = 40,\n\tDEVLINK_CMD_PARAM_DEL = 41,\n\tDEVLINK_CMD_REGION_GET = 42,\n\tDEVLINK_CMD_REGION_SET = 43,\n\tDEVLINK_CMD_REGION_NEW = 44,\n\tDEVLINK_CMD_REGION_DEL = 45,\n\tDEVLINK_CMD_REGION_READ = 46,\n\tDEVLINK_CMD_PORT_PARAM_GET = 47,\n\tDEVLINK_CMD_PORT_PARAM_SET = 48,\n\tDEVLINK_CMD_PORT_PARAM_NEW = 49,\n\tDEVLINK_CMD_PORT_PARAM_DEL = 50,\n\tDEVLINK_CMD_INFO_GET = 51,\n\tDEVLINK_CMD_HEALTH_REPORTER_GET = 52,\n\tDEVLINK_CMD_HEALTH_REPORTER_SET = 53,\n\tDEVLINK_CMD_HEALTH_REPORTER_RECOVER = 54,\n\tDEVLINK_CMD_HEALTH_REPORTER_DIAGNOSE = 55,\n\tDEVLINK_CMD_HEALTH_REPORTER_DUMP_GET = 56,\n\tDEVLINK_CMD_HEALTH_REPORTER_DUMP_CLEAR = 57,\n\tDEVLINK_CMD_FLASH_UPDATE = 58,\n\tDEVLINK_CMD_FLASH_UPDATE_END = 59,\n\tDEVLINK_CMD_FLASH_UPDATE_STATUS = 60,\n\tDEVLINK_CMD_TRAP_GET = 61,\n\tDEVLINK_CMD_TRAP_SET = 62,\n\tDEVLINK_CMD_TRAP_NEW = 63,\n\tDEVLINK_CMD_TRAP_DEL = 64,\n\tDEVLINK_CMD_TRAP_GROUP_GET = 65,\n\tDEVLINK_CMD_TRAP_GROUP_SET = 66,\n\tDEVLINK_CMD_TRAP_GROUP_NEW = 67,\n\tDEVLINK_CMD_TRAP_GROUP_DEL = 68,\n\tDEVLINK_CMD_TRAP_POLICER_GET = 69,\n\tDEVLINK_CMD_TRAP_POLICER_SET = 70,\n\tDEVLINK_CMD_TRAP_POLICER_NEW = 71,\n\tDEVLINK_CMD_TRAP_POLICER_DEL = 72,\n\tDEVLINK_CMD_HEALTH_REPORTER_TEST = 73,\n\tDEVLINK_CMD_RATE_GET = 74,\n\tDEVLINK_CMD_RATE_SET = 75,\n\tDEVLINK_CMD_RATE_NEW = 76,\n\tDEVLINK_CMD_RATE_DEL = 77,\n\tDEVLINK_CMD_LINECARD_GET = 78,\n\tDEVLINK_CMD_LINECARD_SET = 79,\n\tDEVLINK_CMD_LINECARD_NEW = 80,\n\tDEVLINK_CMD_LINECARD_DEL = 81,\n\tDEVLINK_CMD_SELFTESTS_GET = 82,\n\tDEVLINK_CMD_SELFTESTS_RUN = 83,\n\tDEVLINK_CMD_NOTIFY_FILTER_SET = 84,\n\t__DEVLINK_CMD_MAX = 85,\n\tDEVLINK_CMD_MAX = 84,\n};\n\nenum devlink_dpipe_action_type {\n\tDEVLINK_DPIPE_ACTION_TYPE_FIELD_MODIFY = 0,\n};\n\nenum devlink_dpipe_field_ethernet_id {\n\tDEVLINK_DPIPE_FIELD_ETHERNET_DST_MAC = 0,\n};\n\nenum devlink_dpipe_field_ipv4_id {\n\tDEVLINK_DPIPE_FIELD_IPV4_DST_IP = 0,\n};\n\nenum devlink_dpipe_field_ipv6_id {\n\tDEVLINK_DPIPE_FIELD_IPV6_DST_IP = 0,\n};\n\nenum devlink_dpipe_field_mapping_type {\n\tDEVLINK_DPIPE_FIELD_MAPPING_TYPE_NONE = 0,\n\tDEVLINK_DPIPE_FIELD_MAPPING_TYPE_IFINDEX = 1,\n};\n\nenum devlink_dpipe_header_id {\n\tDEVLINK_DPIPE_HEADER_ETHERNET = 0,\n\tDEVLINK_DPIPE_HEADER_IPV4 = 1,\n\tDEVLINK_DPIPE_HEADER_IPV6 = 2,\n};\n\nenum devlink_dpipe_match_type {\n\tDEVLINK_DPIPE_MATCH_TYPE_FIELD_EXACT = 0,\n};\n\nenum devlink_eswitch_encap_mode {\n\tDEVLINK_ESWITCH_ENCAP_MODE_NONE = 0,\n\tDEVLINK_ESWITCH_ENCAP_MODE_BASIC = 1,\n};\n\nenum devlink_health_reporter_state {\n\tDEVLINK_HEALTH_REPORTER_STATE_HEALTHY = 0,\n\tDEVLINK_HEALTH_REPORTER_STATE_ERROR = 1,\n};\n\nenum devlink_info_version_type {\n\tDEVLINK_INFO_VERSION_TYPE_NONE = 0,\n\tDEVLINK_INFO_VERSION_TYPE_COMPONENT = 1,\n};\n\nenum devlink_linecard_state {\n\tDEVLINK_LINECARD_STATE_UNSPEC = 0,\n\tDEVLINK_LINECARD_STATE_UNPROVISIONED = 1,\n\tDEVLINK_LINECARD_STATE_UNPROVISIONING = 2,\n\tDEVLINK_LINECARD_STATE_PROVISIONING = 3,\n\tDEVLINK_LINECARD_STATE_PROVISIONING_FAILED = 4,\n\tDEVLINK_LINECARD_STATE_PROVISIONED = 5,\n\tDEVLINK_LINECARD_STATE_ACTIVE = 6,\n\t__DEVLINK_LINECARD_STATE_MAX = 7,\n\tDEVLINK_LINECARD_STATE_MAX = 6,\n};\n\nenum devlink_multicast_groups {\n\tDEVLINK_MCGRP_CONFIG = 0,\n};\n\nenum devlink_param_cmode {\n\tDEVLINK_PARAM_CMODE_RUNTIME = 0,\n\tDEVLINK_PARAM_CMODE_DRIVERINIT = 1,\n\tDEVLINK_PARAM_CMODE_PERMANENT = 2,\n\t__DEVLINK_PARAM_CMODE_MAX = 3,\n\tDEVLINK_PARAM_CMODE_MAX = 2,\n};\n\nenum devlink_param_generic_id {\n\tDEVLINK_PARAM_GENERIC_ID_INT_ERR_RESET = 0,\n\tDEVLINK_PARAM_GENERIC_ID_MAX_MACS = 1,\n\tDEVLINK_PARAM_GENERIC_ID_ENABLE_SRIOV = 2,\n\tDEVLINK_PARAM_GENERIC_ID_REGION_SNAPSHOT = 3,\n\tDEVLINK_PARAM_GENERIC_ID_IGNORE_ARI = 4,\n\tDEVLINK_PARAM_GENERIC_ID_MSIX_VEC_PER_PF_MAX = 5,\n\tDEVLINK_PARAM_GENERIC_ID_MSIX_VEC_PER_PF_MIN = 6,\n\tDEVLINK_PARAM_GENERIC_ID_FW_LOAD_POLICY = 7,\n\tDEVLINK_PARAM_GENERIC_ID_RESET_DEV_ON_DRV_PROBE = 8,\n\tDEVLINK_PARAM_GENERIC_ID_ENABLE_ROCE = 9,\n\tDEVLINK_PARAM_GENERIC_ID_ENABLE_REMOTE_DEV_RESET = 10,\n\tDEVLINK_PARAM_GENERIC_ID_ENABLE_ETH = 11,\n\tDEVLINK_PARAM_GENERIC_ID_ENABLE_RDMA = 12,\n\tDEVLINK_PARAM_GENERIC_ID_ENABLE_VNET = 13,\n\tDEVLINK_PARAM_GENERIC_ID_ENABLE_IWARP = 14,\n\tDEVLINK_PARAM_GENERIC_ID_IO_EQ_SIZE = 15,\n\tDEVLINK_PARAM_GENERIC_ID_EVENT_EQ_SIZE = 16,\n\t__DEVLINK_PARAM_GENERIC_ID_MAX = 17,\n\tDEVLINK_PARAM_GENERIC_ID_MAX = 16,\n};\n\nenum devlink_param_type {\n\tDEVLINK_PARAM_TYPE_U8 = 0,\n\tDEVLINK_PARAM_TYPE_U16 = 1,\n\tDEVLINK_PARAM_TYPE_U32 = 2,\n\tDEVLINK_PARAM_TYPE_STRING = 3,\n\tDEVLINK_PARAM_TYPE_BOOL = 4,\n};\n\nenum devlink_port_flavour {\n\tDEVLINK_PORT_FLAVOUR_PHYSICAL = 0,\n\tDEVLINK_PORT_FLAVOUR_CPU = 1,\n\tDEVLINK_PORT_FLAVOUR_DSA = 2,\n\tDEVLINK_PORT_FLAVOUR_PCI_PF = 3,\n\tDEVLINK_PORT_FLAVOUR_PCI_VF = 4,\n\tDEVLINK_PORT_FLAVOUR_VIRTUAL = 5,\n\tDEVLINK_PORT_FLAVOUR_UNUSED = 6,\n\tDEVLINK_PORT_FLAVOUR_PCI_SF = 7,\n};\n\nenum devlink_port_fn_attr_cap {\n\tDEVLINK_PORT_FN_ATTR_CAP_ROCE_BIT = 0,\n\tDEVLINK_PORT_FN_ATTR_CAP_MIGRATABLE_BIT = 1,\n\tDEVLINK_PORT_FN_ATTR_CAP_IPSEC_CRYPTO_BIT = 2,\n\tDEVLINK_PORT_FN_ATTR_CAP_IPSEC_PACKET_BIT = 3,\n\t__DEVLINK_PORT_FN_ATTR_CAPS_MAX = 4,\n};\n\nenum devlink_port_fn_opstate {\n\tDEVLINK_PORT_FN_OPSTATE_DETACHED = 0,\n\tDEVLINK_PORT_FN_OPSTATE_ATTACHED = 1,\n};\n\nenum devlink_port_fn_state {\n\tDEVLINK_PORT_FN_STATE_INACTIVE = 0,\n\tDEVLINK_PORT_FN_STATE_ACTIVE = 1,\n};\n\nenum devlink_port_function_attr {\n\tDEVLINK_PORT_FUNCTION_ATTR_UNSPEC = 0,\n\tDEVLINK_PORT_FUNCTION_ATTR_HW_ADDR = 1,\n\tDEVLINK_PORT_FN_ATTR_STATE = 2,\n\tDEVLINK_PORT_FN_ATTR_OPSTATE = 3,\n\tDEVLINK_PORT_FN_ATTR_CAPS = 4,\n\tDEVLINK_PORT_FN_ATTR_DEVLINK = 5,\n\tDEVLINK_PORT_FN_ATTR_MAX_IO_EQS = 6,\n\t__DEVLINK_PORT_FUNCTION_ATTR_MAX = 7,\n\tDEVLINK_PORT_FUNCTION_ATTR_MAX = 6,\n};\n\nenum devlink_port_type {\n\tDEVLINK_PORT_TYPE_NOTSET = 0,\n\tDEVLINK_PORT_TYPE_AUTO = 1,\n\tDEVLINK_PORT_TYPE_ETH = 2,\n\tDEVLINK_PORT_TYPE_IB = 3,\n};\n\nenum devlink_rate_type {\n\tDEVLINK_RATE_TYPE_LEAF = 0,\n\tDEVLINK_RATE_TYPE_NODE = 1,\n};\n\nenum devlink_reload_action {\n\tDEVLINK_RELOAD_ACTION_UNSPEC = 0,\n\tDEVLINK_RELOAD_ACTION_DRIVER_REINIT = 1,\n\tDEVLINK_RELOAD_ACTION_FW_ACTIVATE = 2,\n\t__DEVLINK_RELOAD_ACTION_MAX = 3,\n\tDEVLINK_RELOAD_ACTION_MAX = 2,\n};\n\nenum devlink_reload_limit {\n\tDEVLINK_RELOAD_LIMIT_UNSPEC = 0,\n\tDEVLINK_RELOAD_LIMIT_NO_RESET = 1,\n\t__DEVLINK_RELOAD_LIMIT_MAX = 2,\n\tDEVLINK_RELOAD_LIMIT_MAX = 1,\n};\n\nenum devlink_resource_unit {\n\tDEVLINK_RESOURCE_UNIT_ENTRY = 0,\n};\n\nenum devlink_sb_pool_type {\n\tDEVLINK_SB_POOL_TYPE_INGRESS = 0,\n\tDEVLINK_SB_POOL_TYPE_EGRESS = 1,\n};\n\nenum devlink_sb_threshold_type {\n\tDEVLINK_SB_THRESHOLD_TYPE_STATIC = 0,\n\tDEVLINK_SB_THRESHOLD_TYPE_DYNAMIC = 1,\n};\n\nenum devlink_selftest_status {\n\tDEVLINK_SELFTEST_STATUS_SKIP = 0,\n\tDEVLINK_SELFTEST_STATUS_PASS = 1,\n\tDEVLINK_SELFTEST_STATUS_FAIL = 2,\n};\n\nenum devlink_trap_action {\n\tDEVLINK_TRAP_ACTION_DROP = 0,\n\tDEVLINK_TRAP_ACTION_TRAP = 1,\n\tDEVLINK_TRAP_ACTION_MIRROR = 2,\n};\n\nenum devlink_trap_generic_id {\n\tDEVLINK_TRAP_GENERIC_ID_SMAC_MC = 0,\n\tDEVLINK_TRAP_GENERIC_ID_VLAN_TAG_MISMATCH = 1,\n\tDEVLINK_TRAP_GENERIC_ID_INGRESS_VLAN_FILTER = 2,\n\tDEVLINK_TRAP_GENERIC_ID_INGRESS_STP_FILTER = 3,\n\tDEVLINK_TRAP_GENERIC_ID_EMPTY_TX_LIST = 4,\n\tDEVLINK_TRAP_GENERIC_ID_PORT_LOOPBACK_FILTER = 5,\n\tDEVLINK_TRAP_GENERIC_ID_BLACKHOLE_ROUTE = 6,\n\tDEVLINK_TRAP_GENERIC_ID_TTL_ERROR = 7,\n\tDEVLINK_TRAP_GENERIC_ID_TAIL_DROP = 8,\n\tDEVLINK_TRAP_GENERIC_ID_NON_IP_PACKET = 9,\n\tDEVLINK_TRAP_GENERIC_ID_UC_DIP_MC_DMAC = 10,\n\tDEVLINK_TRAP_GENERIC_ID_DIP_LB = 11,\n\tDEVLINK_TRAP_GENERIC_ID_SIP_MC = 12,\n\tDEVLINK_TRAP_GENERIC_ID_SIP_LB = 13,\n\tDEVLINK_TRAP_GENERIC_ID_CORRUPTED_IP_HDR = 14,\n\tDEVLINK_TRAP_GENERIC_ID_IPV4_SIP_BC = 15,\n\tDEVLINK_TRAP_GENERIC_ID_IPV6_MC_DIP_RESERVED_SCOPE = 16,\n\tDEVLINK_TRAP_GENERIC_ID_IPV6_MC_DIP_INTERFACE_LOCAL_SCOPE = 17,\n\tDEVLINK_TRAP_GENERIC_ID_MTU_ERROR = 18,\n\tDEVLINK_TRAP_GENERIC_ID_UNRESOLVED_NEIGH = 19,\n\tDEVLINK_TRAP_GENERIC_ID_RPF = 20,\n\tDEVLINK_TRAP_GENERIC_ID_REJECT_ROUTE = 21,\n\tDEVLINK_TRAP_GENERIC_ID_IPV4_LPM_UNICAST_MISS = 22,\n\tDEVLINK_TRAP_GENERIC_ID_IPV6_LPM_UNICAST_MISS = 23,\n\tDEVLINK_TRAP_GENERIC_ID_NON_ROUTABLE = 24,\n\tDEVLINK_TRAP_GENERIC_ID_DECAP_ERROR = 25,\n\tDEVLINK_TRAP_GENERIC_ID_OVERLAY_SMAC_MC = 26,\n\tDEVLINK_TRAP_GENERIC_ID_INGRESS_FLOW_ACTION_DROP = 27,\n\tDEVLINK_TRAP_GENERIC_ID_EGRESS_FLOW_ACTION_DROP = 28,\n\tDEVLINK_TRAP_GENERIC_ID_STP = 29,\n\tDEVLINK_TRAP_GENERIC_ID_LACP = 30,\n\tDEVLINK_TRAP_GENERIC_ID_LLDP = 31,\n\tDEVLINK_TRAP_GENERIC_ID_IGMP_QUERY = 32,\n\tDEVLINK_TRAP_GENERIC_ID_IGMP_V1_REPORT = 33,\n\tDEVLINK_TRAP_GENERIC_ID_IGMP_V2_REPORT = 34,\n\tDEVLINK_TRAP_GENERIC_ID_IGMP_V3_REPORT = 35,\n\tDEVLINK_TRAP_GENERIC_ID_IGMP_V2_LEAVE = 36,\n\tDEVLINK_TRAP_GENERIC_ID_MLD_QUERY = 37,\n\tDEVLINK_TRAP_GENERIC_ID_MLD_V1_REPORT = 38,\n\tDEVLINK_TRAP_GENERIC_ID_MLD_V2_REPORT = 39,\n\tDEVLINK_TRAP_GENERIC_ID_MLD_V1_DONE = 40,\n\tDEVLINK_TRAP_GENERIC_ID_IPV4_DHCP = 41,\n\tDEVLINK_TRAP_GENERIC_ID_IPV6_DHCP = 42,\n\tDEVLINK_TRAP_GENERIC_ID_ARP_REQUEST = 43,\n\tDEVLINK_TRAP_GENERIC_ID_ARP_RESPONSE = 44,\n\tDEVLINK_TRAP_GENERIC_ID_ARP_OVERLAY = 45,\n\tDEVLINK_TRAP_GENERIC_ID_IPV6_NEIGH_SOLICIT = 46,\n\tDEVLINK_TRAP_GENERIC_ID_IPV6_NEIGH_ADVERT = 47,\n\tDEVLINK_TRAP_GENERIC_ID_IPV4_BFD = 48,\n\tDEVLINK_TRAP_GENERIC_ID_IPV6_BFD = 49,\n\tDEVLINK_TRAP_GENERIC_ID_IPV4_OSPF = 50,\n\tDEVLINK_TRAP_GENERIC_ID_IPV6_OSPF = 51,\n\tDEVLINK_TRAP_GENERIC_ID_IPV4_BGP = 52,\n\tDEVLINK_TRAP_GENERIC_ID_IPV6_BGP = 53,\n\tDEVLINK_TRAP_GENERIC_ID_IPV4_VRRP = 54,\n\tDEVLINK_TRAP_GENERIC_ID_IPV6_VRRP = 55,\n\tDEVLINK_TRAP_GENERIC_ID_IPV4_PIM = 56,\n\tDEVLINK_TRAP_GENERIC_ID_IPV6_PIM = 57,\n\tDEVLINK_TRAP_GENERIC_ID_UC_LB = 58,\n\tDEVLINK_TRAP_GENERIC_ID_LOCAL_ROUTE = 59,\n\tDEVLINK_TRAP_GENERIC_ID_EXTERNAL_ROUTE = 60,\n\tDEVLINK_TRAP_GENERIC_ID_IPV6_UC_DIP_LINK_LOCAL_SCOPE = 61,\n\tDEVLINK_TRAP_GENERIC_ID_IPV6_DIP_ALL_NODES = 62,\n\tDEVLINK_TRAP_GENERIC_ID_IPV6_DIP_ALL_ROUTERS = 63,\n\tDEVLINK_TRAP_GENERIC_ID_IPV6_ROUTER_SOLICIT = 64,\n\tDEVLINK_TRAP_GENERIC_ID_IPV6_ROUTER_ADVERT = 65,\n\tDEVLINK_TRAP_GENERIC_ID_IPV6_REDIRECT = 66,\n\tDEVLINK_TRAP_GENERIC_ID_IPV4_ROUTER_ALERT = 67,\n\tDEVLINK_TRAP_GENERIC_ID_IPV6_ROUTER_ALERT = 68,\n\tDEVLINK_TRAP_GENERIC_ID_PTP_EVENT = 69,\n\tDEVLINK_TRAP_GENERIC_ID_PTP_GENERAL = 70,\n\tDEVLINK_TRAP_GENERIC_ID_FLOW_ACTION_SAMPLE = 71,\n\tDEVLINK_TRAP_GENERIC_ID_FLOW_ACTION_TRAP = 72,\n\tDEVLINK_TRAP_GENERIC_ID_EARLY_DROP = 73,\n\tDEVLINK_TRAP_GENERIC_ID_VXLAN_PARSING = 74,\n\tDEVLINK_TRAP_GENERIC_ID_LLC_SNAP_PARSING = 75,\n\tDEVLINK_TRAP_GENERIC_ID_VLAN_PARSING = 76,\n\tDEVLINK_TRAP_GENERIC_ID_PPPOE_PPP_PARSING = 77,\n\tDEVLINK_TRAP_GENERIC_ID_MPLS_PARSING = 78,\n\tDEVLINK_TRAP_GENERIC_ID_ARP_PARSING = 79,\n\tDEVLINK_TRAP_GENERIC_ID_IP_1_PARSING = 80,\n\tDEVLINK_TRAP_GENERIC_ID_IP_N_PARSING = 81,\n\tDEVLINK_TRAP_GENERIC_ID_GRE_PARSING = 82,\n\tDEVLINK_TRAP_GENERIC_ID_UDP_PARSING = 83,\n\tDEVLINK_TRAP_GENERIC_ID_TCP_PARSING = 84,\n\tDEVLINK_TRAP_GENERIC_ID_IPSEC_PARSING = 85,\n\tDEVLINK_TRAP_GENERIC_ID_SCTP_PARSING = 86,\n\tDEVLINK_TRAP_GENERIC_ID_DCCP_PARSING = 87,\n\tDEVLINK_TRAP_GENERIC_ID_GTP_PARSING = 88,\n\tDEVLINK_TRAP_GENERIC_ID_ESP_PARSING = 89,\n\tDEVLINK_TRAP_GENERIC_ID_BLACKHOLE_NEXTHOP = 90,\n\tDEVLINK_TRAP_GENERIC_ID_DMAC_FILTER = 91,\n\tDEVLINK_TRAP_GENERIC_ID_EAPOL = 92,\n\tDEVLINK_TRAP_GENERIC_ID_LOCKED_PORT = 93,\n\t__DEVLINK_TRAP_GENERIC_ID_MAX = 94,\n\tDEVLINK_TRAP_GENERIC_ID_MAX = 93,\n};\n\nenum devlink_trap_group_generic_id {\n\tDEVLINK_TRAP_GROUP_GENERIC_ID_L2_DROPS = 0,\n\tDEVLINK_TRAP_GROUP_GENERIC_ID_L3_DROPS = 1,\n\tDEVLINK_TRAP_GROUP_GENERIC_ID_L3_EXCEPTIONS = 2,\n\tDEVLINK_TRAP_GROUP_GENERIC_ID_BUFFER_DROPS = 3,\n\tDEVLINK_TRAP_GROUP_GENERIC_ID_TUNNEL_DROPS = 4,\n\tDEVLINK_TRAP_GROUP_GENERIC_ID_ACL_DROPS = 5,\n\tDEVLINK_TRAP_GROUP_GENERIC_ID_STP = 6,\n\tDEVLINK_TRAP_GROUP_GENERIC_ID_LACP = 7,\n\tDEVLINK_TRAP_GROUP_GENERIC_ID_LLDP = 8,\n\tDEVLINK_TRAP_GROUP_GENERIC_ID_MC_SNOOPING = 9,\n\tDEVLINK_TRAP_GROUP_GENERIC_ID_DHCP = 10,\n\tDEVLINK_TRAP_GROUP_GENERIC_ID_NEIGH_DISCOVERY = 11,\n\tDEVLINK_TRAP_GROUP_GENERIC_ID_BFD = 12,\n\tDEVLINK_TRAP_GROUP_GENERIC_ID_OSPF = 13,\n\tDEVLINK_TRAP_GROUP_GENERIC_ID_BGP = 14,\n\tDEVLINK_TRAP_GROUP_GENERIC_ID_VRRP = 15,\n\tDEVLINK_TRAP_GROUP_GENERIC_ID_PIM = 16,\n\tDEVLINK_TRAP_GROUP_GENERIC_ID_UC_LB = 17,\n\tDEVLINK_TRAP_GROUP_GENERIC_ID_LOCAL_DELIVERY = 18,\n\tDEVLINK_TRAP_GROUP_GENERIC_ID_EXTERNAL_DELIVERY = 19,\n\tDEVLINK_TRAP_GROUP_GENERIC_ID_IPV6 = 20,\n\tDEVLINK_TRAP_GROUP_GENERIC_ID_PTP_EVENT = 21,\n\tDEVLINK_TRAP_GROUP_GENERIC_ID_PTP_GENERAL = 22,\n\tDEVLINK_TRAP_GROUP_GENERIC_ID_ACL_SAMPLE = 23,\n\tDEVLINK_TRAP_GROUP_GENERIC_ID_ACL_TRAP = 24,\n\tDEVLINK_TRAP_GROUP_GENERIC_ID_PARSER_ERROR_DROPS = 25,\n\tDEVLINK_TRAP_GROUP_GENERIC_ID_EAPOL = 26,\n\t__DEVLINK_TRAP_GROUP_GENERIC_ID_MAX = 27,\n\tDEVLINK_TRAP_GROUP_GENERIC_ID_MAX = 26,\n};\n\nenum devlink_trap_type {\n\tDEVLINK_TRAP_TYPE_DROP = 0,\n\tDEVLINK_TRAP_TYPE_EXCEPTION = 1,\n\tDEVLINK_TRAP_TYPE_CONTROL = 2,\n};\n\nenum devm_ioremap_type {\n\tDEVM_IOREMAP = 0,\n\tDEVM_IOREMAP_UC = 1,\n\tDEVM_IOREMAP_WC = 2,\n\tDEVM_IOREMAP_NP = 3,\n};\n\nenum dfa_accept_flags {\n\tACCEPT_FLAG_OWNER = 1,\n};\n\nenum die_val {\n\tDIE_OOPS = 1,\n\tDIE_INT3 = 2,\n\tDIE_DEBUG = 3,\n\tDIE_PANIC = 4,\n\tDIE_NMI = 5,\n\tDIE_DIE = 6,\n\tDIE_KERNELDEBUG = 7,\n\tDIE_TRAP = 8,\n\tDIE_GPF = 9,\n\tDIE_CALL = 10,\n\tDIE_PAGE_FAULT = 11,\n\tDIE_NMIUNKNOWN = 12,\n};\n\nenum digest_type {\n\tDIGEST_TYPE_IMA = 0,\n\tDIGEST_TYPE_VERITY = 1,\n\tDIGEST_TYPE__LAST = 2,\n};\n\nenum dim_cq_period_mode {\n\tDIM_CQ_PERIOD_MODE_START_FROM_EQE = 0,\n\tDIM_CQ_PERIOD_MODE_START_FROM_CQE = 1,\n\tDIM_CQ_PERIOD_NUM_MODES = 2,\n};\n\nenum dim_state {\n\tDIM_START_MEASURE = 0,\n\tDIM_MEASURE_IN_PROGRESS = 1,\n\tDIM_APPLY_NEW_PROFILE = 2,\n};\n\nenum dim_stats_state {\n\tDIM_STATS_WORSE = 0,\n\tDIM_STATS_SAME = 1,\n\tDIM_STATS_BETTER = 2,\n};\n\nenum dim_step_result {\n\tDIM_STEPPED = 0,\n\tDIM_TOO_TIRED = 1,\n\tDIM_ON_EDGE = 2,\n};\n\nenum dim_tune_state {\n\tDIM_PARKING_ON_TOP = 0,\n\tDIM_PARKING_TIRED = 1,\n\tDIM_GOING_RIGHT = 2,\n\tDIM_GOING_LEFT = 3,\n};\n\nenum display_flags {\n\tDISPLAY_FLAGS_HSYNC_LOW = 1,\n\tDISPLAY_FLAGS_HSYNC_HIGH = 2,\n\tDISPLAY_FLAGS_VSYNC_LOW = 4,\n\tDISPLAY_FLAGS_VSYNC_HIGH = 8,\n\tDISPLAY_FLAGS_DE_LOW = 16,\n\tDISPLAY_FLAGS_DE_HIGH = 32,\n\tDISPLAY_FLAGS_PIXDATA_POSEDGE = 64,\n\tDISPLAY_FLAGS_PIXDATA_NEGEDGE = 128,\n\tDISPLAY_FLAGS_INTERLACED = 256,\n\tDISPLAY_FLAGS_DOUBLESCAN = 512,\n\tDISPLAY_FLAGS_DOUBLECLK = 1024,\n\tDISPLAY_FLAGS_SYNC_POSEDGE = 2048,\n\tDISPLAY_FLAGS_SYNC_NEGEDGE = 4096,\n};\n\nenum dl_bw_request {\n\tdl_bw_req_check_overflow = 0,\n\tdl_bw_req_alloc = 1,\n\tdl_bw_req_free = 2,\n};\n\nenum dl_dev_state {\n\tDL_DEV_NO_DRIVER = 0,\n\tDL_DEV_PROBING = 1,\n\tDL_DEV_DRIVER_BOUND = 2,\n\tDL_DEV_UNBINDING = 3,\n};\n\nenum dm_io_mem_type {\n\tDM_IO_PAGE_LIST = 0,\n\tDM_IO_BIO = 1,\n\tDM_IO_VMA = 2,\n\tDM_IO_KMEM = 3,\n};\n\nenum dm_queue_mode {\n\tDM_TYPE_NONE = 0,\n\tDM_TYPE_BIO_BASED = 1,\n\tDM_TYPE_REQUEST_BASED = 2,\n\tDM_TYPE_DAX_BIO_BASED = 3,\n};\n\nenum dm_uevent_type {\n\tDM_UEVENT_PATH_FAILED = 0,\n\tDM_UEVENT_PATH_REINSTATED = 1,\n};\n\nenum dma_ctrl_flags {\n\tDMA_PREP_INTERRUPT = 1,\n\tDMA_CTRL_ACK = 2,\n\tDMA_PREP_PQ_DISABLE_P = 4,\n\tDMA_PREP_PQ_DISABLE_Q = 8,\n\tDMA_PREP_CONTINUE = 16,\n\tDMA_PREP_FENCE = 32,\n\tDMA_CTRL_REUSE = 64,\n\tDMA_PREP_CMD = 128,\n\tDMA_PREP_REPEAT = 256,\n\tDMA_PREP_LOAD_EOT = 512,\n};\n\nenum dma_data_direction {\n\tDMA_BIDIRECTIONAL = 0,\n\tDMA_TO_DEVICE = 1,\n\tDMA_FROM_DEVICE = 2,\n\tDMA_NONE = 3,\n};\n\nenum dma_desc_metadata_mode {\n\tDESC_METADATA_NONE = 0,\n\tDESC_METADATA_CLIENT = 1,\n\tDESC_METADATA_ENGINE = 2,\n};\n\nenum dma_fence_flag_bits {\n\tDMA_FENCE_FLAG_SIGNALED_BIT = 0,\n\tDMA_FENCE_FLAG_TIMESTAMP_BIT = 1,\n\tDMA_FENCE_FLAG_ENABLE_SIGNAL_BIT = 2,\n\tDMA_FENCE_FLAG_USER_BITS = 3,\n};\n\nenum dma_residue_granularity {\n\tDMA_RESIDUE_GRANULARITY_DESCRIPTOR = 0,\n\tDMA_RESIDUE_GRANULARITY_SEGMENT = 1,\n\tDMA_RESIDUE_GRANULARITY_BURST = 2,\n};\n\nenum dma_resv_usage {\n\tDMA_RESV_USAGE_KERNEL = 0,\n\tDMA_RESV_USAGE_WRITE = 1,\n\tDMA_RESV_USAGE_READ = 2,\n\tDMA_RESV_USAGE_BOOKKEEP = 3,\n};\n\nenum dma_slave_buswidth {\n\tDMA_SLAVE_BUSWIDTH_UNDEFINED = 0,\n\tDMA_SLAVE_BUSWIDTH_1_BYTE = 1,\n\tDMA_SLAVE_BUSWIDTH_2_BYTES = 2,\n\tDMA_SLAVE_BUSWIDTH_3_BYTES = 3,\n\tDMA_SLAVE_BUSWIDTH_4_BYTES = 4,\n\tDMA_SLAVE_BUSWIDTH_8_BYTES = 8,\n\tDMA_SLAVE_BUSWIDTH_16_BYTES = 16,\n\tDMA_SLAVE_BUSWIDTH_32_BYTES = 32,\n\tDMA_SLAVE_BUSWIDTH_64_BYTES = 64,\n\tDMA_SLAVE_BUSWIDTH_128_BYTES = 128,\n};\n\nenum dma_status {\n\tDMA_COMPLETE = 0,\n\tDMA_IN_PROGRESS = 1,\n\tDMA_PAUSED = 2,\n\tDMA_ERROR = 3,\n\tDMA_OUT_OF_ORDER = 4,\n};\n\nenum dma_transaction_type {\n\tDMA_MEMCPY = 0,\n\tDMA_XOR = 1,\n\tDMA_PQ = 2,\n\tDMA_XOR_VAL = 3,\n\tDMA_PQ_VAL = 4,\n\tDMA_MEMSET = 5,\n\tDMA_MEMSET_SG = 6,\n\tDMA_INTERRUPT = 7,\n\tDMA_PRIVATE = 8,\n\tDMA_ASYNC_TX = 9,\n\tDMA_SLAVE = 10,\n\tDMA_CYCLIC = 11,\n\tDMA_INTERLEAVE = 12,\n\tDMA_COMPLETION_NO_ORDER = 13,\n\tDMA_REPEAT = 14,\n\tDMA_LOAD_EOT = 15,\n\tDMA_TX_TYPE_END = 16,\n};\n\nenum dma_transfer_direction {\n\tDMA_MEM_TO_MEM = 0,\n\tDMA_MEM_TO_DEV = 1,\n\tDMA_DEV_TO_MEM = 2,\n\tDMA_DEV_TO_DEV = 3,\n\tDMA_TRANS_NONE = 4,\n};\n\nenum dmaengine_alignment {\n\tDMAENGINE_ALIGN_1_BYTE = 0,\n\tDMAENGINE_ALIGN_2_BYTES = 1,\n\tDMAENGINE_ALIGN_4_BYTES = 2,\n\tDMAENGINE_ALIGN_8_BYTES = 3,\n\tDMAENGINE_ALIGN_16_BYTES = 4,\n\tDMAENGINE_ALIGN_32_BYTES = 5,\n\tDMAENGINE_ALIGN_64_BYTES = 6,\n\tDMAENGINE_ALIGN_128_BYTES = 7,\n\tDMAENGINE_ALIGN_256_BYTES = 8,\n};\n\nenum dmaengine_tx_result {\n\tDMA_TRANS_NOERROR = 0,\n\tDMA_TRANS_READ_FAILED = 1,\n\tDMA_TRANS_WRITE_FAILED = 2,\n\tDMA_TRANS_ABORTED = 3,\n};\n\nenum dmi_device_type {\n\tDMI_DEV_TYPE_ANY = 0,\n\tDMI_DEV_TYPE_OTHER = 1,\n\tDMI_DEV_TYPE_UNKNOWN = 2,\n\tDMI_DEV_TYPE_VIDEO = 3,\n\tDMI_DEV_TYPE_SCSI = 4,\n\tDMI_DEV_TYPE_ETHERNET = 5,\n\tDMI_DEV_TYPE_TOKENRING = 6,\n\tDMI_DEV_TYPE_SOUND = 7,\n\tDMI_DEV_TYPE_PATA = 8,\n\tDMI_DEV_TYPE_SATA = 9,\n\tDMI_DEV_TYPE_SAS = 10,\n\tDMI_DEV_TYPE_IPMI = -1,\n\tDMI_DEV_TYPE_OEM_STRING = -2,\n\tDMI_DEV_TYPE_DEV_ONBOARD = -3,\n\tDMI_DEV_TYPE_DEV_SLOT = -4,\n};\n\nenum dmi_entry_type {\n\tDMI_ENTRY_BIOS = 0,\n\tDMI_ENTRY_SYSTEM = 1,\n\tDMI_ENTRY_BASEBOARD = 2,\n\tDMI_ENTRY_CHASSIS = 3,\n\tDMI_ENTRY_PROCESSOR = 4,\n\tDMI_ENTRY_MEM_CONTROLLER = 5,\n\tDMI_ENTRY_MEM_MODULE = 6,\n\tDMI_ENTRY_CACHE = 7,\n\tDMI_ENTRY_PORT_CONNECTOR = 8,\n\tDMI_ENTRY_SYSTEM_SLOT = 9,\n\tDMI_ENTRY_ONBOARD_DEVICE = 10,\n\tDMI_ENTRY_OEMSTRINGS = 11,\n\tDMI_ENTRY_SYSCONF = 12,\n\tDMI_ENTRY_BIOS_LANG = 13,\n\tDMI_ENTRY_GROUP_ASSOC = 14,\n\tDMI_ENTRY_SYSTEM_EVENT_LOG = 15,\n\tDMI_ENTRY_PHYS_MEM_ARRAY = 16,\n\tDMI_ENTRY_MEM_DEVICE = 17,\n\tDMI_ENTRY_32_MEM_ERROR = 18,\n\tDMI_ENTRY_MEM_ARRAY_MAPPED_ADDR = 19,\n\tDMI_ENTRY_MEM_DEV_MAPPED_ADDR = 20,\n\tDMI_ENTRY_BUILTIN_POINTING_DEV = 21,\n\tDMI_ENTRY_PORTABLE_BATTERY = 22,\n\tDMI_ENTRY_SYSTEM_RESET = 23,\n\tDMI_ENTRY_HW_SECURITY = 24,\n\tDMI_ENTRY_SYSTEM_POWER_CONTROLS = 25,\n\tDMI_ENTRY_VOLTAGE_PROBE = 26,\n\tDMI_ENTRY_COOLING_DEV = 27,\n\tDMI_ENTRY_TEMP_PROBE = 28,\n\tDMI_ENTRY_ELECTRICAL_CURRENT_PROBE = 29,\n\tDMI_ENTRY_OOB_REMOTE_ACCESS = 30,\n\tDMI_ENTRY_BIS_ENTRY = 31,\n\tDMI_ENTRY_SYSTEM_BOOT = 32,\n\tDMI_ENTRY_MGMT_DEV = 33,\n\tDMI_ENTRY_MGMT_DEV_COMPONENT = 34,\n\tDMI_ENTRY_MGMT_DEV_THRES = 35,\n\tDMI_ENTRY_MEM_CHANNEL = 36,\n\tDMI_ENTRY_IPMI_DEV = 37,\n\tDMI_ENTRY_SYS_POWER_SUPPLY = 38,\n\tDMI_ENTRY_ADDITIONAL = 39,\n\tDMI_ENTRY_ONBOARD_DEV_EXT = 40,\n\tDMI_ENTRY_MGMT_CONTROLLER_HOST = 41,\n\tDMI_ENTRY_INACTIVE = 126,\n\tDMI_ENTRY_END_OF_TABLE = 127,\n};\n\nenum dmi_field {\n\tDMI_NONE = 0,\n\tDMI_BIOS_VENDOR = 1,\n\tDMI_BIOS_VERSION = 2,\n\tDMI_BIOS_DATE = 3,\n\tDMI_BIOS_RELEASE = 4,\n\tDMI_EC_FIRMWARE_RELEASE = 5,\n\tDMI_SYS_VENDOR = 6,\n\tDMI_PRODUCT_NAME = 7,\n\tDMI_PRODUCT_VERSION = 8,\n\tDMI_PRODUCT_SERIAL = 9,\n\tDMI_PRODUCT_UUID = 10,\n\tDMI_PRODUCT_SKU = 11,\n\tDMI_PRODUCT_FAMILY = 12,\n\tDMI_BOARD_VENDOR = 13,\n\tDMI_BOARD_NAME = 14,\n\tDMI_BOARD_VERSION = 15,\n\tDMI_BOARD_SERIAL = 16,\n\tDMI_BOARD_ASSET_TAG = 17,\n\tDMI_CHASSIS_VENDOR = 18,\n\tDMI_CHASSIS_TYPE = 19,\n\tDMI_CHASSIS_VERSION = 20,\n\tDMI_CHASSIS_SERIAL = 21,\n\tDMI_CHASSIS_ASSET_TAG = 22,\n\tDMI_STRING_MAX = 23,\n\tDMI_OEM_STRING = 24,\n};\n\nenum dns_lookup_status {\n\tDNS_LOOKUP_NOT_DONE = 0,\n\tDNS_LOOKUP_GOOD = 1,\n\tDNS_LOOKUP_GOOD_WITH_BAD = 2,\n\tDNS_LOOKUP_BAD = 3,\n\tDNS_LOOKUP_GOT_NOT_FOUND = 4,\n\tDNS_LOOKUP_GOT_LOCAL_FAILURE = 5,\n\tDNS_LOOKUP_GOT_TEMP_FAILURE = 6,\n\tDNS_LOOKUP_GOT_NS_FAILURE = 7,\n\tNR__dns_lookup_status = 8,\n};\n\nenum dns_payload_content_type {\n\tDNS_PAYLOAD_IS_SERVER_LIST = 0,\n};\n\nenum dock_callback_type {\n\tDOCK_CALL_HANDLER = 0,\n\tDOCK_CALL_FIXUP = 1,\n\tDOCK_CALL_UEVENT = 2,\n};\n\nenum dpll_a {\n\tDPLL_A_ID = 1,\n\tDPLL_A_MODULE_NAME = 2,\n\tDPLL_A_PAD = 3,\n\tDPLL_A_CLOCK_ID = 4,\n\tDPLL_A_MODE = 5,\n\tDPLL_A_MODE_SUPPORTED = 6,\n\tDPLL_A_LOCK_STATUS = 7,\n\tDPLL_A_TEMP = 8,\n\tDPLL_A_TYPE = 9,\n\tDPLL_A_LOCK_STATUS_ERROR = 10,\n\t__DPLL_A_MAX = 11,\n\tDPLL_A_MAX = 10,\n};\n\nenum dpll_a_pin {\n\tDPLL_A_PIN_ID = 1,\n\tDPLL_A_PIN_PARENT_ID = 2,\n\tDPLL_A_PIN_MODULE_NAME = 3,\n\tDPLL_A_PIN_PAD = 4,\n\tDPLL_A_PIN_CLOCK_ID = 5,\n\tDPLL_A_PIN_BOARD_LABEL = 6,\n\tDPLL_A_PIN_PANEL_LABEL = 7,\n\tDPLL_A_PIN_PACKAGE_LABEL = 8,\n\tDPLL_A_PIN_TYPE = 9,\n\tDPLL_A_PIN_DIRECTION = 10,\n\tDPLL_A_PIN_FREQUENCY = 11,\n\tDPLL_A_PIN_FREQUENCY_SUPPORTED = 12,\n\tDPLL_A_PIN_FREQUENCY_MIN = 13,\n\tDPLL_A_PIN_FREQUENCY_MAX = 14,\n\tDPLL_A_PIN_PRIO = 15,\n\tDPLL_A_PIN_STATE = 16,\n\tDPLL_A_PIN_CAPABILITIES = 17,\n\tDPLL_A_PIN_PARENT_DEVICE = 18,\n\tDPLL_A_PIN_PARENT_PIN = 19,\n\tDPLL_A_PIN_PHASE_ADJUST_MIN = 20,\n\tDPLL_A_PIN_PHASE_ADJUST_MAX = 21,\n\tDPLL_A_PIN_PHASE_ADJUST = 22,\n\tDPLL_A_PIN_PHASE_OFFSET = 23,\n\tDPLL_A_PIN_FRACTIONAL_FREQUENCY_OFFSET = 24,\n\tDPLL_A_PIN_ESYNC_FREQUENCY = 25,\n\tDPLL_A_PIN_ESYNC_FREQUENCY_SUPPORTED = 26,\n\tDPLL_A_PIN_ESYNC_PULSE = 27,\n\t__DPLL_A_PIN_MAX = 28,\n\tDPLL_A_PIN_MAX = 27,\n};\n\nenum dpll_cmd {\n\tDPLL_CMD_DEVICE_ID_GET = 1,\n\tDPLL_CMD_DEVICE_GET = 2,\n\tDPLL_CMD_DEVICE_SET = 3,\n\tDPLL_CMD_DEVICE_CREATE_NTF = 4,\n\tDPLL_CMD_DEVICE_DELETE_NTF = 5,\n\tDPLL_CMD_DEVICE_CHANGE_NTF = 6,\n\tDPLL_CMD_PIN_ID_GET = 7,\n\tDPLL_CMD_PIN_GET = 8,\n\tDPLL_CMD_PIN_SET = 9,\n\tDPLL_CMD_PIN_CREATE_NTF = 10,\n\tDPLL_CMD_PIN_DELETE_NTF = 11,\n\tDPLL_CMD_PIN_CHANGE_NTF = 12,\n\t__DPLL_CMD_MAX = 13,\n\tDPLL_CMD_MAX = 12,\n};\n\nenum dpll_lock_status {\n\tDPLL_LOCK_STATUS_UNLOCKED = 1,\n\tDPLL_LOCK_STATUS_LOCKED = 2,\n\tDPLL_LOCK_STATUS_LOCKED_HO_ACQ = 3,\n\tDPLL_LOCK_STATUS_HOLDOVER = 4,\n\t__DPLL_LOCK_STATUS_MAX = 5,\n\tDPLL_LOCK_STATUS_MAX = 4,\n};\n\nenum dpll_lock_status_error {\n\tDPLL_LOCK_STATUS_ERROR_NONE = 1,\n\tDPLL_LOCK_STATUS_ERROR_UNDEFINED = 2,\n\tDPLL_LOCK_STATUS_ERROR_MEDIA_DOWN = 3,\n\tDPLL_LOCK_STATUS_ERROR_FRACTIONAL_FREQUENCY_OFFSET_TOO_HIGH = 4,\n\t__DPLL_LOCK_STATUS_ERROR_MAX = 5,\n\tDPLL_LOCK_STATUS_ERROR_MAX = 4,\n};\n\nenum dpll_mode {\n\tDPLL_MODE_MANUAL = 1,\n\tDPLL_MODE_AUTOMATIC = 2,\n\t__DPLL_MODE_MAX = 3,\n\tDPLL_MODE_MAX = 2,\n};\n\nenum dpll_pin_capabilities {\n\tDPLL_PIN_CAPABILITIES_DIRECTION_CAN_CHANGE = 1,\n\tDPLL_PIN_CAPABILITIES_PRIORITY_CAN_CHANGE = 2,\n\tDPLL_PIN_CAPABILITIES_STATE_CAN_CHANGE = 4,\n};\n\nenum dpll_pin_direction {\n\tDPLL_PIN_DIRECTION_INPUT = 1,\n\tDPLL_PIN_DIRECTION_OUTPUT = 2,\n\t__DPLL_PIN_DIRECTION_MAX = 3,\n\tDPLL_PIN_DIRECTION_MAX = 2,\n};\n\nenum dpll_pin_state {\n\tDPLL_PIN_STATE_CONNECTED = 1,\n\tDPLL_PIN_STATE_DISCONNECTED = 2,\n\tDPLL_PIN_STATE_SELECTABLE = 3,\n\t__DPLL_PIN_STATE_MAX = 4,\n\tDPLL_PIN_STATE_MAX = 3,\n};\n\nenum dpll_pin_type {\n\tDPLL_PIN_TYPE_MUX = 1,\n\tDPLL_PIN_TYPE_EXT = 2,\n\tDPLL_PIN_TYPE_SYNCE_ETH_PORT = 3,\n\tDPLL_PIN_TYPE_INT_OSCILLATOR = 4,\n\tDPLL_PIN_TYPE_GNSS = 5,\n\t__DPLL_PIN_TYPE_MAX = 6,\n\tDPLL_PIN_TYPE_MAX = 5,\n};\n\nenum dpll_type {\n\tDPLL_TYPE_PPS = 1,\n\tDPLL_TYPE_EEC = 2,\n\t__DPLL_TYPE_MAX = 3,\n\tDPLL_TYPE_MAX = 2,\n};\n\nenum dpm_order {\n\tDPM_ORDER_NONE = 0,\n\tDPM_ORDER_DEV_AFTER_PARENT = 1,\n\tDPM_ORDER_PARENT_BEFORE_DEV = 2,\n\tDPM_ORDER_DEV_LAST = 3,\n};\n\nenum drbg_prefixes {\n\tDRBG_PREFIX0 = 0,\n\tDRBG_PREFIX1 = 1,\n\tDRBG_PREFIX2 = 2,\n\tDRBG_PREFIX3 = 3,\n};\n\nenum drbg_seed_state {\n\tDRBG_SEED_STATE_UNSEEDED = 0,\n\tDRBG_SEED_STATE_PARTIAL = 1,\n\tDRBG_SEED_STATE_FULL = 2,\n};\n\nenum drm_bridge_attach_flags {\n\tDRM_BRIDGE_ATTACH_NO_CONNECTOR = 1,\n};\n\nenum drm_bridge_ops {\n\tDRM_BRIDGE_OP_DETECT = 1,\n\tDRM_BRIDGE_OP_EDID = 2,\n\tDRM_BRIDGE_OP_HPD = 4,\n\tDRM_BRIDGE_OP_MODES = 8,\n\tDRM_BRIDGE_OP_HDMI = 16,\n};\n\nenum drm_bus_flags {\n\tDRM_BUS_FLAG_DE_LOW = 1,\n\tDRM_BUS_FLAG_DE_HIGH = 2,\n\tDRM_BUS_FLAG_PIXDATA_DRIVE_POSEDGE = 4,\n\tDRM_BUS_FLAG_PIXDATA_DRIVE_NEGEDGE = 8,\n\tDRM_BUS_FLAG_PIXDATA_SAMPLE_POSEDGE = 8,\n\tDRM_BUS_FLAG_PIXDATA_SAMPLE_NEGEDGE = 4,\n\tDRM_BUS_FLAG_DATA_MSB_TO_LSB = 16,\n\tDRM_BUS_FLAG_DATA_LSB_TO_MSB = 32,\n\tDRM_BUS_FLAG_SYNC_DRIVE_POSEDGE = 64,\n\tDRM_BUS_FLAG_SYNC_DRIVE_NEGEDGE = 128,\n\tDRM_BUS_FLAG_SYNC_SAMPLE_POSEDGE = 128,\n\tDRM_BUS_FLAG_SYNC_SAMPLE_NEGEDGE = 64,\n\tDRM_BUS_FLAG_SHARP_SIGNALS = 256,\n};\n\nenum drm_color_encoding {\n\tDRM_COLOR_YCBCR_BT601 = 0,\n\tDRM_COLOR_YCBCR_BT709 = 1,\n\tDRM_COLOR_YCBCR_BT2020 = 2,\n\tDRM_COLOR_ENCODING_MAX = 3,\n};\n\nenum drm_color_lut_tests {\n\tDRM_COLOR_LUT_EQUAL_CHANNELS = 1,\n\tDRM_COLOR_LUT_NON_DECREASING = 2,\n};\n\nenum drm_color_range {\n\tDRM_COLOR_YCBCR_LIMITED_RANGE = 0,\n\tDRM_COLOR_YCBCR_FULL_RANGE = 1,\n\tDRM_COLOR_RANGE_MAX = 2,\n};\n\nenum drm_colorspace {\n\tDRM_MODE_COLORIMETRY_DEFAULT = 0,\n\tDRM_MODE_COLORIMETRY_NO_DATA = 0,\n\tDRM_MODE_COLORIMETRY_SMPTE_170M_YCC = 1,\n\tDRM_MODE_COLORIMETRY_BT709_YCC = 2,\n\tDRM_MODE_COLORIMETRY_XVYCC_601 = 3,\n\tDRM_MODE_COLORIMETRY_XVYCC_709 = 4,\n\tDRM_MODE_COLORIMETRY_SYCC_601 = 5,\n\tDRM_MODE_COLORIMETRY_OPYCC_601 = 6,\n\tDRM_MODE_COLORIMETRY_OPRGB = 7,\n\tDRM_MODE_COLORIMETRY_BT2020_CYCC = 8,\n\tDRM_MODE_COLORIMETRY_BT2020_RGB = 9,\n\tDRM_MODE_COLORIMETRY_BT2020_YCC = 10,\n\tDRM_MODE_COLORIMETRY_DCI_P3_RGB_D65 = 11,\n\tDRM_MODE_COLORIMETRY_DCI_P3_RGB_THEATER = 12,\n\tDRM_MODE_COLORIMETRY_RGB_WIDE_FIXED = 13,\n\tDRM_MODE_COLORIMETRY_RGB_WIDE_FLOAT = 14,\n\tDRM_MODE_COLORIMETRY_BT601_YCC = 15,\n\tDRM_MODE_COLORIMETRY_COUNT = 16,\n};\n\nenum drm_connector_force {\n\tDRM_FORCE_UNSPECIFIED = 0,\n\tDRM_FORCE_OFF = 1,\n\tDRM_FORCE_ON = 2,\n\tDRM_FORCE_ON_DIGITAL = 3,\n};\n\nenum drm_connector_registration_state {\n\tDRM_CONNECTOR_INITIALIZING = 0,\n\tDRM_CONNECTOR_REGISTERED = 1,\n\tDRM_CONNECTOR_UNREGISTERED = 2,\n};\n\nenum drm_connector_status {\n\tconnector_status_connected = 1,\n\tconnector_status_disconnected = 2,\n\tconnector_status_unknown = 3,\n};\n\nenum drm_connector_tv_mode {\n\tDRM_MODE_TV_MODE_NTSC = 0,\n\tDRM_MODE_TV_MODE_NTSC_443 = 1,\n\tDRM_MODE_TV_MODE_NTSC_J = 2,\n\tDRM_MODE_TV_MODE_PAL = 3,\n\tDRM_MODE_TV_MODE_PAL_M = 4,\n\tDRM_MODE_TV_MODE_PAL_N = 5,\n\tDRM_MODE_TV_MODE_SECAM = 6,\n\tDRM_MODE_TV_MODE_MONOCHROME = 7,\n\tDRM_MODE_TV_MODE_MAX = 8,\n};\n\nenum drm_debug_category {\n\tDRM_UT_CORE = 0,\n\tDRM_UT_DRIVER = 1,\n\tDRM_UT_KMS = 2,\n\tDRM_UT_PRIME = 3,\n\tDRM_UT_ATOMIC = 4,\n\tDRM_UT_VBL = 5,\n\tDRM_UT_STATE = 6,\n\tDRM_UT_LEASE = 7,\n\tDRM_UT_DP = 8,\n\tDRM_UT_DRMRES = 9,\n};\n\nenum drm_driver_feature {\n\tDRIVER_GEM = 1,\n\tDRIVER_MODESET = 2,\n\tDRIVER_RENDER = 8,\n\tDRIVER_ATOMIC = 16,\n\tDRIVER_SYNCOBJ = 32,\n\tDRIVER_SYNCOBJ_TIMELINE = 64,\n\tDRIVER_COMPUTE_ACCEL = 128,\n\tDRIVER_GEM_GPUVA = 256,\n\tDRIVER_CURSOR_HOTSPOT = 512,\n\tDRIVER_USE_AGP = 33554432,\n\tDRIVER_LEGACY = 67108864,\n\tDRIVER_PCI_DMA = 134217728,\n\tDRIVER_SG = 268435456,\n\tDRIVER_HAVE_DMA = 536870912,\n\tDRIVER_HAVE_IRQ = 1073741824,\n};\n\nenum drm_gem_object_status {\n\tDRM_GEM_OBJECT_RESIDENT = 1,\n\tDRM_GEM_OBJECT_PURGEABLE = 2,\n};\n\nenum drm_gpuva_flags {\n\tDRM_GPUVA_INVALIDATED = 1,\n\tDRM_GPUVA_SPARSE = 2,\n\tDRM_GPUVA_USERBITS = 4,\n};\n\nenum drm_gpuva_op_type {\n\tDRM_GPUVA_OP_MAP = 0,\n\tDRM_GPUVA_OP_REMAP = 1,\n\tDRM_GPUVA_OP_UNMAP = 2,\n\tDRM_GPUVA_OP_PREFETCH = 3,\n};\n\nenum drm_gpuvm_flags {\n\tDRM_GPUVM_RESV_PROTECTED = 1,\n\tDRM_GPUVM_USERBITS = 2,\n};\n\nenum drm_hdmi_broadcast_rgb {\n\tDRM_HDMI_BROADCAST_RGB_AUTO = 0,\n\tDRM_HDMI_BROADCAST_RGB_FULL = 1,\n\tDRM_HDMI_BROADCAST_RGB_LIMITED = 2,\n};\n\nenum drm_ioctl_flags {\n\tDRM_AUTH = 1,\n\tDRM_MASTER = 2,\n\tDRM_ROOT_ONLY = 4,\n\tDRM_RENDER_ALLOW = 32,\n};\n\nenum drm_link_status {\n\tDRM_LINK_STATUS_GOOD = 0,\n\tDRM_LINK_STATUS_BAD = 1,\n};\n\nenum drm_minor_type {\n\tDRM_MINOR_PRIMARY = 0,\n\tDRM_MINOR_CONTROL = 1,\n\tDRM_MINOR_RENDER = 2,\n\tDRM_MINOR_ACCEL = 32,\n};\n\nenum drm_mm_insert_mode {\n\tDRM_MM_INSERT_BEST = 0,\n\tDRM_MM_INSERT_LOW = 1,\n\tDRM_MM_INSERT_HIGH = 2,\n\tDRM_MM_INSERT_EVICT = 3,\n\tDRM_MM_INSERT_ONCE = 2147483648,\n\tDRM_MM_INSERT_HIGHEST = 2147483650,\n\tDRM_MM_INSERT_LOWEST = 2147483649,\n};\n\nenum drm_mode_analog {\n\tDRM_MODE_ANALOG_NTSC = 0,\n\tDRM_MODE_ANALOG_PAL = 1,\n};\n\nenum drm_mode_status {\n\tMODE_OK = 0,\n\tMODE_HSYNC = 1,\n\tMODE_VSYNC = 2,\n\tMODE_H_ILLEGAL = 3,\n\tMODE_V_ILLEGAL = 4,\n\tMODE_BAD_WIDTH = 5,\n\tMODE_NOMODE = 6,\n\tMODE_NO_INTERLACE = 7,\n\tMODE_NO_DBLESCAN = 8,\n\tMODE_NO_VSCAN = 9,\n\tMODE_MEM = 10,\n\tMODE_VIRTUAL_X = 11,\n\tMODE_VIRTUAL_Y = 12,\n\tMODE_MEM_VIRT = 13,\n\tMODE_NOCLOCK = 14,\n\tMODE_CLOCK_HIGH = 15,\n\tMODE_CLOCK_LOW = 16,\n\tMODE_CLOCK_RANGE = 17,\n\tMODE_BAD_HVALUE = 18,\n\tMODE_BAD_VVALUE = 19,\n\tMODE_BAD_VSCAN = 20,\n\tMODE_HSYNC_NARROW = 21,\n\tMODE_HSYNC_WIDE = 22,\n\tMODE_HBLANK_NARROW = 23,\n\tMODE_HBLANK_WIDE = 24,\n\tMODE_VSYNC_NARROW = 25,\n\tMODE_VSYNC_WIDE = 26,\n\tMODE_VBLANK_NARROW = 27,\n\tMODE_VBLANK_WIDE = 28,\n\tMODE_PANEL = 29,\n\tMODE_INTERLACE_WIDTH = 30,\n\tMODE_ONE_WIDTH = 31,\n\tMODE_ONE_HEIGHT = 32,\n\tMODE_ONE_SIZE = 33,\n\tMODE_NO_REDUCED = 34,\n\tMODE_NO_STEREO = 35,\n\tMODE_NO_420 = 36,\n\tMODE_STALE = -3,\n\tMODE_BAD = -2,\n\tMODE_ERROR = -1,\n};\n\nenum drm_mode_subconnector {\n\tDRM_MODE_SUBCONNECTOR_Automatic = 0,\n\tDRM_MODE_SUBCONNECTOR_Unknown = 0,\n\tDRM_MODE_SUBCONNECTOR_VGA = 1,\n\tDRM_MODE_SUBCONNECTOR_DVID = 3,\n\tDRM_MODE_SUBCONNECTOR_DVIA = 4,\n\tDRM_MODE_SUBCONNECTOR_Composite = 5,\n\tDRM_MODE_SUBCONNECTOR_SVIDEO = 6,\n\tDRM_MODE_SUBCONNECTOR_Component = 8,\n\tDRM_MODE_SUBCONNECTOR_SCART = 9,\n\tDRM_MODE_SUBCONNECTOR_DisplayPort = 10,\n\tDRM_MODE_SUBCONNECTOR_HDMIA = 11,\n\tDRM_MODE_SUBCONNECTOR_Native = 15,\n\tDRM_MODE_SUBCONNECTOR_Wireless = 18,\n};\n\nenum drm_panel_orientation {\n\tDRM_MODE_PANEL_ORIENTATION_UNKNOWN = -1,\n\tDRM_MODE_PANEL_ORIENTATION_NORMAL = 0,\n\tDRM_MODE_PANEL_ORIENTATION_BOTTOM_UP = 1,\n\tDRM_MODE_PANEL_ORIENTATION_LEFT_UP = 2,\n\tDRM_MODE_PANEL_ORIENTATION_RIGHT_UP = 3,\n};\n\nenum drm_plane_type {\n\tDRM_PLANE_TYPE_OVERLAY = 0,\n\tDRM_PLANE_TYPE_PRIMARY = 1,\n\tDRM_PLANE_TYPE_CURSOR = 2,\n};\n\nenum drm_privacy_screen_status {\n\tPRIVACY_SCREEN_DISABLED = 0,\n\tPRIVACY_SCREEN_ENABLED = 1,\n\tPRIVACY_SCREEN_DISABLED_LOCKED = 2,\n\tPRIVACY_SCREEN_ENABLED_LOCKED = 3,\n};\n\nenum drm_scaling_filter {\n\tDRM_SCALING_FILTER_DEFAULT = 0,\n\tDRM_SCALING_FILTER_NEAREST_NEIGHBOR = 1,\n};\n\nenum drm_stat_type {\n\t_DRM_STAT_LOCK = 0,\n\t_DRM_STAT_OPENS = 1,\n\t_DRM_STAT_CLOSES = 2,\n\t_DRM_STAT_IOCTLS = 3,\n\t_DRM_STAT_LOCKS = 4,\n\t_DRM_STAT_UNLOCKS = 5,\n\t_DRM_STAT_VALUE = 6,\n\t_DRM_STAT_BYTE = 7,\n\t_DRM_STAT_COUNT = 8,\n\t_DRM_STAT_IRQ = 9,\n\t_DRM_STAT_PRIMARY = 10,\n\t_DRM_STAT_SECONDARY = 11,\n\t_DRM_STAT_DMA = 12,\n\t_DRM_STAT_SPECIAL = 13,\n\t_DRM_STAT_MISSED = 14,\n};\n\nenum drm_vblank_seq_type {\n\t_DRM_VBLANK_ABSOLUTE = 0,\n\t_DRM_VBLANK_RELATIVE = 1,\n\t_DRM_VBLANK_HIGH_CRTC_MASK = 62,\n\t_DRM_VBLANK_EVENT = 67108864,\n\t_DRM_VBLANK_FLIP = 134217728,\n\t_DRM_VBLANK_NEXTONMISS = 268435456,\n\t_DRM_VBLANK_SECONDARY = 536870912,\n\t_DRM_VBLANK_SIGNAL = 1073741824,\n};\n\nenum dsa_db_type {\n\tDSA_DB_PORT = 0,\n\tDSA_DB_LAG = 1,\n\tDSA_DB_BRIDGE = 2,\n};\n\nenum dsa_tag_protocol {\n\tDSA_TAG_PROTO_NONE = 0,\n\tDSA_TAG_PROTO_BRCM = 1,\n\tDSA_TAG_PROTO_BRCM_LEGACY = 22,\n\tDSA_TAG_PROTO_BRCM_PREPEND = 2,\n\tDSA_TAG_PROTO_DSA = 3,\n\tDSA_TAG_PROTO_EDSA = 4,\n\tDSA_TAG_PROTO_GSWIP = 5,\n\tDSA_TAG_PROTO_KSZ9477 = 6,\n\tDSA_TAG_PROTO_KSZ9893 = 7,\n\tDSA_TAG_PROTO_LAN9303 = 8,\n\tDSA_TAG_PROTO_MTK = 9,\n\tDSA_TAG_PROTO_QCA = 10,\n\tDSA_TAG_PROTO_TRAILER = 11,\n\tDSA_TAG_PROTO_8021Q = 12,\n\tDSA_TAG_PROTO_SJA1105 = 13,\n\tDSA_TAG_PROTO_KSZ8795 = 14,\n\tDSA_TAG_PROTO_OCELOT = 15,\n\tDSA_TAG_PROTO_AR9331 = 16,\n\tDSA_TAG_PROTO_RTL4_A = 17,\n\tDSA_TAG_PROTO_HELLCREEK = 18,\n\tDSA_TAG_PROTO_XRS700X = 19,\n\tDSA_TAG_PROTO_OCELOT_8021Q = 20,\n\tDSA_TAG_PROTO_SEVILLE = 21,\n\tDSA_TAG_PROTO_SJA1110 = 23,\n\tDSA_TAG_PROTO_RTL8_4 = 24,\n\tDSA_TAG_PROTO_RTL8_4T = 25,\n\tDSA_TAG_PROTO_RZN1_A5PSW = 26,\n\tDSA_TAG_PROTO_LAN937X = 27,\n\tDSA_TAG_PROTO_VSC73XX_8021Q = 28,\n};\n\nenum dw_edma_chip_flags {\n\tDW_EDMA_CHIP_LOCAL = 1,\n};\n\nenum dw_edma_map_format {\n\tEDMA_MF_EDMA_LEGACY = 0,\n\tEDMA_MF_EDMA_UNROLL = 1,\n\tEDMA_MF_HDMA_COMPAT = 5,\n\tEDMA_MF_HDMA_NATIVE = 7,\n};\n\nenum dw_pcie_app_clk {\n\tDW_PCIE_DBI_CLK = 0,\n\tDW_PCIE_MSTR_CLK = 1,\n\tDW_PCIE_SLV_CLK = 2,\n\tDW_PCIE_NUM_APP_CLKS = 3,\n};\n\nenum dw_pcie_app_rst {\n\tDW_PCIE_DBI_RST = 0,\n\tDW_PCIE_MSTR_RST = 1,\n\tDW_PCIE_SLV_RST = 2,\n\tDW_PCIE_NUM_APP_RSTS = 3,\n};\n\nenum dw_pcie_core_clk {\n\tDW_PCIE_PIPE_CLK = 0,\n\tDW_PCIE_CORE_CLK = 1,\n\tDW_PCIE_AUX_CLK = 2,\n\tDW_PCIE_REF_CLK = 3,\n\tDW_PCIE_NUM_CORE_CLKS = 4,\n};\n\nenum dw_pcie_core_rst {\n\tDW_PCIE_NON_STICKY_RST = 0,\n\tDW_PCIE_STICKY_RST = 1,\n\tDW_PCIE_CORE_RST = 2,\n\tDW_PCIE_PIPE_RST = 3,\n\tDW_PCIE_PHY_RST = 4,\n\tDW_PCIE_HOT_RST = 5,\n\tDW_PCIE_PWR_RST = 6,\n\tDW_PCIE_NUM_CORE_RSTS = 7,\n};\n\nenum dw_pcie_device_mode {\n\tDW_PCIE_UNKNOWN_TYPE = 0,\n\tDW_PCIE_EP_TYPE = 1,\n\tDW_PCIE_LEG_EP_TYPE = 2,\n\tDW_PCIE_RC_TYPE = 3,\n};\n\nenum dw_pcie_ltssm {\n\tDW_PCIE_LTSSM_DETECT_QUIET = 0,\n\tDW_PCIE_LTSSM_DETECT_ACT = 1,\n\tDW_PCIE_LTSSM_L0 = 17,\n\tDW_PCIE_LTSSM_L2_IDLE = 21,\n\tDW_PCIE_LTSSM_UNKNOWN = 4294967295,\n};\n\nenum dwc2_control_phase {\n\tDWC2_CONTROL_SETUP = 0,\n\tDWC2_CONTROL_DATA = 1,\n\tDWC2_CONTROL_STATUS = 2,\n};\n\nenum dwc2_halt_status {\n\tDWC2_HC_XFER_NO_HALT_STATUS = 0,\n\tDWC2_HC_XFER_COMPLETE = 1,\n\tDWC2_HC_XFER_URB_COMPLETE = 2,\n\tDWC2_HC_XFER_ACK = 3,\n\tDWC2_HC_XFER_NAK = 4,\n\tDWC2_HC_XFER_NYET = 5,\n\tDWC2_HC_XFER_STALL = 6,\n\tDWC2_HC_XFER_XACT_ERR = 7,\n\tDWC2_HC_XFER_FRAME_OVERRUN = 8,\n\tDWC2_HC_XFER_BABBLE_ERR = 9,\n\tDWC2_HC_XFER_DATA_TOGGLE_ERR = 10,\n\tDWC2_HC_XFER_AHB_ERR = 11,\n\tDWC2_HC_XFER_PERIODIC_INCOMPLETE = 12,\n\tDWC2_HC_XFER_URB_DEQUEUE = 13,\n};\n\nenum dwc2_hsotg_dmamode {\n\tS3C_HSOTG_DMA_NONE = 0,\n\tS3C_HSOTG_DMA_ONLY = 1,\n\tS3C_HSOTG_DMA_DRV = 2,\n};\n\nenum dwc2_lx_state {\n\tDWC2_L0 = 0,\n\tDWC2_L1 = 1,\n\tDWC2_L2 = 2,\n\tDWC2_L3 = 3,\n};\n\nenum dwc2_transaction_type {\n\tDWC2_TRANSACTION_NONE = 0,\n\tDWC2_TRANSACTION_PERIODIC = 1,\n\tDWC2_TRANSACTION_NON_PERIODIC = 2,\n\tDWC2_TRANSACTION_ALL = 3,\n};\n\nenum dynevent_type {\n\tDYNEVENT_TYPE_SYNTH = 1,\n\tDYNEVENT_TYPE_KPROBE = 2,\n\tDYNEVENT_TYPE_NONE = 3,\n};\n\nenum e820_type {\n\tE820_TYPE_RAM = 1,\n\tE820_TYPE_RESERVED = 2,\n\tE820_TYPE_ACPI = 3,\n\tE820_TYPE_NVS = 4,\n\tE820_TYPE_UNUSABLE = 5,\n\tE820_TYPE_PMEM = 7,\n\tE820_TYPE_PRAM = 12,\n\tE820_TYPE_SOFT_RESERVED = 4026531839,\n\tE820_TYPE_RESERVED_KERN = 128,\n};\n\nenum ec_command {\n\tACPI_EC_COMMAND_READ = 128,\n\tACPI_EC_COMMAND_WRITE = 129,\n\tACPI_EC_BURST_ENABLE = 130,\n\tACPI_EC_BURST_DISABLE = 131,\n\tACPI_EC_COMMAND_QUERY = 132,\n};\n\nenum ec_comms_status {\n\tEC_COMMS_STATUS_PROCESSING = 1,\n};\n\nenum ec_led_colors {\n\tEC_LED_COLOR_RED = 0,\n\tEC_LED_COLOR_GREEN = 1,\n\tEC_LED_COLOR_BLUE = 2,\n\tEC_LED_COLOR_YELLOW = 3,\n\tEC_LED_COLOR_WHITE = 4,\n\tEC_LED_COLOR_AMBER = 5,\n\tEC_LED_COLOR_COUNT = 6,\n};\n\nenum ec_mkbp_event {\n\tEC_MKBP_EVENT_KEY_MATRIX = 0,\n\tEC_MKBP_EVENT_HOST_EVENT = 1,\n\tEC_MKBP_EVENT_SENSOR_FIFO = 2,\n\tEC_MKBP_EVENT_BUTTON = 3,\n\tEC_MKBP_EVENT_SWITCH = 4,\n\tEC_MKBP_EVENT_FINGERPRINT = 5,\n\tEC_MKBP_EVENT_SYSRQ = 6,\n\tEC_MKBP_EVENT_HOST_EVENT64 = 7,\n\tEC_MKBP_EVENT_CEC_EVENT = 8,\n\tEC_MKBP_EVENT_CEC_MESSAGE = 9,\n\tEC_MKBP_EVENT_PCHG = 12,\n\tEC_MKBP_EVENT_COUNT = 13,\n};\n\nenum ec_status {\n\tEC_RES_SUCCESS = 0,\n\tEC_RES_INVALID_COMMAND = 1,\n\tEC_RES_ERROR = 2,\n\tEC_RES_INVALID_PARAM = 3,\n\tEC_RES_ACCESS_DENIED = 4,\n\tEC_RES_INVALID_RESPONSE = 5,\n\tEC_RES_INVALID_VERSION = 6,\n\tEC_RES_INVALID_CHECKSUM = 7,\n\tEC_RES_IN_PROGRESS = 8,\n\tEC_RES_UNAVAILABLE = 9,\n\tEC_RES_TIMEOUT = 10,\n\tEC_RES_OVERFLOW = 11,\n\tEC_RES_INVALID_HEADER = 12,\n\tEC_RES_REQUEST_TRUNCATED = 13,\n\tEC_RES_RESPONSE_TOO_BIG = 14,\n\tEC_RES_BUS_ERROR = 15,\n\tEC_RES_BUSY = 16,\n\tEC_RES_INVALID_HEADER_VERSION = 17,\n\tEC_RES_INVALID_HEADER_CRC = 18,\n\tEC_RES_INVALID_DATA_CRC = 19,\n\tEC_RES_DUP_UNAVAILABLE = 20,\n};\n\nenum ec_temp_thresholds {\n\tEC_TEMP_THRESH_WARN = 0,\n\tEC_TEMP_THRESH_HIGH = 1,\n\tEC_TEMP_THRESH_HALT = 2,\n\tEC_TEMP_THRESH_COUNT = 3,\n};\n\nenum ecc_dialects {\n\tECC_DIALECT_STANDARD = 0,\n\tECC_DIALECT_ED25519 = 1,\n\tECC_DIALECT_SAFECURVE = 2,\n};\n\nenum ecryptfs_token_types {\n\tECRYPTFS_PASSWORD = 0,\n\tECRYPTFS_PRIVATE_KEY = 1,\n};\n\nenum edac_mc_layer_type {\n\tEDAC_MC_LAYER_BRANCH = 0,\n\tEDAC_MC_LAYER_CHANNEL = 1,\n\tEDAC_MC_LAYER_SLOT = 2,\n\tEDAC_MC_LAYER_CHIP_SELECT = 3,\n\tEDAC_MC_LAYER_ALL_MEM = 4,\n};\n\nenum edac_type {\n\tEDAC_UNKNOWN = 0,\n\tEDAC_NONE = 1,\n\tEDAC_RESERVED = 2,\n\tEDAC_PARITY = 3,\n\tEDAC_EC = 4,\n\tEDAC_SECDED = 5,\n\tEDAC_S2ECD2ED = 6,\n\tEDAC_S4ECD4ED = 7,\n\tEDAC_S8ECD8ED = 8,\n\tEDAC_S16ECD16ED = 9,\n};\n\nenum edid_block_status {\n\tEDID_BLOCK_OK = 0,\n\tEDID_BLOCK_READ_FAIL = 1,\n\tEDID_BLOCK_NULL = 2,\n\tEDID_BLOCK_ZERO = 3,\n\tEDID_BLOCK_HEADER_CORRUPT = 4,\n\tEDID_BLOCK_HEADER_REPAIR = 5,\n\tEDID_BLOCK_HEADER_FIXED = 6,\n\tEDID_BLOCK_CHECKSUM = 7,\n\tEDID_BLOCK_VERSION = 8,\n};\n\nenum efi_rts_ids {\n\tEFI_NONE = 0,\n\tEFI_GET_TIME = 1,\n\tEFI_SET_TIME = 2,\n\tEFI_GET_WAKEUP_TIME = 3,\n\tEFI_SET_WAKEUP_TIME = 4,\n\tEFI_GET_VARIABLE = 5,\n\tEFI_GET_NEXT_VARIABLE = 6,\n\tEFI_SET_VARIABLE = 7,\n\tEFI_QUERY_VARIABLE_INFO = 8,\n\tEFI_GET_NEXT_HIGH_MONO_COUNT = 9,\n\tEFI_RESET_SYSTEM = 10,\n\tEFI_UPDATE_CAPSULE = 11,\n\tEFI_QUERY_CAPSULE_CAPS = 12,\n\tEFI_ACPI_PRM_HANDLER = 13,\n};\n\nenum efi_secureboot_mode {\n\tefi_secureboot_mode_unset = 0,\n\tefi_secureboot_mode_unknown = 1,\n\tefi_secureboot_mode_disabled = 2,\n\tefi_secureboot_mode_enabled = 3,\n};\n\nenum ehci_hrtimer_event {\n\tEHCI_HRTIMER_POLL_ASS = 0,\n\tEHCI_HRTIMER_POLL_PSS = 1,\n\tEHCI_HRTIMER_POLL_DEAD = 2,\n\tEHCI_HRTIMER_UNLINK_INTR = 3,\n\tEHCI_HRTIMER_FREE_ITDS = 4,\n\tEHCI_HRTIMER_ACTIVE_UNLINK = 5,\n\tEHCI_HRTIMER_START_UNLINK_INTR = 6,\n\tEHCI_HRTIMER_ASYNC_UNLINKS = 7,\n\tEHCI_HRTIMER_IAA_WATCHDOG = 8,\n\tEHCI_HRTIMER_DISABLE_PERIODIC = 9,\n\tEHCI_HRTIMER_DISABLE_ASYNC = 10,\n\tEHCI_HRTIMER_IO_WATCHDOG = 11,\n\tEHCI_HRTIMER_NUM_EVENTS = 12,\n};\n\nenum ehci_rh_state {\n\tEHCI_RH_HALTED = 0,\n\tEHCI_RH_SUSPENDED = 1,\n\tEHCI_RH_RUNNING = 2,\n\tEHCI_RH_STOPPING = 3,\n};\n\nenum elants_chip_id {\n\tEKTH3500 = 0,\n\tEKTF3624 = 1,\n};\n\nenum elants_iap_mode {\n\tELAN_IAP_OPERATIONAL = 0,\n\tELAN_IAP_RECOVERY = 1,\n};\n\nenum elants_state {\n\tELAN_STATE_NORMAL = 0,\n\tELAN_WAIT_QUEUE_HEADER = 1,\n\tELAN_WAIT_RECALIBRATION = 2,\n};\n\nenum elv_merge {\n\tELEVATOR_NO_MERGE = 0,\n\tELEVATOR_FRONT_MERGE = 1,\n\tELEVATOR_BACK_MERGE = 2,\n\tELEVATOR_DISCARD_MERGE = 3,\n};\n\nenum enable_type {\n\tundefined = -1,\n\tuser_disabled = 0,\n\tauto_disabled = 1,\n\tuser_enabled = 2,\n\tauto_enabled = 3,\n};\n\nenum energy_perf_value_index {\n\tEPP_INDEX_DEFAULT = 0,\n\tEPP_INDEX_PERFORMANCE = 1,\n\tEPP_INDEX_BALANCE_PERFORMANCE = 2,\n\tEPP_INDEX_BALANCE_POWERSAVE = 3,\n\tEPP_INDEX_POWERSAVE = 4,\n};\n\nenum energy_perf_value_index___2 {\n\tEPB_INDEX_PERFORMANCE = 0,\n\tEPB_INDEX_BALANCE_PERFORMANCE = 1,\n\tEPB_INDEX_NORMAL = 2,\n\tEPB_INDEX_BALANCE_POWERSAVE = 3,\n\tEPB_INDEX_POWERSAVE = 4,\n};\n\nenum environment_cap {\n\tENVIRON_ANY = 0,\n\tENVIRON_INDOOR = 1,\n\tENVIRON_OUTDOOR = 2,\n};\n\nenum err_types {\n\tERR_TYPE_CACHE = 0,\n\tERR_TYPE_TLB = 1,\n\tERR_TYPE_BUS = 2,\n\tERR_TYPE_MS = 3,\n\tN_ERR_TYPES = 4,\n};\n\nenum error_detector {\n\tERROR_DETECTOR_KFENCE = 0,\n\tERROR_DETECTOR_KASAN = 1,\n\tERROR_DETECTOR_WARN = 2,\n};\n\nenum es_result {\n\tES_OK = 0,\n\tES_UNSUPPORTED = 1,\n\tES_VMM_ERROR = 2,\n\tES_DECODE_FAILED = 3,\n\tES_EXCEPTION = 4,\n\tES_RETRY = 5,\n};\n\nenum ethnl_sock_type {\n\tETHTOOL_SOCK_TYPE_MODULE_FW_FLASH = 0,\n};\n\nenum ethtool_c33_pse_admin_state {\n\tETHTOOL_C33_PSE_ADMIN_STATE_UNKNOWN = 1,\n\tETHTOOL_C33_PSE_ADMIN_STATE_DISABLED = 2,\n\tETHTOOL_C33_PSE_ADMIN_STATE_ENABLED = 3,\n};\n\nenum ethtool_c33_pse_ext_state {\n\tETHTOOL_C33_PSE_EXT_STATE_ERROR_CONDITION = 1,\n\tETHTOOL_C33_PSE_EXT_STATE_MR_MPS_VALID = 2,\n\tETHTOOL_C33_PSE_EXT_STATE_MR_PSE_ENABLE = 3,\n\tETHTOOL_C33_PSE_EXT_STATE_OPTION_DETECT_TED = 4,\n\tETHTOOL_C33_PSE_EXT_STATE_OPTION_VPORT_LIM = 5,\n\tETHTOOL_C33_PSE_EXT_STATE_OVLD_DETECTED = 6,\n\tETHTOOL_C33_PSE_EXT_STATE_PD_DLL_POWER_TYPE = 7,\n\tETHTOOL_C33_PSE_EXT_STATE_POWER_NOT_AVAILABLE = 8,\n\tETHTOOL_C33_PSE_EXT_STATE_SHORT_DETECTED = 9,\n};\n\nenum ethtool_c33_pse_ext_substate_error_condition {\n\tETHTOOL_C33_PSE_EXT_SUBSTATE_ERROR_CONDITION_NON_EXISTING_PORT = 1,\n\tETHTOOL_C33_PSE_EXT_SUBSTATE_ERROR_CONDITION_UNDEFINED_PORT = 2,\n\tETHTOOL_C33_PSE_EXT_SUBSTATE_ERROR_CONDITION_INTERNAL_HW_FAULT = 3,\n\tETHTOOL_C33_PSE_EXT_SUBSTATE_ERROR_CONDITION_COMM_ERROR_AFTER_FORCE_ON = 4,\n\tETHTOOL_C33_PSE_EXT_SUBSTATE_ERROR_CONDITION_UNKNOWN_PORT_STATUS = 5,\n\tETHTOOL_C33_PSE_EXT_SUBSTATE_ERROR_CONDITION_HOST_CRASH_TURN_OFF = 6,\n\tETHTOOL_C33_PSE_EXT_SUBSTATE_ERROR_CONDITION_HOST_CRASH_FORCE_SHUTDOWN = 7,\n\tETHTOOL_C33_PSE_EXT_SUBSTATE_ERROR_CONDITION_CONFIG_CHANGE = 8,\n\tETHTOOL_C33_PSE_EXT_SUBSTATE_ERROR_CONDITION_DETECTED_OVER_TEMP = 9,\n};\n\nenum ethtool_c33_pse_ext_substate_mr_pse_enable {\n\tETHTOOL_C33_PSE_EXT_SUBSTATE_MR_PSE_ENABLE_DISABLE_PIN_ACTIVE = 1,\n};\n\nenum ethtool_c33_pse_ext_substate_option_detect_ted {\n\tETHTOOL_C33_PSE_EXT_SUBSTATE_OPTION_DETECT_TED_DET_IN_PROCESS = 1,\n\tETHTOOL_C33_PSE_EXT_SUBSTATE_OPTION_DETECT_TED_CONNECTION_CHECK_ERROR = 2,\n};\n\nenum ethtool_c33_pse_ext_substate_option_vport_lim {\n\tETHTOOL_C33_PSE_EXT_SUBSTATE_OPTION_VPORT_LIM_HIGH_VOLTAGE = 1,\n\tETHTOOL_C33_PSE_EXT_SUBSTATE_OPTION_VPORT_LIM_LOW_VOLTAGE = 2,\n\tETHTOOL_C33_PSE_EXT_SUBSTATE_OPTION_VPORT_LIM_VOLTAGE_INJECTION = 3,\n};\n\nenum ethtool_c33_pse_ext_substate_ovld_detected {\n\tETHTOOL_C33_PSE_EXT_SUBSTATE_OVLD_DETECTED_OVERLOAD = 1,\n};\n\nenum ethtool_c33_pse_ext_substate_power_not_available {\n\tETHTOOL_C33_PSE_EXT_SUBSTATE_POWER_NOT_AVAILABLE_BUDGET_EXCEEDED = 1,\n\tETHTOOL_C33_PSE_EXT_SUBSTATE_POWER_NOT_AVAILABLE_PORT_PW_LIMIT_EXCEEDS_CONTROLLER_BUDGET = 2,\n\tETHTOOL_C33_PSE_EXT_SUBSTATE_POWER_NOT_AVAILABLE_PD_REQUEST_EXCEEDS_PORT_LIMIT = 3,\n\tETHTOOL_C33_PSE_EXT_SUBSTATE_POWER_NOT_AVAILABLE_HW_PW_LIMIT = 4,\n};\n\nenum ethtool_c33_pse_ext_substate_short_detected {\n\tETHTOOL_C33_PSE_EXT_SUBSTATE_SHORT_DETECTED_SHORT_CONDITION = 1,\n};\n\nenum ethtool_c33_pse_pw_d_status {\n\tETHTOOL_C33_PSE_PW_D_STATUS_UNKNOWN = 1,\n\tETHTOOL_C33_PSE_PW_D_STATUS_DISABLED = 2,\n\tETHTOOL_C33_PSE_PW_D_STATUS_SEARCHING = 3,\n\tETHTOOL_C33_PSE_PW_D_STATUS_DELIVERING = 4,\n\tETHTOOL_C33_PSE_PW_D_STATUS_TEST = 5,\n\tETHTOOL_C33_PSE_PW_D_STATUS_FAULT = 6,\n\tETHTOOL_C33_PSE_PW_D_STATUS_OTHERFAULT = 7,\n};\n\nenum ethtool_cmis_cdb_cmd_id {\n\tETHTOOL_CMIS_CDB_CMD_QUERY_STATUS = 0,\n\tETHTOOL_CMIS_CDB_CMD_MODULE_FEATURES = 64,\n\tETHTOOL_CMIS_CDB_CMD_FW_MANAGMENT_FEATURES = 65,\n\tETHTOOL_CMIS_CDB_CMD_START_FW_DOWNLOAD = 257,\n\tETHTOOL_CMIS_CDB_CMD_WRITE_FW_BLOCK_LPL = 259,\n\tETHTOOL_CMIS_CDB_CMD_COMPLETE_FW_DOWNLOAD = 263,\n\tETHTOOL_CMIS_CDB_CMD_RUN_FW_IMAGE = 265,\n\tETHTOOL_CMIS_CDB_CMD_COMMIT_FW_IMAGE = 266,\n};\n\nenum ethtool_fec_config_bits {\n\tETHTOOL_FEC_NONE_BIT = 0,\n\tETHTOOL_FEC_AUTO_BIT = 1,\n\tETHTOOL_FEC_OFF_BIT = 2,\n\tETHTOOL_FEC_RS_BIT = 3,\n\tETHTOOL_FEC_BASER_BIT = 4,\n\tETHTOOL_FEC_LLRS_BIT = 5,\n};\n\nenum ethtool_flags {\n\tETH_FLAG_TXVLAN = 128,\n\tETH_FLAG_RXVLAN = 256,\n\tETH_FLAG_LRO = 32768,\n\tETH_FLAG_NTUPLE = 134217728,\n\tETH_FLAG_RXHASH = 268435456,\n};\n\nenum ethtool_header_flags {\n\tETHTOOL_FLAG_COMPACT_BITSETS = 1,\n\tETHTOOL_FLAG_OMIT_REPLY = 2,\n\tETHTOOL_FLAG_STATS = 4,\n};\n\nenum ethtool_link_ext_state {\n\tETHTOOL_LINK_EXT_STATE_AUTONEG = 0,\n\tETHTOOL_LINK_EXT_STATE_LINK_TRAINING_FAILURE = 1,\n\tETHTOOL_LINK_EXT_STATE_LINK_LOGICAL_MISMATCH = 2,\n\tETHTOOL_LINK_EXT_STATE_BAD_SIGNAL_INTEGRITY = 3,\n\tETHTOOL_LINK_EXT_STATE_NO_CABLE = 4,\n\tETHTOOL_LINK_EXT_STATE_CABLE_ISSUE = 5,\n\tETHTOOL_LINK_EXT_STATE_EEPROM_ISSUE = 6,\n\tETHTOOL_LINK_EXT_STATE_CALIBRATION_FAILURE = 7,\n\tETHTOOL_LINK_EXT_STATE_POWER_BUDGET_EXCEEDED = 8,\n\tETHTOOL_LINK_EXT_STATE_OVERHEAT = 9,\n\tETHTOOL_LINK_EXT_STATE_MODULE = 10,\n};\n\nenum ethtool_link_ext_substate_autoneg {\n\tETHTOOL_LINK_EXT_SUBSTATE_AN_NO_PARTNER_DETECTED = 1,\n\tETHTOOL_LINK_EXT_SUBSTATE_AN_ACK_NOT_RECEIVED = 2,\n\tETHTOOL_LINK_EXT_SUBSTATE_AN_NEXT_PAGE_EXCHANGE_FAILED = 3,\n\tETHTOOL_LINK_EXT_SUBSTATE_AN_NO_PARTNER_DETECTED_FORCE_MODE = 4,\n\tETHTOOL_LINK_EXT_SUBSTATE_AN_FEC_MISMATCH_DURING_OVERRIDE = 5,\n\tETHTOOL_LINK_EXT_SUBSTATE_AN_NO_HCD = 6,\n};\n\nenum ethtool_link_ext_substate_bad_signal_integrity {\n\tETHTOOL_LINK_EXT_SUBSTATE_BSI_LARGE_NUMBER_OF_PHYSICAL_ERRORS = 1,\n\tETHTOOL_LINK_EXT_SUBSTATE_BSI_UNSUPPORTED_RATE = 2,\n\tETHTOOL_LINK_EXT_SUBSTATE_BSI_SERDES_REFERENCE_CLOCK_LOST = 3,\n\tETHTOOL_LINK_EXT_SUBSTATE_BSI_SERDES_ALOS = 4,\n};\n\nenum ethtool_link_ext_substate_cable_issue {\n\tETHTOOL_LINK_EXT_SUBSTATE_CI_UNSUPPORTED_CABLE = 1,\n\tETHTOOL_LINK_EXT_SUBSTATE_CI_CABLE_TEST_FAILURE = 2,\n};\n\nenum ethtool_link_ext_substate_link_logical_mismatch {\n\tETHTOOL_LINK_EXT_SUBSTATE_LLM_PCS_DID_NOT_ACQUIRE_BLOCK_LOCK = 1,\n\tETHTOOL_LINK_EXT_SUBSTATE_LLM_PCS_DID_NOT_ACQUIRE_AM_LOCK = 2,\n\tETHTOOL_LINK_EXT_SUBSTATE_LLM_PCS_DID_NOT_GET_ALIGN_STATUS = 3,\n\tETHTOOL_LINK_EXT_SUBSTATE_LLM_FC_FEC_IS_NOT_LOCKED = 4,\n\tETHTOOL_LINK_EXT_SUBSTATE_LLM_RS_FEC_IS_NOT_LOCKED = 5,\n};\n\nenum ethtool_link_ext_substate_link_training {\n\tETHTOOL_LINK_EXT_SUBSTATE_LT_KR_FRAME_LOCK_NOT_ACQUIRED = 1,\n\tETHTOOL_LINK_EXT_SUBSTATE_LT_KR_LINK_INHIBIT_TIMEOUT = 2,\n\tETHTOOL_LINK_EXT_SUBSTATE_LT_KR_LINK_PARTNER_DID_NOT_SET_RECEIVER_READY = 3,\n\tETHTOOL_LINK_EXT_SUBSTATE_LT_REMOTE_FAULT = 4,\n};\n\nenum ethtool_link_ext_substate_module {\n\tETHTOOL_LINK_EXT_SUBSTATE_MODULE_CMIS_NOT_READY = 1,\n};\n\nenum ethtool_link_mode_bit_indices {\n\tETHTOOL_LINK_MODE_10baseT_Half_BIT = 0,\n\tETHTOOL_LINK_MODE_10baseT_Full_BIT = 1,\n\tETHTOOL_LINK_MODE_100baseT_Half_BIT = 2,\n\tETHTOOL_LINK_MODE_100baseT_Full_BIT = 3,\n\tETHTOOL_LINK_MODE_1000baseT_Half_BIT = 4,\n\tETHTOOL_LINK_MODE_1000baseT_Full_BIT = 5,\n\tETHTOOL_LINK_MODE_Autoneg_BIT = 6,\n\tETHTOOL_LINK_MODE_TP_BIT = 7,\n\tETHTOOL_LINK_MODE_AUI_BIT = 8,\n\tETHTOOL_LINK_MODE_MII_BIT = 9,\n\tETHTOOL_LINK_MODE_FIBRE_BIT = 10,\n\tETHTOOL_LINK_MODE_BNC_BIT = 11,\n\tETHTOOL_LINK_MODE_10000baseT_Full_BIT = 12,\n\tETHTOOL_LINK_MODE_Pause_BIT = 13,\n\tETHTOOL_LINK_MODE_Asym_Pause_BIT = 14,\n\tETHTOOL_LINK_MODE_2500baseX_Full_BIT = 15,\n\tETHTOOL_LINK_MODE_Backplane_BIT = 16,\n\tETHTOOL_LINK_MODE_1000baseKX_Full_BIT = 17,\n\tETHTOOL_LINK_MODE_10000baseKX4_Full_BIT = 18,\n\tETHTOOL_LINK_MODE_10000baseKR_Full_BIT = 19,\n\tETHTOOL_LINK_MODE_10000baseR_FEC_BIT = 20,\n\tETHTOOL_LINK_MODE_20000baseMLD2_Full_BIT = 21,\n\tETHTOOL_LINK_MODE_20000baseKR2_Full_BIT = 22,\n\tETHTOOL_LINK_MODE_40000baseKR4_Full_BIT = 23,\n\tETHTOOL_LINK_MODE_40000baseCR4_Full_BIT = 24,\n\tETHTOOL_LINK_MODE_40000baseSR4_Full_BIT = 25,\n\tETHTOOL_LINK_MODE_40000baseLR4_Full_BIT = 26,\n\tETHTOOL_LINK_MODE_56000baseKR4_Full_BIT = 27,\n\tETHTOOL_LINK_MODE_56000baseCR4_Full_BIT = 28,\n\tETHTOOL_LINK_MODE_56000baseSR4_Full_BIT = 29,\n\tETHTOOL_LINK_MODE_56000baseLR4_Full_BIT = 30,\n\tETHTOOL_LINK_MODE_25000baseCR_Full_BIT = 31,\n\tETHTOOL_LINK_MODE_25000baseKR_Full_BIT = 32,\n\tETHTOOL_LINK_MODE_25000baseSR_Full_BIT = 33,\n\tETHTOOL_LINK_MODE_50000baseCR2_Full_BIT = 34,\n\tETHTOOL_LINK_MODE_50000baseKR2_Full_BIT = 35,\n\tETHTOOL_LINK_MODE_100000baseKR4_Full_BIT = 36,\n\tETHTOOL_LINK_MODE_100000baseSR4_Full_BIT = 37,\n\tETHTOOL_LINK_MODE_100000baseCR4_Full_BIT = 38,\n\tETHTOOL_LINK_MODE_100000baseLR4_ER4_Full_BIT = 39,\n\tETHTOOL_LINK_MODE_50000baseSR2_Full_BIT = 40,\n\tETHTOOL_LINK_MODE_1000baseX_Full_BIT = 41,\n\tETHTOOL_LINK_MODE_10000baseCR_Full_BIT = 42,\n\tETHTOOL_LINK_MODE_10000baseSR_Full_BIT = 43,\n\tETHTOOL_LINK_MODE_10000baseLR_Full_BIT = 44,\n\tETHTOOL_LINK_MODE_10000baseLRM_Full_BIT = 45,\n\tETHTOOL_LINK_MODE_10000baseER_Full_BIT = 46,\n\tETHTOOL_LINK_MODE_2500baseT_Full_BIT = 47,\n\tETHTOOL_LINK_MODE_5000baseT_Full_BIT = 48,\n\tETHTOOL_LINK_MODE_FEC_NONE_BIT = 49,\n\tETHTOOL_LINK_MODE_FEC_RS_BIT = 50,\n\tETHTOOL_LINK_MODE_FEC_BASER_BIT = 51,\n\tETHTOOL_LINK_MODE_50000baseKR_Full_BIT = 52,\n\tETHTOOL_LINK_MODE_50000baseSR_Full_BIT = 53,\n\tETHTOOL_LINK_MODE_50000baseCR_Full_BIT = 54,\n\tETHTOOL_LINK_MODE_50000baseLR_ER_FR_Full_BIT = 55,\n\tETHTOOL_LINK_MODE_50000baseDR_Full_BIT = 56,\n\tETHTOOL_LINK_MODE_100000baseKR2_Full_BIT = 57,\n\tETHTOOL_LINK_MODE_100000baseSR2_Full_BIT = 58,\n\tETHTOOL_LINK_MODE_100000baseCR2_Full_BIT = 59,\n\tETHTOOL_LINK_MODE_100000baseLR2_ER2_FR2_Full_BIT = 60,\n\tETHTOOL_LINK_MODE_100000baseDR2_Full_BIT = 61,\n\tETHTOOL_LINK_MODE_200000baseKR4_Full_BIT = 62,\n\tETHTOOL_LINK_MODE_200000baseSR4_Full_BIT = 63,\n\tETHTOOL_LINK_MODE_200000baseLR4_ER4_FR4_Full_BIT = 64,\n\tETHTOOL_LINK_MODE_200000baseDR4_Full_BIT = 65,\n\tETHTOOL_LINK_MODE_200000baseCR4_Full_BIT = 66,\n\tETHTOOL_LINK_MODE_100baseT1_Full_BIT = 67,\n\tETHTOOL_LINK_MODE_1000baseT1_Full_BIT = 68,\n\tETHTOOL_LINK_MODE_400000baseKR8_Full_BIT = 69,\n\tETHTOOL_LINK_MODE_400000baseSR8_Full_BIT = 70,\n\tETHTOOL_LINK_MODE_400000baseLR8_ER8_FR8_Full_BIT = 71,\n\tETHTOOL_LINK_MODE_400000baseDR8_Full_BIT = 72,\n\tETHTOOL_LINK_MODE_400000baseCR8_Full_BIT = 73,\n\tETHTOOL_LINK_MODE_FEC_LLRS_BIT = 74,\n\tETHTOOL_LINK_MODE_100000baseKR_Full_BIT = 75,\n\tETHTOOL_LINK_MODE_100000baseSR_Full_BIT = 76,\n\tETHTOOL_LINK_MODE_100000baseLR_ER_FR_Full_BIT = 77,\n\tETHTOOL_LINK_MODE_100000baseCR_Full_BIT = 78,\n\tETHTOOL_LINK_MODE_100000baseDR_Full_BIT = 79,\n\tETHTOOL_LINK_MODE_200000baseKR2_Full_BIT = 80,\n\tETHTOOL_LINK_MODE_200000baseSR2_Full_BIT = 81,\n\tETHTOOL_LINK_MODE_200000baseLR2_ER2_FR2_Full_BIT = 82,\n\tETHTOOL_LINK_MODE_200000baseDR2_Full_BIT = 83,\n\tETHTOOL_LINK_MODE_200000baseCR2_Full_BIT = 84,\n\tETHTOOL_LINK_MODE_400000baseKR4_Full_BIT = 85,\n\tETHTOOL_LINK_MODE_400000baseSR4_Full_BIT = 86,\n\tETHTOOL_LINK_MODE_400000baseLR4_ER4_FR4_Full_BIT = 87,\n\tETHTOOL_LINK_MODE_400000baseDR4_Full_BIT = 88,\n\tETHTOOL_LINK_MODE_400000baseCR4_Full_BIT = 89,\n\tETHTOOL_LINK_MODE_100baseFX_Half_BIT = 90,\n\tETHTOOL_LINK_MODE_100baseFX_Full_BIT = 91,\n\tETHTOOL_LINK_MODE_10baseT1L_Full_BIT = 92,\n\tETHTOOL_LINK_MODE_800000baseCR8_Full_BIT = 93,\n\tETHTOOL_LINK_MODE_800000baseKR8_Full_BIT = 94,\n\tETHTOOL_LINK_MODE_800000baseDR8_Full_BIT = 95,\n\tETHTOOL_LINK_MODE_800000baseDR8_2_Full_BIT = 96,\n\tETHTOOL_LINK_MODE_800000baseSR8_Full_BIT = 97,\n\tETHTOOL_LINK_MODE_800000baseVR8_Full_BIT = 98,\n\tETHTOOL_LINK_MODE_10baseT1S_Full_BIT = 99,\n\tETHTOOL_LINK_MODE_10baseT1S_Half_BIT = 100,\n\tETHTOOL_LINK_MODE_10baseT1S_P2MP_Half_BIT = 101,\n\tETHTOOL_LINK_MODE_10baseT1BRR_Full_BIT = 102,\n\t__ETHTOOL_LINK_MODE_MASK_NBITS = 103,\n};\n\nenum ethtool_mac_stats_src {\n\tETHTOOL_MAC_STATS_SRC_AGGREGATE = 0,\n\tETHTOOL_MAC_STATS_SRC_EMAC = 1,\n\tETHTOOL_MAC_STATS_SRC_PMAC = 2,\n};\n\nenum ethtool_mm_verify_status {\n\tETHTOOL_MM_VERIFY_STATUS_UNKNOWN = 0,\n\tETHTOOL_MM_VERIFY_STATUS_INITIAL = 1,\n\tETHTOOL_MM_VERIFY_STATUS_VERIFYING = 2,\n\tETHTOOL_MM_VERIFY_STATUS_SUCCEEDED = 3,\n\tETHTOOL_MM_VERIFY_STATUS_FAILED = 4,\n\tETHTOOL_MM_VERIFY_STATUS_DISABLED = 5,\n};\n\nenum ethtool_module_fw_flash_status {\n\tETHTOOL_MODULE_FW_FLASH_STATUS_STARTED = 1,\n\tETHTOOL_MODULE_FW_FLASH_STATUS_IN_PROGRESS = 2,\n\tETHTOOL_MODULE_FW_FLASH_STATUS_COMPLETED = 3,\n\tETHTOOL_MODULE_FW_FLASH_STATUS_ERROR = 4,\n};\n\nenum ethtool_module_power_mode {\n\tETHTOOL_MODULE_POWER_MODE_LOW = 1,\n\tETHTOOL_MODULE_POWER_MODE_HIGH = 2,\n};\n\nenum ethtool_module_power_mode_policy {\n\tETHTOOL_MODULE_POWER_MODE_POLICY_HIGH = 1,\n\tETHTOOL_MODULE_POWER_MODE_POLICY_AUTO = 2,\n};\n\nenum ethtool_multicast_groups {\n\tETHNL_MCGRP_MONITOR = 0,\n};\n\nenum ethtool_phys_id_state {\n\tETHTOOL_ID_INACTIVE = 0,\n\tETHTOOL_ID_ACTIVE = 1,\n\tETHTOOL_ID_ON = 2,\n\tETHTOOL_ID_OFF = 3,\n};\n\nenum ethtool_podl_pse_admin_state {\n\tETHTOOL_PODL_PSE_ADMIN_STATE_UNKNOWN = 1,\n\tETHTOOL_PODL_PSE_ADMIN_STATE_DISABLED = 2,\n\tETHTOOL_PODL_PSE_ADMIN_STATE_ENABLED = 3,\n};\n\nenum ethtool_podl_pse_pw_d_status {\n\tETHTOOL_PODL_PSE_PW_D_STATUS_UNKNOWN = 1,\n\tETHTOOL_PODL_PSE_PW_D_STATUS_DISABLED = 2,\n\tETHTOOL_PODL_PSE_PW_D_STATUS_SEARCHING = 3,\n\tETHTOOL_PODL_PSE_PW_D_STATUS_DELIVERING = 4,\n\tETHTOOL_PODL_PSE_PW_D_STATUS_SLEEP = 5,\n\tETHTOOL_PODL_PSE_PW_D_STATUS_IDLE = 6,\n\tETHTOOL_PODL_PSE_PW_D_STATUS_ERROR = 7,\n};\n\nenum ethtool_pse_types {\n\tETHTOOL_PSE_UNKNOWN = 1,\n\tETHTOOL_PSE_PODL = 2,\n\tETHTOOL_PSE_C33 = 4,\n};\n\nenum ethtool_reset_flags {\n\tETH_RESET_MGMT = 1,\n\tETH_RESET_IRQ = 2,\n\tETH_RESET_DMA = 4,\n\tETH_RESET_FILTER = 8,\n\tETH_RESET_OFFLOAD = 16,\n\tETH_RESET_MAC = 32,\n\tETH_RESET_PHY = 64,\n\tETH_RESET_RAM = 128,\n\tETH_RESET_AP = 256,\n\tETH_RESET_DEDICATED = 65535,\n\tETH_RESET_ALL = 4294967295,\n};\n\nenum ethtool_sfeatures_retval_bits {\n\tETHTOOL_F_UNSUPPORTED__BIT = 0,\n\tETHTOOL_F_WISH__BIT = 1,\n\tETHTOOL_F_COMPAT__BIT = 2,\n};\n\nenum ethtool_stringset {\n\tETH_SS_TEST = 0,\n\tETH_SS_STATS = 1,\n\tETH_SS_PRIV_FLAGS = 2,\n\tETH_SS_NTUPLE_FILTERS = 3,\n\tETH_SS_FEATURES = 4,\n\tETH_SS_RSS_HASH_FUNCS = 5,\n\tETH_SS_TUNABLES = 6,\n\tETH_SS_PHY_STATS = 7,\n\tETH_SS_PHY_TUNABLES = 8,\n\tETH_SS_LINK_MODES = 9,\n\tETH_SS_MSG_CLASSES = 10,\n\tETH_SS_WOL_MODES = 11,\n\tETH_SS_SOF_TIMESTAMPING = 12,\n\tETH_SS_TS_TX_TYPES = 13,\n\tETH_SS_TS_RX_FILTERS = 14,\n\tETH_SS_UDP_TUNNEL_TYPES = 15,\n\tETH_SS_STATS_STD = 16,\n\tETH_SS_STATS_ETH_PHY = 17,\n\tETH_SS_STATS_ETH_MAC = 18,\n\tETH_SS_STATS_ETH_CTRL = 19,\n\tETH_SS_STATS_RMON = 20,\n\tETH_SS_COUNT = 21,\n};\n\nenum ethtool_supported_ring_param {\n\tETHTOOL_RING_USE_RX_BUF_LEN = 1,\n\tETHTOOL_RING_USE_CQE_SIZE = 2,\n\tETHTOOL_RING_USE_TX_PUSH = 4,\n\tETHTOOL_RING_USE_RX_PUSH = 8,\n\tETHTOOL_RING_USE_TX_PUSH_BUF_LEN = 16,\n\tETHTOOL_RING_USE_TCP_DATA_SPLIT = 32,\n};\n\nenum ethtool_test_flags {\n\tETH_TEST_FL_OFFLINE = 1,\n\tETH_TEST_FL_FAILED = 2,\n\tETH_TEST_FL_EXTERNAL_LB = 4,\n\tETH_TEST_FL_EXTERNAL_LB_DONE = 8,\n};\n\nenum event_command_flags {\n\tEVENT_CMD_FL_POST_TRIGGER = 1,\n\tEVENT_CMD_FL_NEEDS_REC = 2,\n};\n\nenum event_trigger_type {\n\tETT_NONE = 0,\n\tETT_TRACE_ONOFF = 1,\n\tETT_SNAPSHOT = 2,\n\tETT_STACKTRACE = 4,\n\tETT_EVENT_ENABLE = 8,\n\tETT_EVENT_HIST = 16,\n\tETT_HIST_ENABLE = 32,\n\tETT_EVENT_EPROBE = 64,\n};\n\nenum event_type_t {\n\tEVENT_FLEXIBLE = 1,\n\tEVENT_PINNED = 2,\n\tEVENT_TIME = 4,\n\tEVENT_CPU = 8,\n\tEVENT_CGROUP = 16,\n\tEVENT_ALL = 3,\n};\n\nenum events_wwnr {\n\tswitch_in_wwnr = 0,\n\tswitch_out_wwnr = 1,\n\twakeup_wwnr = 2,\n\tevent_max_wwnr = 3,\n};\n\nenum evm_ima_xattr_type {\n\tIMA_XATTR_DIGEST = 1,\n\tEVM_XATTR_HMAC = 2,\n\tEVM_IMA_XATTR_DIGSIG = 3,\n\tIMA_XATTR_DIGEST_NG = 4,\n\tEVM_XATTR_PORTABLE_DIGSIG = 5,\n\tIMA_VERITY_DIGSIG = 6,\n\tIMA_XATTR_LAST = 7,\n};\n\nenum evtreturn {\n\tEVT_ERR = -1,\n\tEVT_DONE = 0,\n\tEVT_GSER = 1,\n\tEVT_DISC = 2,\n};\n\nenum exact_level {\n\tNOT_EXACT = 0,\n\tEXACT = 1,\n\tRANGE_WITHIN = 2,\n};\n\nenum exception {\n\tEXCP_CONTEXT = 1,\n\tNO_EXCP = 2,\n};\n\nenum exception_stack_ordering {\n\tESTACK_DF = 0,\n\tESTACK_NMI = 1,\n\tESTACK_DB = 2,\n\tESTACK_MCE = 3,\n\tESTACK_VC = 4,\n\tESTACK_VC2 = 5,\n\tN_EXCEPTION_STACKS = 6,\n};\n\nenum execmem_range_flags {\n\tEXECMEM_KASAN_SHADOW = 1,\n};\n\nenum execmem_type {\n\tEXECMEM_DEFAULT = 0,\n\tEXECMEM_MODULE_TEXT = 0,\n\tEXECMEM_KPROBES = 1,\n\tEXECMEM_FTRACE = 2,\n\tEXECMEM_BPF = 3,\n\tEXECMEM_MODULE_DATA = 4,\n\tEXECMEM_TYPE_MAX = 5,\n};\n\nenum exit_fastpath_completion {\n\tEXIT_FASTPATH_NONE = 0,\n\tEXIT_FASTPATH_REENTER_GUEST = 1,\n\tEXIT_FASTPATH_EXIT_HANDLED = 2,\n};\n\nenum ext4_journal_trigger_type {\n\tEXT4_JTR_ORPHAN_FILE = 0,\n\tEXT4_JTR_NONE = 1,\n};\n\nenum ext4_li_mode {\n\tEXT4_LI_MODE_PREFETCH_BBITMAP = 0,\n\tEXT4_LI_MODE_ITABLE = 1,\n};\n\nenum extra_reg_type {\n\tEXTRA_REG_NONE = -1,\n\tEXTRA_REG_RSP_0 = 0,\n\tEXTRA_REG_RSP_1 = 1,\n\tEXTRA_REG_LBR = 2,\n\tEXTRA_REG_LDLAT = 3,\n\tEXTRA_REG_FE = 4,\n\tEXTRA_REG_SNOOP_0 = 5,\n\tEXTRA_REG_SNOOP_1 = 6,\n\tEXTRA_REG_MAX = 7,\n};\n\nenum fail_dup_mod_reason {\n\tFAIL_DUP_MOD_BECOMING = 0,\n\tFAIL_DUP_MOD_LOAD = 1,\n};\n\nenum fanotify_event_type {\n\tFANOTIFY_EVENT_TYPE_FID = 0,\n\tFANOTIFY_EVENT_TYPE_FID_NAME = 1,\n\tFANOTIFY_EVENT_TYPE_PATH = 2,\n\tFANOTIFY_EVENT_TYPE_PATH_PERM = 3,\n\tFANOTIFY_EVENT_TYPE_OVERFLOW = 4,\n\tFANOTIFY_EVENT_TYPE_FS_ERROR = 5,\n\t__FANOTIFY_EVENT_TYPE_NUM = 6,\n};\n\nenum fault_flag {\n\tFAULT_FLAG_WRITE = 1,\n\tFAULT_FLAG_MKWRITE = 2,\n\tFAULT_FLAG_ALLOW_RETRY = 4,\n\tFAULT_FLAG_RETRY_NOWAIT = 8,\n\tFAULT_FLAG_KILLABLE = 16,\n\tFAULT_FLAG_TRIED = 32,\n\tFAULT_FLAG_USER = 64,\n\tFAULT_FLAG_REMOTE = 128,\n\tFAULT_FLAG_INSTRUCTION = 256,\n\tFAULT_FLAG_INTERRUPTIBLE = 512,\n\tFAULT_FLAG_UNSHARE = 1024,\n\tFAULT_FLAG_ORIG_PTE_VALID = 2048,\n\tFAULT_FLAG_VMA_LOCK = 4096,\n};\n\nenum faulttype {\n\tDMA_REMAP = 0,\n\tINTR_REMAP = 1,\n\tUNKNOWN = 2,\n};\n\nenum fbq_type {\n\tregular = 0,\n\tremote = 1,\n\tall = 2,\n};\n\nenum fetch_op {\n\tFETCH_OP_NOP = 0,\n\tFETCH_OP_REG = 1,\n\tFETCH_OP_STACK = 2,\n\tFETCH_OP_STACKP = 3,\n\tFETCH_OP_RETVAL = 4,\n\tFETCH_OP_IMM = 5,\n\tFETCH_OP_COMM = 6,\n\tFETCH_OP_ARG = 7,\n\tFETCH_OP_FOFFS = 8,\n\tFETCH_OP_DATA = 9,\n\tFETCH_OP_EDATA = 10,\n\tFETCH_OP_DEREF = 11,\n\tFETCH_OP_UDEREF = 12,\n\tFETCH_OP_ST_RAW = 13,\n\tFETCH_OP_ST_MEM = 14,\n\tFETCH_OP_ST_UMEM = 15,\n\tFETCH_OP_ST_STRING = 16,\n\tFETCH_OP_ST_USTRING = 17,\n\tFETCH_OP_ST_SYMSTR = 18,\n\tFETCH_OP_ST_EDATA = 19,\n\tFETCH_OP_MOD_BF = 20,\n\tFETCH_OP_LP_ARRAY = 21,\n\tFETCH_OP_TP_ARG = 22,\n\tFETCH_OP_END = 23,\n\tFETCH_NOP_SYMBOL = 24,\n};\n\nenum fib6_walk_state {\n\tFWS_S = 0,\n\tFWS_L = 1,\n\tFWS_R = 2,\n\tFWS_C = 3,\n\tFWS_U = 4,\n};\n\nenum fib_event_type {\n\tFIB_EVENT_ENTRY_REPLACE = 0,\n\tFIB_EVENT_ENTRY_APPEND = 1,\n\tFIB_EVENT_ENTRY_ADD = 2,\n\tFIB_EVENT_ENTRY_DEL = 3,\n\tFIB_EVENT_RULE_ADD = 4,\n\tFIB_EVENT_RULE_DEL = 5,\n\tFIB_EVENT_NH_ADD = 6,\n\tFIB_EVENT_NH_DEL = 7,\n\tFIB_EVENT_VIF_ADD = 8,\n\tFIB_EVENT_VIF_DEL = 9,\n};\n\nenum fid_type {\n\tFILEID_ROOT = 0,\n\tFILEID_INO32_GEN = 1,\n\tFILEID_INO32_GEN_PARENT = 2,\n\tFILEID_BTRFS_WITHOUT_PARENT = 77,\n\tFILEID_BTRFS_WITH_PARENT = 78,\n\tFILEID_BTRFS_WITH_PARENT_ROOT = 79,\n\tFILEID_UDF_WITHOUT_PARENT = 81,\n\tFILEID_UDF_WITH_PARENT = 82,\n\tFILEID_NILFS_WITHOUT_PARENT = 97,\n\tFILEID_NILFS_WITH_PARENT = 98,\n\tFILEID_FAT_WITHOUT_PARENT = 113,\n\tFILEID_FAT_WITH_PARENT = 114,\n\tFILEID_INO64_GEN = 129,\n\tFILEID_INO64_GEN_PARENT = 130,\n\tFILEID_LUSTRE = 151,\n\tFILEID_BCACHEFS_WITHOUT_PARENT = 177,\n\tFILEID_BCACHEFS_WITH_PARENT = 178,\n\tFILEID_KERNFS = 254,\n\tFILEID_INVALID = 255,\n};\n\nenum field_op_id {\n\tFIELD_OP_NONE = 0,\n\tFIELD_OP_PLUS = 1,\n\tFIELD_OP_MINUS = 2,\n\tFIELD_OP_UNARY_MINUS = 3,\n\tFIELD_OP_DIV = 4,\n\tFIELD_OP_MULT = 5,\n};\n\nenum file_time_flags {\n\tS_ATIME = 1,\n\tS_MTIME = 2,\n\tS_CTIME = 4,\n\tS_VERSION = 8,\n};\n\nenum filter_op_ids {\n\tOP_GLOB = 0,\n\tOP_NE = 1,\n\tOP_EQ = 2,\n\tOP_LE = 3,\n\tOP_LT = 4,\n\tOP_GE = 5,\n\tOP_GT = 6,\n\tOP_BAND = 7,\n\tOP_MAX = 8,\n};\n\nenum filter_pred_fn {\n\tFILTER_PRED_FN_NOP = 0,\n\tFILTER_PRED_FN_64 = 1,\n\tFILTER_PRED_FN_64_CPUMASK = 2,\n\tFILTER_PRED_FN_S64 = 3,\n\tFILTER_PRED_FN_U64 = 4,\n\tFILTER_PRED_FN_32 = 5,\n\tFILTER_PRED_FN_32_CPUMASK = 6,\n\tFILTER_PRED_FN_S32 = 7,\n\tFILTER_PRED_FN_U32 = 8,\n\tFILTER_PRED_FN_16 = 9,\n\tFILTER_PRED_FN_16_CPUMASK = 10,\n\tFILTER_PRED_FN_S16 = 11,\n\tFILTER_PRED_FN_U16 = 12,\n\tFILTER_PRED_FN_8 = 13,\n\tFILTER_PRED_FN_8_CPUMASK = 14,\n\tFILTER_PRED_FN_S8 = 15,\n\tFILTER_PRED_FN_U8 = 16,\n\tFILTER_PRED_FN_COMM = 17,\n\tFILTER_PRED_FN_STRING = 18,\n\tFILTER_PRED_FN_STRLOC = 19,\n\tFILTER_PRED_FN_STRRELLOC = 20,\n\tFILTER_PRED_FN_PCHAR_USER = 21,\n\tFILTER_PRED_FN_PCHAR = 22,\n\tFILTER_PRED_FN_CPU = 23,\n\tFILTER_PRED_FN_CPU_CPUMASK = 24,\n\tFILTER_PRED_FN_CPUMASK = 25,\n\tFILTER_PRED_FN_CPUMASK_CPU = 26,\n\tFILTER_PRED_FN_FUNCTION = 27,\n\tFILTER_PRED_FN_ = 28,\n\tFILTER_PRED_TEST_VISITED = 29,\n};\n\nenum fit_type {\n\tNOTHING_FIT = 0,\n\tFL_FIT_TYPE = 1,\n\tLE_FIT_TYPE = 2,\n\tRE_FIT_TYPE = 3,\n\tNE_FIT_TYPE = 4,\n};\n\nenum fixed_addresses {\n\tVSYSCALL_PAGE = 511,\n\tFIX_DBGP_BASE = 512,\n\tFIX_EARLYCON_MEM_BASE = 513,\n\tFIX_APIC_BASE = 514,\n\tFIX_IO_APIC_BASE_0 = 515,\n\tFIX_IO_APIC_BASE_END = 642,\n\tFIX_PARAVIRT_BOOTMAP = 643,\n\tFIX_APEI_GHES_IRQ = 644,\n\tFIX_APEI_GHES_NMI = 645,\n\t__end_of_permanent_fixed_addresses = 646,\n\tFIX_BTMAP_END = 1024,\n\tFIX_BTMAP_BEGIN = 1535,\n\tFIX_TBOOT_BASE = 1536,\n\t__end_of_fixed_addresses = 1537,\n};\n\nenum flag_bits {\n\tFaulty = 0,\n\tIn_sync = 1,\n\tBitmap_sync = 2,\n\tWriteMostly = 3,\n\tAutoDetected = 4,\n\tBlocked = 5,\n\tWriteErrorSeen = 6,\n\tFaultRecorded = 7,\n\tBlockedBadBlocks = 8,\n\tWantReplacement = 9,\n\tReplacement = 10,\n\tCandidate = 11,\n\tJournal = 12,\n\tClusterRemove = 13,\n\tExternalBbl = 14,\n\tFailFast = 15,\n\tLastDev = 16,\n\tCollisionCheck = 17,\n\tNonrot = 18,\n};\n\nenum flow_action_hw_stats {\n\tFLOW_ACTION_HW_STATS_IMMEDIATE = 1,\n\tFLOW_ACTION_HW_STATS_DELAYED = 2,\n\tFLOW_ACTION_HW_STATS_ANY = 3,\n\tFLOW_ACTION_HW_STATS_DISABLED = 4,\n\tFLOW_ACTION_HW_STATS_DONT_CARE = 7,\n};\n\nenum flow_action_hw_stats_bit {\n\tFLOW_ACTION_HW_STATS_IMMEDIATE_BIT = 0,\n\tFLOW_ACTION_HW_STATS_DELAYED_BIT = 1,\n\tFLOW_ACTION_HW_STATS_DISABLED_BIT = 2,\n\tFLOW_ACTION_HW_STATS_NUM_BITS = 3,\n};\n\nenum flow_action_id {\n\tFLOW_ACTION_ACCEPT = 0,\n\tFLOW_ACTION_DROP = 1,\n\tFLOW_ACTION_TRAP = 2,\n\tFLOW_ACTION_GOTO = 3,\n\tFLOW_ACTION_REDIRECT = 4,\n\tFLOW_ACTION_MIRRED = 5,\n\tFLOW_ACTION_REDIRECT_INGRESS = 6,\n\tFLOW_ACTION_MIRRED_INGRESS = 7,\n\tFLOW_ACTION_VLAN_PUSH = 8,\n\tFLOW_ACTION_VLAN_POP = 9,\n\tFLOW_ACTION_VLAN_MANGLE = 10,\n\tFLOW_ACTION_TUNNEL_ENCAP = 11,\n\tFLOW_ACTION_TUNNEL_DECAP = 12,\n\tFLOW_ACTION_MANGLE = 13,\n\tFLOW_ACTION_ADD = 14,\n\tFLOW_ACTION_CSUM = 15,\n\tFLOW_ACTION_MARK = 16,\n\tFLOW_ACTION_PTYPE = 17,\n\tFLOW_ACTION_PRIORITY = 18,\n\tFLOW_ACTION_RX_QUEUE_MAPPING = 19,\n\tFLOW_ACTION_WAKE = 20,\n\tFLOW_ACTION_QUEUE = 21,\n\tFLOW_ACTION_SAMPLE = 22,\n\tFLOW_ACTION_POLICE = 23,\n\tFLOW_ACTION_CT = 24,\n\tFLOW_ACTION_CT_METADATA = 25,\n\tFLOW_ACTION_MPLS_PUSH = 26,\n\tFLOW_ACTION_MPLS_POP = 27,\n\tFLOW_ACTION_MPLS_MANGLE = 28,\n\tFLOW_ACTION_GATE = 29,\n\tFLOW_ACTION_PPPOE_PUSH = 30,\n\tFLOW_ACTION_JUMP = 31,\n\tFLOW_ACTION_PIPE = 32,\n\tFLOW_ACTION_VLAN_PUSH_ETH = 33,\n\tFLOW_ACTION_VLAN_POP_ETH = 34,\n\tFLOW_ACTION_CONTINUE = 35,\n\tNUM_FLOW_ACTIONS = 36,\n};\n\nenum flow_action_mangle_base {\n\tFLOW_ACT_MANGLE_UNSPEC = 0,\n\tFLOW_ACT_MANGLE_HDR_TYPE_ETH = 1,\n\tFLOW_ACT_MANGLE_HDR_TYPE_IP4 = 2,\n\tFLOW_ACT_MANGLE_HDR_TYPE_IP6 = 3,\n\tFLOW_ACT_MANGLE_HDR_TYPE_TCP = 4,\n\tFLOW_ACT_MANGLE_HDR_TYPE_UDP = 5,\n};\n\nenum flow_block_binder_type {\n\tFLOW_BLOCK_BINDER_TYPE_UNSPEC = 0,\n\tFLOW_BLOCK_BINDER_TYPE_CLSACT_INGRESS = 1,\n\tFLOW_BLOCK_BINDER_TYPE_CLSACT_EGRESS = 2,\n\tFLOW_BLOCK_BINDER_TYPE_RED_EARLY_DROP = 3,\n\tFLOW_BLOCK_BINDER_TYPE_RED_MARK = 4,\n};\n\nenum flow_block_command {\n\tFLOW_BLOCK_BIND = 0,\n\tFLOW_BLOCK_UNBIND = 1,\n};\n\nenum flow_cls_command {\n\tFLOW_CLS_REPLACE = 0,\n\tFLOW_CLS_DESTROY = 1,\n\tFLOW_CLS_STATS = 2,\n\tFLOW_CLS_TMPLT_CREATE = 3,\n\tFLOW_CLS_TMPLT_DESTROY = 4,\n};\n\nenum flow_dissect_ret {\n\tFLOW_DISSECT_RET_OUT_GOOD = 0,\n\tFLOW_DISSECT_RET_OUT_BAD = 1,\n\tFLOW_DISSECT_RET_PROTO_AGAIN = 2,\n\tFLOW_DISSECT_RET_IPPROTO_AGAIN = 3,\n\tFLOW_DISSECT_RET_CONTINUE = 4,\n};\n\nenum flow_dissector_ctrl_flags {\n\tFLOW_DIS_IS_FRAGMENT = 1,\n\tFLOW_DIS_FIRST_FRAG = 2,\n\tFLOW_DIS_F_TUNNEL_CSUM = 4,\n\tFLOW_DIS_F_TUNNEL_DONT_FRAGMENT = 8,\n\tFLOW_DIS_F_TUNNEL_OAM = 16,\n\tFLOW_DIS_F_TUNNEL_CRIT_OPT = 32,\n\tFLOW_DIS_ENCAPSULATION = 64,\n};\n\nenum flow_dissector_key_id {\n\tFLOW_DISSECTOR_KEY_CONTROL = 0,\n\tFLOW_DISSECTOR_KEY_BASIC = 1,\n\tFLOW_DISSECTOR_KEY_IPV4_ADDRS = 2,\n\tFLOW_DISSECTOR_KEY_IPV6_ADDRS = 3,\n\tFLOW_DISSECTOR_KEY_PORTS = 4,\n\tFLOW_DISSECTOR_KEY_PORTS_RANGE = 5,\n\tFLOW_DISSECTOR_KEY_ICMP = 6,\n\tFLOW_DISSECTOR_KEY_ETH_ADDRS = 7,\n\tFLOW_DISSECTOR_KEY_TIPC = 8,\n\tFLOW_DISSECTOR_KEY_ARP = 9,\n\tFLOW_DISSECTOR_KEY_VLAN = 10,\n\tFLOW_DISSECTOR_KEY_FLOW_LABEL = 11,\n\tFLOW_DISSECTOR_KEY_GRE_KEYID = 12,\n\tFLOW_DISSECTOR_KEY_MPLS_ENTROPY = 13,\n\tFLOW_DISSECTOR_KEY_ENC_KEYID = 14,\n\tFLOW_DISSECTOR_KEY_ENC_IPV4_ADDRS = 15,\n\tFLOW_DISSECTOR_KEY_ENC_IPV6_ADDRS = 16,\n\tFLOW_DISSECTOR_KEY_ENC_CONTROL = 17,\n\tFLOW_DISSECTOR_KEY_ENC_PORTS = 18,\n\tFLOW_DISSECTOR_KEY_MPLS = 19,\n\tFLOW_DISSECTOR_KEY_TCP = 20,\n\tFLOW_DISSECTOR_KEY_IP = 21,\n\tFLOW_DISSECTOR_KEY_CVLAN = 22,\n\tFLOW_DISSECTOR_KEY_ENC_IP = 23,\n\tFLOW_DISSECTOR_KEY_ENC_OPTS = 24,\n\tFLOW_DISSECTOR_KEY_META = 25,\n\tFLOW_DISSECTOR_KEY_CT = 26,\n\tFLOW_DISSECTOR_KEY_HASH = 27,\n\tFLOW_DISSECTOR_KEY_NUM_OF_VLANS = 28,\n\tFLOW_DISSECTOR_KEY_PPPOE = 29,\n\tFLOW_DISSECTOR_KEY_L2TPV3 = 30,\n\tFLOW_DISSECTOR_KEY_CFM = 31,\n\tFLOW_DISSECTOR_KEY_IPSEC = 32,\n\tFLOW_DISSECTOR_KEY_MAX = 33,\n};\n\nenum flowlabel_reflect {\n\tFLOWLABEL_REFLECT_ESTABLISHED = 1,\n\tFLOWLABEL_REFLECT_TCP_RESET = 2,\n\tFLOWLABEL_REFLECT_ICMPV6_ECHO_REPLIES = 4,\n};\n\nenum folio_references {\n\tFOLIOREF_RECLAIM = 0,\n\tFOLIOREF_RECLAIM_CLEAN = 1,\n\tFOLIOREF_KEEP = 2,\n\tFOLIOREF_ACTIVATE = 3,\n};\n\nenum format_type {\n\tFORMAT_TYPE_NONE = 0,\n\tFORMAT_TYPE_WIDTH = 1,\n\tFORMAT_TYPE_PRECISION = 2,\n\tFORMAT_TYPE_CHAR = 3,\n\tFORMAT_TYPE_STR = 4,\n\tFORMAT_TYPE_PTR = 5,\n\tFORMAT_TYPE_PERCENT_CHAR = 6,\n\tFORMAT_TYPE_INVALID = 7,\n\tFORMAT_TYPE_LONG_LONG = 8,\n\tFORMAT_TYPE_ULONG = 9,\n\tFORMAT_TYPE_LONG = 10,\n\tFORMAT_TYPE_UBYTE = 11,\n\tFORMAT_TYPE_BYTE = 12,\n\tFORMAT_TYPE_USHORT = 13,\n\tFORMAT_TYPE_SHORT = 14,\n\tFORMAT_TYPE_UINT = 15,\n\tFORMAT_TYPE_INT = 16,\n\tFORMAT_TYPE_SIZE_T = 17,\n\tFORMAT_TYPE_PTRDIFF = 18,\n};\n\nenum fortify_func {\n\tFORTIFY_FUNC_strncpy = 0,\n\tFORTIFY_FUNC_strnlen = 1,\n\tFORTIFY_FUNC_strlen = 2,\n\tFORTIFY_FUNC_strscpy = 3,\n\tFORTIFY_FUNC_strlcat = 4,\n\tFORTIFY_FUNC_strcat = 5,\n\tFORTIFY_FUNC_strncat = 6,\n\tFORTIFY_FUNC_memset = 7,\n\tFORTIFY_FUNC_memcpy = 8,\n\tFORTIFY_FUNC_memmove = 9,\n\tFORTIFY_FUNC_memscan = 10,\n\tFORTIFY_FUNC_memcmp = 11,\n\tFORTIFY_FUNC_memchr = 12,\n\tFORTIFY_FUNC_memchr_inv = 13,\n\tFORTIFY_FUNC_kmemdup = 14,\n\tFORTIFY_FUNC_strcpy = 15,\n\tFORTIFY_FUNC_UNKNOWN = 16,\n};\n\nenum fpdt_record_type {\n\tRECORD_S3_RESUME = 0,\n\tRECORD_S3_SUSPEND = 1,\n\tRECORD_BOOT = 2,\n};\n\nenum fpdt_subtable_type {\n\tSUBTABLE_FBPT = 0,\n\tSUBTABLE_S3PT = 1,\n};\n\nenum freeze_holder {\n\tFREEZE_HOLDER_KERNEL = 1,\n\tFREEZE_HOLDER_USERSPACE = 2,\n\tFREEZE_MAY_NEST = 4,\n};\n\nenum freezer_state_flags {\n\tCGROUP_FREEZER_ONLINE = 1,\n\tCGROUP_FREEZING_SELF = 2,\n\tCGROUP_FREEZING_PARENT = 4,\n\tCGROUP_FROZEN = 8,\n\tCGROUP_FREEZING = 6,\n};\n\nenum freq_qos_req_type {\n\tFREQ_QOS_MIN = 1,\n\tFREQ_QOS_MAX = 2,\n};\n\nenum fs_context_phase {\n\tFS_CONTEXT_CREATE_PARAMS = 0,\n\tFS_CONTEXT_CREATING = 1,\n\tFS_CONTEXT_AWAITING_MOUNT = 2,\n\tFS_CONTEXT_AWAITING_RECONF = 3,\n\tFS_CONTEXT_RECONF_PARAMS = 4,\n\tFS_CONTEXT_RECONFIGURING = 5,\n\tFS_CONTEXT_FAILED = 6,\n};\n\nenum fs_context_purpose {\n\tFS_CONTEXT_FOR_MOUNT = 0,\n\tFS_CONTEXT_FOR_SUBMOUNT = 1,\n\tFS_CONTEXT_FOR_RECONFIGURE = 2,\n};\n\nenum fs_value_type {\n\tfs_value_is_undefined = 0,\n\tfs_value_is_flag = 1,\n\tfs_value_is_string = 2,\n\tfs_value_is_blob = 3,\n\tfs_value_is_filename = 4,\n\tfs_value_is_file = 5,\n};\n\nenum fsconfig_command {\n\tFSCONFIG_SET_FLAG = 0,\n\tFSCONFIG_SET_STRING = 1,\n\tFSCONFIG_SET_BINARY = 2,\n\tFSCONFIG_SET_PATH = 3,\n\tFSCONFIG_SET_PATH_EMPTY = 4,\n\tFSCONFIG_SET_FD = 5,\n\tFSCONFIG_CMD_CREATE = 6,\n\tFSCONFIG_CMD_RECONFIGURE = 7,\n\tFSCONFIG_CMD_CREATE_EXCL = 8,\n};\n\nenum fsl_mc_pool_type {\n\tFSL_MC_POOL_DPMCP = 0,\n\tFSL_MC_POOL_DPBP = 1,\n\tFSL_MC_POOL_DPCON = 2,\n\tFSL_MC_POOL_IRQ = 3,\n\tFSL_MC_NUM_POOL_TYPES = 4,\n};\n\nenum fsnotify_data_type {\n\tFSNOTIFY_EVENT_NONE = 0,\n\tFSNOTIFY_EVENT_PATH = 1,\n\tFSNOTIFY_EVENT_INODE = 2,\n\tFSNOTIFY_EVENT_DENTRY = 3,\n\tFSNOTIFY_EVENT_ERROR = 4,\n};\n\nenum fsnotify_group_prio {\n\tFSNOTIFY_PRIO_NORMAL = 0,\n\tFSNOTIFY_PRIO_CONTENT = 1,\n\tFSNOTIFY_PRIO_PRE_CONTENT = 2,\n\t__FSNOTIFY_PRIO_NUM = 3,\n};\n\nenum fsnotify_iter_type {\n\tFSNOTIFY_ITER_TYPE_INODE = 0,\n\tFSNOTIFY_ITER_TYPE_VFSMOUNT = 1,\n\tFSNOTIFY_ITER_TYPE_SB = 2,\n\tFSNOTIFY_ITER_TYPE_PARENT = 3,\n\tFSNOTIFY_ITER_TYPE_INODE2 = 4,\n\tFSNOTIFY_ITER_TYPE_COUNT = 5,\n};\n\nenum fsnotify_obj_type {\n\tFSNOTIFY_OBJ_TYPE_ANY = -1,\n\tFSNOTIFY_OBJ_TYPE_INODE = 0,\n\tFSNOTIFY_OBJ_TYPE_VFSMOUNT = 1,\n\tFSNOTIFY_OBJ_TYPE_SB = 2,\n\tFSNOTIFY_OBJ_TYPE_COUNT = 3,\n\tFSNOTIFY_OBJ_TYPE_DETACHED = 3,\n};\n\nenum ftrace_bug_type {\n\tFTRACE_BUG_UNKNOWN = 0,\n\tFTRACE_BUG_INIT = 1,\n\tFTRACE_BUG_NOP = 2,\n\tFTRACE_BUG_CALL = 3,\n\tFTRACE_BUG_UPDATE = 4,\n};\n\nenum ftrace_dump_mode {\n\tDUMP_NONE = 0,\n\tDUMP_ALL = 1,\n\tDUMP_ORIG = 2,\n\tDUMP_PARAM = 3,\n};\n\nenum ftrace_ops_cmd {\n\tFTRACE_OPS_CMD_ENABLE_SHARE_IPMODIFY_SELF = 0,\n\tFTRACE_OPS_CMD_ENABLE_SHARE_IPMODIFY_PEER = 1,\n\tFTRACE_OPS_CMD_DISABLE_SHARE_IPMODIFY_PEER = 2,\n};\n\nenum fullness_group {\n\tZS_INUSE_RATIO_0 = 0,\n\tZS_INUSE_RATIO_10 = 1,\n\tZS_INUSE_RATIO_99 = 10,\n\tZS_INUSE_RATIO_100 = 11,\n\tNR_FULLNESS_GROUPS = 12,\n};\n\nenum fuse_dax_mode {\n\tFUSE_DAX_INODE_DEFAULT = 0,\n\tFUSE_DAX_ALWAYS = 1,\n\tFUSE_DAX_NEVER = 2,\n\tFUSE_DAX_INODE_USER = 3,\n};\n\nenum fuse_ext_type {\n\tFUSE_MAX_NR_SECCTX = 31,\n\tFUSE_EXT_GROUPS = 32,\n};\n\nenum fuse_notify_code {\n\tFUSE_NOTIFY_POLL = 1,\n\tFUSE_NOTIFY_INVAL_INODE = 2,\n\tFUSE_NOTIFY_INVAL_ENTRY = 3,\n\tFUSE_NOTIFY_STORE = 4,\n\tFUSE_NOTIFY_RETRIEVE = 5,\n\tFUSE_NOTIFY_DELETE = 6,\n\tFUSE_NOTIFY_RESEND = 7,\n\tFUSE_NOTIFY_CODE_MAX = 8,\n};\n\nenum fuse_opcode {\n\tFUSE_LOOKUP = 1,\n\tFUSE_FORGET = 2,\n\tFUSE_GETATTR = 3,\n\tFUSE_SETATTR = 4,\n\tFUSE_READLINK = 5,\n\tFUSE_SYMLINK = 6,\n\tFUSE_MKNOD = 8,\n\tFUSE_MKDIR = 9,\n\tFUSE_UNLINK = 10,\n\tFUSE_RMDIR = 11,\n\tFUSE_RENAME = 12,\n\tFUSE_LINK = 13,\n\tFUSE_OPEN = 14,\n\tFUSE_READ = 15,\n\tFUSE_WRITE = 16,\n\tFUSE_STATFS = 17,\n\tFUSE_RELEASE = 18,\n\tFUSE_FSYNC = 20,\n\tFUSE_SETXATTR = 21,\n\tFUSE_GETXATTR = 22,\n\tFUSE_LISTXATTR = 23,\n\tFUSE_REMOVEXATTR = 24,\n\tFUSE_FLUSH = 25,\n\tFUSE_INIT = 26,\n\tFUSE_OPENDIR = 27,\n\tFUSE_READDIR = 28,\n\tFUSE_RELEASEDIR = 29,\n\tFUSE_FSYNCDIR = 30,\n\tFUSE_GETLK = 31,\n\tFUSE_SETLK = 32,\n\tFUSE_SETLKW = 33,\n\tFUSE_ACCESS = 34,\n\tFUSE_CREATE = 35,\n\tFUSE_INTERRUPT = 36,\n\tFUSE_BMAP = 37,\n\tFUSE_DESTROY = 38,\n\tFUSE_IOCTL = 39,\n\tFUSE_POLL = 40,\n\tFUSE_NOTIFY_REPLY = 41,\n\tFUSE_BATCH_FORGET = 42,\n\tFUSE_FALLOCATE = 43,\n\tFUSE_READDIRPLUS = 44,\n\tFUSE_RENAME2 = 45,\n\tFUSE_LSEEK = 46,\n\tFUSE_COPY_FILE_RANGE = 47,\n\tFUSE_SETUPMAPPING = 48,\n\tFUSE_REMOVEMAPPING = 49,\n\tFUSE_SYNCFS = 50,\n\tFUSE_TMPFILE = 51,\n\tFUSE_STATX = 52,\n\tCUSE_INIT = 4096,\n\tCUSE_INIT_BSWAP_RESERVED = 1048576,\n\tFUSE_INIT_BSWAP_RESERVED = 436207616,\n};\n\nenum fuse_parse_result {\n\tFOUND_ERR = -1,\n\tFOUND_NONE = 0,\n\tFOUND_SOME = 1,\n\tFOUND_ALL = 2,\n};\n\nenum fuse_req_flag {\n\tFR_ISREPLY = 0,\n\tFR_FORCE = 1,\n\tFR_BACKGROUND = 2,\n\tFR_WAITING = 3,\n\tFR_ABORTED = 4,\n\tFR_INTERRUPTED = 5,\n\tFR_LOCKED = 6,\n\tFR_PENDING = 7,\n\tFR_SENT = 8,\n\tFR_FINISHED = 9,\n\tFR_PRIVATE = 10,\n\tFR_ASYNC = 11,\n};\n\nenum futex_access {\n\tFUTEX_READ = 0,\n\tFUTEX_WRITE = 1,\n};\n\nenum fw_opt {\n\tFW_OPT_UEVENT = 1,\n\tFW_OPT_NOWAIT = 2,\n\tFW_OPT_USERHELPER = 4,\n\tFW_OPT_NO_WARN = 8,\n\tFW_OPT_NOCACHE = 16,\n\tFW_OPT_NOFALLBACK_SYSFS = 32,\n\tFW_OPT_FALLBACK_PLATFORM = 64,\n\tFW_OPT_PARTIAL = 128,\n};\n\nenum fw_resource_type {\n\tRSC_CARVEOUT = 0,\n\tRSC_DEVMEM = 1,\n\tRSC_TRACE = 2,\n\tRSC_VDEV = 3,\n\tRSC_LAST = 4,\n\tRSC_VENDOR_START = 128,\n\tRSC_VENDOR_END = 512,\n};\n\nenum fw_status {\n\tFW_STATUS_UNKNOWN = 0,\n\tFW_STATUS_LOADING = 1,\n\tFW_STATUS_DONE = 2,\n\tFW_STATUS_ABORTED = 3,\n};\n\nenum fw_upload_err {\n\tFW_UPLOAD_ERR_NONE = 0,\n\tFW_UPLOAD_ERR_HW_ERROR = 1,\n\tFW_UPLOAD_ERR_TIMEOUT = 2,\n\tFW_UPLOAD_ERR_CANCELED = 3,\n\tFW_UPLOAD_ERR_BUSY = 4,\n\tFW_UPLOAD_ERR_INVALID_SIZE = 5,\n\tFW_UPLOAD_ERR_RW_ERROR = 6,\n\tFW_UPLOAD_ERR_WEAROUT = 7,\n\tFW_UPLOAD_ERR_FW_INVALID = 8,\n\tFW_UPLOAD_ERR_MAX = 9,\n};\n\nenum fw_upload_prog {\n\tFW_UPLOAD_PROG_IDLE = 0,\n\tFW_UPLOAD_PROG_RECEIVING = 1,\n\tFW_UPLOAD_PROG_PREPARING = 2,\n\tFW_UPLOAD_PROG_TRANSFERRING = 3,\n\tFW_UPLOAD_PROG_PROGRAMMING = 4,\n\tFW_UPLOAD_PROG_MAX = 5,\n};\n\nenum gcry_mpi_constants {\n\tMPI_C_ZERO = 0,\n\tMPI_C_ONE = 1,\n\tMPI_C_TWO = 2,\n\tMPI_C_THREE = 3,\n\tMPI_C_FOUR = 4,\n\tMPI_C_EIGHT = 5,\n};\n\nenum gcry_mpi_ec_models {\n\tMPI_EC_WEIERSTRASS = 0,\n\tMPI_EC_MONTGOMERY = 1,\n\tMPI_EC_EDWARDS = 2,\n};\n\nenum gcry_mpi_format {\n\tGCRYMPI_FMT_NONE = 0,\n\tGCRYMPI_FMT_STD = 1,\n\tGCRYMPI_FMT_PGP = 2,\n\tGCRYMPI_FMT_SSH = 3,\n\tGCRYMPI_FMT_HEX = 4,\n\tGCRYMPI_FMT_USG = 5,\n\tGCRYMPI_FMT_OPAQUE = 8,\n};\n\nenum gds_mitigations {\n\tGDS_MITIGATION_OFF = 0,\n\tGDS_MITIGATION_UCODE_NEEDED = 1,\n\tGDS_MITIGATION_FORCE = 2,\n\tGDS_MITIGATION_FULL = 3,\n\tGDS_MITIGATION_FULL_LOCKED = 4,\n\tGDS_MITIGATION_HYPERVISOR = 5,\n};\n\nenum genl_validate_flags {\n\tGENL_DONT_VALIDATE_STRICT = 1,\n\tGENL_DONT_VALIDATE_DUMP = 2,\n\tGENL_DONT_VALIDATE_DUMP_STRICT = 4,\n};\n\nenum genpd_notication {\n\tGENPD_NOTIFY_PRE_OFF = 0,\n\tGENPD_NOTIFY_OFF = 1,\n\tGENPD_NOTIFY_PRE_ON = 2,\n\tGENPD_NOTIFY_ON = 3,\n};\n\nenum gpd_status {\n\tGENPD_STATE_ON = 0,\n\tGENPD_STATE_OFF = 1,\n};\n\nenum gpio_lookup_flags {\n\tGPIO_ACTIVE_HIGH = 0,\n\tGPIO_ACTIVE_LOW = 1,\n\tGPIO_OPEN_DRAIN = 2,\n\tGPIO_OPEN_SOURCE = 4,\n\tGPIO_PERSISTENT = 0,\n\tGPIO_TRANSITORY = 8,\n\tGPIO_PULL_UP = 16,\n\tGPIO_PULL_DOWN = 32,\n\tGPIO_PULL_DISABLE = 64,\n\tGPIO_LOOKUP_FLAGS_DEFAULT = 0,\n};\n\nenum gpio_select {\n\tNO_GPIO = 0,\n\tGPIO_1 = 1,\n\tGPIO_2 = 2,\n};\n\nenum gpio_v2_line_attr_id {\n\tGPIO_V2_LINE_ATTR_ID_FLAGS = 1,\n\tGPIO_V2_LINE_ATTR_ID_OUTPUT_VALUES = 2,\n\tGPIO_V2_LINE_ATTR_ID_DEBOUNCE = 3,\n};\n\nenum gpio_v2_line_changed_type {\n\tGPIO_V2_LINE_CHANGED_REQUESTED = 1,\n\tGPIO_V2_LINE_CHANGED_RELEASED = 2,\n\tGPIO_V2_LINE_CHANGED_CONFIG = 3,\n};\n\nenum gpio_v2_line_event_id {\n\tGPIO_V2_LINE_EVENT_RISING_EDGE = 1,\n\tGPIO_V2_LINE_EVENT_FALLING_EDGE = 2,\n};\n\nenum gpio_v2_line_flag {\n\tGPIO_V2_LINE_FLAG_USED = 1,\n\tGPIO_V2_LINE_FLAG_ACTIVE_LOW = 2,\n\tGPIO_V2_LINE_FLAG_INPUT = 4,\n\tGPIO_V2_LINE_FLAG_OUTPUT = 8,\n\tGPIO_V2_LINE_FLAG_EDGE_RISING = 16,\n\tGPIO_V2_LINE_FLAG_EDGE_FALLING = 32,\n\tGPIO_V2_LINE_FLAG_OPEN_DRAIN = 64,\n\tGPIO_V2_LINE_FLAG_OPEN_SOURCE = 128,\n\tGPIO_V2_LINE_FLAG_BIAS_PULL_UP = 256,\n\tGPIO_V2_LINE_FLAG_BIAS_PULL_DOWN = 512,\n\tGPIO_V2_LINE_FLAG_BIAS_DISABLED = 1024,\n\tGPIO_V2_LINE_FLAG_EVENT_CLOCK_REALTIME = 2048,\n\tGPIO_V2_LINE_FLAG_EVENT_CLOCK_HTE = 4096,\n};\n\nenum gpiod_flags {\n\tGPIOD_ASIS = 0,\n\tGPIOD_IN = 1,\n\tGPIOD_OUT_LOW = 3,\n\tGPIOD_OUT_HIGH = 7,\n\tGPIOD_OUT_LOW_OPEN_DRAIN = 11,\n\tGPIOD_OUT_HIGH_OPEN_DRAIN = 15,\n};\n\nenum graph_filter_type {\n\tGRAPH_FILTER_NOTRACE = 0,\n\tGRAPH_FILTER_FUNCTION = 1,\n};\n\nenum gre_conntrack {\n\tGRE_CT_UNREPLIED = 0,\n\tGRE_CT_REPLIED = 1,\n\tGRE_CT_MAX = 2,\n};\n\nenum gro_result {\n\tGRO_MERGED = 0,\n\tGRO_MERGED_FREE = 1,\n\tGRO_HELD = 2,\n\tGRO_NORMAL = 3,\n\tGRO_CONSUMED = 4,\n};\n\ntypedef enum gro_result gro_result_t;\n\nenum group_type {\n\tgroup_has_spare = 0,\n\tgroup_fully_busy = 1,\n\tgroup_misfit_task = 2,\n\tgroup_smt_balance = 3,\n\tgroup_asym_packing = 4,\n\tgroup_imbalanced = 5,\n\tgroup_overloaded = 6,\n};\n\nenum handle_to_path_flags {\n\tHANDLE_CHECK_PERMS = 1,\n\tHANDLE_CHECK_SUBTREE = 2,\n};\n\nenum handler_id {\n\tHANDLER_ONMATCH = 1,\n\tHANDLER_ONMAX = 2,\n\tHANDLER_ONCHANGE = 3,\n};\n\nenum handshake_auth {\n\tHANDSHAKE_AUTH_UNSPEC = 0,\n\tHANDSHAKE_AUTH_UNAUTH = 1,\n\tHANDSHAKE_AUTH_PSK = 2,\n\tHANDSHAKE_AUTH_X509 = 3,\n};\n\nenum handshake_handler_class {\n\tHANDSHAKE_HANDLER_CLASS_NONE = 0,\n\tHANDSHAKE_HANDLER_CLASS_TLSHD = 1,\n\tHANDSHAKE_HANDLER_CLASS_MAX = 2,\n};\n\nenum handshake_msg_type {\n\tHANDSHAKE_MSG_TYPE_UNSPEC = 0,\n\tHANDSHAKE_MSG_TYPE_CLIENTHELLO = 1,\n\tHANDSHAKE_MSG_TYPE_SERVERHELLO = 2,\n};\n\nenum hash_algo {\n\tHASH_ALGO_MD4 = 0,\n\tHASH_ALGO_MD5 = 1,\n\tHASH_ALGO_SHA1 = 2,\n\tHASH_ALGO_RIPE_MD_160 = 3,\n\tHASH_ALGO_SHA256 = 4,\n\tHASH_ALGO_SHA384 = 5,\n\tHASH_ALGO_SHA512 = 6,\n\tHASH_ALGO_SHA224 = 7,\n\tHASH_ALGO_RIPE_MD_128 = 8,\n\tHASH_ALGO_RIPE_MD_256 = 9,\n\tHASH_ALGO_RIPE_MD_320 = 10,\n\tHASH_ALGO_WP_256 = 11,\n\tHASH_ALGO_WP_384 = 12,\n\tHASH_ALGO_WP_512 = 13,\n\tHASH_ALGO_TGR_128 = 14,\n\tHASH_ALGO_TGR_160 = 15,\n\tHASH_ALGO_TGR_192 = 16,\n\tHASH_ALGO_SM3_256 = 17,\n\tHASH_ALGO_STREEBOG_256 = 18,\n\tHASH_ALGO_STREEBOG_512 = 19,\n\tHASH_ALGO_SHA3_256 = 20,\n\tHASH_ALGO_SHA3_384 = 21,\n\tHASH_ALGO_SHA3_512 = 22,\n\tHASH_ALGO__LAST = 23,\n};\n\nenum hctx_type {\n\tHCTX_TYPE_DEFAULT = 0,\n\tHCTX_TYPE_READ = 1,\n\tHCTX_TYPE_POLL = 2,\n\tHCTX_MAX_TYPES = 3,\n};\n\nenum hdmi_3d_structure {\n\tHDMI_3D_STRUCTURE_INVALID = -1,\n\tHDMI_3D_STRUCTURE_FRAME_PACKING = 0,\n\tHDMI_3D_STRUCTURE_FIELD_ALTERNATIVE = 1,\n\tHDMI_3D_STRUCTURE_LINE_ALTERNATIVE = 2,\n\tHDMI_3D_STRUCTURE_SIDE_BY_SIDE_FULL = 3,\n\tHDMI_3D_STRUCTURE_L_DEPTH = 4,\n\tHDMI_3D_STRUCTURE_L_DEPTH_GFX_GFX_DEPTH = 5,\n\tHDMI_3D_STRUCTURE_TOP_AND_BOTTOM = 6,\n\tHDMI_3D_STRUCTURE_SIDE_BY_SIDE_HALF = 8,\n};\n\nenum hdmi_active_aspect {\n\tHDMI_ACTIVE_ASPECT_16_9_TOP = 2,\n\tHDMI_ACTIVE_ASPECT_14_9_TOP = 3,\n\tHDMI_ACTIVE_ASPECT_16_9_CENTER = 4,\n\tHDMI_ACTIVE_ASPECT_PICTURE = 8,\n\tHDMI_ACTIVE_ASPECT_4_3 = 9,\n\tHDMI_ACTIVE_ASPECT_16_9 = 10,\n\tHDMI_ACTIVE_ASPECT_14_9 = 11,\n\tHDMI_ACTIVE_ASPECT_4_3_SP_14_9 = 13,\n\tHDMI_ACTIVE_ASPECT_16_9_SP_14_9 = 14,\n\tHDMI_ACTIVE_ASPECT_16_9_SP_4_3 = 15,\n};\n\nenum hdmi_audio_coding_type {\n\tHDMI_AUDIO_CODING_TYPE_STREAM = 0,\n\tHDMI_AUDIO_CODING_TYPE_PCM = 1,\n\tHDMI_AUDIO_CODING_TYPE_AC3 = 2,\n\tHDMI_AUDIO_CODING_TYPE_MPEG1 = 3,\n\tHDMI_AUDIO_CODING_TYPE_MP3 = 4,\n\tHDMI_AUDIO_CODING_TYPE_MPEG2 = 5,\n\tHDMI_AUDIO_CODING_TYPE_AAC_LC = 6,\n\tHDMI_AUDIO_CODING_TYPE_DTS = 7,\n\tHDMI_AUDIO_CODING_TYPE_ATRAC = 8,\n\tHDMI_AUDIO_CODING_TYPE_DSD = 9,\n\tHDMI_AUDIO_CODING_TYPE_EAC3 = 10,\n\tHDMI_AUDIO_CODING_TYPE_DTS_HD = 11,\n\tHDMI_AUDIO_CODING_TYPE_MLP = 12,\n\tHDMI_AUDIO_CODING_TYPE_DST = 13,\n\tHDMI_AUDIO_CODING_TYPE_WMA_PRO = 14,\n\tHDMI_AUDIO_CODING_TYPE_CXT = 15,\n};\n\nenum hdmi_audio_coding_type_ext {\n\tHDMI_AUDIO_CODING_TYPE_EXT_CT = 0,\n\tHDMI_AUDIO_CODING_TYPE_EXT_HE_AAC = 1,\n\tHDMI_AUDIO_CODING_TYPE_EXT_HE_AAC_V2 = 2,\n\tHDMI_AUDIO_CODING_TYPE_EXT_MPEG_SURROUND = 3,\n\tHDMI_AUDIO_CODING_TYPE_EXT_MPEG4_HE_AAC = 4,\n\tHDMI_AUDIO_CODING_TYPE_EXT_MPEG4_HE_AAC_V2 = 5,\n\tHDMI_AUDIO_CODING_TYPE_EXT_MPEG4_AAC_LC = 6,\n\tHDMI_AUDIO_CODING_TYPE_EXT_DRA = 7,\n\tHDMI_AUDIO_CODING_TYPE_EXT_MPEG4_HE_AAC_SURROUND = 8,\n\tHDMI_AUDIO_CODING_TYPE_EXT_MPEG4_AAC_LC_SURROUND = 10,\n};\n\nenum hdmi_audio_sample_frequency {\n\tHDMI_AUDIO_SAMPLE_FREQUENCY_STREAM = 0,\n\tHDMI_AUDIO_SAMPLE_FREQUENCY_32000 = 1,\n\tHDMI_AUDIO_SAMPLE_FREQUENCY_44100 = 2,\n\tHDMI_AUDIO_SAMPLE_FREQUENCY_48000 = 3,\n\tHDMI_AUDIO_SAMPLE_FREQUENCY_88200 = 4,\n\tHDMI_AUDIO_SAMPLE_FREQUENCY_96000 = 5,\n\tHDMI_AUDIO_SAMPLE_FREQUENCY_176400 = 6,\n\tHDMI_AUDIO_SAMPLE_FREQUENCY_192000 = 7,\n};\n\nenum hdmi_audio_sample_size {\n\tHDMI_AUDIO_SAMPLE_SIZE_STREAM = 0,\n\tHDMI_AUDIO_SAMPLE_SIZE_16 = 1,\n\tHDMI_AUDIO_SAMPLE_SIZE_20 = 2,\n\tHDMI_AUDIO_SAMPLE_SIZE_24 = 3,\n};\n\nenum hdmi_colorimetry {\n\tHDMI_COLORIMETRY_NONE = 0,\n\tHDMI_COLORIMETRY_ITU_601 = 1,\n\tHDMI_COLORIMETRY_ITU_709 = 2,\n\tHDMI_COLORIMETRY_EXTENDED = 3,\n};\n\nenum hdmi_colorspace {\n\tHDMI_COLORSPACE_RGB = 0,\n\tHDMI_COLORSPACE_YUV422 = 1,\n\tHDMI_COLORSPACE_YUV444 = 2,\n\tHDMI_COLORSPACE_YUV420 = 3,\n\tHDMI_COLORSPACE_RESERVED4 = 4,\n\tHDMI_COLORSPACE_RESERVED5 = 5,\n\tHDMI_COLORSPACE_RESERVED6 = 6,\n\tHDMI_COLORSPACE_IDO_DEFINED = 7,\n};\n\nenum hdmi_content_type {\n\tHDMI_CONTENT_TYPE_GRAPHICS = 0,\n\tHDMI_CONTENT_TYPE_PHOTO = 1,\n\tHDMI_CONTENT_TYPE_CINEMA = 2,\n\tHDMI_CONTENT_TYPE_GAME = 3,\n};\n\nenum hdmi_eotf {\n\tHDMI_EOTF_TRADITIONAL_GAMMA_SDR = 0,\n\tHDMI_EOTF_TRADITIONAL_GAMMA_HDR = 1,\n\tHDMI_EOTF_SMPTE_ST2084 = 2,\n\tHDMI_EOTF_BT_2100_HLG = 3,\n};\n\nenum hdmi_extended_colorimetry {\n\tHDMI_EXTENDED_COLORIMETRY_XV_YCC_601 = 0,\n\tHDMI_EXTENDED_COLORIMETRY_XV_YCC_709 = 1,\n\tHDMI_EXTENDED_COLORIMETRY_S_YCC_601 = 2,\n\tHDMI_EXTENDED_COLORIMETRY_OPYCC_601 = 3,\n\tHDMI_EXTENDED_COLORIMETRY_OPRGB = 4,\n\tHDMI_EXTENDED_COLORIMETRY_BT2020_CONST_LUM = 5,\n\tHDMI_EXTENDED_COLORIMETRY_BT2020 = 6,\n\tHDMI_EXTENDED_COLORIMETRY_RESERVED = 7,\n};\n\nenum hdmi_infoframe_type {\n\tHDMI_INFOFRAME_TYPE_VENDOR = 129,\n\tHDMI_INFOFRAME_TYPE_AVI = 130,\n\tHDMI_INFOFRAME_TYPE_SPD = 131,\n\tHDMI_INFOFRAME_TYPE_AUDIO = 132,\n\tHDMI_INFOFRAME_TYPE_DRM = 135,\n};\n\nenum hdmi_metadata_type {\n\tHDMI_STATIC_METADATA_TYPE1 = 0,\n};\n\nenum hdmi_nups {\n\tHDMI_NUPS_UNKNOWN = 0,\n\tHDMI_NUPS_HORIZONTAL = 1,\n\tHDMI_NUPS_VERTICAL = 2,\n\tHDMI_NUPS_BOTH = 3,\n};\n\nenum hdmi_picture_aspect {\n\tHDMI_PICTURE_ASPECT_NONE = 0,\n\tHDMI_PICTURE_ASPECT_4_3 = 1,\n\tHDMI_PICTURE_ASPECT_16_9 = 2,\n\tHDMI_PICTURE_ASPECT_64_27 = 3,\n\tHDMI_PICTURE_ASPECT_256_135 = 4,\n\tHDMI_PICTURE_ASPECT_RESERVED = 5,\n};\n\nenum hdmi_quantization_range {\n\tHDMI_QUANTIZATION_RANGE_DEFAULT = 0,\n\tHDMI_QUANTIZATION_RANGE_LIMITED = 1,\n\tHDMI_QUANTIZATION_RANGE_FULL = 2,\n\tHDMI_QUANTIZATION_RANGE_RESERVED = 3,\n};\n\nenum hdmi_scan_mode {\n\tHDMI_SCAN_MODE_NONE = 0,\n\tHDMI_SCAN_MODE_OVERSCAN = 1,\n\tHDMI_SCAN_MODE_UNDERSCAN = 2,\n\tHDMI_SCAN_MODE_RESERVED = 3,\n};\n\nenum hdmi_spd_sdi {\n\tHDMI_SPD_SDI_UNKNOWN = 0,\n\tHDMI_SPD_SDI_DSTB = 1,\n\tHDMI_SPD_SDI_DVDP = 2,\n\tHDMI_SPD_SDI_DVHS = 3,\n\tHDMI_SPD_SDI_HDDVR = 4,\n\tHDMI_SPD_SDI_DVC = 5,\n\tHDMI_SPD_SDI_DSC = 6,\n\tHDMI_SPD_SDI_VCD = 7,\n\tHDMI_SPD_SDI_GAME = 8,\n\tHDMI_SPD_SDI_PC = 9,\n\tHDMI_SPD_SDI_BD = 10,\n\tHDMI_SPD_SDI_SACD = 11,\n\tHDMI_SPD_SDI_HDDVD = 12,\n\tHDMI_SPD_SDI_PMP = 13,\n};\n\nenum hdmi_ycc_quantization_range {\n\tHDMI_YCC_QUANTIZATION_RANGE_LIMITED = 0,\n\tHDMI_YCC_QUANTIZATION_RANGE_FULL = 1,\n};\n\nenum header_fields {\n\tHDR_PCR = 0,\n\tHDR_DIGEST = 1,\n\tHDR_TEMPLATE_NAME = 2,\n\tHDR_TEMPLATE_DATA = 3,\n\tHDR__LAST = 4,\n};\n\nenum hest_status {\n\tHEST_ENABLED = 0,\n\tHEST_DISABLED = 1,\n\tHEST_NOT_FOUND = 2,\n};\n\nenum hid_battery_status {\n\tHID_BATTERY_UNKNOWN = 0,\n\tHID_BATTERY_QUERIED = 1,\n\tHID_BATTERY_REPORTED = 2,\n};\n\nenum hid_class_request {\n\tHID_REQ_GET_REPORT = 1,\n\tHID_REQ_GET_IDLE = 2,\n\tHID_REQ_GET_PROTOCOL = 3,\n\tHID_REQ_SET_REPORT = 9,\n\tHID_REQ_SET_IDLE = 10,\n\tHID_REQ_SET_PROTOCOL = 11,\n};\n\nenum hid_report_type {\n\tHID_INPUT_REPORT = 0,\n\tHID_OUTPUT_REPORT = 1,\n\tHID_FEATURE_REPORT = 2,\n\tHID_REPORT_TYPES = 3,\n};\n\nenum hid_type {\n\tHID_TYPE_OTHER = 0,\n\tHID_TYPE_USBMOUSE = 1,\n\tHID_TYPE_USBNONE = 2,\n};\n\nenum hist_field_flags {\n\tHIST_FIELD_FL_HITCOUNT = 1,\n\tHIST_FIELD_FL_KEY = 2,\n\tHIST_FIELD_FL_STRING = 4,\n\tHIST_FIELD_FL_HEX = 8,\n\tHIST_FIELD_FL_SYM = 16,\n\tHIST_FIELD_FL_SYM_OFFSET = 32,\n\tHIST_FIELD_FL_EXECNAME = 64,\n\tHIST_FIELD_FL_SYSCALL = 128,\n\tHIST_FIELD_FL_STACKTRACE = 256,\n\tHIST_FIELD_FL_LOG2 = 512,\n\tHIST_FIELD_FL_TIMESTAMP = 1024,\n\tHIST_FIELD_FL_TIMESTAMP_USECS = 2048,\n\tHIST_FIELD_FL_VAR = 4096,\n\tHIST_FIELD_FL_EXPR = 8192,\n\tHIST_FIELD_FL_VAR_REF = 16384,\n\tHIST_FIELD_FL_CPU = 32768,\n\tHIST_FIELD_FL_ALIAS = 65536,\n\tHIST_FIELD_FL_BUCKET = 131072,\n\tHIST_FIELD_FL_CONST = 262144,\n\tHIST_FIELD_FL_PERCENT = 524288,\n\tHIST_FIELD_FL_GRAPH = 1048576,\n};\n\nenum hist_field_fn {\n\tHIST_FIELD_FN_NOP = 0,\n\tHIST_FIELD_FN_VAR_REF = 1,\n\tHIST_FIELD_FN_COUNTER = 2,\n\tHIST_FIELD_FN_CONST = 3,\n\tHIST_FIELD_FN_LOG2 = 4,\n\tHIST_FIELD_FN_BUCKET = 5,\n\tHIST_FIELD_FN_TIMESTAMP = 6,\n\tHIST_FIELD_FN_CPU = 7,\n\tHIST_FIELD_FN_STRING = 8,\n\tHIST_FIELD_FN_DYNSTRING = 9,\n\tHIST_FIELD_FN_RELDYNSTRING = 10,\n\tHIST_FIELD_FN_PSTRING = 11,\n\tHIST_FIELD_FN_S64 = 12,\n\tHIST_FIELD_FN_U64 = 13,\n\tHIST_FIELD_FN_S32 = 14,\n\tHIST_FIELD_FN_U32 = 15,\n\tHIST_FIELD_FN_S16 = 16,\n\tHIST_FIELD_FN_U16 = 17,\n\tHIST_FIELD_FN_S8 = 18,\n\tHIST_FIELD_FN_U8 = 19,\n\tHIST_FIELD_FN_UMINUS = 20,\n\tHIST_FIELD_FN_MINUS = 21,\n\tHIST_FIELD_FN_PLUS = 22,\n\tHIST_FIELD_FN_DIV = 23,\n\tHIST_FIELD_FN_MULT = 24,\n\tHIST_FIELD_FN_DIV_POWER2 = 25,\n\tHIST_FIELD_FN_DIV_NOT_POWER2 = 26,\n\tHIST_FIELD_FN_DIV_MULT_SHIFT = 27,\n\tHIST_FIELD_FN_EXECNAME = 28,\n\tHIST_FIELD_FN_STACK = 29,\n};\n\nenum hk_flags {\n\tHK_FLAG_TIMER = 1,\n\tHK_FLAG_RCU = 2,\n\tHK_FLAG_MISC = 4,\n\tHK_FLAG_SCHED = 8,\n\tHK_FLAG_TICK = 16,\n\tHK_FLAG_DOMAIN = 32,\n\tHK_FLAG_WQ = 64,\n\tHK_FLAG_MANAGED_IRQ = 128,\n\tHK_FLAG_KTHREAD = 256,\n};\n\nenum hk_type {\n\tHK_TYPE_TIMER = 0,\n\tHK_TYPE_RCU = 1,\n\tHK_TYPE_MISC = 2,\n\tHK_TYPE_SCHED = 3,\n\tHK_TYPE_TICK = 4,\n\tHK_TYPE_DOMAIN = 5,\n\tHK_TYPE_WQ = 6,\n\tHK_TYPE_MANAGED_IRQ = 7,\n\tHK_TYPE_KTHREAD = 8,\n\tHK_TYPE_MAX = 9,\n};\n\nenum hmm_pfn_flags {\n\tHMM_PFN_VALID = 9223372036854775808ULL,\n\tHMM_PFN_WRITE = 4611686018427387904ULL,\n\tHMM_PFN_ERROR = 2305843009213693952ULL,\n\tHMM_PFN_ORDER_SHIFT = 56ULL,\n\tHMM_PFN_REQ_FAULT = 9223372036854775808ULL,\n\tHMM_PFN_REQ_WRITE = 4611686018427387904ULL,\n\tHMM_PFN_FLAGS = 18374686479671623680ULL,\n};\n\nenum hn_flags_bits {\n\tHANDSHAKE_F_NET_DRAINING = 0,\n};\n\nenum host_event_code {\n\tEC_HOST_EVENT_LID_CLOSED = 1,\n\tEC_HOST_EVENT_LID_OPEN = 2,\n\tEC_HOST_EVENT_POWER_BUTTON = 3,\n\tEC_HOST_EVENT_AC_CONNECTED = 4,\n\tEC_HOST_EVENT_AC_DISCONNECTED = 5,\n\tEC_HOST_EVENT_BATTERY_LOW = 6,\n\tEC_HOST_EVENT_BATTERY_CRITICAL = 7,\n\tEC_HOST_EVENT_BATTERY = 8,\n\tEC_HOST_EVENT_THERMAL_THRESHOLD = 9,\n\tEC_HOST_EVENT_DEVICE = 10,\n\tEC_HOST_EVENT_THERMAL = 11,\n\tEC_HOST_EVENT_USB_CHARGER = 12,\n\tEC_HOST_EVENT_KEY_PRESSED = 13,\n\tEC_HOST_EVENT_INTERFACE_READY = 14,\n\tEC_HOST_EVENT_KEYBOARD_RECOVERY = 15,\n\tEC_HOST_EVENT_THERMAL_SHUTDOWN = 16,\n\tEC_HOST_EVENT_BATTERY_SHUTDOWN = 17,\n\tEC_HOST_EVENT_THROTTLE_START = 18,\n\tEC_HOST_EVENT_THROTTLE_STOP = 19,\n\tEC_HOST_EVENT_HANG_DETECT = 20,\n\tEC_HOST_EVENT_HANG_REBOOT = 21,\n\tEC_HOST_EVENT_PD_MCU = 22,\n\tEC_HOST_EVENT_BATTERY_STATUS = 23,\n\tEC_HOST_EVENT_PANIC = 24,\n\tEC_HOST_EVENT_KEYBOARD_FASTBOOT = 25,\n\tEC_HOST_EVENT_RTC = 26,\n\tEC_HOST_EVENT_MKBP = 27,\n\tEC_HOST_EVENT_USB_MUX = 28,\n\tEC_HOST_EVENT_MODE_CHANGE = 29,\n\tEC_HOST_EVENT_KEYBOARD_RECOVERY_HW_REINIT = 30,\n\tEC_HOST_EVENT_WOV = 31,\n\tEC_HOST_EVENT_INVALID = 32,\n};\n\nenum hp_flags_bits {\n\tHANDSHAKE_F_PROTO_NOTIFY = 0,\n};\n\nenum hpet_mode {\n\tHPET_MODE_UNUSED = 0,\n\tHPET_MODE_LEGACY = 1,\n\tHPET_MODE_CLOCKEVT = 2,\n\tHPET_MODE_DEVICE = 3,\n};\n\nenum hpx_type3_cfg_loc {\n\tHPX_CFG_PCICFG = 0,\n\tHPX_CFG_PCIE_CAP = 1,\n\tHPX_CFG_PCIE_CAP_EXT = 2,\n\tHPX_CFG_VEND_CAP = 3,\n\tHPX_CFG_DVSEC = 4,\n\tHPX_CFG_MAX = 5,\n};\n\nenum hpx_type3_dev_type {\n\tHPX_TYPE_ENDPOINT = 1,\n\tHPX_TYPE_LEG_END = 2,\n\tHPX_TYPE_RC_END = 4,\n\tHPX_TYPE_RC_EC = 8,\n\tHPX_TYPE_ROOT_PORT = 16,\n\tHPX_TYPE_UPSTREAM = 32,\n\tHPX_TYPE_DOWNSTREAM = 64,\n\tHPX_TYPE_PCI_BRIDGE = 128,\n\tHPX_TYPE_PCIE_BRIDGE = 256,\n};\n\nenum hpx_type3_fn_type {\n\tHPX_FN_NORMAL = 1,\n\tHPX_FN_SRIOV_PHYS = 2,\n\tHPX_FN_SRIOV_VIRT = 4,\n};\n\nenum hr_flags_bits {\n\tHANDSHAKE_F_REQ_COMPLETED = 0,\n\tHANDSHAKE_F_REQ_SESSION = 1,\n};\n\nenum hrtimer_base_type {\n\tHRTIMER_BASE_MONOTONIC = 0,\n\tHRTIMER_BASE_REALTIME = 1,\n\tHRTIMER_BASE_BOOTTIME = 2,\n\tHRTIMER_BASE_TAI = 3,\n\tHRTIMER_BASE_MONOTONIC_SOFT = 4,\n\tHRTIMER_BASE_REALTIME_SOFT = 5,\n\tHRTIMER_BASE_BOOTTIME_SOFT = 6,\n\tHRTIMER_BASE_TAI_SOFT = 7,\n\tHRTIMER_MAX_CLOCK_BASES = 8,\n};\n\nenum hrtimer_mode {\n\tHRTIMER_MODE_ABS = 0,\n\tHRTIMER_MODE_REL = 1,\n\tHRTIMER_MODE_PINNED = 2,\n\tHRTIMER_MODE_SOFT = 4,\n\tHRTIMER_MODE_HARD = 8,\n\tHRTIMER_MODE_ABS_PINNED = 2,\n\tHRTIMER_MODE_REL_PINNED = 3,\n\tHRTIMER_MODE_ABS_SOFT = 4,\n\tHRTIMER_MODE_REL_SOFT = 5,\n\tHRTIMER_MODE_ABS_PINNED_SOFT = 6,\n\tHRTIMER_MODE_REL_PINNED_SOFT = 7,\n\tHRTIMER_MODE_ABS_HARD = 8,\n\tHRTIMER_MODE_REL_HARD = 9,\n\tHRTIMER_MODE_ABS_PINNED_HARD = 10,\n\tHRTIMER_MODE_REL_PINNED_HARD = 11,\n};\n\nenum hrtimer_restart {\n\tHRTIMER_NORESTART = 0,\n\tHRTIMER_RESTART = 1,\n};\n\nenum hsm_task_states {\n\tHSM_ST_IDLE = 0,\n\tHSM_ST_FIRST = 1,\n\tHSM_ST = 2,\n\tHSM_ST_LAST = 3,\n\tHSM_ST_ERR = 4,\n};\n\nenum hte_edge {\n\tHTE_EDGE_NO_SETUP = 1,\n\tHTE_RISING_EDGE_TS = 2,\n\tHTE_FALLING_EDGE_TS = 4,\n};\n\nenum hte_return {\n\tHTE_CB_HANDLED = 0,\n\tHTE_RUN_SECOND_CB = 1,\n};\n\nenum hub_activation_type {\n\tHUB_INIT = 0,\n\tHUB_INIT2 = 1,\n\tHUB_INIT3 = 2,\n\tHUB_POST_RESET = 3,\n\tHUB_RESUME = 4,\n\tHUB_RESET_RESUME = 5,\n};\n\nenum hub_led_mode {\n\tINDICATOR_AUTO = 0,\n\tINDICATOR_CYCLE = 1,\n\tINDICATOR_GREEN_BLINK = 2,\n\tINDICATOR_GREEN_BLINK_OFF = 3,\n\tINDICATOR_AMBER_BLINK = 4,\n\tINDICATOR_AMBER_BLINK_OFF = 5,\n\tINDICATOR_ALT_BLINK = 6,\n\tINDICATOR_ALT_BLINK_OFF = 7,\n} __attribute__((mode(byte)));\n\nenum hub_quiescing_type {\n\tHUB_DISCONNECT = 0,\n\tHUB_PRE_RESET = 1,\n\tHUB_SUSPEND = 2,\n};\n\nenum hugetlb_memory_event {\n\tHUGETLB_MAX = 0,\n\tHUGETLB_NR_MEMORY_EVENTS = 1,\n};\n\nenum hugetlb_page_flags {\n\tHPG_restore_reserve = 0,\n\tHPG_migratable = 1,\n\tHPG_temporary = 2,\n\tHPG_freed = 3,\n\tHPG_vmemmap_optimized = 4,\n\tHPG_raw_hwp_unreliable = 5,\n\t__NR_HPAGEFLAGS = 6,\n};\n\nenum hugetlb_param {\n\tOpt_gid___6 = 0,\n\tOpt_min_size = 1,\n\tOpt_mode___4 = 2,\n\tOpt_nr_inodes = 3,\n\tOpt_pagesize = 4,\n\tOpt_size = 5,\n\tOpt_uid___6 = 6,\n};\n\nenum hugetlbfs_size_type {\n\tNO_SIZE = 0,\n\tSIZE_STD = 1,\n\tSIZE_PERCENT = 2,\n};\n\nenum hv_device_type {\n\tHV_DEVICE_TYPE_LOGICAL = 0,\n\tHV_DEVICE_TYPE_PCI = 1,\n\tHV_DEVICE_TYPE_IOAPIC = 2,\n\tHV_DEVICE_TYPE_ACPI = 3,\n};\n\nenum hv_interrupt_trigger_mode {\n\tHV_INTERRUPT_TRIGGER_MODE_EDGE = 0,\n\tHV_INTERRUPT_TRIGGER_MODE_LEVEL = 1,\n};\n\nenum hv_interrupt_type {\n\tHV_X64_INTERRUPT_TYPE_FIXED = 0,\n\tHV_X64_INTERRUPT_TYPE_LOWESTPRIORITY = 1,\n\tHV_X64_INTERRUPT_TYPE_SMI = 2,\n\tHV_X64_INTERRUPT_TYPE_REMOTEREAD = 3,\n\tHV_X64_INTERRUPT_TYPE_NMI = 4,\n\tHV_X64_INTERRUPT_TYPE_INIT = 5,\n\tHV_X64_INTERRUPT_TYPE_SIPI = 6,\n\tHV_X64_INTERRUPT_TYPE_EXTINT = 7,\n\tHV_X64_INTERRUPT_TYPE_LOCALINT0 = 8,\n\tHV_X64_INTERRUPT_TYPE_LOCALINT1 = 9,\n\tHV_X64_INTERRUPT_TYPE_MAXIMUM = 10,\n};\n\nenum hv_isolation_type {\n\tHV_ISOLATION_TYPE_NONE = 0,\n\tHV_ISOLATION_TYPE_VBS = 1,\n\tHV_ISOLATION_TYPE_SNP = 2,\n\tHV_ISOLATION_TYPE_TDX = 3,\n};\n\nenum hv_mem_host_visibility {\n\tVMBUS_PAGE_NOT_VISIBLE = 0,\n\tVMBUS_PAGE_VISIBLE_READ_ONLY = 1,\n\tVMBUS_PAGE_VISIBLE_READ_WRITE = 3,\n};\n\nenum hv_tlb_flush_fifos {\n\tHV_L1_TLB_FLUSH_FIFO = 0,\n\tHV_L2_TLB_FLUSH_FIFO = 1,\n\tHV_NR_TLB_FLUSH_FIFOS = 2,\n};\n\nenum hv_tsc_page_status {\n\tHV_TSC_PAGE_UNSET = 0,\n\tHV_TSC_PAGE_GUEST_CHANGED = 1,\n\tHV_TSC_PAGE_HOST_CHANGED = 2,\n\tHV_TSC_PAGE_SET = 3,\n\tHV_TSC_PAGE_BROKEN = 4,\n};\n\nenum hvmmem_type_t {\n\tHVMMEM_ram_rw = 0,\n\tHVMMEM_ram_ro = 1,\n\tHVMMEM_mmio_dm = 2,\n};\n\nenum hw_event_mc_err_type {\n\tHW_EVENT_ERR_CORRECTED = 0,\n\tHW_EVENT_ERR_UNCORRECTED = 1,\n\tHW_EVENT_ERR_DEFERRED = 2,\n\tHW_EVENT_ERR_FATAL = 3,\n\tHW_EVENT_ERR_INFO = 4,\n};\n\nenum hwmon_chip_attributes {\n\thwmon_chip_temp_reset_history = 0,\n\thwmon_chip_in_reset_history = 1,\n\thwmon_chip_curr_reset_history = 2,\n\thwmon_chip_power_reset_history = 3,\n\thwmon_chip_register_tz = 4,\n\thwmon_chip_update_interval = 5,\n\thwmon_chip_alarms = 6,\n\thwmon_chip_samples = 7,\n\thwmon_chip_curr_samples = 8,\n\thwmon_chip_in_samples = 9,\n\thwmon_chip_power_samples = 10,\n\thwmon_chip_temp_samples = 11,\n\thwmon_chip_beep_enable = 12,\n\thwmon_chip_pec = 13,\n};\n\nenum hwmon_curr_attributes {\n\thwmon_curr_enable = 0,\n\thwmon_curr_input = 1,\n\thwmon_curr_min = 2,\n\thwmon_curr_max = 3,\n\thwmon_curr_lcrit = 4,\n\thwmon_curr_crit = 5,\n\thwmon_curr_average = 6,\n\thwmon_curr_lowest = 7,\n\thwmon_curr_highest = 8,\n\thwmon_curr_reset_history = 9,\n\thwmon_curr_label = 10,\n\thwmon_curr_alarm = 11,\n\thwmon_curr_min_alarm = 12,\n\thwmon_curr_max_alarm = 13,\n\thwmon_curr_lcrit_alarm = 14,\n\thwmon_curr_crit_alarm = 15,\n\thwmon_curr_rated_min = 16,\n\thwmon_curr_rated_max = 17,\n\thwmon_curr_beep = 18,\n};\n\nenum hwmon_energy_attributes {\n\thwmon_energy_enable = 0,\n\thwmon_energy_input = 1,\n\thwmon_energy_label = 2,\n};\n\nenum hwmon_fan_attributes {\n\thwmon_fan_enable = 0,\n\thwmon_fan_input = 1,\n\thwmon_fan_label = 2,\n\thwmon_fan_min = 3,\n\thwmon_fan_max = 4,\n\thwmon_fan_div = 5,\n\thwmon_fan_pulses = 6,\n\thwmon_fan_target = 7,\n\thwmon_fan_alarm = 8,\n\thwmon_fan_min_alarm = 9,\n\thwmon_fan_max_alarm = 10,\n\thwmon_fan_fault = 11,\n\thwmon_fan_beep = 12,\n};\n\nenum hwmon_humidity_attributes {\n\thwmon_humidity_enable = 0,\n\thwmon_humidity_input = 1,\n\thwmon_humidity_label = 2,\n\thwmon_humidity_min = 3,\n\thwmon_humidity_min_hyst = 4,\n\thwmon_humidity_max = 5,\n\thwmon_humidity_max_hyst = 6,\n\thwmon_humidity_alarm = 7,\n\thwmon_humidity_fault = 8,\n\thwmon_humidity_rated_min = 9,\n\thwmon_humidity_rated_max = 10,\n\thwmon_humidity_min_alarm = 11,\n\thwmon_humidity_max_alarm = 12,\n};\n\nenum hwmon_in_attributes {\n\thwmon_in_enable = 0,\n\thwmon_in_input = 1,\n\thwmon_in_min = 2,\n\thwmon_in_max = 3,\n\thwmon_in_lcrit = 4,\n\thwmon_in_crit = 5,\n\thwmon_in_average = 6,\n\thwmon_in_lowest = 7,\n\thwmon_in_highest = 8,\n\thwmon_in_reset_history = 9,\n\thwmon_in_label = 10,\n\thwmon_in_alarm = 11,\n\thwmon_in_min_alarm = 12,\n\thwmon_in_max_alarm = 13,\n\thwmon_in_lcrit_alarm = 14,\n\thwmon_in_crit_alarm = 15,\n\thwmon_in_rated_min = 16,\n\thwmon_in_rated_max = 17,\n\thwmon_in_beep = 18,\n\thwmon_in_fault = 19,\n};\n\nenum hwmon_intrusion_attributes {\n\thwmon_intrusion_alarm = 0,\n\thwmon_intrusion_beep = 1,\n};\n\nenum hwmon_power_attributes {\n\thwmon_power_enable = 0,\n\thwmon_power_average = 1,\n\thwmon_power_average_interval = 2,\n\thwmon_power_average_interval_max = 3,\n\thwmon_power_average_interval_min = 4,\n\thwmon_power_average_highest = 5,\n\thwmon_power_average_lowest = 6,\n\thwmon_power_average_max = 7,\n\thwmon_power_average_min = 8,\n\thwmon_power_input = 9,\n\thwmon_power_input_highest = 10,\n\thwmon_power_input_lowest = 11,\n\thwmon_power_reset_history = 12,\n\thwmon_power_accuracy = 13,\n\thwmon_power_cap = 14,\n\thwmon_power_cap_hyst = 15,\n\thwmon_power_cap_max = 16,\n\thwmon_power_cap_min = 17,\n\thwmon_power_min = 18,\n\thwmon_power_max = 19,\n\thwmon_power_crit = 20,\n\thwmon_power_lcrit = 21,\n\thwmon_power_label = 22,\n\thwmon_power_alarm = 23,\n\thwmon_power_cap_alarm = 24,\n\thwmon_power_min_alarm = 25,\n\thwmon_power_max_alarm = 26,\n\thwmon_power_lcrit_alarm = 27,\n\thwmon_power_crit_alarm = 28,\n\thwmon_power_rated_min = 29,\n\thwmon_power_rated_max = 30,\n};\n\nenum hwmon_pwm_attributes {\n\thwmon_pwm_input = 0,\n\thwmon_pwm_enable = 1,\n\thwmon_pwm_mode = 2,\n\thwmon_pwm_freq = 3,\n\thwmon_pwm_auto_channels_temp = 4,\n};\n\nenum hwmon_sensor_types {\n\thwmon_chip = 0,\n\thwmon_temp = 1,\n\thwmon_in = 2,\n\thwmon_curr = 3,\n\thwmon_power = 4,\n\thwmon_energy = 5,\n\thwmon_humidity = 6,\n\thwmon_fan = 7,\n\thwmon_pwm = 8,\n\thwmon_intrusion = 9,\n\thwmon_max = 10,\n};\n\nenum hwmon_temp_attributes {\n\thwmon_temp_enable = 0,\n\thwmon_temp_input = 1,\n\thwmon_temp_type = 2,\n\thwmon_temp_lcrit = 3,\n\thwmon_temp_lcrit_hyst = 4,\n\thwmon_temp_min = 5,\n\thwmon_temp_min_hyst = 6,\n\thwmon_temp_max = 7,\n\thwmon_temp_max_hyst = 8,\n\thwmon_temp_crit = 9,\n\thwmon_temp_crit_hyst = 10,\n\thwmon_temp_emergency = 11,\n\thwmon_temp_emergency_hyst = 12,\n\thwmon_temp_alarm = 13,\n\thwmon_temp_lcrit_alarm = 14,\n\thwmon_temp_min_alarm = 15,\n\thwmon_temp_max_alarm = 16,\n\thwmon_temp_crit_alarm = 17,\n\thwmon_temp_emergency_alarm = 18,\n\thwmon_temp_fault = 19,\n\thwmon_temp_offset = 20,\n\thwmon_temp_label = 21,\n\thwmon_temp_lowest = 22,\n\thwmon_temp_highest = 23,\n\thwmon_temp_reset_history = 24,\n\thwmon_temp_rated_min = 25,\n\thwmon_temp_rated_max = 26,\n\thwmon_temp_beep = 27,\n};\n\nenum hwparam_type {\n\thwparam_ioport = 0,\n\thwparam_iomem = 1,\n\thwparam_ioport_or_iomem = 2,\n\thwparam_irq = 3,\n\thwparam_dma = 4,\n\thwparam_dma_addr = 5,\n\thwparam_other = 6,\n};\n\nenum hwtstamp_flags {\n\tHWTSTAMP_FLAG_BONDED_PHC_INDEX = 1,\n\tHWTSTAMP_FLAG_LAST = 1,\n\tHWTSTAMP_FLAG_MASK = 1,\n};\n\nenum hwtstamp_rx_filters {\n\tHWTSTAMP_FILTER_NONE = 0,\n\tHWTSTAMP_FILTER_ALL = 1,\n\tHWTSTAMP_FILTER_SOME = 2,\n\tHWTSTAMP_FILTER_PTP_V1_L4_EVENT = 3,\n\tHWTSTAMP_FILTER_PTP_V1_L4_SYNC = 4,\n\tHWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ = 5,\n\tHWTSTAMP_FILTER_PTP_V2_L4_EVENT = 6,\n\tHWTSTAMP_FILTER_PTP_V2_L4_SYNC = 7,\n\tHWTSTAMP_FILTER_PTP_V2_L4_DELAY_REQ = 8,\n\tHWTSTAMP_FILTER_PTP_V2_L2_EVENT = 9,\n\tHWTSTAMP_FILTER_PTP_V2_L2_SYNC = 10,\n\tHWTSTAMP_FILTER_PTP_V2_L2_DELAY_REQ = 11,\n\tHWTSTAMP_FILTER_PTP_V2_EVENT = 12,\n\tHWTSTAMP_FILTER_PTP_V2_SYNC = 13,\n\tHWTSTAMP_FILTER_PTP_V2_DELAY_REQ = 14,\n\tHWTSTAMP_FILTER_NTP_ALL = 15,\n\t__HWTSTAMP_FILTER_CNT = 16,\n};\n\nenum hwtstamp_source {\n\tHWTSTAMP_SOURCE_UNSPEC = 0,\n\tHWTSTAMP_SOURCE_NETDEV = 1,\n\tHWTSTAMP_SOURCE_PHYLIB = 2,\n};\n\nenum hwtstamp_tx_types {\n\tHWTSTAMP_TX_OFF = 0,\n\tHWTSTAMP_TX_ON = 1,\n\tHWTSTAMP_TX_ONESTEP_SYNC = 2,\n\tHWTSTAMP_TX_ONESTEP_P2P = 3,\n\t__HWTSTAMP_TX_CNT = 4,\n};\n\nenum hybrid_cpu_type {\n\tHYBRID_INTEL_NONE = 0,\n\tHYBRID_INTEL_ATOM = 32,\n\tHYBRID_INTEL_CORE = 64,\n};\n\nenum hybrid_pmu_type {\n\tnot_hybrid = 0,\n\thybrid_small = 1,\n\thybrid_big = 2,\n\thybrid_big_small = 3,\n};\n\nenum i2c_alert_protocol {\n\tI2C_PROTOCOL_SMBUS_ALERT = 0,\n\tI2C_PROTOCOL_SMBUS_HOST_NOTIFY = 1,\n};\n\nenum i2c_driver_flags {\n\tI2C_DRV_ACPI_WAIVE_D0_PROBE = 1,\n};\n\nenum i8042_controller_reset_mode {\n\tI8042_RESET_NEVER = 0,\n\tI8042_RESET_ALWAYS = 1,\n\tI8042_RESET_ON_S2RAM = 2,\n};\n\nenum ib_atomic_cap {\n\tIB_ATOMIC_NONE = 0,\n\tIB_ATOMIC_HCA = 1,\n\tIB_ATOMIC_GLOB = 2,\n};\n\nenum ib_cq_notify_flags {\n\tIB_CQ_SOLICITED = 1,\n\tIB_CQ_NEXT_COMP = 2,\n\tIB_CQ_SOLICITED_MASK = 3,\n\tIB_CQ_REPORT_MISSED_EVENTS = 4,\n};\n\nenum ib_event_type {\n\tIB_EVENT_CQ_ERR = 0,\n\tIB_EVENT_QP_FATAL = 1,\n\tIB_EVENT_QP_REQ_ERR = 2,\n\tIB_EVENT_QP_ACCESS_ERR = 3,\n\tIB_EVENT_COMM_EST = 4,\n\tIB_EVENT_SQ_DRAINED = 5,\n\tIB_EVENT_PATH_MIG = 6,\n\tIB_EVENT_PATH_MIG_ERR = 7,\n\tIB_EVENT_DEVICE_FATAL = 8,\n\tIB_EVENT_PORT_ACTIVE = 9,\n\tIB_EVENT_PORT_ERR = 10,\n\tIB_EVENT_LID_CHANGE = 11,\n\tIB_EVENT_PKEY_CHANGE = 12,\n\tIB_EVENT_SM_CHANGE = 13,\n\tIB_EVENT_SRQ_ERR = 14,\n\tIB_EVENT_SRQ_LIMIT_REACHED = 15,\n\tIB_EVENT_QP_LAST_WQE_REACHED = 16,\n\tIB_EVENT_CLIENT_REREGISTER = 17,\n\tIB_EVENT_GID_CHANGE = 18,\n\tIB_EVENT_WQ_FATAL = 19,\n};\n\nenum ib_flow_action_type {\n\tIB_FLOW_ACTION_UNSPECIFIED = 0,\n\tIB_FLOW_ACTION_ESP = 1,\n};\n\nenum ib_flow_attr_type {\n\tIB_FLOW_ATTR_NORMAL = 0,\n\tIB_FLOW_ATTR_ALL_DEFAULT = 1,\n\tIB_FLOW_ATTR_MC_DEFAULT = 2,\n\tIB_FLOW_ATTR_SNIFFER = 3,\n};\n\nenum ib_flow_spec_type {\n\tIB_FLOW_SPEC_ETH = 32,\n\tIB_FLOW_SPEC_IB = 34,\n\tIB_FLOW_SPEC_IPV4 = 48,\n\tIB_FLOW_SPEC_IPV6 = 49,\n\tIB_FLOW_SPEC_ESP = 52,\n\tIB_FLOW_SPEC_TCP = 64,\n\tIB_FLOW_SPEC_UDP = 65,\n\tIB_FLOW_SPEC_VXLAN_TUNNEL = 80,\n\tIB_FLOW_SPEC_GRE = 81,\n\tIB_FLOW_SPEC_MPLS = 96,\n\tIB_FLOW_SPEC_INNER = 256,\n\tIB_FLOW_SPEC_ACTION_TAG = 4096,\n\tIB_FLOW_SPEC_ACTION_DROP = 4097,\n\tIB_FLOW_SPEC_ACTION_HANDLE = 4098,\n\tIB_FLOW_SPEC_ACTION_COUNT = 4099,\n};\n\nenum ib_gid_type {\n\tIB_GID_TYPE_IB = 0,\n\tIB_GID_TYPE_ROCE = 1,\n\tIB_GID_TYPE_ROCE_UDP_ENCAP = 2,\n\tIB_GID_TYPE_SIZE = 3,\n};\n\nenum ib_mig_state {\n\tIB_MIG_MIGRATED = 0,\n\tIB_MIG_REARM = 1,\n\tIB_MIG_ARMED = 2,\n};\n\nenum ib_mr_type {\n\tIB_MR_TYPE_MEM_REG = 0,\n\tIB_MR_TYPE_SG_GAPS = 1,\n\tIB_MR_TYPE_DM = 2,\n\tIB_MR_TYPE_USER = 3,\n\tIB_MR_TYPE_DMA = 4,\n\tIB_MR_TYPE_INTEGRITY = 5,\n};\n\nenum ib_mtu {\n\tIB_MTU_256 = 1,\n\tIB_MTU_512 = 2,\n\tIB_MTU_1024 = 3,\n\tIB_MTU_2048 = 4,\n\tIB_MTU_4096 = 5,\n};\n\nenum ib_mw_type {\n\tIB_MW_TYPE_1 = 1,\n\tIB_MW_TYPE_2 = 2,\n};\n\nenum ib_poll_context {\n\tIB_POLL_SOFTIRQ = 0,\n\tIB_POLL_WORKQUEUE = 1,\n\tIB_POLL_UNBOUND_WORKQUEUE = 2,\n\tIB_POLL_LAST_POOL_TYPE = 2,\n\tIB_POLL_DIRECT = 3,\n};\n\nenum ib_port_state {\n\tIB_PORT_NOP = 0,\n\tIB_PORT_DOWN = 1,\n\tIB_PORT_INIT = 2,\n\tIB_PORT_ARMED = 3,\n\tIB_PORT_ACTIVE = 4,\n\tIB_PORT_ACTIVE_DEFER = 5,\n};\n\nenum ib_qp_state {\n\tIB_QPS_RESET = 0,\n\tIB_QPS_INIT = 1,\n\tIB_QPS_RTR = 2,\n\tIB_QPS_RTS = 3,\n\tIB_QPS_SQD = 4,\n\tIB_QPS_SQE = 5,\n\tIB_QPS_ERR = 6,\n};\n\nenum ib_qp_type {\n\tIB_QPT_SMI = 0,\n\tIB_QPT_GSI = 1,\n\tIB_QPT_RC = 2,\n\tIB_QPT_UC = 3,\n\tIB_QPT_UD = 4,\n\tIB_QPT_RAW_IPV6 = 5,\n\tIB_QPT_RAW_ETHERTYPE = 6,\n\tIB_QPT_RAW_PACKET = 8,\n\tIB_QPT_XRC_INI = 9,\n\tIB_QPT_XRC_TGT = 10,\n\tIB_QPT_MAX = 11,\n\tIB_QPT_DRIVER = 255,\n\tIB_QPT_RESERVED1 = 4096,\n\tIB_QPT_RESERVED2 = 4097,\n\tIB_QPT_RESERVED3 = 4098,\n\tIB_QPT_RESERVED4 = 4099,\n\tIB_QPT_RESERVED5 = 4100,\n\tIB_QPT_RESERVED6 = 4101,\n\tIB_QPT_RESERVED7 = 4102,\n\tIB_QPT_RESERVED8 = 4103,\n\tIB_QPT_RESERVED9 = 4104,\n\tIB_QPT_RESERVED10 = 4105,\n};\n\nenum ib_sig_err_type {\n\tIB_SIG_BAD_GUARD = 0,\n\tIB_SIG_BAD_REFTAG = 1,\n\tIB_SIG_BAD_APPTAG = 2,\n};\n\nenum ib_sig_type {\n\tIB_SIGNAL_ALL_WR = 0,\n\tIB_SIGNAL_REQ_WR = 1,\n};\n\nenum ib_signature_type {\n\tIB_SIG_TYPE_NONE = 0,\n\tIB_SIG_TYPE_T10_DIF = 1,\n};\n\nenum ib_srq_attr_mask {\n\tIB_SRQ_MAX_WR = 1,\n\tIB_SRQ_LIMIT = 2,\n};\n\nenum ib_srq_type {\n\tIB_SRQT_BASIC = 0,\n\tIB_SRQT_XRC = 1,\n\tIB_SRQT_TM = 2,\n};\n\nenum ib_t10_dif_bg_type {\n\tIB_T10DIF_CRC = 0,\n\tIB_T10DIF_CSUM = 1,\n};\n\nenum ib_uverbs_access_flags {\n\tIB_UVERBS_ACCESS_LOCAL_WRITE = 1,\n\tIB_UVERBS_ACCESS_REMOTE_WRITE = 2,\n\tIB_UVERBS_ACCESS_REMOTE_READ = 4,\n\tIB_UVERBS_ACCESS_REMOTE_ATOMIC = 8,\n\tIB_UVERBS_ACCESS_MW_BIND = 16,\n\tIB_UVERBS_ACCESS_ZERO_BASED = 32,\n\tIB_UVERBS_ACCESS_ON_DEMAND = 64,\n\tIB_UVERBS_ACCESS_HUGETLB = 128,\n\tIB_UVERBS_ACCESS_FLUSH_GLOBAL = 256,\n\tIB_UVERBS_ACCESS_FLUSH_PERSISTENT = 512,\n\tIB_UVERBS_ACCESS_RELAXED_ORDERING = 1048576,\n\tIB_UVERBS_ACCESS_OPTIONAL_RANGE = 1072693248,\n};\n\nenum ib_uverbs_advise_mr_advice {\n\tIB_UVERBS_ADVISE_MR_ADVICE_PREFETCH = 0,\n\tIB_UVERBS_ADVISE_MR_ADVICE_PREFETCH_WRITE = 1,\n\tIB_UVERBS_ADVISE_MR_ADVICE_PREFETCH_NO_FAULT = 2,\n};\n\nenum ib_uverbs_create_qp_mask {\n\tIB_UVERBS_CREATE_QP_MASK_IND_TABLE = 1,\n};\n\nenum ib_uverbs_device_cap_flags {\n\tIB_UVERBS_DEVICE_RESIZE_MAX_WR = 1ULL,\n\tIB_UVERBS_DEVICE_BAD_PKEY_CNTR = 2ULL,\n\tIB_UVERBS_DEVICE_BAD_QKEY_CNTR = 4ULL,\n\tIB_UVERBS_DEVICE_RAW_MULTI = 8ULL,\n\tIB_UVERBS_DEVICE_AUTO_PATH_MIG = 16ULL,\n\tIB_UVERBS_DEVICE_CHANGE_PHY_PORT = 32ULL,\n\tIB_UVERBS_DEVICE_UD_AV_PORT_ENFORCE = 64ULL,\n\tIB_UVERBS_DEVICE_CURR_QP_STATE_MOD = 128ULL,\n\tIB_UVERBS_DEVICE_SHUTDOWN_PORT = 256ULL,\n\tIB_UVERBS_DEVICE_PORT_ACTIVE_EVENT = 1024ULL,\n\tIB_UVERBS_DEVICE_SYS_IMAGE_GUID = 2048ULL,\n\tIB_UVERBS_DEVICE_RC_RNR_NAK_GEN = 4096ULL,\n\tIB_UVERBS_DEVICE_SRQ_RESIZE = 8192ULL,\n\tIB_UVERBS_DEVICE_N_NOTIFY_CQ = 16384ULL,\n\tIB_UVERBS_DEVICE_MEM_WINDOW = 131072ULL,\n\tIB_UVERBS_DEVICE_UD_IP_CSUM = 262144ULL,\n\tIB_UVERBS_DEVICE_XRC = 1048576ULL,\n\tIB_UVERBS_DEVICE_MEM_MGT_EXTENSIONS = 2097152ULL,\n\tIB_UVERBS_DEVICE_MEM_WINDOW_TYPE_2A = 8388608ULL,\n\tIB_UVERBS_DEVICE_MEM_WINDOW_TYPE_2B = 16777216ULL,\n\tIB_UVERBS_DEVICE_RC_IP_CSUM = 33554432ULL,\n\tIB_UVERBS_DEVICE_RAW_IP_CSUM = 67108864ULL,\n\tIB_UVERBS_DEVICE_MANAGED_FLOW_STEERING = 536870912ULL,\n\tIB_UVERBS_DEVICE_RAW_SCATTER_FCS = 17179869184ULL,\n\tIB_UVERBS_DEVICE_PCI_WRITE_END_PADDING = 68719476736ULL,\n\tIB_UVERBS_DEVICE_FLUSH_GLOBAL = 274877906944ULL,\n\tIB_UVERBS_DEVICE_FLUSH_PERSISTENT = 549755813888ULL,\n\tIB_UVERBS_DEVICE_ATOMIC_WRITE = 1099511627776ULL,\n};\n\nenum ib_uverbs_gid_type {\n\tIB_UVERBS_GID_TYPE_IB = 0,\n\tIB_UVERBS_GID_TYPE_ROCE_V1 = 1,\n\tIB_UVERBS_GID_TYPE_ROCE_V2 = 2,\n};\n\nenum ib_uverbs_qp_create_flags {\n\tIB_UVERBS_QP_CREATE_BLOCK_MULTICAST_LOOPBACK = 2,\n\tIB_UVERBS_QP_CREATE_SCATTER_FCS = 256,\n\tIB_UVERBS_QP_CREATE_CVLAN_STRIPPING = 512,\n\tIB_UVERBS_QP_CREATE_PCI_WRITE_END_PADDING = 2048,\n\tIB_UVERBS_QP_CREATE_SQ_SIG_ALL = 4096,\n};\n\nenum ib_uverbs_qp_type {\n\tIB_UVERBS_QPT_RC = 2,\n\tIB_UVERBS_QPT_UC = 3,\n\tIB_UVERBS_QPT_UD = 4,\n\tIB_UVERBS_QPT_RAW_PACKET = 8,\n\tIB_UVERBS_QPT_XRC_INI = 9,\n\tIB_UVERBS_QPT_XRC_TGT = 10,\n\tIB_UVERBS_QPT_DRIVER = 255,\n};\n\nenum ib_uverbs_raw_packet_caps {\n\tIB_UVERBS_RAW_PACKET_CAP_CVLAN_STRIPPING = 1,\n\tIB_UVERBS_RAW_PACKET_CAP_SCATTER_FCS = 2,\n\tIB_UVERBS_RAW_PACKET_CAP_IP_CSUM = 4,\n\tIB_UVERBS_RAW_PACKET_CAP_DELAY_DROP = 8,\n};\n\nenum ib_uverbs_srq_type {\n\tIB_UVERBS_SRQT_BASIC = 0,\n\tIB_UVERBS_SRQT_XRC = 1,\n\tIB_UVERBS_SRQT_TM = 2,\n};\n\nenum ib_uverbs_wc_opcode {\n\tIB_UVERBS_WC_SEND = 0,\n\tIB_UVERBS_WC_RDMA_WRITE = 1,\n\tIB_UVERBS_WC_RDMA_READ = 2,\n\tIB_UVERBS_WC_COMP_SWAP = 3,\n\tIB_UVERBS_WC_FETCH_ADD = 4,\n\tIB_UVERBS_WC_BIND_MW = 5,\n\tIB_UVERBS_WC_LOCAL_INV = 6,\n\tIB_UVERBS_WC_TSO = 7,\n\tIB_UVERBS_WC_FLUSH = 8,\n\tIB_UVERBS_WC_ATOMIC_WRITE = 9,\n};\n\nenum ib_uverbs_wq_flags {\n\tIB_UVERBS_WQ_FLAGS_CVLAN_STRIPPING = 1,\n\tIB_UVERBS_WQ_FLAGS_SCATTER_FCS = 2,\n\tIB_UVERBS_WQ_FLAGS_DELAY_DROP = 4,\n\tIB_UVERBS_WQ_FLAGS_PCI_WRITE_END_PADDING = 8,\n};\n\nenum ib_uverbs_wq_type {\n\tIB_UVERBS_WQT_RQ = 0,\n};\n\nenum ib_uverbs_wr_opcode {\n\tIB_UVERBS_WR_RDMA_WRITE = 0,\n\tIB_UVERBS_WR_RDMA_WRITE_WITH_IMM = 1,\n\tIB_UVERBS_WR_SEND = 2,\n\tIB_UVERBS_WR_SEND_WITH_IMM = 3,\n\tIB_UVERBS_WR_RDMA_READ = 4,\n\tIB_UVERBS_WR_ATOMIC_CMP_AND_SWP = 5,\n\tIB_UVERBS_WR_ATOMIC_FETCH_AND_ADD = 6,\n\tIB_UVERBS_WR_LOCAL_INV = 7,\n\tIB_UVERBS_WR_BIND_MW = 8,\n\tIB_UVERBS_WR_SEND_WITH_INV = 9,\n\tIB_UVERBS_WR_TSO = 10,\n\tIB_UVERBS_WR_RDMA_READ_WITH_INV = 11,\n\tIB_UVERBS_WR_MASKED_ATOMIC_CMP_AND_SWP = 12,\n\tIB_UVERBS_WR_MASKED_ATOMIC_FETCH_AND_ADD = 13,\n\tIB_UVERBS_WR_FLUSH = 14,\n\tIB_UVERBS_WR_ATOMIC_WRITE = 15,\n};\n\nenum ib_uverbs_write_cmds {\n\tIB_USER_VERBS_CMD_GET_CONTEXT = 0,\n\tIB_USER_VERBS_CMD_QUERY_DEVICE = 1,\n\tIB_USER_VERBS_CMD_QUERY_PORT = 2,\n\tIB_USER_VERBS_CMD_ALLOC_PD = 3,\n\tIB_USER_VERBS_CMD_DEALLOC_PD = 4,\n\tIB_USER_VERBS_CMD_CREATE_AH = 5,\n\tIB_USER_VERBS_CMD_MODIFY_AH = 6,\n\tIB_USER_VERBS_CMD_QUERY_AH = 7,\n\tIB_USER_VERBS_CMD_DESTROY_AH = 8,\n\tIB_USER_VERBS_CMD_REG_MR = 9,\n\tIB_USER_VERBS_CMD_REG_SMR = 10,\n\tIB_USER_VERBS_CMD_REREG_MR = 11,\n\tIB_USER_VERBS_CMD_QUERY_MR = 12,\n\tIB_USER_VERBS_CMD_DEREG_MR = 13,\n\tIB_USER_VERBS_CMD_ALLOC_MW = 14,\n\tIB_USER_VERBS_CMD_BIND_MW = 15,\n\tIB_USER_VERBS_CMD_DEALLOC_MW = 16,\n\tIB_USER_VERBS_CMD_CREATE_COMP_CHANNEL = 17,\n\tIB_USER_VERBS_CMD_CREATE_CQ = 18,\n\tIB_USER_VERBS_CMD_RESIZE_CQ = 19,\n\tIB_USER_VERBS_CMD_DESTROY_CQ = 20,\n\tIB_USER_VERBS_CMD_POLL_CQ = 21,\n\tIB_USER_VERBS_CMD_PEEK_CQ = 22,\n\tIB_USER_VERBS_CMD_REQ_NOTIFY_CQ = 23,\n\tIB_USER_VERBS_CMD_CREATE_QP = 24,\n\tIB_USER_VERBS_CMD_QUERY_QP = 25,\n\tIB_USER_VERBS_CMD_MODIFY_QP = 26,\n\tIB_USER_VERBS_CMD_DESTROY_QP = 27,\n\tIB_USER_VERBS_CMD_POST_SEND = 28,\n\tIB_USER_VERBS_CMD_POST_RECV = 29,\n\tIB_USER_VERBS_CMD_ATTACH_MCAST = 30,\n\tIB_USER_VERBS_CMD_DETACH_MCAST = 31,\n\tIB_USER_VERBS_CMD_CREATE_SRQ = 32,\n\tIB_USER_VERBS_CMD_MODIFY_SRQ = 33,\n\tIB_USER_VERBS_CMD_QUERY_SRQ = 34,\n\tIB_USER_VERBS_CMD_DESTROY_SRQ = 35,\n\tIB_USER_VERBS_CMD_POST_SRQ_RECV = 36,\n\tIB_USER_VERBS_CMD_OPEN_XRCD = 37,\n\tIB_USER_VERBS_CMD_CLOSE_XRCD = 38,\n\tIB_USER_VERBS_CMD_CREATE_XSRQ = 39,\n\tIB_USER_VERBS_CMD_OPEN_QP = 40,\n};\n\nenum ib_wc_opcode {\n\tIB_WC_SEND = 0,\n\tIB_WC_RDMA_WRITE = 1,\n\tIB_WC_RDMA_READ = 2,\n\tIB_WC_COMP_SWAP = 3,\n\tIB_WC_FETCH_ADD = 4,\n\tIB_WC_BIND_MW = 5,\n\tIB_WC_LOCAL_INV = 6,\n\tIB_WC_LSO = 7,\n\tIB_WC_ATOMIC_WRITE = 9,\n\tIB_WC_REG_MR = 10,\n\tIB_WC_MASKED_COMP_SWAP = 11,\n\tIB_WC_MASKED_FETCH_ADD = 12,\n\tIB_WC_FLUSH = 8,\n\tIB_WC_RECV = 128,\n\tIB_WC_RECV_RDMA_WITH_IMM = 129,\n};\n\nenum ib_wc_status {\n\tIB_WC_SUCCESS = 0,\n\tIB_WC_LOC_LEN_ERR = 1,\n\tIB_WC_LOC_QP_OP_ERR = 2,\n\tIB_WC_LOC_EEC_OP_ERR = 3,\n\tIB_WC_LOC_PROT_ERR = 4,\n\tIB_WC_WR_FLUSH_ERR = 5,\n\tIB_WC_MW_BIND_ERR = 6,\n\tIB_WC_BAD_RESP_ERR = 7,\n\tIB_WC_LOC_ACCESS_ERR = 8,\n\tIB_WC_REM_INV_REQ_ERR = 9,\n\tIB_WC_REM_ACCESS_ERR = 10,\n\tIB_WC_REM_OP_ERR = 11,\n\tIB_WC_RETRY_EXC_ERR = 12,\n\tIB_WC_RNR_RETRY_EXC_ERR = 13,\n\tIB_WC_LOC_RDD_VIOL_ERR = 14,\n\tIB_WC_REM_INV_RD_REQ_ERR = 15,\n\tIB_WC_REM_ABORT_ERR = 16,\n\tIB_WC_INV_EECN_ERR = 17,\n\tIB_WC_INV_EEC_STATE_ERR = 18,\n\tIB_WC_FATAL_ERR = 19,\n\tIB_WC_RESP_TIMEOUT_ERR = 20,\n\tIB_WC_GENERAL_ERR = 21,\n};\n\nenum ib_wq_state {\n\tIB_WQS_RESET = 0,\n\tIB_WQS_RDY = 1,\n\tIB_WQS_ERR = 2,\n};\n\nenum ib_wq_type {\n\tIB_WQT_RQ = 0,\n};\n\nenum ib_wr_opcode {\n\tIB_WR_RDMA_WRITE = 0,\n\tIB_WR_RDMA_WRITE_WITH_IMM = 1,\n\tIB_WR_SEND = 2,\n\tIB_WR_SEND_WITH_IMM = 3,\n\tIB_WR_RDMA_READ = 4,\n\tIB_WR_ATOMIC_CMP_AND_SWP = 5,\n\tIB_WR_ATOMIC_FETCH_AND_ADD = 6,\n\tIB_WR_BIND_MW = 8,\n\tIB_WR_LSO = 10,\n\tIB_WR_SEND_WITH_INV = 9,\n\tIB_WR_RDMA_READ_WITH_INV = 11,\n\tIB_WR_LOCAL_INV = 7,\n\tIB_WR_MASKED_ATOMIC_CMP_AND_SWP = 12,\n\tIB_WR_MASKED_ATOMIC_FETCH_AND_ADD = 13,\n\tIB_WR_FLUSH = 14,\n\tIB_WR_ATOMIC_WRITE = 15,\n\tIB_WR_REG_MR = 32,\n\tIB_WR_REG_MR_INTEGRITY = 33,\n\tIB_WR_RESERVED1 = 240,\n\tIB_WR_RESERVED2 = 241,\n\tIB_WR_RESERVED3 = 242,\n\tIB_WR_RESERVED4 = 243,\n\tIB_WR_RESERVED5 = 244,\n\tIB_WR_RESERVED6 = 245,\n\tIB_WR_RESERVED7 = 246,\n\tIB_WR_RESERVED8 = 247,\n\tIB_WR_RESERVED9 = 248,\n\tIB_WR_RESERVED10 = 249,\n};\n\nenum ibs_states {\n\tIBS_ENABLED = 0,\n\tIBS_STARTED = 1,\n\tIBS_STOPPING = 2,\n\tIBS_STOPPED = 3,\n\tIBS_MAX_STATES = 4,\n};\n\nenum id_action {\n\tID_REMOVE = 0,\n\tID_ADD = 1,\n};\n\nenum idle_boot_override {\n\tIDLE_NO_OVERRIDE = 0,\n\tIDLE_HALT = 1,\n\tIDLE_NOMWAIT = 2,\n\tIDLE_POLL = 3,\n};\n\nenum ieee80211_bss_type {\n\tIEEE80211_BSS_TYPE_ESS = 0,\n\tIEEE80211_BSS_TYPE_PBSS = 1,\n\tIEEE80211_BSS_TYPE_IBSS = 2,\n\tIEEE80211_BSS_TYPE_MBSS = 3,\n\tIEEE80211_BSS_TYPE_ANY = 4,\n};\n\nenum ieee80211_edmg_bw_config {\n\tIEEE80211_EDMG_BW_CONFIG_4 = 4,\n\tIEEE80211_EDMG_BW_CONFIG_5 = 5,\n\tIEEE80211_EDMG_BW_CONFIG_6 = 6,\n\tIEEE80211_EDMG_BW_CONFIG_7 = 7,\n\tIEEE80211_EDMG_BW_CONFIG_8 = 8,\n\tIEEE80211_EDMG_BW_CONFIG_9 = 9,\n\tIEEE80211_EDMG_BW_CONFIG_10 = 10,\n\tIEEE80211_EDMG_BW_CONFIG_11 = 11,\n\tIEEE80211_EDMG_BW_CONFIG_12 = 12,\n\tIEEE80211_EDMG_BW_CONFIG_13 = 13,\n\tIEEE80211_EDMG_BW_CONFIG_14 = 14,\n\tIEEE80211_EDMG_BW_CONFIG_15 = 15,\n};\n\nenum ieee802154_filtering_level {\n\tIEEE802154_FILTERING_NONE = 0,\n\tIEEE802154_FILTERING_1_FCS = 1,\n\tIEEE802154_FILTERING_2_PROMISCUOUS = 2,\n\tIEEE802154_FILTERING_3_SCAN = 3,\n\tIEEE802154_FILTERING_4_FRAME_FIELDS = 4,\n};\n\nenum ieee8021q_traffic_type {\n\tIEEE8021Q_TT_BK = 0,\n\tIEEE8021Q_TT_BE = 1,\n\tIEEE8021Q_TT_EE = 2,\n\tIEEE8021Q_TT_CA = 3,\n\tIEEE8021Q_TT_VI = 4,\n\tIEEE8021Q_TT_VO = 5,\n\tIEEE8021Q_TT_IC = 6,\n\tIEEE8021Q_TT_NC = 7,\n\tIEEE8021Q_TT_MAX = 8,\n};\n\nenum ieee_attrs {\n\tDCB_ATTR_IEEE_UNSPEC = 0,\n\tDCB_ATTR_IEEE_ETS = 1,\n\tDCB_ATTR_IEEE_PFC = 2,\n\tDCB_ATTR_IEEE_APP_TABLE = 3,\n\tDCB_ATTR_IEEE_PEER_ETS = 4,\n\tDCB_ATTR_IEEE_PEER_PFC = 5,\n\tDCB_ATTR_IEEE_PEER_APP = 6,\n\tDCB_ATTR_IEEE_MAXRATE = 7,\n\tDCB_ATTR_IEEE_QCN = 8,\n\tDCB_ATTR_IEEE_QCN_STATS = 9,\n\tDCB_ATTR_DCB_BUFFER = 10,\n\tDCB_ATTR_DCB_APP_TRUST_TABLE = 11,\n\tDCB_ATTR_DCB_REWR_TABLE = 12,\n\t__DCB_ATTR_IEEE_MAX = 13,\n};\n\nenum ieee_attrs_app {\n\tDCB_ATTR_IEEE_APP_UNSPEC = 0,\n\tDCB_ATTR_IEEE_APP = 1,\n\tDCB_ATTR_DCB_APP = 2,\n\t__DCB_ATTR_IEEE_APP_MAX = 3,\n};\n\nenum ima_fs_flags {\n\tIMA_FS_BUSY = 0,\n};\n\nenum ima_hooks {\n\tNONE___2 = 0,\n\tFILE_CHECK = 1,\n\tMMAP_CHECK = 2,\n\tMMAP_CHECK_REQPROT = 3,\n\tBPRM_CHECK = 4,\n\tCREDS_CHECK = 5,\n\tPOST_SETATTR = 6,\n\tMODULE_CHECK = 7,\n\tFIRMWARE_CHECK = 8,\n\tKEXEC_KERNEL_CHECK = 9,\n\tKEXEC_INITRAMFS_CHECK = 10,\n\tPOLICY_CHECK = 11,\n\tKEXEC_CMDLINE = 12,\n\tKEY_CHECK = 13,\n\tCRITICAL_DATA = 14,\n\tSETXATTR_CHECK = 15,\n\tMAX_CHECK = 16,\n};\n\nenum ima_show_type {\n\tIMA_SHOW_BINARY = 0,\n\tIMA_SHOW_BINARY_NO_FIELD_LEN = 1,\n\tIMA_SHOW_BINARY_OLD_STRING_FMT = 2,\n\tIMA_SHOW_ASCII = 3,\n};\n\nenum in6_addr_gen_mode {\n\tIN6_ADDR_GEN_MODE_EUI64 = 0,\n\tIN6_ADDR_GEN_MODE_NONE = 1,\n\tIN6_ADDR_GEN_MODE_STABLE_PRIVACY = 2,\n\tIN6_ADDR_GEN_MODE_RANDOM = 3,\n};\n\nenum inet_csk_ack_state_t {\n\tICSK_ACK_SCHED = 1,\n\tICSK_ACK_TIMER = 2,\n\tICSK_ACK_PUSHED = 4,\n\tICSK_ACK_PUSHED2 = 8,\n\tICSK_ACK_NOW = 16,\n\tICSK_ACK_NOMEM = 32,\n};\n\nenum inode_i_mutex_lock_class {\n\tI_MUTEX_NORMAL = 0,\n\tI_MUTEX_PARENT = 1,\n\tI_MUTEX_CHILD = 2,\n\tI_MUTEX_XATTR = 3,\n\tI_MUTEX_NONDIR2 = 4,\n\tI_MUTEX_PARENT2 = 5,\n};\n\nenum input_clock_type {\n\tINPUT_CLK_REAL = 0,\n\tINPUT_CLK_MONO = 1,\n\tINPUT_CLK_BOOT = 2,\n\tINPUT_CLK_MAX = 3,\n};\n\nenum insn_mmio_type {\n\tINSN_MMIO_DECODE_FAILED = 0,\n\tINSN_MMIO_WRITE = 1,\n\tINSN_MMIO_WRITE_IMM = 2,\n\tINSN_MMIO_READ = 3,\n\tINSN_MMIO_READ_ZERO_EXTEND = 4,\n\tINSN_MMIO_READ_SIGN_EXTEND = 5,\n\tINSN_MMIO_MOVS = 6,\n};\n\nenum insn_mode {\n\tINSN_MODE_32 = 0,\n\tINSN_MODE_64 = 1,\n\tINSN_MODE_KERN = 2,\n\tINSN_NUM_MODES = 3,\n};\n\nenum insn_type {\n\tCALL = 0,\n\tNOP = 1,\n\tJMP = 2,\n\tRET = 3,\n\tJCC = 4,\n};\n\nenum int_type {\n\tSYS_INT = 1,\n\tDCDC_INT = 2,\n\tRTC_INT = 4,\n\tADC_INT = 8,\n\tGPIO_INT = 16,\n};\n\nenum integrity_status {\n\tINTEGRITY_PASS = 0,\n\tINTEGRITY_PASS_IMMUTABLE = 1,\n\tINTEGRITY_FAIL = 2,\n\tINTEGRITY_FAIL_IMMUTABLE = 3,\n\tINTEGRITY_NOLABEL = 4,\n\tINTEGRITY_NOXATTRS = 5,\n\tINTEGRITY_UNKNOWN = 6,\n};\n\nenum intel_cht_wc_models {\n\tINTEL_CHT_WC_UNKNOWN = 0,\n\tINTEL_CHT_WC_GPD_WIN_POCKET = 1,\n\tINTEL_CHT_WC_XIAOMI_MIPAD2 = 2,\n\tINTEL_CHT_WC_LENOVO_YOGABOOK1 = 3,\n\tINTEL_CHT_WC_LENOVO_YT3_X90 = 4,\n};\n\nenum intel_excl_state_type {\n\tINTEL_EXCL_UNUSED = 0,\n\tINTEL_EXCL_SHARED = 1,\n\tINTEL_EXCL_EXCLUSIVE = 2,\n};\n\nenum intercept_words {\n\tINTERCEPT_CR = 0,\n\tINTERCEPT_DR = 1,\n\tINTERCEPT_EXCEPTION = 2,\n\tINTERCEPT_WORD3 = 3,\n\tINTERCEPT_WORD4 = 4,\n\tINTERCEPT_WORD5 = 5,\n\tMAX_INTERCEPT = 6,\n};\n\nenum io_pgtable_caps {\n\tIO_PGTABLE_CAP_CUSTOM_ALLOCATOR = 1,\n};\n\nenum io_pgtable_fmt {\n\tARM_32_LPAE_S1 = 0,\n\tARM_32_LPAE_S2 = 1,\n\tARM_64_LPAE_S1 = 2,\n\tARM_64_LPAE_S2 = 3,\n\tARM_V7S = 4,\n\tARM_MALI_LPAE = 5,\n\tAMD_IOMMU_V1 = 6,\n\tAMD_IOMMU_V2 = 7,\n\tAPPLE_DART = 8,\n\tAPPLE_DART2 = 9,\n\tIO_PGTABLE_NUM_FMTS = 10,\n};\n\nenum io_uring_cmd_flags {\n\tIO_URING_F_COMPLETE_DEFER = 1,\n\tIO_URING_F_UNLOCKED = 2,\n\tIO_URING_F_MULTISHOT = 4,\n\tIO_URING_F_IOWQ = 8,\n\tIO_URING_F_NONBLOCK = -2147483648,\n\tIO_URING_F_SQE128 = 256,\n\tIO_URING_F_CQE32 = 512,\n\tIO_URING_F_IOPOLL = 1024,\n\tIO_URING_F_CANCEL = 2048,\n\tIO_URING_F_COMPAT = 4096,\n};\n\nenum io_uring_msg_ring_flags {\n\tIORING_MSG_DATA = 0,\n\tIORING_MSG_SEND_FD = 1,\n};\n\nenum io_uring_op {\n\tIORING_OP_NOP = 0,\n\tIORING_OP_READV = 1,\n\tIORING_OP_WRITEV = 2,\n\tIORING_OP_FSYNC = 3,\n\tIORING_OP_READ_FIXED = 4,\n\tIORING_OP_WRITE_FIXED = 5,\n\tIORING_OP_POLL_ADD = 6,\n\tIORING_OP_POLL_REMOVE = 7,\n\tIORING_OP_SYNC_FILE_RANGE = 8,\n\tIORING_OP_SENDMSG = 9,\n\tIORING_OP_RECVMSG = 10,\n\tIORING_OP_TIMEOUT = 11,\n\tIORING_OP_TIMEOUT_REMOVE = 12,\n\tIORING_OP_ACCEPT = 13,\n\tIORING_OP_ASYNC_CANCEL = 14,\n\tIORING_OP_LINK_TIMEOUT = 15,\n\tIORING_OP_CONNECT = 16,\n\tIORING_OP_FALLOCATE = 17,\n\tIORING_OP_OPENAT = 18,\n\tIORING_OP_CLOSE = 19,\n\tIORING_OP_FILES_UPDATE = 20,\n\tIORING_OP_STATX = 21,\n\tIORING_OP_READ = 22,\n\tIORING_OP_WRITE = 23,\n\tIORING_OP_FADVISE = 24,\n\tIORING_OP_MADVISE = 25,\n\tIORING_OP_SEND = 26,\n\tIORING_OP_RECV = 27,\n\tIORING_OP_OPENAT2 = 28,\n\tIORING_OP_EPOLL_CTL = 29,\n\tIORING_OP_SPLICE = 30,\n\tIORING_OP_PROVIDE_BUFFERS = 31,\n\tIORING_OP_REMOVE_BUFFERS = 32,\n\tIORING_OP_TEE = 33,\n\tIORING_OP_SHUTDOWN = 34,\n\tIORING_OP_RENAMEAT = 35,\n\tIORING_OP_UNLINKAT = 36,\n\tIORING_OP_MKDIRAT = 37,\n\tIORING_OP_SYMLINKAT = 38,\n\tIORING_OP_LINKAT = 39,\n\tIORING_OP_MSG_RING = 40,\n\tIORING_OP_FSETXATTR = 41,\n\tIORING_OP_SETXATTR = 42,\n\tIORING_OP_FGETXATTR = 43,\n\tIORING_OP_GETXATTR = 44,\n\tIORING_OP_SOCKET = 45,\n\tIORING_OP_URING_CMD = 46,\n\tIORING_OP_SEND_ZC = 47,\n\tIORING_OP_SENDMSG_ZC = 48,\n\tIORING_OP_READ_MULTISHOT = 49,\n\tIORING_OP_WAITID = 50,\n\tIORING_OP_FUTEX_WAIT = 51,\n\tIORING_OP_FUTEX_WAKE = 52,\n\tIORING_OP_FUTEX_WAITV = 53,\n\tIORING_OP_FIXED_FD_INSTALL = 54,\n\tIORING_OP_FTRUNCATE = 55,\n\tIORING_OP_BIND = 56,\n\tIORING_OP_LISTEN = 57,\n\tIORING_OP_LAST = 58,\n};\n\nenum io_uring_register_op {\n\tIORING_REGISTER_BUFFERS = 0,\n\tIORING_UNREGISTER_BUFFERS = 1,\n\tIORING_REGISTER_FILES = 2,\n\tIORING_UNREGISTER_FILES = 3,\n\tIORING_REGISTER_EVENTFD = 4,\n\tIORING_UNREGISTER_EVENTFD = 5,\n\tIORING_REGISTER_FILES_UPDATE = 6,\n\tIORING_REGISTER_EVENTFD_ASYNC = 7,\n\tIORING_REGISTER_PROBE = 8,\n\tIORING_REGISTER_PERSONALITY = 9,\n\tIORING_UNREGISTER_PERSONALITY = 10,\n\tIORING_REGISTER_RESTRICTIONS = 11,\n\tIORING_REGISTER_ENABLE_RINGS = 12,\n\tIORING_REGISTER_FILES2 = 13,\n\tIORING_REGISTER_FILES_UPDATE2 = 14,\n\tIORING_REGISTER_BUFFERS2 = 15,\n\tIORING_REGISTER_BUFFERS_UPDATE = 16,\n\tIORING_REGISTER_IOWQ_AFF = 17,\n\tIORING_UNREGISTER_IOWQ_AFF = 18,\n\tIORING_REGISTER_IOWQ_MAX_WORKERS = 19,\n\tIORING_REGISTER_RING_FDS = 20,\n\tIORING_UNREGISTER_RING_FDS = 21,\n\tIORING_REGISTER_PBUF_RING = 22,\n\tIORING_UNREGISTER_PBUF_RING = 23,\n\tIORING_REGISTER_SYNC_CANCEL = 24,\n\tIORING_REGISTER_FILE_ALLOC_RANGE = 25,\n\tIORING_REGISTER_PBUF_STATUS = 26,\n\tIORING_REGISTER_NAPI = 27,\n\tIORING_UNREGISTER_NAPI = 28,\n\tIORING_REGISTER_LAST = 29,\n\tIORING_REGISTER_USE_REGISTERED_RING = 2147483648,\n};\n\nenum io_uring_register_pbuf_ring_flags {\n\tIOU_PBUF_RING_MMAP = 1,\n};\n\nenum io_uring_register_restriction_op {\n\tIORING_RESTRICTION_REGISTER_OP = 0,\n\tIORING_RESTRICTION_SQE_OP = 1,\n\tIORING_RESTRICTION_SQE_FLAGS_ALLOWED = 2,\n\tIORING_RESTRICTION_SQE_FLAGS_REQUIRED = 3,\n\tIORING_RESTRICTION_LAST = 4,\n};\n\nenum io_uring_socket_op {\n\tSOCKET_URING_OP_SIOCINQ = 0,\n\tSOCKET_URING_OP_SIOCOUTQ = 1,\n\tSOCKET_URING_OP_GETSOCKOPT = 2,\n\tSOCKET_URING_OP_SETSOCKOPT = 3,\n};\n\nenum io_uring_sqe_flags_bit {\n\tIOSQE_FIXED_FILE_BIT = 0,\n\tIOSQE_IO_DRAIN_BIT = 1,\n\tIOSQE_IO_LINK_BIT = 2,\n\tIOSQE_IO_HARDLINK_BIT = 3,\n\tIOSQE_ASYNC_BIT = 4,\n\tIOSQE_BUFFER_SELECT_BIT = 5,\n\tIOSQE_CQE_SKIP_SUCCESS_BIT = 6,\n};\n\nenum io_wq_cancel {\n\tIO_WQ_CANCEL_OK = 0,\n\tIO_WQ_CANCEL_RUNNING = 1,\n\tIO_WQ_CANCEL_NOTFOUND = 2,\n};\n\nenum io_wq_type {\n\tIO_WQ_BOUND = 0,\n\tIO_WQ_UNBOUND = 1,\n};\n\nenum ioam6_event_attr {\n\tIOAM6_EVENT_ATTR_UNSPEC = 0,\n\tIOAM6_EVENT_ATTR_TRACE_NAMESPACE = 1,\n\tIOAM6_EVENT_ATTR_TRACE_NODELEN = 2,\n\tIOAM6_EVENT_ATTR_TRACE_TYPE = 3,\n\tIOAM6_EVENT_ATTR_TRACE_DATA = 4,\n\t__IOAM6_EVENT_ATTR_MAX = 5,\n};\n\nenum ioam6_event_type {\n\tIOAM6_EVENT_UNSPEC = 0,\n\tIOAM6_EVENT_TRACE = 1,\n};\n\nenum ioapic_domain_type {\n\tIOAPIC_DOMAIN_INVALID = 0,\n\tIOAPIC_DOMAIN_LEGACY = 1,\n\tIOAPIC_DOMAIN_STRICT = 2,\n\tIOAPIC_DOMAIN_DYNAMIC = 3,\n};\n\nenum ioc_running {\n\tIOC_IDLE = 0,\n\tIOC_RUNNING = 1,\n\tIOC_STOP = 2,\n};\n\nenum iommu_cap {\n\tIOMMU_CAP_CACHE_COHERENCY = 0,\n\tIOMMU_CAP_NOEXEC = 1,\n\tIOMMU_CAP_PRE_BOOT_PROTECTION = 2,\n\tIOMMU_CAP_ENFORCE_CACHE_COHERENCY = 3,\n\tIOMMU_CAP_DEFERRED_FLUSH = 4,\n\tIOMMU_CAP_DIRTY_TRACKING = 5,\n};\n\nenum iommu_dev_features {\n\tIOMMU_DEV_FEAT_SVA = 0,\n\tIOMMU_DEV_FEAT_IOPF = 1,\n};\n\nenum iommu_dma_cookie_type {\n\tIOMMU_DMA_IOVA_COOKIE = 0,\n\tIOMMU_DMA_MSI_COOKIE = 1,\n};\n\nenum iommu_dma_queue_type {\n\tIOMMU_DMA_OPTS_PER_CPU_QUEUE = 0,\n\tIOMMU_DMA_OPTS_SINGLE_QUEUE = 1,\n};\n\nenum iommu_fault_type {\n\tIOMMU_FAULT_PAGE_REQ = 1,\n};\n\nenum iommu_hw_info_type {\n\tIOMMU_HW_INFO_TYPE_NONE = 0,\n\tIOMMU_HW_INFO_TYPE_INTEL_VTD = 1,\n};\n\nenum iommu_hw_info_vtd_flags {\n\tIOMMU_HW_INFO_VTD_ERRATA_772415_SPR17 = 1,\n};\n\nenum iommu_hwpt_data_type {\n\tIOMMU_HWPT_DATA_NONE = 0,\n\tIOMMU_HWPT_DATA_VTD_S1 = 1,\n};\n\nenum iommu_hwpt_invalidate_data_type {\n\tIOMMU_HWPT_INVALIDATE_DATA_VTD_S1 = 0,\n};\n\nenum iommu_hwpt_vtd_s1_flags {\n\tIOMMU_VTD_S1_SRE = 1,\n\tIOMMU_VTD_S1_EAFE = 2,\n\tIOMMU_VTD_S1_WPE = 4,\n};\n\nenum iommu_hwpt_vtd_s1_invalidate_flags {\n\tIOMMU_VTD_INV_FLAGS_LEAF = 1,\n};\n\nenum iommu_init_state {\n\tIOMMU_START_STATE = 0,\n\tIOMMU_IVRS_DETECTED = 1,\n\tIOMMU_ACPI_FINISHED = 2,\n\tIOMMU_ENABLED = 3,\n\tIOMMU_PCI_INIT = 4,\n\tIOMMU_INTERRUPTS_EN = 5,\n\tIOMMU_INITIALIZED = 6,\n\tIOMMU_NOT_FOUND = 7,\n\tIOMMU_INIT_ERROR = 8,\n\tIOMMU_CMDLINE_DISABLED = 9,\n};\n\nenum iommu_page_response_code {\n\tIOMMU_PAGE_RESP_SUCCESS = 0,\n\tIOMMU_PAGE_RESP_INVALID = 1,\n\tIOMMU_PAGE_RESP_FAILURE = 2,\n};\n\nenum iommu_resv_type {\n\tIOMMU_RESV_DIRECT = 0,\n\tIOMMU_RESV_DIRECT_RELAXABLE = 1,\n\tIOMMU_RESV_RESERVED = 2,\n\tIOMMU_RESV_MSI = 3,\n\tIOMMU_RESV_SW_MSI = 4,\n};\n\nenum iommufd_hwpt_alloc_flags {\n\tIOMMU_HWPT_ALLOC_NEST_PARENT = 1,\n\tIOMMU_HWPT_ALLOC_DIRTY_TRACKING = 2,\n\tIOMMU_HWPT_FAULT_ID_VALID = 4,\n};\n\nenum ip6_defrag_users {\n\tIP6_DEFRAG_LOCAL_DELIVER = 0,\n\tIP6_DEFRAG_CONNTRACK_IN = 1,\n\t__IP6_DEFRAG_CONNTRACK_IN = 65536,\n\tIP6_DEFRAG_CONNTRACK_OUT = 65537,\n\t__IP6_DEFRAG_CONNTRACK_OUT = 131072,\n\tIP6_DEFRAG_CONNTRACK_BRIDGE_IN = 131073,\n\t__IP6_DEFRAG_CONNTRACK_BRIDGE_IN = 196608,\n};\n\nenum ip_conntrack_dir {\n\tIP_CT_DIR_ORIGINAL = 0,\n\tIP_CT_DIR_REPLY = 1,\n\tIP_CT_DIR_MAX = 2,\n};\n\nenum ip_conntrack_info {\n\tIP_CT_ESTABLISHED = 0,\n\tIP_CT_RELATED = 1,\n\tIP_CT_NEW = 2,\n\tIP_CT_IS_REPLY = 3,\n\tIP_CT_ESTABLISHED_REPLY = 3,\n\tIP_CT_RELATED_REPLY = 4,\n\tIP_CT_NUMBER = 5,\n\tIP_CT_UNTRACKED = 7,\n};\n\nenum ip_conntrack_status {\n\tIPS_EXPECTED_BIT = 0,\n\tIPS_EXPECTED = 1,\n\tIPS_SEEN_REPLY_BIT = 1,\n\tIPS_SEEN_REPLY = 2,\n\tIPS_ASSURED_BIT = 2,\n\tIPS_ASSURED = 4,\n\tIPS_CONFIRMED_BIT = 3,\n\tIPS_CONFIRMED = 8,\n\tIPS_SRC_NAT_BIT = 4,\n\tIPS_SRC_NAT = 16,\n\tIPS_DST_NAT_BIT = 5,\n\tIPS_DST_NAT = 32,\n\tIPS_NAT_MASK = 48,\n\tIPS_SEQ_ADJUST_BIT = 6,\n\tIPS_SEQ_ADJUST = 64,\n\tIPS_SRC_NAT_DONE_BIT = 7,\n\tIPS_SRC_NAT_DONE = 128,\n\tIPS_DST_NAT_DONE_BIT = 8,\n\tIPS_DST_NAT_DONE = 256,\n\tIPS_NAT_DONE_MASK = 384,\n\tIPS_DYING_BIT = 9,\n\tIPS_DYING = 512,\n\tIPS_FIXED_TIMEOUT_BIT = 10,\n\tIPS_FIXED_TIMEOUT = 1024,\n\tIPS_TEMPLATE_BIT = 11,\n\tIPS_TEMPLATE = 2048,\n\tIPS_UNTRACKED_BIT = 12,\n\tIPS_UNTRACKED = 4096,\n\tIPS_NAT_CLASH_BIT = 12,\n\tIPS_NAT_CLASH = 4096,\n\tIPS_HELPER_BIT = 13,\n\tIPS_HELPER = 8192,\n\tIPS_OFFLOAD_BIT = 14,\n\tIPS_OFFLOAD = 16384,\n\tIPS_HW_OFFLOAD_BIT = 15,\n\tIPS_HW_OFFLOAD = 32768,\n\tIPS_UNCHANGEABLE_MASK = 56313,\n\t__IPS_MAX_BIT = 16,\n};\n\nenum ip_defrag_users {\n\tIP_DEFRAG_LOCAL_DELIVER = 0,\n\tIP_DEFRAG_CALL_RA_CHAIN = 1,\n\tIP_DEFRAG_CONNTRACK_IN = 2,\n\t__IP_DEFRAG_CONNTRACK_IN_END = 65537,\n\tIP_DEFRAG_CONNTRACK_OUT = 65538,\n\t__IP_DEFRAG_CONNTRACK_OUT_END = 131073,\n\tIP_DEFRAG_CONNTRACK_BRIDGE_IN = 131074,\n\t__IP_DEFRAG_CONNTRACK_BRIDGE_IN = 196609,\n\tIP_DEFRAG_VS_IN = 196610,\n\tIP_DEFRAG_VS_OUT = 196611,\n\tIP_DEFRAG_VS_FWD = 196612,\n\tIP_DEFRAG_AF_PACKET = 196613,\n\tIP_DEFRAG_MACVLAN = 196614,\n};\n\nenum ipi_vector {\n\tXEN_RESCHEDULE_VECTOR = 0,\n\tXEN_CALL_FUNCTION_VECTOR = 1,\n\tXEN_CALL_FUNCTION_SINGLE_VECTOR = 2,\n\tXEN_SPIN_UNLOCK_VECTOR = 3,\n\tXEN_IRQ_WORK_VECTOR = 4,\n\tXEN_NMI_VECTOR = 5,\n\tXEN_NR_IPIS = 6,\n};\n\nenum ipmi_addr_space {\n\tIPMI_IO_ADDR_SPACE = 0,\n\tIPMI_MEM_ADDR_SPACE = 1,\n};\n\nenum ipmi_addr_src {\n\tSI_INVALID = 0,\n\tSI_HOTMOD = 1,\n\tSI_HARDCODED = 2,\n\tSI_SPMI = 3,\n\tSI_ACPI = 4,\n\tSI_SMBIOS = 5,\n\tSI_PCI = 6,\n\tSI_DEVICETREE = 7,\n\tSI_PLATFORM = 8,\n\tSI_LAST = 9,\n};\n\nenum ipmi_plat_interface_type {\n\tIPMI_PLAT_IF_SI = 0,\n\tIPMI_PLAT_IF_SSIF = 1,\n};\n\nenum irq_alloc_type {\n\tX86_IRQ_ALLOC_TYPE_IOAPIC = 1,\n\tX86_IRQ_ALLOC_TYPE_HPET = 2,\n\tX86_IRQ_ALLOC_TYPE_PCI_MSI = 3,\n\tX86_IRQ_ALLOC_TYPE_PCI_MSIX = 4,\n\tX86_IRQ_ALLOC_TYPE_DMAR = 5,\n\tX86_IRQ_ALLOC_TYPE_AMDVI = 6,\n\tX86_IRQ_ALLOC_TYPE_UV = 7,\n};\n\nenum irq_domain_bus_token {\n\tDOMAIN_BUS_ANY = 0,\n\tDOMAIN_BUS_WIRED = 1,\n\tDOMAIN_BUS_GENERIC_MSI = 2,\n\tDOMAIN_BUS_PCI_MSI = 3,\n\tDOMAIN_BUS_PLATFORM_MSI = 4,\n\tDOMAIN_BUS_NEXUS = 5,\n\tDOMAIN_BUS_IPI = 6,\n\tDOMAIN_BUS_FSL_MC_MSI = 7,\n\tDOMAIN_BUS_TI_SCI_INTA_MSI = 8,\n\tDOMAIN_BUS_WAKEUP = 9,\n\tDOMAIN_BUS_VMD_MSI = 10,\n\tDOMAIN_BUS_PCI_DEVICE_MSI = 11,\n\tDOMAIN_BUS_PCI_DEVICE_MSIX = 12,\n\tDOMAIN_BUS_DMAR = 13,\n\tDOMAIN_BUS_AMDVI = 14,\n\tDOMAIN_BUS_DEVICE_MSI = 15,\n\tDOMAIN_BUS_WIRED_TO_MSI = 16,\n};\n\nenum irq_gc_flags {\n\tIRQ_GC_INIT_MASK_CACHE = 1,\n\tIRQ_GC_INIT_NESTED_LOCK = 2,\n\tIRQ_GC_MASK_CACHE_PER_TYPE = 4,\n\tIRQ_GC_NO_MASK = 8,\n\tIRQ_GC_BE_IO = 16,\n};\n\nenum irq_mode {\n\tIRQ_REMAPPING = 0,\n\tIRQ_POSTING = 1,\n};\n\nenum irq_remap_cap {\n\tIRQ_POSTING_CAP = 0,\n};\n\nenum irqchip_irq_state {\n\tIRQCHIP_STATE_PENDING = 0,\n\tIRQCHIP_STATE_ACTIVE = 1,\n\tIRQCHIP_STATE_MASKED = 2,\n\tIRQCHIP_STATE_LINE_LEVEL = 3,\n};\n\nenum irqreturn {\n\tIRQ_NONE = 0,\n\tIRQ_HANDLED = 1,\n\tIRQ_WAKE_THREAD = 2,\n};\n\ntypedef enum irqreturn irqreturn_t;\n\nenum iter_type {\n\tITER_UBUF = 0,\n\tITER_IOVEC = 1,\n\tITER_BVEC = 2,\n\tITER_KVEC = 3,\n\tITER_XARRAY = 4,\n\tITER_DISCARD = 5,\n};\n\nenum jbd2_shrink_type {\n\tJBD2_SHRINK_DESTROY = 0,\n\tJBD2_SHRINK_BUSY_STOP = 1,\n\tJBD2_SHRINK_BUSY_SKIP = 2,\n};\n\nenum jbd_state_bits {\n\tBH_JBD = 16,\n\tBH_JWrite = 17,\n\tBH_Freed = 18,\n\tBH_Revoked = 19,\n\tBH_RevokeValid = 20,\n\tBH_JBDDirty = 21,\n\tBH_JournalHead = 22,\n\tBH_Shadow = 23,\n\tBH_Verified = 24,\n\tBH_JBDPrivateStart = 25,\n};\n\nenum jump_label_type {\n\tJUMP_LABEL_NOP = 0,\n\tJUMP_LABEL_JMP = 1,\n};\n\nenum kcmp_type {\n\tKCMP_FILE = 0,\n\tKCMP_VM = 1,\n\tKCMP_FILES = 2,\n\tKCMP_FS = 3,\n\tKCMP_SIGHAND = 4,\n\tKCMP_IO = 5,\n\tKCMP_SYSVSEM = 6,\n\tKCMP_EPOLL_TFD = 7,\n\tKCMP_TYPES = 8,\n};\n\nenum kcore_type {\n\tKCORE_TEXT = 0,\n\tKCORE_VMALLOC = 1,\n\tKCORE_RAM = 2,\n\tKCORE_VMEMMAP = 3,\n\tKCORE_USER = 4,\n};\n\nenum kdb_msgsrc {\n\tKDB_MSGSRC_INTERNAL = 0,\n\tKDB_MSGSRC_PRINTK = 1,\n};\n\nenum kernel_gp_hint {\n\tGP_NO_HINT = 0,\n\tGP_NON_CANONICAL = 1,\n\tGP_CANONICAL = 2,\n};\n\nenum kernel_load_data_id {\n\tLOADING_UNKNOWN = 0,\n\tLOADING_FIRMWARE = 1,\n\tLOADING_MODULE = 2,\n\tLOADING_KEXEC_IMAGE = 3,\n\tLOADING_KEXEC_INITRAMFS = 4,\n\tLOADING_POLICY = 5,\n\tLOADING_X509_CERTIFICATE = 6,\n\tLOADING_MAX_ID = 7,\n};\n\nenum kernel_pkey_operation {\n\tkernel_pkey_encrypt = 0,\n\tkernel_pkey_decrypt = 1,\n\tkernel_pkey_sign = 2,\n\tkernel_pkey_verify = 3,\n};\n\nenum kernel_read_file_id {\n\tREADING_UNKNOWN = 0,\n\tREADING_FIRMWARE = 1,\n\tREADING_MODULE = 2,\n\tREADING_KEXEC_IMAGE = 3,\n\tREADING_KEXEC_INITRAMFS = 4,\n\tREADING_POLICY = 5,\n\tREADING_X509_CERTIFICATE = 6,\n\tREADING_MAX_ID = 7,\n};\n\nenum kernfs_node_flag {\n\tKERNFS_ACTIVATED = 16,\n\tKERNFS_NS = 32,\n\tKERNFS_HAS_SEQ_SHOW = 64,\n\tKERNFS_HAS_MMAP = 128,\n\tKERNFS_LOCKDEP = 256,\n\tKERNFS_HIDDEN = 512,\n\tKERNFS_SUICIDAL = 1024,\n\tKERNFS_SUICIDED = 2048,\n\tKERNFS_EMPTY_DIR = 4096,\n\tKERNFS_HAS_RELEASE = 8192,\n\tKERNFS_REMOVING = 16384,\n};\n\nenum kernfs_node_type {\n\tKERNFS_DIR = 1,\n\tKERNFS_FILE = 2,\n\tKERNFS_LINK = 4,\n};\n\nenum kernfs_root_flag {\n\tKERNFS_ROOT_CREATE_DEACTIVATED = 1,\n\tKERNFS_ROOT_EXTRA_OPEN_PERM_CHECK = 2,\n\tKERNFS_ROOT_SUPPORT_EXPORTOP = 4,\n\tKERNFS_ROOT_SUPPORT_USER_XATTR = 8,\n};\n\nenum key_being_used_for {\n\tVERIFYING_MODULE_SIGNATURE = 0,\n\tVERIFYING_FIRMWARE_SIGNATURE = 1,\n\tVERIFYING_KEXEC_PE_SIGNATURE = 2,\n\tVERIFYING_KEY_SIGNATURE = 3,\n\tVERIFYING_KEY_SELF_SIGNATURE = 4,\n\tVERIFYING_UNSPECIFIED_SIGNATURE = 5,\n\tNR__KEY_BEING_USED_FOR = 6,\n};\n\nenum key_lookup_flag {\n\tKEY_LOOKUP_CREATE = 1,\n\tKEY_LOOKUP_PARTIAL = 2,\n\tKEY_LOOKUP_ALL = 3,\n};\n\nenum key_need_perm {\n\tKEY_NEED_UNSPECIFIED = 0,\n\tKEY_NEED_VIEW = 1,\n\tKEY_NEED_READ = 2,\n\tKEY_NEED_WRITE = 3,\n\tKEY_NEED_SEARCH = 4,\n\tKEY_NEED_LINK = 5,\n\tKEY_NEED_SETATTR = 6,\n\tKEY_NEED_UNLINK = 7,\n\tKEY_SYSADMIN_OVERRIDE = 8,\n\tKEY_AUTHTOKEN_OVERRIDE = 9,\n\tKEY_DEFER_PERM_CHECK = 10,\n};\n\nenum key_notification_subtype {\n\tNOTIFY_KEY_INSTANTIATED = 0,\n\tNOTIFY_KEY_UPDATED = 1,\n\tNOTIFY_KEY_LINKED = 2,\n\tNOTIFY_KEY_UNLINKED = 3,\n\tNOTIFY_KEY_CLEARED = 4,\n\tNOTIFY_KEY_REVOKED = 5,\n\tNOTIFY_KEY_INVALIDATED = 6,\n\tNOTIFY_KEY_SETATTR = 7,\n};\n\nenum key_state {\n\tKEY_IS_UNINSTANTIATED = 0,\n\tKEY_IS_POSITIVE = 1,\n};\n\nenum kfence_counter_id {\n\tKFENCE_COUNTER_ALLOCATED = 0,\n\tKFENCE_COUNTER_ALLOCS = 1,\n\tKFENCE_COUNTER_FREES = 2,\n\tKFENCE_COUNTER_ZOMBIES = 3,\n\tKFENCE_COUNTER_BUGS = 4,\n\tKFENCE_COUNTER_SKIP_INCOMPAT = 5,\n\tKFENCE_COUNTER_SKIP_CAPACITY = 6,\n\tKFENCE_COUNTER_SKIP_COVERED = 7,\n\tKFENCE_COUNTER_COUNT = 8,\n};\n\nenum kfence_error_type {\n\tKFENCE_ERROR_OOB = 0,\n\tKFENCE_ERROR_UAF = 1,\n\tKFENCE_ERROR_CORRUPTION = 2,\n\tKFENCE_ERROR_INVALID = 3,\n\tKFENCE_ERROR_INVALID_FREE = 4,\n};\n\nenum kfence_object_state {\n\tKFENCE_OBJECT_UNUSED = 0,\n\tKFENCE_OBJECT_ALLOCATED = 1,\n\tKFENCE_OBJECT_FREED = 2,\n};\n\nenum kfunc_ptr_arg_type {\n\tKF_ARG_PTR_TO_CTX = 0,\n\tKF_ARG_PTR_TO_ALLOC_BTF_ID = 1,\n\tKF_ARG_PTR_TO_REFCOUNTED_KPTR = 2,\n\tKF_ARG_PTR_TO_DYNPTR = 3,\n\tKF_ARG_PTR_TO_ITER = 4,\n\tKF_ARG_PTR_TO_LIST_HEAD = 5,\n\tKF_ARG_PTR_TO_LIST_NODE = 6,\n\tKF_ARG_PTR_TO_BTF_ID = 7,\n\tKF_ARG_PTR_TO_MEM = 8,\n\tKF_ARG_PTR_TO_MEM_SIZE = 9,\n\tKF_ARG_PTR_TO_CALLBACK = 10,\n\tKF_ARG_PTR_TO_RB_ROOT = 11,\n\tKF_ARG_PTR_TO_RB_NODE = 12,\n\tKF_ARG_PTR_TO_NULL = 13,\n\tKF_ARG_PTR_TO_CONST_STR = 14,\n\tKF_ARG_PTR_TO_MAP = 15,\n\tKF_ARG_PTR_TO_WORKQUEUE = 16,\n};\n\nenum kgdb_bpstate {\n\tBP_UNDEFINED = 0,\n\tBP_REMOVED = 1,\n\tBP_SET = 2,\n\tBP_ACTIVE = 3,\n};\n\nenum kgdb_bptype {\n\tBP_BREAKPOINT = 0,\n\tBP_HARDWARE_BREAKPOINT = 1,\n\tBP_WRITE_WATCHPOINT = 2,\n\tBP_READ_WATCHPOINT = 3,\n\tBP_ACCESS_WATCHPOINT = 4,\n\tBP_POKE_BREAKPOINT = 5,\n};\n\nenum kmalloc_cache_type {\n\tKMALLOC_NORMAL = 0,\n\tKMALLOC_RANDOM_START = 0,\n\tKMALLOC_RANDOM_END = 15,\n\tKMALLOC_RECLAIM = 16,\n\tKMALLOC_DMA = 17,\n\tKMALLOC_CGROUP = 18,\n\tNR_KMALLOC_TYPES = 19,\n};\n\nenum kmsg_dump_reason {\n\tKMSG_DUMP_UNDEF = 0,\n\tKMSG_DUMP_PANIC = 1,\n\tKMSG_DUMP_OOPS = 2,\n\tKMSG_DUMP_EMERG = 3,\n\tKMSG_DUMP_SHUTDOWN = 4,\n\tKMSG_DUMP_MAX = 5,\n};\n\nenum kobj_ns_type {\n\tKOBJ_NS_TYPE_NONE = 0,\n\tKOBJ_NS_TYPE_NET = 1,\n\tKOBJ_NS_TYPES = 2,\n};\n\nenum kobject_action {\n\tKOBJ_ADD = 0,\n\tKOBJ_REMOVE = 1,\n\tKOBJ_CHANGE = 2,\n\tKOBJ_MOVE = 3,\n\tKOBJ_ONLINE = 4,\n\tKOBJ_OFFLINE = 5,\n\tKOBJ_BIND = 6,\n\tKOBJ_UNBIND = 7,\n};\n\nenum kprobe_slot_state {\n\tSLOT_CLEAN = 0,\n\tSLOT_DIRTY = 1,\n\tSLOT_USED = 2,\n};\n\nenum ksm_advisor_type {\n\tKSM_ADVISOR_NONE = 0,\n\tKSM_ADVISOR_SCAN_TIME = 1,\n};\n\nenum ksm_get_folio_flags {\n\tKSM_GET_FOLIO_NOLOCK = 0,\n\tKSM_GET_FOLIO_LOCK = 1,\n\tKSM_GET_FOLIO_TRYLOCK = 2,\n};\n\nenum kvm_apic_logical_mode {\n\tKVM_APIC_MODE_SW_DISABLED = 0,\n\tKVM_APIC_MODE_XAPIC_CLUSTER = 1,\n\tKVM_APIC_MODE_XAPIC_FLAT = 2,\n\tKVM_APIC_MODE_X2APIC = 3,\n\tKVM_APIC_MODE_MAP_DISABLED = 4,\n};\n\nenum kvm_bus {\n\tKVM_MMIO_BUS = 0,\n\tKVM_PIO_BUS = 1,\n\tKVM_VIRTIO_CCW_NOTIFY_BUS = 2,\n\tKVM_FAST_MMIO_BUS = 3,\n\tKVM_NR_BUSES = 4,\n};\n\nenum kvm_irqchip_mode {\n\tKVM_IRQCHIP_NONE = 0,\n\tKVM_IRQCHIP_KERNEL = 1,\n\tKVM_IRQCHIP_SPLIT = 2,\n};\n\nenum kvm_reg {\n\tVCPU_REGS_RAX = 0,\n\tVCPU_REGS_RCX = 1,\n\tVCPU_REGS_RDX = 2,\n\tVCPU_REGS_RBX = 3,\n\tVCPU_REGS_RSP = 4,\n\tVCPU_REGS_RBP = 5,\n\tVCPU_REGS_RSI = 6,\n\tVCPU_REGS_RDI = 7,\n\tVCPU_REGS_R8 = 8,\n\tVCPU_REGS_R9 = 9,\n\tVCPU_REGS_R10 = 10,\n\tVCPU_REGS_R11 = 11,\n\tVCPU_REGS_R12 = 12,\n\tVCPU_REGS_R13 = 13,\n\tVCPU_REGS_R14 = 14,\n\tVCPU_REGS_R15 = 15,\n\tVCPU_REGS_RIP = 16,\n\tNR_VCPU_REGS = 17,\n\tVCPU_EXREG_PDPTR = 17,\n\tVCPU_EXREG_CR0 = 18,\n\tVCPU_EXREG_CR3 = 19,\n\tVCPU_EXREG_CR4 = 20,\n\tVCPU_EXREG_RFLAGS = 21,\n\tVCPU_EXREG_SEGMENTS = 22,\n\tVCPU_EXREG_EXIT_INFO_1 = 23,\n\tVCPU_EXREG_EXIT_INFO_2 = 24,\n};\n\nenum kvm_stat_kind {\n\tKVM_STAT_VM = 0,\n\tKVM_STAT_VCPU = 1,\n};\n\nenum l1d_flush_mitigations {\n\tL1D_FLUSH_OFF = 0,\n\tL1D_FLUSH_ON = 1,\n};\n\nenum l1tf_mitigations {\n\tL1TF_MITIGATION_OFF = 0,\n\tL1TF_MITIGATION_FLUSH_NOWARN = 1,\n\tL1TF_MITIGATION_FLUSH = 2,\n\tL1TF_MITIGATION_FLUSH_NOSMT = 3,\n\tL1TF_MITIGATION_FULL = 4,\n\tL1TF_MITIGATION_FULL_FORCE = 5,\n};\n\nenum l2tp_debug_flags {\n\tL2TP_MSG_DEBUG = 1,\n\tL2TP_MSG_CONTROL = 2,\n\tL2TP_MSG_SEQ = 4,\n\tL2TP_MSG_DATA = 8,\n};\n\nenum l3mdev_type {\n\tL3MDEV_TYPE_UNSPEC = 0,\n\tL3MDEV_TYPE_VRF = 1,\n\t__L3MDEV_TYPE_MAX = 2,\n};\n\nenum label_flags {\n\tFLAG_HAT = 1,\n\tFLAG_UNCONFINED = 2,\n\tFLAG_NULL = 4,\n\tFLAG_IX_ON_NAME_ERROR = 8,\n\tFLAG_IMMUTIBLE = 16,\n\tFLAG_USER_DEFINED = 32,\n\tFLAG_NO_LIST_REF = 64,\n\tFLAG_NS_COUNT = 128,\n\tFLAG_IN_TREE = 256,\n\tFLAG_PROFILE = 512,\n\tFLAG_EXPLICIT = 1024,\n\tFLAG_STALE = 2048,\n\tFLAG_INTERRUPTIBLE = 4096,\n\tFLAG_REVOKED = 8192,\n\tFLAG_DEBUG1 = 16384,\n\tFLAG_DEBUG2 = 32768,\n};\n\nenum label_initialized {\n\tLABEL_INVALID = 0,\n\tLABEL_INITIALIZED = 1,\n\tLABEL_PENDING = 2,\n};\n\nenum landlock_key_type {\n\tLANDLOCK_KEY_INODE = 1,\n\tLANDLOCK_KEY_NET_PORT = 2,\n};\n\nenum landlock_rule_type {\n\tLANDLOCK_RULE_PATH_BENEATH = 1,\n\tLANDLOCK_RULE_NET_PORT = 2,\n};\n\nenum latency_count {\n\tCOUNTS_10e2 = 0,\n\tCOUNTS_10e3 = 1,\n\tCOUNTS_10e4 = 2,\n\tCOUNTS_10e5 = 3,\n\tCOUNTS_10e6 = 4,\n\tCOUNTS_10e7 = 5,\n\tCOUNTS_10e8_plus = 6,\n\tCOUNTS_MIN = 7,\n\tCOUNTS_MAX = 8,\n\tCOUNTS_SUM = 9,\n\tCOUNTS_NUM = 10,\n};\n\nenum latency_type {\n\tDMAR_LATENCY_INV_IOTLB = 0,\n\tDMAR_LATENCY_INV_DEVTLB = 1,\n\tDMAR_LATENCY_INV_IEC = 2,\n\tDMAR_LATENCY_NUM = 3,\n};\n\nenum ldma_chan_on_off {\n\tDMA_CH_OFF = 0,\n\tDMA_CH_ON = 1,\n};\n\nenum led_brightness {\n\tLED_OFF = 0,\n\tLED_ON = 1,\n\tLED_HALF = 127,\n\tLED_FULL = 255,\n};\n\nenum led_default_state {\n\tLEDS_DEFSTATE_OFF = 0,\n\tLEDS_DEFSTATE_ON = 1,\n\tLEDS_DEFSTATE_KEEP = 2,\n};\n\nenum legacy_fs_param {\n\tLEGACY_FS_UNSET_PARAMS = 0,\n\tLEGACY_FS_MONOLITHIC_PARAMS = 1,\n\tLEGACY_FS_INDIVIDUAL_PARAMS = 2,\n};\n\nenum linux_mptcp_mib_field {\n\tMPTCP_MIB_NUM = 0,\n\tMPTCP_MIB_MPCAPABLEPASSIVE = 1,\n\tMPTCP_MIB_MPCAPABLEACTIVE = 2,\n\tMPTCP_MIB_MPCAPABLEACTIVEACK = 3,\n\tMPTCP_MIB_MPCAPABLEPASSIVEACK = 4,\n\tMPTCP_MIB_MPCAPABLEPASSIVEFALLBACK = 5,\n\tMPTCP_MIB_MPCAPABLEACTIVEFALLBACK = 6,\n\tMPTCP_MIB_MPCAPABLEENDPATTEMPT = 7,\n\tMPTCP_MIB_TOKENFALLBACKINIT = 8,\n\tMPTCP_MIB_RETRANSSEGS = 9,\n\tMPTCP_MIB_JOINNOTOKEN = 10,\n\tMPTCP_MIB_JOINSYNRX = 11,\n\tMPTCP_MIB_JOINSYNBACKUPRX = 12,\n\tMPTCP_MIB_JOINSYNACKRX = 13,\n\tMPTCP_MIB_JOINSYNACKBACKUPRX = 14,\n\tMPTCP_MIB_JOINSYNACKMAC = 15,\n\tMPTCP_MIB_JOINACKRX = 16,\n\tMPTCP_MIB_JOINACKMAC = 17,\n\tMPTCP_MIB_DSSNOMATCH = 18,\n\tMPTCP_MIB_DSSCORRUPTIONFALLBACK = 19,\n\tMPTCP_MIB_DSSCORRUPTIONRESET = 20,\n\tMPTCP_MIB_INFINITEMAPTX = 21,\n\tMPTCP_MIB_INFINITEMAPRX = 22,\n\tMPTCP_MIB_DSSTCPMISMATCH = 23,\n\tMPTCP_MIB_DATACSUMERR = 24,\n\tMPTCP_MIB_OFOQUEUETAIL = 25,\n\tMPTCP_MIB_OFOQUEUE = 26,\n\tMPTCP_MIB_OFOMERGE = 27,\n\tMPTCP_MIB_NODSSWINDOW = 28,\n\tMPTCP_MIB_DUPDATA = 29,\n\tMPTCP_MIB_ADDADDR = 30,\n\tMPTCP_MIB_ADDADDRTX = 31,\n\tMPTCP_MIB_ADDADDRTXDROP = 32,\n\tMPTCP_MIB_ECHOADD = 33,\n\tMPTCP_MIB_ECHOADDTX = 34,\n\tMPTCP_MIB_ECHOADDTXDROP = 35,\n\tMPTCP_MIB_PORTADD = 36,\n\tMPTCP_MIB_ADDADDRDROP = 37,\n\tMPTCP_MIB_JOINPORTSYNRX = 38,\n\tMPTCP_MIB_JOINPORTSYNACKRX = 39,\n\tMPTCP_MIB_JOINPORTACKRX = 40,\n\tMPTCP_MIB_MISMATCHPORTSYNRX = 41,\n\tMPTCP_MIB_MISMATCHPORTACKRX = 42,\n\tMPTCP_MIB_RMADDR = 43,\n\tMPTCP_MIB_RMADDRDROP = 44,\n\tMPTCP_MIB_RMADDRTX = 45,\n\tMPTCP_MIB_RMADDRTXDROP = 46,\n\tMPTCP_MIB_RMSUBFLOW = 47,\n\tMPTCP_MIB_MPPRIOTX = 48,\n\tMPTCP_MIB_MPPRIORX = 49,\n\tMPTCP_MIB_MPFAILTX = 50,\n\tMPTCP_MIB_MPFAILRX = 51,\n\tMPTCP_MIB_MPFASTCLOSETX = 52,\n\tMPTCP_MIB_MPFASTCLOSERX = 53,\n\tMPTCP_MIB_MPRSTTX = 54,\n\tMPTCP_MIB_MPRSTRX = 55,\n\tMPTCP_MIB_RCVPRUNED = 56,\n\tMPTCP_MIB_SUBFLOWSTALE = 57,\n\tMPTCP_MIB_SUBFLOWRECOVER = 58,\n\tMPTCP_MIB_SNDWNDSHARED = 59,\n\tMPTCP_MIB_RCVWNDSHARED = 60,\n\tMPTCP_MIB_RCVWNDCONFLICTUPDATE = 61,\n\tMPTCP_MIB_RCVWNDCONFLICT = 62,\n\tMPTCP_MIB_CURRESTAB = 63,\n\t__MPTCP_MIB_MAX = 64,\n};\n\nenum locality_types {\n\tWRITE_LATENCY = 0,\n\tREAD_LATENCY = 1,\n\tWRITE_BANDWIDTH = 2,\n\tREAD_BANDWIDTH = 3,\n};\n\nenum lockdep_ok {\n\tLOCKDEP_STILL_OK = 0,\n\tLOCKDEP_NOW_UNRELIABLE = 1,\n};\n\nenum lockdown_reason {\n\tLOCKDOWN_NONE = 0,\n\tLOCKDOWN_MODULE_SIGNATURE = 1,\n\tLOCKDOWN_DEV_MEM = 2,\n\tLOCKDOWN_EFI_TEST = 3,\n\tLOCKDOWN_KEXEC = 4,\n\tLOCKDOWN_HIBERNATION = 5,\n\tLOCKDOWN_PCI_ACCESS = 6,\n\tLOCKDOWN_IOPORT = 7,\n\tLOCKDOWN_MSR = 8,\n\tLOCKDOWN_ACPI_TABLES = 9,\n\tLOCKDOWN_DEVICE_TREE = 10,\n\tLOCKDOWN_PCMCIA_CIS = 11,\n\tLOCKDOWN_TIOCSSERIAL = 12,\n\tLOCKDOWN_MODULE_PARAMETERS = 13,\n\tLOCKDOWN_MMIOTRACE = 14,\n\tLOCKDOWN_DEBUGFS = 15,\n\tLOCKDOWN_XMON_WR = 16,\n\tLOCKDOWN_BPF_WRITE_USER = 17,\n\tLOCKDOWN_DBG_WRITE_KERNEL = 18,\n\tLOCKDOWN_RTAS_ERROR_INJECTION = 19,\n\tLOCKDOWN_INTEGRITY_MAX = 20,\n\tLOCKDOWN_KCORE = 21,\n\tLOCKDOWN_KPROBES = 22,\n\tLOCKDOWN_BPF_READ_KERNEL = 23,\n\tLOCKDOWN_DBG_READ_KERNEL = 24,\n\tLOCKDOWN_PERF = 25,\n\tLOCKDOWN_TRACEFS = 26,\n\tLOCKDOWN_XMON_RW = 27,\n\tLOCKDOWN_XFRM_SECRET = 28,\n\tLOCKDOWN_CONFIDENTIALITY_MAX = 29,\n};\n\nenum lp8788_alarm_sel {\n\tLP8788_ALARM_1 = 0,\n\tLP8788_ALARM_2 = 1,\n\tLP8788_ALARM_MAX = 2,\n};\n\nenum lp8788_charger_event {\n\tNO_CHARGER = 0,\n\tCHARGER_DETECTED = 1,\n};\n\nenum lp8788_dvs_sel {\n\tDVS_SEL_V0 = 0,\n\tDVS_SEL_V1 = 1,\n\tDVS_SEL_V2 = 2,\n\tDVS_SEL_V3 = 3,\n};\n\nenum lp8788_int_id {\n\tLP8788_INT_TSDL = 0,\n\tLP8788_INT_TSDH = 1,\n\tLP8788_INT_UVLO = 2,\n\tLP8788_INT_FLAGMON = 3,\n\tLP8788_INT_PWRON_TIME = 4,\n\tLP8788_INT_PWRON = 5,\n\tLP8788_INT_COMP1 = 6,\n\tLP8788_INT_COMP2 = 7,\n\tLP8788_INT_CHG_INPUT_STATE = 8,\n\tLP8788_INT_CHG_STATE = 9,\n\tLP8788_INT_EOC = 10,\n\tLP8788_INT_CHG_RESTART = 11,\n\tLP8788_INT_RESTART_TIMEOUT = 12,\n\tLP8788_INT_FULLCHG_TIMEOUT = 13,\n\tLP8788_INT_PRECHG_TIMEOUT = 14,\n\tLP8788_INT_RTC_ALARM1 = 17,\n\tLP8788_INT_RTC_ALARM2 = 18,\n\tLP8788_INT_ENTER_SYS_SUPPORT = 19,\n\tLP8788_INT_EXIT_SYS_SUPPORT = 20,\n\tLP8788_INT_BATT_LOW = 21,\n\tLP8788_INT_NO_BATT = 22,\n\tLP8788_INT_MAX = 24,\n};\n\nenum lp8788_isink_number {\n\tLP8788_ISINK_1 = 0,\n\tLP8788_ISINK_2 = 1,\n\tLP8788_ISINK_3 = 2,\n};\n\nenum lp8788_isink_scale {\n\tLP8788_ISINK_SCALE_100mA = 0,\n\tLP8788_ISINK_SCALE_120mA = 1,\n};\n\nenum lru_list {\n\tLRU_INACTIVE_ANON = 0,\n\tLRU_ACTIVE_ANON = 1,\n\tLRU_INACTIVE_FILE = 2,\n\tLRU_ACTIVE_FILE = 3,\n\tLRU_UNEVICTABLE = 4,\n\tNR_LRU_LISTS = 5,\n};\n\nenum lru_status {\n\tLRU_REMOVED = 0,\n\tLRU_REMOVED_RETRY = 1,\n\tLRU_ROTATE = 2,\n\tLRU_SKIP = 3,\n\tLRU_RETRY = 4,\n\tLRU_STOP = 5,\n};\n\nenum lruvec_flags {\n\tLRUVEC_CGROUP_CONGESTED = 0,\n\tLRUVEC_NODE_CONGESTED = 1,\n};\n\nenum lsm_event {\n\tLSM_POLICY_CHANGE = 0,\n};\n\nenum lsm_order {\n\tLSM_ORDER_FIRST = -1,\n\tLSM_ORDER_MUTABLE = 0,\n\tLSM_ORDER_LAST = 1,\n};\n\nenum lsm_rule_types {\n\tLSM_OBJ_USER = 0,\n\tLSM_OBJ_ROLE = 1,\n\tLSM_OBJ_TYPE = 2,\n\tLSM_SUBJ_USER = 3,\n\tLSM_SUBJ_ROLE = 4,\n\tLSM_SUBJ_TYPE = 5,\n};\n\nenum lw_bits {\n\tLW_URGENT = 0,\n};\n\nenum lwtunnel_encap_types {\n\tLWTUNNEL_ENCAP_NONE = 0,\n\tLWTUNNEL_ENCAP_MPLS = 1,\n\tLWTUNNEL_ENCAP_IP = 2,\n\tLWTUNNEL_ENCAP_ILA = 3,\n\tLWTUNNEL_ENCAP_IP6 = 4,\n\tLWTUNNEL_ENCAP_SEG6 = 5,\n\tLWTUNNEL_ENCAP_BPF = 6,\n\tLWTUNNEL_ENCAP_SEG6_LOCAL = 7,\n\tLWTUNNEL_ENCAP_RPL = 8,\n\tLWTUNNEL_ENCAP_IOAM6 = 9,\n\tLWTUNNEL_ENCAP_XFRM = 10,\n\t__LWTUNNEL_ENCAP_MAX = 11,\n};\n\nenum lwtunnel_ip6_t {\n\tLWTUNNEL_IP6_UNSPEC = 0,\n\tLWTUNNEL_IP6_ID = 1,\n\tLWTUNNEL_IP6_DST = 2,\n\tLWTUNNEL_IP6_SRC = 3,\n\tLWTUNNEL_IP6_HOPLIMIT = 4,\n\tLWTUNNEL_IP6_TC = 5,\n\tLWTUNNEL_IP6_FLAGS = 6,\n\tLWTUNNEL_IP6_PAD = 7,\n\tLWTUNNEL_IP6_OPTS = 8,\n\t__LWTUNNEL_IP6_MAX = 9,\n};\n\nenum lwtunnel_ip_t {\n\tLWTUNNEL_IP_UNSPEC = 0,\n\tLWTUNNEL_IP_ID = 1,\n\tLWTUNNEL_IP_DST = 2,\n\tLWTUNNEL_IP_SRC = 3,\n\tLWTUNNEL_IP_TTL = 4,\n\tLWTUNNEL_IP_TOS = 5,\n\tLWTUNNEL_IP_FLAGS = 6,\n\tLWTUNNEL_IP_PAD = 7,\n\tLWTUNNEL_IP_OPTS = 8,\n\t__LWTUNNEL_IP_MAX = 9,\n};\n\nenum lzma2_seq {\n\tSEQ_CONTROL = 0,\n\tSEQ_UNCOMPRESSED_1 = 1,\n\tSEQ_UNCOMPRESSED_2 = 2,\n\tSEQ_COMPRESSED_0 = 3,\n\tSEQ_COMPRESSED_1 = 4,\n\tSEQ_PROPERTIES = 5,\n\tSEQ_LZMA_PREPARE = 6,\n\tSEQ_LZMA_RUN = 7,\n\tSEQ_COPY = 8,\n};\n\nenum lzma_state {\n\tSTATE_LIT_LIT = 0,\n\tSTATE_MATCH_LIT_LIT = 1,\n\tSTATE_REP_LIT_LIT = 2,\n\tSTATE_SHORTREP_LIT_LIT = 3,\n\tSTATE_MATCH_LIT = 4,\n\tSTATE_REP_LIT = 5,\n\tSTATE_SHORTREP_LIT = 6,\n\tSTATE_LIT_MATCH = 7,\n\tSTATE_LIT_LONGREP = 8,\n\tSTATE_LIT_SHORTREP = 9,\n\tSTATE_NONLIT_MATCH = 10,\n\tSTATE_NONLIT_REP = 11,\n};\n\nenum macsec_offload {\n\tMACSEC_OFFLOAD_OFF = 0,\n\tMACSEC_OFFLOAD_PHY = 1,\n\tMACSEC_OFFLOAD_MAC = 2,\n\t__MACSEC_OFFLOAD_END = 3,\n\tMACSEC_OFFLOAD_MAX = 2,\n};\n\nenum macsec_validation_type {\n\tMACSEC_VALIDATE_DISABLED = 0,\n\tMACSEC_VALIDATE_CHECK = 1,\n\tMACSEC_VALIDATE_STRICT = 2,\n\t__MACSEC_VALIDATE_END = 3,\n\tMACSEC_VALIDATE_MAX = 2,\n};\n\nenum map_type {\n\tmap_wb = 0,\n\tmap_uc = 1,\n};\n\nenum maple_status {\n\tma_active = 0,\n\tma_start = 1,\n\tma_root = 2,\n\tma_none = 3,\n\tma_pause = 4,\n\tma_overflow = 5,\n\tma_underflow = 6,\n\tma_error = 7,\n};\n\nenum maple_type {\n\tmaple_dense = 0,\n\tmaple_leaf_64 = 1,\n\tmaple_range_64 = 2,\n\tmaple_arange_64 = 3,\n};\n\nenum mapping_flags {\n\tAS_EIO = 0,\n\tAS_ENOSPC = 1,\n\tAS_MM_ALL_LOCKS = 2,\n\tAS_UNEVICTABLE = 3,\n\tAS_EXITING = 4,\n\tAS_NO_WRITEBACK_TAGS = 5,\n\tAS_LARGE_FOLIO_SUPPORT = 6,\n\tAS_RELEASE_ALWAYS = 7,\n\tAS_STABLE_WRITES = 8,\n\tAS_INACCESSIBLE = 9,\n};\n\nenum mapping_status {\n\tMAPPING_OK = 0,\n\tMAPPING_INVALID = 1,\n\tMAPPING_EMPTY = 2,\n\tMAPPING_DATA_FIN = 3,\n\tMAPPING_DUMMY = 4,\n\tMAPPING_BAD_CSUM = 5,\n};\n\nenum max14577_reg {\n\tMAX14577_REG_DEVICEID = 0,\n\tMAX14577_REG_INT1 = 1,\n\tMAX14577_REG_INT2 = 2,\n\tMAX14577_REG_INT3 = 3,\n\tMAX14577_REG_STATUS1 = 4,\n\tMAX14577_REG_STATUS2 = 5,\n\tMAX14577_REG_STATUS3 = 6,\n\tMAX14577_REG_INTMASK1 = 7,\n\tMAX14577_REG_INTMASK2 = 8,\n\tMAX14577_REG_INTMASK3 = 9,\n\tMAX14577_REG_CDETCTRL1 = 10,\n\tMAX14577_REG_RFU = 11,\n\tMAX14577_REG_CONTROL1 = 12,\n\tMAX14577_REG_CONTROL2 = 13,\n\tMAX14577_REG_CONTROL3 = 14,\n\tMAX14577_REG_CHGCTRL1 = 15,\n\tMAX14577_REG_CHGCTRL2 = 16,\n\tMAX14577_REG_CHGCTRL3 = 17,\n\tMAX14577_REG_CHGCTRL4 = 18,\n\tMAX14577_REG_CHGCTRL5 = 19,\n\tMAX14577_REG_CHGCTRL6 = 20,\n\tMAX14577_REG_CHGCTRL7 = 21,\n\tMAX14577_REG_END = 22,\n};\n\nenum max77693_haptic_reg {\n\tMAX77693_HAPTIC_REG_STATUS = 0,\n\tMAX77693_HAPTIC_REG_CONFIG1 = 1,\n\tMAX77693_HAPTIC_REG_CONFIG2 = 2,\n\tMAX77693_HAPTIC_REG_CONFIG_CHNL = 3,\n\tMAX77693_HAPTIC_REG_CONFG_CYC1 = 4,\n\tMAX77693_HAPTIC_REG_CONFG_CYC2 = 5,\n\tMAX77693_HAPTIC_REG_CONFIG_PER1 = 6,\n\tMAX77693_HAPTIC_REG_CONFIG_PER2 = 7,\n\tMAX77693_HAPTIC_REG_CONFIG_PER3 = 8,\n\tMAX77693_HAPTIC_REG_CONFIG_PER4 = 9,\n\tMAX77693_HAPTIC_REG_CONFIG_DUTY1 = 10,\n\tMAX77693_HAPTIC_REG_CONFIG_DUTY2 = 11,\n\tMAX77693_HAPTIC_REG_CONFIG_PWM1 = 12,\n\tMAX77693_HAPTIC_REG_CONFIG_PWM2 = 13,\n\tMAX77693_HAPTIC_REG_CONFIG_PWM3 = 14,\n\tMAX77693_HAPTIC_REG_CONFIG_PWM4 = 15,\n\tMAX77693_HAPTIC_REG_REV = 16,\n\tMAX77693_HAPTIC_REG_END = 17,\n};\n\nenum max77693_muic_reg {\n\tMAX77693_MUIC_REG_ID = 0,\n\tMAX77693_MUIC_REG_INT1 = 1,\n\tMAX77693_MUIC_REG_INT2 = 2,\n\tMAX77693_MUIC_REG_INT3 = 3,\n\tMAX77693_MUIC_REG_STATUS1 = 4,\n\tMAX77693_MUIC_REG_STATUS2 = 5,\n\tMAX77693_MUIC_REG_STATUS3 = 6,\n\tMAX77693_MUIC_REG_INTMASK1 = 7,\n\tMAX77693_MUIC_REG_INTMASK2 = 8,\n\tMAX77693_MUIC_REG_INTMASK3 = 9,\n\tMAX77693_MUIC_REG_CDETCTRL1 = 10,\n\tMAX77693_MUIC_REG_CDETCTRL2 = 11,\n\tMAX77693_MUIC_REG_CTRL1 = 12,\n\tMAX77693_MUIC_REG_CTRL2 = 13,\n\tMAX77693_MUIC_REG_CTRL3 = 14,\n\tMAX77693_MUIC_REG_END = 15,\n};\n\nenum max77693_pmic_reg {\n\tMAX77693_LED_REG_IFLASH1 = 0,\n\tMAX77693_LED_REG_IFLASH2 = 1,\n\tMAX77693_LED_REG_ITORCH = 2,\n\tMAX77693_LED_REG_ITORCHTIMER = 3,\n\tMAX77693_LED_REG_FLASH_TIMER = 4,\n\tMAX77693_LED_REG_FLASH_EN = 5,\n\tMAX77693_LED_REG_MAX_FLASH1 = 6,\n\tMAX77693_LED_REG_MAX_FLASH2 = 7,\n\tMAX77693_LED_REG_MAX_FLASH3 = 8,\n\tMAX77693_LED_REG_MAX_FLASH4 = 9,\n\tMAX77693_LED_REG_VOUT_CNTL = 10,\n\tMAX77693_LED_REG_VOUT_FLASH1 = 11,\n\tMAX77693_LED_REG_VOUT_FLASH2 = 12,\n\tMAX77693_LED_REG_FLASH_INT = 14,\n\tMAX77693_LED_REG_FLASH_INT_MASK = 15,\n\tMAX77693_LED_REG_FLASH_STATUS = 16,\n\tMAX77693_PMIC_REG_PMIC_ID1 = 32,\n\tMAX77693_PMIC_REG_PMIC_ID2 = 33,\n\tMAX77693_PMIC_REG_INTSRC = 34,\n\tMAX77693_PMIC_REG_INTSRC_MASK = 35,\n\tMAX77693_PMIC_REG_TOPSYS_INT = 36,\n\tMAX77693_PMIC_REG_TOPSYS_INT_MASK = 38,\n\tMAX77693_PMIC_REG_TOPSYS_STAT = 40,\n\tMAX77693_PMIC_REG_MAINCTRL1 = 42,\n\tMAX77693_PMIC_REG_LSCNFG = 43,\n\tMAX77693_CHG_REG_CHG_INT = 176,\n\tMAX77693_CHG_REG_CHG_INT_MASK = 177,\n\tMAX77693_CHG_REG_CHG_INT_OK = 178,\n\tMAX77693_CHG_REG_CHG_DETAILS_00 = 179,\n\tMAX77693_CHG_REG_CHG_DETAILS_01 = 180,\n\tMAX77693_CHG_REG_CHG_DETAILS_02 = 181,\n\tMAX77693_CHG_REG_CHG_DETAILS_03 = 182,\n\tMAX77693_CHG_REG_CHG_CNFG_00 = 183,\n\tMAX77693_CHG_REG_CHG_CNFG_01 = 184,\n\tMAX77693_CHG_REG_CHG_CNFG_02 = 185,\n\tMAX77693_CHG_REG_CHG_CNFG_03 = 186,\n\tMAX77693_CHG_REG_CHG_CNFG_04 = 187,\n\tMAX77693_CHG_REG_CHG_CNFG_05 = 188,\n\tMAX77693_CHG_REG_CHG_CNFG_06 = 189,\n\tMAX77693_CHG_REG_CHG_CNFG_07 = 190,\n\tMAX77693_CHG_REG_CHG_CNFG_08 = 191,\n\tMAX77693_CHG_REG_CHG_CNFG_09 = 192,\n\tMAX77693_CHG_REG_CHG_CNFG_10 = 193,\n\tMAX77693_CHG_REG_CHG_CNFG_11 = 194,\n\tMAX77693_CHG_REG_CHG_CNFG_12 = 195,\n\tMAX77693_CHG_REG_CHG_CNFG_13 = 196,\n\tMAX77693_CHG_REG_CHG_CNFG_14 = 197,\n\tMAX77693_CHG_REG_SAFEOUT_CTRL = 198,\n\tMAX77693_PMIC_REG_END = 199,\n};\n\nenum max77693_types {\n\tTYPE_MAX77693_UNKNOWN = 0,\n\tTYPE_MAX77693 = 1,\n\tTYPE_MAX77843 = 2,\n\tTYPE_MAX77693_NUM = 3,\n};\n\nenum max77836_fg_reg {\n\tMAX77836_FG_REG_VCELL_MSB = 2,\n\tMAX77836_FG_REG_VCELL_LSB = 3,\n\tMAX77836_FG_REG_SOC_MSB = 4,\n\tMAX77836_FG_REG_SOC_LSB = 5,\n\tMAX77836_FG_REG_MODE_H = 6,\n\tMAX77836_FG_REG_MODE_L = 7,\n\tMAX77836_FG_REG_VERSION_MSB = 8,\n\tMAX77836_FG_REG_VERSION_LSB = 9,\n\tMAX77836_FG_REG_HIBRT_H = 10,\n\tMAX77836_FG_REG_HIBRT_L = 11,\n\tMAX77836_FG_REG_CONFIG_H = 12,\n\tMAX77836_FG_REG_CONFIG_L = 13,\n\tMAX77836_FG_REG_VALRT_MIN = 20,\n\tMAX77836_FG_REG_VALRT_MAX = 21,\n\tMAX77836_FG_REG_CRATE_MSB = 22,\n\tMAX77836_FG_REG_CRATE_LSB = 23,\n\tMAX77836_FG_REG_VRESET = 24,\n\tMAX77836_FG_REG_FGID = 25,\n\tMAX77836_FG_REG_STATUS_H = 26,\n\tMAX77836_FG_REG_STATUS_L = 27,\n\tMAX77836_FG_REG_END = 28,\n};\n\nenum max77836_pmic_reg {\n\tMAX77836_PMIC_REG_PMIC_ID = 32,\n\tMAX77836_PMIC_REG_PMIC_REV = 33,\n\tMAX77836_PMIC_REG_INTSRC = 34,\n\tMAX77836_PMIC_REG_INTSRC_MASK = 35,\n\tMAX77836_PMIC_REG_TOPSYS_INT = 36,\n\tMAX77836_PMIC_REG_TOPSYS_INT_MASK = 38,\n\tMAX77836_PMIC_REG_TOPSYS_STAT = 40,\n\tMAX77836_PMIC_REG_MRSTB_CNTL = 42,\n\tMAX77836_PMIC_REG_LSCNFG = 43,\n\tMAX77836_LDO_REG_CNFG1_LDO1 = 81,\n\tMAX77836_LDO_REG_CNFG2_LDO1 = 82,\n\tMAX77836_LDO_REG_CNFG1_LDO2 = 83,\n\tMAX77836_LDO_REG_CNFG2_LDO2 = 84,\n\tMAX77836_LDO_REG_CNFG_LDO_BIAS = 85,\n\tMAX77836_COMP_REG_COMP1 = 96,\n\tMAX77836_PMIC_REG_END = 97,\n};\n\nenum max77843_charger_reg {\n\tMAX77843_CHG_REG_CHG_INT = 176,\n\tMAX77843_CHG_REG_CHG_INT_MASK = 177,\n\tMAX77843_CHG_REG_CHG_INT_OK = 178,\n\tMAX77843_CHG_REG_CHG_DTLS_00 = 179,\n\tMAX77843_CHG_REG_CHG_DTLS_01 = 180,\n\tMAX77843_CHG_REG_CHG_DTLS_02 = 181,\n\tMAX77843_CHG_REG_CHG_CNFG_00 = 183,\n\tMAX77843_CHG_REG_CHG_CNFG_01 = 184,\n\tMAX77843_CHG_REG_CHG_CNFG_02 = 185,\n\tMAX77843_CHG_REG_CHG_CNFG_03 = 186,\n\tMAX77843_CHG_REG_CHG_CNFG_04 = 187,\n\tMAX77843_CHG_REG_CHG_CNFG_06 = 189,\n\tMAX77843_CHG_REG_CHG_CNFG_07 = 190,\n\tMAX77843_CHG_REG_CHG_CNFG_09 = 192,\n\tMAX77843_CHG_REG_CHG_CNFG_10 = 193,\n\tMAX77843_CHG_REG_CHG_CNFG_11 = 194,\n\tMAX77843_CHG_REG_CHG_CNFG_12 = 195,\n\tMAX77843_CHG_REG_END = 196,\n};\n\nenum max77843_sys_reg {\n\tMAX77843_SYS_REG_PMICID = 0,\n\tMAX77843_SYS_REG_PMICREV = 1,\n\tMAX77843_SYS_REG_MAINCTRL1 = 2,\n\tMAX77843_SYS_REG_INTSRC = 34,\n\tMAX77843_SYS_REG_INTSRCMASK = 35,\n\tMAX77843_SYS_REG_SYSINTSRC = 36,\n\tMAX77843_SYS_REG_SYSINTMASK = 38,\n\tMAX77843_SYS_REG_TOPSYS_STAT = 40,\n\tMAX77843_SYS_REG_SAFEOUTCTRL = 198,\n\tMAX77843_SYS_REG_END = 199,\n};\n\nenum max8997_haptic_motor_type {\n\tMAX8997_HAPTIC_ERM = 0,\n\tMAX8997_HAPTIC_LRA = 1,\n};\n\nenum max8997_haptic_pulse_mode {\n\tMAX8997_EXTERNAL_MODE = 0,\n\tMAX8997_INTERNAL_MODE = 1,\n};\n\nenum max8997_haptic_pwm_divisor {\n\tMAX8997_PWM_DIVISOR_32 = 0,\n\tMAX8997_PWM_DIVISOR_64 = 1,\n\tMAX8997_PWM_DIVISOR_128 = 2,\n\tMAX8997_PWM_DIVISOR_256 = 3,\n};\n\nenum max8997_haptic_reg {\n\tMAX8997_HAPTIC_REG_GENERAL = 0,\n\tMAX8997_HAPTIC_REG_CONF1 = 1,\n\tMAX8997_HAPTIC_REG_CONF2 = 2,\n\tMAX8997_HAPTIC_REG_DRVCONF = 3,\n\tMAX8997_HAPTIC_REG_CYCLECONF1 = 4,\n\tMAX8997_HAPTIC_REG_CYCLECONF2 = 5,\n\tMAX8997_HAPTIC_REG_SIGCONF1 = 6,\n\tMAX8997_HAPTIC_REG_SIGCONF2 = 7,\n\tMAX8997_HAPTIC_REG_SIGCONF3 = 8,\n\tMAX8997_HAPTIC_REG_SIGCONF4 = 9,\n\tMAX8997_HAPTIC_REG_SIGDC1 = 10,\n\tMAX8997_HAPTIC_REG_SIGDC2 = 11,\n\tMAX8997_HAPTIC_REG_SIGPWMDC1 = 12,\n\tMAX8997_HAPTIC_REG_SIGPWMDC2 = 13,\n\tMAX8997_HAPTIC_REG_SIGPWMDC3 = 14,\n\tMAX8997_HAPTIC_REG_SIGPWMDC4 = 15,\n\tMAX8997_HAPTIC_REG_MTR_REV = 16,\n\tMAX8997_HAPTIC_REG_END = 17,\n};\n\nenum max8997_irq {\n\tMAX8997_PMICIRQ_PWRONR = 0,\n\tMAX8997_PMICIRQ_PWRONF = 1,\n\tMAX8997_PMICIRQ_PWRON1SEC = 2,\n\tMAX8997_PMICIRQ_JIGONR = 3,\n\tMAX8997_PMICIRQ_JIGONF = 4,\n\tMAX8997_PMICIRQ_LOWBAT2 = 5,\n\tMAX8997_PMICIRQ_LOWBAT1 = 6,\n\tMAX8997_PMICIRQ_JIGR = 7,\n\tMAX8997_PMICIRQ_JIGF = 8,\n\tMAX8997_PMICIRQ_MR = 9,\n\tMAX8997_PMICIRQ_DVS1OK = 10,\n\tMAX8997_PMICIRQ_DVS2OK = 11,\n\tMAX8997_PMICIRQ_DVS3OK = 12,\n\tMAX8997_PMICIRQ_DVS4OK = 13,\n\tMAX8997_PMICIRQ_CHGINS = 14,\n\tMAX8997_PMICIRQ_CHGRM = 15,\n\tMAX8997_PMICIRQ_DCINOVP = 16,\n\tMAX8997_PMICIRQ_TOPOFFR = 17,\n\tMAX8997_PMICIRQ_CHGRSTF = 18,\n\tMAX8997_PMICIRQ_MBCHGTMEXPD = 19,\n\tMAX8997_PMICIRQ_RTC60S = 20,\n\tMAX8997_PMICIRQ_RTCA1 = 21,\n\tMAX8997_PMICIRQ_RTCA2 = 22,\n\tMAX8997_PMICIRQ_SMPL_INT = 23,\n\tMAX8997_PMICIRQ_RTC1S = 24,\n\tMAX8997_PMICIRQ_WTSR = 25,\n\tMAX8997_MUICIRQ_ADCError = 26,\n\tMAX8997_MUICIRQ_ADCLow = 27,\n\tMAX8997_MUICIRQ_ADC = 28,\n\tMAX8997_MUICIRQ_VBVolt = 29,\n\tMAX8997_MUICIRQ_DBChg = 30,\n\tMAX8997_MUICIRQ_DCDTmr = 31,\n\tMAX8997_MUICIRQ_ChgDetRun = 32,\n\tMAX8997_MUICIRQ_ChgTyp = 33,\n\tMAX8997_MUICIRQ_OVP = 34,\n\tMAX8997_IRQ_NR = 35,\n};\n\nenum max8997_irq_source {\n\tPMIC_INT1 = 0,\n\tPMIC_INT2 = 1,\n\tPMIC_INT3 = 2,\n\tPMIC_INT4 = 3,\n\tFUEL_GAUGE = 4,\n\tMUIC_INT1 = 5,\n\tMUIC_INT2 = 6,\n\tMUIC_INT3 = 7,\n\tGPIO_LOW = 8,\n\tGPIO_HI = 9,\n\tFLASH_STATUS = 10,\n\tMAX8997_IRQ_GROUP_NR = 11,\n};\n\nenum max8997_led_mode {\n\tMAX8997_NONE = 0,\n\tMAX8997_FLASH_MODE = 1,\n\tMAX8997_MOVIE_MODE = 2,\n\tMAX8997_FLASH_PIN_CONTROL_MODE = 3,\n\tMAX8997_MOVIE_PIN_CONTROL_MODE = 4,\n};\n\nenum max8997_muic_reg {\n\tMAX8997_MUIC_REG_ID = 0,\n\tMAX8997_MUIC_REG_INT1 = 1,\n\tMAX8997_MUIC_REG_INT2 = 2,\n\tMAX8997_MUIC_REG_INT3 = 3,\n\tMAX8997_MUIC_REG_STATUS1 = 4,\n\tMAX8997_MUIC_REG_STATUS2 = 5,\n\tMAX8997_MUIC_REG_STATUS3 = 6,\n\tMAX8997_MUIC_REG_INTMASK1 = 7,\n\tMAX8997_MUIC_REG_INTMASK2 = 8,\n\tMAX8997_MUIC_REG_INTMASK3 = 9,\n\tMAX8997_MUIC_REG_CDETCTRL = 10,\n\tMAX8997_MUIC_REG_CONTROL1 = 12,\n\tMAX8997_MUIC_REG_CONTROL2 = 13,\n\tMAX8997_MUIC_REG_CONTROL3 = 14,\n\tMAX8997_MUIC_REG_END = 15,\n};\n\nenum max8997_pmic_reg {\n\tMAX8997_REG_PMIC_ID0 = 0,\n\tMAX8997_REG_PMIC_ID1 = 1,\n\tMAX8997_REG_INTSRC = 2,\n\tMAX8997_REG_INT1 = 3,\n\tMAX8997_REG_INT2 = 4,\n\tMAX8997_REG_INT3 = 5,\n\tMAX8997_REG_INT4 = 6,\n\tMAX8997_REG_INT1MSK = 8,\n\tMAX8997_REG_INT2MSK = 9,\n\tMAX8997_REG_INT3MSK = 10,\n\tMAX8997_REG_INT4MSK = 11,\n\tMAX8997_REG_STATUS1 = 13,\n\tMAX8997_REG_STATUS2 = 14,\n\tMAX8997_REG_STATUS3 = 15,\n\tMAX8997_REG_STATUS4 = 16,\n\tMAX8997_REG_MAINCON1 = 19,\n\tMAX8997_REG_MAINCON2 = 20,\n\tMAX8997_REG_BUCKRAMP = 21,\n\tMAX8997_REG_BUCK1CTRL = 24,\n\tMAX8997_REG_BUCK1DVS1 = 25,\n\tMAX8997_REG_BUCK1DVS2 = 26,\n\tMAX8997_REG_BUCK1DVS3 = 27,\n\tMAX8997_REG_BUCK1DVS4 = 28,\n\tMAX8997_REG_BUCK1DVS5 = 29,\n\tMAX8997_REG_BUCK1DVS6 = 30,\n\tMAX8997_REG_BUCK1DVS7 = 31,\n\tMAX8997_REG_BUCK1DVS8 = 32,\n\tMAX8997_REG_BUCK2CTRL = 33,\n\tMAX8997_REG_BUCK2DVS1 = 34,\n\tMAX8997_REG_BUCK2DVS2 = 35,\n\tMAX8997_REG_BUCK2DVS3 = 36,\n\tMAX8997_REG_BUCK2DVS4 = 37,\n\tMAX8997_REG_BUCK2DVS5 = 38,\n\tMAX8997_REG_BUCK2DVS6 = 39,\n\tMAX8997_REG_BUCK2DVS7 = 40,\n\tMAX8997_REG_BUCK2DVS8 = 41,\n\tMAX8997_REG_BUCK3CTRL = 42,\n\tMAX8997_REG_BUCK3DVS = 43,\n\tMAX8997_REG_BUCK4CTRL = 44,\n\tMAX8997_REG_BUCK4DVS = 45,\n\tMAX8997_REG_BUCK5CTRL = 46,\n\tMAX8997_REG_BUCK5DVS1 = 47,\n\tMAX8997_REG_BUCK5DVS2 = 48,\n\tMAX8997_REG_BUCK5DVS3 = 49,\n\tMAX8997_REG_BUCK5DVS4 = 50,\n\tMAX8997_REG_BUCK5DVS5 = 51,\n\tMAX8997_REG_BUCK5DVS6 = 52,\n\tMAX8997_REG_BUCK5DVS7 = 53,\n\tMAX8997_REG_BUCK5DVS8 = 54,\n\tMAX8997_REG_BUCK6CTRL = 55,\n\tMAX8997_REG_BUCK6BPSKIPCTRL = 56,\n\tMAX8997_REG_BUCK7CTRL = 57,\n\tMAX8997_REG_BUCK7DVS = 58,\n\tMAX8997_REG_LDO1CTRL = 59,\n\tMAX8997_REG_LDO2CTRL = 60,\n\tMAX8997_REG_LDO3CTRL = 61,\n\tMAX8997_REG_LDO4CTRL = 62,\n\tMAX8997_REG_LDO5CTRL = 63,\n\tMAX8997_REG_LDO6CTRL = 64,\n\tMAX8997_REG_LDO7CTRL = 65,\n\tMAX8997_REG_LDO8CTRL = 66,\n\tMAX8997_REG_LDO9CTRL = 67,\n\tMAX8997_REG_LDO10CTRL = 68,\n\tMAX8997_REG_LDO11CTRL = 69,\n\tMAX8997_REG_LDO12CTRL = 70,\n\tMAX8997_REG_LDO13CTRL = 71,\n\tMAX8997_REG_LDO14CTRL = 72,\n\tMAX8997_REG_LDO15CTRL = 73,\n\tMAX8997_REG_LDO16CTRL = 74,\n\tMAX8997_REG_LDO17CTRL = 75,\n\tMAX8997_REG_LDO18CTRL = 76,\n\tMAX8997_REG_LDO21CTRL = 77,\n\tMAX8997_REG_MBCCTRL1 = 80,\n\tMAX8997_REG_MBCCTRL2 = 81,\n\tMAX8997_REG_MBCCTRL3 = 82,\n\tMAX8997_REG_MBCCTRL4 = 83,\n\tMAX8997_REG_MBCCTRL5 = 84,\n\tMAX8997_REG_MBCCTRL6 = 85,\n\tMAX8997_REG_OTPCGHCVS = 86,\n\tMAX8997_REG_SAFEOUTCTRL = 90,\n\tMAX8997_REG_LBCNFG1 = 94,\n\tMAX8997_REG_LBCNFG2 = 95,\n\tMAX8997_REG_BBCCTRL = 96,\n\tMAX8997_REG_FLASH1_CUR = 99,\n\tMAX8997_REG_FLASH2_CUR = 100,\n\tMAX8997_REG_MOVIE_CUR = 101,\n\tMAX8997_REG_GSMB_CUR = 102,\n\tMAX8997_REG_BOOST_CNTL = 103,\n\tMAX8997_REG_LEN_CNTL = 104,\n\tMAX8997_REG_FLASH_CNTL = 105,\n\tMAX8997_REG_WDT_CNTL = 106,\n\tMAX8997_REG_MAXFLASH1 = 107,\n\tMAX8997_REG_MAXFLASH2 = 108,\n\tMAX8997_REG_FLASHSTATUS = 109,\n\tMAX8997_REG_FLASHSTATUSMASK = 110,\n\tMAX8997_REG_GPIOCNTL1 = 112,\n\tMAX8997_REG_GPIOCNTL2 = 113,\n\tMAX8997_REG_GPIOCNTL3 = 114,\n\tMAX8997_REG_GPIOCNTL4 = 115,\n\tMAX8997_REG_GPIOCNTL5 = 116,\n\tMAX8997_REG_GPIOCNTL6 = 117,\n\tMAX8997_REG_GPIOCNTL7 = 118,\n\tMAX8997_REG_GPIOCNTL8 = 119,\n\tMAX8997_REG_GPIOCNTL9 = 120,\n\tMAX8997_REG_GPIOCNTL10 = 121,\n\tMAX8997_REG_GPIOCNTL11 = 122,\n\tMAX8997_REG_GPIOCNTL12 = 123,\n\tMAX8997_REG_LDO1CONFIG = 128,\n\tMAX8997_REG_LDO2CONFIG = 129,\n\tMAX8997_REG_LDO3CONFIG = 130,\n\tMAX8997_REG_LDO4CONFIG = 131,\n\tMAX8997_REG_LDO5CONFIG = 132,\n\tMAX8997_REG_LDO6CONFIG = 133,\n\tMAX8997_REG_LDO7CONFIG = 134,\n\tMAX8997_REG_LDO8CONFIG = 135,\n\tMAX8997_REG_LDO9CONFIG = 136,\n\tMAX8997_REG_LDO10CONFIG = 137,\n\tMAX8997_REG_LDO11CONFIG = 138,\n\tMAX8997_REG_LDO12CONFIG = 139,\n\tMAX8997_REG_LDO13CONFIG = 140,\n\tMAX8997_REG_LDO14CONFIG = 141,\n\tMAX8997_REG_LDO15CONFIG = 142,\n\tMAX8997_REG_LDO16CONFIG = 143,\n\tMAX8997_REG_LDO17CONFIG = 144,\n\tMAX8997_REG_LDO18CONFIG = 145,\n\tMAX8997_REG_LDO21CONFIG = 146,\n\tMAX8997_REG_DVSOKTIMER1 = 151,\n\tMAX8997_REG_DVSOKTIMER2 = 152,\n\tMAX8997_REG_DVSOKTIMER4 = 153,\n\tMAX8997_REG_DVSOKTIMER5 = 154,\n\tMAX8997_REG_PMIC_END = 155,\n};\n\nenum max8997_types {\n\tTYPE_MAX8997 = 0,\n\tTYPE_MAX8966 = 1,\n};\n\nenum maxim_device_type {\n\tMAXIM_DEVICE_TYPE_UNKNOWN = 0,\n\tMAXIM_DEVICE_TYPE_MAX14577 = 1,\n\tMAXIM_DEVICE_TYPE_MAX77836 = 2,\n\tMAXIM_DEVICE_TYPE_NUM = 3,\n};\n\nenum mca_msr {\n\tMCA_CTL = 0,\n\tMCA_STATUS = 1,\n\tMCA_ADDR = 2,\n\tMCA_MISC = 3,\n};\n\nenum mce_notifier_prios {\n\tMCE_PRIO_LOWEST = 0,\n\tMCE_PRIO_MCELOG = 1,\n\tMCE_PRIO_EDAC = 2,\n\tMCE_PRIO_NFIT = 3,\n\tMCE_PRIO_EXTLOG = 4,\n\tMCE_PRIO_UC = 5,\n\tMCE_PRIO_EARLY = 6,\n\tMCE_PRIO_CEC = 7,\n\tMCE_PRIO_HIGHEST = 7,\n};\n\nenum mcp_flags {\n\tMCP_TIMESTAMP = 1,\n\tMCP_UC = 2,\n\tMCP_DONTLOG = 4,\n\tMCP_QUEUE_LOG = 8,\n};\n\nenum mctp_neigh_source {\n\tMCTP_NEIGH_STATIC = 0,\n\tMCTP_NEIGH_DISCOVER = 1,\n};\n\nenum mctrl_gpio_idx {\n\tUART_GPIO_CTS = 0,\n\tUART_GPIO_DSR = 1,\n\tUART_GPIO_DCD = 2,\n\tUART_GPIO_RNG = 3,\n\tUART_GPIO_RI = 3,\n\tUART_GPIO_RTS = 4,\n\tUART_GPIO_DTR = 5,\n\tUART_GPIO_MAX = 6,\n};\n\nenum md_ro_state {\n\tMD_RDWR = 0,\n\tMD_RDONLY = 1,\n\tMD_AUTO_READ = 2,\n\tMD_MAX_STATE = 3,\n};\n\nenum mddev_flags {\n\tMD_ARRAY_FIRST_USE = 0,\n\tMD_CLOSING = 1,\n\tMD_JOURNAL_CLEAN = 2,\n\tMD_HAS_JOURNAL = 3,\n\tMD_CLUSTER_RESYNC_LOCKED = 4,\n\tMD_FAILFAST_SUPPORTED = 5,\n\tMD_HAS_PPL = 6,\n\tMD_HAS_MULTIPLE_PPLS = 7,\n\tMD_NOT_READY = 8,\n\tMD_BROKEN = 9,\n\tMD_DELETED = 10,\n};\n\nenum mddev_sb_flags {\n\tMD_SB_CHANGE_DEVS = 0,\n\tMD_SB_CHANGE_CLEAN = 1,\n\tMD_SB_CHANGE_PENDING = 2,\n\tMD_SB_NEED_REWRITE = 3,\n};\n\nenum mds_mitigations {\n\tMDS_MITIGATION_OFF = 0,\n\tMDS_MITIGATION_FULL = 1,\n\tMDS_MITIGATION_VMWERV = 2,\n};\n\nenum mem_cgroup_events_target {\n\tMEM_CGROUP_TARGET_THRESH = 0,\n\tMEM_CGROUP_TARGET_SOFTLIMIT = 1,\n\tMEM_CGROUP_NTARGETS = 2,\n};\n\nenum mem_type {\n\tMEM_EMPTY = 0,\n\tMEM_RESERVED = 1,\n\tMEM_UNKNOWN = 2,\n\tMEM_FPM = 3,\n\tMEM_EDO = 4,\n\tMEM_BEDO = 5,\n\tMEM_SDR = 6,\n\tMEM_RDR = 7,\n\tMEM_DDR = 8,\n\tMEM_RDDR = 9,\n\tMEM_RMBS = 10,\n\tMEM_DDR2 = 11,\n\tMEM_FB_DDR2 = 12,\n\tMEM_RDDR2 = 13,\n\tMEM_XDR = 14,\n\tMEM_DDR3 = 15,\n\tMEM_RDDR3 = 16,\n\tMEM_LRDDR3 = 17,\n\tMEM_LPDDR3 = 18,\n\tMEM_DDR4 = 19,\n\tMEM_RDDR4 = 20,\n\tMEM_LRDDR4 = 21,\n\tMEM_LPDDR4 = 22,\n\tMEM_DDR5 = 23,\n\tMEM_RDDR5 = 24,\n\tMEM_LRDDR5 = 25,\n\tMEM_NVDIMM = 26,\n\tMEM_WIO2 = 27,\n\tMEM_HBM2 = 28,\n\tMEM_HBM3 = 29,\n};\n\nenum membarrier_cmd {\n\tMEMBARRIER_CMD_QUERY = 0,\n\tMEMBARRIER_CMD_GLOBAL = 1,\n\tMEMBARRIER_CMD_GLOBAL_EXPEDITED = 2,\n\tMEMBARRIER_CMD_REGISTER_GLOBAL_EXPEDITED = 4,\n\tMEMBARRIER_CMD_PRIVATE_EXPEDITED = 8,\n\tMEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED = 16,\n\tMEMBARRIER_CMD_PRIVATE_EXPEDITED_SYNC_CORE = 32,\n\tMEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_SYNC_CORE = 64,\n\tMEMBARRIER_CMD_PRIVATE_EXPEDITED_RSEQ = 128,\n\tMEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_RSEQ = 256,\n\tMEMBARRIER_CMD_GET_REGISTRATIONS = 512,\n\tMEMBARRIER_CMD_SHARED = 1,\n};\n\nenum membarrier_cmd_flag {\n\tMEMBARRIER_CMD_FLAG_CPU = 1,\n};\n\nenum memblock_flags {\n\tMEMBLOCK_NONE = 0,\n\tMEMBLOCK_HOTPLUG = 1,\n\tMEMBLOCK_MIRROR = 2,\n\tMEMBLOCK_NOMAP = 4,\n\tMEMBLOCK_DRIVER_MANAGED = 8,\n\tMEMBLOCK_RSRV_NOINIT = 16,\n};\n\nenum membw_throttle_mode {\n\tTHREAD_THROTTLE_UNDEFINED = 0,\n\tTHREAD_THROTTLE_MAX = 1,\n\tTHREAD_THROTTLE_PER_THREAD = 2,\n};\n\nenum memcg_memory_event {\n\tMEMCG_LOW = 0,\n\tMEMCG_HIGH = 1,\n\tMEMCG_MAX = 2,\n\tMEMCG_OOM = 3,\n\tMEMCG_OOM_KILL = 4,\n\tMEMCG_OOM_GROUP_KILL = 5,\n\tMEMCG_SWAP_HIGH = 6,\n\tMEMCG_SWAP_MAX = 7,\n\tMEMCG_SWAP_FAIL = 8,\n\tMEMCG_NR_MEMORY_EVENTS = 9,\n};\n\nenum memcg_stat_item {\n\tMEMCG_SWAP = 47,\n\tMEMCG_SOCK = 48,\n\tMEMCG_PERCPU_B = 49,\n\tMEMCG_VMALLOC = 50,\n\tMEMCG_KMEM = 51,\n\tMEMCG_ZSWAP_B = 52,\n\tMEMCG_ZSWAPPED = 53,\n\tMEMCG_NR_STAT = 54,\n};\n\nenum meminit_context {\n\tMEMINIT_EARLY = 0,\n\tMEMINIT_HOTPLUG = 1,\n};\n\nenum memory_type {\n\tMEMORY_DEVICE_PRIVATE = 1,\n\tMEMORY_DEVICE_COHERENT = 2,\n\tMEMORY_DEVICE_FS_DAX = 3,\n\tMEMORY_DEVICE_GENERIC = 4,\n\tMEMORY_DEVICE_PCI_P2PDMA = 5,\n};\n\nenum metadata_type {\n\tMETADATA_IP_TUNNEL = 0,\n\tMETADATA_HW_PORT_MUX = 1,\n\tMETADATA_MACSEC = 2,\n\tMETADATA_XFRM = 3,\n};\n\nenum mf_action_page_type {\n\tMF_MSG_KERNEL = 0,\n\tMF_MSG_KERNEL_HIGH_ORDER = 1,\n\tMF_MSG_DIFFERENT_COMPOUND = 2,\n\tMF_MSG_HUGE = 3,\n\tMF_MSG_FREE_HUGE = 4,\n\tMF_MSG_GET_HWPOISON = 5,\n\tMF_MSG_UNMAP_FAILED = 6,\n\tMF_MSG_DIRTY_SWAPCACHE = 7,\n\tMF_MSG_CLEAN_SWAPCACHE = 8,\n\tMF_MSG_DIRTY_MLOCKED_LRU = 9,\n\tMF_MSG_CLEAN_MLOCKED_LRU = 10,\n\tMF_MSG_DIRTY_UNEVICTABLE_LRU = 11,\n\tMF_MSG_CLEAN_UNEVICTABLE_LRU = 12,\n\tMF_MSG_DIRTY_LRU = 13,\n\tMF_MSG_CLEAN_LRU = 14,\n\tMF_MSG_TRUNCATED_LRU = 15,\n\tMF_MSG_BUDDY = 16,\n\tMF_MSG_DAX = 17,\n\tMF_MSG_UNSPLIT_THP = 18,\n\tMF_MSG_ALREADY_POISONED = 19,\n\tMF_MSG_UNKNOWN = 20,\n};\n\nenum mf_flags {\n\tMF_COUNT_INCREASED = 1,\n\tMF_ACTION_REQUIRED = 2,\n\tMF_MUST_KILL = 4,\n\tMF_SOFT_OFFLINE = 8,\n\tMF_UNPOISON = 16,\n\tMF_SW_SIMULATED = 32,\n\tMF_NO_RETRY = 64,\n\tMF_MEM_PRE_REMOVE = 128,\n};\n\nenum mf_result {\n\tMF_IGNORED = 0,\n\tMF_FAILED = 1,\n\tMF_DELAYED = 2,\n\tMF_RECOVERED = 3,\n};\n\nenum mfill_atomic_mode {\n\tMFILL_ATOMIC_COPY = 0,\n\tMFILL_ATOMIC_ZEROPAGE = 1,\n\tMFILL_ATOMIC_CONTINUE = 2,\n\tMFILL_ATOMIC_POISON = 3,\n\tNR_MFILL_ATOMIC_MODES = 4,\n};\n\nenum migrate_mode {\n\tMIGRATE_ASYNC = 0,\n\tMIGRATE_SYNC_LIGHT = 1,\n\tMIGRATE_SYNC = 2,\n};\n\nenum migrate_reason {\n\tMR_COMPACTION = 0,\n\tMR_MEMORY_FAILURE = 1,\n\tMR_MEMORY_HOTPLUG = 2,\n\tMR_SYSCALL = 3,\n\tMR_MEMPOLICY_MBIND = 4,\n\tMR_NUMA_MISPLACED = 5,\n\tMR_CONTIG_RANGE = 6,\n\tMR_LONGTERM_PIN = 7,\n\tMR_DEMOTION = 8,\n\tMR_DAMON = 9,\n\tMR_TYPES = 10,\n};\n\nenum migrate_vma_direction {\n\tMIGRATE_VMA_SELECT_SYSTEM = 1,\n\tMIGRATE_VMA_SELECT_DEVICE_PRIVATE = 2,\n\tMIGRATE_VMA_SELECT_DEVICE_COHERENT = 4,\n};\n\nenum migratetype {\n\tMIGRATE_UNMOVABLE = 0,\n\tMIGRATE_MOVABLE = 1,\n\tMIGRATE_RECLAIMABLE = 2,\n\tMIGRATE_PCPTYPES = 3,\n\tMIGRATE_HIGHATOMIC = 3,\n\tMIGRATE_ISOLATE = 4,\n\tMIGRATE_TYPES = 5,\n};\n\nenum migration_type {\n\tmigrate_load = 0,\n\tmigrate_util = 1,\n\tmigrate_task = 2,\n\tmigrate_misfit = 3,\n};\n\nenum mipi_dsi_compression_algo {\n\tMIPI_DSI_COMPRESSION_DSC = 0,\n\tMIPI_DSI_COMPRESSION_VENDOR = 3,\n};\n\nenum mipi_dsi_dcs_tear_mode {\n\tMIPI_DSI_DCS_TEAR_MODE_VBLANK = 0,\n\tMIPI_DSI_DCS_TEAR_MODE_VHBLANK = 1,\n};\n\nenum mipi_dsi_pixel_format {\n\tMIPI_DSI_FMT_RGB888 = 0,\n\tMIPI_DSI_FMT_RGB666 = 1,\n\tMIPI_DSI_FMT_RGB666_PACKED = 2,\n\tMIPI_DSI_FMT_RGB565 = 3,\n};\n\nenum misc_res_type {\n\tMISC_CG_RES_SEV = 0,\n\tMISC_CG_RES_SEV_ES = 1,\n\tMISC_CG_RES_TYPES = 2,\n};\n\nenum mm_cid_state {\n\tMM_CID_UNSET = 4294967295,\n\tMM_CID_LAZY_PUT = 2147483648,\n};\n\nenum mm_io_opcode {\n\tMMIO_READ = 1,\n\tMMIO_WRITE = 2,\n\tMMIO_PROBE = 3,\n\tMMIO_UNPROBE = 4,\n\tMMIO_UNKNOWN_OP = 5,\n};\n\nenum mmc_busy_cmd {\n\tMMC_BUSY_CMD6 = 0,\n\tMMC_BUSY_ERASE = 1,\n\tMMC_BUSY_HPI = 2,\n\tMMC_BUSY_EXTR_SINGLE = 3,\n\tMMC_BUSY_IO = 4,\n};\n\nenum mmc_drv_op {\n\tMMC_DRV_OP_IOCTL = 0,\n\tMMC_DRV_OP_IOCTL_RPMB = 1,\n\tMMC_DRV_OP_BOOT_WP = 2,\n\tMMC_DRV_OP_GET_CARD_STATUS = 3,\n\tMMC_DRV_OP_GET_EXT_CSD = 4,\n};\n\nenum mmc_err_stat {\n\tMMC_ERR_CMD_TIMEOUT = 0,\n\tMMC_ERR_CMD_CRC = 1,\n\tMMC_ERR_DAT_TIMEOUT = 2,\n\tMMC_ERR_DAT_CRC = 3,\n\tMMC_ERR_AUTO_CMD = 4,\n\tMMC_ERR_ADMA = 5,\n\tMMC_ERR_TUNING = 6,\n\tMMC_ERR_CMDQ_RED = 7,\n\tMMC_ERR_CMDQ_GCE = 8,\n\tMMC_ERR_CMDQ_ICCE = 9,\n\tMMC_ERR_REQ_TIMEOUT = 10,\n\tMMC_ERR_CMDQ_REQ_TIMEOUT = 11,\n\tMMC_ERR_ICE_CFG = 12,\n\tMMC_ERR_CTRL_TIMEOUT = 13,\n\tMMC_ERR_UNEXPECTED_IRQ = 14,\n\tMMC_ERR_MAX = 15,\n};\n\nenum mmc_issue_type {\n\tMMC_ISSUE_SYNC = 0,\n\tMMC_ISSUE_DCMD = 1,\n\tMMC_ISSUE_ASYNC = 2,\n\tMMC_ISSUE_MAX = 3,\n};\n\nenum mminit_level {\n\tMMINIT_WARNING = 0,\n\tMMINIT_VERIFY = 1,\n\tMMINIT_TRACE = 2,\n};\n\nenum mmio_mitigations {\n\tMMIO_MITIGATION_OFF = 0,\n\tMMIO_MITIGATION_UCODE_NEEDED = 1,\n\tMMIO_MITIGATION_VERW = 2,\n};\n\nenum mmioh_arch {\n\tUV2_MMIOH = -1,\n\tUVY_MMIOH0 = 0,\n\tUVY_MMIOH1 = 1,\n\tUVX_MMIOH0 = 2,\n\tUVX_MMIOH1 = 3,\n};\n\nenum mmu_notifier_event {\n\tMMU_NOTIFY_UNMAP = 0,\n\tMMU_NOTIFY_CLEAR = 1,\n\tMMU_NOTIFY_PROTECTION_VMA = 2,\n\tMMU_NOTIFY_PROTECTION_PAGE = 3,\n\tMMU_NOTIFY_SOFT_DIRTY = 4,\n\tMMU_NOTIFY_RELEASE = 5,\n\tMMU_NOTIFY_MIGRATE = 6,\n\tMMU_NOTIFY_EXCLUSIVE = 7,\n};\n\nenum mnt_tree_flags_t {\n\tMNT_TREE_MOVE = 1,\n\tMNT_TREE_BENEATH = 2,\n};\n\nenum mod_license {\n\tNOT_GPL_ONLY = 0,\n\tGPL_ONLY = 1,\n};\n\nenum mod_mem_type {\n\tMOD_TEXT = 0,\n\tMOD_DATA = 1,\n\tMOD_RODATA = 2,\n\tMOD_RO_AFTER_INIT = 3,\n\tMOD_INIT_TEXT = 4,\n\tMOD_INIT_DATA = 5,\n\tMOD_INIT_RODATA = 6,\n\tMOD_MEM_NUM_TYPES = 7,\n\tMOD_INVALID = -1,\n};\n\nenum mode_set_atomic {\n\tLEAVE_ATOMIC_MODE_SET = 0,\n\tENTER_ATOMIC_MODE_SET = 1,\n};\n\nenum module_state {\n\tMODULE_STATE_LIVE = 0,\n\tMODULE_STATE_COMING = 1,\n\tMODULE_STATE_GOING = 2,\n\tMODULE_STATE_UNFORMED = 3,\n};\n\nenum motionsense_command {\n\tMOTIONSENSE_CMD_DUMP = 0,\n\tMOTIONSENSE_CMD_INFO = 1,\n\tMOTIONSENSE_CMD_EC_RATE = 2,\n\tMOTIONSENSE_CMD_SENSOR_ODR = 3,\n\tMOTIONSENSE_CMD_SENSOR_RANGE = 4,\n\tMOTIONSENSE_CMD_KB_WAKE_ANGLE = 5,\n\tMOTIONSENSE_CMD_DATA = 6,\n\tMOTIONSENSE_CMD_FIFO_INFO = 7,\n\tMOTIONSENSE_CMD_FIFO_FLUSH = 8,\n\tMOTIONSENSE_CMD_FIFO_READ = 9,\n\tMOTIONSENSE_CMD_PERFORM_CALIB = 10,\n\tMOTIONSENSE_CMD_SENSOR_OFFSET = 11,\n\tMOTIONSENSE_CMD_LIST_ACTIVITIES = 12,\n\tMOTIONSENSE_CMD_SET_ACTIVITY = 13,\n\tMOTIONSENSE_CMD_LID_ANGLE = 14,\n\tMOTIONSENSE_CMD_FIFO_INT_ENABLE = 15,\n\tMOTIONSENSE_CMD_SPOOF = 16,\n\tMOTIONSENSE_CMD_TABLET_MODE_LID_ANGLE = 17,\n\tMOTIONSENSE_CMD_SENSOR_SCALE = 18,\n\tMOTIONSENSE_NUM_CMDS = 19,\n};\n\nenum mousedev_emul {\n\tMOUSEDEV_EMUL_PS2 = 0,\n\tMOUSEDEV_EMUL_IMPS = 1,\n\tMOUSEDEV_EMUL_EXPS = 2,\n};\n\nenum mp_bustype {\n\tMP_BUS_ISA = 1,\n\tMP_BUS_EISA = 2,\n\tMP_BUS_PCI = 3,\n};\n\nenum mp_irq_source_types {\n\tmp_INT = 0,\n\tmp_NMI = 1,\n\tmp_SMI = 2,\n\tmp_ExtINT = 3,\n};\n\nenum mptcp_addr_signal_status {\n\tMPTCP_ADD_ADDR_SIGNAL = 0,\n\tMPTCP_ADD_ADDR_ECHO = 1,\n\tMPTCP_RM_ADDR_SIGNAL = 2,\n};\n\nenum mptcp_event_attr {\n\tMPTCP_ATTR_UNSPEC = 0,\n\tMPTCP_ATTR_TOKEN = 1,\n\tMPTCP_ATTR_FAMILY = 2,\n\tMPTCP_ATTR_LOC_ID = 3,\n\tMPTCP_ATTR_REM_ID = 4,\n\tMPTCP_ATTR_SADDR4 = 5,\n\tMPTCP_ATTR_SADDR6 = 6,\n\tMPTCP_ATTR_DADDR4 = 7,\n\tMPTCP_ATTR_DADDR6 = 8,\n\tMPTCP_ATTR_SPORT = 9,\n\tMPTCP_ATTR_DPORT = 10,\n\tMPTCP_ATTR_BACKUP = 11,\n\tMPTCP_ATTR_ERROR = 12,\n\tMPTCP_ATTR_FLAGS = 13,\n\tMPTCP_ATTR_TIMEOUT = 14,\n\tMPTCP_ATTR_IF_IDX = 15,\n\tMPTCP_ATTR_RESET_REASON = 16,\n\tMPTCP_ATTR_RESET_FLAGS = 17,\n\tMPTCP_ATTR_SERVER_SIDE = 18,\n\t__MPTCP_ATTR_MAX = 19,\n};\n\nenum mptcp_event_type {\n\tMPTCP_EVENT_UNSPEC = 0,\n\tMPTCP_EVENT_CREATED = 1,\n\tMPTCP_EVENT_ESTABLISHED = 2,\n\tMPTCP_EVENT_CLOSED = 3,\n\tMPTCP_EVENT_ANNOUNCED = 6,\n\tMPTCP_EVENT_REMOVED = 7,\n\tMPTCP_EVENT_SUB_ESTABLISHED = 10,\n\tMPTCP_EVENT_SUB_CLOSED = 11,\n\tMPTCP_EVENT_SUB_PRIORITY = 13,\n\tMPTCP_EVENT_LISTENER_CREATED = 15,\n\tMPTCP_EVENT_LISTENER_CLOSED = 16,\n};\n\nenum mptcp_pm_status {\n\tMPTCP_PM_ADD_ADDR_RECEIVED = 0,\n\tMPTCP_PM_ADD_ADDR_SEND_ACK = 1,\n\tMPTCP_PM_RM_ADDR_RECEIVED = 2,\n\tMPTCP_PM_ESTABLISHED = 3,\n\tMPTCP_PM_SUBFLOW_ESTABLISHED = 4,\n\tMPTCP_PM_ALREADY_ESTABLISHED = 5,\n\tMPTCP_PM_MPC_ENDPOINT_ACCOUNTED = 6,\n};\n\nenum mptcp_pm_type {\n\tMPTCP_PM_TYPE_KERNEL = 0,\n\tMPTCP_PM_TYPE_USERSPACE = 1,\n\t__MPTCP_PM_TYPE_NR = 2,\n\t__MPTCP_PM_TYPE_MAX = 1,\n};\n\nenum mq_rq_state {\n\tMQ_RQ_IDLE = 0,\n\tMQ_RQ_IN_FLIGHT = 1,\n\tMQ_RQ_COMPLETE = 2,\n};\n\nenum mscode_actions {\n\tACT_mscode_note_content_type = 0,\n\tACT_mscode_note_digest = 1,\n\tACT_mscode_note_digest_algo = 2,\n\tNR__mscode_actions = 3,\n};\n\nenum msdos_sys_ind {\n\tDOS_EXTENDED_PARTITION = 5,\n\tLINUX_EXTENDED_PARTITION = 133,\n\tWIN98_EXTENDED_PARTITION = 15,\n\tLINUX_DATA_PARTITION = 131,\n\tLINUX_LVM_PARTITION = 142,\n\tLINUX_RAID_PARTITION___3 = 253,\n\tSOLARIS_X86_PARTITION = 130,\n\tNEW_SOLARIS_X86_PARTITION = 191,\n\tDM6_AUX1PARTITION = 81,\n\tDM6_AUX3PARTITION = 83,\n\tDM6_PARTITION = 84,\n\tEZD_PARTITION = 85,\n\tFREEBSD_PARTITION = 165,\n\tOPENBSD_PARTITION = 166,\n\tNETBSD_PARTITION = 169,\n\tBSDI_PARTITION = 183,\n\tMINIX_PARTITION = 129,\n\tUNIXWARE_PARTITION = 99,\n};\n\nenum msi_desc_filter {\n\tMSI_DESC_ALL = 0,\n\tMSI_DESC_NOTASSOCIATED = 1,\n\tMSI_DESC_ASSOCIATED = 2,\n};\n\nenum msi_domain_ids {\n\tMSI_DEFAULT_DOMAIN = 0,\n\tMSI_MAX_DEVICE_IRQDOMAINS = 1,\n};\n\nenum mthp_stat_item {\n\tMTHP_STAT_ANON_FAULT_ALLOC = 0,\n\tMTHP_STAT_ANON_FAULT_FALLBACK = 1,\n\tMTHP_STAT_ANON_FAULT_FALLBACK_CHARGE = 2,\n\tMTHP_STAT_SWPOUT = 3,\n\tMTHP_STAT_SWPOUT_FALLBACK = 4,\n\tMTHP_STAT_SHMEM_ALLOC = 5,\n\tMTHP_STAT_SHMEM_FALLBACK = 6,\n\tMTHP_STAT_SHMEM_FALLBACK_CHARGE = 7,\n\tMTHP_STAT_SPLIT = 8,\n\tMTHP_STAT_SPLIT_FAILED = 9,\n\tMTHP_STAT_SPLIT_DEFERRED = 10,\n\t__MTHP_STAT_COUNT = 11,\n};\n\nenum multi_stop_state {\n\tMULTI_STOP_NONE = 0,\n\tMULTI_STOP_PREPARE = 1,\n\tMULTI_STOP_DISABLE_IRQ = 2,\n\tMULTI_STOP_RUN = 3,\n\tMULTI_STOP_EXIT = 4,\n};\n\nenum nbcon_prio {\n\tNBCON_PRIO_NONE = 0,\n\tNBCON_PRIO_NORMAL = 1,\n\tNBCON_PRIO_EMERGENCY = 2,\n\tNBCON_PRIO_PANIC = 3,\n\tNBCON_PRIO_MAX = 4,\n};\n\nenum ncsi_nl_attrs {\n\tNCSI_ATTR_UNSPEC = 0,\n\tNCSI_ATTR_IFINDEX = 1,\n\tNCSI_ATTR_PACKAGE_LIST = 2,\n\tNCSI_ATTR_PACKAGE_ID = 3,\n\tNCSI_ATTR_CHANNEL_ID = 4,\n\tNCSI_ATTR_DATA = 5,\n\tNCSI_ATTR_MULTI_FLAG = 6,\n\tNCSI_ATTR_PACKAGE_MASK = 7,\n\tNCSI_ATTR_CHANNEL_MASK = 8,\n\t__NCSI_ATTR_AFTER_LAST = 9,\n\tNCSI_ATTR_MAX = 8,\n};\n\nenum ncsi_nl_channel_attrs {\n\tNCSI_CHANNEL_ATTR_UNSPEC = 0,\n\tNCSI_CHANNEL_ATTR = 1,\n\tNCSI_CHANNEL_ATTR_ID = 2,\n\tNCSI_CHANNEL_ATTR_VERSION_MAJOR = 3,\n\tNCSI_CHANNEL_ATTR_VERSION_MINOR = 4,\n\tNCSI_CHANNEL_ATTR_VERSION_STR = 5,\n\tNCSI_CHANNEL_ATTR_LINK_STATE = 6,\n\tNCSI_CHANNEL_ATTR_ACTIVE = 7,\n\tNCSI_CHANNEL_ATTR_FORCED = 8,\n\tNCSI_CHANNEL_ATTR_VLAN_LIST = 9,\n\tNCSI_CHANNEL_ATTR_VLAN_ID = 10,\n\t__NCSI_CHANNEL_ATTR_AFTER_LAST = 11,\n\tNCSI_CHANNEL_ATTR_MAX = 10,\n};\n\nenum ncsi_nl_commands {\n\tNCSI_CMD_UNSPEC = 0,\n\tNCSI_CMD_PKG_INFO = 1,\n\tNCSI_CMD_SET_INTERFACE = 2,\n\tNCSI_CMD_CLEAR_INTERFACE = 3,\n\tNCSI_CMD_SEND_CMD = 4,\n\tNCSI_CMD_SET_PACKAGE_MASK = 5,\n\tNCSI_CMD_SET_CHANNEL_MASK = 6,\n\t__NCSI_CMD_AFTER_LAST = 7,\n\tNCSI_CMD_MAX = 6,\n};\n\nenum ncsi_nl_pkg_attrs {\n\tNCSI_PKG_ATTR_UNSPEC = 0,\n\tNCSI_PKG_ATTR = 1,\n\tNCSI_PKG_ATTR_ID = 2,\n\tNCSI_PKG_ATTR_FORCED = 3,\n\tNCSI_PKG_ATTR_CHANNEL_LIST = 4,\n\t__NCSI_PKG_ATTR_AFTER_LAST = 5,\n\tNCSI_PKG_ATTR_MAX = 4,\n};\n\nenum nd_async_mode {\n\tND_SYNC = 0,\n\tND_ASYNC = 1,\n};\n\nenum nd_driver_flags {\n\tND_DRIVER_DIMM = 2,\n\tND_DRIVER_REGION_PMEM = 4,\n\tND_DRIVER_REGION_BLK = 8,\n\tND_DRIVER_NAMESPACE_IO = 16,\n\tND_DRIVER_NAMESPACE_PMEM = 32,\n\tND_DRIVER_DAX_PMEM = 128,\n};\n\nenum nd_ioctl_mode {\n\tBUS_IOCTL = 0,\n\tDIMM_IOCTL = 1,\n};\n\nenum nd_label_flags {\n\tND_LABEL_REAP = 0,\n};\n\nenum nd_pfn_mode {\n\tPFN_MODE_NONE = 0,\n\tPFN_MODE_RAM = 1,\n\tPFN_MODE_PMEM = 2,\n};\n\nenum net_device_flags {\n\tIFF_UP = 1,\n\tIFF_BROADCAST = 2,\n\tIFF_DEBUG = 4,\n\tIFF_LOOPBACK = 8,\n\tIFF_POINTOPOINT = 16,\n\tIFF_NOTRAILERS = 32,\n\tIFF_RUNNING = 64,\n\tIFF_NOARP = 128,\n\tIFF_PROMISC = 256,\n\tIFF_ALLMULTI = 512,\n\tIFF_MASTER = 1024,\n\tIFF_SLAVE = 2048,\n\tIFF_MULTICAST = 4096,\n\tIFF_PORTSEL = 8192,\n\tIFF_AUTOMEDIA = 16384,\n\tIFF_DYNAMIC = 32768,\n\tIFF_LOWER_UP = 65536,\n\tIFF_DORMANT = 131072,\n\tIFF_ECHO = 262144,\n};\n\nenum net_device_path_type {\n\tDEV_PATH_ETHERNET = 0,\n\tDEV_PATH_VLAN = 1,\n\tDEV_PATH_BRIDGE = 2,\n\tDEV_PATH_PPPOE = 3,\n\tDEV_PATH_DSA = 4,\n\tDEV_PATH_MTK_WDMA = 5,\n};\n\nenum net_dm_alert_mode {\n\tNET_DM_ALERT_MODE_SUMMARY = 0,\n\tNET_DM_ALERT_MODE_PACKET = 1,\n};\n\nenum net_dm_attr {\n\tNET_DM_ATTR_UNSPEC = 0,\n\tNET_DM_ATTR_ALERT_MODE = 1,\n\tNET_DM_ATTR_PC = 2,\n\tNET_DM_ATTR_SYMBOL = 3,\n\tNET_DM_ATTR_IN_PORT = 4,\n\tNET_DM_ATTR_TIMESTAMP = 5,\n\tNET_DM_ATTR_PROTO = 6,\n\tNET_DM_ATTR_PAYLOAD = 7,\n\tNET_DM_ATTR_PAD = 8,\n\tNET_DM_ATTR_TRUNC_LEN = 9,\n\tNET_DM_ATTR_ORIG_LEN = 10,\n\tNET_DM_ATTR_QUEUE_LEN = 11,\n\tNET_DM_ATTR_STATS = 12,\n\tNET_DM_ATTR_HW_STATS = 13,\n\tNET_DM_ATTR_ORIGIN = 14,\n\tNET_DM_ATTR_HW_TRAP_GROUP_NAME = 15,\n\tNET_DM_ATTR_HW_TRAP_NAME = 16,\n\tNET_DM_ATTR_HW_ENTRIES = 17,\n\tNET_DM_ATTR_HW_ENTRY = 18,\n\tNET_DM_ATTR_HW_TRAP_COUNT = 19,\n\tNET_DM_ATTR_SW_DROPS = 20,\n\tNET_DM_ATTR_HW_DROPS = 21,\n\tNET_DM_ATTR_FLOW_ACTION_COOKIE = 22,\n\tNET_DM_ATTR_REASON = 23,\n\t__NET_DM_ATTR_MAX = 24,\n\tNET_DM_ATTR_MAX = 23,\n};\n\nenum net_dm_origin {\n\tNET_DM_ORIGIN_SW = 0,\n\tNET_DM_ORIGIN_HW = 1,\n};\n\nenum net_xmit_qdisc_t {\n\t__NET_XMIT_STOLEN = 65536,\n\t__NET_XMIT_BYPASS = 131072,\n};\n\nenum netdev_cmd {\n\tNETDEV_UP = 1,\n\tNETDEV_DOWN = 2,\n\tNETDEV_REBOOT = 3,\n\tNETDEV_CHANGE = 4,\n\tNETDEV_REGISTER = 5,\n\tNETDEV_UNREGISTER = 6,\n\tNETDEV_CHANGEMTU = 7,\n\tNETDEV_CHANGEADDR = 8,\n\tNETDEV_PRE_CHANGEADDR = 9,\n\tNETDEV_GOING_DOWN = 10,\n\tNETDEV_CHANGENAME = 11,\n\tNETDEV_FEAT_CHANGE = 12,\n\tNETDEV_BONDING_FAILOVER = 13,\n\tNETDEV_PRE_UP = 14,\n\tNETDEV_PRE_TYPE_CHANGE = 15,\n\tNETDEV_POST_TYPE_CHANGE = 16,\n\tNETDEV_POST_INIT = 17,\n\tNETDEV_PRE_UNINIT = 18,\n\tNETDEV_RELEASE = 19,\n\tNETDEV_NOTIFY_PEERS = 20,\n\tNETDEV_JOIN = 21,\n\tNETDEV_CHANGEUPPER = 22,\n\tNETDEV_RESEND_IGMP = 23,\n\tNETDEV_PRECHANGEMTU = 24,\n\tNETDEV_CHANGEINFODATA = 25,\n\tNETDEV_BONDING_INFO = 26,\n\tNETDEV_PRECHANGEUPPER = 27,\n\tNETDEV_CHANGELOWERSTATE = 28,\n\tNETDEV_UDP_TUNNEL_PUSH_INFO = 29,\n\tNETDEV_UDP_TUNNEL_DROP_INFO = 30,\n\tNETDEV_CHANGE_TX_QUEUE_LEN = 31,\n\tNETDEV_CVLAN_FILTER_PUSH_INFO = 32,\n\tNETDEV_CVLAN_FILTER_DROP_INFO = 33,\n\tNETDEV_SVLAN_FILTER_PUSH_INFO = 34,\n\tNETDEV_SVLAN_FILTER_DROP_INFO = 35,\n\tNETDEV_OFFLOAD_XSTATS_ENABLE = 36,\n\tNETDEV_OFFLOAD_XSTATS_DISABLE = 37,\n\tNETDEV_OFFLOAD_XSTATS_REPORT_USED = 38,\n\tNETDEV_OFFLOAD_XSTATS_REPORT_DELTA = 39,\n\tNETDEV_XDP_FEAT_CHANGE = 40,\n};\n\nenum netdev_lag_hash {\n\tNETDEV_LAG_HASH_NONE = 0,\n\tNETDEV_LAG_HASH_L2 = 1,\n\tNETDEV_LAG_HASH_L34 = 2,\n\tNETDEV_LAG_HASH_L23 = 3,\n\tNETDEV_LAG_HASH_E23 = 4,\n\tNETDEV_LAG_HASH_E34 = 5,\n\tNETDEV_LAG_HASH_VLAN_SRCMAC = 6,\n\tNETDEV_LAG_HASH_UNKNOWN = 7,\n};\n\nenum netdev_lag_tx_type {\n\tNETDEV_LAG_TX_TYPE_UNKNOWN = 0,\n\tNETDEV_LAG_TX_TYPE_RANDOM = 1,\n\tNETDEV_LAG_TX_TYPE_BROADCAST = 2,\n\tNETDEV_LAG_TX_TYPE_ROUNDROBIN = 3,\n\tNETDEV_LAG_TX_TYPE_ACTIVEBACKUP = 4,\n\tNETDEV_LAG_TX_TYPE_HASH = 5,\n};\n\nenum netdev_ml_priv_type {\n\tML_PRIV_NONE = 0,\n\tML_PRIV_CAN = 1,\n};\n\nenum netdev_offload_xstats_type {\n\tNETDEV_OFFLOAD_XSTATS_TYPE_L3 = 1,\n};\n\nenum netdev_priv_flags {\n\tIFF_802_1Q_VLAN = 1ULL,\n\tIFF_EBRIDGE = 2ULL,\n\tIFF_BONDING = 4ULL,\n\tIFF_ISATAP = 8ULL,\n\tIFF_WAN_HDLC = 16ULL,\n\tIFF_XMIT_DST_RELEASE = 32ULL,\n\tIFF_DONT_BRIDGE = 64ULL,\n\tIFF_DISABLE_NETPOLL = 128ULL,\n\tIFF_MACVLAN_PORT = 256ULL,\n\tIFF_BRIDGE_PORT = 512ULL,\n\tIFF_OVS_DATAPATH = 1024ULL,\n\tIFF_TX_SKB_SHARING = 2048ULL,\n\tIFF_UNICAST_FLT = 4096ULL,\n\tIFF_TEAM_PORT = 8192ULL,\n\tIFF_SUPP_NOFCS = 16384ULL,\n\tIFF_LIVE_ADDR_CHANGE = 32768ULL,\n\tIFF_MACVLAN = 65536ULL,\n\tIFF_XMIT_DST_RELEASE_PERM = 131072ULL,\n\tIFF_L3MDEV_MASTER = 262144ULL,\n\tIFF_NO_QUEUE = 524288ULL,\n\tIFF_OPENVSWITCH = 1048576ULL,\n\tIFF_L3MDEV_SLAVE = 2097152ULL,\n\tIFF_TEAM = 4194304ULL,\n\tIFF_RXFH_CONFIGURED = 8388608ULL,\n\tIFF_PHONY_HEADROOM = 16777216ULL,\n\tIFF_MACSEC = 33554432ULL,\n\tIFF_NO_RX_HANDLER = 67108864ULL,\n\tIFF_FAILOVER = 134217728ULL,\n\tIFF_FAILOVER_SLAVE = 268435456ULL,\n\tIFF_L3MDEV_RX_HANDLER = 536870912ULL,\n\tIFF_NO_ADDRCONF = 1073741824ULL,\n\tIFF_TX_SKB_NO_LINEAR = 2147483648ULL,\n\tIFF_CHANGE_PROTO_DOWN = 4294967296ULL,\n\tIFF_SEE_ALL_HWTSTAMP_REQUESTS = 8589934592ULL,\n};\n\nenum netdev_qstats_scope {\n\tNETDEV_QSTATS_SCOPE_QUEUE = 1,\n};\n\nenum netdev_queue_state_t {\n\t__QUEUE_STATE_DRV_XOFF = 0,\n\t__QUEUE_STATE_STACK_XOFF = 1,\n\t__QUEUE_STATE_FROZEN = 2,\n};\n\nenum netdev_queue_type {\n\tNETDEV_QUEUE_TYPE_RX = 0,\n\tNETDEV_QUEUE_TYPE_TX = 1,\n};\n\nenum netdev_reg_state {\n\tNETREG_UNINITIALIZED = 0,\n\tNETREG_REGISTERED = 1,\n\tNETREG_UNREGISTERING = 2,\n\tNETREG_UNREGISTERED = 3,\n\tNETREG_RELEASED = 4,\n\tNETREG_DUMMY = 5,\n};\n\nenum netdev_stat_type {\n\tNETDEV_PCPU_STAT_NONE = 0,\n\tNETDEV_PCPU_STAT_LSTATS = 1,\n\tNETDEV_PCPU_STAT_TSTATS = 2,\n\tNETDEV_PCPU_STAT_DSTATS = 3,\n};\n\nenum netdev_state_t {\n\t__LINK_STATE_START = 0,\n\t__LINK_STATE_PRESENT = 1,\n\t__LINK_STATE_NOCARRIER = 2,\n\t__LINK_STATE_LINKWATCH_PENDING = 3,\n\t__LINK_STATE_DORMANT = 4,\n\t__LINK_STATE_TESTING = 5,\n};\n\nenum netdev_tx {\n\t__NETDEV_TX_MIN = -2147483648,\n\tNETDEV_TX_OK = 0,\n\tNETDEV_TX_BUSY = 16,\n};\n\ntypedef enum netdev_tx netdev_tx_t;\n\nenum netdev_xdp_act {\n\tNETDEV_XDP_ACT_BASIC = 1,\n\tNETDEV_XDP_ACT_REDIRECT = 2,\n\tNETDEV_XDP_ACT_NDO_XMIT = 4,\n\tNETDEV_XDP_ACT_XSK_ZEROCOPY = 8,\n\tNETDEV_XDP_ACT_HW_OFFLOAD = 16,\n\tNETDEV_XDP_ACT_RX_SG = 32,\n\tNETDEV_XDP_ACT_NDO_XMIT_SG = 64,\n\tNETDEV_XDP_ACT_MASK = 127,\n};\n\nenum netdev_xdp_rx_metadata {\n\tNETDEV_XDP_RX_METADATA_TIMESTAMP = 1,\n\tNETDEV_XDP_RX_METADATA_HASH = 2,\n\tNETDEV_XDP_RX_METADATA_VLAN_TAG = 4,\n};\n\nenum netdev_xsk_flags {\n\tNETDEV_XSK_FLAGS_TX_TIMESTAMP = 1,\n\tNETDEV_XSK_FLAGS_TX_CHECKSUM = 2,\n};\n\nenum netevent_notif_type {\n\tNETEVENT_NEIGH_UPDATE = 1,\n\tNETEVENT_REDIRECT = 2,\n\tNETEVENT_DELAY_PROBE_TIME_UPDATE = 3,\n\tNETEVENT_IPV4_MPATH_HASH_UPDATE = 4,\n\tNETEVENT_IPV6_MPATH_HASH_UPDATE = 5,\n\tNETEVENT_IPV4_FWD_UPDATE_PRIORITY_UPDATE = 6,\n};\n\nenum netkit_action {\n\tNETKIT_NEXT = -1,\n\tNETKIT_PASS = 0,\n\tNETKIT_DROP = 2,\n\tNETKIT_REDIRECT = 7,\n};\n\nenum netkit_mode {\n\tNETKIT_L2 = 0,\n\tNETKIT_L3 = 1,\n};\n\nenum netkit_scrub {\n\tNETKIT_SCRUB_NONE = 0,\n\tNETKIT_SCRUB_DEFAULT = 1,\n};\n\nenum netlink_attribute_type {\n\tNL_ATTR_TYPE_INVALID = 0,\n\tNL_ATTR_TYPE_FLAG = 1,\n\tNL_ATTR_TYPE_U8 = 2,\n\tNL_ATTR_TYPE_U16 = 3,\n\tNL_ATTR_TYPE_U32 = 4,\n\tNL_ATTR_TYPE_U64 = 5,\n\tNL_ATTR_TYPE_S8 = 6,\n\tNL_ATTR_TYPE_S16 = 7,\n\tNL_ATTR_TYPE_S32 = 8,\n\tNL_ATTR_TYPE_S64 = 9,\n\tNL_ATTR_TYPE_BINARY = 10,\n\tNL_ATTR_TYPE_STRING = 11,\n\tNL_ATTR_TYPE_NUL_STRING = 12,\n\tNL_ATTR_TYPE_NESTED = 13,\n\tNL_ATTR_TYPE_NESTED_ARRAY = 14,\n\tNL_ATTR_TYPE_BITFIELD32 = 15,\n\tNL_ATTR_TYPE_SINT = 16,\n\tNL_ATTR_TYPE_UINT = 17,\n};\n\nenum netlink_policy_type_attr {\n\tNL_POLICY_TYPE_ATTR_UNSPEC = 0,\n\tNL_POLICY_TYPE_ATTR_TYPE = 1,\n\tNL_POLICY_TYPE_ATTR_MIN_VALUE_S = 2,\n\tNL_POLICY_TYPE_ATTR_MAX_VALUE_S = 3,\n\tNL_POLICY_TYPE_ATTR_MIN_VALUE_U = 4,\n\tNL_POLICY_TYPE_ATTR_MAX_VALUE_U = 5,\n\tNL_POLICY_TYPE_ATTR_MIN_LENGTH = 6,\n\tNL_POLICY_TYPE_ATTR_MAX_LENGTH = 7,\n\tNL_POLICY_TYPE_ATTR_POLICY_IDX = 8,\n\tNL_POLICY_TYPE_ATTR_POLICY_MAXTYPE = 9,\n\tNL_POLICY_TYPE_ATTR_BITFIELD32_MASK = 10,\n\tNL_POLICY_TYPE_ATTR_PAD = 11,\n\tNL_POLICY_TYPE_ATTR_MASK = 12,\n\t__NL_POLICY_TYPE_ATTR_MAX = 13,\n\tNL_POLICY_TYPE_ATTR_MAX = 12,\n};\n\nenum netlink_skb_flags {\n\tNETLINK_SKB_DST = 8,\n};\n\nenum netlink_validation {\n\tNL_VALIDATE_LIBERAL = 0,\n\tNL_VALIDATE_TRAILING = 1,\n\tNL_VALIDATE_MAXTYPE = 2,\n\tNL_VALIDATE_UNSPEC = 4,\n\tNL_VALIDATE_STRICT_ATTRS = 8,\n\tNL_VALIDATE_NESTED = 16,\n};\n\nenum netns_bpf_attach_type {\n\tNETNS_BPF_INVALID = -1,\n\tNETNS_BPF_FLOW_DISSECTOR = 0,\n\tNETNS_BPF_SK_LOOKUP = 1,\n\tMAX_NETNS_BPF_ATTACH_TYPE = 2,\n};\n\nenum nexthop_event_type {\n\tNEXTHOP_EVENT_DEL = 0,\n\tNEXTHOP_EVENT_REPLACE = 1,\n\tNEXTHOP_EVENT_RES_TABLE_PRE_REPLACE = 2,\n\tNEXTHOP_EVENT_BUCKET_REPLACE = 3,\n\tNEXTHOP_EVENT_HW_STATS_REPORT_DELTA = 4,\n};\n\nenum nf_ct_ext_id {\n\tNF_CT_EXT_HELPER = 0,\n\tNF_CT_EXT_NAT = 1,\n\tNF_CT_EXT_SEQADJ = 2,\n\tNF_CT_EXT_ACCT = 3,\n\tNF_CT_EXT_ECACHE = 4,\n\tNF_CT_EXT_TSTAMP = 5,\n\tNF_CT_EXT_TIMEOUT = 6,\n\tNF_CT_EXT_LABELS = 7,\n\tNF_CT_EXT_SYNPROXY = 8,\n\tNF_CT_EXT_ACT_CT = 9,\n\tNF_CT_EXT_NUM = 10,\n};\n\nenum nf_dev_hooks {\n\tNF_NETDEV_INGRESS = 0,\n\tNF_NETDEV_EGRESS = 1,\n\tNF_NETDEV_NUMHOOKS = 2,\n};\n\nenum nf_hook_ops_type {\n\tNF_HOOK_OP_UNDEFINED = 0,\n\tNF_HOOK_OP_NF_TABLES = 1,\n\tNF_HOOK_OP_BPF = 2,\n};\n\nenum nf_inet_hooks {\n\tNF_INET_PRE_ROUTING = 0,\n\tNF_INET_LOCAL_IN = 1,\n\tNF_INET_FORWARD = 2,\n\tNF_INET_LOCAL_OUT = 3,\n\tNF_INET_POST_ROUTING = 4,\n\tNF_INET_NUMHOOKS = 5,\n\tNF_INET_INGRESS = 5,\n};\n\nenum nf_ip6_hook_priorities {\n\tNF_IP6_PRI_FIRST = -2147483648,\n\tNF_IP6_PRI_RAW_BEFORE_DEFRAG = -450,\n\tNF_IP6_PRI_CONNTRACK_DEFRAG = -400,\n\tNF_IP6_PRI_RAW = -300,\n\tNF_IP6_PRI_SELINUX_FIRST = -225,\n\tNF_IP6_PRI_CONNTRACK = -200,\n\tNF_IP6_PRI_MANGLE = -150,\n\tNF_IP6_PRI_NAT_DST = -100,\n\tNF_IP6_PRI_FILTER = 0,\n\tNF_IP6_PRI_SECURITY = 50,\n\tNF_IP6_PRI_NAT_SRC = 100,\n\tNF_IP6_PRI_SELINUX_LAST = 225,\n\tNF_IP6_PRI_CONNTRACK_HELPER = 300,\n\tNF_IP6_PRI_LAST = 2147483647,\n};\n\nenum nf_ip_hook_priorities {\n\tNF_IP_PRI_FIRST = -2147483648,\n\tNF_IP_PRI_RAW_BEFORE_DEFRAG = -450,\n\tNF_IP_PRI_CONNTRACK_DEFRAG = -400,\n\tNF_IP_PRI_RAW = -300,\n\tNF_IP_PRI_SELINUX_FIRST = -225,\n\tNF_IP_PRI_CONNTRACK = -200,\n\tNF_IP_PRI_MANGLE = -150,\n\tNF_IP_PRI_NAT_DST = -100,\n\tNF_IP_PRI_FILTER = 0,\n\tNF_IP_PRI_SECURITY = 50,\n\tNF_IP_PRI_NAT_SRC = 100,\n\tNF_IP_PRI_SELINUX_LAST = 225,\n\tNF_IP_PRI_CONNTRACK_HELPER = 300,\n\tNF_IP_PRI_CONNTRACK_CONFIRM = 2147483647,\n\tNF_IP_PRI_LAST = 2147483647,\n};\n\nenum nf_log_type {\n\tNF_LOG_TYPE_LOG = 0,\n\tNF_LOG_TYPE_ULOG = 1,\n\tNF_LOG_TYPE_MAX = 2,\n};\n\nenum nf_nat_manip_type;\n\nenum nfs3_stable_how {\n\tNFS_UNSTABLE = 0,\n\tNFS_DATA_SYNC = 1,\n\tNFS_FILE_SYNC = 2,\n\tNFS_INVALID_STABLE_HOW = -1,\n};\n\nenum nfs4_change_attr_type {\n\tNFS4_CHANGE_TYPE_IS_MONOTONIC_INCR = 0,\n\tNFS4_CHANGE_TYPE_IS_VERSION_COUNTER = 1,\n\tNFS4_CHANGE_TYPE_IS_VERSION_COUNTER_NOPNFS = 2,\n\tNFS4_CHANGE_TYPE_IS_TIME_METADATA = 3,\n\tNFS4_CHANGE_TYPE_IS_UNDEFINED = 4,\n};\n\nenum nfs_opnum4 {\n\tOP_ACCESS = 3,\n\tOP_CLOSE = 4,\n\tOP_COMMIT = 5,\n\tOP_CREATE = 6,\n\tOP_DELEGPURGE = 7,\n\tOP_DELEGRETURN = 8,\n\tOP_GETATTR = 9,\n\tOP_GETFH = 10,\n\tOP_LINK = 11,\n\tOP_LOCK = 12,\n\tOP_LOCKT = 13,\n\tOP_LOCKU = 14,\n\tOP_LOOKUP = 15,\n\tOP_LOOKUPP = 16,\n\tOP_NVERIFY = 17,\n\tOP_OPEN = 18,\n\tOP_OPENATTR = 19,\n\tOP_OPEN_CONFIRM = 20,\n\tOP_OPEN_DOWNGRADE = 21,\n\tOP_PUTFH = 22,\n\tOP_PUTPUBFH = 23,\n\tOP_PUTROOTFH = 24,\n\tOP_READ = 25,\n\tOP_READDIR = 26,\n\tOP_READLINK = 27,\n\tOP_REMOVE = 28,\n\tOP_RENAME = 29,\n\tOP_RENEW = 30,\n\tOP_RESTOREFH = 31,\n\tOP_SAVEFH = 32,\n\tOP_SECINFO = 33,\n\tOP_SETATTR = 34,\n\tOP_SETCLIENTID = 35,\n\tOP_SETCLIENTID_CONFIRM = 36,\n\tOP_VERIFY = 37,\n\tOP_WRITE = 38,\n\tOP_RELEASE_LOCKOWNER = 39,\n\tOP_BACKCHANNEL_CTL = 40,\n\tOP_BIND_CONN_TO_SESSION = 41,\n\tOP_EXCHANGE_ID = 42,\n\tOP_CREATE_SESSION = 43,\n\tOP_DESTROY_SESSION = 44,\n\tOP_FREE_STATEID = 45,\n\tOP_GET_DIR_DELEGATION = 46,\n\tOP_GETDEVICEINFO = 47,\n\tOP_GETDEVICELIST = 48,\n\tOP_LAYOUTCOMMIT = 49,\n\tOP_LAYOUTGET = 50,\n\tOP_LAYOUTRETURN = 51,\n\tOP_SECINFO_NO_NAME = 52,\n\tOP_SEQUENCE = 53,\n\tOP_SET_SSV = 54,\n\tOP_TEST_STATEID = 55,\n\tOP_WANT_DELEGATION = 56,\n\tOP_DESTROY_CLIENTID = 57,\n\tOP_RECLAIM_COMPLETE = 58,\n\tOP_ALLOCATE = 59,\n\tOP_COPY = 60,\n\tOP_COPY_NOTIFY = 61,\n\tOP_DEALLOCATE = 62,\n\tOP_IO_ADVISE = 63,\n\tOP_LAYOUTERROR = 64,\n\tOP_LAYOUTSTATS = 65,\n\tOP_OFFLOAD_CANCEL = 66,\n\tOP_OFFLOAD_STATUS = 67,\n\tOP_READ_PLUS = 68,\n\tOP_SEEK = 69,\n\tOP_WRITE_SAME = 70,\n\tOP_CLONE = 71,\n\tOP_GETXATTR = 72,\n\tOP_SETXATTR = 73,\n\tOP_LISTXATTRS = 74,\n\tOP_REMOVEXATTR = 75,\n\tOP_ILLEGAL = 10044,\n};\n\nenum nh_notifier_info_type {\n\tNH_NOTIFIER_INFO_TYPE_SINGLE = 0,\n\tNH_NOTIFIER_INFO_TYPE_GRP = 1,\n\tNH_NOTIFIER_INFO_TYPE_RES_TABLE = 2,\n\tNH_NOTIFIER_INFO_TYPE_RES_BUCKET = 3,\n\tNH_NOTIFIER_INFO_TYPE_GRP_HW_STATS = 4,\n};\n\nenum nl80211_auth_type {\n\tNL80211_AUTHTYPE_OPEN_SYSTEM = 0,\n\tNL80211_AUTHTYPE_SHARED_KEY = 1,\n\tNL80211_AUTHTYPE_FT = 2,\n\tNL80211_AUTHTYPE_NETWORK_EAP = 3,\n\tNL80211_AUTHTYPE_SAE = 4,\n\tNL80211_AUTHTYPE_FILS_SK = 5,\n\tNL80211_AUTHTYPE_FILS_SK_PFS = 6,\n\tNL80211_AUTHTYPE_FILS_PK = 7,\n\t__NL80211_AUTHTYPE_NUM = 8,\n\tNL80211_AUTHTYPE_MAX = 7,\n\tNL80211_AUTHTYPE_AUTOMATIC = 8,\n};\n\nenum nl80211_band {\n\tNL80211_BAND_2GHZ = 0,\n\tNL80211_BAND_5GHZ = 1,\n\tNL80211_BAND_60GHZ = 2,\n\tNL80211_BAND_6GHZ = 3,\n\tNL80211_BAND_S1GHZ = 4,\n\tNL80211_BAND_LC = 5,\n\tNUM_NL80211_BANDS = 6,\n};\n\nenum nl80211_bss_select_attr {\n\t__NL80211_BSS_SELECT_ATTR_INVALID = 0,\n\tNL80211_BSS_SELECT_ATTR_RSSI = 1,\n\tNL80211_BSS_SELECT_ATTR_BAND_PREF = 2,\n\tNL80211_BSS_SELECT_ATTR_RSSI_ADJUST = 3,\n\t__NL80211_BSS_SELECT_ATTR_AFTER_LAST = 4,\n\tNL80211_BSS_SELECT_ATTR_MAX = 3,\n};\n\nenum nl80211_chan_width {\n\tNL80211_CHAN_WIDTH_20_NOHT = 0,\n\tNL80211_CHAN_WIDTH_20 = 1,\n\tNL80211_CHAN_WIDTH_40 = 2,\n\tNL80211_CHAN_WIDTH_80 = 3,\n\tNL80211_CHAN_WIDTH_80P80 = 4,\n\tNL80211_CHAN_WIDTH_160 = 5,\n\tNL80211_CHAN_WIDTH_5 = 6,\n\tNL80211_CHAN_WIDTH_10 = 7,\n\tNL80211_CHAN_WIDTH_1 = 8,\n\tNL80211_CHAN_WIDTH_2 = 9,\n\tNL80211_CHAN_WIDTH_4 = 10,\n\tNL80211_CHAN_WIDTH_8 = 11,\n\tNL80211_CHAN_WIDTH_16 = 12,\n\tNL80211_CHAN_WIDTH_320 = 13,\n};\n\nenum nl80211_dfs_regions {\n\tNL80211_DFS_UNSET = 0,\n\tNL80211_DFS_FCC = 1,\n\tNL80211_DFS_ETSI = 2,\n\tNL80211_DFS_JP = 3,\n};\n\nenum nl80211_dfs_state {\n\tNL80211_DFS_USABLE = 0,\n\tNL80211_DFS_UNAVAILABLE = 1,\n\tNL80211_DFS_AVAILABLE = 2,\n};\n\nenum nl80211_ext_feature_index {\n\tNL80211_EXT_FEATURE_VHT_IBSS = 0,\n\tNL80211_EXT_FEATURE_RRM = 1,\n\tNL80211_EXT_FEATURE_MU_MIMO_AIR_SNIFFER = 2,\n\tNL80211_EXT_FEATURE_SCAN_START_TIME = 3,\n\tNL80211_EXT_FEATURE_BSS_PARENT_TSF = 4,\n\tNL80211_EXT_FEATURE_SET_SCAN_DWELL = 5,\n\tNL80211_EXT_FEATURE_BEACON_RATE_LEGACY = 6,\n\tNL80211_EXT_FEATURE_BEACON_RATE_HT = 7,\n\tNL80211_EXT_FEATURE_BEACON_RATE_VHT = 8,\n\tNL80211_EXT_FEATURE_FILS_STA = 9,\n\tNL80211_EXT_FEATURE_MGMT_TX_RANDOM_TA = 10,\n\tNL80211_EXT_FEATURE_MGMT_TX_RANDOM_TA_CONNECTED = 11,\n\tNL80211_EXT_FEATURE_SCHED_SCAN_RELATIVE_RSSI = 12,\n\tNL80211_EXT_FEATURE_CQM_RSSI_LIST = 13,\n\tNL80211_EXT_FEATURE_FILS_SK_OFFLOAD = 14,\n\tNL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_PSK = 15,\n\tNL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_1X = 16,\n\tNL80211_EXT_FEATURE_FILS_MAX_CHANNEL_TIME = 17,\n\tNL80211_EXT_FEATURE_ACCEPT_BCAST_PROBE_RESP = 18,\n\tNL80211_EXT_FEATURE_OCE_PROBE_REQ_HIGH_TX_RATE = 19,\n\tNL80211_EXT_FEATURE_OCE_PROBE_REQ_DEFERRAL_SUPPRESSION = 20,\n\tNL80211_EXT_FEATURE_MFP_OPTIONAL = 21,\n\tNL80211_EXT_FEATURE_LOW_SPAN_SCAN = 22,\n\tNL80211_EXT_FEATURE_LOW_POWER_SCAN = 23,\n\tNL80211_EXT_FEATURE_HIGH_ACCURACY_SCAN = 24,\n\tNL80211_EXT_FEATURE_DFS_OFFLOAD = 25,\n\tNL80211_EXT_FEATURE_CONTROL_PORT_OVER_NL80211 = 26,\n\tNL80211_EXT_FEATURE_ACK_SIGNAL_SUPPORT = 27,\n\tNL80211_EXT_FEATURE_DATA_ACK_SIGNAL_SUPPORT = 27,\n\tNL80211_EXT_FEATURE_TXQS = 28,\n\tNL80211_EXT_FEATURE_SCAN_RANDOM_SN = 29,\n\tNL80211_EXT_FEATURE_SCAN_MIN_PREQ_CONTENT = 30,\n\tNL80211_EXT_FEATURE_CAN_REPLACE_PTK0 = 31,\n\tNL80211_EXT_FEATURE_ENABLE_FTM_RESPONDER = 32,\n\tNL80211_EXT_FEATURE_AIRTIME_FAIRNESS = 33,\n\tNL80211_EXT_FEATURE_AP_PMKSA_CACHING = 34,\n\tNL80211_EXT_FEATURE_SCHED_SCAN_BAND_SPECIFIC_RSSI_THOLD = 35,\n\tNL80211_EXT_FEATURE_EXT_KEY_ID = 36,\n\tNL80211_EXT_FEATURE_STA_TX_PWR = 37,\n\tNL80211_EXT_FEATURE_SAE_OFFLOAD = 38,\n\tNL80211_EXT_FEATURE_VLAN_OFFLOAD = 39,\n\tNL80211_EXT_FEATURE_AQL = 40,\n\tNL80211_EXT_FEATURE_BEACON_PROTECTION = 41,\n\tNL80211_EXT_FEATURE_CONTROL_PORT_NO_PREAUTH = 42,\n\tNL80211_EXT_FEATURE_PROTECTED_TWT = 43,\n\tNL80211_EXT_FEATURE_DEL_IBSS_STA = 44,\n\tNL80211_EXT_FEATURE_MULTICAST_REGISTRATIONS = 45,\n\tNL80211_EXT_FEATURE_BEACON_PROTECTION_CLIENT = 46,\n\tNL80211_EXT_FEATURE_SCAN_FREQ_KHZ = 47,\n\tNL80211_EXT_FEATURE_CONTROL_PORT_OVER_NL80211_TX_STATUS = 48,\n\tNL80211_EXT_FEATURE_OPERATING_CHANNEL_VALIDATION = 49,\n\tNL80211_EXT_FEATURE_4WAY_HANDSHAKE_AP_PSK = 50,\n\tNL80211_EXT_FEATURE_SAE_OFFLOAD_AP = 51,\n\tNL80211_EXT_FEATURE_FILS_DISCOVERY = 52,\n\tNL80211_EXT_FEATURE_UNSOL_BCAST_PROBE_RESP = 53,\n\tNL80211_EXT_FEATURE_BEACON_RATE_HE = 54,\n\tNL80211_EXT_FEATURE_SECURE_LTF = 55,\n\tNL80211_EXT_FEATURE_SECURE_RTT = 56,\n\tNL80211_EXT_FEATURE_PROT_RANGE_NEGO_AND_MEASURE = 57,\n\tNL80211_EXT_FEATURE_BSS_COLOR = 58,\n\tNL80211_EXT_FEATURE_FILS_CRYPTO_OFFLOAD = 59,\n\tNL80211_EXT_FEATURE_RADAR_BACKGROUND = 60,\n\tNL80211_EXT_FEATURE_POWERED_ADDR_CHANGE = 61,\n\tNL80211_EXT_FEATURE_PUNCT = 62,\n\tNL80211_EXT_FEATURE_SECURE_NAN = 63,\n\tNL80211_EXT_FEATURE_AUTH_AND_DEAUTH_RANDOM_TA = 64,\n\tNL80211_EXT_FEATURE_OWE_OFFLOAD = 65,\n\tNL80211_EXT_FEATURE_OWE_OFFLOAD_AP = 66,\n\tNL80211_EXT_FEATURE_DFS_CONCURRENT = 67,\n\tNL80211_EXT_FEATURE_SPP_AMSDU_SUPPORT = 68,\n\tNUM_NL80211_EXT_FEATURES = 69,\n\tMAX_NL80211_EXT_FEATURES = 68,\n};\n\nenum nl80211_iftype {\n\tNL80211_IFTYPE_UNSPECIFIED = 0,\n\tNL80211_IFTYPE_ADHOC = 1,\n\tNL80211_IFTYPE_STATION = 2,\n\tNL80211_IFTYPE_AP = 3,\n\tNL80211_IFTYPE_AP_VLAN = 4,\n\tNL80211_IFTYPE_WDS = 5,\n\tNL80211_IFTYPE_MONITOR = 6,\n\tNL80211_IFTYPE_MESH_POINT = 7,\n\tNL80211_IFTYPE_P2P_CLIENT = 8,\n\tNL80211_IFTYPE_P2P_GO = 9,\n\tNL80211_IFTYPE_P2P_DEVICE = 10,\n\tNL80211_IFTYPE_OCB = 11,\n\tNL80211_IFTYPE_NAN = 12,\n\tNUM_NL80211_IFTYPES = 13,\n\tNL80211_IFTYPE_MAX = 12,\n};\n\nenum nl80211_key_mode {\n\tNL80211_KEY_RX_TX = 0,\n\tNL80211_KEY_NO_TX = 1,\n\tNL80211_KEY_SET_TX = 2,\n};\n\nenum nl80211_mfp {\n\tNL80211_MFP_NO = 0,\n\tNL80211_MFP_REQUIRED = 1,\n\tNL80211_MFP_OPTIONAL = 2,\n};\n\nenum nl80211_mntr_flags {\n\t__NL80211_MNTR_FLAG_INVALID = 0,\n\tNL80211_MNTR_FLAG_FCSFAIL = 1,\n\tNL80211_MNTR_FLAG_PLCPFAIL = 2,\n\tNL80211_MNTR_FLAG_CONTROL = 3,\n\tNL80211_MNTR_FLAG_OTHER_BSS = 4,\n\tNL80211_MNTR_FLAG_COOK_FRAMES = 5,\n\tNL80211_MNTR_FLAG_ACTIVE = 6,\n\t__NL80211_MNTR_FLAG_AFTER_LAST = 7,\n\tNL80211_MNTR_FLAG_MAX = 6,\n};\n\nenum nl80211_reg_initiator {\n\tNL80211_REGDOM_SET_BY_CORE = 0,\n\tNL80211_REGDOM_SET_BY_USER = 1,\n\tNL80211_REGDOM_SET_BY_DRIVER = 2,\n\tNL80211_REGDOM_SET_BY_COUNTRY_IE = 3,\n};\n\nenum nl80211_sae_pwe_mechanism {\n\tNL80211_SAE_PWE_UNSPECIFIED = 0,\n\tNL80211_SAE_PWE_HUNT_AND_PECK = 1,\n\tNL80211_SAE_PWE_HASH_TO_ELEMENT = 2,\n\tNL80211_SAE_PWE_BOTH = 3,\n};\n\nenum nl80211_sar_type {\n\tNL80211_SAR_TYPE_POWER = 0,\n\tNUM_NL80211_SAR_TYPE = 1,\n};\n\nenum nl80211_user_reg_hint_type {\n\tNL80211_USER_REG_HINT_USER = 0,\n\tNL80211_USER_REG_HINT_CELL_BASE = 1,\n\tNL80211_USER_REG_HINT_INDOOR = 2,\n};\n\nenum nl802154_cca_modes {\n\t__NL802154_CCA_INVALID = 0,\n\tNL802154_CCA_ENERGY = 1,\n\tNL802154_CCA_CARRIER = 2,\n\tNL802154_CCA_ENERGY_CARRIER = 3,\n\tNL802154_CCA_ALOHA = 4,\n\tNL802154_CCA_UWB_SHR = 5,\n\tNL802154_CCA_UWB_MULTIPLEXED = 6,\n\t__NL802154_CCA_ATTR_AFTER_LAST = 7,\n\tNL802154_CCA_ATTR_MAX = 6,\n};\n\nenum nl802154_cca_opts {\n\tNL802154_CCA_OPT_ENERGY_CARRIER_AND = 0,\n\tNL802154_CCA_OPT_ENERGY_CARRIER_OR = 1,\n\t__NL802154_CCA_OPT_ATTR_AFTER_LAST = 2,\n\tNL802154_CCA_OPT_ATTR_MAX = 1,\n};\n\nenum nl802154_supported_bool_states {\n\tNL802154_SUPPORTED_BOOL_FALSE = 0,\n\tNL802154_SUPPORTED_BOOL_TRUE = 1,\n\t__NL802154_SUPPORTED_BOOL_INVALD = 2,\n\tNL802154_SUPPORTED_BOOL_BOTH = 3,\n\t__NL802154_SUPPORTED_BOOL_AFTER_LAST = 4,\n\tNL802154_SUPPORTED_BOOL_MAX = 3,\n};\n\nenum nla_policy_validation {\n\tNLA_VALIDATE_NONE = 0,\n\tNLA_VALIDATE_RANGE = 1,\n\tNLA_VALIDATE_RANGE_WARN_TOO_LONG = 2,\n\tNLA_VALIDATE_MIN = 3,\n\tNLA_VALIDATE_MAX = 4,\n\tNLA_VALIDATE_MASK = 5,\n\tNLA_VALIDATE_RANGE_PTR = 6,\n\tNLA_VALIDATE_FUNCTION = 7,\n};\n\nenum nlmsgerr_attrs {\n\tNLMSGERR_ATTR_UNUSED = 0,\n\tNLMSGERR_ATTR_MSG = 1,\n\tNLMSGERR_ATTR_OFFS = 2,\n\tNLMSGERR_ATTR_COOKIE = 3,\n\tNLMSGERR_ATTR_POLICY = 4,\n\tNLMSGERR_ATTR_MISS_TYPE = 5,\n\tNLMSGERR_ATTR_MISS_NEST = 6,\n\t__NLMSGERR_ATTR_MAX = 7,\n\tNLMSGERR_ATTR_MAX = 6,\n};\n\nenum nmi_states {\n\tNMI_NOT_RUNNING = 0,\n\tNMI_EXECUTING = 1,\n\tNMI_LATCHED = 2,\n};\n\nenum node_stat_item {\n\tNR_LRU_BASE = 0,\n\tNR_INACTIVE_ANON = 0,\n\tNR_ACTIVE_ANON = 1,\n\tNR_INACTIVE_FILE = 2,\n\tNR_ACTIVE_FILE = 3,\n\tNR_UNEVICTABLE = 4,\n\tNR_SLAB_RECLAIMABLE_B = 5,\n\tNR_SLAB_UNRECLAIMABLE_B = 6,\n\tNR_ISOLATED_ANON = 7,\n\tNR_ISOLATED_FILE = 8,\n\tWORKINGSET_NODES = 9,\n\tWORKINGSET_REFAULT_BASE = 10,\n\tWORKINGSET_REFAULT_ANON = 10,\n\tWORKINGSET_REFAULT_FILE = 11,\n\tWORKINGSET_ACTIVATE_BASE = 12,\n\tWORKINGSET_ACTIVATE_ANON = 12,\n\tWORKINGSET_ACTIVATE_FILE = 13,\n\tWORKINGSET_RESTORE_BASE = 14,\n\tWORKINGSET_RESTORE_ANON = 14,\n\tWORKINGSET_RESTORE_FILE = 15,\n\tWORKINGSET_NODERECLAIM = 16,\n\tNR_ANON_MAPPED = 17,\n\tNR_FILE_MAPPED = 18,\n\tNR_FILE_PAGES = 19,\n\tNR_FILE_DIRTY = 20,\n\tNR_WRITEBACK = 21,\n\tNR_WRITEBACK_TEMP = 22,\n\tNR_SHMEM = 23,\n\tNR_SHMEM_THPS = 24,\n\tNR_SHMEM_PMDMAPPED = 25,\n\tNR_FILE_THPS = 26,\n\tNR_FILE_PMDMAPPED = 27,\n\tNR_ANON_THPS = 28,\n\tNR_VMSCAN_WRITE = 29,\n\tNR_VMSCAN_IMMEDIATE = 30,\n\tNR_DIRTIED = 31,\n\tNR_WRITTEN = 32,\n\tNR_THROTTLED_WRITTEN = 33,\n\tNR_KERNEL_MISC_RECLAIMABLE = 34,\n\tNR_FOLL_PIN_ACQUIRED = 35,\n\tNR_FOLL_PIN_RELEASED = 36,\n\tNR_KERNEL_STACK_KB = 37,\n\tNR_PAGETABLE = 38,\n\tNR_SECONDARY_PAGETABLE = 39,\n\tNR_IOMMU_PAGES = 40,\n\tNR_SWAPCACHE = 41,\n\tPGPROMOTE_SUCCESS = 42,\n\tPGPROMOTE_CANDIDATE = 43,\n\tPGDEMOTE_KSWAPD = 44,\n\tPGDEMOTE_DIRECT = 45,\n\tPGDEMOTE_KHUGEPAGED = 46,\n\tNR_VM_NODE_STAT_ITEMS = 47,\n};\n\nenum node_states {\n\tN_POSSIBLE = 0,\n\tN_ONLINE = 1,\n\tN_NORMAL_MEMORY = 2,\n\tN_HIGH_MEMORY = 2,\n\tN_MEMORY = 3,\n\tN_CPU = 4,\n\tN_GENERIC_INITIATOR = 5,\n\tNR_NODE_STATES = 6,\n};\n\nenum notify_state {\n\tSECCOMP_NOTIFY_INIT = 0,\n\tSECCOMP_NOTIFY_SENT = 1,\n\tSECCOMP_NOTIFY_REPLIED = 2,\n};\n\nenum numa_faults_stats {\n\tNUMA_MEM = 0,\n\tNUMA_CPU = 1,\n\tNUMA_MEMBUF = 2,\n\tNUMA_CPUBUF = 3,\n};\n\nenum numa_stat_item {\n\tNUMA_HIT = 0,\n\tNUMA_MISS = 1,\n\tNUMA_FOREIGN = 2,\n\tNUMA_INTERLEAVE_HIT = 3,\n\tNUMA_LOCAL = 4,\n\tNUMA_OTHER = 5,\n\tNR_VM_NUMA_EVENT_ITEMS = 6,\n};\n\nenum numa_topology_type {\n\tNUMA_DIRECT = 0,\n\tNUMA_GLUELESS_MESH = 1,\n\tNUMA_BACKPLANE = 2,\n};\n\nenum numa_type {\n\tnode_has_spare = 0,\n\tnode_fully_busy = 1,\n\tnode_overloaded = 2,\n};\n\nenum numa_vmaskip_reason {\n\tNUMAB_SKIP_UNSUITABLE = 0,\n\tNUMAB_SKIP_SHARED_RO = 1,\n\tNUMAB_SKIP_INACCESSIBLE = 2,\n\tNUMAB_SKIP_SCAN_DELAY = 3,\n\tNUMAB_SKIP_PID_INACTIVE = 4,\n\tNUMAB_SKIP_IGNORE_PID = 5,\n\tNUMAB_SKIP_SEQ_COMPLETED = 6,\n};\n\nenum nvdimm_claim_class {\n\tNVDIMM_CCLASS_NONE = 0,\n\tNVDIMM_CCLASS_BTT = 1,\n\tNVDIMM_CCLASS_BTT2 = 2,\n\tNVDIMM_CCLASS_PFN = 3,\n\tNVDIMM_CCLASS_DAX = 4,\n\tNVDIMM_CCLASS_UNKNOWN = 5,\n};\n\nenum nvdimm_event {\n\tNVDIMM_REVALIDATE_POISON = 0,\n\tNVDIMM_REVALIDATE_REGION = 1,\n};\n\nenum nvdimm_fwa_capability {\n\tNVDIMM_FWA_CAP_INVALID = 0,\n\tNVDIMM_FWA_CAP_NONE = 1,\n\tNVDIMM_FWA_CAP_QUIESCE = 2,\n\tNVDIMM_FWA_CAP_LIVE = 3,\n};\n\nenum nvdimm_fwa_result {\n\tNVDIMM_FWA_RESULT_INVALID = 0,\n\tNVDIMM_FWA_RESULT_NONE = 1,\n\tNVDIMM_FWA_RESULT_SUCCESS = 2,\n\tNVDIMM_FWA_RESULT_NOTSTAGED = 3,\n\tNVDIMM_FWA_RESULT_NEEDRESET = 4,\n\tNVDIMM_FWA_RESULT_FAIL = 5,\n};\n\nenum nvdimm_fwa_state {\n\tNVDIMM_FWA_INVALID = 0,\n\tNVDIMM_FWA_IDLE = 1,\n\tNVDIMM_FWA_ARMED = 2,\n\tNVDIMM_FWA_BUSY = 3,\n\tNVDIMM_FWA_ARM_OVERFLOW = 4,\n};\n\nenum nvdimm_fwa_trigger {\n\tNVDIMM_FWA_ARM = 0,\n\tNVDIMM_FWA_DISARM = 1,\n};\n\nenum nvdimm_passphrase_type {\n\tNVDIMM_USER = 0,\n\tNVDIMM_MASTER = 1,\n};\n\nenum nvdimm_security_bits {\n\tNVDIMM_SECURITY_DISABLED = 0,\n\tNVDIMM_SECURITY_UNLOCKED = 1,\n\tNVDIMM_SECURITY_LOCKED = 2,\n\tNVDIMM_SECURITY_FROZEN = 3,\n\tNVDIMM_SECURITY_OVERWRITE = 4,\n};\n\nenum nvdimmsec_op_ids {\n\tOP_FREEZE = 0,\n\tOP_DISABLE = 1,\n\tOP_DISABLE_MASTER = 2,\n\tOP_UPDATE = 3,\n\tOP_ERASE = 4,\n\tOP_OVERWRITE = 5,\n\tOP_MASTER_UPDATE = 6,\n\tOP_MASTER_ERASE = 7,\n};\n\nenum nvmem_type {\n\tNVMEM_TYPE_UNKNOWN = 0,\n\tNVMEM_TYPE_EEPROM = 1,\n\tNVMEM_TYPE_OTP = 2,\n\tNVMEM_TYPE_BATTERY_BACKED = 3,\n\tNVMEM_TYPE_FRAM = 4,\n};\n\nenum objext_flags {\n\tOBJEXTS_ALLOC_FAIL = 4,\n\t__NR_OBJEXTS_FLAGS = 8,\n};\n\nenum odd_mech_type {\n\tODD_MECH_TYPE_SLOT = 0,\n\tODD_MECH_TYPE_DRAWER = 1,\n\tODD_MECH_TYPE_UNSUPPORTED = 2,\n};\n\nenum offload_act_command {\n\tFLOW_ACT_REPLACE = 0,\n\tFLOW_ACT_DESTROY = 1,\n\tFLOW_ACT_STATS = 2,\n};\n\nenum ohci_rh_state {\n\tOHCI_RH_HALTED = 0,\n\tOHCI_RH_SUSPENDED = 1,\n\tOHCI_RH_RUNNING = 2,\n};\n\nenum oom_constraint {\n\tCONSTRAINT_NONE = 0,\n\tCONSTRAINT_CPUSET = 1,\n\tCONSTRAINT_MEMORY_POLICY = 2,\n\tCONSTRAINT_MEMCG = 3,\n};\n\nenum opal_atom_width {\n\tOPAL_WIDTH_TINY = 0,\n\tOPAL_WIDTH_SHORT = 1,\n\tOPAL_WIDTH_MEDIUM = 2,\n\tOPAL_WIDTH_LONG = 3,\n\tOPAL_WIDTH_TOKEN = 4,\n};\n\nenum opal_key_type {\n\tOPAL_INCLUDED = 0,\n\tOPAL_KEYRING = 1,\n};\n\nenum opal_lock_flags {\n\tOPAL_SAVE_FOR_LOCK = 1,\n};\n\nenum opal_lock_state {\n\tOPAL_RO = 1,\n\tOPAL_RW = 2,\n\tOPAL_LK = 4,\n};\n\nenum opal_mbr {\n\tOPAL_MBR_ENABLE = 0,\n\tOPAL_MBR_DISABLE = 1,\n};\n\nenum opal_mbr_done_flag {\n\tOPAL_MBR_NOT_DONE = 0,\n\tOPAL_MBR_DONE = 1,\n};\n\nenum opal_method {\n\tOPAL_PROPERTIES = 0,\n\tOPAL_STARTSESSION = 1,\n\tOPAL_REVERT = 2,\n\tOPAL_ACTIVATE = 3,\n\tOPAL_EGET = 4,\n\tOPAL_ESET = 5,\n\tOPAL_NEXT = 6,\n\tOPAL_EAUTHENTICATE = 7,\n\tOPAL_GETACL = 8,\n\tOPAL_GENKEY = 9,\n\tOPAL_REVERTSP = 10,\n\tOPAL_GET = 11,\n\tOPAL_SET = 12,\n\tOPAL_AUTHENTICATE = 13,\n\tOPAL_RANDOM = 14,\n\tOPAL_ERASE = 15,\n};\n\nenum opal_parameter {\n\tOPAL_SUM_SET_LIST = 393216,\n};\n\nenum opal_response_token {\n\tOPAL_DTA_TOKENID_BYTESTRING = 224,\n\tOPAL_DTA_TOKENID_SINT = 225,\n\tOPAL_DTA_TOKENID_UINT = 226,\n\tOPAL_DTA_TOKENID_TOKEN = 227,\n\tOPAL_DTA_TOKENID_INVALID = 0,\n};\n\nenum opal_revert_lsp_opts {\n\tOPAL_PRESERVE = 1,\n};\n\nenum opal_revertlsp {\n\tOPAL_KEEP_GLOBAL_RANGE_KEY = 393216,\n};\n\nenum opal_table_ops {\n\tOPAL_READ_TABLE = 0,\n\tOPAL_WRITE_TABLE = 1,\n};\n\nenum opal_token {\n\tOPAL_TRUE = 1,\n\tOPAL_FALSE = 0,\n\tOPAL_BOOLEAN_EXPR = 3,\n\tOPAL_TABLE = 0,\n\tOPAL_STARTROW = 1,\n\tOPAL_ENDROW = 2,\n\tOPAL_STARTCOLUMN = 3,\n\tOPAL_ENDCOLUMN = 4,\n\tOPAL_VALUES = 1,\n\tOPAL_TABLE_UID = 0,\n\tOPAL_TABLE_NAME = 1,\n\tOPAL_TABLE_COMMON = 2,\n\tOPAL_TABLE_TEMPLATE = 3,\n\tOPAL_TABLE_KIND = 4,\n\tOPAL_TABLE_COLUMN = 5,\n\tOPAL_TABLE_COLUMNS = 6,\n\tOPAL_TABLE_ROWS = 7,\n\tOPAL_TABLE_ROWS_FREE = 8,\n\tOPAL_TABLE_ROW_BYTES = 9,\n\tOPAL_TABLE_LASTID = 10,\n\tOPAL_TABLE_MIN = 11,\n\tOPAL_TABLE_MAX = 12,\n\tOPAL_PIN = 3,\n\tOPAL_RANGESTART = 3,\n\tOPAL_RANGELENGTH = 4,\n\tOPAL_READLOCKENABLED = 5,\n\tOPAL_WRITELOCKENABLED = 6,\n\tOPAL_READLOCKED = 7,\n\tOPAL_WRITELOCKED = 8,\n\tOPAL_ACTIVEKEY = 10,\n\tOPAL_LIFECYCLE = 6,\n\tOPAL_MAXRANGES = 4,\n\tOPAL_MBRENABLE = 1,\n\tOPAL_MBRDONE = 2,\n\tOPAL_HOSTPROPERTIES = 0,\n\tOPAL_STARTLIST = 240,\n\tOPAL_ENDLIST = 241,\n\tOPAL_STARTNAME = 242,\n\tOPAL_ENDNAME = 243,\n\tOPAL_CALL = 248,\n\tOPAL_ENDOFDATA = 249,\n\tOPAL_ENDOFSESSION = 250,\n\tOPAL_STARTTRANSACTON = 251,\n\tOPAL_ENDTRANSACTON = 252,\n\tOPAL_EMPTYATOM = 255,\n\tOPAL_WHERE = 0,\n};\n\nenum opal_uid {\n\tOPAL_SMUID_UID = 0,\n\tOPAL_THISSP_UID = 1,\n\tOPAL_ADMINSP_UID = 2,\n\tOPAL_LOCKINGSP_UID = 3,\n\tOPAL_ENTERPRISE_LOCKINGSP_UID = 4,\n\tOPAL_ANYBODY_UID = 5,\n\tOPAL_SID_UID = 6,\n\tOPAL_ADMIN1_UID = 7,\n\tOPAL_USER1_UID = 8,\n\tOPAL_USER2_UID = 9,\n\tOPAL_PSID_UID = 10,\n\tOPAL_ENTERPRISE_BANDMASTER0_UID = 11,\n\tOPAL_ENTERPRISE_ERASEMASTER_UID = 12,\n\tOPAL_TABLE_TABLE = 13,\n\tOPAL_LOCKINGRANGE_GLOBAL = 14,\n\tOPAL_LOCKINGRANGE_ACE_START_TO_KEY = 15,\n\tOPAL_LOCKINGRANGE_ACE_RDLOCKED = 16,\n\tOPAL_LOCKINGRANGE_ACE_WRLOCKED = 17,\n\tOPAL_MBRCONTROL = 18,\n\tOPAL_MBR = 19,\n\tOPAL_AUTHORITY_TABLE = 20,\n\tOPAL_C_PIN_TABLE = 21,\n\tOPAL_LOCKING_INFO_TABLE = 22,\n\tOPAL_ENTERPRISE_LOCKING_INFO_TABLE = 23,\n\tOPAL_DATASTORE = 24,\n\tOPAL_C_PIN_MSID = 25,\n\tOPAL_C_PIN_SID = 26,\n\tOPAL_C_PIN_ADMIN1 = 27,\n\tOPAL_HALF_UID_AUTHORITY_OBJ_REF = 28,\n\tOPAL_HALF_UID_BOOLEAN_ACE = 29,\n\tOPAL_UID_HEXFF = 30,\n};\n\nenum opal_user {\n\tOPAL_ADMIN1 = 0,\n\tOPAL_USER1 = 1,\n\tOPAL_USER2 = 2,\n\tOPAL_USER3 = 3,\n\tOPAL_USER4 = 4,\n\tOPAL_USER5 = 5,\n\tOPAL_USER6 = 6,\n\tOPAL_USER7 = 7,\n\tOPAL_USER8 = 8,\n\tOPAL_USER9 = 9,\n};\n\nenum opp_table_access {\n\tOPP_TABLE_ACCESS_UNKNOWN = 0,\n\tOPP_TABLE_ACCESS_EXCLUSIVE = 1,\n\tOPP_TABLE_ACCESS_SHARED = 2,\n};\n\nenum osnoise_options_index {\n\tOSN_DEFAULTS = 0,\n\tOSN_WORKLOAD = 1,\n\tOSN_PANIC_ON_STOP = 2,\n\tOSN_PREEMPT_DISABLE = 3,\n\tOSN_IRQ_DISABLE = 4,\n\tOSN_MAX = 5,\n};\n\nenum owner_state {\n\tOWNER_NULL = 1,\n\tOWNER_WRITER = 2,\n\tOWNER_READER = 4,\n\tOWNER_NONSPINNABLE = 8,\n};\n\nenum packet_sock_flags {\n\tPACKET_SOCK_ORIGDEV = 0,\n\tPACKET_SOCK_AUXDATA = 1,\n\tPACKET_SOCK_TX_HAS_OFF = 2,\n\tPACKET_SOCK_TP_LOSS = 3,\n\tPACKET_SOCK_RUNNING = 4,\n\tPACKET_SOCK_PRESSURE = 5,\n\tPACKET_SOCK_QDISC_BYPASS = 6,\n};\n\nenum packing_op {\n\tPACK = 0,\n\tUNPACK = 1,\n};\n\nenum page_cache_mode {\n\t_PAGE_CACHE_MODE_WB = 0,\n\t_PAGE_CACHE_MODE_WC = 1,\n\t_PAGE_CACHE_MODE_UC_MINUS = 2,\n\t_PAGE_CACHE_MODE_UC = 3,\n\t_PAGE_CACHE_MODE_WT = 4,\n\t_PAGE_CACHE_MODE_WP = 5,\n\t_PAGE_CACHE_MODE_NUM = 8,\n};\n\nenum page_memcg_data_flags {\n\tMEMCG_DATA_OBJEXTS = 1,\n\tMEMCG_DATA_KMEM = 2,\n\t__NR_MEMCG_DATA_FLAGS = 4,\n};\n\nenum page_size_enum {\n\t__PAGE_SIZE = 4096,\n};\n\nenum page_walk_action {\n\tACTION_SUBTREE = 0,\n\tACTION_CONTINUE = 1,\n\tACTION_AGAIN = 2,\n};\n\nenum page_walk_lock {\n\tPGWALK_RDLOCK = 0,\n\tPGWALK_WRLOCK = 1,\n\tPGWALK_WRLOCK_VERIFY = 2,\n};\n\nenum pageblock_bits {\n\tPB_migrate = 0,\n\tPB_migrate_end = 2,\n\tPB_migrate_skip = 3,\n\tNR_PAGEBLOCK_BITS = 4,\n};\n\nenum pageflags {\n\tPG_locked = 0,\n\tPG_writeback = 1,\n\tPG_referenced = 2,\n\tPG_uptodate = 3,\n\tPG_dirty = 4,\n\tPG_lru = 5,\n\tPG_head = 6,\n\tPG_waiters = 7,\n\tPG_active = 8,\n\tPG_workingset = 9,\n\tPG_error = 10,\n\tPG_owner_priv_1 = 11,\n\tPG_arch_1 = 12,\n\tPG_reserved = 13,\n\tPG_private = 14,\n\tPG_private_2 = 15,\n\tPG_mappedtodisk = 16,\n\tPG_reclaim = 17,\n\tPG_swapbacked = 18,\n\tPG_unevictable = 19,\n\tPG_mlocked = 20,\n\tPG_uncached = 21,\n\tPG_hwpoison = 22,\n\tPG_young = 23,\n\tPG_idle = 24,\n\t__NR_PAGEFLAGS = 25,\n\tPG_readahead = 17,\n\tPG_anon_exclusive = 16,\n\tPG_checked = 11,\n\tPG_swapcache = 11,\n\tPG_fscache = 15,\n\tPG_pinned = 11,\n\tPG_savepinned = 4,\n\tPG_foreign = 11,\n\tPG_xen_remapped = 11,\n\tPG_isolated = 17,\n\tPG_reported = 3,\n\tPG_vmemmap_self_hosted = 11,\n\tPG_has_hwpoisoned = 10,\n\tPG_large_rmappable = 9,\n};\n\nenum pagetype {\n\tPG_buddy = 1073741824LL,\n\tPG_offline = 536870912LL,\n\tPG_table = 268435456LL,\n\tPG_guard = 134217728LL,\n\tPG_hugetlb = 67108864LL,\n\tPG_slab = 33554432LL,\n\tPG_zsmalloc = 16777216LL,\n\tPAGE_TYPE_BASE = 2147483648LL,\n\tPAGE_MAPCOUNT_RESERVE = -65536LL,\n};\n\nenum palmas_external_requestor_id {\n\tPALMAS_EXTERNAL_REQSTR_ID_REGEN1 = 0,\n\tPALMAS_EXTERNAL_REQSTR_ID_REGEN2 = 1,\n\tPALMAS_EXTERNAL_REQSTR_ID_SYSEN1 = 2,\n\tPALMAS_EXTERNAL_REQSTR_ID_SYSEN2 = 3,\n\tPALMAS_EXTERNAL_REQSTR_ID_CLK32KG = 4,\n\tPALMAS_EXTERNAL_REQSTR_ID_CLK32KGAUDIO = 5,\n\tPALMAS_EXTERNAL_REQSTR_ID_REGEN3 = 6,\n\tPALMAS_EXTERNAL_REQSTR_ID_SMPS12 = 7,\n\tPALMAS_EXTERNAL_REQSTR_ID_SMPS3 = 8,\n\tPALMAS_EXTERNAL_REQSTR_ID_SMPS45 = 9,\n\tPALMAS_EXTERNAL_REQSTR_ID_SMPS6 = 10,\n\tPALMAS_EXTERNAL_REQSTR_ID_SMPS7 = 11,\n\tPALMAS_EXTERNAL_REQSTR_ID_SMPS8 = 12,\n\tPALMAS_EXTERNAL_REQSTR_ID_SMPS9 = 13,\n\tPALMAS_EXTERNAL_REQSTR_ID_SMPS10 = 14,\n\tPALMAS_EXTERNAL_REQSTR_ID_LDO1 = 15,\n\tPALMAS_EXTERNAL_REQSTR_ID_LDO2 = 16,\n\tPALMAS_EXTERNAL_REQSTR_ID_LDO3 = 17,\n\tPALMAS_EXTERNAL_REQSTR_ID_LDO4 = 18,\n\tPALMAS_EXTERNAL_REQSTR_ID_LDO5 = 19,\n\tPALMAS_EXTERNAL_REQSTR_ID_LDO6 = 20,\n\tPALMAS_EXTERNAL_REQSTR_ID_LDO7 = 21,\n\tPALMAS_EXTERNAL_REQSTR_ID_LDO8 = 22,\n\tPALMAS_EXTERNAL_REQSTR_ID_LDO9 = 23,\n\tPALMAS_EXTERNAL_REQSTR_ID_LDOLN = 24,\n\tPALMAS_EXTERNAL_REQSTR_ID_LDOUSB = 25,\n\tPALMAS_EXTERNAL_REQSTR_ID_MAX = 26,\n};\n\nenum palmas_irqs {\n\tPALMAS_CHARG_DET_N_VBUS_OVV_IRQ = 0,\n\tPALMAS_PWRON_IRQ = 1,\n\tPALMAS_LONG_PRESS_KEY_IRQ = 2,\n\tPALMAS_RPWRON_IRQ = 3,\n\tPALMAS_PWRDOWN_IRQ = 4,\n\tPALMAS_HOTDIE_IRQ = 5,\n\tPALMAS_VSYS_MON_IRQ = 6,\n\tPALMAS_VBAT_MON_IRQ = 7,\n\tPALMAS_RTC_ALARM_IRQ = 8,\n\tPALMAS_RTC_TIMER_IRQ = 9,\n\tPALMAS_WDT_IRQ = 10,\n\tPALMAS_BATREMOVAL_IRQ = 11,\n\tPALMAS_RESET_IN_IRQ = 12,\n\tPALMAS_FBI_BB_IRQ = 13,\n\tPALMAS_SHORT_IRQ = 14,\n\tPALMAS_VAC_ACOK_IRQ = 15,\n\tPALMAS_GPADC_AUTO_0_IRQ = 16,\n\tPALMAS_GPADC_AUTO_1_IRQ = 17,\n\tPALMAS_GPADC_EOC_SW_IRQ = 18,\n\tPALMAS_GPADC_EOC_RT_IRQ = 19,\n\tPALMAS_ID_OTG_IRQ = 20,\n\tPALMAS_ID_IRQ = 21,\n\tPALMAS_VBUS_OTG_IRQ = 22,\n\tPALMAS_VBUS_IRQ = 23,\n\tPALMAS_GPIO_0_IRQ = 24,\n\tPALMAS_GPIO_1_IRQ = 25,\n\tPALMAS_GPIO_2_IRQ = 26,\n\tPALMAS_GPIO_3_IRQ = 27,\n\tPALMAS_GPIO_4_IRQ = 28,\n\tPALMAS_GPIO_5_IRQ = 29,\n\tPALMAS_GPIO_6_IRQ = 30,\n\tPALMAS_GPIO_7_IRQ = 31,\n\tPALMAS_NUM_IRQ = 32,\n};\n\nenum palmas_regulators {\n\tPALMAS_REG_SMPS12 = 0,\n\tPALMAS_REG_SMPS123 = 1,\n\tPALMAS_REG_SMPS3 = 2,\n\tPALMAS_REG_SMPS45 = 3,\n\tPALMAS_REG_SMPS457 = 4,\n\tPALMAS_REG_SMPS6 = 5,\n\tPALMAS_REG_SMPS7 = 6,\n\tPALMAS_REG_SMPS8 = 7,\n\tPALMAS_REG_SMPS9 = 8,\n\tPALMAS_REG_SMPS10_OUT2 = 9,\n\tPALMAS_REG_SMPS10_OUT1 = 10,\n\tPALMAS_REG_LDO1 = 11,\n\tPALMAS_REG_LDO2 = 12,\n\tPALMAS_REG_LDO3 = 13,\n\tPALMAS_REG_LDO4 = 14,\n\tPALMAS_REG_LDO5 = 15,\n\tPALMAS_REG_LDO6 = 16,\n\tPALMAS_REG_LDO7 = 17,\n\tPALMAS_REG_LDO8 = 18,\n\tPALMAS_REG_LDO9 = 19,\n\tPALMAS_REG_LDOLN = 20,\n\tPALMAS_REG_LDOUSB = 21,\n\tPALMAS_REG_REGEN1 = 22,\n\tPALMAS_REG_REGEN2 = 23,\n\tPALMAS_REG_REGEN3 = 24,\n\tPALMAS_REG_SYSEN1 = 25,\n\tPALMAS_REG_SYSEN2 = 26,\n\tPALMAS_NUM_REGS = 27,\n};\n\nenum palmas_usb_state {\n\tPALMAS_USB_STATE_DISCONNECT = 0,\n\tPALMAS_USB_STATE_VBUS = 1,\n\tPALMAS_USB_STATE_ID = 2,\n};\n\nenum partition_cmd {\n\tpartcmd_enable = 0,\n\tpartcmd_enablei = 1,\n\tpartcmd_disable = 2,\n\tpartcmd_update = 3,\n\tpartcmd_invalidate = 4,\n};\n\nenum passtype {\n\tPASS_SCAN = 0,\n\tPASS_REVOKE = 1,\n\tPASS_REPLAY = 2,\n};\n\nenum path_flags {\n\tPATH_IS_DIR = 1,\n\tPATH_SOCK_COND = 2,\n\tPATH_CONNECT_PATH = 4,\n\tPATH_CHROOT_REL = 8,\n\tPATH_CHROOT_NSCONNECT = 16,\n\tPATH_DELEGATE_DELETED = 65536,\n\tPATH_MEDIATE_DELETED = 131072,\n};\n\nenum pce_status {\n\tPCE_STATUS_NONE = 0,\n\tPCE_STATUS_ACQUIRED = 1,\n\tPCE_STATUS_PREPARED = 2,\n\tPCE_STATUS_ENABLED = 3,\n\tPCE_STATUS_ERROR = 4,\n};\n\nenum pci_bar_type {\n\tpci_bar_unknown = 0,\n\tpci_bar_io = 1,\n\tpci_bar_mem32 = 2,\n\tpci_bar_mem64 = 3,\n};\n\nenum pci_barno {\n\tNO_BAR = -1,\n\tBAR_0 = 0,\n\tBAR_1 = 1,\n\tBAR_2 = 2,\n\tBAR_3 = 3,\n\tBAR_4 = 4,\n\tBAR_5 = 5,\n};\n\nenum pci_bf_sort_state {\n\tpci_bf_sort_default = 0,\n\tpci_force_nobf = 1,\n\tpci_force_bf = 2,\n\tpci_dmi_bf = 3,\n};\n\nenum pci_board_num_t {\n\tpbn_default = 0,\n\tpbn_b0_1_115200 = 1,\n\tpbn_b0_2_115200 = 2,\n\tpbn_b0_4_115200 = 3,\n\tpbn_b0_5_115200 = 4,\n\tpbn_b0_8_115200 = 5,\n\tpbn_b0_1_921600 = 6,\n\tpbn_b0_2_921600 = 7,\n\tpbn_b0_4_921600 = 8,\n\tpbn_b0_2_1130000 = 9,\n\tpbn_b0_4_1152000 = 10,\n\tpbn_b0_4_1250000 = 11,\n\tpbn_b0_2_1843200 = 12,\n\tpbn_b0_4_1843200 = 13,\n\tpbn_b0_1_15625000 = 14,\n\tpbn_b0_bt_1_115200 = 15,\n\tpbn_b0_bt_2_115200 = 16,\n\tpbn_b0_bt_4_115200 = 17,\n\tpbn_b0_bt_8_115200 = 18,\n\tpbn_b0_bt_1_460800 = 19,\n\tpbn_b0_bt_2_460800 = 20,\n\tpbn_b0_bt_4_460800 = 21,\n\tpbn_b0_bt_1_921600 = 22,\n\tpbn_b0_bt_2_921600 = 23,\n\tpbn_b0_bt_4_921600 = 24,\n\tpbn_b0_bt_8_921600 = 25,\n\tpbn_b1_1_115200 = 26,\n\tpbn_b1_2_115200 = 27,\n\tpbn_b1_4_115200 = 28,\n\tpbn_b1_8_115200 = 29,\n\tpbn_b1_16_115200 = 30,\n\tpbn_b1_1_921600 = 31,\n\tpbn_b1_2_921600 = 32,\n\tpbn_b1_4_921600 = 33,\n\tpbn_b1_8_921600 = 34,\n\tpbn_b1_2_1250000 = 35,\n\tpbn_b1_bt_1_115200 = 36,\n\tpbn_b1_bt_2_115200 = 37,\n\tpbn_b1_bt_4_115200 = 38,\n\tpbn_b1_bt_2_921600 = 39,\n\tpbn_b1_1_1382400 = 40,\n\tpbn_b1_2_1382400 = 41,\n\tpbn_b1_4_1382400 = 42,\n\tpbn_b1_8_1382400 = 43,\n\tpbn_b2_1_115200 = 44,\n\tpbn_b2_2_115200 = 45,\n\tpbn_b2_4_115200 = 46,\n\tpbn_b2_8_115200 = 47,\n\tpbn_b2_1_460800 = 48,\n\tpbn_b2_4_460800 = 49,\n\tpbn_b2_8_460800 = 50,\n\tpbn_b2_16_460800 = 51,\n\tpbn_b2_1_921600 = 52,\n\tpbn_b2_4_921600 = 53,\n\tpbn_b2_8_921600 = 54,\n\tpbn_b2_8_1152000 = 55,\n\tpbn_b2_bt_1_115200 = 56,\n\tpbn_b2_bt_2_115200 = 57,\n\tpbn_b2_bt_4_115200 = 58,\n\tpbn_b2_bt_2_921600 = 59,\n\tpbn_b2_bt_4_921600 = 60,\n\tpbn_b3_2_115200 = 61,\n\tpbn_b3_4_115200 = 62,\n\tpbn_b3_8_115200 = 63,\n\tpbn_b4_bt_2_921600 = 64,\n\tpbn_b4_bt_4_921600 = 65,\n\tpbn_b4_bt_8_921600 = 66,\n\tpbn_panacom = 67,\n\tpbn_panacom2 = 68,\n\tpbn_panacom4 = 69,\n\tpbn_plx_romulus = 70,\n\tpbn_oxsemi = 71,\n\tpbn_oxsemi_1_15625000 = 72,\n\tpbn_oxsemi_2_15625000 = 73,\n\tpbn_oxsemi_4_15625000 = 74,\n\tpbn_oxsemi_8_15625000 = 75,\n\tpbn_intel_i960 = 76,\n\tpbn_sgi_ioc3 = 77,\n\tpbn_computone_4 = 78,\n\tpbn_computone_6 = 79,\n\tpbn_computone_8 = 80,\n\tpbn_sbsxrsio = 81,\n\tpbn_pasemi_1682M = 82,\n\tpbn_ni8430_2 = 83,\n\tpbn_ni8430_4 = 84,\n\tpbn_ni8430_8 = 85,\n\tpbn_ni8430_16 = 86,\n\tpbn_ADDIDATA_PCIe_1_3906250 = 87,\n\tpbn_ADDIDATA_PCIe_2_3906250 = 88,\n\tpbn_ADDIDATA_PCIe_4_3906250 = 89,\n\tpbn_ADDIDATA_PCIe_8_3906250 = 90,\n\tpbn_ce4100_1_115200 = 91,\n\tpbn_omegapci = 92,\n\tpbn_NETMOS9900_2s_115200 = 93,\n\tpbn_brcm_trumanage = 94,\n\tpbn_fintek_4 = 95,\n\tpbn_fintek_8 = 96,\n\tpbn_fintek_12 = 97,\n\tpbn_fintek_F81504A = 98,\n\tpbn_fintek_F81508A = 99,\n\tpbn_fintek_F81512A = 100,\n\tpbn_wch382_2 = 101,\n\tpbn_wch384_4 = 102,\n\tpbn_wch384_8 = 103,\n\tpbn_sunix_pci_1s = 104,\n\tpbn_sunix_pci_2s = 105,\n\tpbn_sunix_pci_4s = 106,\n\tpbn_sunix_pci_8s = 107,\n\tpbn_sunix_pci_16s = 108,\n\tpbn_titan_1_4000000 = 109,\n\tpbn_titan_2_4000000 = 110,\n\tpbn_titan_4_4000000 = 111,\n\tpbn_titan_8_4000000 = 112,\n\tpbn_moxa_2 = 113,\n\tpbn_moxa_4 = 114,\n\tpbn_moxa_8 = 115,\n};\n\nenum pci_bus_flags {\n\tPCI_BUS_FLAGS_NO_MSI = 1,\n\tPCI_BUS_FLAGS_NO_MMRBC = 2,\n\tPCI_BUS_FLAGS_NO_AERSID = 4,\n\tPCI_BUS_FLAGS_NO_EXTCFG = 8,\n};\n\nenum pci_bus_speed {\n\tPCI_SPEED_33MHz = 0,\n\tPCI_SPEED_66MHz = 1,\n\tPCI_SPEED_66MHz_PCIX = 2,\n\tPCI_SPEED_100MHz_PCIX = 3,\n\tPCI_SPEED_133MHz_PCIX = 4,\n\tPCI_SPEED_66MHz_PCIX_ECC = 5,\n\tPCI_SPEED_100MHz_PCIX_ECC = 6,\n\tPCI_SPEED_133MHz_PCIX_ECC = 7,\n\tPCI_SPEED_66MHz_PCIX_266 = 9,\n\tPCI_SPEED_100MHz_PCIX_266 = 10,\n\tPCI_SPEED_133MHz_PCIX_266 = 11,\n\tAGP_UNKNOWN = 12,\n\tAGP_1X = 13,\n\tAGP_2X = 14,\n\tAGP_4X = 15,\n\tAGP_8X = 16,\n\tPCI_SPEED_66MHz_PCIX_533 = 17,\n\tPCI_SPEED_100MHz_PCIX_533 = 18,\n\tPCI_SPEED_133MHz_PCIX_533 = 19,\n\tPCIE_SPEED_2_5GT = 20,\n\tPCIE_SPEED_5_0GT = 21,\n\tPCIE_SPEED_8_0GT = 22,\n\tPCIE_SPEED_16_0GT = 23,\n\tPCIE_SPEED_32_0GT = 24,\n\tPCIE_SPEED_64_0GT = 25,\n\tPCI_SPEED_UNKNOWN = 255,\n};\n\nenum pci_dev_flags {\n\tPCI_DEV_FLAGS_MSI_INTX_DISABLE_BUG = 1,\n\tPCI_DEV_FLAGS_NO_D3 = 2,\n\tPCI_DEV_FLAGS_ASSIGNED = 4,\n\tPCI_DEV_FLAGS_ACS_ENABLED_QUIRK = 8,\n\tPCI_DEV_FLAG_PCIE_BRIDGE_ALIAS = 32,\n\tPCI_DEV_FLAGS_NO_BUS_RESET = 64,\n\tPCI_DEV_FLAGS_NO_PM_RESET = 128,\n\tPCI_DEV_FLAGS_VPD_REF_F0 = 256,\n\tPCI_DEV_FLAGS_BRIDGE_XLATE_ROOT = 512,\n\tPCI_DEV_FLAGS_NO_FLR_RESET = 1024,\n\tPCI_DEV_FLAGS_NO_RELAXED_ORDERING = 2048,\n\tPCI_DEV_FLAGS_HAS_MSI_MASKING = 4096,\n};\n\nenum pci_epc_bar_type {\n\tBAR_PROGRAMMABLE = 0,\n\tBAR_FIXED = 1,\n\tBAR_RESERVED = 2,\n};\n\nenum pci_epc_interface_type {\n\tUNKNOWN_INTERFACE = -1,\n\tPRIMARY_INTERFACE = 0,\n\tSECONDARY_INTERFACE = 1,\n};\n\nenum pci_ers_result {\n\tPCI_ERS_RESULT_NONE = 1,\n\tPCI_ERS_RESULT_CAN_RECOVER = 2,\n\tPCI_ERS_RESULT_NEED_RESET = 3,\n\tPCI_ERS_RESULT_DISCONNECT = 4,\n\tPCI_ERS_RESULT_RECOVERED = 5,\n\tPCI_ERS_RESULT_NO_AER_DRIVER = 6,\n};\n\nenum pci_fixup_pass {\n\tpci_fixup_early = 0,\n\tpci_fixup_header = 1,\n\tpci_fixup_final = 2,\n\tpci_fixup_enable = 3,\n\tpci_fixup_resume = 4,\n\tpci_fixup_suspend = 5,\n\tpci_fixup_resume_early = 6,\n\tpci_fixup_suspend_late = 7,\n};\n\nenum pci_interrupt_pin {\n\tPCI_INTERRUPT_UNKNOWN = 0,\n\tPCI_INTERRUPT_INTA = 1,\n\tPCI_INTERRUPT_INTB = 2,\n\tPCI_INTERRUPT_INTC = 3,\n\tPCI_INTERRUPT_INTD = 4,\n};\n\nenum pci_irq_reroute_variant {\n\tINTEL_IRQ_REROUTE_VARIANT = 1,\n\tMAX_IRQ_REROUTE_VARIANTS = 3,\n};\n\nenum pci_mmap_api {\n\tPCI_MMAP_SYSFS = 0,\n\tPCI_MMAP_PROCFS = 1,\n};\n\nenum pci_mmap_state {\n\tpci_mmap_io = 0,\n\tpci_mmap_mem = 1,\n};\n\nenum pci_p2pdma_map_type {\n\tPCI_P2PDMA_MAP_UNKNOWN = 0,\n\tPCI_P2PDMA_MAP_NOT_SUPPORTED = 1,\n\tPCI_P2PDMA_MAP_BUS_ADDR = 2,\n\tPCI_P2PDMA_MAP_THRU_HOST_BRIDGE = 3,\n};\n\nenum pcie_bus_config_types {\n\tPCIE_BUS_TUNE_OFF = 0,\n\tPCIE_BUS_DEFAULT = 1,\n\tPCIE_BUS_SAFE = 2,\n\tPCIE_BUS_PERFORMANCE = 3,\n\tPCIE_BUS_PEER2PEER = 4,\n};\n\nenum pcie_link_width {\n\tPCIE_LNK_WIDTH_RESRV = 0,\n\tPCIE_LNK_X1 = 1,\n\tPCIE_LNK_X2 = 2,\n\tPCIE_LNK_X4 = 4,\n\tPCIE_LNK_X8 = 8,\n\tPCIE_LNK_X12 = 12,\n\tPCIE_LNK_X16 = 16,\n\tPCIE_LNK_X32 = 32,\n\tPCIE_LNK_WIDTH_UNKNOWN = 255,\n};\n\nenum pcie_reset_state {\n\tpcie_deassert_reset = 1,\n\tpcie_warm_reset = 2,\n\tpcie_hot_reset = 3,\n};\n\nenum pcim_addr_devres_type {\n\tPCIM_ADDR_DEVRES_TYPE_INVALID = 0,\n\tPCIM_ADDR_DEVRES_TYPE_REGION = 1,\n\tPCIM_ADDR_DEVRES_TYPE_REGION_MAPPING = 2,\n\tPCIM_ADDR_DEVRES_TYPE_MAPPING = 3,\n};\n\nenum pcpu_fc {\n\tPCPU_FC_AUTO = 0,\n\tPCPU_FC_EMBED = 1,\n\tPCPU_FC_PAGE = 2,\n\tPCPU_FC_NR = 3,\n};\n\nenum pedit_cmd {\n\tTCA_PEDIT_KEY_EX_CMD_SET = 0,\n\tTCA_PEDIT_KEY_EX_CMD_ADD = 1,\n\t__PEDIT_CMD_MAX = 2,\n};\n\nenum pedit_header_type {\n\tTCA_PEDIT_KEY_EX_HDR_TYPE_NETWORK = 0,\n\tTCA_PEDIT_KEY_EX_HDR_TYPE_ETH = 1,\n\tTCA_PEDIT_KEY_EX_HDR_TYPE_IP4 = 2,\n\tTCA_PEDIT_KEY_EX_HDR_TYPE_IP6 = 3,\n\tTCA_PEDIT_KEY_EX_HDR_TYPE_TCP = 4,\n\tTCA_PEDIT_KEY_EX_HDR_TYPE_UDP = 5,\n\t__PEDIT_HDR_TYPE_MAX = 6,\n};\n\nenum peer_app_attr {\n\tDCB_ATTR_CEE_PEER_APP_UNSPEC = 0,\n\tDCB_ATTR_CEE_PEER_APP_INFO = 1,\n\tDCB_ATTR_CEE_PEER_APP = 2,\n\t__DCB_ATTR_CEE_PEER_APP_MAX = 3,\n};\n\nenum perf_addr_filter_action_t {\n\tPERF_ADDR_FILTER_ACTION_STOP = 0,\n\tPERF_ADDR_FILTER_ACTION_START = 1,\n\tPERF_ADDR_FILTER_ACTION_FILTER = 2,\n};\n\nenum perf_adl_uncore_imc_freerunning_types {\n\tADL_MMIO_UNCORE_IMC_DATA_TOTAL = 0,\n\tADL_MMIO_UNCORE_IMC_DATA_READ = 1,\n\tADL_MMIO_UNCORE_IMC_DATA_WRITE = 2,\n\tADL_MMIO_UNCORE_IMC_FREERUNNING_TYPE_MAX = 3,\n};\n\nenum perf_bpf_event_type {\n\tPERF_BPF_EVENT_UNKNOWN = 0,\n\tPERF_BPF_EVENT_PROG_LOAD = 1,\n\tPERF_BPF_EVENT_PROG_UNLOAD = 2,\n\tPERF_BPF_EVENT_MAX = 3,\n};\n\nenum perf_branch_sample_type {\n\tPERF_SAMPLE_BRANCH_USER = 1,\n\tPERF_SAMPLE_BRANCH_KERNEL = 2,\n\tPERF_SAMPLE_BRANCH_HV = 4,\n\tPERF_SAMPLE_BRANCH_ANY = 8,\n\tPERF_SAMPLE_BRANCH_ANY_CALL = 16,\n\tPERF_SAMPLE_BRANCH_ANY_RETURN = 32,\n\tPERF_SAMPLE_BRANCH_IND_CALL = 64,\n\tPERF_SAMPLE_BRANCH_ABORT_TX = 128,\n\tPERF_SAMPLE_BRANCH_IN_TX = 256,\n\tPERF_SAMPLE_BRANCH_NO_TX = 512,\n\tPERF_SAMPLE_BRANCH_COND = 1024,\n\tPERF_SAMPLE_BRANCH_CALL_STACK = 2048,\n\tPERF_SAMPLE_BRANCH_IND_JUMP = 4096,\n\tPERF_SAMPLE_BRANCH_CALL = 8192,\n\tPERF_SAMPLE_BRANCH_NO_FLAGS = 16384,\n\tPERF_SAMPLE_BRANCH_NO_CYCLES = 32768,\n\tPERF_SAMPLE_BRANCH_TYPE_SAVE = 65536,\n\tPERF_SAMPLE_BRANCH_HW_INDEX = 131072,\n\tPERF_SAMPLE_BRANCH_PRIV_SAVE = 262144,\n\tPERF_SAMPLE_BRANCH_COUNTERS = 524288,\n\tPERF_SAMPLE_BRANCH_MAX = 1048576,\n};\n\nenum perf_branch_sample_type_shift {\n\tPERF_SAMPLE_BRANCH_USER_SHIFT = 0,\n\tPERF_SAMPLE_BRANCH_KERNEL_SHIFT = 1,\n\tPERF_SAMPLE_BRANCH_HV_SHIFT = 2,\n\tPERF_SAMPLE_BRANCH_ANY_SHIFT = 3,\n\tPERF_SAMPLE_BRANCH_ANY_CALL_SHIFT = 4,\n\tPERF_SAMPLE_BRANCH_ANY_RETURN_SHIFT = 5,\n\tPERF_SAMPLE_BRANCH_IND_CALL_SHIFT = 6,\n\tPERF_SAMPLE_BRANCH_ABORT_TX_SHIFT = 7,\n\tPERF_SAMPLE_BRANCH_IN_TX_SHIFT = 8,\n\tPERF_SAMPLE_BRANCH_NO_TX_SHIFT = 9,\n\tPERF_SAMPLE_BRANCH_COND_SHIFT = 10,\n\tPERF_SAMPLE_BRANCH_CALL_STACK_SHIFT = 11,\n\tPERF_SAMPLE_BRANCH_IND_JUMP_SHIFT = 12,\n\tPERF_SAMPLE_BRANCH_CALL_SHIFT = 13,\n\tPERF_SAMPLE_BRANCH_NO_FLAGS_SHIFT = 14,\n\tPERF_SAMPLE_BRANCH_NO_CYCLES_SHIFT = 15,\n\tPERF_SAMPLE_BRANCH_TYPE_SAVE_SHIFT = 16,\n\tPERF_SAMPLE_BRANCH_HW_INDEX_SHIFT = 17,\n\tPERF_SAMPLE_BRANCH_PRIV_SAVE_SHIFT = 18,\n\tPERF_SAMPLE_BRANCH_COUNTERS_SHIFT = 19,\n\tPERF_SAMPLE_BRANCH_MAX_SHIFT = 20,\n};\n\nenum perf_callchain_context {\n\tPERF_CONTEXT_HV = 18446744073709551584ULL,\n\tPERF_CONTEXT_KERNEL = 18446744073709551488ULL,\n\tPERF_CONTEXT_USER = 18446744073709551104ULL,\n\tPERF_CONTEXT_GUEST = 18446744073709549568ULL,\n\tPERF_CONTEXT_GUEST_KERNEL = 18446744073709549440ULL,\n\tPERF_CONTEXT_GUEST_USER = 18446744073709549056ULL,\n\tPERF_CONTEXT_MAX = 18446744073709547521ULL,\n};\n\nenum perf_event_ioc_flags {\n\tPERF_IOC_FLAG_GROUP = 1,\n};\n\nenum perf_event_read_format {\n\tPERF_FORMAT_TOTAL_TIME_ENABLED = 1,\n\tPERF_FORMAT_TOTAL_TIME_RUNNING = 2,\n\tPERF_FORMAT_ID = 4,\n\tPERF_FORMAT_GROUP = 8,\n\tPERF_FORMAT_LOST = 16,\n\tPERF_FORMAT_MAX = 32,\n};\n\nenum perf_event_sample_format {\n\tPERF_SAMPLE_IP = 1,\n\tPERF_SAMPLE_TID = 2,\n\tPERF_SAMPLE_TIME = 4,\n\tPERF_SAMPLE_ADDR = 8,\n\tPERF_SAMPLE_READ = 16,\n\tPERF_SAMPLE_CALLCHAIN = 32,\n\tPERF_SAMPLE_ID = 64,\n\tPERF_SAMPLE_CPU = 128,\n\tPERF_SAMPLE_PERIOD = 256,\n\tPERF_SAMPLE_STREAM_ID = 512,\n\tPERF_SAMPLE_RAW = 1024,\n\tPERF_SAMPLE_BRANCH_STACK = 2048,\n\tPERF_SAMPLE_REGS_USER = 4096,\n\tPERF_SAMPLE_STACK_USER = 8192,\n\tPERF_SAMPLE_WEIGHT = 16384,\n\tPERF_SAMPLE_DATA_SRC = 32768,\n\tPERF_SAMPLE_IDENTIFIER = 65536,\n\tPERF_SAMPLE_TRANSACTION = 131072,\n\tPERF_SAMPLE_REGS_INTR = 262144,\n\tPERF_SAMPLE_PHYS_ADDR = 524288,\n\tPERF_SAMPLE_AUX = 1048576,\n\tPERF_SAMPLE_CGROUP = 2097152,\n\tPERF_SAMPLE_DATA_PAGE_SIZE = 4194304,\n\tPERF_SAMPLE_CODE_PAGE_SIZE = 8388608,\n\tPERF_SAMPLE_WEIGHT_STRUCT = 16777216,\n\tPERF_SAMPLE_MAX = 33554432,\n};\n\nenum perf_event_state {\n\tPERF_EVENT_STATE_DEAD = -4,\n\tPERF_EVENT_STATE_EXIT = -3,\n\tPERF_EVENT_STATE_ERROR = -2,\n\tPERF_EVENT_STATE_OFF = -1,\n\tPERF_EVENT_STATE_INACTIVE = 0,\n\tPERF_EVENT_STATE_ACTIVE = 1,\n};\n\nenum perf_event_task_context {\n\tperf_invalid_context = -1,\n\tperf_hw_context = 0,\n\tperf_sw_context = 1,\n\tperf_nr_task_contexts = 2,\n};\n\nenum perf_event_type {\n\tPERF_RECORD_MMAP = 1,\n\tPERF_RECORD_LOST = 2,\n\tPERF_RECORD_COMM = 3,\n\tPERF_RECORD_EXIT = 4,\n\tPERF_RECORD_THROTTLE = 5,\n\tPERF_RECORD_UNTHROTTLE = 6,\n\tPERF_RECORD_FORK = 7,\n\tPERF_RECORD_READ = 8,\n\tPERF_RECORD_SAMPLE = 9,\n\tPERF_RECORD_MMAP2 = 10,\n\tPERF_RECORD_AUX = 11,\n\tPERF_RECORD_ITRACE_START = 12,\n\tPERF_RECORD_LOST_SAMPLES = 13,\n\tPERF_RECORD_SWITCH = 14,\n\tPERF_RECORD_SWITCH_CPU_WIDE = 15,\n\tPERF_RECORD_NAMESPACES = 16,\n\tPERF_RECORD_KSYMBOL = 17,\n\tPERF_RECORD_BPF_EVENT = 18,\n\tPERF_RECORD_CGROUP = 19,\n\tPERF_RECORD_TEXT_POKE = 20,\n\tPERF_RECORD_AUX_OUTPUT_HW_ID = 21,\n\tPERF_RECORD_MAX = 22,\n};\n\nenum perf_event_x86_regs {\n\tPERF_REG_X86_AX = 0,\n\tPERF_REG_X86_BX = 1,\n\tPERF_REG_X86_CX = 2,\n\tPERF_REG_X86_DX = 3,\n\tPERF_REG_X86_SI = 4,\n\tPERF_REG_X86_DI = 5,\n\tPERF_REG_X86_BP = 6,\n\tPERF_REG_X86_SP = 7,\n\tPERF_REG_X86_IP = 8,\n\tPERF_REG_X86_FLAGS = 9,\n\tPERF_REG_X86_CS = 10,\n\tPERF_REG_X86_SS = 11,\n\tPERF_REG_X86_DS = 12,\n\tPERF_REG_X86_ES = 13,\n\tPERF_REG_X86_FS = 14,\n\tPERF_REG_X86_GS = 15,\n\tPERF_REG_X86_R8 = 16,\n\tPERF_REG_X86_R9 = 17,\n\tPERF_REG_X86_R10 = 18,\n\tPERF_REG_X86_R11 = 19,\n\tPERF_REG_X86_R12 = 20,\n\tPERF_REG_X86_R13 = 21,\n\tPERF_REG_X86_R14 = 22,\n\tPERF_REG_X86_R15 = 23,\n\tPERF_REG_X86_32_MAX = 16,\n\tPERF_REG_X86_64_MAX = 24,\n\tPERF_REG_X86_XMM0 = 32,\n\tPERF_REG_X86_XMM1 = 34,\n\tPERF_REG_X86_XMM2 = 36,\n\tPERF_REG_X86_XMM3 = 38,\n\tPERF_REG_X86_XMM4 = 40,\n\tPERF_REG_X86_XMM5 = 42,\n\tPERF_REG_X86_XMM6 = 44,\n\tPERF_REG_X86_XMM7 = 46,\n\tPERF_REG_X86_XMM8 = 48,\n\tPERF_REG_X86_XMM9 = 50,\n\tPERF_REG_X86_XMM10 = 52,\n\tPERF_REG_X86_XMM11 = 54,\n\tPERF_REG_X86_XMM12 = 56,\n\tPERF_REG_X86_XMM13 = 58,\n\tPERF_REG_X86_XMM14 = 60,\n\tPERF_REG_X86_XMM15 = 62,\n\tPERF_REG_X86_XMM_MAX = 64,\n};\n\nenum perf_hw_cache_id {\n\tPERF_COUNT_HW_CACHE_L1D = 0,\n\tPERF_COUNT_HW_CACHE_L1I = 1,\n\tPERF_COUNT_HW_CACHE_LL = 2,\n\tPERF_COUNT_HW_CACHE_DTLB = 3,\n\tPERF_COUNT_HW_CACHE_ITLB = 4,\n\tPERF_COUNT_HW_CACHE_BPU = 5,\n\tPERF_COUNT_HW_CACHE_NODE = 6,\n\tPERF_COUNT_HW_CACHE_MAX = 7,\n};\n\nenum perf_hw_cache_op_id {\n\tPERF_COUNT_HW_CACHE_OP_READ = 0,\n\tPERF_COUNT_HW_CACHE_OP_WRITE = 1,\n\tPERF_COUNT_HW_CACHE_OP_PREFETCH = 2,\n\tPERF_COUNT_HW_CACHE_OP_MAX = 3,\n};\n\nenum perf_hw_cache_op_result_id {\n\tPERF_COUNT_HW_CACHE_RESULT_ACCESS = 0,\n\tPERF_COUNT_HW_CACHE_RESULT_MISS = 1,\n\tPERF_COUNT_HW_CACHE_RESULT_MAX = 2,\n};\n\nenum perf_hw_id {\n\tPERF_COUNT_HW_CPU_CYCLES = 0,\n\tPERF_COUNT_HW_INSTRUCTIONS = 1,\n\tPERF_COUNT_HW_CACHE_REFERENCES = 2,\n\tPERF_COUNT_HW_CACHE_MISSES = 3,\n\tPERF_COUNT_HW_BRANCH_INSTRUCTIONS = 4,\n\tPERF_COUNT_HW_BRANCH_MISSES = 5,\n\tPERF_COUNT_HW_BUS_CYCLES = 6,\n\tPERF_COUNT_HW_STALLED_CYCLES_FRONTEND = 7,\n\tPERF_COUNT_HW_STALLED_CYCLES_BACKEND = 8,\n\tPERF_COUNT_HW_REF_CPU_CYCLES = 9,\n\tPERF_COUNT_HW_MAX = 10,\n};\n\nenum perf_msr_id {\n\tPERF_MSR_TSC = 0,\n\tPERF_MSR_APERF = 1,\n\tPERF_MSR_MPERF = 2,\n\tPERF_MSR_PPERF = 3,\n\tPERF_MSR_SMI = 4,\n\tPERF_MSR_PTSC = 5,\n\tPERF_MSR_IRPERF = 6,\n\tPERF_MSR_THERM = 7,\n\tPERF_MSR_EVENT_MAX = 8,\n};\n\nenum perf_probe_config {\n\tPERF_PROBE_CONFIG_IS_RETPROBE = 1,\n\tPERF_UPROBE_REF_CTR_OFFSET_BITS = 32,\n\tPERF_UPROBE_REF_CTR_OFFSET_SHIFT = 32,\n};\n\nenum perf_record_ksymbol_type {\n\tPERF_RECORD_KSYMBOL_TYPE_UNKNOWN = 0,\n\tPERF_RECORD_KSYMBOL_TYPE_BPF = 1,\n\tPERF_RECORD_KSYMBOL_TYPE_OOL = 2,\n\tPERF_RECORD_KSYMBOL_TYPE_MAX = 3,\n};\n\nenum perf_sample_regs_abi {\n\tPERF_SAMPLE_REGS_ABI_NONE = 0,\n\tPERF_SAMPLE_REGS_ABI_32 = 1,\n\tPERF_SAMPLE_REGS_ABI_64 = 2,\n};\n\nenum perf_snb_uncore_imc_freerunning_types {\n\tSNB_PCI_UNCORE_IMC_DATA_READS = 0,\n\tSNB_PCI_UNCORE_IMC_DATA_WRITES = 1,\n\tSNB_PCI_UNCORE_IMC_GT_REQUESTS = 2,\n\tSNB_PCI_UNCORE_IMC_IA_REQUESTS = 3,\n\tSNB_PCI_UNCORE_IMC_IO_REQUESTS = 4,\n\tSNB_PCI_UNCORE_IMC_FREERUNNING_TYPE_MAX = 5,\n};\n\nenum perf_sw_ids {\n\tPERF_COUNT_SW_CPU_CLOCK = 0,\n\tPERF_COUNT_SW_TASK_CLOCK = 1,\n\tPERF_COUNT_SW_PAGE_FAULTS = 2,\n\tPERF_COUNT_SW_CONTEXT_SWITCHES = 3,\n\tPERF_COUNT_SW_CPU_MIGRATIONS = 4,\n\tPERF_COUNT_SW_PAGE_FAULTS_MIN = 5,\n\tPERF_COUNT_SW_PAGE_FAULTS_MAJ = 6,\n\tPERF_COUNT_SW_ALIGNMENT_FAULTS = 7,\n\tPERF_COUNT_SW_EMULATION_FAULTS = 8,\n\tPERF_COUNT_SW_DUMMY = 9,\n\tPERF_COUNT_SW_BPF_OUTPUT = 10,\n\tPERF_COUNT_SW_CGROUP_SWITCHES = 11,\n\tPERF_COUNT_SW_MAX = 12,\n};\n\nenum perf_tgl_uncore_imc_freerunning_types {\n\tTGL_MMIO_UNCORE_IMC_DATA_TOTAL = 0,\n\tTGL_MMIO_UNCORE_IMC_DATA_READ = 1,\n\tTGL_MMIO_UNCORE_IMC_DATA_WRITE = 2,\n\tTGL_MMIO_UNCORE_IMC_FREERUNNING_TYPE_MAX = 3,\n};\n\nenum perf_type_id {\n\tPERF_TYPE_HARDWARE = 0,\n\tPERF_TYPE_SOFTWARE = 1,\n\tPERF_TYPE_TRACEPOINT = 2,\n\tPERF_TYPE_HW_CACHE = 3,\n\tPERF_TYPE_RAW = 4,\n\tPERF_TYPE_BREAKPOINT = 5,\n\tPERF_TYPE_MAX = 6,\n};\n\nenum perf_uncore_icx_iio_freerunning_type_id {\n\tICX_IIO_MSR_IOCLK = 0,\n\tICX_IIO_MSR_BW_IN = 1,\n\tICX_IIO_FREERUNNING_TYPE_MAX = 2,\n};\n\nenum perf_uncore_icx_imc_freerunning_type_id {\n\tICX_IMC_DCLK = 0,\n\tICX_IMC_DDR = 1,\n\tICX_IMC_DDRT = 2,\n\tICX_IMC_FREERUNNING_TYPE_MAX = 3,\n};\n\nenum perf_uncore_iio_freerunning_type_id {\n\tSKX_IIO_MSR_IOCLK = 0,\n\tSKX_IIO_MSR_BW = 1,\n\tSKX_IIO_MSR_UTIL = 2,\n\tSKX_IIO_FREERUNNING_TYPE_MAX = 3,\n};\n\nenum perf_uncore_snr_iio_freerunning_type_id {\n\tSNR_IIO_MSR_IOCLK = 0,\n\tSNR_IIO_MSR_BW_IN = 1,\n\tSNR_IIO_FREERUNNING_TYPE_MAX = 2,\n};\n\nenum perf_uncore_snr_imc_freerunning_type_id {\n\tSNR_IMC_DCLK = 0,\n\tSNR_IMC_DDR = 1,\n\tSNR_IMC_FREERUNNING_TYPE_MAX = 2,\n};\n\nenum perf_uncore_spr_iio_freerunning_type_id {\n\tSPR_IIO_MSR_IOCLK = 0,\n\tSPR_IIO_MSR_BW_IN = 1,\n\tSPR_IIO_MSR_BW_OUT = 2,\n\tSPR_IIO_FREERUNNING_TYPE_MAX = 3,\n};\n\nenum perf_uncore_spr_imc_freerunning_type_id {\n\tSPR_IMC_DCLK = 0,\n\tSPR_IMC_PQ_CYCLES = 1,\n\tSPR_IMC_FREERUNNING_TYPE_MAX = 2,\n};\n\nenum pg_level {\n\tPG_LEVEL_NONE = 0,\n\tPG_LEVEL_4K = 1,\n\tPG_LEVEL_2M = 2,\n\tPG_LEVEL_1G = 3,\n\tPG_LEVEL_512G = 4,\n\tPG_LEVEL_256T = 5,\n\tPG_LEVEL_NUM = 6,\n};\n\nenum pgdat_flags {\n\tPGDAT_DIRTY = 0,\n\tPGDAT_WRITEBACK = 1,\n\tPGDAT_RECLAIM_LOCKED = 2,\n};\n\nenum pgt_entry {\n\tNORMAL_PMD = 0,\n\tHPAGE_PMD = 1,\n\tNORMAL_PUD = 2,\n\tHPAGE_PUD = 3,\n};\n\nenum phy_media {\n\tPHY_MEDIA_DEFAULT = 0,\n\tPHY_MEDIA_SR = 1,\n\tPHY_MEDIA_DAC = 2,\n};\n\nenum phy_mode {\n\tPHY_MODE_INVALID = 0,\n\tPHY_MODE_USB_HOST = 1,\n\tPHY_MODE_USB_HOST_LS = 2,\n\tPHY_MODE_USB_HOST_FS = 3,\n\tPHY_MODE_USB_HOST_HS = 4,\n\tPHY_MODE_USB_HOST_SS = 5,\n\tPHY_MODE_USB_DEVICE = 6,\n\tPHY_MODE_USB_DEVICE_LS = 7,\n\tPHY_MODE_USB_DEVICE_FS = 8,\n\tPHY_MODE_USB_DEVICE_HS = 9,\n\tPHY_MODE_USB_DEVICE_SS = 10,\n\tPHY_MODE_USB_OTG = 11,\n\tPHY_MODE_UFS_HS_A = 12,\n\tPHY_MODE_UFS_HS_B = 13,\n\tPHY_MODE_PCIE = 14,\n\tPHY_MODE_ETHERNET = 15,\n\tPHY_MODE_MIPI_DPHY = 16,\n\tPHY_MODE_SATA = 17,\n\tPHY_MODE_LVDS = 18,\n\tPHY_MODE_DP = 19,\n};\n\nenum phy_state {\n\tPHY_DOWN = 0,\n\tPHY_READY = 1,\n\tPHY_HALTED = 2,\n\tPHY_ERROR = 3,\n\tPHY_UP = 4,\n\tPHY_RUNNING = 5,\n\tPHY_NOLINK = 6,\n\tPHY_CABLETEST = 7,\n};\n\nenum phy_state_work {\n\tPHY_STATE_WORK_NONE = 0,\n\tPHY_STATE_WORK_ANEG = 1,\n\tPHY_STATE_WORK_SUSPEND = 2,\n};\n\nenum phy_tunable_id {\n\tETHTOOL_PHY_ID_UNSPEC = 0,\n\tETHTOOL_PHY_DOWNSHIFT = 1,\n\tETHTOOL_PHY_FAST_LINK_DOWN = 2,\n\tETHTOOL_PHY_EDPD = 3,\n\t__ETHTOOL_PHY_TUNABLE_COUNT = 4,\n};\n\nenum phylink_op_type {\n\tPHYLINK_NETDEV = 0,\n\tPHYLINK_DEV = 1,\n};\n\nenum pid_type {\n\tPIDTYPE_PID = 0,\n\tPIDTYPE_TGID = 1,\n\tPIDTYPE_PGID = 2,\n\tPIDTYPE_SID = 3,\n\tPIDTYPE_MAX = 4,\n};\n\nenum pidcg_event {\n\tPIDCG_MAX = 0,\n\tPIDCG_FORKFAIL = 1,\n\tNR_PIDCG_EVENTS = 2,\n};\n\nenum piix_controller_ids {\n\tpiix_pata_mwdma = 0,\n\tpiix_pata_33 = 1,\n\tich_pata_33 = 2,\n\tich_pata_66 = 3,\n\tich_pata_100 = 4,\n\tich_pata_100_nomwdma1 = 5,\n\tich5_sata = 6,\n\tich6_sata = 7,\n\tich6m_sata = 8,\n\tich8_sata = 9,\n\tich8_2port_sata = 10,\n\tich8m_apple_sata = 11,\n\ttolapai_sata = 12,\n\tpiix_pata_vmw = 13,\n\tich8_sata_snb = 14,\n\tich8_2port_sata_snb = 15,\n\tich8_2port_sata_byt = 16,\n};\n\nenum pin_config_param {\n\tPIN_CONFIG_BIAS_BUS_HOLD = 0,\n\tPIN_CONFIG_BIAS_DISABLE = 1,\n\tPIN_CONFIG_BIAS_HIGH_IMPEDANCE = 2,\n\tPIN_CONFIG_BIAS_PULL_DOWN = 3,\n\tPIN_CONFIG_BIAS_PULL_PIN_DEFAULT = 4,\n\tPIN_CONFIG_BIAS_PULL_UP = 5,\n\tPIN_CONFIG_DRIVE_OPEN_DRAIN = 6,\n\tPIN_CONFIG_DRIVE_OPEN_SOURCE = 7,\n\tPIN_CONFIG_DRIVE_PUSH_PULL = 8,\n\tPIN_CONFIG_DRIVE_STRENGTH = 9,\n\tPIN_CONFIG_DRIVE_STRENGTH_UA = 10,\n\tPIN_CONFIG_INPUT_DEBOUNCE = 11,\n\tPIN_CONFIG_INPUT_ENABLE = 12,\n\tPIN_CONFIG_INPUT_SCHMITT = 13,\n\tPIN_CONFIG_INPUT_SCHMITT_ENABLE = 14,\n\tPIN_CONFIG_MODE_LOW_POWER = 15,\n\tPIN_CONFIG_MODE_PWM = 16,\n\tPIN_CONFIG_OUTPUT = 17,\n\tPIN_CONFIG_OUTPUT_ENABLE = 18,\n\tPIN_CONFIG_OUTPUT_IMPEDANCE_OHMS = 19,\n\tPIN_CONFIG_PERSIST_STATE = 20,\n\tPIN_CONFIG_POWER_SOURCE = 21,\n\tPIN_CONFIG_SKEW_DELAY = 22,\n\tPIN_CONFIG_SLEEP_HARDWARE_STATE = 23,\n\tPIN_CONFIG_SLEW_RATE = 24,\n\tPIN_CONFIG_END = 127,\n\tPIN_CONFIG_MAX = 255,\n};\n\nenum pinctrl_map_type {\n\tPIN_MAP_TYPE_INVALID = 0,\n\tPIN_MAP_TYPE_DUMMY_STATE = 1,\n\tPIN_MAP_TYPE_MUX_GROUP = 2,\n\tPIN_MAP_TYPE_CONFIGS_PIN = 3,\n\tPIN_MAP_TYPE_CONFIGS_GROUP = 4,\n};\n\nenum pkcs7_actions {\n\tACT_pkcs7_check_content_type = 0,\n\tACT_pkcs7_extract_cert = 1,\n\tACT_pkcs7_note_OID = 2,\n\tACT_pkcs7_note_certificate_list = 3,\n\tACT_pkcs7_note_content = 4,\n\tACT_pkcs7_note_data = 5,\n\tACT_pkcs7_note_signed_info = 6,\n\tACT_pkcs7_note_signeddata_version = 7,\n\tACT_pkcs7_note_signerinfo_version = 8,\n\tACT_pkcs7_sig_note_authenticated_attr = 9,\n\tACT_pkcs7_sig_note_digest_algo = 10,\n\tACT_pkcs7_sig_note_issuer = 11,\n\tACT_pkcs7_sig_note_pkey_algo = 12,\n\tACT_pkcs7_sig_note_serial = 13,\n\tACT_pkcs7_sig_note_set_of_authattrs = 14,\n\tACT_pkcs7_sig_note_signature = 15,\n\tACT_pkcs7_sig_note_skid = 16,\n\tNR__pkcs7_actions = 17,\n};\n\nenum pkey_id_type {\n\tPKEY_ID_PGP = 0,\n\tPKEY_ID_X509 = 1,\n\tPKEY_ID_PKCS7 = 2,\n};\n\nenum pkt_hash_types {\n\tPKT_HASH_TYPE_NONE = 0,\n\tPKT_HASH_TYPE_L2 = 1,\n\tPKT_HASH_TYPE_L3 = 2,\n\tPKT_HASH_TYPE_L4 = 3,\n};\n\nenum pm8606_ref_gp_and_osc_clients {\n\tREF_GP_NO_CLIENTS = 0,\n\tWLED1_DUTY = 1,\n\tWLED2_DUTY = 2,\n\tWLED3_DUTY = 4,\n\tRGB1_ENABLE = 8,\n\tRGB2_ENABLE = 16,\n\tLDO_VBR_EN = 32,\n\tREF_GP_MAX_CLIENT = 65535,\n};\n\nenum pm_qos_flags_status {\n\tPM_QOS_FLAGS_UNDEFINED = -1,\n\tPM_QOS_FLAGS_NONE = 0,\n\tPM_QOS_FLAGS_SOME = 1,\n\tPM_QOS_FLAGS_ALL = 2,\n};\n\nenum pm_qos_req_action {\n\tPM_QOS_ADD_REQ = 0,\n\tPM_QOS_UPDATE_REQ = 1,\n\tPM_QOS_REMOVE_REQ = 2,\n};\n\nenum pm_qos_type {\n\tPM_QOS_UNITIALIZED = 0,\n\tPM_QOS_MAX = 1,\n\tPM_QOS_MIN = 2,\n};\n\nenum pmc_type {\n\tKVM_PMC_GP = 0,\n\tKVM_PMC_FIXED = 1,\n};\n\nenum poison_cmd_enabled_bits {\n\tCXL_POISON_ENABLED_LIST = 0,\n\tCXL_POISON_ENABLED_INJECT = 1,\n\tCXL_POISON_ENABLED_CLEAR = 2,\n\tCXL_POISON_ENABLED_SCAN_CAPS = 3,\n\tCXL_POISON_ENABLED_SCAN_MEDIA = 4,\n\tCXL_POISON_ENABLED_SCAN_RESULTS = 5,\n\tCXL_POISON_ENABLED_MAX = 6,\n};\n\nenum policy_opt {\n\tOpt_measure = 0,\n\tOpt_dont_measure = 1,\n\tOpt_appraise = 2,\n\tOpt_dont_appraise = 3,\n\tOpt_audit = 4,\n\tOpt_hash___3 = 5,\n\tOpt_dont_hash = 6,\n\tOpt_obj_user = 7,\n\tOpt_obj_role = 8,\n\tOpt_obj_type = 9,\n\tOpt_subj_user = 10,\n\tOpt_subj_role = 11,\n\tOpt_subj_type = 12,\n\tOpt_func = 13,\n\tOpt_mask = 14,\n\tOpt_fsmagic = 15,\n\tOpt_fsname = 16,\n\tOpt_fsuuid = 17,\n\tOpt_uid_eq = 18,\n\tOpt_euid_eq = 19,\n\tOpt_gid_eq = 20,\n\tOpt_egid_eq = 21,\n\tOpt_fowner_eq = 22,\n\tOpt_fgroup_eq = 23,\n\tOpt_uid_gt = 24,\n\tOpt_euid_gt = 25,\n\tOpt_gid_gt = 26,\n\tOpt_egid_gt = 27,\n\tOpt_fowner_gt = 28,\n\tOpt_fgroup_gt = 29,\n\tOpt_uid_lt = 30,\n\tOpt_euid_lt = 31,\n\tOpt_gid_lt = 32,\n\tOpt_egid_lt = 33,\n\tOpt_fowner_lt = 34,\n\tOpt_fgroup_lt = 35,\n\tOpt_digest_type = 36,\n\tOpt_appraise_type = 37,\n\tOpt_appraise_flag = 38,\n\tOpt_appraise_algos = 39,\n\tOpt_permit_directio = 40,\n\tOpt_pcr = 41,\n\tOpt_template = 42,\n\tOpt_keyrings = 43,\n\tOpt_label = 44,\n\tOpt_err___8 = 45,\n};\n\nenum policy_rule_list {\n\tIMA_DEFAULT_POLICY = 1,\n\tIMA_CUSTOM_POLICY = 2,\n};\n\nenum policy_types {\n\tORIGINAL_TCB = 1,\n\tDEFAULT_TCB = 2,\n};\n\nenum poll_time_type {\n\tPT_TIMEVAL = 0,\n\tPT_OLD_TIMEVAL = 1,\n\tPT_TIMESPEC = 2,\n\tPT_OLD_TIMESPEC = 3,\n};\n\nenum polling_modes {\n\tCM_POLL_DISABLE = 0,\n\tCM_POLL_ALWAYS = 1,\n\tCM_POLL_EXTERNAL_POWER_ONLY = 2,\n\tCM_POLL_CHARGING_ONLY = 3,\n};\n\nenum pool_workqueue_stats {\n\tPWQ_STAT_STARTED = 0,\n\tPWQ_STAT_COMPLETED = 1,\n\tPWQ_STAT_CPU_TIME = 2,\n\tPWQ_STAT_CPU_INTENSIVE = 3,\n\tPWQ_STAT_CM_WAKEUP = 4,\n\tPWQ_STAT_REPATRIATED = 5,\n\tPWQ_STAT_MAYDAY = 6,\n\tPWQ_STAT_RESCUED = 7,\n\tPWQ_NR_STATS = 8,\n};\n\nenum port_pkey_state {\n\tIB_PORT_PKEY_NOT_VALID = 0,\n\tIB_PORT_PKEY_VALID = 1,\n\tIB_PORT_PKEY_LISTED = 2,\n};\n\nenum positive_aop_returns {\n\tAOP_WRITEPAGE_ACTIVATE = 524288,\n\tAOP_TRUNCATED_PAGE = 524289,\n};\n\nenum power_supply_charge_behaviour {\n\tPOWER_SUPPLY_CHARGE_BEHAVIOUR_AUTO = 0,\n\tPOWER_SUPPLY_CHARGE_BEHAVIOUR_INHIBIT_CHARGE = 1,\n\tPOWER_SUPPLY_CHARGE_BEHAVIOUR_FORCE_DISCHARGE = 2,\n};\n\nenum power_supply_notifier_events {\n\tPSY_EVENT_PROP_CHANGED = 0,\n};\n\nenum power_supply_property {\n\tPOWER_SUPPLY_PROP_STATUS = 0,\n\tPOWER_SUPPLY_PROP_CHARGE_TYPE = 1,\n\tPOWER_SUPPLY_PROP_HEALTH = 2,\n\tPOWER_SUPPLY_PROP_PRESENT = 3,\n\tPOWER_SUPPLY_PROP_ONLINE = 4,\n\tPOWER_SUPPLY_PROP_AUTHENTIC = 5,\n\tPOWER_SUPPLY_PROP_TECHNOLOGY = 6,\n\tPOWER_SUPPLY_PROP_CYCLE_COUNT = 7,\n\tPOWER_SUPPLY_PROP_VOLTAGE_MAX = 8,\n\tPOWER_SUPPLY_PROP_VOLTAGE_MIN = 9,\n\tPOWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN = 10,\n\tPOWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN = 11,\n\tPOWER_SUPPLY_PROP_VOLTAGE_NOW = 12,\n\tPOWER_SUPPLY_PROP_VOLTAGE_AVG = 13,\n\tPOWER_SUPPLY_PROP_VOLTAGE_OCV = 14,\n\tPOWER_SUPPLY_PROP_VOLTAGE_BOOT = 15,\n\tPOWER_SUPPLY_PROP_CURRENT_MAX = 16,\n\tPOWER_SUPPLY_PROP_CURRENT_NOW = 17,\n\tPOWER_SUPPLY_PROP_CURRENT_AVG = 18,\n\tPOWER_SUPPLY_PROP_CURRENT_BOOT = 19,\n\tPOWER_SUPPLY_PROP_POWER_NOW = 20,\n\tPOWER_SUPPLY_PROP_POWER_AVG = 21,\n\tPOWER_SUPPLY_PROP_CHARGE_FULL_DESIGN = 22,\n\tPOWER_SUPPLY_PROP_CHARGE_EMPTY_DESIGN = 23,\n\tPOWER_SUPPLY_PROP_CHARGE_FULL = 24,\n\tPOWER_SUPPLY_PROP_CHARGE_EMPTY = 25,\n\tPOWER_SUPPLY_PROP_CHARGE_NOW = 26,\n\tPOWER_SUPPLY_PROP_CHARGE_AVG = 27,\n\tPOWER_SUPPLY_PROP_CHARGE_COUNTER = 28,\n\tPOWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT = 29,\n\tPOWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX = 30,\n\tPOWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE = 31,\n\tPOWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX = 32,\n\tPOWER_SUPPLY_PROP_CHARGE_CONTROL_LIMIT = 33,\n\tPOWER_SUPPLY_PROP_CHARGE_CONTROL_LIMIT_MAX = 34,\n\tPOWER_SUPPLY_PROP_CHARGE_CONTROL_START_THRESHOLD = 35,\n\tPOWER_SUPPLY_PROP_CHARGE_CONTROL_END_THRESHOLD = 36,\n\tPOWER_SUPPLY_PROP_CHARGE_BEHAVIOUR = 37,\n\tPOWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT = 38,\n\tPOWER_SUPPLY_PROP_INPUT_VOLTAGE_LIMIT = 39,\n\tPOWER_SUPPLY_PROP_INPUT_POWER_LIMIT = 40,\n\tPOWER_SUPPLY_PROP_ENERGY_FULL_DESIGN = 41,\n\tPOWER_SUPPLY_PROP_ENERGY_EMPTY_DESIGN = 42,\n\tPOWER_SUPPLY_PROP_ENERGY_FULL = 43,\n\tPOWER_SUPPLY_PROP_ENERGY_EMPTY = 44,\n\tPOWER_SUPPLY_PROP_ENERGY_NOW = 45,\n\tPOWER_SUPPLY_PROP_ENERGY_AVG = 46,\n\tPOWER_SUPPLY_PROP_CAPACITY = 47,\n\tPOWER_SUPPLY_PROP_CAPACITY_ALERT_MIN = 48,\n\tPOWER_SUPPLY_PROP_CAPACITY_ALERT_MAX = 49,\n\tPOWER_SUPPLY_PROP_CAPACITY_ERROR_MARGIN = 50,\n\tPOWER_SUPPLY_PROP_CAPACITY_LEVEL = 51,\n\tPOWER_SUPPLY_PROP_TEMP = 52,\n\tPOWER_SUPPLY_PROP_TEMP_MAX = 53,\n\tPOWER_SUPPLY_PROP_TEMP_MIN = 54,\n\tPOWER_SUPPLY_PROP_TEMP_ALERT_MIN = 55,\n\tPOWER_SUPPLY_PROP_TEMP_ALERT_MAX = 56,\n\tPOWER_SUPPLY_PROP_TEMP_AMBIENT = 57,\n\tPOWER_SUPPLY_PROP_TEMP_AMBIENT_ALERT_MIN = 58,\n\tPOWER_SUPPLY_PROP_TEMP_AMBIENT_ALERT_MAX = 59,\n\tPOWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW = 60,\n\tPOWER_SUPPLY_PROP_TIME_TO_EMPTY_AVG = 61,\n\tPOWER_SUPPLY_PROP_TIME_TO_FULL_NOW = 62,\n\tPOWER_SUPPLY_PROP_TIME_TO_FULL_AVG = 63,\n\tPOWER_SUPPLY_PROP_TYPE = 64,\n\tPOWER_SUPPLY_PROP_USB_TYPE = 65,\n\tPOWER_SUPPLY_PROP_SCOPE = 66,\n\tPOWER_SUPPLY_PROP_PRECHARGE_CURRENT = 67,\n\tPOWER_SUPPLY_PROP_CHARGE_TERM_CURRENT = 68,\n\tPOWER_SUPPLY_PROP_CALIBRATE = 69,\n\tPOWER_SUPPLY_PROP_MANUFACTURE_YEAR = 70,\n\tPOWER_SUPPLY_PROP_MANUFACTURE_MONTH = 71,\n\tPOWER_SUPPLY_PROP_MANUFACTURE_DAY = 72,\n\tPOWER_SUPPLY_PROP_MODEL_NAME = 73,\n\tPOWER_SUPPLY_PROP_MANUFACTURER = 74,\n\tPOWER_SUPPLY_PROP_SERIAL_NUMBER = 75,\n};\n\nenum power_supply_type {\n\tPOWER_SUPPLY_TYPE_UNKNOWN = 0,\n\tPOWER_SUPPLY_TYPE_BATTERY = 1,\n\tPOWER_SUPPLY_TYPE_UPS = 2,\n\tPOWER_SUPPLY_TYPE_MAINS = 3,\n\tPOWER_SUPPLY_TYPE_USB = 4,\n\tPOWER_SUPPLY_TYPE_USB_DCP = 5,\n\tPOWER_SUPPLY_TYPE_USB_CDP = 6,\n\tPOWER_SUPPLY_TYPE_USB_ACA = 7,\n\tPOWER_SUPPLY_TYPE_USB_TYPE_C = 8,\n\tPOWER_SUPPLY_TYPE_USB_PD = 9,\n\tPOWER_SUPPLY_TYPE_USB_PD_DRP = 10,\n\tPOWER_SUPPLY_TYPE_APPLE_BRICK_ID = 11,\n\tPOWER_SUPPLY_TYPE_WIRELESS = 12,\n};\n\nenum power_supply_usb_type {\n\tPOWER_SUPPLY_USB_TYPE_UNKNOWN = 0,\n\tPOWER_SUPPLY_USB_TYPE_SDP = 1,\n\tPOWER_SUPPLY_USB_TYPE_DCP = 2,\n\tPOWER_SUPPLY_USB_TYPE_CDP = 3,\n\tPOWER_SUPPLY_USB_TYPE_ACA = 4,\n\tPOWER_SUPPLY_USB_TYPE_C = 5,\n\tPOWER_SUPPLY_USB_TYPE_PD = 6,\n\tPOWER_SUPPLY_USB_TYPE_PD_DRP = 7,\n\tPOWER_SUPPLY_USB_TYPE_PD_PPS = 8,\n\tPOWER_SUPPLY_USB_TYPE_APPLE_BRICK_ID = 9,\n};\n\nenum pr_status {\n\tPR_STS_SUCCESS = 0,\n\tPR_STS_IOERR = 2,\n\tPR_STS_RESERVATION_CONFLICT = 24,\n\tPR_STS_RETRY_PATH_FAILURE = 917504,\n\tPR_STS_PATH_FAST_FAILED = 983040,\n\tPR_STS_PATH_FAILED = 65536,\n};\n\nenum pr_type {\n\tPR_WRITE_EXCLUSIVE = 1,\n\tPR_EXCLUSIVE_ACCESS = 2,\n\tPR_WRITE_EXCLUSIVE_REG_ONLY = 3,\n\tPR_EXCLUSIVE_ACCESS_REG_ONLY = 4,\n\tPR_WRITE_EXCLUSIVE_ALL_REGS = 5,\n\tPR_EXCLUSIVE_ACCESS_ALL_REGS = 6,\n};\n\nenum prep_dispatch {\n\tPREP_DISPATCH_OK = 0,\n\tPREP_DISPATCH_NO_TAG = 1,\n\tPREP_DISPATCH_NO_BUDGET = 2,\n};\n\nenum print_line_t {\n\tTRACE_TYPE_PARTIAL_LINE = 0,\n\tTRACE_TYPE_HANDLED = 1,\n\tTRACE_TYPE_UNHANDLED = 2,\n\tTRACE_TYPE_NO_CONSUME = 3,\n};\n\nenum printk_info_flags {\n\tLOG_NEWLINE = 2,\n\tLOG_CONT = 8,\n};\n\nenum prio_policy {\n\tPOLICY_NO_CHANGE = 0,\n\tPOLICY_PROMOTE_TO_RT = 1,\n\tPOLICY_RESTRICT_TO_BE = 2,\n\tPOLICY_ALL_TO_IDLE = 3,\n\tPOLICY_NONE_TO_RT = 4,\n};\n\nenum probe_print_type {\n\tPROBE_PRINT_NORMAL = 0,\n\tPROBE_PRINT_RETURN = 1,\n\tPROBE_PRINT_EVENT = 2,\n};\n\nenum probe_type {\n\tPROBE_DEFAULT_STRATEGY = 0,\n\tPROBE_PREFER_ASYNCHRONOUS = 1,\n\tPROBE_FORCE_SYNCHRONOUS = 2,\n};\n\nenum proc_cn_event {\n\tPROC_EVENT_NONE = 0,\n\tPROC_EVENT_FORK = 1,\n\tPROC_EVENT_EXEC = 2,\n\tPROC_EVENT_UID = 4,\n\tPROC_EVENT_GID = 64,\n\tPROC_EVENT_SID = 128,\n\tPROC_EVENT_PTRACE = 256,\n\tPROC_EVENT_COMM = 512,\n\tPROC_EVENT_NONZERO_EXIT = 536870912,\n\tPROC_EVENT_COREDUMP = 1073741824,\n\tPROC_EVENT_EXIT = 2147483648,\n};\n\nenum proc_cn_mcast_op {\n\tPROC_CN_MCAST_LISTEN = 1,\n\tPROC_CN_MCAST_IGNORE = 2,\n};\n\nenum proc_hidepid {\n\tHIDEPID_OFF = 0,\n\tHIDEPID_NO_ACCESS = 1,\n\tHIDEPID_INVISIBLE = 2,\n\tHIDEPID_NOT_PTRACEABLE = 4,\n};\n\nenum proc_mem_force {\n\tPROC_MEM_FORCE_ALWAYS = 0,\n\tPROC_MEM_FORCE_PTRACE = 1,\n\tPROC_MEM_FORCE_NEVER = 2,\n};\n\nenum proc_param {\n\tOpt_gid___7 = 0,\n\tOpt_hidepid = 1,\n\tOpt_subset = 2,\n};\n\nenum proc_pidonly {\n\tPROC_PIDONLY_OFF = 0,\n\tPROC_PIDONLY_ON = 1,\n};\n\nenum procmap_query_flags {\n\tPROCMAP_QUERY_VMA_READABLE = 1,\n\tPROCMAP_QUERY_VMA_WRITABLE = 2,\n\tPROCMAP_QUERY_VMA_EXECUTABLE = 4,\n\tPROCMAP_QUERY_VMA_SHARED = 8,\n\tPROCMAP_QUERY_COVERING_OR_NEXT_VMA = 16,\n\tPROCMAP_QUERY_FILE_BACKED_VMA = 32,\n};\n\nenum profile_mode {\n\tAPPARMOR_ENFORCE = 0,\n\tAPPARMOR_COMPLAIN = 1,\n\tAPPARMOR_KILL = 2,\n\tAPPARMOR_UNCONFINED = 3,\n\tAPPARMOR_USER = 4,\n};\n\nenum protection_domain_mode {\n\tPD_MODE_V1 = 1,\n\tPD_MODE_V2 = 2,\n};\n\nenum prs_errcode {\n\tPERR_NONE = 0,\n\tPERR_INVCPUS = 1,\n\tPERR_INVPARENT = 2,\n\tPERR_NOTPART = 3,\n\tPERR_NOTEXCL = 4,\n\tPERR_NOCPUS = 5,\n\tPERR_HOTPLUG = 6,\n\tPERR_CPUSEMPTY = 7,\n\tPERR_HKEEPING = 8,\n};\n\nenum ps2_disposition {\n\tPS2_PROCESS = 0,\n\tPS2_IGNORE = 1,\n\tPS2_ERROR = 2,\n};\n\nenum psc_op {\n\tSNP_PAGE_STATE_PRIVATE = 1,\n\tSNP_PAGE_STATE_SHARED = 2,\n};\n\nenum pse_pi_pairset_pinout {\n\tALTERNATIVE_A = 0,\n\tALTERNATIVE_B = 1,\n};\n\nenum psi_aggregators {\n\tPSI_AVGS = 0,\n\tPSI_POLL = 1,\n\tNR_PSI_AGGREGATORS = 2,\n};\n\nenum psi_res {\n\tPSI_IO = 0,\n\tPSI_MEM = 1,\n\tPSI_CPU = 2,\n\tNR_PSI_RESOURCES = 3,\n};\n\nenum psi_states {\n\tPSI_IO_SOME = 0,\n\tPSI_IO_FULL = 1,\n\tPSI_MEM_SOME = 2,\n\tPSI_MEM_FULL = 3,\n\tPSI_CPU_SOME = 4,\n\tPSI_CPU_FULL = 5,\n\tPSI_NONIDLE = 6,\n\tNR_PSI_STATES = 7,\n};\n\nenum psi_task_count {\n\tNR_IOWAIT = 0,\n\tNR_MEMSTALL = 1,\n\tNR_RUNNING = 2,\n\tNR_MEMSTALL_RUNNING = 3,\n\tNR_PSI_TASK_COUNTS = 4,\n};\n\nenum pstore_type_id {\n\tPSTORE_TYPE_DMESG = 0,\n\tPSTORE_TYPE_MCE = 1,\n\tPSTORE_TYPE_CONSOLE = 2,\n\tPSTORE_TYPE_FTRACE = 3,\n\tPSTORE_TYPE_PPC_RTAS = 4,\n\tPSTORE_TYPE_PPC_OF = 5,\n\tPSTORE_TYPE_PPC_COMMON = 6,\n\tPSTORE_TYPE_PMSG = 7,\n\tPSTORE_TYPE_PPC_OPAL = 8,\n\tPSTORE_TYPE_MAX = 9,\n};\n\nenum pt_capabilities {\n\tPT_CAP_max_subleaf = 0,\n\tPT_CAP_cr3_filtering = 1,\n\tPT_CAP_psb_cyc = 2,\n\tPT_CAP_ip_filtering = 3,\n\tPT_CAP_mtc = 4,\n\tPT_CAP_ptwrite = 5,\n\tPT_CAP_power_event_trace = 6,\n\tPT_CAP_event_trace = 7,\n\tPT_CAP_tnt_disable = 8,\n\tPT_CAP_topa_output = 9,\n\tPT_CAP_topa_multiple_entries = 10,\n\tPT_CAP_single_range_output = 11,\n\tPT_CAP_output_subsys = 12,\n\tPT_CAP_payloads_lip = 13,\n\tPT_CAP_num_address_ranges = 14,\n\tPT_CAP_mtc_periods = 15,\n\tPT_CAP_cycle_thresholds = 16,\n\tPT_CAP_psb_periods = 17,\n};\n\nenum pt_level {\n\tPT_PGD = 0,\n\tPT_P4D = 1,\n\tPT_PUD = 2,\n\tPT_PMD = 3,\n\tPT_PTE = 4,\n};\n\nenum pti_clone_level {\n\tPTI_CLONE_PMD = 0,\n\tPTI_CLONE_PTE = 1,\n};\n\nenum pti_mode {\n\tPTI_AUTO = 0,\n\tPTI_FORCE_OFF = 1,\n\tPTI_FORCE_ON = 2,\n};\n\nenum ptp_clock_events {\n\tPTP_CLOCK_ALARM = 0,\n\tPTP_CLOCK_EXTTS = 1,\n\tPTP_CLOCK_EXTOFF = 2,\n\tPTP_CLOCK_PPS = 3,\n\tPTP_CLOCK_PPSUSR = 4,\n};\n\nenum ptp_pin_function {\n\tPTP_PF_NONE = 0,\n\tPTP_PF_EXTTS = 1,\n\tPTP_PF_PEROUT = 2,\n\tPTP_PF_PHYSYNC = 3,\n};\n\nenum pubkey_algo {\n\tPUBKEY_ALGO_RSA = 0,\n\tPUBKEY_ALGO_MAX = 1,\n};\n\nenum pwm_polarity {\n\tPWM_POLARITY_NORMAL = 0,\n\tPWM_POLARITY_INVERSED = 1,\n};\n\nenum pxa_ssp_type {\n\tSSP_UNDEFINED = 0,\n\tPXA25x_SSP = 1,\n\tPXA25x_NSSP = 2,\n\tPXA27x_SSP = 3,\n\tPXA3xx_SSP = 4,\n\tPXA168_SSP = 5,\n\tPXA910_SSP = 6,\n\tCE4100_SSP = 7,\n\tMMP2_SSP = 8,\n\tMRFLD_SSP = 9,\n\tQUARK_X1000_SSP = 10,\n\tLPSS_LPT_SSP = 11,\n\tLPSS_BYT_SSP = 12,\n\tLPSS_BSW_SSP = 13,\n\tLPSS_SPT_SSP = 14,\n\tLPSS_BXT_SSP = 15,\n\tLPSS_CNL_SSP = 16,\n\tSSP_MAX = 17,\n};\n\nenum qdisc_class_ops_flags {\n\tQDISC_CLASS_OPS_DOIT_UNLOCKED = 1,\n};\n\nenum qdisc_state2_t {\n\t__QDISC_STATE2_RUNNING = 0,\n};\n\nenum qdisc_state_t {\n\t__QDISC_STATE_SCHED = 0,\n\t__QDISC_STATE_DEACTIVATED = 1,\n\t__QDISC_STATE_MISSED = 2,\n\t__QDISC_STATE_DRAINING = 3,\n};\n\nenum quota_type {\n\tUSRQUOTA = 0,\n\tGRPQUOTA = 1,\n\tPRJQUOTA = 2,\n};\n\nenum ramfs_param {\n\tOpt_mode___5 = 0,\n};\n\nenum rdma_ah_attr_type {\n\tRDMA_AH_ATTR_TYPE_UNDEFINED = 0,\n\tRDMA_AH_ATTR_TYPE_IB = 1,\n\tRDMA_AH_ATTR_TYPE_ROCE = 2,\n\tRDMA_AH_ATTR_TYPE_OPA = 3,\n};\n\nenum rdma_driver_id {\n\tRDMA_DRIVER_UNKNOWN = 0,\n\tRDMA_DRIVER_MLX5 = 1,\n\tRDMA_DRIVER_MLX4 = 2,\n\tRDMA_DRIVER_CXGB3 = 3,\n\tRDMA_DRIVER_CXGB4 = 4,\n\tRDMA_DRIVER_MTHCA = 5,\n\tRDMA_DRIVER_BNXT_RE = 6,\n\tRDMA_DRIVER_OCRDMA = 7,\n\tRDMA_DRIVER_NES = 8,\n\tRDMA_DRIVER_I40IW = 9,\n\tRDMA_DRIVER_IRDMA = 9,\n\tRDMA_DRIVER_VMW_PVRDMA = 10,\n\tRDMA_DRIVER_QEDR = 11,\n\tRDMA_DRIVER_HNS = 12,\n\tRDMA_DRIVER_USNIC = 13,\n\tRDMA_DRIVER_RXE = 14,\n\tRDMA_DRIVER_HFI1 = 15,\n\tRDMA_DRIVER_QIB = 16,\n\tRDMA_DRIVER_EFA = 17,\n\tRDMA_DRIVER_SIW = 18,\n\tRDMA_DRIVER_ERDMA = 19,\n\tRDMA_DRIVER_MANA = 20,\n};\n\nenum rdma_link_layer {\n\tIB_LINK_LAYER_UNSPECIFIED = 0,\n\tIB_LINK_LAYER_INFINIBAND = 1,\n\tIB_LINK_LAYER_ETHERNET = 2,\n};\n\nenum rdma_netdev_t {\n\tRDMA_NETDEV_OPA_VNIC = 0,\n\tRDMA_NETDEV_IPOIB = 1,\n};\n\nenum rdma_nl_counter_mask {\n\tRDMA_COUNTER_MASK_QP_TYPE = 1,\n\tRDMA_COUNTER_MASK_PID = 2,\n};\n\nenum rdma_nl_counter_mode {\n\tRDMA_COUNTER_MODE_NONE = 0,\n\tRDMA_COUNTER_MODE_AUTO = 1,\n\tRDMA_COUNTER_MODE_MANUAL = 2,\n\tRDMA_COUNTER_MODE_MAX = 3,\n};\n\nenum rdma_nl_dev_type {\n\tRDMA_DEVICE_TYPE_SMI = 1,\n};\n\nenum rdma_nl_name_assign_type {\n\tRDMA_NAME_ASSIGN_TYPE_UNKNOWN = 0,\n\tRDMA_NAME_ASSIGN_TYPE_USER = 1,\n};\n\nenum rdma_restrack_type {\n\tRDMA_RESTRACK_PD = 0,\n\tRDMA_RESTRACK_CQ = 1,\n\tRDMA_RESTRACK_QP = 2,\n\tRDMA_RESTRACK_CM_ID = 3,\n\tRDMA_RESTRACK_MR = 4,\n\tRDMA_RESTRACK_CTX = 5,\n\tRDMA_RESTRACK_COUNTER = 6,\n\tRDMA_RESTRACK_SRQ = 7,\n\tRDMA_RESTRACK_MAX = 8,\n};\n\nenum rdmacg_file_type {\n\tRDMACG_RESOURCE_TYPE_MAX = 0,\n\tRDMACG_RESOURCE_TYPE_STAT = 1,\n};\n\nenum rdmacg_resource_type {\n\tRDMACG_RESOURCE_HCA_HANDLE = 0,\n\tRDMACG_RESOURCE_HCA_OBJECT = 1,\n\tRDMACG_RESOURCE_MAX = 2,\n};\n\nenum rdt_group_type {\n\tRDTCTRL_GROUP = 0,\n\tRDTMON_GROUP = 1,\n\tRDT_NUM_GROUP = 2,\n};\n\nenum rdt_param {\n\tOpt_cdp = 0,\n\tOpt_cdpl2 = 1,\n\tOpt_mba_mbps = 2,\n\tOpt_debug___3 = 3,\n\tnr__rdt_params = 4,\n};\n\nenum rdtgrp_mode {\n\tRDT_MODE_SHAREABLE = 0,\n\tRDT_MODE_EXCLUSIVE = 1,\n\tRDT_MODE_PSEUDO_LOCKSETUP = 2,\n\tRDT_MODE_PSEUDO_LOCKED = 3,\n\tRDT_NUM_MODES = 4,\n};\n\nenum reason_type {\n\tNOT_ME = 0,\n\tNOTHING = 1,\n\tREG_READ = 2,\n\tREG_WRITE = 3,\n\tIMM_WRITE = 4,\n\tOTHERS = 5,\n};\n\nenum reboot_mode {\n\tREBOOT_UNDEFINED = -1,\n\tREBOOT_COLD = 0,\n\tREBOOT_WARM = 1,\n\tREBOOT_HARD = 2,\n\tREBOOT_SOFT = 3,\n\tREBOOT_GPIO = 4,\n};\n\nenum reboot_type {\n\tBOOT_TRIPLE = 116,\n\tBOOT_KBD = 107,\n\tBOOT_BIOS = 98,\n\tBOOT_ACPI = 97,\n\tBOOT_EFI = 101,\n\tBOOT_CF9_FORCE = 112,\n\tBOOT_CF9_SAFE = 113,\n};\n\nenum recovery_flags {\n\tMD_RECOVERY_NEEDED = 0,\n\tMD_RECOVERY_RUNNING = 1,\n\tMD_RECOVERY_INTR = 2,\n\tMD_RECOVERY_DONE = 3,\n\tMD_RECOVERY_FROZEN = 4,\n\tMD_RECOVERY_WAIT = 5,\n\tMD_RECOVERY_ERROR = 6,\n\tMD_RECOVERY_SYNC = 7,\n\tMD_RECOVERY_REQUESTED = 8,\n\tMD_RECOVERY_CHECK = 9,\n\tMD_RECOVERY_RECOVER = 10,\n\tMD_RECOVERY_RESHAPE = 11,\n\tMD_RESYNCING_REMOTE = 12,\n};\n\nenum refcount_saturation_type {\n\tREFCOUNT_ADD_NOT_ZERO_OVF = 0,\n\tREFCOUNT_ADD_OVF = 1,\n\tREFCOUNT_ADD_UAF = 2,\n\tREFCOUNT_SUB_UAF = 3,\n\tREFCOUNT_DEC_LEAK = 4,\n};\n\nenum reg_arg_type {\n\tSRC_OP = 0,\n\tDST_OP = 1,\n\tDST_OP_NO_MARK = 2,\n};\n\nenum reg_type {\n\tREG_TYPE_RM = 0,\n\tREG_TYPE_REG = 1,\n\tREG_TYPE_INDEX = 2,\n\tREG_TYPE_BASE = 3,\n};\n\nenum regcache_type {\n\tREGCACHE_NONE = 0,\n\tREGCACHE_RBTREE = 1,\n\tREGCACHE_FLAT = 2,\n\tREGCACHE_MAPLE = 3,\n};\n\nenum regex_type {\n\tMATCH_FULL = 0,\n\tMATCH_FRONT_ONLY = 1,\n\tMATCH_MIDDLE_ONLY = 2,\n\tMATCH_END_ONLY = 3,\n\tMATCH_GLOB = 4,\n\tMATCH_INDEX = 5,\n};\n\nenum regmap_endian {\n\tREGMAP_ENDIAN_DEFAULT = 0,\n\tREGMAP_ENDIAN_BIG = 1,\n\tREGMAP_ENDIAN_LITTLE = 2,\n\tREGMAP_ENDIAN_NATIVE = 3,\n};\n\nenum regnames {\n\tGDB_AX = 0,\n\tGDB_BX = 1,\n\tGDB_CX = 2,\n\tGDB_DX = 3,\n\tGDB_SI = 4,\n\tGDB_DI = 5,\n\tGDB_BP = 6,\n\tGDB_SP = 7,\n\tGDB_R8 = 8,\n\tGDB_R9 = 9,\n\tGDB_R10 = 10,\n\tGDB_R11 = 11,\n\tGDB_R12 = 12,\n\tGDB_R13 = 13,\n\tGDB_R14 = 14,\n\tGDB_R15 = 15,\n\tGDB_PC = 16,\n\tGDB_PS = 17,\n\tGDB_CS = 18,\n\tGDB_SS = 19,\n\tGDB_DS = 20,\n\tGDB_ES = 21,\n\tGDB_FS = 22,\n\tGDB_GS = 23,\n};\n\nenum regulator_active_discharge {\n\tREGULATOR_ACTIVE_DISCHARGE_DEFAULT = 0,\n\tREGULATOR_ACTIVE_DISCHARGE_DISABLE = 1,\n\tREGULATOR_ACTIVE_DISCHARGE_ENABLE = 2,\n};\n\nenum regulator_detection_severity {\n\tREGULATOR_SEVERITY_PROT = 0,\n\tREGULATOR_SEVERITY_ERR = 1,\n\tREGULATOR_SEVERITY_WARN = 2,\n};\n\nenum regulator_get_type {\n\tNORMAL_GET = 0,\n\tEXCLUSIVE_GET = 1,\n\tOPTIONAL_GET = 2,\n\tMAX_GET_TYPE = 3,\n};\n\nenum regulator_status {\n\tREGULATOR_STATUS_OFF = 0,\n\tREGULATOR_STATUS_ON = 1,\n\tREGULATOR_STATUS_ERROR = 2,\n\tREGULATOR_STATUS_FAST = 3,\n\tREGULATOR_STATUS_NORMAL = 4,\n\tREGULATOR_STATUS_IDLE = 5,\n\tREGULATOR_STATUS_STANDBY = 6,\n\tREGULATOR_STATUS_BYPASS = 7,\n\tREGULATOR_STATUS_UNDEFINED = 8,\n};\n\nenum regulator_type {\n\tREGULATOR_VOLTAGE = 0,\n\tREGULATOR_CURRENT = 1,\n};\n\nenum release_type {\n\tleaf_only = 0,\n\twhole_subtree = 1,\n};\n\nenum req_flag_bits {\n\t__REQ_FAILFAST_DEV = 8,\n\t__REQ_FAILFAST_TRANSPORT = 9,\n\t__REQ_FAILFAST_DRIVER = 10,\n\t__REQ_SYNC = 11,\n\t__REQ_META = 12,\n\t__REQ_PRIO = 13,\n\t__REQ_NOMERGE = 14,\n\t__REQ_IDLE = 15,\n\t__REQ_INTEGRITY = 16,\n\t__REQ_FUA = 17,\n\t__REQ_PREFLUSH = 18,\n\t__REQ_RAHEAD = 19,\n\t__REQ_BACKGROUND = 20,\n\t__REQ_NOWAIT = 21,\n\t__REQ_POLLED = 22,\n\t__REQ_ALLOC_CACHE = 23,\n\t__REQ_SWAP = 24,\n\t__REQ_DRV = 25,\n\t__REQ_FS_PRIVATE = 26,\n\t__REQ_ATOMIC = 27,\n\t__REQ_NOUNMAP = 28,\n\t__REQ_NR_BITS = 29,\n};\n\nenum req_op {\n\tREQ_OP_READ = 0,\n\tREQ_OP_WRITE = 1,\n\tREQ_OP_FLUSH = 2,\n\tREQ_OP_DISCARD = 3,\n\tREQ_OP_SECURE_ERASE = 5,\n\tREQ_OP_ZONE_APPEND = 7,\n\tREQ_OP_WRITE_ZEROES = 9,\n\tREQ_OP_ZONE_OPEN = 10,\n\tREQ_OP_ZONE_CLOSE = 11,\n\tREQ_OP_ZONE_FINISH = 12,\n\tREQ_OP_ZONE_RESET = 13,\n\tREQ_OP_ZONE_RESET_ALL = 15,\n\tREQ_OP_DRV_IN = 34,\n\tREQ_OP_DRV_OUT = 35,\n\tREQ_OP_LAST = 36,\n};\n\nenum resctrl_conf_type {\n\tCDP_NONE = 0,\n\tCDP_CODE = 1,\n\tCDP_DATA = 2,\n};\n\nenum resctrl_domain_type {\n\tRESCTRL_CTRL_DOMAIN = 0,\n\tRESCTRL_MON_DOMAIN = 1,\n};\n\nenum resctrl_event_id {\n\tQOS_L3_OCCUP_EVENT_ID = 1,\n\tQOS_L3_MBM_TOTAL_EVENT_ID = 2,\n\tQOS_L3_MBM_LOCAL_EVENT_ID = 3,\n};\n\nenum resctrl_res_level {\n\tRDT_RESOURCE_L3 = 0,\n\tRDT_RESOURCE_L2 = 1,\n\tRDT_RESOURCE_MBA = 2,\n\tRDT_RESOURCE_SMBA = 3,\n\tRDT_NUM_RESOURCES = 4,\n};\n\nenum resctrl_scope {\n\tRESCTRL_L2_CACHE = 2,\n\tRESCTRL_L3_CACHE = 3,\n\tRESCTRL_L3_NODE = 4,\n};\n\nenum resolve_mode {\n\tRESOLVE_TBD = 0,\n\tRESOLVE_PTR = 1,\n\tRESOLVE_STRUCT_OR_ARRAY = 2,\n};\n\nenum retbleed_mitigation {\n\tRETBLEED_MITIGATION_NONE = 0,\n\tRETBLEED_MITIGATION_UNRET = 1,\n\tRETBLEED_MITIGATION_IBPB = 2,\n\tRETBLEED_MITIGATION_IBRS = 3,\n\tRETBLEED_MITIGATION_EIBRS = 4,\n\tRETBLEED_MITIGATION_STUFF = 5,\n};\n\nenum retbleed_mitigation_cmd {\n\tRETBLEED_CMD_OFF = 0,\n\tRETBLEED_CMD_AUTO = 1,\n\tRETBLEED_CMD_UNRET = 2,\n\tRETBLEED_CMD_IBPB = 3,\n\tRETBLEED_CMD_STUFF = 4,\n};\n\nenum rfds_mitigations {\n\tRFDS_MITIGATION_OFF = 0,\n\tRFDS_MITIGATION_VERW = 1,\n\tRFDS_MITIGATION_UCODE_NEEDED = 2,\n};\n\nenum rfkill_hard_block_reasons {\n\tRFKILL_HARD_BLOCK_SIGNAL = 1,\n\tRFKILL_HARD_BLOCK_NOT_OWNER = 2,\n};\n\nenum rfkill_input_master_mode {\n\tRFKILL_INPUT_MASTER_UNLOCK = 0,\n\tRFKILL_INPUT_MASTER_RESTORE = 1,\n\tRFKILL_INPUT_MASTER_UNBLOCKALL = 2,\n\tNUM_RFKILL_INPUT_MASTER_MODES = 3,\n};\n\nenum rfkill_operation {\n\tRFKILL_OP_ADD = 0,\n\tRFKILL_OP_DEL = 1,\n\tRFKILL_OP_CHANGE = 2,\n\tRFKILL_OP_CHANGE_ALL = 3,\n};\n\nenum rfkill_sched_op {\n\tRFKILL_GLOBAL_OP_EPO = 0,\n\tRFKILL_GLOBAL_OP_RESTORE = 1,\n\tRFKILL_GLOBAL_OP_UNLOCK = 2,\n\tRFKILL_GLOBAL_OP_UNBLOCK = 3,\n};\n\nenum rfkill_type {\n\tRFKILL_TYPE_ALL = 0,\n\tRFKILL_TYPE_WLAN = 1,\n\tRFKILL_TYPE_BLUETOOTH = 2,\n\tRFKILL_TYPE_UWB = 3,\n\tRFKILL_TYPE_WIMAX = 4,\n\tRFKILL_TYPE_WWAN = 5,\n\tRFKILL_TYPE_GPS = 6,\n\tRFKILL_TYPE_FM = 7,\n\tRFKILL_TYPE_NFC = 8,\n\tNUM_RFKILL_TYPES = 9,\n};\n\nenum rfkill_user_states {\n\tRFKILL_USER_STATE_SOFT_BLOCKED = 0,\n\tRFKILL_USER_STATE_UNBLOCKED = 1,\n\tRFKILL_USER_STATE_HARD_BLOCKED = 2,\n};\n\nenum ring_buffer_flags {\n\tRB_FL_OVERWRITE = 1,\n};\n\nenum ring_buffer_type {\n\tRINGBUF_TYPE_DATA_TYPE_LEN_MAX = 28,\n\tRINGBUF_TYPE_PADDING = 29,\n\tRINGBUF_TYPE_TIME_EXTEND = 30,\n\tRINGBUF_TYPE_TIME_STAMP = 31,\n};\n\nenum rio_device_state {\n\tRIO_DEVICE_INITIALIZING = 0,\n\tRIO_DEVICE_RUNNING = 1,\n\tRIO_DEVICE_GONE = 2,\n\tRIO_DEVICE_SHUTDOWN = 3,\n};\n\nenum rio_write_type {\n\tRDW_DEFAULT = 0,\n\tRDW_ALL_NWRITE = 1,\n\tRDW_ALL_NWRITE_R = 2,\n\tRDW_LAST_NWRITE_R = 3,\n};\n\nenum rlimit_type {\n\tUCOUNT_RLIMIT_NPROC = 0,\n\tUCOUNT_RLIMIT_MSGQUEUE = 1,\n\tUCOUNT_RLIMIT_SIGPENDING = 2,\n\tUCOUNT_RLIMIT_MEMLOCK = 3,\n\tUCOUNT_RLIMIT_COUNTS = 4,\n};\n\nenum rmap_level {\n\tRMAP_LEVEL_PTE = 0,\n\tRMAP_LEVEL_PMD = 1,\n};\n\nenum rp_check {\n\tRP_CHECK_CALL = 0,\n\tRP_CHECK_CHAIN_CALL = 1,\n\tRP_CHECK_RET = 2,\n};\n\nenum rpc_display_format_t {\n\tRPC_DISPLAY_ADDR = 0,\n\tRPC_DISPLAY_PORT = 1,\n\tRPC_DISPLAY_PROTO = 2,\n\tRPC_DISPLAY_HEX_ADDR = 3,\n\tRPC_DISPLAY_HEX_PORT = 4,\n\tRPC_DISPLAY_NETID = 5,\n\tRPC_DISPLAY_MAX = 6,\n};\n\nenum rpm_request {\n\tRPM_REQ_NONE = 0,\n\tRPM_REQ_IDLE = 1,\n\tRPM_REQ_SUSPEND = 2,\n\tRPM_REQ_AUTOSUSPEND = 3,\n\tRPM_REQ_RESUME = 4,\n};\n\nenum rpm_status {\n\tRPM_INVALID = -1,\n\tRPM_ACTIVE = 0,\n\tRPM_RESUMING = 1,\n\tRPM_SUSPENDED = 2,\n\tRPM_SUSPENDING = 3,\n};\n\nenum rproc_crash_type {\n\tRPROC_MMUFAULT = 0,\n\tRPROC_WATCHDOG = 1,\n\tRPROC_FATAL_ERROR = 2,\n};\n\nenum rproc_dump_mechanism {\n\tRPROC_COREDUMP_DISABLED = 0,\n\tRPROC_COREDUMP_ENABLED = 1,\n\tRPROC_COREDUMP_INLINE = 2,\n};\n\nenum rproc_features {\n\tRPROC_FEAT_ATTACH_ON_RECOVERY = 0,\n\tRPROC_MAX_FEATURES = 1,\n};\n\nenum rproc_state {\n\tRPROC_OFFLINE = 0,\n\tRPROC_SUSPENDED = 1,\n\tRPROC_RUNNING = 2,\n\tRPROC_CRASHED = 3,\n\tRPROC_DELETED = 4,\n\tRPROC_ATTACHED = 5,\n\tRPROC_DETACHED = 6,\n\tRPROC_LAST = 7,\n};\n\nenum rq_end_io_ret {\n\tRQ_END_IO_NONE = 0,\n\tRQ_END_IO_FREE = 1,\n};\n\nenum rq_qos_id {\n\tRQ_QOS_WBT = 0,\n\tRQ_QOS_LATENCY = 1,\n\tRQ_QOS_COST = 2,\n};\n\nenum rsaprivkey_actions {\n\tACT_rsa_get_d = 0,\n\tACT_rsa_get_dp = 1,\n\tACT_rsa_get_dq = 2,\n\tACT_rsa_get_e = 3,\n\tACT_rsa_get_n = 4,\n\tACT_rsa_get_p = 5,\n\tACT_rsa_get_q = 6,\n\tACT_rsa_get_qinv = 7,\n\tNR__rsaprivkey_actions = 8,\n};\n\nenum rsapubkey_actions {\n\tACT_rsa_get_e___2 = 0,\n\tACT_rsa_get_n___2 = 1,\n\tNR__rsapubkey_actions = 2,\n};\n\nenum rsc_handling_status {\n\tRSC_HANDLED = 0,\n\tRSC_IGNORED = 1,\n};\n\nenum rseq_cpu_id_state {\n\tRSEQ_CPU_ID_UNINITIALIZED = -1,\n\tRSEQ_CPU_ID_REGISTRATION_FAILED = -2,\n};\n\nenum rseq_cs_flags {\n\tRSEQ_CS_FLAG_NO_RESTART_ON_PREEMPT = 1,\n\tRSEQ_CS_FLAG_NO_RESTART_ON_SIGNAL = 2,\n\tRSEQ_CS_FLAG_NO_RESTART_ON_MIGRATE = 4,\n};\n\nenum rseq_cs_flags_bit {\n\tRSEQ_CS_FLAG_NO_RESTART_ON_PREEMPT_BIT = 0,\n\tRSEQ_CS_FLAG_NO_RESTART_ON_SIGNAL_BIT = 1,\n\tRSEQ_CS_FLAG_NO_RESTART_ON_MIGRATE_BIT = 2,\n};\n\nenum rseq_event_mask_bits {\n\tRSEQ_EVENT_PREEMPT_BIT = 0,\n\tRSEQ_EVENT_SIGNAL_BIT = 1,\n\tRSEQ_EVENT_MIGRATE_BIT = 2,\n};\n\nenum rseq_flags {\n\tRSEQ_FLAG_UNREGISTER = 1,\n};\n\nenum rt6_nud_state {\n\tRT6_NUD_FAIL_HARD = -3,\n\tRT6_NUD_FAIL_PROBE = -2,\n\tRT6_NUD_FAIL_DO_RR = -1,\n\tRT6_NUD_SUCCEED = 1,\n};\n\nenum rt_class_t {\n\tRT_TABLE_UNSPEC = 0,\n\tRT_TABLE_COMPAT = 252,\n\tRT_TABLE_DEFAULT = 253,\n\tRT_TABLE_MAIN = 254,\n\tRT_TABLE_LOCAL = 255,\n\tRT_TABLE_MAX = 4294967295,\n};\n\nenum rt_scope_t {\n\tRT_SCOPE_UNIVERSE = 0,\n\tRT_SCOPE_SITE = 200,\n\tRT_SCOPE_LINK = 253,\n\tRT_SCOPE_HOST = 254,\n\tRT_SCOPE_NOWHERE = 255,\n};\n\nenum rtattr_type_t {\n\tRTA_UNSPEC = 0,\n\tRTA_DST = 1,\n\tRTA_SRC = 2,\n\tRTA_IIF = 3,\n\tRTA_OIF = 4,\n\tRTA_GATEWAY = 5,\n\tRTA_PRIORITY = 6,\n\tRTA_PREFSRC = 7,\n\tRTA_METRICS = 8,\n\tRTA_MULTIPATH = 9,\n\tRTA_PROTOINFO = 10,\n\tRTA_FLOW = 11,\n\tRTA_CACHEINFO = 12,\n\tRTA_SESSION = 13,\n\tRTA_MP_ALGO = 14,\n\tRTA_TABLE = 15,\n\tRTA_MARK = 16,\n\tRTA_MFC_STATS = 17,\n\tRTA_VIA = 18,\n\tRTA_NEWDST = 19,\n\tRTA_PREF = 20,\n\tRTA_ENCAP_TYPE = 21,\n\tRTA_ENCAP = 22,\n\tRTA_EXPIRES = 23,\n\tRTA_PAD = 24,\n\tRTA_UID = 25,\n\tRTA_TTL_PROPAGATE = 26,\n\tRTA_IP_PROTO = 27,\n\tRTA_SPORT = 28,\n\tRTA_DPORT = 29,\n\tRTA_NH_ID = 30,\n\t__RTA_MAX = 31,\n};\n\nenum rtmutex_chainwalk {\n\tRT_MUTEX_MIN_CHAINWALK = 0,\n\tRT_MUTEX_FULL_CHAINWALK = 1,\n};\n\nenum rtnetlink_groups {\n\tRTNLGRP_NONE = 0,\n\tRTNLGRP_LINK = 1,\n\tRTNLGRP_NOTIFY = 2,\n\tRTNLGRP_NEIGH = 3,\n\tRTNLGRP_TC = 4,\n\tRTNLGRP_IPV4_IFADDR = 5,\n\tRTNLGRP_IPV4_MROUTE = 6,\n\tRTNLGRP_IPV4_ROUTE = 7,\n\tRTNLGRP_IPV4_RULE = 8,\n\tRTNLGRP_IPV6_IFADDR = 9,\n\tRTNLGRP_IPV6_MROUTE = 10,\n\tRTNLGRP_IPV6_ROUTE = 11,\n\tRTNLGRP_IPV6_IFINFO = 12,\n\tRTNLGRP_DECnet_IFADDR = 13,\n\tRTNLGRP_NOP2 = 14,\n\tRTNLGRP_DECnet_ROUTE = 15,\n\tRTNLGRP_DECnet_RULE = 16,\n\tRTNLGRP_NOP4 = 17,\n\tRTNLGRP_IPV6_PREFIX = 18,\n\tRTNLGRP_IPV6_RULE = 19,\n\tRTNLGRP_ND_USEROPT = 20,\n\tRTNLGRP_PHONET_IFADDR = 21,\n\tRTNLGRP_PHONET_ROUTE = 22,\n\tRTNLGRP_DCB = 23,\n\tRTNLGRP_IPV4_NETCONF = 24,\n\tRTNLGRP_IPV6_NETCONF = 25,\n\tRTNLGRP_MDB = 26,\n\tRTNLGRP_MPLS_ROUTE = 27,\n\tRTNLGRP_NSID = 28,\n\tRTNLGRP_MPLS_NETCONF = 29,\n\tRTNLGRP_IPV4_MROUTE_R = 30,\n\tRTNLGRP_IPV6_MROUTE_R = 31,\n\tRTNLGRP_NEXTHOP = 32,\n\tRTNLGRP_BRVLAN = 33,\n\tRTNLGRP_MCTP_IFADDR = 34,\n\tRTNLGRP_TUNNEL = 35,\n\tRTNLGRP_STATS = 36,\n\t__RTNLGRP_MAX = 37,\n};\n\nenum rtnl_kinds {\n\tRTNL_KIND_NEW = 0,\n\tRTNL_KIND_DEL = 1,\n\tRTNL_KIND_GET = 2,\n\tRTNL_KIND_SET = 3,\n};\n\nenum rtnl_link_flags {\n\tRTNL_FLAG_DOIT_UNLOCKED = 1,\n\tRTNL_FLAG_BULK_DEL_SUPPORTED = 2,\n\tRTNL_FLAG_DUMP_UNLOCKED = 4,\n\tRTNL_FLAG_DUMP_SPLIT_NLM_DONE = 8,\n};\n\nenum rw_hint {\n\tWRITE_LIFE_NOT_SET = 0,\n\tWRITE_LIFE_NONE = 1,\n\tWRITE_LIFE_SHORT = 2,\n\tWRITE_LIFE_MEDIUM = 3,\n\tWRITE_LIFE_LONG = 4,\n\tWRITE_LIFE_EXTREME = 5,\n} __attribute__((mode(byte)));\n\nenum rwsem_waiter_type {\n\tRWSEM_WAITING_FOR_WRITE = 0,\n\tRWSEM_WAITING_FOR_READ = 1,\n};\n\nenum rwsem_wake_type {\n\tRWSEM_WAKE_ANY = 0,\n\tRWSEM_WAKE_READERS = 1,\n\tRWSEM_WAKE_READ_OWNED = 2,\n};\n\nenum rx_handler_result {\n\tRX_HANDLER_CONSUMED = 0,\n\tRX_HANDLER_ANOTHER = 1,\n\tRX_HANDLER_EXACT = 2,\n\tRX_HANDLER_PASS = 3,\n};\n\ntypedef enum rx_handler_result rx_handler_result_t;\n\nenum s2idle_states {\n\tS2IDLE_STATE_NONE = 0,\n\tS2IDLE_STATE_ENTER = 1,\n\tS2IDLE_STATE_WAKE = 2,\n};\n\nenum s_alloc {\n\tsa_rootdomain = 0,\n\tsa_sd = 1,\n\tsa_sd_storage = 2,\n\tsa_none = 3,\n};\n\nenum sam_status {\n\tSAM_STAT_GOOD = 0,\n\tSAM_STAT_CHECK_CONDITION = 2,\n\tSAM_STAT_CONDITION_MET = 4,\n\tSAM_STAT_BUSY = 8,\n\tSAM_STAT_INTERMEDIATE = 16,\n\tSAM_STAT_INTERMEDIATE_CONDITION_MET = 20,\n\tSAM_STAT_RESERVATION_CONFLICT = 24,\n\tSAM_STAT_COMMAND_TERMINATED = 34,\n\tSAM_STAT_TASK_SET_FULL = 40,\n\tSAM_STAT_ACA_ACTIVE = 48,\n\tSAM_STAT_TASK_ABORTED = 64,\n};\n\nenum scan_balance {\n\tSCAN_EQUAL = 0,\n\tSCAN_FRACT = 1,\n\tSCAN_ANON = 2,\n\tSCAN_FILE = 3,\n};\n\nenum scan_result {\n\tSCAN_FAIL = 0,\n\tSCAN_SUCCEED = 1,\n\tSCAN_PMD_NULL = 2,\n\tSCAN_PMD_NONE = 3,\n\tSCAN_PMD_MAPPED = 4,\n\tSCAN_EXCEED_NONE_PTE = 5,\n\tSCAN_EXCEED_SWAP_PTE = 6,\n\tSCAN_EXCEED_SHARED_PTE = 7,\n\tSCAN_PTE_NON_PRESENT = 8,\n\tSCAN_PTE_UFFD_WP = 9,\n\tSCAN_PTE_MAPPED_HUGEPAGE = 10,\n\tSCAN_PAGE_RO = 11,\n\tSCAN_LACK_REFERENCED_PAGE = 12,\n\tSCAN_PAGE_NULL = 13,\n\tSCAN_SCAN_ABORT = 14,\n\tSCAN_PAGE_COUNT = 15,\n\tSCAN_PAGE_LRU = 16,\n\tSCAN_PAGE_LOCK = 17,\n\tSCAN_PAGE_ANON = 18,\n\tSCAN_PAGE_COMPOUND = 19,\n\tSCAN_ANY_PROCESS = 20,\n\tSCAN_VMA_NULL = 21,\n\tSCAN_VMA_CHECK = 22,\n\tSCAN_ADDRESS_RANGE = 23,\n\tSCAN_DEL_PAGE_LRU = 24,\n\tSCAN_ALLOC_HUGE_PAGE_FAIL = 25,\n\tSCAN_CGROUP_CHARGE_FAIL = 26,\n\tSCAN_TRUNCATED = 27,\n\tSCAN_PAGE_HAS_PRIVATE = 28,\n\tSCAN_STORE_FAILED = 29,\n\tSCAN_COPY_MC = 30,\n\tSCAN_PAGE_FILLED = 31,\n};\n\nenum sched_tunable_scaling {\n\tSCHED_TUNABLESCALING_NONE = 0,\n\tSCHED_TUNABLESCALING_LOG = 1,\n\tSCHED_TUNABLESCALING_LINEAR = 2,\n\tSCHED_TUNABLESCALING_END = 3,\n};\n\nenum scrub_type {\n\tSCRUB_UNKNOWN = 0,\n\tSCRUB_NONE = 1,\n\tSCRUB_SW_PROG = 2,\n\tSCRUB_SW_SRC = 3,\n\tSCRUB_SW_PROG_SRC = 4,\n\tSCRUB_SW_TUNABLE = 5,\n\tSCRUB_HW_PROG = 6,\n\tSCRUB_HW_SRC = 7,\n\tSCRUB_HW_PROG_SRC = 8,\n\tSCRUB_HW_TUNABLE = 9,\n};\n\nenum scsi_cmnd_submitter {\n\tSUBMITTED_BY_BLOCK_LAYER = 0,\n\tSUBMITTED_BY_SCSI_ERROR_HANDLER = 1,\n\tSUBMITTED_BY_SCSI_RESET_IOCTL = 2,\n} __attribute__((mode(byte)));\n\nenum scsi_device_event {\n\tSDEV_EVT_MEDIA_CHANGE = 1,\n\tSDEV_EVT_INQUIRY_CHANGE_REPORTED = 2,\n\tSDEV_EVT_CAPACITY_CHANGE_REPORTED = 3,\n\tSDEV_EVT_SOFT_THRESHOLD_REACHED_REPORTED = 4,\n\tSDEV_EVT_MODE_PARAMETER_CHANGE_REPORTED = 5,\n\tSDEV_EVT_LUN_CHANGE_REPORTED = 6,\n\tSDEV_EVT_ALUA_STATE_CHANGE_REPORTED = 7,\n\tSDEV_EVT_POWER_ON_RESET_OCCURRED = 8,\n\tSDEV_EVT_FIRST = 1,\n\tSDEV_EVT_LAST = 8,\n\tSDEV_EVT_MAXBITS = 9,\n};\n\nenum scsi_device_state {\n\tSDEV_CREATED = 1,\n\tSDEV_RUNNING = 2,\n\tSDEV_CANCEL = 3,\n\tSDEV_DEL = 4,\n\tSDEV_QUIESCE = 5,\n\tSDEV_OFFLINE = 6,\n\tSDEV_TRANSPORT_OFFLINE = 7,\n\tSDEV_BLOCK = 8,\n\tSDEV_CREATED_BLOCK = 9,\n};\n\nenum scsi_devinfo_key {\n\tSCSI_DEVINFO_GLOBAL = 0,\n\tSCSI_DEVINFO_SPI = 1,\n};\n\nenum scsi_disposition {\n\tNEEDS_RETRY = 8193,\n\tSUCCESS = 8194,\n\tFAILED = 8195,\n\tQUEUED = 8196,\n\tSOFT_ERROR = 8197,\n\tADD_TO_MLQUEUE = 8198,\n\tTIMEOUT_ERROR = 8199,\n\tSCSI_RETURN_NOT_HANDLED = 8200,\n\tFAST_IO_FAIL = 8201,\n};\n\nenum scsi_host_guard_type {\n\tSHOST_DIX_GUARD_CRC = 1,\n\tSHOST_DIX_GUARD_IP = 2,\n};\n\nenum scsi_host_prot_capabilities {\n\tSHOST_DIF_TYPE1_PROTECTION = 1,\n\tSHOST_DIF_TYPE2_PROTECTION = 2,\n\tSHOST_DIF_TYPE3_PROTECTION = 4,\n\tSHOST_DIX_TYPE0_PROTECTION = 8,\n\tSHOST_DIX_TYPE1_PROTECTION = 16,\n\tSHOST_DIX_TYPE2_PROTECTION = 32,\n\tSHOST_DIX_TYPE3_PROTECTION = 64,\n};\n\nenum scsi_host_state {\n\tSHOST_CREATED = 1,\n\tSHOST_RUNNING = 2,\n\tSHOST_CANCEL = 3,\n\tSHOST_DEL = 4,\n\tSHOST_RECOVERY = 5,\n\tSHOST_CANCEL_RECOVERY = 6,\n\tSHOST_DEL_RECOVERY = 7,\n};\n\nenum scsi_host_status {\n\tDID_OK = 0,\n\tDID_NO_CONNECT = 1,\n\tDID_BUS_BUSY = 2,\n\tDID_TIME_OUT = 3,\n\tDID_BAD_TARGET = 4,\n\tDID_ABORT = 5,\n\tDID_PARITY = 6,\n\tDID_ERROR = 7,\n\tDID_RESET = 8,\n\tDID_BAD_INTR = 9,\n\tDID_PASSTHROUGH = 10,\n\tDID_SOFT_ERROR = 11,\n\tDID_IMM_RETRY = 12,\n\tDID_REQUEUE = 13,\n\tDID_TRANSPORT_DISRUPTED = 14,\n\tDID_TRANSPORT_FAILFAST = 15,\n\tDID_TRANSPORT_MARGINAL = 20,\n};\n\nenum scsi_ml_status {\n\tSCSIML_STAT_OK = 0,\n\tSCSIML_STAT_RESV_CONFLICT = 1,\n\tSCSIML_STAT_NOSPC = 2,\n\tSCSIML_STAT_MED_ERROR = 3,\n\tSCSIML_STAT_TGT_FAILURE = 4,\n\tSCSIML_STAT_DL_TIMEOUT = 5,\n};\n\nenum scsi_msg_byte {\n\tCOMMAND_COMPLETE = 0,\n\tEXTENDED_MESSAGE = 1,\n\tSAVE_POINTERS = 2,\n\tRESTORE_POINTERS = 3,\n\tDISCONNECT = 4,\n\tINITIATOR_ERROR = 5,\n\tABORT_TASK_SET = 6,\n\tMESSAGE_REJECT = 7,\n\tNOP___2 = 8,\n\tMSG_PARITY_ERROR = 9,\n\tLINKED_CMD_COMPLETE = 10,\n\tLINKED_FLG_CMD_COMPLETE = 11,\n\tTARGET_RESET = 12,\n\tABORT_TASK = 13,\n\tCLEAR_TASK_SET = 14,\n\tINITIATE_RECOVERY = 15,\n\tRELEASE_RECOVERY = 16,\n\tTERMINATE_IO_PROC = 17,\n\tCLEAR_ACA = 22,\n\tLOGICAL_UNIT_RESET = 23,\n\tSIMPLE_QUEUE_TAG = 32,\n\tHEAD_OF_QUEUE_TAG = 33,\n\tORDERED_QUEUE_TAG = 34,\n\tIGNORE_WIDE_RESIDUE = 35,\n\tACA = 36,\n\tQAS_REQUEST = 85,\n\tBUS_DEVICE_RESET = 12,\n\tABORT = 6,\n};\n\nenum scsi_pr_type {\n\tSCSI_PR_WRITE_EXCLUSIVE = 1,\n\tSCSI_PR_EXCLUSIVE_ACCESS = 3,\n\tSCSI_PR_WRITE_EXCLUSIVE_REG_ONLY = 5,\n\tSCSI_PR_EXCLUSIVE_ACCESS_REG_ONLY = 6,\n\tSCSI_PR_WRITE_EXCLUSIVE_ALL_REGS = 7,\n\tSCSI_PR_EXCLUSIVE_ACCESS_ALL_REGS = 8,\n};\n\nenum scsi_prot_flags {\n\tSCSI_PROT_TRANSFER_PI = 1,\n\tSCSI_PROT_GUARD_CHECK = 2,\n\tSCSI_PROT_REF_CHECK = 4,\n\tSCSI_PROT_REF_INCREMENT = 8,\n\tSCSI_PROT_IP_CHECKSUM = 16,\n};\n\nenum scsi_prot_operations {\n\tSCSI_PROT_NORMAL = 0,\n\tSCSI_PROT_READ_INSERT = 1,\n\tSCSI_PROT_WRITE_STRIP = 2,\n\tSCSI_PROT_READ_STRIP = 3,\n\tSCSI_PROT_WRITE_INSERT = 4,\n\tSCSI_PROT_READ_PASS = 5,\n\tSCSI_PROT_WRITE_PASS = 6,\n};\n\nenum scsi_scan_mode {\n\tSCSI_SCAN_INITIAL = 0,\n\tSCSI_SCAN_RESCAN = 1,\n\tSCSI_SCAN_MANUAL = 2,\n};\n\nenum scsi_target_state {\n\tSTARGET_CREATED = 1,\n\tSTARGET_RUNNING = 2,\n\tSTARGET_REMOVE = 3,\n\tSTARGET_CREATED_REMOVE = 4,\n\tSTARGET_DEL = 5,\n};\n\nenum scsi_timeout_action {\n\tSCSI_EH_DONE = 0,\n\tSCSI_EH_RESET_TIMER = 1,\n\tSCSI_EH_NOT_HANDLED = 2,\n};\n\nenum scsi_timeouts {\n\tSCSI_DEFAULT_EH_TIMEOUT = 10000,\n};\n\nenum scsi_vpd_parameters {\n\tSCSI_VPD_HEADER_SIZE = 4,\n\tSCSI_VPD_LIST_SIZE = 36,\n};\n\nenum sctp_cid {\n\tSCTP_CID_DATA = 0,\n\tSCTP_CID_INIT = 1,\n\tSCTP_CID_INIT_ACK = 2,\n\tSCTP_CID_SACK = 3,\n\tSCTP_CID_HEARTBEAT = 4,\n\tSCTP_CID_HEARTBEAT_ACK = 5,\n\tSCTP_CID_ABORT = 6,\n\tSCTP_CID_SHUTDOWN = 7,\n\tSCTP_CID_SHUTDOWN_ACK = 8,\n\tSCTP_CID_ERROR = 9,\n\tSCTP_CID_COOKIE_ECHO = 10,\n\tSCTP_CID_COOKIE_ACK = 11,\n\tSCTP_CID_ECN_ECNE = 12,\n\tSCTP_CID_ECN_CWR = 13,\n\tSCTP_CID_SHUTDOWN_COMPLETE = 14,\n\tSCTP_CID_AUTH = 15,\n\tSCTP_CID_I_DATA = 64,\n\tSCTP_CID_FWD_TSN = 192,\n\tSCTP_CID_ASCONF = 193,\n\tSCTP_CID_I_FWD_TSN = 194,\n\tSCTP_CID_ASCONF_ACK = 128,\n\tSCTP_CID_RECONF = 130,\n\tSCTP_CID_PAD = 132,\n};\n\nenum sctp_conntrack {\n\tSCTP_CONNTRACK_NONE = 0,\n\tSCTP_CONNTRACK_CLOSED = 1,\n\tSCTP_CONNTRACK_COOKIE_WAIT = 2,\n\tSCTP_CONNTRACK_COOKIE_ECHOED = 3,\n\tSCTP_CONNTRACK_ESTABLISHED = 4,\n\tSCTP_CONNTRACK_SHUTDOWN_SENT = 5,\n\tSCTP_CONNTRACK_SHUTDOWN_RECD = 6,\n\tSCTP_CONNTRACK_SHUTDOWN_ACK_SENT = 7,\n\tSCTP_CONNTRACK_HEARTBEAT_SENT = 8,\n\tSCTP_CONNTRACK_HEARTBEAT_ACKED = 9,\n\tSCTP_CONNTRACK_MAX = 10,\n};\n\nenum sctp_endpoint_type {\n\tSCTP_EP_TYPE_SOCKET = 0,\n\tSCTP_EP_TYPE_ASSOCIATION = 1,\n};\n\nenum sctp_event_timeout {\n\tSCTP_EVENT_TIMEOUT_NONE = 0,\n\tSCTP_EVENT_TIMEOUT_T1_COOKIE = 1,\n\tSCTP_EVENT_TIMEOUT_T1_INIT = 2,\n\tSCTP_EVENT_TIMEOUT_T2_SHUTDOWN = 3,\n\tSCTP_EVENT_TIMEOUT_T3_RTX = 4,\n\tSCTP_EVENT_TIMEOUT_T4_RTO = 5,\n\tSCTP_EVENT_TIMEOUT_T5_SHUTDOWN_GUARD = 6,\n\tSCTP_EVENT_TIMEOUT_HEARTBEAT = 7,\n\tSCTP_EVENT_TIMEOUT_RECONF = 8,\n\tSCTP_EVENT_TIMEOUT_PROBE = 9,\n\tSCTP_EVENT_TIMEOUT_SACK = 10,\n\tSCTP_EVENT_TIMEOUT_AUTOCLOSE = 11,\n};\n\nenum sctp_msg_flags {\n\tMSG_NOTIFICATION = 32768,\n};\n\nenum sctp_param {\n\tSCTP_PARAM_HEARTBEAT_INFO = 256,\n\tSCTP_PARAM_IPV4_ADDRESS = 1280,\n\tSCTP_PARAM_IPV6_ADDRESS = 1536,\n\tSCTP_PARAM_STATE_COOKIE = 1792,\n\tSCTP_PARAM_UNRECOGNIZED_PARAMETERS = 2048,\n\tSCTP_PARAM_COOKIE_PRESERVATIVE = 2304,\n\tSCTP_PARAM_HOST_NAME_ADDRESS = 2816,\n\tSCTP_PARAM_SUPPORTED_ADDRESS_TYPES = 3072,\n\tSCTP_PARAM_ECN_CAPABLE = 128,\n\tSCTP_PARAM_RANDOM = 640,\n\tSCTP_PARAM_CHUNKS = 896,\n\tSCTP_PARAM_HMAC_ALGO = 1152,\n\tSCTP_PARAM_SUPPORTED_EXT = 2176,\n\tSCTP_PARAM_FWD_TSN_SUPPORT = 192,\n\tSCTP_PARAM_ADD_IP = 448,\n\tSCTP_PARAM_DEL_IP = 704,\n\tSCTP_PARAM_ERR_CAUSE = 960,\n\tSCTP_PARAM_SET_PRIMARY = 1216,\n\tSCTP_PARAM_SUCCESS_REPORT = 1472,\n\tSCTP_PARAM_ADAPTATION_LAYER_IND = 1728,\n\tSCTP_PARAM_RESET_OUT_REQUEST = 3328,\n\tSCTP_PARAM_RESET_IN_REQUEST = 3584,\n\tSCTP_PARAM_RESET_TSN_REQUEST = 3840,\n\tSCTP_PARAM_RESET_RESPONSE = 4096,\n\tSCTP_PARAM_RESET_ADD_OUT_STREAMS = 4352,\n\tSCTP_PARAM_RESET_ADD_IN_STREAMS = 4608,\n};\n\nenum sctp_scope {\n\tSCTP_SCOPE_GLOBAL = 0,\n\tSCTP_SCOPE_PRIVATE = 1,\n\tSCTP_SCOPE_LINK = 2,\n\tSCTP_SCOPE_LOOPBACK = 3,\n\tSCTP_SCOPE_UNUSABLE = 4,\n};\n\nenum sctp_socket_type {\n\tSCTP_SOCKET_UDP = 0,\n\tSCTP_SOCKET_UDP_HIGH_BANDWIDTH = 1,\n\tSCTP_SOCKET_TCP = 2,\n};\n\nenum sctp_state {\n\tSCTP_STATE_CLOSED = 0,\n\tSCTP_STATE_COOKIE_WAIT = 1,\n\tSCTP_STATE_COOKIE_ECHOED = 2,\n\tSCTP_STATE_ESTABLISHED = 3,\n\tSCTP_STATE_SHUTDOWN_PENDING = 4,\n\tSCTP_STATE_SHUTDOWN_SENT = 5,\n\tSCTP_STATE_SHUTDOWN_RECEIVED = 6,\n\tSCTP_STATE_SHUTDOWN_ACK_SENT = 7,\n};\n\nenum security_cmd_enabled_bits {\n\tCXL_SEC_ENABLED_SANITIZE = 0,\n\tCXL_SEC_ENABLED_SECURE_ERASE = 1,\n\tCXL_SEC_ENABLED_GET_SECURITY_STATE = 2,\n\tCXL_SEC_ENABLED_SET_PASSPHRASE = 3,\n\tCXL_SEC_ENABLED_DISABLE_PASSPHRASE = 4,\n\tCXL_SEC_ENABLED_UNLOCK = 5,\n\tCXL_SEC_ENABLED_FREEZE_SECURITY = 6,\n\tCXL_SEC_ENABLED_PASSPHRASE_SECURE_ERASE = 7,\n\tCXL_SEC_ENABLED_MAX = 8,\n};\n\nenum seg6_end_dt_mode {\n\tDT_INVALID_MODE = -22,\n\tDT_LEGACY_MODE = 0,\n\tDT_VRF_MODE = 1,\n};\n\nenum seg6_local_flv_action {\n\tSEG6_LOCAL_FLV_ACT_UNSPEC = 0,\n\tSEG6_LOCAL_FLV_ACT_END = 1,\n\tSEG6_LOCAL_FLV_ACT_PSP = 2,\n\tSEG6_LOCAL_FLV_ACT_USP = 3,\n\tSEG6_LOCAL_FLV_ACT_USD = 4,\n\t__SEG6_LOCAL_FLV_ACT_MAX = 5,\n};\n\nenum seg6_local_pktinfo {\n\tSEG6_LOCAL_PKTINFO_NOHDR = 0,\n\tSEG6_LOCAL_PKTINFO_SL_ZERO = 1,\n\tSEG6_LOCAL_PKTINFO_SL_ONE = 2,\n\tSEG6_LOCAL_PKTINFO_SL_MORE = 3,\n\t__SEG6_LOCAL_PKTINFO_MAX = 4,\n};\n\nenum sel_inos {\n\tSEL_ROOT_INO = 2,\n\tSEL_LOAD = 3,\n\tSEL_ENFORCE = 4,\n\tSEL_CONTEXT = 5,\n\tSEL_ACCESS = 6,\n\tSEL_CREATE = 7,\n\tSEL_RELABEL = 8,\n\tSEL_USER = 9,\n\tSEL_POLICYVERS = 10,\n\tSEL_COMMIT_BOOLS = 11,\n\tSEL_MLS = 12,\n\tSEL_DISABLE = 13,\n\tSEL_MEMBER = 14,\n\tSEL_CHECKREQPROT = 15,\n\tSEL_COMPAT_NET = 16,\n\tSEL_REJECT_UNKNOWN = 17,\n\tSEL_DENY_UNKNOWN = 18,\n\tSEL_STATUS = 19,\n\tSEL_POLICY = 20,\n\tSEL_VALIDATE_TRANS = 21,\n\tSEL_INO_NEXT = 22,\n};\n\nenum selinux_nlgroups {\n\tSELNLGRP_NONE = 0,\n\tSELNLGRP_AVC = 1,\n\t__SELNLGRP_MAX = 2,\n};\n\nenum ser {\n\tSER_REQUIRED = 1,\n\tNO_SER = 2,\n};\n\nenum serdev_parity {\n\tSERDEV_PARITY_NONE = 0,\n\tSERDEV_PARITY_EVEN = 1,\n\tSERDEV_PARITY_ODD = 2,\n};\n\nenum serio_event_type {\n\tSERIO_RESCAN_PORT = 0,\n\tSERIO_RECONNECT_PORT = 1,\n\tSERIO_RECONNECT_SUBTREE = 2,\n\tSERIO_REGISTER_PORT = 3,\n\tSERIO_ATTACH_DRIVER = 4,\n};\n\nenum setid_type {\n\tUID = 0,\n\tGID = 1,\n};\n\nenum severity_level {\n\tMCE_NO_SEVERITY = 0,\n\tMCE_DEFERRED_SEVERITY = 1,\n\tMCE_UCNA_SEVERITY = 1,\n\tMCE_KEEP_SEVERITY = 2,\n\tMCE_SOME_SEVERITY = 3,\n\tMCE_AO_SEVERITY = 4,\n\tMCE_UC_SEVERITY = 5,\n\tMCE_AR_SEVERITY = 6,\n\tMCE_PANIC_SEVERITY = 7,\n};\n\nenum sgp_type {\n\tSGP_READ = 0,\n\tSGP_NOALLOC = 1,\n\tSGP_CACHE = 2,\n\tSGP_WRITE = 3,\n\tSGP_FALLOC = 4,\n};\n\nenum sgx_attribute {\n\tSGX_ATTR_INIT = 1,\n\tSGX_ATTR_DEBUG = 2,\n\tSGX_ATTR_MODE64BIT = 4,\n\tSGX_ATTR_PROVISIONKEY = 16,\n\tSGX_ATTR_EINITTOKENKEY = 32,\n\tSGX_ATTR_KSS = 128,\n\tSGX_ATTR_ASYNC_EXIT_NOTIFY = 1024,\n};\n\nenum sgx_encl_flags {\n\tSGX_ENCL_IOCTL = 1,\n\tSGX_ENCL_DEBUG = 2,\n\tSGX_ENCL_CREATED = 4,\n\tSGX_ENCL_INITIALIZED = 8,\n};\n\nenum sgx_encls_function {\n\tECREATE = 0,\n\tEADD = 1,\n\tEINIT = 2,\n\tEREMOVE = 3,\n\tEDGBRD = 4,\n\tEDGBWR = 5,\n\tEEXTEND = 6,\n\tELDU = 8,\n\tEBLOCK = 9,\n\tEPA = 10,\n\tEWB = 11,\n\tETRACK = 12,\n\tEAUG = 13,\n\tEMODPR = 14,\n\tEMODT = 15,\n};\n\nenum sgx_page_flags {\n\tSGX_PAGE_MEASURE = 1,\n};\n\nenum sgx_page_type {\n\tSGX_PAGE_TYPE_SECS = 0,\n\tSGX_PAGE_TYPE_TCS = 1,\n\tSGX_PAGE_TYPE_REG = 2,\n\tSGX_PAGE_TYPE_VA = 3,\n\tSGX_PAGE_TYPE_TRIM = 4,\n};\n\nenum sgx_return_code {\n\tSGX_EPC_PAGE_CONFLICT = 7,\n\tSGX_NOT_TRACKED = 11,\n\tSGX_CHILD_PRESENT = 13,\n\tSGX_INVALID_EINITTOKEN = 16,\n\tSGX_PAGE_NOT_MODIFIABLE = 20,\n\tSGX_UNMASKED_EVENT = 128,\n};\n\nenum sgx_secinfo_flags {\n\tSGX_SECINFO_R = 1,\n\tSGX_SECINFO_W = 2,\n\tSGX_SECINFO_X = 4,\n\tSGX_SECINFO_SECS = 0,\n\tSGX_SECINFO_TCS = 256,\n\tSGX_SECINFO_REG = 512,\n\tSGX_SECINFO_VA = 768,\n\tSGX_SECINFO_TRIM = 1024,\n};\n\nenum shmem_param {\n\tOpt_gid___8 = 0,\n\tOpt_huge = 1,\n\tOpt_mode___6 = 2,\n\tOpt_mpol = 3,\n\tOpt_nr_blocks = 4,\n\tOpt_nr_inodes___2 = 5,\n\tOpt_size___2 = 6,\n\tOpt_uid___7 = 7,\n\tOpt_inode32 = 8,\n\tOpt_inode64 = 9,\n\tOpt_noswap = 10,\n\tOpt_quota___2 = 11,\n\tOpt_usrquota___2 = 12,\n\tOpt_grpquota___2 = 13,\n\tOpt_usrquota_block_hardlimit = 14,\n\tOpt_usrquota_inode_hardlimit = 15,\n\tOpt_grpquota_block_hardlimit = 16,\n\tOpt_grpquota_inode_hardlimit = 17,\n};\n\nenum show_regs_mode {\n\tSHOW_REGS_SHORT = 0,\n\tSHOW_REGS_USER = 1,\n\tSHOW_REGS_ALL = 2,\n};\n\nenum shutdown_state {\n\tSHUTDOWN_INVALID = -1,\n\tSHUTDOWN_POWEROFF = 0,\n\tSHUTDOWN_SUSPEND = 2,\n\tSHUTDOWN_HALT = 4,\n};\n\nenum si_type {\n\tSI_TYPE_INVALID = 0,\n\tSI_KCS = 1,\n\tSI_SMIC = 2,\n\tSI_BT = 3,\n\tSI_TYPE_MAX = 4,\n};\n\nenum sid_policy_type {\n\tSIDPOL_DEFAULT = 0,\n\tSIDPOL_CONSTRAINED = 1,\n\tSIDPOL_ALLOWED = 2,\n};\n\nenum sig_handler {\n\tHANDLER_CURRENT = 0,\n\tHANDLER_SIG_DFL = 1,\n\tHANDLER_EXIT = 2,\n};\n\nenum siginfo_layout {\n\tSIL_KILL = 0,\n\tSIL_TIMER = 1,\n\tSIL_POLL = 2,\n\tSIL_FAULT = 3,\n\tSIL_FAULT_TRAPNO = 4,\n\tSIL_FAULT_MCEERR = 5,\n\tSIL_FAULT_BNDERR = 6,\n\tSIL_FAULT_PKUERR = 7,\n\tSIL_FAULT_PERF_EVENT = 8,\n\tSIL_CHLD = 9,\n\tSIL_RT = 10,\n\tSIL_SYS = 11,\n};\n\nenum simatic_ipc_station_ids {\n\tSIMATIC_IPC_INVALID_STATION_ID = 0,\n\tSIMATIC_IPC_IPC227D = 1281,\n\tSIMATIC_IPC_IPC427D = 1793,\n\tSIMATIC_IPC_IPC227E = 2305,\n\tSIMATIC_IPC_IPC277E = 2306,\n\tSIMATIC_IPC_IPC427E = 2561,\n\tSIMATIC_IPC_IPC477E = 2562,\n\tSIMATIC_IPC_IPC127E = 3329,\n\tSIMATIC_IPC_IPC227G = 3841,\n\tSIMATIC_IPC_IPC277G = 3842,\n\tSIMATIC_IPC_IPCBX_39A = 4097,\n\tSIMATIC_IPC_IPCPX_39A = 4098,\n\tSIMATIC_IPC_IPCBX_21A = 4353,\n\tSIMATIC_IPC_IPCBX_56A = 4609,\n\tSIMATIC_IPC_IPCBX_59A = 4610,\n};\n\nenum sk_action {\n\tSK_DROP = 0,\n\tSK_PASS = 1,\n};\n\nenum sk_pacing {\n\tSK_PACING_NONE = 0,\n\tSK_PACING_NEEDED = 1,\n\tSK_PACING_FQ = 2,\n};\n\nenum sk_psock_state_bits {\n\tSK_PSOCK_TX_ENABLED = 0,\n\tSK_PSOCK_RX_STRP_ENABLED = 1,\n};\n\nenum sk_rst_reason {\n\tSK_RST_REASON_NOT_SPECIFIED = 0,\n\tSK_RST_REASON_NO_SOCKET = 1,\n\tSK_RST_REASON_TCP_INVALID_ACK_SEQUENCE = 2,\n\tSK_RST_REASON_TCP_RFC7323_PAWS = 3,\n\tSK_RST_REASON_TCP_TOO_OLD_ACK = 4,\n\tSK_RST_REASON_TCP_ACK_UNSENT_DATA = 5,\n\tSK_RST_REASON_TCP_FLAGS = 6,\n\tSK_RST_REASON_TCP_OLD_ACK = 7,\n\tSK_RST_REASON_TCP_ABORT_ON_DATA = 8,\n\tSK_RST_REASON_TCP_TIMEWAIT_SOCKET = 9,\n\tSK_RST_REASON_INVALID_SYN = 10,\n\tSK_RST_REASON_MPTCP_RST_EUNSPEC = 11,\n\tSK_RST_REASON_MPTCP_RST_EMPTCP = 12,\n\tSK_RST_REASON_MPTCP_RST_ERESOURCE = 13,\n\tSK_RST_REASON_MPTCP_RST_EPROHIBIT = 14,\n\tSK_RST_REASON_MPTCP_RST_EWQ2BIG = 15,\n\tSK_RST_REASON_MPTCP_RST_EBADPERF = 16,\n\tSK_RST_REASON_MPTCP_RST_EMIDDLEBOX = 17,\n\tSK_RST_REASON_ERROR = 18,\n\tSK_RST_REASON_MAX = 19,\n};\n\nenum skb_drop_reason {\n\tSKB_NOT_DROPPED_YET = 0,\n\tSKB_CONSUMED = 1,\n\tSKB_DROP_REASON_NOT_SPECIFIED = 2,\n\tSKB_DROP_REASON_NO_SOCKET = 3,\n\tSKB_DROP_REASON_PKT_TOO_SMALL = 4,\n\tSKB_DROP_REASON_TCP_CSUM = 5,\n\tSKB_DROP_REASON_SOCKET_FILTER = 6,\n\tSKB_DROP_REASON_UDP_CSUM = 7,\n\tSKB_DROP_REASON_NETFILTER_DROP = 8,\n\tSKB_DROP_REASON_OTHERHOST = 9,\n\tSKB_DROP_REASON_IP_CSUM = 10,\n\tSKB_DROP_REASON_IP_INHDR = 11,\n\tSKB_DROP_REASON_IP_RPFILTER = 12,\n\tSKB_DROP_REASON_UNICAST_IN_L2_MULTICAST = 13,\n\tSKB_DROP_REASON_XFRM_POLICY = 14,\n\tSKB_DROP_REASON_IP_NOPROTO = 15,\n\tSKB_DROP_REASON_SOCKET_RCVBUFF = 16,\n\tSKB_DROP_REASON_PROTO_MEM = 17,\n\tSKB_DROP_REASON_TCP_AUTH_HDR = 18,\n\tSKB_DROP_REASON_TCP_MD5NOTFOUND = 19,\n\tSKB_DROP_REASON_TCP_MD5UNEXPECTED = 20,\n\tSKB_DROP_REASON_TCP_MD5FAILURE = 21,\n\tSKB_DROP_REASON_TCP_AONOTFOUND = 22,\n\tSKB_DROP_REASON_TCP_AOUNEXPECTED = 23,\n\tSKB_DROP_REASON_TCP_AOKEYNOTFOUND = 24,\n\tSKB_DROP_REASON_TCP_AOFAILURE = 25,\n\tSKB_DROP_REASON_SOCKET_BACKLOG = 26,\n\tSKB_DROP_REASON_TCP_FLAGS = 27,\n\tSKB_DROP_REASON_TCP_ABORT_ON_DATA = 28,\n\tSKB_DROP_REASON_TCP_ZEROWINDOW = 29,\n\tSKB_DROP_REASON_TCP_OLD_DATA = 30,\n\tSKB_DROP_REASON_TCP_OVERWINDOW = 31,\n\tSKB_DROP_REASON_TCP_OFOMERGE = 32,\n\tSKB_DROP_REASON_TCP_RFC7323_PAWS = 33,\n\tSKB_DROP_REASON_TCP_OLD_SEQUENCE = 34,\n\tSKB_DROP_REASON_TCP_INVALID_SEQUENCE = 35,\n\tSKB_DROP_REASON_TCP_INVALID_ACK_SEQUENCE = 36,\n\tSKB_DROP_REASON_TCP_RESET = 37,\n\tSKB_DROP_REASON_TCP_INVALID_SYN = 38,\n\tSKB_DROP_REASON_TCP_CLOSE = 39,\n\tSKB_DROP_REASON_TCP_FASTOPEN = 40,\n\tSKB_DROP_REASON_TCP_OLD_ACK = 41,\n\tSKB_DROP_REASON_TCP_TOO_OLD_ACK = 42,\n\tSKB_DROP_REASON_TCP_ACK_UNSENT_DATA = 43,\n\tSKB_DROP_REASON_TCP_OFO_QUEUE_PRUNE = 44,\n\tSKB_DROP_REASON_TCP_OFO_DROP = 45,\n\tSKB_DROP_REASON_IP_OUTNOROUTES = 46,\n\tSKB_DROP_REASON_BPF_CGROUP_EGRESS = 47,\n\tSKB_DROP_REASON_IPV6DISABLED = 48,\n\tSKB_DROP_REASON_NEIGH_CREATEFAIL = 49,\n\tSKB_DROP_REASON_NEIGH_FAILED = 50,\n\tSKB_DROP_REASON_NEIGH_QUEUEFULL = 51,\n\tSKB_DROP_REASON_NEIGH_DEAD = 52,\n\tSKB_DROP_REASON_TC_EGRESS = 53,\n\tSKB_DROP_REASON_SECURITY_HOOK = 54,\n\tSKB_DROP_REASON_QDISC_DROP = 55,\n\tSKB_DROP_REASON_CPU_BACKLOG = 56,\n\tSKB_DROP_REASON_XDP = 57,\n\tSKB_DROP_REASON_TC_INGRESS = 58,\n\tSKB_DROP_REASON_UNHANDLED_PROTO = 59,\n\tSKB_DROP_REASON_SKB_CSUM = 60,\n\tSKB_DROP_REASON_SKB_GSO_SEG = 61,\n\tSKB_DROP_REASON_SKB_UCOPY_FAULT = 62,\n\tSKB_DROP_REASON_DEV_HDR = 63,\n\tSKB_DROP_REASON_DEV_READY = 64,\n\tSKB_DROP_REASON_FULL_RING = 65,\n\tSKB_DROP_REASON_NOMEM = 66,\n\tSKB_DROP_REASON_HDR_TRUNC = 67,\n\tSKB_DROP_REASON_TAP_FILTER = 68,\n\tSKB_DROP_REASON_TAP_TXFILTER = 69,\n\tSKB_DROP_REASON_ICMP_CSUM = 70,\n\tSKB_DROP_REASON_INVALID_PROTO = 71,\n\tSKB_DROP_REASON_IP_INADDRERRORS = 72,\n\tSKB_DROP_REASON_IP_INNOROUTES = 73,\n\tSKB_DROP_REASON_PKT_TOO_BIG = 74,\n\tSKB_DROP_REASON_DUP_FRAG = 75,\n\tSKB_DROP_REASON_FRAG_REASM_TIMEOUT = 76,\n\tSKB_DROP_REASON_FRAG_TOO_FAR = 77,\n\tSKB_DROP_REASON_TCP_MINTTL = 78,\n\tSKB_DROP_REASON_IPV6_BAD_EXTHDR = 79,\n\tSKB_DROP_REASON_IPV6_NDISC_FRAG = 80,\n\tSKB_DROP_REASON_IPV6_NDISC_HOP_LIMIT = 81,\n\tSKB_DROP_REASON_IPV6_NDISC_BAD_CODE = 82,\n\tSKB_DROP_REASON_IPV6_NDISC_BAD_OPTIONS = 83,\n\tSKB_DROP_REASON_IPV6_NDISC_NS_OTHERHOST = 84,\n\tSKB_DROP_REASON_QUEUE_PURGE = 85,\n\tSKB_DROP_REASON_TC_COOKIE_ERROR = 86,\n\tSKB_DROP_REASON_PACKET_SOCK_ERROR = 87,\n\tSKB_DROP_REASON_TC_CHAIN_NOTFOUND = 88,\n\tSKB_DROP_REASON_TC_RECLASSIFY_LOOP = 89,\n\tSKB_DROP_REASON_MAX = 90,\n\tSKB_DROP_REASON_SUBSYS_MASK = 4294901760,\n};\n\nenum skb_drop_reason_subsys {\n\tSKB_DROP_REASON_SUBSYS_CORE = 0,\n\tSKB_DROP_REASON_SUBSYS_MAC80211_UNUSABLE = 1,\n\tSKB_DROP_REASON_SUBSYS_MAC80211_MONITOR = 2,\n\tSKB_DROP_REASON_SUBSYS_OPENVSWITCH = 3,\n\tSKB_DROP_REASON_SUBSYS_NUM = 4,\n};\n\nenum skb_ext_id {\n\tSKB_EXT_BRIDGE_NF = 0,\n\tSKB_EXT_SEC_PATH = 1,\n\tTC_SKB_EXT = 2,\n\tSKB_EXT_MPTCP = 3,\n\tSKB_EXT_NUM = 4,\n};\n\nenum skb_tstamp_type {\n\tSKB_CLOCK_REALTIME = 0,\n\tSKB_CLOCK_MONOTONIC = 1,\n\tSKB_CLOCK_TAI = 2,\n\t__SKB_CLOCK_MAX = 2,\n};\n\nenum sknetlink_groups {\n\tSKNLGRP_NONE = 0,\n\tSKNLGRP_INET_TCP_DESTROY = 1,\n\tSKNLGRP_INET_UDP_DESTROY = 2,\n\tSKNLGRP_INET6_TCP_DESTROY = 3,\n\tSKNLGRP_INET6_UDP_DESTROY = 4,\n\t__SKNLGRP_MAX = 5,\n};\n\nenum slab_stat_type {\n\tSL_ALL = 0,\n\tSL_PARTIAL = 1,\n\tSL_CPU = 2,\n\tSL_OBJECTS = 3,\n\tSL_TOTAL = 4,\n};\n\nenum slab_state {\n\tDOWN = 0,\n\tPARTIAL = 1,\n\tUP = 2,\n\tFULL = 3,\n};\n\nenum smbios_attr_enum {\n\tSMBIOS_ATTR_NONE = 0,\n\tSMBIOS_ATTR_LABEL_SHOW = 1,\n\tSMBIOS_ATTR_INSTANCE_SHOW = 2,\n};\n\nenum smca_bank_types {\n\tSMCA_LS = 0,\n\tSMCA_LS_V2 = 1,\n\tSMCA_IF = 2,\n\tSMCA_L2_CACHE = 3,\n\tSMCA_DE = 4,\n\tSMCA_RESERVED = 5,\n\tSMCA_EX = 6,\n\tSMCA_FP = 7,\n\tSMCA_L3_CACHE = 8,\n\tSMCA_CS = 9,\n\tSMCA_CS_V2 = 10,\n\tSMCA_PIE = 11,\n\tSMCA_UMC = 12,\n\tSMCA_UMC_V2 = 13,\n\tSMCA_MA_LLC = 14,\n\tSMCA_PB = 15,\n\tSMCA_PSP = 16,\n\tSMCA_PSP_V2 = 17,\n\tSMCA_SMU = 18,\n\tSMCA_SMU_V2 = 19,\n\tSMCA_MP5 = 20,\n\tSMCA_MPDMA = 21,\n\tSMCA_NBIO = 22,\n\tSMCA_PCIE = 23,\n\tSMCA_PCIE_V2 = 24,\n\tSMCA_XGMI_PCS = 25,\n\tSMCA_NBIF = 26,\n\tSMCA_SHUB = 27,\n\tSMCA_SATA = 28,\n\tSMCA_USB = 29,\n\tSMCA_USR_DP = 30,\n\tSMCA_USR_CP = 31,\n\tSMCA_GMI_PCS = 32,\n\tSMCA_XGMI_PHY = 33,\n\tSMCA_WAFL_PHY = 34,\n\tSMCA_GMI_PHY = 35,\n\tN_SMCA_BANK_TYPES = 36,\n};\n\nenum smk_inos {\n\tSMK_ROOT_INO = 2,\n\tSMK_LOAD = 3,\n\tSMK_CIPSO = 4,\n\tSMK_DOI = 5,\n\tSMK_DIRECT = 6,\n\tSMK_AMBIENT = 7,\n\tSMK_NET4ADDR = 8,\n\tSMK_ONLYCAP = 9,\n\tSMK_LOGGING = 10,\n\tSMK_LOAD_SELF = 11,\n\tSMK_ACCESSES = 12,\n\tSMK_MAPPED = 13,\n\tSMK_LOAD2 = 14,\n\tSMK_LOAD_SELF2 = 15,\n\tSMK_ACCESS2 = 16,\n\tSMK_CIPSO2 = 17,\n\tSMK_REVOKE_SUBJ = 18,\n\tSMK_CHANGE_RULE = 19,\n\tSMK_SYSLOG = 20,\n\tSMK_PTRACE = 21,\n\tSMK_NET6ADDR = 23,\n\tSMK_RELABEL_SELF = 24,\n};\n\nenum snoop_when {\n\tSUBMIT = 0,\n\tCOMPLETE = 1,\n};\n\nenum sock_flags {\n\tSOCK_DEAD = 0,\n\tSOCK_DONE = 1,\n\tSOCK_URGINLINE = 2,\n\tSOCK_KEEPOPEN = 3,\n\tSOCK_LINGER = 4,\n\tSOCK_DESTROY = 5,\n\tSOCK_BROADCAST = 6,\n\tSOCK_TIMESTAMP = 7,\n\tSOCK_ZAPPED = 8,\n\tSOCK_USE_WRITE_QUEUE = 9,\n\tSOCK_DBG = 10,\n\tSOCK_RCVTSTAMP = 11,\n\tSOCK_RCVTSTAMPNS = 12,\n\tSOCK_LOCALROUTE = 13,\n\tSOCK_MEMALLOC = 14,\n\tSOCK_TIMESTAMPING_RX_SOFTWARE = 15,\n\tSOCK_FASYNC = 16,\n\tSOCK_RXQ_OVFL = 17,\n\tSOCK_ZEROCOPY = 18,\n\tSOCK_WIFI_STATUS = 19,\n\tSOCK_NOFCS = 20,\n\tSOCK_FILTER_LOCKED = 21,\n\tSOCK_SELECT_ERR_QUEUE = 22,\n\tSOCK_RCU_FREE = 23,\n\tSOCK_TXTIME = 24,\n\tSOCK_XDP = 25,\n\tSOCK_TSTAMP_NEW = 26,\n\tSOCK_RCVMARK = 27,\n};\n\nenum sock_shutdown_cmd {\n\tSHUT_RD = 0,\n\tSHUT_WR = 1,\n\tSHUT_RDWR = 2,\n};\n\nenum sock_type {\n\tSOCK_STREAM = 1,\n\tSOCK_DGRAM = 2,\n\tSOCK_RAW = 3,\n\tSOCK_RDM = 4,\n\tSOCK_SEQPACKET = 5,\n\tSOCK_DCCP = 6,\n\tSOCK_PACKET = 10,\n};\n\nenum special_kfunc_type {\n\tKF_bpf_obj_new_impl = 0,\n\tKF_bpf_obj_drop_impl = 1,\n\tKF_bpf_refcount_acquire_impl = 2,\n\tKF_bpf_list_push_front_impl = 3,\n\tKF_bpf_list_push_back_impl = 4,\n\tKF_bpf_list_pop_front = 5,\n\tKF_bpf_list_pop_back = 6,\n\tKF_bpf_cast_to_kern_ctx = 7,\n\tKF_bpf_rdonly_cast = 8,\n\tKF_bpf_rcu_read_lock = 9,\n\tKF_bpf_rcu_read_unlock = 10,\n\tKF_bpf_rbtree_remove = 11,\n\tKF_bpf_rbtree_add_impl = 12,\n\tKF_bpf_rbtree_first = 13,\n\tKF_bpf_dynptr_from_skb = 14,\n\tKF_bpf_dynptr_from_xdp = 15,\n\tKF_bpf_dynptr_slice = 16,\n\tKF_bpf_dynptr_slice_rdwr = 17,\n\tKF_bpf_dynptr_clone = 18,\n\tKF_bpf_percpu_obj_new_impl = 19,\n\tKF_bpf_percpu_obj_drop_impl = 20,\n\tKF_bpf_throw = 21,\n\tKF_bpf_wq_set_callback_impl = 22,\n\tKF_bpf_preempt_disable = 23,\n\tKF_bpf_preempt_enable = 24,\n\tKF_bpf_iter_css_task_new = 25,\n\tKF_bpf_session_cookie = 26,\n};\n\nenum spectre_v1_mitigation {\n\tSPECTRE_V1_MITIGATION_NONE = 0,\n\tSPECTRE_V1_MITIGATION_AUTO = 1,\n};\n\nenum spectre_v2_mitigation {\n\tSPECTRE_V2_NONE = 0,\n\tSPECTRE_V2_RETPOLINE = 1,\n\tSPECTRE_V2_LFENCE = 2,\n\tSPECTRE_V2_EIBRS = 3,\n\tSPECTRE_V2_EIBRS_RETPOLINE = 4,\n\tSPECTRE_V2_EIBRS_LFENCE = 5,\n\tSPECTRE_V2_IBRS = 6,\n};\n\nenum spectre_v2_mitigation_cmd {\n\tSPECTRE_V2_CMD_NONE = 0,\n\tSPECTRE_V2_CMD_AUTO = 1,\n\tSPECTRE_V2_CMD_FORCE = 2,\n\tSPECTRE_V2_CMD_RETPOLINE = 3,\n\tSPECTRE_V2_CMD_RETPOLINE_GENERIC = 4,\n\tSPECTRE_V2_CMD_RETPOLINE_LFENCE = 5,\n\tSPECTRE_V2_CMD_EIBRS = 6,\n\tSPECTRE_V2_CMD_EIBRS_RETPOLINE = 7,\n\tSPECTRE_V2_CMD_EIBRS_LFENCE = 8,\n\tSPECTRE_V2_CMD_IBRS = 9,\n};\n\nenum spectre_v2_user_cmd {\n\tSPECTRE_V2_USER_CMD_NONE = 0,\n\tSPECTRE_V2_USER_CMD_AUTO = 1,\n\tSPECTRE_V2_USER_CMD_FORCE = 2,\n\tSPECTRE_V2_USER_CMD_PRCTL = 3,\n\tSPECTRE_V2_USER_CMD_PRCTL_IBPB = 4,\n\tSPECTRE_V2_USER_CMD_SECCOMP = 5,\n\tSPECTRE_V2_USER_CMD_SECCOMP_IBPB = 6,\n};\n\nenum spectre_v2_user_mitigation {\n\tSPECTRE_V2_USER_NONE = 0,\n\tSPECTRE_V2_USER_STRICT = 1,\n\tSPECTRE_V2_USER_STRICT_PREFERRED = 2,\n\tSPECTRE_V2_USER_PRCTL = 3,\n\tSPECTRE_V2_USER_SECCOMP = 4,\n};\n\nenum spi_mem_data_dir {\n\tSPI_MEM_NO_DATA = 0,\n\tSPI_MEM_DATA_IN = 1,\n\tSPI_MEM_DATA_OUT = 2,\n};\n\nenum split_lock_detect_state {\n\tsld_off = 0,\n\tsld_warn = 1,\n\tsld_fatal = 2,\n\tsld_ratelimit = 3,\n};\n\nenum squashfs_param {\n\tOpt_errors___3 = 0,\n\tOpt_threads = 1,\n};\n\nenum srbds_mitigations {\n\tSRBDS_MITIGATION_OFF = 0,\n\tSRBDS_MITIGATION_UCODE_NEEDED = 1,\n\tSRBDS_MITIGATION_FULL = 2,\n\tSRBDS_MITIGATION_TSX_OFF = 3,\n\tSRBDS_MITIGATION_HYPERVISOR = 4,\n};\n\nenum srso_mitigation {\n\tSRSO_MITIGATION_NONE = 0,\n\tSRSO_MITIGATION_UCODE_NEEDED = 1,\n\tSRSO_MITIGATION_SAFE_RET_UCODE_NEEDED = 2,\n\tSRSO_MITIGATION_MICROCODE = 3,\n\tSRSO_MITIGATION_SAFE_RET = 4,\n\tSRSO_MITIGATION_IBPB = 5,\n\tSRSO_MITIGATION_IBPB_ON_VMEXIT = 6,\n};\n\nenum srso_mitigation_cmd {\n\tSRSO_CMD_OFF = 0,\n\tSRSO_CMD_MICROCODE = 1,\n\tSRSO_CMD_SAFE_RET = 2,\n\tSRSO_CMD_IBPB = 3,\n\tSRSO_CMD_IBPB_ON_VMEXIT = 4,\n};\n\nenum ssb_mitigation {\n\tSPEC_STORE_BYPASS_NONE = 0,\n\tSPEC_STORE_BYPASS_DISABLE = 1,\n\tSPEC_STORE_BYPASS_PRCTL = 2,\n\tSPEC_STORE_BYPASS_SECCOMP = 3,\n};\n\nenum ssb_mitigation_cmd {\n\tSPEC_STORE_BYPASS_CMD_NONE = 0,\n\tSPEC_STORE_BYPASS_CMD_AUTO = 1,\n\tSPEC_STORE_BYPASS_CMD_ON = 2,\n\tSPEC_STORE_BYPASS_CMD_PRCTL = 3,\n\tSPEC_STORE_BYPASS_CMD_SECCOMP = 4,\n};\n\nenum stack_type {\n\tSTACK_TYPE_UNKNOWN = 0,\n\tSTACK_TYPE_TASK = 1,\n\tSTACK_TYPE_IRQ = 2,\n\tSTACK_TYPE_SOFTIRQ = 3,\n\tSTACK_TYPE_ENTRY = 4,\n\tSTACK_TYPE_EXCEPTION = 5,\n\tSTACK_TYPE_EXCEPTION_LAST = 10,\n};\n\nenum stat_group {\n\tSTAT_READ = 0,\n\tSTAT_WRITE = 1,\n\tSTAT_DISCARD = 2,\n\tSTAT_FLUSH = 3,\n\tNR_STAT_GROUPS = 4,\n};\n\nenum stat_item {\n\tALLOC_FASTPATH = 0,\n\tALLOC_SLOWPATH = 1,\n\tFREE_FASTPATH = 2,\n\tFREE_SLOWPATH = 3,\n\tFREE_FROZEN = 4,\n\tFREE_ADD_PARTIAL = 5,\n\tFREE_REMOVE_PARTIAL = 6,\n\tALLOC_FROM_PARTIAL = 7,\n\tALLOC_SLAB = 8,\n\tALLOC_REFILL = 9,\n\tALLOC_NODE_MISMATCH = 10,\n\tFREE_SLAB = 11,\n\tCPUSLAB_FLUSH = 12,\n\tDEACTIVATE_FULL = 13,\n\tDEACTIVATE_EMPTY = 14,\n\tDEACTIVATE_TO_HEAD = 15,\n\tDEACTIVATE_TO_TAIL = 16,\n\tDEACTIVATE_REMOTE_FREES = 17,\n\tDEACTIVATE_BYPASS = 18,\n\tORDER_FALLBACK = 19,\n\tCMPXCHG_DOUBLE_CPU_FAIL = 20,\n\tCMPXCHG_DOUBLE_FAIL = 21,\n\tCPU_PARTIAL_ALLOC = 22,\n\tCPU_PARTIAL_FREE = 23,\n\tCPU_PARTIAL_NODE = 24,\n\tCPU_PARTIAL_DRAIN = 25,\n\tNR_SLUB_STAT_ITEMS = 26,\n};\n\nenum state {\n\tStart = 0,\n\tCollect = 1,\n\tGotHeader = 2,\n\tSkipIt = 3,\n\tGotName = 4,\n\tCopyFile = 5,\n\tGotSymlink = 6,\n\tReset = 7,\n};\n\nenum states_wwnr {\n\tnot_running_wwnr = 0,\n\trunning_wwnr = 1,\n\tstate_max_wwnr = 2,\n};\n\nenum string_size_units {\n\tSTRING_UNITS_10 = 0,\n\tSTRING_UNITS_2 = 1,\n\tSTRING_UNITS_MASK = 1,\n\tSTRING_UNITS_NO_SPACE = 1073741824,\n\tSTRING_UNITS_NO_BYTES = 2147483648,\n};\n\nenum subpixel_order {\n\tSubPixelUnknown = 0,\n\tSubPixelHorizontalRGB = 1,\n\tSubPixelHorizontalBGR = 2,\n\tSubPixelVerticalRGB = 3,\n\tSubPixelVerticalBGR = 4,\n\tSubPixelNone = 5,\n};\n\nenum sum_check_bits {\n\tSUM_CHECK_P = 0,\n\tSUM_CHECK_Q = 1,\n};\n\nenum sum_check_flags {\n\tSUM_CHECK_P_RESULT = 1,\n\tSUM_CHECK_Q_RESULT = 2,\n};\n\nenum support_mode {\n\tALLOW_LEGACY = 0,\n\tDENY_LEGACY = 1,\n};\n\nenum suspend_mode {\n\tPRESUSPEND = 0,\n\tPRESUSPEND_UNDO = 1,\n\tPOSTSUSPEND = 2,\n};\n\nenum suspend_stat_step {\n\tSUSPEND_WORKING = 0,\n\tSUSPEND_FREEZE = 1,\n\tSUSPEND_PREPARE = 2,\n\tSUSPEND_SUSPEND = 3,\n\tSUSPEND_SUSPEND_LATE = 4,\n\tSUSPEND_SUSPEND_NOIRQ = 5,\n\tSUSPEND_RESUME_NOIRQ = 6,\n\tSUSPEND_RESUME_EARLY = 7,\n\tSUSPEND_RESUME = 8,\n};\n\nenum svc_auth_status {\n\tSVC_GARBAGE = 1,\n\tSVC_SYSERR = 2,\n\tSVC_VALID = 3,\n\tSVC_NEGATIVE = 4,\n\tSVC_OK = 5,\n\tSVC_DROP = 6,\n\tSVC_CLOSE = 7,\n\tSVC_DENIED = 8,\n\tSVC_PENDING = 9,\n\tSVC_COMPLETE = 10,\n};\n\nenum sw_activity {\n\tOFF = 0,\n\tBLINK_ON = 1,\n\tBLINK_OFF = 2,\n};\n\nenum switch_power_state {\n\tDRM_SWITCH_POWER_ON = 0,\n\tDRM_SWITCH_POWER_OFF = 1,\n\tDRM_SWITCH_POWER_CHANGING = 2,\n\tDRM_SWITCH_POWER_DYNAMIC_OFF = 3,\n};\n\nenum switchdev_attr_id {\n\tSWITCHDEV_ATTR_ID_UNDEFINED = 0,\n\tSWITCHDEV_ATTR_ID_PORT_STP_STATE = 1,\n\tSWITCHDEV_ATTR_ID_PORT_MST_STATE = 2,\n\tSWITCHDEV_ATTR_ID_PORT_BRIDGE_FLAGS = 3,\n\tSWITCHDEV_ATTR_ID_PORT_PRE_BRIDGE_FLAGS = 4,\n\tSWITCHDEV_ATTR_ID_PORT_MROUTER = 5,\n\tSWITCHDEV_ATTR_ID_BRIDGE_AGEING_TIME = 6,\n\tSWITCHDEV_ATTR_ID_BRIDGE_VLAN_FILTERING = 7,\n\tSWITCHDEV_ATTR_ID_BRIDGE_VLAN_PROTOCOL = 8,\n\tSWITCHDEV_ATTR_ID_BRIDGE_MC_DISABLED = 9,\n\tSWITCHDEV_ATTR_ID_BRIDGE_MROUTER = 10,\n\tSWITCHDEV_ATTR_ID_BRIDGE_MST = 11,\n\tSWITCHDEV_ATTR_ID_MRP_PORT_ROLE = 12,\n\tSWITCHDEV_ATTR_ID_VLAN_MSTI = 13,\n};\n\nenum switchdev_notifier_type {\n\tSWITCHDEV_FDB_ADD_TO_BRIDGE = 1,\n\tSWITCHDEV_FDB_DEL_TO_BRIDGE = 2,\n\tSWITCHDEV_FDB_ADD_TO_DEVICE = 3,\n\tSWITCHDEV_FDB_DEL_TO_DEVICE = 4,\n\tSWITCHDEV_FDB_OFFLOADED = 5,\n\tSWITCHDEV_FDB_FLUSH_TO_BRIDGE = 6,\n\tSWITCHDEV_PORT_OBJ_ADD = 7,\n\tSWITCHDEV_PORT_OBJ_DEL = 8,\n\tSWITCHDEV_PORT_ATTR_SET = 9,\n\tSWITCHDEV_VXLAN_FDB_ADD_TO_BRIDGE = 10,\n\tSWITCHDEV_VXLAN_FDB_DEL_TO_BRIDGE = 11,\n\tSWITCHDEV_VXLAN_FDB_ADD_TO_DEVICE = 12,\n\tSWITCHDEV_VXLAN_FDB_DEL_TO_DEVICE = 13,\n\tSWITCHDEV_VXLAN_FDB_OFFLOADED = 14,\n\tSWITCHDEV_BRPORT_OFFLOADED = 15,\n\tSWITCHDEV_BRPORT_UNOFFLOADED = 16,\n\tSWITCHDEV_BRPORT_REPLAY = 17,\n};\n\nenum switchdev_obj_id {\n\tSWITCHDEV_OBJ_ID_UNDEFINED = 0,\n\tSWITCHDEV_OBJ_ID_PORT_VLAN = 1,\n\tSWITCHDEV_OBJ_ID_PORT_MDB = 2,\n\tSWITCHDEV_OBJ_ID_HOST_MDB = 3,\n\tSWITCHDEV_OBJ_ID_MRP = 4,\n\tSWITCHDEV_OBJ_ID_RING_TEST_MRP = 5,\n\tSWITCHDEV_OBJ_ID_RING_ROLE_MRP = 6,\n\tSWITCHDEV_OBJ_ID_RING_STATE_MRP = 7,\n\tSWITCHDEV_OBJ_ID_IN_TEST_MRP = 8,\n\tSWITCHDEV_OBJ_ID_IN_ROLE_MRP = 9,\n\tSWITCHDEV_OBJ_ID_IN_STATE_MRP = 10,\n};\n\nenum sync_action {\n\tACTION_RESYNC = 0,\n\tACTION_RECOVER = 1,\n\tACTION_CHECK = 2,\n\tACTION_REPAIR = 3,\n\tACTION_RESHAPE = 4,\n\tACTION_FROZEN = 5,\n\tACTION_IDLE = 6,\n\tNR_SYNC_ACTIONS = 7,\n};\n\nenum sys_off_mode {\n\tSYS_OFF_MODE_POWER_OFF_PREPARE = 0,\n\tSYS_OFF_MODE_POWER_OFF = 1,\n\tSYS_OFF_MODE_RESTART_PREPARE = 2,\n\tSYS_OFF_MODE_RESTART = 3,\n};\n\nenum syscall_work_bit {\n\tSYSCALL_WORK_BIT_SECCOMP = 0,\n\tSYSCALL_WORK_BIT_SYSCALL_TRACEPOINT = 1,\n\tSYSCALL_WORK_BIT_SYSCALL_TRACE = 2,\n\tSYSCALL_WORK_BIT_SYSCALL_EMU = 3,\n\tSYSCALL_WORK_BIT_SYSCALL_AUDIT = 4,\n\tSYSCALL_WORK_BIT_SYSCALL_USER_DISPATCH = 5,\n\tSYSCALL_WORK_BIT_SYSCALL_EXIT_TRAP = 6,\n};\n\nenum sysctl_writes_mode {\n\tSYSCTL_WRITES_LEGACY = -1,\n\tSYSCTL_WRITES_WARN = 0,\n\tSYSCTL_WRITES_STRICT = 1,\n};\n\nenum system_states {\n\tSYSTEM_BOOTING = 0,\n\tSYSTEM_SCHEDULING = 1,\n\tSYSTEM_FREEING_INITMEM = 2,\n\tSYSTEM_RUNNING = 3,\n\tSYSTEM_HALT = 4,\n\tSYSTEM_POWER_OFF = 5,\n\tSYSTEM_RESTART = 6,\n\tSYSTEM_SUSPEND = 7,\n};\n\nenum t10_dif_type {\n\tT10_PI_TYPE0_PROTECTION = 0,\n\tT10_PI_TYPE1_PROTECTION = 1,\n\tT10_PI_TYPE2_PROTECTION = 2,\n\tT10_PI_TYPE3_PROTECTION = 3,\n};\n\nenum taa_mitigations {\n\tTAA_MITIGATION_OFF = 0,\n\tTAA_MITIGATION_UCODE_NEEDED = 1,\n\tTAA_MITIGATION_VERW = 2,\n\tTAA_MITIGATION_TSX_DISABLED = 3,\n};\n\nenum task_work_notify_mode {\n\tTWA_NONE = 0,\n\tTWA_RESUME = 1,\n\tTWA_SIGNAL = 2,\n\tTWA_SIGNAL_NO_IPI = 3,\n\tTWA_NMI_CURRENT = 4,\n\tTWA_FLAGS = 65280,\n\tTWAF_NO_ALLOC = 256,\n};\n\nenum tc_fifo_command {\n\tTC_FIFO_REPLACE = 0,\n\tTC_FIFO_DESTROY = 1,\n\tTC_FIFO_STATS = 2,\n};\n\nenum tc_link_layer {\n\tTC_LINKLAYER_UNAWARE = 0,\n\tTC_LINKLAYER_ETHERNET = 1,\n\tTC_LINKLAYER_ATM = 2,\n};\n\nenum tc_mq_command {\n\tTC_MQ_CREATE = 0,\n\tTC_MQ_DESTROY = 1,\n\tTC_MQ_STATS = 2,\n\tTC_MQ_GRAFT = 3,\n};\n\nenum tc_root_command {\n\tTC_ROOT_GRAFT = 0,\n};\n\nenum tc_setup_type {\n\tTC_QUERY_CAPS = 0,\n\tTC_SETUP_QDISC_MQPRIO = 1,\n\tTC_SETUP_CLSU32 = 2,\n\tTC_SETUP_CLSFLOWER = 3,\n\tTC_SETUP_CLSMATCHALL = 4,\n\tTC_SETUP_CLSBPF = 5,\n\tTC_SETUP_BLOCK = 6,\n\tTC_SETUP_QDISC_CBS = 7,\n\tTC_SETUP_QDISC_RED = 8,\n\tTC_SETUP_QDISC_PRIO = 9,\n\tTC_SETUP_QDISC_MQ = 10,\n\tTC_SETUP_QDISC_ETF = 11,\n\tTC_SETUP_ROOT_QDISC = 12,\n\tTC_SETUP_QDISC_GRED = 13,\n\tTC_SETUP_QDISC_TAPRIO = 14,\n\tTC_SETUP_FT = 15,\n\tTC_SETUP_QDISC_ETS = 16,\n\tTC_SETUP_QDISC_TBF = 17,\n\tTC_SETUP_QDISC_FIFO = 18,\n\tTC_SETUP_QDISC_HTB = 19,\n\tTC_SETUP_ACT = 20,\n};\n\nenum tca_id {\n\tTCA_ID_UNSPEC = 0,\n\tTCA_ID_POLICE = 1,\n\tTCA_ID_GACT = 5,\n\tTCA_ID_IPT = 6,\n\tTCA_ID_PEDIT = 7,\n\tTCA_ID_MIRRED = 8,\n\tTCA_ID_NAT = 9,\n\tTCA_ID_XT = 10,\n\tTCA_ID_SKBEDIT = 11,\n\tTCA_ID_VLAN = 12,\n\tTCA_ID_BPF = 13,\n\tTCA_ID_CONNMARK = 14,\n\tTCA_ID_SKBMOD = 15,\n\tTCA_ID_CSUM = 16,\n\tTCA_ID_TUNNEL_KEY = 17,\n\tTCA_ID_SIMP = 22,\n\tTCA_ID_IFE = 25,\n\tTCA_ID_SAMPLE = 26,\n\tTCA_ID_CTINFO = 27,\n\tTCA_ID_MPLS = 28,\n\tTCA_ID_CT = 29,\n\tTCA_ID_GATE = 30,\n\t__TCA_ID_MAX = 255,\n};\n\nenum tcf_proto_ops_flags {\n\tTCF_PROTO_OPS_DOIT_UNLOCKED = 1,\n};\n\nenum tcp_ca_ack_event_flags {\n\tCA_ACK_SLOWPATH = 1,\n\tCA_ACK_WIN_UPDATE = 2,\n\tCA_ACK_ECE = 4,\n};\n\nenum tcp_ca_event {\n\tCA_EVENT_TX_START = 0,\n\tCA_EVENT_CWND_RESTART = 1,\n\tCA_EVENT_COMPLETE_CWR = 2,\n\tCA_EVENT_LOSS = 3,\n\tCA_EVENT_ECN_NO_CE = 4,\n\tCA_EVENT_ECN_IS_CE = 5,\n};\n\nenum tcp_ca_state {\n\tTCP_CA_Open = 0,\n\tTCP_CA_Disorder = 1,\n\tTCP_CA_CWR = 2,\n\tTCP_CA_Recovery = 3,\n\tTCP_CA_Loss = 4,\n};\n\nenum tcp_chrono {\n\tTCP_CHRONO_UNSPEC = 0,\n\tTCP_CHRONO_BUSY = 1,\n\tTCP_CHRONO_RWND_LIMITED = 2,\n\tTCP_CHRONO_SNDBUF_LIMITED = 3,\n\t__TCP_CHRONO_MAX = 4,\n};\n\nenum tcp_conntrack {\n\tTCP_CONNTRACK_NONE = 0,\n\tTCP_CONNTRACK_SYN_SENT = 1,\n\tTCP_CONNTRACK_SYN_RECV = 2,\n\tTCP_CONNTRACK_ESTABLISHED = 3,\n\tTCP_CONNTRACK_FIN_WAIT = 4,\n\tTCP_CONNTRACK_CLOSE_WAIT = 5,\n\tTCP_CONNTRACK_LAST_ACK = 6,\n\tTCP_CONNTRACK_TIME_WAIT = 7,\n\tTCP_CONNTRACK_CLOSE = 8,\n\tTCP_CONNTRACK_LISTEN = 9,\n\tTCP_CONNTRACK_MAX = 10,\n\tTCP_CONNTRACK_IGNORE = 11,\n\tTCP_CONNTRACK_RETRANS = 12,\n\tTCP_CONNTRACK_UNACK = 13,\n\tTCP_CONNTRACK_TIMEOUT_MAX = 14,\n};\n\nenum tcp_fastopen_client_fail {\n\tTFO_STATUS_UNSPEC = 0,\n\tTFO_COOKIE_UNAVAILABLE = 1,\n\tTFO_DATA_NOT_ACKED = 2,\n\tTFO_SYN_RETRANSMITTED = 3,\n};\n\nenum tcp_metric_index {\n\tTCP_METRIC_RTT = 0,\n\tTCP_METRIC_RTTVAR = 1,\n\tTCP_METRIC_SSTHRESH = 2,\n\tTCP_METRIC_CWND = 3,\n\tTCP_METRIC_REORDERING = 4,\n\tTCP_METRIC_RTT_US = 5,\n\tTCP_METRIC_RTTVAR_US = 6,\n\t__TCP_METRIC_MAX = 7,\n};\n\nenum tcp_queue {\n\tTCP_FRAG_IN_WRITE_QUEUE = 0,\n\tTCP_FRAG_IN_RTX_QUEUE = 1,\n};\n\nenum tcp_seq_states {\n\tTCP_SEQ_STATE_LISTENING = 0,\n\tTCP_SEQ_STATE_ESTABLISHED = 1,\n};\n\nenum tcp_skb_cb_sacked_flags {\n\tTCPCB_SACKED_ACKED = 1,\n\tTCPCB_SACKED_RETRANS = 2,\n\tTCPCB_LOST = 4,\n\tTCPCB_TAGBITS = 7,\n\tTCPCB_REPAIRED = 16,\n\tTCPCB_EVER_RETRANS = 128,\n\tTCPCB_RETRANS = 146,\n};\n\nenum tcp_synack_type {\n\tTCP_SYNACK_NORMAL = 0,\n\tTCP_SYNACK_FASTOPEN = 1,\n\tTCP_SYNACK_COOKIE = 2,\n};\n\nenum tcp_tw_status {\n\tTCP_TW_SUCCESS = 0,\n\tTCP_TW_RST = 1,\n\tTCP_TW_ACK = 2,\n\tTCP_TW_SYN = 3,\n};\n\nenum tcpa_event_types {\n\tPREBOOT = 0,\n\tPOST_CODE = 1,\n\tUNUSED = 2,\n\tNO_ACTION = 3,\n\tSEPARATOR = 4,\n\tACTION = 5,\n\tEVENT_TAG = 6,\n\tSCRTM_CONTENTS = 7,\n\tSCRTM_VERSION = 8,\n\tCPU_MICROCODE = 9,\n\tPLATFORM_CONFIG_FLAGS = 10,\n\tTABLE_OF_DEVICES = 11,\n\tCOMPACT_HASH = 12,\n\tIPL = 13,\n\tIPL_PARTITION_DATA = 14,\n\tNONHOST_CODE = 15,\n\tNONHOST_CONFIG = 16,\n\tNONHOST_INFO = 17,\n};\n\nenum tcpa_pc_event_ids {\n\tSMBIOS = 1,\n\tBIS_CERT = 2,\n\tPOST_BIOS_ROM = 3,\n\tESCD = 4,\n\tCMOS = 5,\n\tNVRAM = 6,\n\tOPTION_ROM_EXEC = 7,\n\tOPTION_ROM_CONFIG = 8,\n\tOPTION_ROM_MICROCODE = 10,\n\tS_CRTM_VERSION = 11,\n\tS_CRTM_CONTENTS = 12,\n\tPOST_CONTENTS = 13,\n\tHOST_TABLE_OF_DEVICES = 14,\n};\n\nenum tcx_action_base {\n\tTCX_NEXT = -1,\n\tTCX_PASS = 0,\n\tTCX_DROP = 2,\n\tTCX_REDIRECT = 7,\n};\n\nenum tg_state_flags {\n\tTHROTL_TG_PENDING = 1,\n\tTHROTL_TG_WAS_EMPTY = 2,\n\tTHROTL_TG_CANCELING = 4,\n};\n\nenum thermal_device_mode {\n\tTHERMAL_DEVICE_DISABLED = 0,\n\tTHERMAL_DEVICE_ENABLED = 1,\n};\n\nenum thermal_genl_attr {\n\tTHERMAL_GENL_ATTR_UNSPEC = 0,\n\tTHERMAL_GENL_ATTR_TZ = 1,\n\tTHERMAL_GENL_ATTR_TZ_ID = 2,\n\tTHERMAL_GENL_ATTR_TZ_TEMP = 3,\n\tTHERMAL_GENL_ATTR_TZ_TRIP = 4,\n\tTHERMAL_GENL_ATTR_TZ_TRIP_ID = 5,\n\tTHERMAL_GENL_ATTR_TZ_TRIP_TYPE = 6,\n\tTHERMAL_GENL_ATTR_TZ_TRIP_TEMP = 7,\n\tTHERMAL_GENL_ATTR_TZ_TRIP_HYST = 8,\n\tTHERMAL_GENL_ATTR_TZ_MODE = 9,\n\tTHERMAL_GENL_ATTR_TZ_NAME = 10,\n\tTHERMAL_GENL_ATTR_TZ_CDEV_WEIGHT = 11,\n\tTHERMAL_GENL_ATTR_TZ_GOV = 12,\n\tTHERMAL_GENL_ATTR_TZ_GOV_NAME = 13,\n\tTHERMAL_GENL_ATTR_CDEV = 14,\n\tTHERMAL_GENL_ATTR_CDEV_ID = 15,\n\tTHERMAL_GENL_ATTR_CDEV_CUR_STATE = 16,\n\tTHERMAL_GENL_ATTR_CDEV_MAX_STATE = 17,\n\tTHERMAL_GENL_ATTR_CDEV_NAME = 18,\n\tTHERMAL_GENL_ATTR_GOV_NAME = 19,\n\tTHERMAL_GENL_ATTR_CPU_CAPABILITY = 20,\n\tTHERMAL_GENL_ATTR_CPU_CAPABILITY_ID = 21,\n\tTHERMAL_GENL_ATTR_CPU_CAPABILITY_PERFORMANCE = 22,\n\tTHERMAL_GENL_ATTR_CPU_CAPABILITY_EFFICIENCY = 23,\n\t__THERMAL_GENL_ATTR_MAX = 24,\n};\n\nenum thermal_genl_cmd {\n\tTHERMAL_GENL_CMD_UNSPEC = 0,\n\tTHERMAL_GENL_CMD_TZ_GET_ID = 1,\n\tTHERMAL_GENL_CMD_TZ_GET_TRIP = 2,\n\tTHERMAL_GENL_CMD_TZ_GET_TEMP = 3,\n\tTHERMAL_GENL_CMD_TZ_GET_GOV = 4,\n\tTHERMAL_GENL_CMD_TZ_GET_MODE = 5,\n\tTHERMAL_GENL_CMD_CDEV_GET = 6,\n\t__THERMAL_GENL_CMD_MAX = 7,\n};\n\nenum thermal_genl_event {\n\tTHERMAL_GENL_EVENT_UNSPEC = 0,\n\tTHERMAL_GENL_EVENT_TZ_CREATE = 1,\n\tTHERMAL_GENL_EVENT_TZ_DELETE = 2,\n\tTHERMAL_GENL_EVENT_TZ_DISABLE = 3,\n\tTHERMAL_GENL_EVENT_TZ_ENABLE = 4,\n\tTHERMAL_GENL_EVENT_TZ_TRIP_UP = 5,\n\tTHERMAL_GENL_EVENT_TZ_TRIP_DOWN = 6,\n\tTHERMAL_GENL_EVENT_TZ_TRIP_CHANGE = 7,\n\tTHERMAL_GENL_EVENT_TZ_TRIP_ADD = 8,\n\tTHERMAL_GENL_EVENT_TZ_TRIP_DELETE = 9,\n\tTHERMAL_GENL_EVENT_CDEV_ADD = 10,\n\tTHERMAL_GENL_EVENT_CDEV_DELETE = 11,\n\tTHERMAL_GENL_EVENT_CDEV_STATE_UPDATE = 12,\n\tTHERMAL_GENL_EVENT_TZ_GOV_CHANGE = 13,\n\tTHERMAL_GENL_EVENT_CPU_CAPABILITY_CHANGE = 14,\n\t__THERMAL_GENL_EVENT_MAX = 15,\n};\n\nenum thermal_genl_multicast_groups {\n\tTHERMAL_GENL_SAMPLING_GROUP = 0,\n\tTHERMAL_GENL_EVENT_GROUP = 1,\n\tTHERMAL_GENL_MAX_GROUP = 1,\n};\n\nenum thermal_genl_sampling {\n\tTHERMAL_GENL_SAMPLING_TEMP = 0,\n\t__THERMAL_GENL_SAMPLING_MAX = 1,\n};\n\nenum thermal_notify_event {\n\tTHERMAL_EVENT_UNSPECIFIED = 0,\n\tTHERMAL_EVENT_TEMP_SAMPLE = 1,\n\tTHERMAL_TRIP_VIOLATED = 2,\n\tTHERMAL_TRIP_CHANGED = 3,\n\tTHERMAL_DEVICE_DOWN = 4,\n\tTHERMAL_DEVICE_UP = 5,\n\tTHERMAL_DEVICE_POWER_CAPABILITY_CHANGED = 6,\n\tTHERMAL_TABLE_CHANGED = 7,\n\tTHERMAL_EVENT_KEEP_ALIVE = 8,\n\tTHERMAL_TZ_BIND_CDEV = 9,\n\tTHERMAL_TZ_UNBIND_CDEV = 10,\n\tTHERMAL_INSTANCE_WEIGHT_CHANGED = 11,\n\tTHERMAL_TZ_RESUME = 12,\n};\n\nenum thermal_trend {\n\tTHERMAL_TREND_STABLE = 0,\n\tTHERMAL_TREND_RAISING = 1,\n\tTHERMAL_TREND_DROPPING = 2,\n};\n\nenum thermal_trip_type {\n\tTHERMAL_TRIP_ACTIVE = 0,\n\tTHERMAL_TRIP_PASSIVE = 1,\n\tTHERMAL_TRIP_HOT = 2,\n\tTHERMAL_TRIP_CRITICAL = 3,\n};\n\nenum tick_broadcast_mode {\n\tTICK_BROADCAST_OFF = 0,\n\tTICK_BROADCAST_ON = 1,\n\tTICK_BROADCAST_FORCE = 2,\n};\n\nenum tick_broadcast_state {\n\tTICK_BROADCAST_EXIT = 0,\n\tTICK_BROADCAST_ENTER = 1,\n};\n\nenum tick_dep_bits {\n\tTICK_DEP_BIT_POSIX_TIMER = 0,\n\tTICK_DEP_BIT_PERF_EVENTS = 1,\n\tTICK_DEP_BIT_SCHED = 2,\n\tTICK_DEP_BIT_CLOCK_UNSTABLE = 3,\n\tTICK_DEP_BIT_RCU = 4,\n\tTICK_DEP_BIT_RCU_EXP = 5,\n};\n\nenum tick_device_mode {\n\tTICKDEV_MODE_PERIODIC = 0,\n\tTICKDEV_MODE_ONESHOT = 1,\n};\n\nenum timekeeping_adv_mode {\n\tTK_ADV_TICK = 0,\n\tTK_ADV_FREQ = 1,\n};\n\nenum timespec_type {\n\tTT_NONE = 0,\n\tTT_NATIVE = 1,\n\tTT_COMPAT = 2,\n};\n\nenum tis_access {\n\tTPM_ACCESS_VALID = 128,\n\tTPM_ACCESS_ACTIVE_LOCALITY = 32,\n\tTPM_ACCESS_REQUEST_PENDING = 4,\n\tTPM_ACCESS_REQUEST_USE = 2,\n};\n\nenum tis_defaults {\n\tTIS_MEM_LEN = 20480,\n\tTIS_SHORT_TIMEOUT = 750,\n\tTIS_LONG_TIMEOUT = 2000,\n\tTIS_TIMEOUT_MIN_ATML = 14700,\n\tTIS_TIMEOUT_MAX_ATML = 15000,\n};\n\nenum tis_int_flags {\n\tTPM_GLOBAL_INT_ENABLE = 2147483648,\n\tTPM_INTF_BURST_COUNT_STATIC = 256,\n\tTPM_INTF_CMD_READY_INT = 128,\n\tTPM_INTF_INT_EDGE_FALLING = 64,\n\tTPM_INTF_INT_EDGE_RISING = 32,\n\tTPM_INTF_INT_LEVEL_LOW = 16,\n\tTPM_INTF_INT_LEVEL_HIGH = 8,\n\tTPM_INTF_LOCALITY_CHANGE_INT = 4,\n\tTPM_INTF_STS_VALID_INT = 2,\n\tTPM_INTF_DATA_AVAIL_INT = 1,\n};\n\nenum tis_status {\n\tTPM_STS_VALID = 128,\n\tTPM_STS_COMMAND_READY = 64,\n\tTPM_STS_GO = 32,\n\tTPM_STS_DATA_AVAIL = 16,\n\tTPM_STS_DATA_EXPECT = 8,\n\tTPM_STS_RESPONSE_RETRY = 2,\n\tTPM_STS_READ_ZERO = 35,\n};\n\nenum tk_offsets {\n\tTK_OFFS_REAL = 0,\n\tTK_OFFS_BOOT = 1,\n\tTK_OFFS_TAI = 2,\n\tTK_OFFS_MAX = 3,\n};\n\nenum tlb_flush_reason {\n\tTLB_FLUSH_ON_TASK_SWITCH = 0,\n\tTLB_REMOTE_SHOOTDOWN = 1,\n\tTLB_LOCAL_SHOOTDOWN = 2,\n\tTLB_LOCAL_MM_SHOOTDOWN = 3,\n\tTLB_REMOTE_SEND_IPI = 4,\n\tNR_TLB_FLUSH_REASONS = 5,\n};\n\nenum tlb_infos {\n\tENTRIES = 0,\n\tNR_INFO = 1,\n};\n\nenum tls_offload_ctx_dir {\n\tTLS_OFFLOAD_CTX_DIR_RX = 0,\n\tTLS_OFFLOAD_CTX_DIR_TX = 1,\n};\n\nenum tomoyo_acl_entry_type_index {\n\tTOMOYO_TYPE_PATH_ACL = 0,\n\tTOMOYO_TYPE_PATH2_ACL = 1,\n\tTOMOYO_TYPE_PATH_NUMBER_ACL = 2,\n\tTOMOYO_TYPE_MKDEV_ACL = 3,\n\tTOMOYO_TYPE_MOUNT_ACL = 4,\n\tTOMOYO_TYPE_INET_ACL = 5,\n\tTOMOYO_TYPE_UNIX_ACL = 6,\n\tTOMOYO_TYPE_ENV_ACL = 7,\n\tTOMOYO_TYPE_MANUAL_TASK_ACL = 8,\n};\n\nenum tomoyo_conditions_index {\n\tTOMOYO_TASK_UID = 0,\n\tTOMOYO_TASK_EUID = 1,\n\tTOMOYO_TASK_SUID = 2,\n\tTOMOYO_TASK_FSUID = 3,\n\tTOMOYO_TASK_GID = 4,\n\tTOMOYO_TASK_EGID = 5,\n\tTOMOYO_TASK_SGID = 6,\n\tTOMOYO_TASK_FSGID = 7,\n\tTOMOYO_TASK_PID = 8,\n\tTOMOYO_TASK_PPID = 9,\n\tTOMOYO_EXEC_ARGC = 10,\n\tTOMOYO_EXEC_ENVC = 11,\n\tTOMOYO_TYPE_IS_SOCKET = 12,\n\tTOMOYO_TYPE_IS_SYMLINK = 13,\n\tTOMOYO_TYPE_IS_FILE = 14,\n\tTOMOYO_TYPE_IS_BLOCK_DEV = 15,\n\tTOMOYO_TYPE_IS_DIRECTORY = 16,\n\tTOMOYO_TYPE_IS_CHAR_DEV = 17,\n\tTOMOYO_TYPE_IS_FIFO = 18,\n\tTOMOYO_MODE_SETUID = 19,\n\tTOMOYO_MODE_SETGID = 20,\n\tTOMOYO_MODE_STICKY = 21,\n\tTOMOYO_MODE_OWNER_READ = 22,\n\tTOMOYO_MODE_OWNER_WRITE = 23,\n\tTOMOYO_MODE_OWNER_EXECUTE = 24,\n\tTOMOYO_MODE_GROUP_READ = 25,\n\tTOMOYO_MODE_GROUP_WRITE = 26,\n\tTOMOYO_MODE_GROUP_EXECUTE = 27,\n\tTOMOYO_MODE_OTHERS_READ = 28,\n\tTOMOYO_MODE_OTHERS_WRITE = 29,\n\tTOMOYO_MODE_OTHERS_EXECUTE = 30,\n\tTOMOYO_EXEC_REALPATH = 31,\n\tTOMOYO_SYMLINK_TARGET = 32,\n\tTOMOYO_PATH1_UID = 33,\n\tTOMOYO_PATH1_GID = 34,\n\tTOMOYO_PATH1_INO = 35,\n\tTOMOYO_PATH1_MAJOR = 36,\n\tTOMOYO_PATH1_MINOR = 37,\n\tTOMOYO_PATH1_PERM = 38,\n\tTOMOYO_PATH1_TYPE = 39,\n\tTOMOYO_PATH1_DEV_MAJOR = 40,\n\tTOMOYO_PATH1_DEV_MINOR = 41,\n\tTOMOYO_PATH2_UID = 42,\n\tTOMOYO_PATH2_GID = 43,\n\tTOMOYO_PATH2_INO = 44,\n\tTOMOYO_PATH2_MAJOR = 45,\n\tTOMOYO_PATH2_MINOR = 46,\n\tTOMOYO_PATH2_PERM = 47,\n\tTOMOYO_PATH2_TYPE = 48,\n\tTOMOYO_PATH2_DEV_MAJOR = 49,\n\tTOMOYO_PATH2_DEV_MINOR = 50,\n\tTOMOYO_PATH1_PARENT_UID = 51,\n\tTOMOYO_PATH1_PARENT_GID = 52,\n\tTOMOYO_PATH1_PARENT_INO = 53,\n\tTOMOYO_PATH1_PARENT_PERM = 54,\n\tTOMOYO_PATH2_PARENT_UID = 55,\n\tTOMOYO_PATH2_PARENT_GID = 56,\n\tTOMOYO_PATH2_PARENT_INO = 57,\n\tTOMOYO_PATH2_PARENT_PERM = 58,\n\tTOMOYO_MAX_CONDITION_KEYWORD = 59,\n\tTOMOYO_NUMBER_UNION = 60,\n\tTOMOYO_NAME_UNION = 61,\n\tTOMOYO_ARGV_ENTRY = 62,\n\tTOMOYO_ENVP_ENTRY = 63,\n};\n\nenum tomoyo_domain_info_flags_index {\n\tTOMOYO_DIF_QUOTA_WARNED = 0,\n\tTOMOYO_DIF_TRANSITION_FAILED = 1,\n\tTOMOYO_MAX_DOMAIN_INFO_FLAGS = 2,\n};\n\nenum tomoyo_grant_log {\n\tTOMOYO_GRANTLOG_AUTO = 0,\n\tTOMOYO_GRANTLOG_NO = 1,\n\tTOMOYO_GRANTLOG_YES = 2,\n};\n\nenum tomoyo_group_id {\n\tTOMOYO_PATH_GROUP = 0,\n\tTOMOYO_NUMBER_GROUP = 1,\n\tTOMOYO_ADDRESS_GROUP = 2,\n\tTOMOYO_MAX_GROUP = 3,\n};\n\nenum tomoyo_mac_category_index {\n\tTOMOYO_MAC_CATEGORY_FILE = 0,\n\tTOMOYO_MAC_CATEGORY_NETWORK = 1,\n\tTOMOYO_MAC_CATEGORY_MISC = 2,\n\tTOMOYO_MAX_MAC_CATEGORY_INDEX = 3,\n};\n\nenum tomoyo_mac_index {\n\tTOMOYO_MAC_FILE_EXECUTE = 0,\n\tTOMOYO_MAC_FILE_OPEN = 1,\n\tTOMOYO_MAC_FILE_CREATE = 2,\n\tTOMOYO_MAC_FILE_UNLINK = 3,\n\tTOMOYO_MAC_FILE_GETATTR = 4,\n\tTOMOYO_MAC_FILE_MKDIR = 5,\n\tTOMOYO_MAC_FILE_RMDIR = 6,\n\tTOMOYO_MAC_FILE_MKFIFO = 7,\n\tTOMOYO_MAC_FILE_MKSOCK = 8,\n\tTOMOYO_MAC_FILE_TRUNCATE = 9,\n\tTOMOYO_MAC_FILE_SYMLINK = 10,\n\tTOMOYO_MAC_FILE_MKBLOCK = 11,\n\tTOMOYO_MAC_FILE_MKCHAR = 12,\n\tTOMOYO_MAC_FILE_LINK = 13,\n\tTOMOYO_MAC_FILE_RENAME = 14,\n\tTOMOYO_MAC_FILE_CHMOD = 15,\n\tTOMOYO_MAC_FILE_CHOWN = 16,\n\tTOMOYO_MAC_FILE_CHGRP = 17,\n\tTOMOYO_MAC_FILE_IOCTL = 18,\n\tTOMOYO_MAC_FILE_CHROOT = 19,\n\tTOMOYO_MAC_FILE_MOUNT = 20,\n\tTOMOYO_MAC_FILE_UMOUNT = 21,\n\tTOMOYO_MAC_FILE_PIVOT_ROOT = 22,\n\tTOMOYO_MAC_NETWORK_INET_STREAM_BIND = 23,\n\tTOMOYO_MAC_NETWORK_INET_STREAM_LISTEN = 24,\n\tTOMOYO_MAC_NETWORK_INET_STREAM_CONNECT = 25,\n\tTOMOYO_MAC_NETWORK_INET_DGRAM_BIND = 26,\n\tTOMOYO_MAC_NETWORK_INET_DGRAM_SEND = 27,\n\tTOMOYO_MAC_NETWORK_INET_RAW_BIND = 28,\n\tTOMOYO_MAC_NETWORK_INET_RAW_SEND = 29,\n\tTOMOYO_MAC_NETWORK_UNIX_STREAM_BIND = 30,\n\tTOMOYO_MAC_NETWORK_UNIX_STREAM_LISTEN = 31,\n\tTOMOYO_MAC_NETWORK_UNIX_STREAM_CONNECT = 32,\n\tTOMOYO_MAC_NETWORK_UNIX_DGRAM_BIND = 33,\n\tTOMOYO_MAC_NETWORK_UNIX_DGRAM_SEND = 34,\n\tTOMOYO_MAC_NETWORK_UNIX_SEQPACKET_BIND = 35,\n\tTOMOYO_MAC_NETWORK_UNIX_SEQPACKET_LISTEN = 36,\n\tTOMOYO_MAC_NETWORK_UNIX_SEQPACKET_CONNECT = 37,\n\tTOMOYO_MAC_ENVIRON = 38,\n\tTOMOYO_MAX_MAC_INDEX = 39,\n};\n\nenum tomoyo_memory_stat_type {\n\tTOMOYO_MEMORY_POLICY = 0,\n\tTOMOYO_MEMORY_AUDIT = 1,\n\tTOMOYO_MEMORY_QUERY = 2,\n\tTOMOYO_MAX_MEMORY_STAT = 3,\n};\n\nenum tomoyo_mkdev_acl_index {\n\tTOMOYO_TYPE_MKBLOCK = 0,\n\tTOMOYO_TYPE_MKCHAR = 1,\n\tTOMOYO_MAX_MKDEV_OPERATION = 2,\n};\n\nenum tomoyo_mode_index {\n\tTOMOYO_CONFIG_DISABLED = 0,\n\tTOMOYO_CONFIG_LEARNING = 1,\n\tTOMOYO_CONFIG_PERMISSIVE = 2,\n\tTOMOYO_CONFIG_ENFORCING = 3,\n\tTOMOYO_CONFIG_MAX_MODE = 4,\n\tTOMOYO_CONFIG_WANT_REJECT_LOG = 64,\n\tTOMOYO_CONFIG_WANT_GRANT_LOG = 128,\n\tTOMOYO_CONFIG_USE_DEFAULT = 255,\n};\n\nenum tomoyo_network_acl_index {\n\tTOMOYO_NETWORK_BIND = 0,\n\tTOMOYO_NETWORK_LISTEN = 1,\n\tTOMOYO_NETWORK_CONNECT = 2,\n\tTOMOYO_NETWORK_SEND = 3,\n\tTOMOYO_MAX_NETWORK_OPERATION = 4,\n};\n\nenum tomoyo_path2_acl_index {\n\tTOMOYO_TYPE_LINK = 0,\n\tTOMOYO_TYPE_RENAME = 1,\n\tTOMOYO_TYPE_PIVOT_ROOT = 2,\n\tTOMOYO_MAX_PATH2_OPERATION = 3,\n};\n\nenum tomoyo_path_acl_index {\n\tTOMOYO_TYPE_EXECUTE = 0,\n\tTOMOYO_TYPE_READ = 1,\n\tTOMOYO_TYPE_WRITE = 2,\n\tTOMOYO_TYPE_APPEND = 3,\n\tTOMOYO_TYPE_UNLINK = 4,\n\tTOMOYO_TYPE_GETATTR = 5,\n\tTOMOYO_TYPE_RMDIR = 6,\n\tTOMOYO_TYPE_TRUNCATE = 7,\n\tTOMOYO_TYPE_SYMLINK = 8,\n\tTOMOYO_TYPE_CHROOT = 9,\n\tTOMOYO_TYPE_UMOUNT = 10,\n\tTOMOYO_MAX_PATH_OPERATION = 11,\n};\n\nenum tomoyo_path_number_acl_index {\n\tTOMOYO_TYPE_CREATE = 0,\n\tTOMOYO_TYPE_MKDIR = 1,\n\tTOMOYO_TYPE_MKFIFO = 2,\n\tTOMOYO_TYPE_MKSOCK = 3,\n\tTOMOYO_TYPE_IOCTL = 4,\n\tTOMOYO_TYPE_CHMOD = 5,\n\tTOMOYO_TYPE_CHOWN = 6,\n\tTOMOYO_TYPE_CHGRP = 7,\n\tTOMOYO_MAX_PATH_NUMBER_OPERATION = 8,\n};\n\nenum tomoyo_path_stat_index {\n\tTOMOYO_PATH1 = 0,\n\tTOMOYO_PATH1_PARENT = 1,\n\tTOMOYO_PATH2 = 2,\n\tTOMOYO_PATH2_PARENT = 3,\n\tTOMOYO_MAX_PATH_STAT = 4,\n};\n\nenum tomoyo_policy_id {\n\tTOMOYO_ID_GROUP = 0,\n\tTOMOYO_ID_ADDRESS_GROUP = 1,\n\tTOMOYO_ID_PATH_GROUP = 2,\n\tTOMOYO_ID_NUMBER_GROUP = 3,\n\tTOMOYO_ID_TRANSITION_CONTROL = 4,\n\tTOMOYO_ID_AGGREGATOR = 5,\n\tTOMOYO_ID_MANAGER = 6,\n\tTOMOYO_ID_CONDITION = 7,\n\tTOMOYO_ID_NAME = 8,\n\tTOMOYO_ID_ACL = 9,\n\tTOMOYO_ID_DOMAIN = 10,\n\tTOMOYO_MAX_POLICY = 11,\n};\n\nenum tomoyo_policy_stat_type {\n\tTOMOYO_STAT_POLICY_UPDATES = 0,\n\tTOMOYO_STAT_POLICY_LEARNING = 1,\n\tTOMOYO_STAT_POLICY_PERMISSIVE = 2,\n\tTOMOYO_STAT_POLICY_ENFORCING = 3,\n\tTOMOYO_MAX_POLICY_STAT = 4,\n};\n\nenum tomoyo_pref_index {\n\tTOMOYO_PREF_MAX_AUDIT_LOG = 0,\n\tTOMOYO_PREF_MAX_LEARNING_ENTRY = 1,\n\tTOMOYO_MAX_PREF = 2,\n};\n\nenum tomoyo_securityfs_interface_index {\n\tTOMOYO_DOMAINPOLICY = 0,\n\tTOMOYO_EXCEPTIONPOLICY = 1,\n\tTOMOYO_PROCESS_STATUS = 2,\n\tTOMOYO_STAT = 3,\n\tTOMOYO_AUDIT = 4,\n\tTOMOYO_VERSION = 5,\n\tTOMOYO_PROFILE = 6,\n\tTOMOYO_QUERY = 7,\n\tTOMOYO_MANAGER = 8,\n};\n\nenum tomoyo_special_mount {\n\tTOMOYO_MOUNT_BIND = 0,\n\tTOMOYO_MOUNT_MOVE = 1,\n\tTOMOYO_MOUNT_REMOUNT = 2,\n\tTOMOYO_MOUNT_MAKE_UNBINDABLE = 3,\n\tTOMOYO_MOUNT_MAKE_PRIVATE = 4,\n\tTOMOYO_MOUNT_MAKE_SLAVE = 5,\n\tTOMOYO_MOUNT_MAKE_SHARED = 6,\n\tTOMOYO_MAX_SPECIAL_MOUNT = 7,\n};\n\nenum tomoyo_transition_type {\n\tTOMOYO_TRANSITION_CONTROL_NO_RESET = 0,\n\tTOMOYO_TRANSITION_CONTROL_RESET = 1,\n\tTOMOYO_TRANSITION_CONTROL_NO_INITIALIZE = 2,\n\tTOMOYO_TRANSITION_CONTROL_INITIALIZE = 3,\n\tTOMOYO_TRANSITION_CONTROL_NO_KEEP = 4,\n\tTOMOYO_TRANSITION_CONTROL_KEEP = 5,\n\tTOMOYO_MAX_TRANSITION_TYPE = 6,\n};\n\nenum tomoyo_value_type {\n\tTOMOYO_VALUE_TYPE_INVALID = 0,\n\tTOMOYO_VALUE_TYPE_DECIMAL = 1,\n\tTOMOYO_VALUE_TYPE_OCTAL = 2,\n\tTOMOYO_VALUE_TYPE_HEXADECIMAL = 3,\n};\n\nenum topo_types {\n\tINVALID_TYPE = 0,\n\tSMT_TYPE = 1,\n\tCORE_TYPE = 2,\n\tMAX_TYPE_0B = 3,\n\tMODULE_TYPE = 3,\n\tAMD_CCD_TYPE = 3,\n\tTILE_TYPE = 4,\n\tAMD_SOCKET_TYPE = 4,\n\tMAX_TYPE_80000026 = 5,\n\tDIE_TYPE = 5,\n\tDIEGRP_TYPE = 6,\n\tMAX_TYPE_1F = 7,\n};\n\nenum tp_func_state {\n\tTP_FUNC_0 = 0,\n\tTP_FUNC_1 = 1,\n\tTP_FUNC_2 = 2,\n\tTP_FUNC_N = 3,\n};\n\nenum tp_transition_sync {\n\tTP_TRANSITION_SYNC_1_0_1 = 0,\n\tTP_TRANSITION_SYNC_N_2_1 = 1,\n\t_NR_TP_TRANSITION_SYNC = 2,\n};\n\nenum tpacket_versions {\n\tTPACKET_V1 = 0,\n\tTPACKET_V2 = 1,\n\tTPACKET_V3 = 2,\n};\n\nenum tpm2_capabilities {\n\tTPM2_CAP_HANDLES = 1,\n\tTPM2_CAP_COMMANDS = 2,\n\tTPM2_CAP_PCRS = 5,\n\tTPM2_CAP_TPM_PROPERTIES = 6,\n};\n\nenum tpm2_cc_attrs {\n\tTPM2_CC_ATTR_CHANDLES = 25,\n\tTPM2_CC_ATTR_RHANDLE = 28,\n\tTPM2_CC_ATTR_VENDOR = 29,\n};\n\nenum tpm2_command_codes {\n\tTPM2_CC_FIRST = 287,\n\tTPM2_CC_HIERARCHY_CONTROL = 289,\n\tTPM2_CC_HIERARCHY_CHANGE_AUTH = 297,\n\tTPM2_CC_CREATE_PRIMARY = 305,\n\tTPM2_CC_SEQUENCE_COMPLETE = 318,\n\tTPM2_CC_SELF_TEST = 323,\n\tTPM2_CC_STARTUP = 324,\n\tTPM2_CC_SHUTDOWN = 325,\n\tTPM2_CC_NV_READ = 334,\n\tTPM2_CC_CREATE = 339,\n\tTPM2_CC_LOAD = 343,\n\tTPM2_CC_SEQUENCE_UPDATE = 348,\n\tTPM2_CC_UNSEAL = 350,\n\tTPM2_CC_CONTEXT_LOAD = 353,\n\tTPM2_CC_CONTEXT_SAVE = 354,\n\tTPM2_CC_FLUSH_CONTEXT = 357,\n\tTPM2_CC_READ_PUBLIC = 371,\n\tTPM2_CC_START_AUTH_SESS = 374,\n\tTPM2_CC_VERIFY_SIGNATURE = 375,\n\tTPM2_CC_GET_CAPABILITY = 378,\n\tTPM2_CC_GET_RANDOM = 379,\n\tTPM2_CC_PCR_READ = 382,\n\tTPM2_CC_PCR_EXTEND = 386,\n\tTPM2_CC_EVENT_SEQUENCE_COMPLETE = 389,\n\tTPM2_CC_HASH_SEQUENCE_START = 390,\n\tTPM2_CC_CREATE_LOADED = 401,\n\tTPM2_CC_LAST = 403,\n};\n\nenum tpm2_const {\n\tTPM2_PLATFORM_PCR = 24,\n\tTPM2_PCR_SELECT_MIN = 3,\n};\n\nenum tpm2_handle_types {\n\tTPM2_HT_HMAC_SESSION = 33554432,\n\tTPM2_HT_POLICY_SESSION = 50331648,\n\tTPM2_HT_TRANSIENT = 2147483648,\n};\n\nenum tpm2_object_attributes {\n\tTPM2_OA_FIXED_TPM = 2,\n\tTPM2_OA_ST_CLEAR = 4,\n\tTPM2_OA_FIXED_PARENT = 16,\n\tTPM2_OA_SENSITIVE_DATA_ORIGIN = 32,\n\tTPM2_OA_USER_WITH_AUTH = 64,\n\tTPM2_OA_ADMIN_WITH_POLICY = 128,\n\tTPM2_OA_NO_DA = 1024,\n\tTPM2_OA_ENCRYPTED_DUPLICATION = 2048,\n\tTPM2_OA_RESTRICTED = 65536,\n\tTPM2_OA_DECRYPT = 131072,\n\tTPM2_OA_SIGN = 262144,\n};\n\nenum tpm2_permanent_handles {\n\tTPM2_RH_NULL = 1073741831,\n\tTPM2_RS_PW = 1073741833,\n};\n\nenum tpm2_properties {\n\tTPM_PT_TOTAL_COMMANDS = 297,\n};\n\nenum tpm2_return_codes {\n\tTPM2_RC_SUCCESS = 0,\n\tTPM2_RC_HASH = 131,\n\tTPM2_RC_HANDLE = 139,\n\tTPM2_RC_INTEGRITY = 159,\n\tTPM2_RC_INITIALIZE = 256,\n\tTPM2_RC_FAILURE = 257,\n\tTPM2_RC_DISABLED = 288,\n\tTPM2_RC_UPGRADE = 301,\n\tTPM2_RC_COMMAND_CODE = 323,\n\tTPM2_RC_TESTING = 2314,\n\tTPM2_RC_REFERENCE_H0 = 2320,\n\tTPM2_RC_RETRY = 2338,\n};\n\nenum tpm2_session_attributes {\n\tTPM2_SA_CONTINUE_SESSION = 1,\n\tTPM2_SA_AUDIT_EXCLUSIVE = 2,\n\tTPM2_SA_AUDIT_RESET = 8,\n\tTPM2_SA_DECRYPT = 32,\n\tTPM2_SA_ENCRYPT = 64,\n\tTPM2_SA_AUDIT = 128,\n};\n\nenum tpm2_startup_types {\n\tTPM2_SU_CLEAR = 0,\n\tTPM2_SU_STATE = 1,\n};\n\nenum tpm2_structures {\n\tTPM2_ST_NO_SESSIONS = 32769,\n\tTPM2_ST_SESSIONS = 32770,\n\tTPM2_ST_CREATION = 32801,\n};\n\nenum tpm2_timeouts {\n\tTPM2_TIMEOUT_A = 750,\n\tTPM2_TIMEOUT_B = 2000,\n\tTPM2_TIMEOUT_C = 200,\n\tTPM2_TIMEOUT_D = 30,\n\tTPM2_DURATION_SHORT = 20,\n\tTPM2_DURATION_MEDIUM = 750,\n\tTPM2_DURATION_LONG = 2000,\n\tTPM2_DURATION_LONG_LONG = 300000,\n\tTPM2_DURATION_DEFAULT = 120000,\n};\n\nenum tpm2key_actions {\n\tACT_tpm2_key_parent = 0,\n\tACT_tpm2_key_priv = 1,\n\tACT_tpm2_key_pub = 2,\n\tACT_tpm2_key_type = 3,\n\tNR__tpm2key_actions = 4,\n};\n\nenum tpm_algorithms {\n\tTPM_ALG_ERROR = 0,\n\tTPM_ALG_SHA1 = 4,\n\tTPM_ALG_AES = 6,\n\tTPM_ALG_KEYEDHASH = 8,\n\tTPM_ALG_SHA256 = 11,\n\tTPM_ALG_SHA384 = 12,\n\tTPM_ALG_SHA512 = 13,\n\tTPM_ALG_NULL = 16,\n\tTPM_ALG_SM3_256 = 18,\n\tTPM_ALG_ECC = 35,\n\tTPM_ALG_CFB = 67,\n};\n\nenum tpm_buf_flags {\n\tTPM_BUF_OVERFLOW = 1,\n\tTPM_BUF_TPM2B = 2,\n\tTPM_BUF_BOUNDARY_ERROR = 4,\n};\n\nenum tpm_capabilities {\n\tTPM_CAP_FLAG = 4,\n\tTPM_CAP_PROP = 5,\n\tTPM_CAP_VERSION_1_1 = 6,\n\tTPM_CAP_VERSION_1_2 = 26,\n};\n\nenum tpm_chip_flags {\n\tTPM_CHIP_FLAG_BOOTSTRAPPED = 1,\n\tTPM_CHIP_FLAG_TPM2 = 2,\n\tTPM_CHIP_FLAG_IRQ = 4,\n\tTPM_CHIP_FLAG_VIRTUAL = 8,\n\tTPM_CHIP_FLAG_HAVE_TIMEOUTS = 16,\n\tTPM_CHIP_FLAG_ALWAYS_POWERED = 32,\n\tTPM_CHIP_FLAG_FIRMWARE_POWER_MANAGED = 64,\n\tTPM_CHIP_FLAG_FIRMWARE_UPGRADE = 128,\n\tTPM_CHIP_FLAG_SUSPENDED = 256,\n\tTPM_CHIP_FLAG_HWRNG_DISABLED = 512,\n\tTPM_CHIP_FLAG_DISABLE = 1024,\n};\n\nenum tpm_duration {\n\tTPM_SHORT = 0,\n\tTPM_MEDIUM = 1,\n\tTPM_LONG = 2,\n\tTPM_LONG_LONG = 3,\n\tTPM_UNDEFINED = 4,\n\tTPM_NUM_DURATIONS = 4,\n};\n\nenum tpm_pcrs {\n\tTPM_PCR0 = 0,\n\tTPM_PCR8 = 8,\n\tTPM_PCR10 = 10,\n};\n\nenum tpm_sub_capabilities {\n\tTPM_CAP_PROP_PCR = 257,\n\tTPM_CAP_PROP_MANUFACTURER = 259,\n\tTPM_CAP_FLAG_PERM = 264,\n\tTPM_CAP_FLAG_VOL = 265,\n\tTPM_CAP_PROP_OWNER = 273,\n\tTPM_CAP_PROP_TIS_TIMEOUT = 277,\n\tTPM_CAP_PROP_TIS_DURATION = 288,\n};\n\nenum tpm_timeout {\n\tTPM_TIMEOUT = 5,\n\tTPM_TIMEOUT_RETRY = 100,\n\tTPM_TIMEOUT_RANGE_US = 300,\n\tTPM_TIMEOUT_POLL = 1,\n\tTPM_TIMEOUT_USECS_MIN = 100,\n\tTPM_TIMEOUT_USECS_MAX = 500,\n};\n\nenum tpm_tis_flags {\n\tTPM_TIS_ITPM_WORKAROUND = 0,\n\tTPM_TIS_INVALID_STATUS = 1,\n\tTPM_TIS_DEFAULT_CANCELLATION = 2,\n\tTPM_TIS_IRQ_TESTED = 3,\n};\n\nenum tpm_tis_io_mode {\n\tTPM_TIS_PHYS_8 = 0,\n\tTPM_TIS_PHYS_16 = 1,\n\tTPM_TIS_PHYS_32 = 2,\n};\n\nenum tps65090_cells {\n\tPMIC = 0,\n\tCHARGER = 1,\n};\n\nenum tps65912_irqs {\n\tTPS65912_IRQ_PWRHOLD_F = 0,\n\tTPS65912_IRQ_VMON = 1,\n\tTPS65912_IRQ_PWRON = 2,\n\tTPS65912_IRQ_PWRON_LP = 3,\n\tTPS65912_IRQ_PWRHOLD_R = 4,\n\tTPS65912_IRQ_HOTDIE = 5,\n\tTPS65912_IRQ_GPIO1_R = 6,\n\tTPS65912_IRQ_GPIO1_F = 7,\n\tTPS65912_IRQ_GPIO2_R = 8,\n\tTPS65912_IRQ_GPIO2_F = 9,\n\tTPS65912_IRQ_GPIO3_R = 10,\n\tTPS65912_IRQ_GPIO3_F = 11,\n\tTPS65912_IRQ_GPIO4_R = 12,\n\tTPS65912_IRQ_GPIO4_F = 13,\n\tTPS65912_IRQ_GPIO5_R = 14,\n\tTPS65912_IRQ_GPIO5_F = 15,\n\tTPS65912_IRQ_PGOOD_DCDC1 = 16,\n\tTPS65912_IRQ_PGOOD_DCDC2 = 17,\n\tTPS65912_IRQ_PGOOD_DCDC3 = 18,\n\tTPS65912_IRQ_PGOOD_DCDC4 = 19,\n\tTPS65912_IRQ_PGOOD_LDO1 = 20,\n\tTPS65912_IRQ_PGOOD_LDO2 = 21,\n\tTPS65912_IRQ_PGOOD_LDO3 = 22,\n\tTPS65912_IRQ_PGOOD_LDO4 = 23,\n\tTPS65912_IRQ_PGOOD_LDO5 = 24,\n\tTPS65912_IRQ_PGOOD_LDO6 = 25,\n\tTPS65912_IRQ_PGOOD_LDO7 = 26,\n\tTPS65912_IRQ_PGOOD_LDO8 = 27,\n\tTPS65912_IRQ_PGOOD_LDO9 = 28,\n\tTPS65912_IRQ_PGOOD_LDO10 = 29,\n};\n\nenum tps65917_irqs {\n\tTPS65917_RESERVED1 = 0,\n\tTPS65917_PWRON_IRQ = 1,\n\tTPS65917_LONG_PRESS_KEY_IRQ = 2,\n\tTPS65917_RESERVED2 = 3,\n\tTPS65917_PWRDOWN_IRQ = 4,\n\tTPS65917_HOTDIE_IRQ = 5,\n\tTPS65917_VSYS_MON_IRQ = 6,\n\tTPS65917_RESERVED3 = 7,\n\tTPS65917_RESERVED4 = 8,\n\tTPS65917_OTP_ERROR_IRQ = 9,\n\tTPS65917_WDT_IRQ = 10,\n\tTPS65917_RESERVED5 = 11,\n\tTPS65917_RESET_IN_IRQ = 12,\n\tTPS65917_FSD_IRQ = 13,\n\tTPS65917_SHORT_IRQ = 14,\n\tTPS65917_RESERVED6 = 15,\n\tTPS65917_GPADC_AUTO_0_IRQ = 16,\n\tTPS65917_GPADC_AUTO_1_IRQ = 17,\n\tTPS65917_GPADC_EOC_SW_IRQ = 18,\n\tTPS65917_RESREVED6 = 19,\n\tTPS65917_RESERVED7 = 20,\n\tTPS65917_RESERVED8 = 21,\n\tTPS65917_RESERVED9 = 22,\n\tTPS65917_VBUS_IRQ = 23,\n\tTPS65917_GPIO_0_IRQ = 24,\n\tTPS65917_GPIO_1_IRQ = 25,\n\tTPS65917_GPIO_2_IRQ = 26,\n\tTPS65917_GPIO_3_IRQ = 27,\n\tTPS65917_GPIO_4_IRQ = 28,\n\tTPS65917_GPIO_5_IRQ = 29,\n\tTPS65917_GPIO_6_IRQ = 30,\n\tTPS65917_RESERVED10 = 31,\n\tTPS65917_NUM_IRQ = 32,\n};\n\nenum trace_flag_type {\n\tTRACE_FLAG_IRQS_OFF = 1,\n\tTRACE_FLAG_IRQS_NOSUPPORT = 2,\n\tTRACE_FLAG_NEED_RESCHED = 4,\n\tTRACE_FLAG_HARDIRQ = 8,\n\tTRACE_FLAG_SOFTIRQ = 16,\n\tTRACE_FLAG_PREEMPT_RESCHED = 32,\n\tTRACE_FLAG_NMI = 64,\n\tTRACE_FLAG_BH_OFF = 128,\n};\n\nenum trace_iter_flags {\n\tTRACE_FILE_LAT_FMT = 1,\n\tTRACE_FILE_ANNOTATE = 2,\n\tTRACE_FILE_TIME_IN_NS = 4,\n};\n\nenum trace_iterator_bits {\n\tTRACE_ITER_PRINT_PARENT_BIT = 0,\n\tTRACE_ITER_SYM_OFFSET_BIT = 1,\n\tTRACE_ITER_SYM_ADDR_BIT = 2,\n\tTRACE_ITER_VERBOSE_BIT = 3,\n\tTRACE_ITER_RAW_BIT = 4,\n\tTRACE_ITER_HEX_BIT = 5,\n\tTRACE_ITER_BIN_BIT = 6,\n\tTRACE_ITER_BLOCK_BIT = 7,\n\tTRACE_ITER_FIELDS_BIT = 8,\n\tTRACE_ITER_PRINTK_BIT = 9,\n\tTRACE_ITER_ANNOTATE_BIT = 10,\n\tTRACE_ITER_USERSTACKTRACE_BIT = 11,\n\tTRACE_ITER_SYM_USEROBJ_BIT = 12,\n\tTRACE_ITER_PRINTK_MSGONLY_BIT = 13,\n\tTRACE_ITER_CONTEXT_INFO_BIT = 14,\n\tTRACE_ITER_LATENCY_FMT_BIT = 15,\n\tTRACE_ITER_RECORD_CMD_BIT = 16,\n\tTRACE_ITER_RECORD_TGID_BIT = 17,\n\tTRACE_ITER_OVERWRITE_BIT = 18,\n\tTRACE_ITER_STOP_ON_FREE_BIT = 19,\n\tTRACE_ITER_IRQ_INFO_BIT = 20,\n\tTRACE_ITER_MARKERS_BIT = 21,\n\tTRACE_ITER_EVENT_FORK_BIT = 22,\n\tTRACE_ITER_PAUSE_ON_TRACE_BIT = 23,\n\tTRACE_ITER_HASH_PTR_BIT = 24,\n\tTRACE_ITER_FUNCTION_BIT = 25,\n\tTRACE_ITER_FUNC_FORK_BIT = 26,\n\tTRACE_ITER_DISPLAY_GRAPH_BIT = 27,\n\tTRACE_ITER_STACKTRACE_BIT = 28,\n\tTRACE_ITER_LAST_BIT = 29,\n};\n\nenum trace_iterator_flags {\n\tTRACE_ITER_PRINT_PARENT = 1,\n\tTRACE_ITER_SYM_OFFSET = 2,\n\tTRACE_ITER_SYM_ADDR = 4,\n\tTRACE_ITER_VERBOSE = 8,\n\tTRACE_ITER_RAW = 16,\n\tTRACE_ITER_HEX = 32,\n\tTRACE_ITER_BIN = 64,\n\tTRACE_ITER_BLOCK = 128,\n\tTRACE_ITER_FIELDS = 256,\n\tTRACE_ITER_PRINTK = 512,\n\tTRACE_ITER_ANNOTATE = 1024,\n\tTRACE_ITER_USERSTACKTRACE = 2048,\n\tTRACE_ITER_SYM_USEROBJ = 4096,\n\tTRACE_ITER_PRINTK_MSGONLY = 8192,\n\tTRACE_ITER_CONTEXT_INFO = 16384,\n\tTRACE_ITER_LATENCY_FMT = 32768,\n\tTRACE_ITER_RECORD_CMD = 65536,\n\tTRACE_ITER_RECORD_TGID = 131072,\n\tTRACE_ITER_OVERWRITE = 262144,\n\tTRACE_ITER_STOP_ON_FREE = 524288,\n\tTRACE_ITER_IRQ_INFO = 1048576,\n\tTRACE_ITER_MARKERS = 2097152,\n\tTRACE_ITER_EVENT_FORK = 4194304,\n\tTRACE_ITER_PAUSE_ON_TRACE = 8388608,\n\tTRACE_ITER_HASH_PTR = 16777216,\n\tTRACE_ITER_FUNCTION = 33554432,\n\tTRACE_ITER_FUNC_FORK = 67108864,\n\tTRACE_ITER_DISPLAY_GRAPH = 134217728,\n\tTRACE_ITER_STACKTRACE = 268435456,\n};\n\nenum trace_reg {\n\tTRACE_REG_REGISTER = 0,\n\tTRACE_REG_UNREGISTER = 1,\n\tTRACE_REG_PERF_REGISTER = 2,\n\tTRACE_REG_PERF_UNREGISTER = 3,\n\tTRACE_REG_PERF_OPEN = 4,\n\tTRACE_REG_PERF_CLOSE = 5,\n\tTRACE_REG_PERF_ADD = 6,\n\tTRACE_REG_PERF_DEL = 7,\n};\n\nenum trace_type {\n\t__TRACE_FIRST_TYPE = 0,\n\tTRACE_FN = 1,\n\tTRACE_CTX = 2,\n\tTRACE_WAKE = 3,\n\tTRACE_STACK = 4,\n\tTRACE_PRINT = 5,\n\tTRACE_BPRINT = 6,\n\tTRACE_MMIO_RW = 7,\n\tTRACE_MMIO_MAP = 8,\n\tTRACE_BRANCH = 9,\n\tTRACE_GRAPH_RET = 10,\n\tTRACE_GRAPH_ENT = 11,\n\tTRACE_USER_STACK = 12,\n\tTRACE_BLK = 13,\n\tTRACE_BPUTS = 14,\n\tTRACE_HWLAT = 15,\n\tTRACE_OSNOISE = 16,\n\tTRACE_TIMERLAT = 17,\n\tTRACE_RAW_DATA = 18,\n\tTRACE_FUNC_REPEATS = 19,\n\t__TRACE_LAST_TYPE = 20,\n};\n\nenum track_item {\n\tTRACK_ALLOC = 0,\n\tTRACK_FREE = 1,\n};\n\nenum translation_map {\n\tLAT1_MAP = 0,\n\tGRAF_MAP = 1,\n\tIBMPC_MAP = 2,\n\tUSER_MAP = 3,\n\tFIRST_MAP = 0,\n\tLAST_MAP = 3,\n};\n\nenum transparent_hugepage_flag {\n\tTRANSPARENT_HUGEPAGE_UNSUPPORTED = 0,\n\tTRANSPARENT_HUGEPAGE_FLAG = 1,\n\tTRANSPARENT_HUGEPAGE_REQ_MADV_FLAG = 2,\n\tTRANSPARENT_HUGEPAGE_DEFRAG_DIRECT_FLAG = 3,\n\tTRANSPARENT_HUGEPAGE_DEFRAG_KSWAPD_FLAG = 4,\n\tTRANSPARENT_HUGEPAGE_DEFRAG_KSWAPD_OR_MADV_FLAG = 5,\n\tTRANSPARENT_HUGEPAGE_DEFRAG_REQ_MADV_FLAG = 6,\n\tTRANSPARENT_HUGEPAGE_DEFRAG_KHUGEPAGED_FLAG = 7,\n\tTRANSPARENT_HUGEPAGE_USE_ZERO_PAGE_FLAG = 8,\n};\n\nenum tsq_enum {\n\tTSQ_THROTTLED = 0,\n\tTSQ_QUEUED = 1,\n\tTCP_TSQ_DEFERRED = 2,\n\tTCP_WRITE_TIMER_DEFERRED = 3,\n\tTCP_DELACK_TIMER_DEFERRED = 4,\n\tTCP_MTU_REDUCED_DEFERRED = 5,\n\tTCP_ACK_DEFERRED = 6,\n};\n\nenum tsq_flags {\n\tTSQF_THROTTLED = 1,\n\tTSQF_QUEUED = 2,\n\tTCPF_TSQ_DEFERRED = 4,\n\tTCPF_WRITE_TIMER_DEFERRED = 8,\n\tTCPF_DELACK_TIMER_DEFERRED = 16,\n\tTCPF_MTU_REDUCED_DEFERRED = 32,\n\tTCPF_ACK_DEFERRED = 64,\n};\n\nenum tsx_ctrl_states {\n\tTSX_CTRL_ENABLE = 0,\n\tTSX_CTRL_DISABLE = 1,\n\tTSX_CTRL_RTM_ALWAYS_ABORT = 2,\n\tTSX_CTRL_NOT_SUPPORTED = 3,\n};\n\nenum ttu_flags {\n\tTTU_SPLIT_HUGE_PMD = 4,\n\tTTU_IGNORE_MLOCK = 8,\n\tTTU_SYNC = 16,\n\tTTU_HWPOISON = 32,\n\tTTU_BATCH_FLUSH = 64,\n\tTTU_RMAP_LOCKED = 128,\n};\n\nenum tty_flow_change {\n\tTTY_FLOW_NO_CHANGE = 0,\n\tTTY_THROTTLE_SAFE = 1,\n\tTTY_UNTHROTTLE_SAFE = 2,\n};\n\nenum tunable_id {\n\tETHTOOL_ID_UNSPEC = 0,\n\tETHTOOL_RX_COPYBREAK = 1,\n\tETHTOOL_TX_COPYBREAK = 2,\n\tETHTOOL_PFC_PREVENTION_TOUT = 3,\n\tETHTOOL_TX_COPYBREAK_BUF_SIZE = 4,\n\t__ETHTOOL_TUNABLE_COUNT = 5,\n};\n\nenum tunable_type_id {\n\tETHTOOL_TUNABLE_UNSPEC = 0,\n\tETHTOOL_TUNABLE_U8 = 1,\n\tETHTOOL_TUNABLE_U16 = 2,\n\tETHTOOL_TUNABLE_U32 = 3,\n\tETHTOOL_TUNABLE_U64 = 4,\n\tETHTOOL_TUNABLE_STRING = 5,\n\tETHTOOL_TUNABLE_S8 = 6,\n\tETHTOOL_TUNABLE_S16 = 7,\n\tETHTOOL_TUNABLE_S32 = 8,\n\tETHTOOL_TUNABLE_S64 = 9,\n};\n\nenum twl4030_audio_res {\n\tTWL4030_AUDIO_RES_POWER = 0,\n\tTWL4030_AUDIO_RES_APLL = 1,\n\tTWL4030_AUDIO_RES_MAX = 2,\n};\n\nenum twl4030_module_ids {\n\tTWL4030_MODULE_AUDIO_VOICE = 9,\n\tTWL4030_MODULE_GPIO = 10,\n\tTWL4030_MODULE_INTBR = 11,\n\tTWL4030_MODULE_TEST = 12,\n\tTWL4030_MODULE_KEYPAD = 13,\n\tTWL4030_MODULE_MADC = 14,\n\tTWL4030_MODULE_INTERRUPTS = 15,\n\tTWL4030_MODULE_PRECHARGE = 16,\n\tTWL4030_MODULE_BACKUP = 17,\n\tTWL4030_MODULE_INT = 18,\n\tTWL5031_MODULE_ACCESSORY = 19,\n\tTWL5031_MODULE_INTERRUPTS = 20,\n\tTWL4030_MODULE_LAST = 21,\n};\n\nenum twl6030_module_ids {\n\tTWL6030_MODULE_ID0 = 9,\n\tTWL6030_MODULE_ID1 = 10,\n\tTWL6030_MODULE_ID2 = 11,\n\tTWL6030_MODULE_GPADC = 12,\n\tTWL6030_MODULE_GASGAUGE = 13,\n\tTWL6032_MODULE_CHARGE = 14,\n\tTWL6030_MODULE_LAST = 15,\n};\n\nenum twl_module_ids {\n\tTWL_MODULE_USB = 0,\n\tTWL_MODULE_PIH = 1,\n\tTWL_MODULE_MAIN_CHARGE = 2,\n\tTWL_MODULE_PM_MASTER = 3,\n\tTWL_MODULE_PM_RECEIVER = 4,\n\tTWL_MODULE_RTC = 5,\n\tTWL_MODULE_PWM = 6,\n\tTWL_MODULE_LED = 7,\n\tTWL_MODULE_SECURED_REG = 8,\n\tTWL_MODULE_LAST = 9,\n};\n\nenum txtime_flags {\n\tSOF_TXTIME_DEADLINE_MODE = 1,\n\tSOF_TXTIME_REPORT_ERRORS = 2,\n\tSOF_TXTIME_FLAGS_LAST = 2,\n\tSOF_TXTIME_FLAGS_MASK = 3,\n};\n\nenum uart_pm_state {\n\tUART_PM_STATE_ON = 0,\n\tUART_PM_STATE_OFF = 3,\n\tUART_PM_STATE_UNDEFINED = 4,\n};\n\nenum uclamp_id {\n\tUCLAMP_MIN = 0,\n\tUCLAMP_MAX = 1,\n\tUCLAMP_CNT = 2,\n};\n\nenum ucode_state {\n\tUCODE_OK = 0,\n\tUCODE_NEW = 1,\n\tUCODE_NEW_SAFE = 2,\n\tUCODE_UPDATED = 3,\n\tUCODE_NFOUND = 4,\n\tUCODE_ERROR = 5,\n\tUCODE_TIMEOUT = 6,\n\tUCODE_OFFLINE = 7,\n};\n\nenum ucount_type {\n\tUCOUNT_USER_NAMESPACES = 0,\n\tUCOUNT_PID_NAMESPACES = 1,\n\tUCOUNT_UTS_NAMESPACES = 2,\n\tUCOUNT_IPC_NAMESPACES = 3,\n\tUCOUNT_NET_NAMESPACES = 4,\n\tUCOUNT_MNT_NAMESPACES = 5,\n\tUCOUNT_CGROUP_NAMESPACES = 6,\n\tUCOUNT_TIME_NAMESPACES = 7,\n\tUCOUNT_INOTIFY_INSTANCES = 8,\n\tUCOUNT_INOTIFY_WATCHES = 9,\n\tUCOUNT_FANOTIFY_GROUPS = 10,\n\tUCOUNT_FANOTIFY_MARKS = 11,\n\tUCOUNT_COUNTS = 12,\n};\n\nenum udp_conntrack {\n\tUDP_CT_UNREPLIED = 0,\n\tUDP_CT_REPLIED = 1,\n\tUDP_CT_MAX = 2,\n};\n\nenum udp_parsable_tunnel_type {\n\tUDP_TUNNEL_TYPE_VXLAN = 1,\n\tUDP_TUNNEL_TYPE_GENEVE = 2,\n\tUDP_TUNNEL_TYPE_VXLAN_GPE = 4,\n};\n\nenum udp_tunnel_nic_info_flags {\n\tUDP_TUNNEL_NIC_INFO_MAY_SLEEP = 1,\n\tUDP_TUNNEL_NIC_INFO_OPEN_ONLY = 2,\n\tUDP_TUNNEL_NIC_INFO_IPV4_ONLY = 4,\n\tUDP_TUNNEL_NIC_INFO_STATIC_IANA_VXLAN = 8,\n};\n\nenum uhci_rh_state {\n\tUHCI_RH_RESET = 0,\n\tUHCI_RH_SUSPENDED = 1,\n\tUHCI_RH_AUTO_STOPPED = 2,\n\tUHCI_RH_RESUMING = 3,\n\tUHCI_RH_SUSPENDING = 4,\n\tUHCI_RH_RUNNING = 5,\n\tUHCI_RH_RUNNING_NODEVS = 6,\n};\n\nenum uinput_state {\n\tUIST_NEW_DEVICE = 0,\n\tUIST_SETUP_COMPLETE = 1,\n\tUIST_CREATED = 2,\n};\n\nenum umh_disable_depth {\n\tUMH_ENABLED = 0,\n\tUMH_FREEZING = 1,\n\tUMH_DISABLED = 2,\n};\n\nenum umount_tree_flags {\n\tUMOUNT_SYNC = 1,\n\tUMOUNT_PROPAGATE = 2,\n\tUMOUNT_CONNECTED = 4,\n};\n\nenum uncore_access_type {\n\tUNCORE_ACCESS_MSR = 0,\n\tUNCORE_ACCESS_MMIO = 1,\n\tUNCORE_ACCESS_PCI = 2,\n\tUNCORE_ACCESS_MAX = 3,\n};\n\nenum unix_vertex_index {\n\tUNIX_VERTEX_INDEX_MARK1 = 0,\n\tUNIX_VERTEX_INDEX_MARK2 = 1,\n\tUNIX_VERTEX_INDEX_START = 2,\n};\n\nenum uprobe_filter_ctx {\n\tUPROBE_FILTER_REGISTER = 0,\n\tUPROBE_FILTER_UNREGISTER = 1,\n\tUPROBE_FILTER_MMAP = 2,\n};\n\nenum uprobe_task_state {\n\tUTASK_RUNNING = 0,\n\tUTASK_SSTEP = 1,\n\tUTASK_SSTEP_ACK = 2,\n\tUTASK_SSTEP_TRAPPED = 3,\n};\n\nenum usb3_link_state {\n\tUSB3_LPM_U0 = 0,\n\tUSB3_LPM_U1 = 1,\n\tUSB3_LPM_U2 = 2,\n\tUSB3_LPM_U3 = 3,\n};\n\nenum usb_charger_state {\n\tUSB_CHARGER_DEFAULT = 0,\n\tUSB_CHARGER_PRESENT = 1,\n\tUSB_CHARGER_ABSENT = 2,\n};\n\nenum usb_charger_type {\n\tUNKNOWN_TYPE = 0,\n\tSDP_TYPE = 1,\n\tDCP_TYPE = 2,\n\tCDP_TYPE = 3,\n\tACA_TYPE = 4,\n};\n\nenum usb_dev_authorize_policy {\n\tUSB_DEVICE_AUTHORIZE_NONE = 0,\n\tUSB_DEVICE_AUTHORIZE_ALL = 1,\n\tUSB_DEVICE_AUTHORIZE_INTERNAL = 2,\n};\n\nenum usb_device_speed {\n\tUSB_SPEED_UNKNOWN = 0,\n\tUSB_SPEED_LOW = 1,\n\tUSB_SPEED_FULL = 2,\n\tUSB_SPEED_HIGH = 3,\n\tUSB_SPEED_WIRELESS = 4,\n\tUSB_SPEED_SUPER = 5,\n\tUSB_SPEED_SUPER_PLUS = 6,\n};\n\nenum usb_device_state {\n\tUSB_STATE_NOTATTACHED = 0,\n\tUSB_STATE_ATTACHED = 1,\n\tUSB_STATE_POWERED = 2,\n\tUSB_STATE_RECONNECTING = 3,\n\tUSB_STATE_UNAUTHENTICATED = 4,\n\tUSB_STATE_DEFAULT = 5,\n\tUSB_STATE_ADDRESS = 6,\n\tUSB_STATE_CONFIGURED = 7,\n\tUSB_STATE_SUSPENDED = 8,\n};\n\nenum usb_dr_mode {\n\tUSB_DR_MODE_UNKNOWN = 0,\n\tUSB_DR_MODE_HOST = 1,\n\tUSB_DR_MODE_PERIPHERAL = 2,\n\tUSB_DR_MODE_OTG = 3,\n};\n\nenum usb_interface_condition {\n\tUSB_INTERFACE_UNBOUND = 0,\n\tUSB_INTERFACE_BINDING = 1,\n\tUSB_INTERFACE_BOUND = 2,\n\tUSB_INTERFACE_UNBINDING = 3,\n};\n\nenum usb_led_event {\n\tUSB_LED_EVENT_HOST = 0,\n\tUSB_LED_EVENT_GADGET = 1,\n};\n\nenum usb_otg_state {\n\tOTG_STATE_UNDEFINED = 0,\n\tOTG_STATE_B_IDLE = 1,\n\tOTG_STATE_B_SRP_INIT = 2,\n\tOTG_STATE_B_PERIPHERAL = 3,\n\tOTG_STATE_B_WAIT_ACON = 4,\n\tOTG_STATE_B_HOST = 5,\n\tOTG_STATE_A_IDLE = 6,\n\tOTG_STATE_A_WAIT_VRISE = 7,\n\tOTG_STATE_A_WAIT_BCON = 8,\n\tOTG_STATE_A_HOST = 9,\n\tOTG_STATE_A_SUSPEND = 10,\n\tOTG_STATE_A_PERIPHERAL = 11,\n\tOTG_STATE_A_WAIT_VFALL = 12,\n\tOTG_STATE_A_VBUS_ERR = 13,\n};\n\nenum usb_phy_events {\n\tUSB_EVENT_NONE = 0,\n\tUSB_EVENT_VBUS = 1,\n\tUSB_EVENT_ID = 2,\n\tUSB_EVENT_CHARGER = 3,\n\tUSB_EVENT_ENUMERATED = 4,\n};\n\nenum usb_phy_type {\n\tUSB_PHY_TYPE_UNDEFINED = 0,\n\tUSB_PHY_TYPE_USB2 = 1,\n\tUSB_PHY_TYPE_USB3 = 2,\n};\n\nenum usb_port_connect_type {\n\tUSB_PORT_CONNECT_TYPE_UNKNOWN = 0,\n\tUSB_PORT_CONNECT_TYPE_HOT_PLUG = 1,\n\tUSB_PORT_CONNECT_TYPE_HARD_WIRED = 2,\n\tUSB_PORT_NOT_USED = 3,\n};\n\nenum usb_role {\n\tUSB_ROLE_NONE = 0,\n\tUSB_ROLE_HOST = 1,\n\tUSB_ROLE_DEVICE = 2,\n};\n\nenum usb_ssp_rate {\n\tUSB_SSP_GEN_UNKNOWN = 0,\n\tUSB_SSP_GEN_2x1 = 1,\n\tUSB_SSP_GEN_1x2 = 2,\n\tUSB_SSP_GEN_2x2 = 3,\n};\n\nenum usb_wireless_status {\n\tUSB_WIRELESS_STATUS_NA = 0,\n\tUSB_WIRELESS_STATUS_DISCONNECTED = 1,\n\tUSB_WIRELESS_STATUS_CONNECTED = 2,\n};\n\nenum user_reg_flag {\n\tUSER_EVENT_REG_PERSIST = 1,\n\tUSER_EVENT_REG_MULTI_FORMAT = 2,\n\tUSER_EVENT_REG_MAX = 4,\n};\n\nenum utf16_endian {\n\tUTF16_HOST_ENDIAN = 0,\n\tUTF16_LITTLE_ENDIAN = 1,\n\tUTF16_BIG_ENDIAN = 2,\n};\n\nenum utf8_normalization {\n\tUTF8_NFDI = 0,\n\tUTF8_NFDICF = 1,\n\tUTF8_NMAX = 2,\n};\n\nenum uts_proc {\n\tUTS_PROC_ARCH = 0,\n\tUTS_PROC_OSTYPE = 1,\n\tUTS_PROC_OSRELEASE = 2,\n\tUTS_PROC_VERSION = 3,\n\tUTS_PROC_HOSTNAME = 4,\n\tUTS_PROC_DOMAINNAME = 5,\n};\n\nenum uv_bios_cmd {\n\tUV_BIOS_COMMON = 0,\n\tUV_BIOS_GET_SN_INFO = 1,\n\tUV_BIOS_FREQ_BASE = 2,\n\tUV_BIOS_WATCHLIST_ALLOC = 3,\n\tUV_BIOS_WATCHLIST_FREE = 4,\n\tUV_BIOS_MEMPROTECT = 5,\n\tUV_BIOS_GET_PARTITION_ADDR = 6,\n\tUV_BIOS_SET_LEGACY_VGA_TARGET = 7,\n};\n\nenum uv_memprotect {\n\tUV_MEMPROT_RESTRICT_ACCESS = 0,\n\tUV_MEMPROT_ALLOW_AMO = 1,\n\tUV_MEMPROT_ALLOW_RW = 2,\n};\n\nenum uv_system_type {\n\tUV_NONE = 0,\n\tUV_LEGACY_APIC = 1,\n\tUV_X2APIC = 2,\n};\n\nenum v4l2_av1_segment_feature {\n\tV4L2_AV1_SEG_LVL_ALT_Q = 0,\n\tV4L2_AV1_SEG_LVL_ALT_LF_Y_V = 1,\n\tV4L2_AV1_SEG_LVL_REF_FRAME = 5,\n\tV4L2_AV1_SEG_LVL_REF_SKIP = 6,\n\tV4L2_AV1_SEG_LVL_REF_GLOBALMV = 7,\n\tV4L2_AV1_SEG_LVL_MAX = 8,\n};\n\nenum v4l2_fwnode_bus_type {\n\tV4L2_FWNODE_BUS_TYPE_GUESS = 0,\n\tV4L2_FWNODE_BUS_TYPE_CSI2_CPHY = 1,\n\tV4L2_FWNODE_BUS_TYPE_CSI1 = 2,\n\tV4L2_FWNODE_BUS_TYPE_CCP2 = 3,\n\tV4L2_FWNODE_BUS_TYPE_CSI2_DPHY = 4,\n\tV4L2_FWNODE_BUS_TYPE_PARALLEL = 5,\n\tV4L2_FWNODE_BUS_TYPE_BT656 = 6,\n\tV4L2_FWNODE_BUS_TYPE_DPI = 7,\n\tNR_OF_V4L2_FWNODE_BUS_TYPE = 8,\n};\n\nenum v4l2_preemphasis {\n\tV4L2_PREEMPHASIS_DISABLED = 0,\n\tV4L2_PREEMPHASIS_50_uS = 1,\n\tV4L2_PREEMPHASIS_75_uS = 2,\n};\n\nenum vc_ctl_state {\n\tESnormal = 0,\n\tESesc = 1,\n\tESsquare = 2,\n\tESgetpars = 3,\n\tESfunckey = 4,\n\tEShash = 5,\n\tESsetG0 = 6,\n\tESsetG1 = 7,\n\tESpercent = 8,\n\tEScsiignore = 9,\n\tESnonstd = 10,\n\tESpalette = 11,\n\tESosc = 12,\n\tESANSI_first = 12,\n\tESapc = 13,\n\tESpm = 14,\n\tESdcs = 15,\n\tESANSI_last = 15,\n};\n\nenum vc_intensity {\n\tVCI_HALF_BRIGHT = 0,\n\tVCI_NORMAL = 1,\n\tVCI_BOLD = 2,\n\tVCI_MASK = 3,\n};\n\nenum vcap_action_field {\n\tVCAP_AF_NO_VALUE = 0,\n\tVCAP_AF_ACL_ID = 1,\n\tVCAP_AF_CLS_VID_SEL = 2,\n\tVCAP_AF_CNT_ID = 3,\n\tVCAP_AF_COPY_PORT_NUM = 4,\n\tVCAP_AF_COPY_QUEUE_NUM = 5,\n\tVCAP_AF_CPU_COPY_ENA = 6,\n\tVCAP_AF_CPU_QU = 7,\n\tVCAP_AF_CPU_QUEUE_NUM = 8,\n\tVCAP_AF_CUSTOM_ACE_TYPE_ENA = 9,\n\tVCAP_AF_DEI_A_VAL = 10,\n\tVCAP_AF_DEI_B_VAL = 11,\n\tVCAP_AF_DEI_C_VAL = 12,\n\tVCAP_AF_DEI_ENA = 13,\n\tVCAP_AF_DEI_VAL = 14,\n\tVCAP_AF_DLR_SEL = 15,\n\tVCAP_AF_DP_ENA = 16,\n\tVCAP_AF_DP_VAL = 17,\n\tVCAP_AF_DSCP_ENA = 18,\n\tVCAP_AF_DSCP_SEL = 19,\n\tVCAP_AF_DSCP_VAL = 20,\n\tVCAP_AF_ES2_REW_CMD = 21,\n\tVCAP_AF_ESDX = 22,\n\tVCAP_AF_FWD_KILL_ENA = 23,\n\tVCAP_AF_FWD_MODE = 24,\n\tVCAP_AF_FWD_SEL = 25,\n\tVCAP_AF_HIT_ME_ONCE = 26,\n\tVCAP_AF_HOST_MATCH = 27,\n\tVCAP_AF_IGNORE_PIPELINE_CTRL = 28,\n\tVCAP_AF_INTR_ENA = 29,\n\tVCAP_AF_ISDX_ADD_REPLACE_SEL = 30,\n\tVCAP_AF_ISDX_ADD_VAL = 31,\n\tVCAP_AF_ISDX_ENA = 32,\n\tVCAP_AF_ISDX_REPLACE_ENA = 33,\n\tVCAP_AF_ISDX_VAL = 34,\n\tVCAP_AF_LOOP_ENA = 35,\n\tVCAP_AF_LRN_DIS = 36,\n\tVCAP_AF_MAP_IDX = 37,\n\tVCAP_AF_MAP_KEY = 38,\n\tVCAP_AF_MAP_LOOKUP_SEL = 39,\n\tVCAP_AF_MASK_MODE = 40,\n\tVCAP_AF_MATCH_ID = 41,\n\tVCAP_AF_MATCH_ID_MASK = 42,\n\tVCAP_AF_MIRROR_ENA = 43,\n\tVCAP_AF_MIRROR_PROBE = 44,\n\tVCAP_AF_MIRROR_PROBE_ID = 45,\n\tVCAP_AF_MRP_SEL = 46,\n\tVCAP_AF_NXT_IDX = 47,\n\tVCAP_AF_NXT_IDX_CTRL = 48,\n\tVCAP_AF_OAM_SEL = 49,\n\tVCAP_AF_PAG_OVERRIDE_MASK = 50,\n\tVCAP_AF_PAG_VAL = 51,\n\tVCAP_AF_PCP_A_VAL = 52,\n\tVCAP_AF_PCP_B_VAL = 53,\n\tVCAP_AF_PCP_C_VAL = 54,\n\tVCAP_AF_PCP_ENA = 55,\n\tVCAP_AF_PCP_VAL = 56,\n\tVCAP_AF_PIPELINE_ACT = 57,\n\tVCAP_AF_PIPELINE_FORCE_ENA = 58,\n\tVCAP_AF_PIPELINE_PT = 59,\n\tVCAP_AF_POLICE_ENA = 60,\n\tVCAP_AF_POLICE_IDX = 61,\n\tVCAP_AF_POLICE_REMARK = 62,\n\tVCAP_AF_POLICE_VCAP_ONLY = 63,\n\tVCAP_AF_POP_VAL = 64,\n\tVCAP_AF_PORT_MASK = 65,\n\tVCAP_AF_PUSH_CUSTOMER_TAG = 66,\n\tVCAP_AF_PUSH_INNER_TAG = 67,\n\tVCAP_AF_PUSH_OUTER_TAG = 68,\n\tVCAP_AF_QOS_ENA = 69,\n\tVCAP_AF_QOS_VAL = 70,\n\tVCAP_AF_REW_OP = 71,\n\tVCAP_AF_RT_DIS = 72,\n\tVCAP_AF_SFID_ENA = 73,\n\tVCAP_AF_SFID_VAL = 74,\n\tVCAP_AF_SGID_ENA = 75,\n\tVCAP_AF_SGID_VAL = 76,\n\tVCAP_AF_SWAP_MACS_ENA = 77,\n\tVCAP_AF_TAG_A_DEI_SEL = 78,\n\tVCAP_AF_TAG_A_PCP_SEL = 79,\n\tVCAP_AF_TAG_A_TPID_SEL = 80,\n\tVCAP_AF_TAG_A_VID_SEL = 81,\n\tVCAP_AF_TAG_B_DEI_SEL = 82,\n\tVCAP_AF_TAG_B_PCP_SEL = 83,\n\tVCAP_AF_TAG_B_TPID_SEL = 84,\n\tVCAP_AF_TAG_B_VID_SEL = 85,\n\tVCAP_AF_TAG_C_DEI_SEL = 86,\n\tVCAP_AF_TAG_C_PCP_SEL = 87,\n\tVCAP_AF_TAG_C_TPID_SEL = 88,\n\tVCAP_AF_TAG_C_VID_SEL = 89,\n\tVCAP_AF_TYPE = 90,\n\tVCAP_AF_UNTAG_VID_ENA = 91,\n\tVCAP_AF_VID_A_VAL = 92,\n\tVCAP_AF_VID_B_VAL = 93,\n\tVCAP_AF_VID_C_VAL = 94,\n\tVCAP_AF_VID_REPLACE_ENA = 95,\n\tVCAP_AF_VID_VAL = 96,\n\tVCAP_AF_VLAN_POP_CNT = 97,\n\tVCAP_AF_VLAN_POP_CNT_ENA = 98,\n};\n\nenum vcap_actionfield_set {\n\tVCAP_AFS_NO_VALUE = 0,\n\tVCAP_AFS_BASE_TYPE = 1,\n\tVCAP_AFS_CLASSIFICATION = 2,\n\tVCAP_AFS_CLASS_REDUCED = 3,\n\tVCAP_AFS_ES0 = 4,\n\tVCAP_AFS_FULL = 5,\n\tVCAP_AFS_S1 = 6,\n\tVCAP_AFS_SMAC_SIP = 7,\n\tVCAP_AFS_VID = 8,\n};\n\nenum vcap_arp_opcode {\n\tVCAP_ARP_OP_RESERVED = 0,\n\tVCAP_ARP_OP_REQUEST = 1,\n\tVCAP_ARP_OP_REPLY = 2,\n};\n\nenum vcap_bit {\n\tVCAP_BIT_ANY = 0,\n\tVCAP_BIT_0 = 1,\n\tVCAP_BIT_1 = 2,\n};\n\nenum vcap_command {\n\tVCAP_CMD_WRITE = 0,\n\tVCAP_CMD_READ = 1,\n\tVCAP_CMD_MOVE_DOWN = 2,\n\tVCAP_CMD_MOVE_UP = 3,\n\tVCAP_CMD_INITIALIZE = 4,\n};\n\nenum vcap_field_type {\n\tVCAP_FIELD_BIT = 0,\n\tVCAP_FIELD_U32 = 1,\n\tVCAP_FIELD_U48 = 2,\n\tVCAP_FIELD_U56 = 3,\n\tVCAP_FIELD_U64 = 4,\n\tVCAP_FIELD_U72 = 5,\n\tVCAP_FIELD_U112 = 6,\n\tVCAP_FIELD_U128 = 7,\n};\n\nenum vcap_is2_arp_opcode {\n\tVCAP_IS2_ARP_REQUEST = 0,\n\tVCAP_IS2_ARP_REPLY = 1,\n\tVCAP_IS2_RARP_REQUEST = 2,\n\tVCAP_IS2_RARP_REPLY = 3,\n};\n\nenum vcap_key_field {\n\tVCAP_KF_NO_VALUE = 0,\n\tVCAP_KF_8021BR_ECID_BASE = 1,\n\tVCAP_KF_8021BR_ECID_EXT = 2,\n\tVCAP_KF_8021BR_E_TAGGED = 3,\n\tVCAP_KF_8021BR_GRP = 4,\n\tVCAP_KF_8021BR_IGR_ECID_BASE = 5,\n\tVCAP_KF_8021BR_IGR_ECID_EXT = 6,\n\tVCAP_KF_8021CB_R_TAGGED_IS = 7,\n\tVCAP_KF_8021Q_DEI0 = 8,\n\tVCAP_KF_8021Q_DEI1 = 9,\n\tVCAP_KF_8021Q_DEI2 = 10,\n\tVCAP_KF_8021Q_DEI_CLS = 11,\n\tVCAP_KF_8021Q_PCP0 = 12,\n\tVCAP_KF_8021Q_PCP1 = 13,\n\tVCAP_KF_8021Q_PCP2 = 14,\n\tVCAP_KF_8021Q_PCP_CLS = 15,\n\tVCAP_KF_8021Q_TPID = 16,\n\tVCAP_KF_8021Q_TPID0 = 17,\n\tVCAP_KF_8021Q_TPID1 = 18,\n\tVCAP_KF_8021Q_TPID2 = 19,\n\tVCAP_KF_8021Q_VID0 = 20,\n\tVCAP_KF_8021Q_VID1 = 21,\n\tVCAP_KF_8021Q_VID2 = 22,\n\tVCAP_KF_8021Q_VID_CLS = 23,\n\tVCAP_KF_8021Q_VLAN_DBL_TAGGED_IS = 24,\n\tVCAP_KF_8021Q_VLAN_TAGGED_IS = 25,\n\tVCAP_KF_8021Q_VLAN_TAGS = 26,\n\tVCAP_KF_ACL_GRP_ID = 27,\n\tVCAP_KF_ARP_ADDR_SPACE_OK_IS = 28,\n\tVCAP_KF_ARP_LEN_OK_IS = 29,\n\tVCAP_KF_ARP_OPCODE = 30,\n\tVCAP_KF_ARP_OPCODE_UNKNOWN_IS = 31,\n\tVCAP_KF_ARP_PROTO_SPACE_OK_IS = 32,\n\tVCAP_KF_ARP_SENDER_MATCH_IS = 33,\n\tVCAP_KF_ARP_TGT_MATCH_IS = 34,\n\tVCAP_KF_COSID_CLS = 35,\n\tVCAP_KF_ES0_ISDX_KEY_ENA = 36,\n\tVCAP_KF_ETYPE = 37,\n\tVCAP_KF_ETYPE_LEN_IS = 38,\n\tVCAP_KF_HOST_MATCH = 39,\n\tVCAP_KF_IF_EGR_PORT_MASK = 40,\n\tVCAP_KF_IF_EGR_PORT_MASK_RNG = 41,\n\tVCAP_KF_IF_EGR_PORT_NO = 42,\n\tVCAP_KF_IF_IGR_PORT = 43,\n\tVCAP_KF_IF_IGR_PORT_MASK = 44,\n\tVCAP_KF_IF_IGR_PORT_MASK_L3 = 45,\n\tVCAP_KF_IF_IGR_PORT_MASK_RNG = 46,\n\tVCAP_KF_IF_IGR_PORT_MASK_SEL = 47,\n\tVCAP_KF_IF_IGR_PORT_SEL = 48,\n\tVCAP_KF_IP4_IS = 49,\n\tVCAP_KF_IP_MC_IS = 50,\n\tVCAP_KF_IP_PAYLOAD_5TUPLE = 51,\n\tVCAP_KF_IP_PAYLOAD_S1_IP6 = 52,\n\tVCAP_KF_IP_SNAP_IS = 53,\n\tVCAP_KF_ISDX_CLS = 54,\n\tVCAP_KF_ISDX_GT0_IS = 55,\n\tVCAP_KF_L2_BC_IS = 56,\n\tVCAP_KF_L2_DMAC = 57,\n\tVCAP_KF_L2_FRM_TYPE = 58,\n\tVCAP_KF_L2_FWD_IS = 59,\n\tVCAP_KF_L2_LLC = 60,\n\tVCAP_KF_L2_MAC = 61,\n\tVCAP_KF_L2_MC_IS = 62,\n\tVCAP_KF_L2_PAYLOAD0 = 63,\n\tVCAP_KF_L2_PAYLOAD1 = 64,\n\tVCAP_KF_L2_PAYLOAD2 = 65,\n\tVCAP_KF_L2_PAYLOAD_ETYPE = 66,\n\tVCAP_KF_L2_SMAC = 67,\n\tVCAP_KF_L2_SNAP = 68,\n\tVCAP_KF_L3_DIP_EQ_SIP_IS = 69,\n\tVCAP_KF_L3_DPL_CLS = 70,\n\tVCAP_KF_L3_DSCP = 71,\n\tVCAP_KF_L3_DST_IS = 72,\n\tVCAP_KF_L3_FRAGMENT = 73,\n\tVCAP_KF_L3_FRAGMENT_TYPE = 74,\n\tVCAP_KF_L3_FRAG_INVLD_L4_LEN = 75,\n\tVCAP_KF_L3_FRAG_OFS_GT0 = 76,\n\tVCAP_KF_L3_IP4_DIP = 77,\n\tVCAP_KF_L3_IP4_SIP = 78,\n\tVCAP_KF_L3_IP6_DIP = 79,\n\tVCAP_KF_L3_IP6_DIP_MSB = 80,\n\tVCAP_KF_L3_IP6_SIP = 81,\n\tVCAP_KF_L3_IP6_SIP_MSB = 82,\n\tVCAP_KF_L3_IP_PROTO = 83,\n\tVCAP_KF_L3_OPTIONS_IS = 84,\n\tVCAP_KF_L3_PAYLOAD = 85,\n\tVCAP_KF_L3_RT_IS = 86,\n\tVCAP_KF_L3_TOS = 87,\n\tVCAP_KF_L3_TTL_GT0 = 88,\n\tVCAP_KF_L4_1588_DOM = 89,\n\tVCAP_KF_L4_1588_VER = 90,\n\tVCAP_KF_L4_ACK = 91,\n\tVCAP_KF_L4_DPORT = 92,\n\tVCAP_KF_L4_FIN = 93,\n\tVCAP_KF_L4_PAYLOAD = 94,\n\tVCAP_KF_L4_PSH = 95,\n\tVCAP_KF_L4_RNG = 96,\n\tVCAP_KF_L4_RST = 97,\n\tVCAP_KF_L4_SEQUENCE_EQ0_IS = 98,\n\tVCAP_KF_L4_SPORT = 99,\n\tVCAP_KF_L4_SPORT_EQ_DPORT_IS = 100,\n\tVCAP_KF_L4_SYN = 101,\n\tVCAP_KF_L4_URG = 102,\n\tVCAP_KF_LOOKUP_FIRST_IS = 103,\n\tVCAP_KF_LOOKUP_GEN_IDX = 104,\n\tVCAP_KF_LOOKUP_GEN_IDX_SEL = 105,\n\tVCAP_KF_LOOKUP_INDEX = 106,\n\tVCAP_KF_LOOKUP_PAG = 107,\n\tVCAP_KF_MIRROR_PROBE = 108,\n\tVCAP_KF_OAM_CCM_CNTS_EQ0 = 109,\n\tVCAP_KF_OAM_DETECTED = 110,\n\tVCAP_KF_OAM_FLAGS = 111,\n\tVCAP_KF_OAM_MEL_FLAGS = 112,\n\tVCAP_KF_OAM_MEPID = 113,\n\tVCAP_KF_OAM_OPCODE = 114,\n\tVCAP_KF_OAM_VER = 115,\n\tVCAP_KF_OAM_Y1731_IS = 116,\n\tVCAP_KF_PDU_TYPE = 117,\n\tVCAP_KF_PROT_ACTIVE = 118,\n\tVCAP_KF_RTP_ID = 119,\n\tVCAP_KF_RT_FRMID = 120,\n\tVCAP_KF_RT_TYPE = 121,\n\tVCAP_KF_RT_VLAN_IDX = 122,\n\tVCAP_KF_TCP_IS = 123,\n\tVCAP_KF_TCP_UDP_IS = 124,\n\tVCAP_KF_TYPE = 125,\n};\n\nenum vcap_keyfield_set {\n\tVCAP_KFS_NO_VALUE = 0,\n\tVCAP_KFS_5TUPLE_IP4 = 1,\n\tVCAP_KFS_5TUPLE_IP6 = 2,\n\tVCAP_KFS_7TUPLE = 3,\n\tVCAP_KFS_ARP = 4,\n\tVCAP_KFS_DBL_VID = 5,\n\tVCAP_KFS_DMAC_VID = 6,\n\tVCAP_KFS_ETAG = 7,\n\tVCAP_KFS_IP4_OTHER = 8,\n\tVCAP_KFS_IP4_TCP_UDP = 9,\n\tVCAP_KFS_IP4_VID = 10,\n\tVCAP_KFS_IP6_OTHER = 11,\n\tVCAP_KFS_IP6_STD = 12,\n\tVCAP_KFS_IP6_TCP_UDP = 13,\n\tVCAP_KFS_IP6_VID = 14,\n\tVCAP_KFS_IP_7TUPLE = 15,\n\tVCAP_KFS_ISDX = 16,\n\tVCAP_KFS_LL_FULL = 17,\n\tVCAP_KFS_MAC_ETYPE = 18,\n\tVCAP_KFS_MAC_LLC = 19,\n\tVCAP_KFS_MAC_SNAP = 20,\n\tVCAP_KFS_NORMAL = 21,\n\tVCAP_KFS_NORMAL_5TUPLE_IP4 = 22,\n\tVCAP_KFS_NORMAL_7TUPLE = 23,\n\tVCAP_KFS_NORMAL_IP6 = 24,\n\tVCAP_KFS_OAM = 25,\n\tVCAP_KFS_PURE_5TUPLE_IP4 = 26,\n\tVCAP_KFS_RT = 27,\n\tVCAP_KFS_SMAC_SIP4 = 28,\n\tVCAP_KFS_SMAC_SIP6 = 29,\n\tVCAP_KFS_VID = 30,\n};\n\nenum vcap_rule_error {\n\tVCAP_ERR_NONE = 0,\n\tVCAP_ERR_NO_ADMIN = 1,\n\tVCAP_ERR_NO_NETDEV = 2,\n\tVCAP_ERR_NO_KEYSET_MATCH = 3,\n\tVCAP_ERR_NO_ACTIONSET_MATCH = 4,\n\tVCAP_ERR_NO_PORT_KEYSET_MATCH = 5,\n};\n\nenum vcap_rule_state {\n\tVCAP_RS_PERMANENT = 0,\n\tVCAP_RS_ENABLED = 1,\n\tVCAP_RS_DISABLED = 2,\n};\n\nenum vcap_selection {\n\tVCAP_SEL_ENTRY = 1,\n\tVCAP_SEL_ACTION = 2,\n\tVCAP_SEL_COUNTER = 4,\n\tVCAP_SEL_ALL = 255,\n};\n\nenum vcap_type {\n\tVCAP_TYPE_ES0 = 0,\n\tVCAP_TYPE_ES2 = 1,\n\tVCAP_TYPE_IS0 = 2,\n\tVCAP_TYPE_IS1 = 3,\n\tVCAP_TYPE_IS2 = 4,\n\tVCAP_TYPE_MAX = 5,\n};\n\nenum vcap_user {\n\tVCAP_USER_PTP = 0,\n\tVCAP_USER_MRP = 1,\n\tVCAP_USER_CFM = 2,\n\tVCAP_USER_VLAN = 3,\n\tVCAP_USER_QOS = 4,\n\tVCAP_USER_VCAP_UTIL = 5,\n\tVCAP_USER_TC = 6,\n\tVCAP_USER_TC_EXTRA = 7,\n\t__VCAP_USER_AFTER_LAST = 8,\n\tVCAP_USER_MAX = 7,\n};\n\nenum vcpu_state {\n\tvcpu_running = 0,\n\tvcpu_halted = 1,\n\tvcpu_hashed = 2,\n};\n\nenum vdso_clock_mode {\n\tVDSO_CLOCKMODE_NONE = 0,\n\tVDSO_CLOCKMODE_TSC = 1,\n\tVDSO_CLOCKMODE_PVCLOCK = 2,\n\tVDSO_CLOCKMODE_HVCLOCK = 3,\n\tVDSO_CLOCKMODE_MAX = 4,\n\tVDSO_CLOCKMODE_TIMENS = 2147483647,\n};\n\nenum verifier_phase {\n\tCHECK_META = 0,\n\tCHECK_TYPE = 1,\n};\n\nenum vesa_blank_mode {\n\tVESA_NO_BLANKING = 0,\n\tVESA_VSYNC_SUSPEND = 1,\n\tVESA_HSYNC_SUSPEND = 2,\n\tVESA_POWERDOWN = 3,\n\tVESA_BLANK_MAX = 3,\n};\n\nenum vga_switcheroo_client_id {\n\tVGA_SWITCHEROO_UNKNOWN_ID = 4096,\n\tVGA_SWITCHEROO_IGD = 0,\n\tVGA_SWITCHEROO_DIS = 1,\n\tVGA_SWITCHEROO_MAX_CLIENTS = 2,\n};\n\nenum vga_switcheroo_handler_flags_t {\n\tVGA_SWITCHEROO_CAN_SWITCH_DDC = 1,\n\tVGA_SWITCHEROO_NEEDS_EDP_CONFIG = 2,\n};\n\nenum vga_switcheroo_state {\n\tVGA_SWITCHEROO_OFF = 0,\n\tVGA_SWITCHEROO_ON = 1,\n\tVGA_SWITCHEROO_NOT_FOUND = 2,\n};\n\nenum vhost_task_flags {\n\tVHOST_TASK_FLAGS_STOP = 0,\n\tVHOST_TASK_FLAGS_KILLED = 1,\n};\n\nenum virtio_balloon_config_read {\n\tVIRTIO_BALLOON_CONFIG_READ_CMD_ID = 0,\n};\n\nenum virtio_balloon_vq {\n\tVIRTIO_BALLOON_VQ_INFLATE = 0,\n\tVIRTIO_BALLOON_VQ_DEFLATE = 1,\n\tVIRTIO_BALLOON_VQ_STATS = 2,\n\tVIRTIO_BALLOON_VQ_FREE_PAGE = 3,\n\tVIRTIO_BALLOON_VQ_REPORTING = 4,\n\tVIRTIO_BALLOON_VQ_MAX = 5,\n};\n\nenum visit_state {\n\tNOT_VISITED = 0,\n\tVISITED = 1,\n\tRESOLVED = 2,\n};\n\nenum vlan_flags {\n\tVLAN_FLAG_REORDER_HDR = 1,\n\tVLAN_FLAG_GVRP = 2,\n\tVLAN_FLAG_LOOSE_BINDING = 4,\n\tVLAN_FLAG_MVRP = 8,\n\tVLAN_FLAG_BRIDGE_BINDING = 16,\n};\n\nenum vlan_protos {\n\tVLAN_PROTO_8021Q = 0,\n\tVLAN_PROTO_8021AD = 1,\n\tVLAN_PROTO_NUM = 2,\n};\n\nenum vm_event_item {\n\tPGPGIN = 0,\n\tPGPGOUT = 1,\n\tPSWPIN = 2,\n\tPSWPOUT = 3,\n\tPGALLOC_DMA = 4,\n\tPGALLOC_DMA32 = 5,\n\tPGALLOC_NORMAL = 6,\n\tPGALLOC_MOVABLE = 7,\n\tPGALLOC_DEVICE = 8,\n\tALLOCSTALL_DMA = 9,\n\tALLOCSTALL_DMA32 = 10,\n\tALLOCSTALL_NORMAL = 11,\n\tALLOCSTALL_MOVABLE = 12,\n\tALLOCSTALL_DEVICE = 13,\n\tPGSCAN_SKIP_DMA = 14,\n\tPGSCAN_SKIP_DMA32 = 15,\n\tPGSCAN_SKIP_NORMAL = 16,\n\tPGSCAN_SKIP_MOVABLE = 17,\n\tPGSCAN_SKIP_DEVICE = 18,\n\tPGFREE = 19,\n\tPGACTIVATE = 20,\n\tPGDEACTIVATE = 21,\n\tPGLAZYFREE = 22,\n\tPGFAULT = 23,\n\tPGMAJFAULT = 24,\n\tPGLAZYFREED = 25,\n\tPGREFILL = 26,\n\tPGREUSE = 27,\n\tPGSTEAL_KSWAPD = 28,\n\tPGSTEAL_DIRECT = 29,\n\tPGSTEAL_KHUGEPAGED = 30,\n\tPGSCAN_KSWAPD = 31,\n\tPGSCAN_DIRECT = 32,\n\tPGSCAN_KHUGEPAGED = 33,\n\tPGSCAN_DIRECT_THROTTLE = 34,\n\tPGSCAN_ANON = 35,\n\tPGSCAN_FILE = 36,\n\tPGSTEAL_ANON = 37,\n\tPGSTEAL_FILE = 38,\n\tPGSCAN_ZONE_RECLAIM_FAILED = 39,\n\tPGINODESTEAL = 40,\n\tSLABS_SCANNED = 41,\n\tKSWAPD_INODESTEAL = 42,\n\tKSWAPD_LOW_WMARK_HIT_QUICKLY = 43,\n\tKSWAPD_HIGH_WMARK_HIT_QUICKLY = 44,\n\tPAGEOUTRUN = 45,\n\tPGROTATED = 46,\n\tDROP_PAGECACHE = 47,\n\tDROP_SLAB = 48,\n\tOOM_KILL = 49,\n\tNUMA_PTE_UPDATES = 50,\n\tNUMA_HUGE_PTE_UPDATES = 51,\n\tNUMA_HINT_FAULTS = 52,\n\tNUMA_HINT_FAULTS_LOCAL = 53,\n\tNUMA_PAGE_MIGRATE = 54,\n\tPGMIGRATE_SUCCESS = 55,\n\tPGMIGRATE_FAIL = 56,\n\tTHP_MIGRATION_SUCCESS = 57,\n\tTHP_MIGRATION_FAIL = 58,\n\tTHP_MIGRATION_SPLIT = 59,\n\tCOMPACTMIGRATE_SCANNED = 60,\n\tCOMPACTFREE_SCANNED = 61,\n\tCOMPACTISOLATED = 62,\n\tCOMPACTSTALL = 63,\n\tCOMPACTFAIL = 64,\n\tCOMPACTSUCCESS = 65,\n\tKCOMPACTD_WAKE = 66,\n\tKCOMPACTD_MIGRATE_SCANNED = 67,\n\tKCOMPACTD_FREE_SCANNED = 68,\n\tHTLB_BUDDY_PGALLOC = 69,\n\tHTLB_BUDDY_PGALLOC_FAIL = 70,\n\tUNEVICTABLE_PGCULLED = 71,\n\tUNEVICTABLE_PGSCANNED = 72,\n\tUNEVICTABLE_PGRESCUED = 73,\n\tUNEVICTABLE_PGMLOCKED = 74,\n\tUNEVICTABLE_PGMUNLOCKED = 75,\n\tUNEVICTABLE_PGCLEARED = 76,\n\tUNEVICTABLE_PGSTRANDED = 77,\n\tTHP_FAULT_ALLOC = 78,\n\tTHP_FAULT_FALLBACK = 79,\n\tTHP_FAULT_FALLBACK_CHARGE = 80,\n\tTHP_COLLAPSE_ALLOC = 81,\n\tTHP_COLLAPSE_ALLOC_FAILED = 82,\n\tTHP_FILE_ALLOC = 83,\n\tTHP_FILE_FALLBACK = 84,\n\tTHP_FILE_FALLBACK_CHARGE = 85,\n\tTHP_FILE_MAPPED = 86,\n\tTHP_SPLIT_PAGE = 87,\n\tTHP_SPLIT_PAGE_FAILED = 88,\n\tTHP_DEFERRED_SPLIT_PAGE = 89,\n\tTHP_SPLIT_PMD = 90,\n\tTHP_SCAN_EXCEED_NONE_PTE = 91,\n\tTHP_SCAN_EXCEED_SWAP_PTE = 92,\n\tTHP_SCAN_EXCEED_SHARED_PTE = 93,\n\tTHP_SPLIT_PUD = 94,\n\tTHP_ZERO_PAGE_ALLOC = 95,\n\tTHP_ZERO_PAGE_ALLOC_FAILED = 96,\n\tTHP_SWPOUT = 97,\n\tTHP_SWPOUT_FALLBACK = 98,\n\tBALLOON_INFLATE = 99,\n\tBALLOON_DEFLATE = 100,\n\tBALLOON_MIGRATE = 101,\n\tSWAP_RA = 102,\n\tSWAP_RA_HIT = 103,\n\tKSM_SWPIN_COPY = 104,\n\tCOW_KSM = 105,\n\tZSWPIN = 106,\n\tZSWPOUT = 107,\n\tZSWPWB = 108,\n\tDIRECT_MAP_LEVEL2_SPLIT = 109,\n\tDIRECT_MAP_LEVEL3_SPLIT = 110,\n\tNR_VM_EVENT_ITEMS = 111,\n};\n\nenum vm_fault_reason {\n\tVM_FAULT_OOM = 1,\n\tVM_FAULT_SIGBUS = 2,\n\tVM_FAULT_MAJOR = 4,\n\tVM_FAULT_HWPOISON = 16,\n\tVM_FAULT_HWPOISON_LARGE = 32,\n\tVM_FAULT_SIGSEGV = 64,\n\tVM_FAULT_NOPAGE = 256,\n\tVM_FAULT_LOCKED = 512,\n\tVM_FAULT_RETRY = 1024,\n\tVM_FAULT_FALLBACK = 2048,\n\tVM_FAULT_DONE_COW = 4096,\n\tVM_FAULT_NEEDDSYNC = 8192,\n\tVM_FAULT_COMPLETED = 16384,\n\tVM_FAULT_HINDEX_MASK = 983040,\n};\n\nenum vm_stat_item {\n\tNR_DIRTY_THRESHOLD = 0,\n\tNR_DIRTY_BG_THRESHOLD = 1,\n\tNR_MEMMAP_PAGES = 2,\n\tNR_MEMMAP_BOOT_PAGES = 3,\n\tNR_VM_STAT_ITEMS = 4,\n};\n\nenum vma_resv_mode {\n\tVMA_NEEDS_RESV = 0,\n\tVMA_COMMIT_RESV = 1,\n\tVMA_END_RESV = 2,\n\tVMA_ADD_RESV = 3,\n\tVMA_DEL_RESV = 4,\n};\n\nenum vme_resource_type {\n\tVME_MASTER = 0,\n\tVME_SLAVE = 1,\n\tVME_DMA = 2,\n\tVME_LM = 3,\n};\n\nenum vmpressure_levels {\n\tVMPRESSURE_LOW = 0,\n\tVMPRESSURE_MEDIUM = 1,\n\tVMPRESSURE_CRITICAL = 2,\n\tVMPRESSURE_NUM_LEVELS = 3,\n};\n\nenum vmpressure_modes {\n\tVMPRESSURE_NO_PASSTHROUGH = 0,\n\tVMPRESSURE_HIERARCHY = 1,\n\tVMPRESSURE_LOCAL = 2,\n\tVMPRESSURE_NUM_MODES = 3,\n};\n\nenum vmscan_throttle_state {\n\tVMSCAN_THROTTLE_WRITEBACK = 0,\n\tVMSCAN_THROTTLE_ISOLATED = 1,\n\tVMSCAN_THROTTLE_NOPROGRESS = 2,\n\tVMSCAN_THROTTLE_CONGESTED = 3,\n\tNR_VMSCAN_THROTTLE = 4,\n};\n\nenum vmx_feature_leafs {\n\tMISC_FEATURES = 0,\n\tPRIMARY_CTLS = 1,\n\tSECONDARY_CTLS = 2,\n\tTERTIARY_CTLS_LOW = 3,\n\tTERTIARY_CTLS_HIGH = 4,\n\tNR_VMX_FEATURE_WORDS = 5,\n};\n\nenum vmx_l1d_flush_state {\n\tVMENTER_L1D_FLUSH_AUTO = 0,\n\tVMENTER_L1D_FLUSH_NEVER = 1,\n\tVMENTER_L1D_FLUSH_COND = 2,\n\tVMENTER_L1D_FLUSH_ALWAYS = 3,\n\tVMENTER_L1D_FLUSH_EPT_DISABLED = 4,\n\tVMENTER_L1D_FLUSH_NOT_REQUIRED = 5,\n};\n\nenum vp_vq_vector_policy {\n\tVP_VQ_VECTOR_POLICY_EACH = 0,\n\tVP_VQ_VECTOR_POLICY_SHARED_SLOW = 1,\n\tVP_VQ_VECTOR_POLICY_SHARED = 2,\n};\n\nenum vtime_state {\n\tVTIME_INACTIVE = 0,\n\tVTIME_IDLE = 1,\n\tVTIME_SYS = 2,\n\tVTIME_USER = 3,\n\tVTIME_GUEST = 4,\n};\n\nenum watch_meta_notification_subtype {\n\tWATCH_META_REMOVAL_NOTIFICATION = 0,\n\tWATCH_META_LOSS_NOTIFICATION = 1,\n};\n\nenum watch_notification_type {\n\tWATCH_TYPE_META = 0,\n\tWATCH_TYPE_KEY_NOTIFY = 1,\n\tWATCH_TYPE__NR = 2,\n};\n\nenum wb_reason {\n\tWB_REASON_BACKGROUND = 0,\n\tWB_REASON_VMSCAN = 1,\n\tWB_REASON_SYNC = 2,\n\tWB_REASON_PERIODIC = 3,\n\tWB_REASON_LAPTOP_TIMER = 4,\n\tWB_REASON_FS_FREE_SPACE = 5,\n\tWB_REASON_FORKER_THREAD = 6,\n\tWB_REASON_FOREIGN_FLUSH = 7,\n\tWB_REASON_MAX = 8,\n};\n\nenum wb_stat_item {\n\tWB_RECLAIMABLE = 0,\n\tWB_WRITEBACK = 1,\n\tWB_DIRTIED = 2,\n\tWB_WRITTEN = 3,\n\tNR_WB_STAT_ITEMS = 4,\n};\n\nenum wb_state {\n\tWB_registered = 0,\n\tWB_writeback_running = 1,\n\tWB_has_dirty_io = 2,\n\tWB_start_all = 3,\n};\n\nenum wbrf_notifier_actions {\n\tWBRF_CHANGED = 0,\n};\n\nenum wbt_flags {\n\tWBT_TRACKED = 1,\n\tWBT_READ = 2,\n\tWBT_SWAP = 4,\n\tWBT_DISCARD = 8,\n\tWBT_NR_BITS = 4,\n};\n\nenum wd_read_status {\n\tWD_READ_SUCCESS = 0,\n\tWD_READ_UNSTABLE = 1,\n\tWD_READ_SKIP = 2,\n};\n\nenum which_selector {\n\tFS = 0,\n\tGS = 1,\n};\n\nenum wiphy_flags {\n\tWIPHY_FLAG_SUPPORTS_EXT_KEK_KCK = 1,\n\tWIPHY_FLAG_SUPPORTS_MLO = 2,\n\tWIPHY_FLAG_SPLIT_SCAN_6GHZ = 4,\n\tWIPHY_FLAG_NETNS_OK = 8,\n\tWIPHY_FLAG_PS_ON_BY_DEFAULT = 16,\n\tWIPHY_FLAG_4ADDR_AP = 32,\n\tWIPHY_FLAG_4ADDR_STATION = 64,\n\tWIPHY_FLAG_CONTROL_PORT_PROTOCOL = 128,\n\tWIPHY_FLAG_IBSS_RSN = 256,\n\tWIPHY_FLAG_DISABLE_WEXT = 512,\n\tWIPHY_FLAG_MESH_AUTH = 1024,\n\tWIPHY_FLAG_SUPPORTS_EXT_KCK_32 = 2048,\n\tWIPHY_FLAG_SUPPORTS_NSTR_NONPRIMARY = 4096,\n\tWIPHY_FLAG_SUPPORTS_FW_ROAM = 8192,\n\tWIPHY_FLAG_AP_UAPSD = 16384,\n\tWIPHY_FLAG_SUPPORTS_TDLS = 32768,\n\tWIPHY_FLAG_TDLS_EXTERNAL_SETUP = 65536,\n\tWIPHY_FLAG_HAVE_AP_SME = 131072,\n\tWIPHY_FLAG_REPORTS_OBSS = 262144,\n\tWIPHY_FLAG_AP_PROBE_RESP_OFFLOAD = 524288,\n\tWIPHY_FLAG_OFFCHAN_TX = 1048576,\n\tWIPHY_FLAG_HAS_REMAIN_ON_CHANNEL = 2097152,\n\tWIPHY_FLAG_SUPPORTS_5_10_MHZ = 4194304,\n\tWIPHY_FLAG_HAS_CHANNEL_SWITCH = 8388608,\n\tWIPHY_FLAG_NOTIFY_REGDOM_BY_DRIVER = 16777216,\n\tWIPHY_FLAG_CHANNEL_CHANGE_ON_BEACON = 33554432,\n};\n\nenum wm831x_auxadc {\n\tWM831X_AUX_CAL = 15,\n\tWM831X_AUX_BKUP_BATT = 10,\n\tWM831X_AUX_WALL = 9,\n\tWM831X_AUX_BATT = 8,\n\tWM831X_AUX_USB = 7,\n\tWM831X_AUX_SYSVDD = 6,\n\tWM831X_AUX_BATT_TEMP = 5,\n\tWM831X_AUX_CHIP_TEMP = 4,\n\tWM831X_AUX_AUX4 = 3,\n\tWM831X_AUX_AUX3 = 2,\n\tWM831X_AUX_AUX2 = 1,\n\tWM831X_AUX_AUX1 = 0,\n};\n\nenum wm831x_parent {\n\tWM8310 = 33552,\n\tWM8311 = 33553,\n\tWM8312 = 33554,\n\tWM8320 = 33568,\n\tWM8321 = 33569,\n\tWM8325 = 33573,\n\tWM8326 = 33574,\n};\n\nenum wm831x_status_src {\n\tWM831X_STATUS_PRESERVE = 0,\n\tWM831X_STATUS_OTP = 1,\n\tWM831X_STATUS_POWER = 2,\n\tWM831X_STATUS_CHARGER = 3,\n\tWM831X_STATUS_MANUAL = 4,\n};\n\nenum wm831x_watchdog_action {\n\tWM831X_WDOG_NONE = 0,\n\tWM831X_WDOG_INTERRUPT = 1,\n\tWM831X_WDOG_RESET = 2,\n\tWM831X_WDOG_WAKE = 3,\n};\n\nenum work_bits {\n\tWORK_STRUCT_PENDING_BIT = 0,\n\tWORK_STRUCT_INACTIVE_BIT = 1,\n\tWORK_STRUCT_PWQ_BIT = 2,\n\tWORK_STRUCT_LINKED_BIT = 3,\n\tWORK_STRUCT_FLAG_BITS = 4,\n\tWORK_STRUCT_COLOR_SHIFT = 4,\n\tWORK_STRUCT_COLOR_BITS = 4,\n\tWORK_STRUCT_PWQ_SHIFT = 8,\n\tWORK_OFFQ_FLAG_SHIFT = 4,\n\tWORK_OFFQ_BH_BIT = 4,\n\tWORK_OFFQ_FLAG_END = 5,\n\tWORK_OFFQ_FLAG_BITS = 1,\n\tWORK_OFFQ_DISABLE_SHIFT = 5,\n\tWORK_OFFQ_DISABLE_BITS = 16,\n\tWORK_OFFQ_POOL_SHIFT = 21,\n\tWORK_OFFQ_LEFT = 43,\n\tWORK_OFFQ_POOL_BITS = 31,\n};\n\nenum work_cancel_flags {\n\tWORK_CANCEL_DELAYED = 1,\n\tWORK_CANCEL_DISABLE = 2,\n};\n\nenum work_flags {\n\tWORK_STRUCT_PENDING = 1,\n\tWORK_STRUCT_INACTIVE = 2,\n\tWORK_STRUCT_PWQ = 4,\n\tWORK_STRUCT_LINKED = 8,\n\tWORK_STRUCT_STATIC = 0,\n};\n\nenum worker_flags {\n\tWORKER_DIE = 2,\n\tWORKER_IDLE = 4,\n\tWORKER_PREP = 8,\n\tWORKER_CPU_INTENSIVE = 64,\n\tWORKER_UNBOUND = 128,\n\tWORKER_REBOUND = 256,\n\tWORKER_NOT_RUNNING = 456,\n};\n\nenum worker_pool_flags {\n\tPOOL_BH = 1,\n\tPOOL_MANAGER_ACTIVE = 2,\n\tPOOL_DISASSOCIATED = 4,\n\tPOOL_BH_DRAINING = 8,\n};\n\nenum wq_affn_scope {\n\tWQ_AFFN_DFL = 0,\n\tWQ_AFFN_CPU = 1,\n\tWQ_AFFN_SMT = 2,\n\tWQ_AFFN_CACHE = 3,\n\tWQ_AFFN_NUMA = 4,\n\tWQ_AFFN_SYSTEM = 5,\n\tWQ_AFFN_NR_TYPES = 6,\n};\n\nenum wq_consts {\n\tWQ_MAX_ACTIVE = 512,\n\tWQ_UNBOUND_MAX_ACTIVE = 512,\n\tWQ_DFL_ACTIVE = 256,\n\tWQ_DFL_MIN_ACTIVE = 8,\n};\n\nenum wq_flags {\n\tWQ_BH = 1,\n\tWQ_UNBOUND = 2,\n\tWQ_FREEZABLE = 4,\n\tWQ_MEM_RECLAIM = 8,\n\tWQ_HIGHPRI = 16,\n\tWQ_CPU_INTENSIVE = 32,\n\tWQ_SYSFS = 64,\n\tWQ_POWER_EFFICIENT = 128,\n\t__WQ_DESTROYING = 32768,\n\t__WQ_DRAINING = 65536,\n\t__WQ_ORDERED = 131072,\n\t__WQ_LEGACY = 262144,\n\t__WQ_BH_ALLOWS = 17,\n};\n\nenum wq_internal_consts {\n\tNR_STD_WORKER_POOLS = 2,\n\tUNBOUND_POOL_HASH_ORDER = 6,\n\tBUSY_WORKER_HASH_ORDER = 6,\n\tMAX_IDLE_WORKERS_RATIO = 4,\n\tIDLE_WORKER_TIMEOUT = 300000,\n\tMAYDAY_INITIAL_TIMEOUT = 10,\n\tMAYDAY_INTERVAL = 100,\n\tCREATE_COOLDOWN = 1000,\n\tRESCUER_NICE_LEVEL = -20,\n\tHIGHPRI_NICE_LEVEL = -20,\n\tWQ_NAME_LEN = 32,\n\tWORKER_ID_LEN = 42,\n};\n\nenum wq_misc_consts {\n\tWORK_NR_COLORS = 16,\n\tWORK_CPU_UNBOUND = 8192,\n\tWORK_BUSY_PENDING = 1,\n\tWORK_BUSY_RUNNING = 2,\n\tWORKER_DESC_LEN = 32,\n};\n\nenum writeback_sync_modes {\n\tWB_SYNC_NONE = 0,\n\tWB_SYNC_ALL = 1,\n};\n\nenum x509_actions {\n\tACT_x509_extract_key_data = 0,\n\tACT_x509_extract_name_segment = 1,\n\tACT_x509_note_OID = 2,\n\tACT_x509_note_issuer = 3,\n\tACT_x509_note_not_after = 4,\n\tACT_x509_note_not_before = 5,\n\tACT_x509_note_params = 6,\n\tACT_x509_note_serial = 7,\n\tACT_x509_note_sig_algo = 8,\n\tACT_x509_note_signature = 9,\n\tACT_x509_note_subject = 10,\n\tACT_x509_note_tbs_certificate = 11,\n\tACT_x509_process_extension = 12,\n\tNR__x509_actions = 13,\n};\n\nenum x509_akid_actions {\n\tACT_x509_akid_note_kid = 0,\n\tACT_x509_akid_note_name = 1,\n\tACT_x509_akid_note_serial = 2,\n\tACT_x509_extract_name_segment___2 = 3,\n\tACT_x509_note_OID___2 = 4,\n\tNR__x509_akid_actions = 5,\n};\n\nenum x86_hardware_subarch {\n\tX86_SUBARCH_PC = 0,\n\tX86_SUBARCH_LGUEST = 1,\n\tX86_SUBARCH_XEN = 2,\n\tX86_SUBARCH_INTEL_MID = 3,\n\tX86_SUBARCH_CE4100 = 4,\n\tX86_NR_SUBARCHS = 5,\n};\n\nenum x86_hypervisor_type {\n\tX86_HYPER_NATIVE = 0,\n\tX86_HYPER_VMWARE = 1,\n\tX86_HYPER_MS_HYPERV = 2,\n\tX86_HYPER_XEN_PV = 3,\n\tX86_HYPER_XEN_HVM = 4,\n\tX86_HYPER_KVM = 5,\n\tX86_HYPER_JAILHOUSE = 6,\n\tX86_HYPER_ACRN = 7,\n};\n\nenum x86_intercept_stage;\n\nenum x86_legacy_i8042_state {\n\tX86_LEGACY_I8042_PLATFORM_ABSENT = 0,\n\tX86_LEGACY_I8042_FIRMWARE_ABSENT = 1,\n\tX86_LEGACY_I8042_EXPECTED_PRESENT = 2,\n};\n\nenum x86_pf_error_code {\n\tX86_PF_PROT = 1,\n\tX86_PF_WRITE = 2,\n\tX86_PF_USER = 4,\n\tX86_PF_RSVD = 8,\n\tX86_PF_INSTR = 16,\n\tX86_PF_PK = 32,\n\tX86_PF_SHSTK = 64,\n\tX86_PF_SGX = 32768,\n\tX86_PF_RMP = 2147483648,\n};\n\nenum x86_regset_32 {\n\tREGSET32_GENERAL = 0,\n\tREGSET32_FP = 1,\n\tREGSET32_XFP = 2,\n\tREGSET32_XSTATE = 3,\n\tREGSET32_TLS = 4,\n\tREGSET32_IOPERM = 5,\n};\n\nenum x86_regset_64 {\n\tREGSET64_GENERAL = 0,\n\tREGSET64_FP = 1,\n\tREGSET64_IOPERM = 2,\n\tREGSET64_XSTATE = 3,\n\tREGSET64_SSP = 4,\n};\n\nenum x86_topology_domains {\n\tTOPO_SMT_DOMAIN = 0,\n\tTOPO_CORE_DOMAIN = 1,\n\tTOPO_MODULE_DOMAIN = 2,\n\tTOPO_TILE_DOMAIN = 3,\n\tTOPO_DIE_DOMAIN = 4,\n\tTOPO_DIEGRP_DOMAIN = 5,\n\tTOPO_PKG_DOMAIN = 6,\n\tTOPO_MAX_DOMAIN = 7,\n};\n\nenum xa_lock_type {\n\tXA_LOCK_IRQ = 1,\n\tXA_LOCK_BH = 2,\n};\n\nenum xb_req_state {\n\txb_req_state_queued = 0,\n\txb_req_state_wait_reply = 1,\n\txb_req_state_got_reply = 2,\n\txb_req_state_aborted = 3,\n};\n\nenum xdp_action {\n\tXDP_ABORTED = 0,\n\tXDP_DROP = 1,\n\tXDP_PASS = 2,\n\tXDP_TX = 3,\n\tXDP_REDIRECT = 4,\n};\n\nenum xdp_buff_flags {\n\tXDP_FLAGS_HAS_FRAGS = 1,\n\tXDP_FLAGS_FRAGS_PF_MEMALLOC = 2,\n};\n\nenum xdp_mem_type {\n\tMEM_TYPE_PAGE_SHARED = 0,\n\tMEM_TYPE_PAGE_ORDER0 = 1,\n\tMEM_TYPE_PAGE_POOL = 2,\n\tMEM_TYPE_XSK_BUFF_POOL = 3,\n\tMEM_TYPE_MAX = 4,\n};\n\nenum xdp_rss_hash_type {\n\tXDP_RSS_L3_IPV4 = 1,\n\tXDP_RSS_L3_IPV6 = 2,\n\tXDP_RSS_L3_DYNHDR = 4,\n\tXDP_RSS_L4 = 8,\n\tXDP_RSS_L4_TCP = 16,\n\tXDP_RSS_L4_UDP = 32,\n\tXDP_RSS_L4_SCTP = 64,\n\tXDP_RSS_L4_IPSEC = 128,\n\tXDP_RSS_L4_ICMP = 256,\n\tXDP_RSS_TYPE_NONE = 0,\n\tXDP_RSS_TYPE_L2 = 0,\n\tXDP_RSS_TYPE_L3_IPV4 = 1,\n\tXDP_RSS_TYPE_L3_IPV6 = 2,\n\tXDP_RSS_TYPE_L3_IPV4_OPT = 5,\n\tXDP_RSS_TYPE_L3_IPV6_EX = 6,\n\tXDP_RSS_TYPE_L4_ANY = 8,\n\tXDP_RSS_TYPE_L4_IPV4_TCP = 25,\n\tXDP_RSS_TYPE_L4_IPV4_UDP = 41,\n\tXDP_RSS_TYPE_L4_IPV4_SCTP = 73,\n\tXDP_RSS_TYPE_L4_IPV4_IPSEC = 137,\n\tXDP_RSS_TYPE_L4_IPV4_ICMP = 265,\n\tXDP_RSS_TYPE_L4_IPV6_TCP = 26,\n\tXDP_RSS_TYPE_L4_IPV6_UDP = 42,\n\tXDP_RSS_TYPE_L4_IPV6_SCTP = 74,\n\tXDP_RSS_TYPE_L4_IPV6_IPSEC = 138,\n\tXDP_RSS_TYPE_L4_IPV6_ICMP = 266,\n\tXDP_RSS_TYPE_L4_IPV6_TCP_EX = 30,\n\tXDP_RSS_TYPE_L4_IPV6_UDP_EX = 46,\n\tXDP_RSS_TYPE_L4_IPV6_SCTP_EX = 78,\n};\n\nenum xdp_rx_metadata {\n\tXDP_METADATA_KFUNC_RX_TIMESTAMP = 0,\n\tXDP_METADATA_KFUNC_RX_HASH = 1,\n\tXDP_METADATA_KFUNC_RX_VLAN_TAG = 2,\n\tMAX_XDP_METADATA_KFUNC = 3,\n};\n\nenum xen_domain_type {\n\tXEN_NATIVE = 0,\n\tXEN_PV_DOMAIN = 1,\n\tXEN_HVM_DOMAIN = 2,\n};\n\nenum xen_irq_type {\n\tIRQT_UNBOUND = 0,\n\tIRQT_PIRQ = 1,\n\tIRQT_VIRQ = 2,\n\tIRQT_IPI = 3,\n\tIRQT_EVTCHN = 4,\n};\n\nenum xen_lazy_mode {\n\tXEN_LAZY_NONE = 0,\n\tXEN_LAZY_MMU = 1,\n\tXEN_LAZY_CPU = 2,\n};\n\nenum xen_mc_extend_args {\n\tXEN_MC_XE_OK = 0,\n\tXEN_MC_XE_BAD_OP = 1,\n\tXEN_MC_XE_NO_SPACE = 2,\n};\n\nenum xen_mc_flush_reason {\n\tXEN_MC_FL_NONE = 0,\n\tXEN_MC_FL_BATCH = 1,\n\tXEN_MC_FL_ARGS = 2,\n\tXEN_MC_FL_CALLBACK = 3,\n};\n\nenum xenbus_state {\n\tXenbusStateUnknown = 0,\n\tXenbusStateInitialising = 1,\n\tXenbusStateInitWait = 2,\n\tXenbusStateInitialised = 3,\n\tXenbusStateConnected = 4,\n\tXenbusStateClosing = 5,\n\tXenbusStateClosed = 6,\n\tXenbusStateReconfiguring = 7,\n\tXenbusStateReconfigured = 8,\n};\n\nenum xenstore_init {\n\tXS_UNKNOWN = 0,\n\tXS_PV = 1,\n\tXS_HVM = 2,\n\tXS_LOCAL = 3,\n};\n\nenum xfeature {\n\tXFEATURE_FP = 0,\n\tXFEATURE_SSE = 1,\n\tXFEATURE_YMM = 2,\n\tXFEATURE_BNDREGS = 3,\n\tXFEATURE_BNDCSR = 4,\n\tXFEATURE_OPMASK = 5,\n\tXFEATURE_ZMM_Hi256 = 6,\n\tXFEATURE_Hi16_ZMM = 7,\n\tXFEATURE_PT_UNIMPLEMENTED_SO_FAR = 8,\n\tXFEATURE_PKRU = 9,\n\tXFEATURE_PASID = 10,\n\tXFEATURE_CET_USER = 11,\n\tXFEATURE_CET_KERNEL_UNUSED = 12,\n\tXFEATURE_RSRVD_COMP_13 = 13,\n\tXFEATURE_RSRVD_COMP_14 = 14,\n\tXFEATURE_LBR = 15,\n\tXFEATURE_RSRVD_COMP_16 = 16,\n\tXFEATURE_XTILE_CFG = 17,\n\tXFEATURE_XTILE_DATA = 18,\n\tXFEATURE_MAX = 19,\n};\n\nenum xfrm_ae_ftype_t {\n\tXFRM_AE_UNSPEC = 0,\n\tXFRM_AE_RTHR = 1,\n\tXFRM_AE_RVAL = 2,\n\tXFRM_AE_LVAL = 4,\n\tXFRM_AE_ETHR = 8,\n\tXFRM_AE_CR = 16,\n\tXFRM_AE_CE = 32,\n\tXFRM_AE_CU = 64,\n\t__XFRM_AE_MAX = 65,\n};\n\nenum xfrm_attr_type_t {\n\tXFRMA_UNSPEC = 0,\n\tXFRMA_ALG_AUTH = 1,\n\tXFRMA_ALG_CRYPT = 2,\n\tXFRMA_ALG_COMP = 3,\n\tXFRMA_ENCAP = 4,\n\tXFRMA_TMPL = 5,\n\tXFRMA_SA = 6,\n\tXFRMA_POLICY = 7,\n\tXFRMA_SEC_CTX = 8,\n\tXFRMA_LTIME_VAL = 9,\n\tXFRMA_REPLAY_VAL = 10,\n\tXFRMA_REPLAY_THRESH = 11,\n\tXFRMA_ETIMER_THRESH = 12,\n\tXFRMA_SRCADDR = 13,\n\tXFRMA_COADDR = 14,\n\tXFRMA_LASTUSED = 15,\n\tXFRMA_POLICY_TYPE = 16,\n\tXFRMA_MIGRATE = 17,\n\tXFRMA_ALG_AEAD = 18,\n\tXFRMA_KMADDRESS = 19,\n\tXFRMA_ALG_AUTH_TRUNC = 20,\n\tXFRMA_MARK = 21,\n\tXFRMA_TFCPAD = 22,\n\tXFRMA_REPLAY_ESN_VAL = 23,\n\tXFRMA_SA_EXTRA_FLAGS = 24,\n\tXFRMA_PROTO = 25,\n\tXFRMA_ADDRESS_FILTER = 26,\n\tXFRMA_PAD = 27,\n\tXFRMA_OFFLOAD_DEV = 28,\n\tXFRMA_SET_MARK = 29,\n\tXFRMA_SET_MARK_MASK = 30,\n\tXFRMA_IF_ID = 31,\n\tXFRMA_MTIMER_THRESH = 32,\n\tXFRMA_SA_DIR = 33,\n\tXFRMA_NAT_KEEPALIVE_INTERVAL = 34,\n\t__XFRMA_MAX = 35,\n};\n\nenum xfrm_nlgroups {\n\tXFRMNLGRP_NONE = 0,\n\tXFRMNLGRP_ACQUIRE = 1,\n\tXFRMNLGRP_EXPIRE = 2,\n\tXFRMNLGRP_SA = 3,\n\tXFRMNLGRP_POLICY = 4,\n\tXFRMNLGRP_AEVENTS = 5,\n\tXFRMNLGRP_REPORT = 6,\n\tXFRMNLGRP_MIGRATE = 7,\n\tXFRMNLGRP_MAPPING = 8,\n\t__XFRMNLGRP_MAX = 9,\n};\n\nenum xfrm_pol_inexact_candidate_type {\n\tXFRM_POL_CAND_BOTH = 0,\n\tXFRM_POL_CAND_SADDR = 1,\n\tXFRM_POL_CAND_DADDR = 2,\n\tXFRM_POL_CAND_ANY = 3,\n\tXFRM_POL_CAND_MAX = 4,\n};\n\nenum xfrm_replay_mode {\n\tXFRM_REPLAY_MODE_LEGACY = 0,\n\tXFRM_REPLAY_MODE_BMP = 1,\n\tXFRM_REPLAY_MODE_ESN = 2,\n};\n\nenum xfrm_sa_dir {\n\tXFRM_SA_DIR_IN = 1,\n\tXFRM_SA_DIR_OUT = 2,\n};\n\nenum xhci_cancelled_td_status {\n\tTD_DIRTY = 0,\n\tTD_HALTED = 1,\n\tTD_CLEARING_CACHE = 2,\n\tTD_CLEARING_CACHE_DEFERRED = 3,\n\tTD_CLEARED = 4,\n};\n\nenum xhci_ep_reset_type {\n\tEP_HARD_RESET = 0,\n\tEP_SOFT_RESET = 1,\n};\n\nenum xhci_overhead_type {\n\tLS_OVERHEAD_TYPE = 0,\n\tFS_OVERHEAD_TYPE = 1,\n\tHS_OVERHEAD_TYPE = 2,\n};\n\nenum xhci_ring_type {\n\tTYPE_CTRL = 0,\n\tTYPE_ISOC = 1,\n\tTYPE_BULK = 2,\n\tTYPE_INTR = 3,\n\tTYPE_STREAM = 4,\n\tTYPE_COMMAND = 5,\n\tTYPE_EVENT = 6,\n};\n\nenum xhci_setup_dev {\n\tSETUP_CONTEXT_ONLY = 0,\n\tSETUP_CONTEXT_ADDRESS = 1,\n};\n\nenum xprtsec_policies {\n\tRPC_XPRTSEC_NONE = 0,\n\tRPC_XPRTSEC_TLS_ANON = 1,\n\tRPC_XPRTSEC_TLS_X509 = 2,\n};\n\nenum xps_map_type {\n\tXPS_CPUS = 0,\n\tXPS_RXQS = 1,\n\tXPS_MAPS_MAX = 2,\n};\n\nenum xsd_sockmsg_type {\n\tXS_CONTROL = 0,\n\tXS_DIRECTORY = 1,\n\tXS_READ = 2,\n\tXS_GET_PERMS = 3,\n\tXS_WATCH = 4,\n\tXS_UNWATCH = 5,\n\tXS_TRANSACTION_START = 6,\n\tXS_TRANSACTION_END = 7,\n\tXS_INTRODUCE = 8,\n\tXS_RELEASE = 9,\n\tXS_GET_DOMAIN_PATH = 10,\n\tXS_WRITE = 11,\n\tXS_MKDIR = 12,\n\tXS_RM = 13,\n\tXS_SET_PERMS = 14,\n\tXS_WATCH_EVENT = 15,\n\tXS_ERROR = 16,\n\tXS_IS_DOMAIN_INTRODUCED = 17,\n\tXS_RESUME = 18,\n\tXS_SET_TARGET = 19,\n\tXS_RESET_WATCHES = 21,\n\tXS_DIRECTORY_PART = 22,\n\tXS_TYPE_COUNT = 23,\n\tXS_INVALID = 65535,\n};\n\nenum xstate_copy_mode {\n\tXSTATE_COPY_FP = 0,\n\tXSTATE_COPY_FX = 1,\n\tXSTATE_COPY_XSAVE = 2,\n};\n\nenum xz_check {\n\tXZ_CHECK_NONE = 0,\n\tXZ_CHECK_CRC32 = 1,\n\tXZ_CHECK_CRC64 = 4,\n\tXZ_CHECK_SHA256 = 10,\n};\n\nenum xz_mode {\n\tXZ_SINGLE = 0,\n\tXZ_PREALLOC = 1,\n\tXZ_DYNALLOC = 2,\n};\n\nenum xz_ret {\n\tXZ_OK = 0,\n\tXZ_STREAM_END = 1,\n\tXZ_UNSUPPORTED_CHECK = 2,\n\tXZ_MEM_ERROR = 3,\n\tXZ_MEMLIMIT_ERROR = 4,\n\tXZ_FORMAT_ERROR = 5,\n\tXZ_OPTIONS_ERROR = 6,\n\tXZ_DATA_ERROR = 7,\n\tXZ_BUF_ERROR = 8,\n};\n\nenum zbc_zone_alignment_method {\n\tZBC_CONSTANT_ZONE_LENGTH = 1,\n\tZBC_CONSTANT_ZONE_START_OFFSET = 8,\n};\n\nenum zbc_zone_cond {\n\tZBC_ZONE_COND_NO_WP = 0,\n\tZBC_ZONE_COND_EMPTY = 1,\n\tZBC_ZONE_COND_IMP_OPEN = 2,\n\tZBC_ZONE_COND_EXP_OPEN = 3,\n\tZBC_ZONE_COND_CLOSED = 4,\n\tZBC_ZONE_COND_READONLY = 13,\n\tZBC_ZONE_COND_FULL = 14,\n\tZBC_ZONE_COND_OFFLINE = 15,\n};\n\nenum zbc_zone_type {\n\tZBC_ZONE_TYPE_CONV = 1,\n\tZBC_ZONE_TYPE_SEQWRITE_REQ = 2,\n\tZBC_ZONE_TYPE_SEQWRITE_PREF = 3,\n\tZBC_ZONE_TYPE_SEQ_OR_BEFORE_REQ = 4,\n\tZBC_ZONE_TYPE_GAP = 5,\n};\n\nenum zone_flags {\n\tZONE_BOOSTED_WATERMARK = 0,\n\tZONE_RECLAIM_ACTIVE = 1,\n\tZONE_BELOW_HIGH = 2,\n};\n\nenum zone_stat_item {\n\tNR_FREE_PAGES = 0,\n\tNR_ZONE_LRU_BASE = 1,\n\tNR_ZONE_INACTIVE_ANON = 1,\n\tNR_ZONE_ACTIVE_ANON = 2,\n\tNR_ZONE_INACTIVE_FILE = 3,\n\tNR_ZONE_ACTIVE_FILE = 4,\n\tNR_ZONE_UNEVICTABLE = 5,\n\tNR_ZONE_WRITE_PENDING = 6,\n\tNR_MLOCK = 7,\n\tNR_BOUNCE = 8,\n\tNR_ZSPAGES = 9,\n\tNR_FREE_CMA_PAGES = 10,\n\tNR_UNACCEPTED = 11,\n\tNR_VM_ZONE_STAT_ITEMS = 12,\n};\n\nenum zone_type {\n\tZONE_DMA = 0,\n\tZONE_DMA32 = 1,\n\tZONE_NORMAL = 2,\n\tZONE_MOVABLE = 3,\n\tZONE_DEVICE = 4,\n\t__MAX_NR_ZONES = 5,\n};\n\nenum zone_watermarks {\n\tWMARK_MIN = 0,\n\tWMARK_LOW = 1,\n\tWMARK_HIGH = 2,\n\tWMARK_PROMO = 3,\n\tNR_WMARK = 4,\n};\n\nenum zpool_mapmode {\n\tZPOOL_MM_RW = 0,\n\tZPOOL_MM_RO = 1,\n\tZPOOL_MM_WO = 2,\n\tZPOOL_MM_DEFAULT = 0,\n};\n\nenum zs_mapmode {\n\tZS_MM_RW = 0,\n\tZS_MM_RO = 1,\n\tZS_MM_WO = 2,\n};\n\nenum zswap_init_type {\n\tZSWAP_UNINIT = 0,\n\tZSWAP_INIT_SUCCEED = 1,\n\tZSWAP_INIT_FAILED = 2,\n};\n\ntypedef _Bool bool;\n\ntypedef __int128 s_max;\n\ntypedef __int128 unsigned __u128;\n\ntypedef __u128 u128;\n\ntypedef u128 freelist_full_t;\n\ntypedef __int128 unsigned u_max;\n\ntypedef char *__guest_handle_char;\n\ntypedef char acpi_bus_id[8];\n\ntypedef char acpi_device_class[20];\n\ntypedef char acpi_device_name[40];\n\ntypedef char *acpi_string;\n\ntypedef const char (* const ethnl_string_array_t)[32];\n\ntypedef int *__guest_handle_int;\n\ntypedef int __kernel_clockid_t;\n\ntypedef int __kernel_daddr_t;\n\ntypedef int __kernel_ipc_pid_t;\n\ntypedef int __kernel_key_t;\n\ntypedef int __kernel_mqd_t;\n\ntypedef int __kernel_pid_t;\n\ntypedef int __kernel_rwf_t;\n\ntypedef int __kernel_timer_t;\n\ntypedef int __s32;\n\ntypedef int class_get_unused_fd_t;\n\ntypedef __kernel_clockid_t clockid_t;\n\ntypedef __s32 s32;\n\ntypedef s32 compat_clock_t;\n\ntypedef s32 compat_daddr_t;\n\ntypedef s32 compat_int_t;\n\ntypedef s32 compat_key_t;\n\ntypedef s32 compat_long_t;\n\ntypedef s32 compat_off_t;\n\ntypedef s32 compat_pid_t;\n\ntypedef s32 compat_ssize_t;\n\ntypedef s32 compat_timer_t;\n\ntypedef int cydp_t;\n\ntypedef s32 dma_cookie_t;\n\ntypedef int ext4_grpblk_t;\n\ntypedef int fpb_t;\n\ntypedef int fpi_t;\n\ntypedef int initcall_entry_t;\n\ntypedef int insn_value_t;\n\ntypedef s32 int32_t;\n\ntypedef int32_t key_serial_t;\n\ntypedef __kernel_key_t key_t;\n\ntypedef int mhp_t;\n\ntypedef int mpi_size_t;\n\ntypedef __kernel_mqd_t mqd_t;\n\ntypedef s32 old_time32_t;\n\ntypedef int pci_power_t;\n\ntypedef __kernel_pid_t pid_t;\n\ntypedef int rmap_t;\n\ntypedef __kernel_rwf_t rwf_t;\n\ntypedef __s32 sctp_assoc_t;\n\ntypedef int suspend_state_t;\n\ntypedef __kernel_timer_t timer_t;\n\ntypedef const int tracepoint_ptr_t;\n\ntypedef long int __kernel_long_t;\n\ntypedef __kernel_long_t __kernel_clock_t;\n\ntypedef __kernel_long_t __kernel_off_t;\n\ntypedef __kernel_long_t __kernel_old_time_t;\n\ntypedef __kernel_long_t __kernel_ptrdiff_t;\n\ntypedef __kernel_long_t __kernel_ssize_t;\n\ntypedef __kernel_long_t __kernel_suseconds_t;\n\ntypedef __kernel_clock_t clock_t;\n\ntypedef long int mpi_limb_signed_t;\n\ntypedef __kernel_off_t off_t;\n\ntypedef __kernel_ptrdiff_t ptrdiff_t;\n\ntypedef __kernel_ssize_t ssize_t;\n\ntypedef __kernel_suseconds_t suseconds_t;\n\ntypedef long int xen_long_t;\n\ntypedef long long int __s64;\n\ntypedef __s64 Elf64_Sxword;\n\ntypedef long long int __kernel_loff_t;\n\ntypedef long long int __kernel_time64_t;\n\ntypedef __s64 s64;\n\ntypedef s64 compat_loff_t;\n\ntypedef s64 int64_t;\n\ntypedef s64 ktime_t;\n\ntypedef __kernel_loff_t loff_t;\n\ntypedef long long int qsize_t;\n\ntypedef __s64 time64_t;\n\ntypedef long long unsigned int __u64;\n\ntypedef __u64 Elf64_Addr;\n\ntypedef __u64 Elf64_Off;\n\ntypedef __u64 Elf64_Xword;\n\ntypedef __u64 u64;\n\ntypedef u64 uint64_t;\n\ntypedef uint64_t U64;\n\ntypedef U64 ZSTD_VecMask;\n\ntypedef __u64 __addrpair;\n\ntypedef __u64 __be64;\n\ntypedef uint64_t *__guest_handle_uint64_t;\n\ntypedef __u64 __le64;\n\ntypedef __u64 __virtio64;\n\ntypedef u64 acpi_bus_address;\n\ntypedef u64 acpi_integer;\n\ntypedef u64 acpi_io_address;\n\ntypedef u64 acpi_physical_address;\n\ntypedef u64 acpi_size;\n\ntypedef u64 async_cookie_t;\n\ntypedef __u64 blist_flags_t;\n\ntypedef u64 blkcnt_t;\n\ntypedef uint64_t blkif_sector_t;\n\ntypedef u64 compat_u64;\n\ntypedef long long unsigned int cycles_t;\n\ntypedef u64 dma_addr_t;\n\ntypedef u64 efi_physical_addr_t;\n\ntypedef long long unsigned int ext4_fsblk_t;\n\ntypedef u64 gfn_t;\n\ntypedef u64 gpa_t;\n\ntypedef u64 hfn_t;\n\ntypedef u64 hpa_t;\n\ntypedef u64 io_req_flags_t;\n\ntypedef hfn_t kvm_pfn_t;\n\ntypedef long long unsigned int llu;\n\ntypedef u64 netdev_features_t;\n\ntypedef u64 pci_bus_addr_t;\n\ntypedef u64 phys_addr_t;\n\ntypedef phys_addr_t resource_size_t;\n\ntypedef u64 sci_t;\n\ntypedef u64 sector_t;\n\ntypedef __u64 timeu64_t;\n\ntypedef u64 u_int64_t;\n\ntypedef u64 upf_t;\n\ntypedef uint64_t vli_type;\n\ntypedef long unsigned int __kernel_ulong_t;\n\ntypedef __kernel_ulong_t __kernel_size_t;\n\ntypedef __kernel_size_t size_t;\n\ntypedef size_t HUF_CElt;\n\ntypedef long unsigned int mpi_limb_t;\n\ntypedef mpi_limb_t UWtype;\n\ntypedef long unsigned int xen_pfn_t;\n\ntypedef xen_pfn_t *__guest_handle_xen_pfn_t;\n\ntypedef long unsigned int xen_ulong_t;\n\ntypedef xen_ulong_t *__guest_handle_xen_ulong_t;\n\ntypedef long unsigned int __kernel_old_dev_t;\n\ntypedef __kernel_ulong_t aio_context_t;\n\ntypedef long unsigned int dax_entry_t;\n\ntypedef long unsigned int efi_status_t;\n\ntypedef long unsigned int elf_greg_t;\n\ntypedef elf_greg_t elf_gregset_t[27];\n\ntypedef long unsigned int gva_t;\n\ntypedef __kernel_ulong_t ino_t;\n\ntypedef long unsigned int irq_hw_number_t;\n\ntypedef long unsigned int kernel_ulong_t;\n\ntypedef long unsigned int kimage_entry_t;\n\ntypedef long unsigned int mce_banks_t[1];\n\ntypedef mpi_limb_t *mpi_ptr_t;\n\ntypedef long unsigned int netmem_ref;\n\ntypedef long unsigned int old_sigset_t;\n\ntypedef long unsigned int p4dval_t;\n\ntypedef long unsigned int perf_trace_t[1024];\n\ntypedef long unsigned int pgdval_t;\n\ntypedef long unsigned int pgprotval_t;\n\ntypedef long unsigned int pmdval_t;\n\ntypedef long unsigned int pte_marker;\n\ntypedef long unsigned int pteval_t;\n\ntypedef long unsigned int pudval_t;\n\ntypedef long unsigned int uLong;\n\ntypedef long unsigned int u_long;\n\ntypedef long unsigned int uintptr_t;\n\ntypedef long unsigned int ulg;\n\ntypedef long unsigned int ulong;\n\ntypedef uintptr_t uptrval;\n\ntypedef long unsigned int vm_flags_t;\n\ntypedef long unsigned int xen_callback_t;\n\ntypedef short int __s16;\n\ntypedef __s16 s16;\n\ntypedef s16 int16_t;\n\ntypedef int16_t S16;\n\ntypedef short unsigned int __u16;\n\ntypedef __u16 Elf32_Half;\n\ntypedef __u16 Elf64_Half;\n\ntypedef short unsigned int ush;\n\ntypedef ush Pos;\n\ntypedef __u16 u16;\n\ntypedef u16 uint16_t;\n\ntypedef uint16_t U16;\n\ntypedef __u16 __be16;\n\ntypedef u16 __compat_gid_t;\n\ntypedef u16 __compat_uid_t;\n\ntypedef __u16 __hc16;\n\ntypedef short unsigned int __kernel_gid16_t;\n\ntypedef short unsigned int __kernel_old_gid_t;\n\ntypedef short unsigned int __kernel_old_uid_t;\n\ntypedef short unsigned int __kernel_sa_family_t;\n\ntypedef short unsigned int __kernel_uid16_t;\n\ntypedef __u16 __le16;\n\ntypedef __u16 __sum16;\n\ntypedef __u16 __virtio16;\n\ntypedef u16 access_mask_t;\n\ntypedef u16 acpi_owner_id;\n\ntypedef u16 acpi_rs_length;\n\ntypedef __u16 bitmap_counter_t;\n\ntypedef u16 blk_short_t;\n\ntypedef uint16_t blkif_vdev_t;\n\ntypedef __u16 comp_t;\n\ntypedef u16 compat_dev_t;\n\ntypedef u16 compat_ipc_pid_t;\n\ntypedef u16 compat_mode_t;\n\ntypedef u16 compat_nlink_t;\n\ntypedef u16 compat_ushort_t;\n\ntypedef uint16_t domid_t;\n\ntypedef u16 efi_char16_t;\n\ntypedef __kernel_gid16_t gid16_t;\n\ntypedef uint16_t grant_status_t;\n\ntypedef u16 hv_pci_rid;\n\ntypedef u16 hv_pci_segment;\n\ntypedef u16 layer_mask_t;\n\ntypedef short unsigned int mifi_t;\n\ntypedef __kernel_old_gid_t old_gid_t;\n\ntypedef __kernel_old_uid_t old_uid_t;\n\ntypedef short unsigned int pci_bus_flags_t;\n\ntypedef short unsigned int pci_dev_flags_t;\n\ntypedef __u16 port_id;\n\ntypedef __kernel_sa_family_t sa_family_t;\n\ntypedef u16 u_int16_t;\n\ntypedef short unsigned int u_short;\n\ntypedef u16 ucs2_char_t;\n\ntypedef __kernel_uid16_t uid16_t;\n\ntypedef short unsigned int umode_t;\n\ntypedef short unsigned int ushort;\n\ntypedef short unsigned int vifi_t;\n\ntypedef u16 wchar_t;\n\ntypedef signed char __s8;\n\ntypedef __s8 s8;\n\ntypedef s8 int8_t;\n\ntypedef unsigned char __u8;\n\ntypedef __u8 u8;\n\ntypedef u8 uint8_t;\n\ntypedef uint8_t BYTE;\n\ntypedef unsigned char Byte;\n\ntypedef uint8_t U8;\n\ntypedef unsigned char *__guest_handle_uchar;\n\ntypedef u8 acpi_adr_space_type;\n\ntypedef u8 blk_status_t;\n\ntypedef __u8 byte_t;\n\ntypedef unsigned char cc_t;\n\ntypedef u8 dscp_t;\n\ntypedef __u8 dvd_challenge[10];\n\ntypedef __u8 dvd_key[5];\n\ntypedef u8 efi_bool_t;\n\ntypedef unsigned char insn_byte_t;\n\ntypedef u8 kprobe_opcode_t;\n\ntypedef __u8 mctp_eid_t;\n\ntypedef __u8 mtrr_type;\n\ntypedef u8 retpoline_thunk_t[32];\n\ntypedef u8 rmap_age_t;\n\ntypedef unsigned char u8___2;\n\ntypedef unsigned char u_char;\n\ntypedef u8 u_int8_t;\n\ntypedef unsigned char uch;\n\ntypedef u8 uprobe_opcode_t;\n\ntypedef const unsigned char utf8leaf_t;\n\ntypedef const unsigned char utf8trie_t;\n\ntypedef __u8 virtio_net_ctrl_ack;\n\ntypedef uint8_t xen_domain_handle_t[16];\n\ntypedef unsigned int __u32;\n\ntypedef __u32 Elf32_Addr;\n\ntypedef __u32 Elf32_Off;\n\ntypedef __u32 Elf32_Word;\n\ntypedef __u32 Elf64_Word;\n\ntypedef unsigned int FSE_CTable;\n\ntypedef unsigned int FSE_DTable;\n\ntypedef __u32 u32;\n\ntypedef u32 uint32_t;\n\ntypedef uint32_t U32;\n\ntypedef U32 HUF_DTable;\n\ntypedef unsigned int IPos;\n\ntypedef unsigned int RING_IDX;\n\ntypedef unsigned int UHWtype;\n\ntypedef uint32_t XENCONS_RING_IDX;\n\ntypedef uint32_t XENSTORE_RING_IDX;\n\ntypedef __u32 __be32;\n\ntypedef u32 __compat_gid32_t;\n\ntypedef u32 __compat_uid32_t;\n\ntypedef uint32_t evtchn_port_t;\n\ntypedef evtchn_port_t *__guest_handle_evtchn_port_t;\n\ntypedef uint32_t *__guest_handle_uint32_t;\n\ntypedef __u32 __hc32;\n\ntypedef u32 __kernel_dev_t;\n\ntypedef unsigned int __kernel_gid32_t;\n\ntypedef unsigned int __kernel_gid_t;\n\ntypedef unsigned int __kernel_mode_t;\n\ntypedef unsigned int __kernel_uid32_t;\n\ntypedef unsigned int __kernel_uid_t;\n\ntypedef __u32 __le32;\n\ntypedef unsigned int __poll_t;\n\ntypedef __u32 __portpair;\n\ntypedef __u32 __virtio32;\n\ntypedef __u32 __wsum;\n\ntypedef u32 acpi_event_status;\n\ntypedef u32 acpi_mutex_handle;\n\ntypedef u32 acpi_name;\n\ntypedef u32 acpi_object_type;\n\ntypedef u32 acpi_rsdesc_size;\n\ntypedef u32 acpi_status;\n\ntypedef unsigned int blk_features_t;\n\ntypedef unsigned int blk_flags_t;\n\ntypedef unsigned int blk_insert_t;\n\ntypedef unsigned int blk_mode_t;\n\ntypedef __u32 blk_mq_req_flags_t;\n\ntypedef __u32 blk_opf_t;\n\ntypedef unsigned int blk_qc_t;\n\ntypedef u32 compat_aio_context_t;\n\ntypedef u32 compat_caddr_t;\n\ntypedef u32 compat_ino_t;\n\ntypedef u32 compat_old_sigset_t;\n\ntypedef u32 compat_sigset_word;\n\ntypedef u32 compat_size_t;\n\ntypedef u32 compat_uint_t;\n\ntypedef u32 compat_ulong_t;\n\ntypedef u32 compat_uptr_t;\n\ntypedef u32 depot_flags_t;\n\ntypedef u32 depot_stack_handle_t;\n\ntypedef __kernel_dev_t dev_t;\n\ntypedef uint32_t drbg_flag_t;\n\ntypedef unsigned int drm_magic_t;\n\ntypedef u32 errseq_t;\n\ntypedef uint32_t event_word_t;\n\ntypedef unsigned int ext4_group_t;\n\ntypedef __u32 ext4_lblk_t;\n\ntypedef unsigned int fgf_t;\n\ntypedef unsigned int fmode_t;\n\ntypedef unsigned int fop_flags_t;\n\ntypedef unsigned int gfp_t;\n\ntypedef __kernel_gid32_t gid_t;\n\ntypedef uint32_t grant_handle_t;\n\ntypedef uint32_t grant_ref_t;\n\ntypedef __u32 if_mask;\n\ntypedef unsigned int insn_attr_t;\n\ntypedef __u32 int32;\n\ntypedef unsigned int ioasid_t;\n\ntypedef unsigned int iov_iter_extraction_t;\n\ntypedef unsigned int isolate_mode_t;\n\ntypedef unsigned int kasan_vmalloc_flags_t;\n\ntypedef uint32_t key_perm_t;\n\ntypedef unsigned int mmc_pm_flag_t;\n\ntypedef __kernel_mode_t mode_t;\n\ntypedef u32 nlink_t;\n\ntypedef u32 note_buf_t[92];\n\ntypedef unsigned int pci_channel_state_t;\n\ntypedef unsigned int pci_ers_result_t;\n\ntypedef unsigned int pgtbl_mod_mask;\n\ntypedef u32 phandle;\n\ntypedef u32 phys_cpuid_t;\n\ntypedef __kernel_uid32_t projid_t;\n\ntypedef __kernel_uid32_t qid_t;\n\ntypedef U32 rankValCol_t[13];\n\ntypedef __u32 req_flags_t;\n\ntypedef u32 rpc_authflavor_t;\n\ntypedef unsigned int sk_buff_data_t;\n\ntypedef unsigned int slab_flags_t;\n\ntypedef unsigned int speed_t;\n\ntypedef u32 ssci_t;\n\ntypedef unsigned int t_key;\n\ntypedef unsigned int tcflag_t;\n\ntypedef unsigned int tid_t;\n\ntypedef unsigned int uInt;\n\ntypedef unsigned int u_int;\n\ntypedef u32 u_int32_t;\n\ntypedef unsigned int uffd_flags_t;\n\ntypedef __kernel_uid32_t uid_t;\n\ntypedef unsigned int uint;\n\ntypedef u32 unicode_t;\n\ntypedef unsigned int upstat_t;\n\ntypedef u32 usb_port_location_t;\n\ntypedef unsigned int vm_fault_t;\n\ntypedef unsigned int xa_mark_t;\n\ntypedef u32 xdp_features_t;\n\ntypedef unsigned int zap_flags_t;\n\ntypedef struct {\n\tsize_t bitContainer;\n\tunsigned int bitPos;\n\tchar *startPtr;\n\tchar *ptr;\n\tchar *endPtr;\n} BIT_CStream_t;\n\ntypedef struct {\n\tsize_t bitContainer;\n\tunsigned int bitsConsumed;\n\tconst char *ptr;\n\tconst char *start;\n\tconst char *limitPtr;\n} BIT_DStream_t;\n\ntypedef struct {\n\tBYTE maxTableLog;\n\tBYTE tableType;\n\tBYTE tableLog;\n\tBYTE reserved;\n} DTableDesc;\n\ntypedef struct {\n\tptrdiff_t value;\n\tconst void *stateTable;\n\tconst void *symbolTT;\n\tunsigned int stateLog;\n} FSE_CState_t;\n\ntypedef struct {\n\tsize_t state;\n\tconst void *table;\n} FSE_DState_t;\n\ntypedef struct {\n\tU16 tableLog;\n\tU16 fastMode;\n} FSE_DTableHeader;\n\ntypedef struct {\n\tshort int ncount[256];\n\tFSE_DTable dtable[0];\n} FSE_DecompressWksp;\n\ntypedef struct {\n\tshort unsigned int newState;\n\tunsigned char symbol;\n\tunsigned char nbBits;\n} FSE_decode_t;\n\ntypedef struct {\n\tint deltaFindState;\n\tU32 deltaNbBits;\n} FSE_symbolCompressionTransform;\n\ntypedef struct {\n\tsize_t bitContainer[2];\n\tsize_t bitPos[2];\n\tBYTE *startPtr;\n\tBYTE *ptr;\n\tBYTE *endPtr;\n} HUF_CStream_t;\n\ntypedef struct {\n\tFSE_CTable CTable[59];\n\tU32 scratchBuffer[41];\n\tunsigned int count[13];\n\tS16 norm[13];\n} HUF_CompressWeightsWksp;\n\ntypedef struct {\n\tBYTE nbBits;\n\tBYTE byte;\n} HUF_DEltX1;\n\ntypedef struct {\n\tU16 sequence;\n\tBYTE nbBits;\n\tBYTE length;\n} HUF_DEltX2;\n\ntypedef struct {\n\tU32 rankVal[13];\n\tU32 rankStart[13];\n\tU32 statsWksp[218];\n\tBYTE symbols[256];\n\tBYTE huffWeight[256];\n} HUF_ReadDTableX1_Workspace;\n\ntypedef struct {\n\tBYTE symbol;\n} sortedSymbol_t;\n\ntypedef struct {\n\tU32 rankVal[156];\n\tU32 rankStats[13];\n\tU32 rankStart0[15];\n\tsortedSymbol_t sortedSymbol[256];\n\tBYTE weightList[256];\n\tU32 calleeWksp[218];\n} HUF_ReadDTableX2_Workspace;\n\ntypedef struct {\n\tHUF_CompressWeightsWksp wksp;\n\tBYTE bitsToWeight[13];\n\tBYTE huffWeight[255];\n} HUF_WriteCTableWksp;\n\nstruct nodeElt_s {\n\tU32 count;\n\tU16 parent;\n\tBYTE byte;\n\tBYTE nbBits;\n};\n\ntypedef struct nodeElt_s nodeElt;\n\ntypedef nodeElt huffNodeTable[512];\n\ntypedef struct {\n\tU16 base;\n\tU16 curr;\n} rankPos;\n\ntypedef struct {\n\thuffNodeTable huffNodeTbl;\n\trankPos rankPosition[192];\n} HUF_buildCTable_wksp_tables;\n\ntypedef struct {\n\tunsigned int count[256];\n\tHUF_CElt CTable[257];\n\tunion {\n\t\tHUF_buildCTable_wksp_tables buildCTable_wksp;\n\t\tHUF_WriteCTableWksp writeCTable_wksp;\n\t\tU32 hist_wksp[1024];\n\t} wksps;\n} HUF_compress_tables_t;\n\nstruct buffer_head;\n\ntypedef struct {\n\t__le32 *p;\n\t__le32 key;\n\tstruct buffer_head *bh;\n} Indirect;\n\ntypedef struct {\n\tconst uint8_t *externalDict;\n\tsize_t extDictSize;\n\tconst uint8_t *prefixEnd;\n\tsize_t prefixSize;\n} LZ4_streamDecode_t_internal;\n\ntypedef union {\n\tlong long unsigned int table[4];\n\tLZ4_streamDecode_t_internal internal_donotuse;\n} LZ4_streamDecode_t;\n\nstruct folio;\n\ntypedef struct {\n\tstruct folio *v;\n} Sector;\n\ntypedef struct {\n\tunsigned int offset;\n\tunsigned int litLength;\n\tunsigned int matchLength;\n\tunsigned int rep;\n} ZSTD_Sequence;\n\ntypedef struct {\n\tint collectSequences;\n\tZSTD_Sequence *seqStart;\n\tsize_t seqIndex;\n\tsize_t maxSequences;\n} SeqCollector;\n\ntypedef struct {\n\tS16 norm[53];\n\tU32 wksp[285];\n} ZSTD_BuildCTableWksp;\n\nstruct ZSTD_DDict_s;\n\ntypedef struct ZSTD_DDict_s ZSTD_DDict;\n\ntypedef struct {\n\tconst ZSTD_DDict **ddictPtrTable;\n\tsize_t ddictPtrTableSize;\n\tsize_t ddictPtrCount;\n} ZSTD_DDictHashSet;\n\nstruct seqDef_s;\n\ntypedef struct seqDef_s seqDef;\n\ntypedef struct {\n\tseqDef *sequencesStart;\n\tseqDef *sequences;\n\tBYTE *litStart;\n\tBYTE *lit;\n\tBYTE *llCode;\n\tBYTE *mlCode;\n\tBYTE *ofCode;\n\tsize_t maxNbSeq;\n\tsize_t maxNbLit;\n\tZSTD_longLengthType_e longLengthType;\n\tU32 longLengthPos;\n} seqStore_t;\n\ntypedef struct {\n\tsymbolEncodingType_e hType;\n\tBYTE hufDesBuffer[128];\n\tsize_t hufDesSize;\n} ZSTD_hufCTablesMetadata_t;\n\ntypedef struct {\n\tsymbolEncodingType_e llType;\n\tsymbolEncodingType_e ofType;\n\tsymbolEncodingType_e mlType;\n\tBYTE fseTablesBuffer[133];\n\tsize_t fseTablesSize;\n\tsize_t lastCountSize;\n} ZSTD_fseCTablesMetadata_t;\n\ntypedef struct {\n\tZSTD_hufCTablesMetadata_t hufMetadata;\n\tZSTD_fseCTablesMetadata_t fseMetadata;\n} ZSTD_entropyCTablesMetadata_t;\n\ntypedef struct {\n\tseqStore_t fullSeqStoreChunk;\n\tseqStore_t firstHalfSeqStore;\n\tseqStore_t secondHalfSeqStore;\n\tseqStore_t currSeqStore;\n\tseqStore_t nextSeqStore;\n\tU32 partitions[196];\n\tZSTD_entropyCTablesMetadata_t entropyMetadata;\n} ZSTD_blockSplitCtx;\n\ntypedef struct {\n\tHUF_CElt CTable[257];\n\tHUF_repeat repeatMode;\n} ZSTD_hufCTables_t;\n\ntypedef struct {\n\tFSE_CTable offcodeCTable[193];\n\tFSE_CTable matchlengthCTable[363];\n\tFSE_CTable litlengthCTable[329];\n\tFSE_repeat offcode_repeatMode;\n\tFSE_repeat matchlength_repeatMode;\n\tFSE_repeat litlength_repeatMode;\n} ZSTD_fseCTables_t;\n\ntypedef struct {\n\tZSTD_hufCTables_t huf;\n\tZSTD_fseCTables_t fse;\n} ZSTD_entropyCTables_t;\n\ntypedef struct {\n\tZSTD_entropyCTables_t entropy;\n\tU32 rep[3];\n} ZSTD_compressedBlockState_t;\n\ntypedef struct {\n\tconst BYTE *nextSrc;\n\tconst BYTE *base;\n\tconst BYTE *dictBase;\n\tU32 dictLimit;\n\tU32 lowLimit;\n\tU32 nbOverflowCorrections;\n} ZSTD_window_t;\n\ntypedef struct {\n\tU32 off;\n\tU32 len;\n} ZSTD_match_t;\n\ntypedef struct {\n\tint price;\n\tU32 off;\n\tU32 mlen;\n\tU32 litlen;\n\tU32 rep[3];\n} ZSTD_optimal_t;\n\ntypedef struct {\n\tunsigned int *litFreq;\n\tunsigned int *litLengthFreq;\n\tunsigned int *matchLengthFreq;\n\tunsigned int *offCodeFreq;\n\tZSTD_match_t *matchTable;\n\tZSTD_optimal_t *priceTable;\n\tU32 litSum;\n\tU32 litLengthSum;\n\tU32 matchLengthSum;\n\tU32 offCodeSum;\n\tU32 litSumBasePrice;\n\tU32 litLengthSumBasePrice;\n\tU32 matchLengthSumBasePrice;\n\tU32 offCodeSumBasePrice;\n\tZSTD_OptPrice_e priceType;\n\tconst ZSTD_entropyCTables_t *symbolCosts;\n\tZSTD_paramSwitch_e literalCompressionMode;\n} optState_t;\n\ntypedef struct {\n\tunsigned int windowLog;\n\tunsigned int chainLog;\n\tunsigned int hashLog;\n\tunsigned int searchLog;\n\tunsigned int minMatch;\n\tunsigned int targetLength;\n\tZSTD_strategy strategy;\n} ZSTD_compressionParameters;\n\ntypedef struct {\n\tU32 offset;\n\tU32 litLength;\n\tU32 matchLength;\n} rawSeq;\n\ntypedef struct {\n\trawSeq *seq;\n\tsize_t pos;\n\tsize_t posInSequence;\n\tsize_t size;\n\tsize_t capacity;\n} rawSeqStore_t;\n\nstruct ZSTD_matchState_t;\n\ntypedef struct ZSTD_matchState_t ZSTD_matchState_t;\n\nstruct ZSTD_matchState_t {\n\tZSTD_window_t window;\n\tU32 loadedDictEnd;\n\tU32 nextToUpdate;\n\tU32 hashLog3;\n\tU32 rowHashLog;\n\tU16 *tagTable;\n\tU32 hashCache[8];\n\tU32 *hashTable;\n\tU32 *hashTable3;\n\tU32 *chainTable;\n\tU32 forceNonContiguous;\n\tint dedicatedDictSearch;\n\toptState_t opt;\n\tconst ZSTD_matchState_t *dictMatchState;\n\tZSTD_compressionParameters cParams;\n\tconst rawSeqStore_t *ldmSeqStore;\n};\n\ntypedef struct {\n\tZSTD_compressedBlockState_t *prevCBlock;\n\tZSTD_compressedBlockState_t *nextCBlock;\n\tZSTD_matchState_t matchState;\n} ZSTD_blockState_t;\n\ntypedef struct {\n\tsize_t error;\n\tint lowerBound;\n\tint upperBound;\n} ZSTD_bounds;\n\ntypedef struct {\n\tU32 f1c;\n\tU32 f1d;\n\tU32 f7b;\n\tU32 f7c;\n} ZSTD_cpuid_t;\n\ntypedef void * (*ZSTD_allocFunction)(void *, size_t);\n\ntypedef void (*ZSTD_freeFunction)(void *, void *);\n\ntypedef struct {\n\tZSTD_allocFunction customAlloc;\n\tZSTD_freeFunction customFree;\n\tvoid *opaque;\n} ZSTD_customMem;\n\ntypedef struct {\n\tvoid *workspace;\n\tvoid *workspaceEnd;\n\tvoid *objectEnd;\n\tvoid *tableEnd;\n\tvoid *tableValidEnd;\n\tvoid *allocStart;\n\tBYTE allocFailed;\n\tint workspaceOversizedDuration;\n\tZSTD_cwksp_alloc_phase_e phase;\n\tZSTD_cwksp_static_alloc_e isStatic;\n} ZSTD_cwksp;\n\ntypedef struct {\n\tU16 nextState;\n\tBYTE nbAdditionalBits;\n\tBYTE nbBits;\n\tU32 baseValue;\n} ZSTD_seqSymbol;\n\ntypedef struct {\n\tZSTD_seqSymbol LLTable[513];\n\tZSTD_seqSymbol OFTable[257];\n\tZSTD_seqSymbol MLTable[513];\n\tHUF_DTable hufTable[4097];\n\tU32 rep[3];\n\tU32 workspace[157];\n} ZSTD_entropyDTables_t;\n\ntypedef struct {\n\tlong long unsigned int frameContentSize;\n\tlong long unsigned int windowSize;\n\tunsigned int blockSizeMax;\n\tZSTD_frameType_e frameType;\n\tunsigned int headerSize;\n\tunsigned int dictID;\n\tunsigned int checksumFlag;\n} ZSTD_frameHeader;\n\ntypedef struct {\n\tint contentSizeFlag;\n\tint checksumFlag;\n\tint noDictIDFlag;\n} ZSTD_frameParameters;\n\ntypedef struct {\n\tlong long unsigned int ingested;\n\tlong long unsigned int consumed;\n\tlong long unsigned int produced;\n\tlong long unsigned int flushed;\n\tunsigned int currentJobID;\n\tunsigned int nbActiveWorkers;\n} ZSTD_frameProgression;\n\ntypedef struct {\n\tsize_t compressedSize;\n\tlong long unsigned int decompressedBound;\n} ZSTD_frameSizeInfo;\n\ntypedef struct {\n\tsize_t state;\n\tconst ZSTD_seqSymbol *table;\n} ZSTD_fseState;\n\nstruct ZSTD_CDict_s;\n\ntypedef struct ZSTD_CDict_s ZSTD_CDict;\n\ntypedef struct {\n\tvoid *dictBuffer;\n\tconst void *dict;\n\tsize_t dictSize;\n\tZSTD_dictContentType_e dictContentType;\n\tZSTD_CDict *cdict;\n} ZSTD_localDict;\n\ntypedef struct {\n\trawSeqStore_t seqStore;\n\tU32 startPosInBlock;\n\tU32 endPosInBlock;\n\tU32 offset;\n} ZSTD_optLdm_t;\n\ntypedef struct {\n\tZSTD_compressionParameters cParams;\n\tZSTD_frameParameters fParams;\n} ZSTD_parameters;\n\ntypedef struct {\n\tU32 fastMode;\n\tU32 tableLog;\n} ZSTD_seqSymbol_header;\n\ntypedef struct {\n\tU32 litLength;\n\tU32 matchLength;\n} ZSTD_sequenceLength;\n\ntypedef struct {\n\tU32 idx;\n\tU32 posInSequence;\n\tsize_t posInSrc;\n} ZSTD_sequencePosition;\n\ntypedef struct {\n\tU32 LLtype;\n\tU32 Offtype;\n\tU32 MLtype;\n\tsize_t size;\n\tsize_t lastCountSize;\n} ZSTD_symbolEncodingTypeStats_t;\n\ntypedef struct {\n\tlong unsigned int fds_bits[16];\n} __kernel_fd_set;\n\ntypedef struct {\n\tint val[2];\n} __kernel_fsid_t;\n\ntypedef struct {\n\tU32 tableTime;\n\tU32 decode256Time;\n} algo_time_t;\n\ntypedef struct {\n\ts64 counter;\n} atomic64_t;\n\ntypedef atomic64_t atomic_long_t;\n\ntypedef struct {\n\tint counter;\n} atomic_t;\n\ntypedef struct {\n\tchar ax25_call[7];\n} ax25_address;\n\ntypedef struct {\n\t__be64 a;\n\t__be64 b;\n} be128;\n\ntypedef struct {\n\tblockType_e blockType;\n\tU32 lastBlock;\n\tU32 origSize;\n} blockProperties_t;\n\ntypedef struct {\n\tunion {\n\t\tvoid *kernel;\n\t\tvoid *user;\n\t};\n\tbool is_kernel: 1;\n} sockptr_t;\n\ntypedef sockptr_t bpfptr_t;\n\nstruct permanent_flags_t {\n\t__be16 tag;\n\tu8 disable;\n\tu8 ownership;\n\tu8 deactivated;\n\tu8 readPubek;\n\tu8 disableOwnerClear;\n\tu8 allowMaintenance;\n\tu8 physicalPresenceLifetimeLock;\n\tu8 physicalPresenceHWEnable;\n\tu8 physicalPresenceCMDEnable;\n\tu8 CEKPUsed;\n\tu8 TPMpost;\n\tu8 TPMpostLock;\n\tu8 FIPS;\n\tu8 operator;\n\tu8 enableRevokeEK;\n\tu8 nvLocked;\n\tu8 readSRKPub;\n\tu8 tpmEstablished;\n\tu8 maintenanceDone;\n\tu8 disableFullDALogicInfo;\n};\n\nstruct stclear_flags_t {\n\t__be16 tag;\n\tu8 deactivated;\n\tu8 disableForceClear;\n\tu8 physicalPresence;\n\tu8 physicalPresenceLock;\n\tu8 bGlobalLock;\n} __attribute__((packed));\n\nstruct tpm1_version {\n\tu8 major;\n\tu8 minor;\n\tu8 rev_major;\n\tu8 rev_minor;\n};\n\nstruct tpm1_version2 {\n\t__be16 tag;\n\tstruct tpm1_version version;\n};\n\nstruct timeout_t {\n\t__be32 a;\n\t__be32 b;\n\t__be32 c;\n\t__be32 d;\n};\n\nstruct duration_t {\n\t__be32 tpm_short;\n\t__be32 tpm_medium;\n\t__be32 tpm_long;\n};\n\ntypedef union {\n\tstruct permanent_flags_t perm_flags;\n\tstruct stclear_flags_t stclear_flags;\n\t__u8 owned;\n\t__be32 num_pcrs;\n\tstruct tpm1_version version1;\n\tstruct tpm1_version2 version2;\n\t__be32 manufacturer_id;\n\tstruct timeout_t timeout;\n\tstruct duration_t duration;\n} cap_t;\n\ntypedef struct {\n\tunsigned int interval;\n\tunsigned int timeout;\n} cisco_proto;\n\ntypedef struct {\n\tint *lock;\n\tlong unsigned int flags;\n} class_core_lock_t;\n\ntypedef struct {\n\tvoid *lock;\n} class_cpus_read_lock_t;\n\nstruct raw_spinlock;\n\ntypedef struct raw_spinlock raw_spinlock_t;\n\ntypedef struct {\n\traw_spinlock_t *lock;\n\traw_spinlock_t *lock2;\n} class_double_raw_spinlock_t;\n\nstruct rq;\n\ntypedef struct {\n\tstruct rq *lock;\n\tstruct rq *lock2;\n} class_double_rq_lock_t;\n\ntypedef struct {\n\tvoid *lock;\n} class_irq_t;\n\ntypedef struct {\n\tvoid *lock;\n\tlong unsigned int flags;\n} class_irqsave_t;\n\ntypedef struct {\n\tvoid *lock;\n} class_preempt_notrace_t;\n\ntypedef struct {\n\tvoid *lock;\n} class_preempt_t;\n\ntypedef struct {\n\traw_spinlock_t *lock;\n} class_raw_spinlock_irq_t;\n\ntypedef struct {\n\traw_spinlock_t *lock;\n\tlong unsigned int flags;\n} class_raw_spinlock_irqsave_t;\n\ntypedef struct {\n\traw_spinlock_t *lock;\n} class_raw_spinlock_t;\n\ntypedef struct {\n\tvoid *lock;\n} class_rcu_t;\n\nstruct qspinlock {\n\tunion {\n\t\tatomic_t val;\n\t\tstruct {\n\t\t\tu8 locked;\n\t\t\tu8 pending;\n\t\t};\n\t\tstruct {\n\t\t\tu16 locked_pending;\n\t\t\tu16 tail;\n\t\t};\n\t};\n};\n\ntypedef struct qspinlock arch_spinlock_t;\n\nstruct qrwlock {\n\tunion {\n\t\tatomic_t cnts;\n\t\tstruct {\n\t\t\tu8 wlocked;\n\t\t\tu8 __lstate[3];\n\t\t};\n\t};\n\tarch_spinlock_t wait_lock;\n};\n\ntypedef struct qrwlock arch_rwlock_t;\n\ntypedef struct {\n\tarch_rwlock_t raw_lock;\n} rwlock_t;\n\ntypedef struct {\n\trwlock_t *lock;\n} class_read_lock_t;\n\nstruct pin_cookie {};\n\nstruct rq_flags {\n\tlong unsigned int flags;\n\tstruct pin_cookie cookie;\n\tunsigned int clock_update_flags;\n};\n\ntypedef struct {\n\tstruct rq *lock;\n\tstruct rq_flags rf;\n} class_rq_lock_irq_t;\n\ntypedef struct {\n\tstruct rq *lock;\n\tstruct rq_flags rf;\n} class_rq_lock_irqsave_t;\n\nstruct spinlock;\n\ntypedef struct spinlock spinlock_t;\n\ntypedef struct {\n\tspinlock_t *lock;\n} class_spinlock_irq_t;\n\ntypedef struct {\n\tspinlock_t *lock;\n\tlong unsigned int flags;\n} class_spinlock_irqsave_t;\n\ntypedef struct {\n\tspinlock_t *lock;\n} class_spinlock_t;\n\nstruct srcu_struct;\n\ntypedef struct {\n\tstruct srcu_struct *lock;\n\tint idx;\n} class_srcu_t;\n\nstruct task_struct;\n\ntypedef struct {\n\tstruct task_struct *lock;\n\tstruct rq *rq;\n\tstruct rq_flags rf;\n} class_task_rq_lock_t;\n\ntypedef struct {\n\trwlock_t *lock;\n} class_write_lock_irq_t;\n\ntypedef struct {\n\trwlock_t *lock;\n} class_write_lock_t;\n\ntypedef struct {\n\tunsigned char op;\n\tunsigned char bits;\n\tshort unsigned int val;\n} code;\n\ntypedef __kernel_fsid_t compat_fsid_t;\n\ntypedef struct {\n\tcompat_sigset_word sig[2];\n} compat_sigset_t;\n\ntypedef struct {\n\t__be16 disc_information_length;\n\t__u8 disc_status: 2;\n\t__u8 border_status: 2;\n\t__u8 erasable: 1;\n\t__u8 reserved1: 3;\n\t__u8 n_first_track;\n\t__u8 n_sessions_lsb;\n\t__u8 first_track_lsb;\n\t__u8 last_track_lsb;\n\t__u8 mrw_status: 2;\n\t__u8 dbit: 1;\n\t__u8 reserved2: 2;\n\t__u8 uru: 1;\n\t__u8 dbc_v: 1;\n\t__u8 did_v: 1;\n\t__u8 disc_type;\n\t__u8 n_sessions_msb;\n\t__u8 first_track_msb;\n\t__u8 last_track_msb;\n\t__u32 disc_id;\n\t__u32 lead_in;\n\t__u32 lead_out;\n\t__u8 disc_bar_code[8];\n\t__u8 reserved3;\n\t__u8 n_opc;\n} disc_information;\n\ntypedef struct {\n\tlong unsigned int bits[1];\n} dma_cap_mask_t;\n\nstruct dvd_lu_send_agid {\n\t__u8 type;\n\tunsigned int agid: 2;\n};\n\nstruct dvd_host_send_challenge {\n\t__u8 type;\n\tunsigned int agid: 2;\n\tdvd_challenge chal;\n};\n\nstruct dvd_send_key {\n\t__u8 type;\n\tunsigned int agid: 2;\n\tdvd_key key;\n};\n\nstruct dvd_lu_send_challenge {\n\t__u8 type;\n\tunsigned int agid: 2;\n\tdvd_challenge chal;\n};\n\nstruct dvd_lu_send_title_key {\n\t__u8 type;\n\tunsigned int agid: 2;\n\tdvd_key title_key;\n\tint lba;\n\tunsigned int cpm: 1;\n\tunsigned int cp_sec: 1;\n\tunsigned int cgms: 2;\n};\n\nstruct dvd_lu_send_asf {\n\t__u8 type;\n\tunsigned int agid: 2;\n\tunsigned int asf: 1;\n};\n\nstruct dvd_host_send_rpcstate {\n\t__u8 type;\n\t__u8 pdrc;\n};\n\nstruct dvd_lu_send_rpcstate {\n\t__u8 type: 2;\n\t__u8 vra: 3;\n\t__u8 ucca: 3;\n\t__u8 region_mask;\n\t__u8 rpc_scheme;\n};\n\ntypedef union {\n\t__u8 type;\n\tstruct dvd_lu_send_agid lsa;\n\tstruct dvd_host_send_challenge hsc;\n\tstruct dvd_send_key lsk;\n\tstruct dvd_lu_send_challenge lsc;\n\tstruct dvd_send_key hsk;\n\tstruct dvd_lu_send_title_key lstk;\n\tstruct dvd_lu_send_asf lsasf;\n\tstruct dvd_host_send_rpcstate hrpcs;\n\tstruct dvd_lu_send_rpcstate lrpcs;\n} dvd_authinfo;\n\nstruct dvd_layer {\n\t__u8 book_version: 4;\n\t__u8 book_type: 4;\n\t__u8 min_rate: 4;\n\t__u8 disc_size: 4;\n\t__u8 layer_type: 4;\n\t__u8 track_path: 1;\n\t__u8 nlayers: 2;\n\tchar: 1;\n\t__u8 track_density: 4;\n\t__u8 linear_density: 4;\n\t__u8 bca: 1;\n\t__u32 start_sector;\n\t__u32 end_sector;\n\t__u32 end_sector_l0;\n};\n\nstruct dvd_physical {\n\t__u8 type;\n\t__u8 layer_num;\n\tstruct dvd_layer layer[4];\n};\n\nstruct dvd_copyright {\n\t__u8 type;\n\t__u8 layer_num;\n\t__u8 cpst;\n\t__u8 rmi;\n};\n\nstruct dvd_disckey {\n\t__u8 type;\n\tunsigned int agid: 2;\n\t__u8 value[2048];\n};\n\nstruct dvd_bca {\n\t__u8 type;\n\tint len;\n\t__u8 value[188];\n};\n\nstruct dvd_manufact {\n\t__u8 type;\n\t__u8 layer_num;\n\tint len;\n\t__u8 value[2048];\n};\n\ntypedef union {\n\t__u8 type;\n\tstruct dvd_physical physical;\n\tstruct dvd_copyright copyright;\n\tstruct dvd_disckey disckey;\n\tstruct dvd_bca bca;\n\tstruct dvd_manufact manufact;\n} dvd_struct;\n\ntypedef struct {\n\tu64 length;\n\tu64 data;\n} efi_capsule_block_desc_t;\n\ntypedef struct {\n\t__u8 b[16];\n} guid_t;\n\ntypedef guid_t efi_guid_t;\n\ntypedef struct {\n\tefi_guid_t guid;\n\tu32 headersize;\n\tu32 flags;\n\tu32 imagesize;\n} efi_capsule_header_t;\n\ntypedef struct {\n\tefi_guid_t guid;\n\tu32 table;\n} efi_config_table_32_t;\n\ntypedef struct {\n\tefi_guid_t guid;\n\tu64 table;\n} efi_config_table_64_t;\n\ntypedef union {\n\tstruct {\n\t\tefi_guid_t guid;\n\t\tvoid *table;\n\t};\n\tefi_config_table_32_t mixed_mode;\n} efi_config_table_t;\n\ntypedef struct {\n\tefi_guid_t guid;\n\tlong unsigned int *ptr;\n\tconst char name[16];\n} efi_config_table_type_t;\n\ntypedef struct {\n\tu32 type;\n\tu32 pad;\n\tu64 phys_addr;\n\tu64 virt_addr;\n\tu64 num_pages;\n\tu64 attribute;\n} efi_memory_desc_t;\n\ntypedef struct {\n\tu32 version;\n\tu32 num_entries;\n\tu32 desc_size;\n\tu32 flags;\n\tefi_memory_desc_t entry[0];\n} efi_memory_attributes_table_t;\n\ntypedef struct {\n\tu32 version;\n\tu32 length;\n\tu64 memory_protection_attribute;\n} efi_properties_table_t;\n\ntypedef struct {\n\tu16 version;\n\tu16 length;\n\tu32 runtime_services_supported;\n} efi_rt_properties_table_t;\n\ntypedef struct {\n\tu64 signature;\n\tu32 revision;\n\tu32 headersize;\n\tu32 crc32;\n\tu32 reserved;\n} efi_table_hdr_t;\n\ntypedef struct {\n\tefi_table_hdr_t hdr;\n\tu32 get_time;\n\tu32 set_time;\n\tu32 get_wakeup_time;\n\tu32 set_wakeup_time;\n\tu32 set_virtual_address_map;\n\tu32 convert_pointer;\n\tu32 get_variable;\n\tu32 get_next_variable;\n\tu32 set_variable;\n\tu32 get_next_high_mono_count;\n\tu32 reset_system;\n\tu32 update_capsule;\n\tu32 query_capsule_caps;\n\tu32 query_variable_info;\n} efi_runtime_services_32_t;\n\ntypedef struct {\n\tu16 year;\n\tu8 month;\n\tu8 day;\n\tu8 hour;\n\tu8 minute;\n\tu8 second;\n\tu8 pad1;\n\tu32 nanosecond;\n\ts16 timezone;\n\tu8 daylight;\n\tu8 pad2;\n} efi_time_t;\n\ntypedef struct {\n\tu32 resolution;\n\tu32 accuracy;\n\tu8 sets_to_zero;\n} efi_time_cap_t;\n\ntypedef union {\n\tstruct {\n\t\tefi_table_hdr_t hdr;\n\t\tefi_status_t (*get_time)(efi_time_t *, efi_time_cap_t *);\n\t\tefi_status_t (*set_time)(efi_time_t *);\n\t\tefi_status_t (*get_wakeup_time)(efi_bool_t *, efi_bool_t *, efi_time_t *);\n\t\tefi_status_t (*set_wakeup_time)(efi_bool_t, efi_time_t *);\n\t\tefi_status_t (*set_virtual_address_map)(long unsigned int, long unsigned int, u32, efi_memory_desc_t *);\n\t\tvoid *convert_pointer;\n\t\tefi_status_t (*get_variable)(efi_char16_t *, efi_guid_t *, u32 *, long unsigned int *, void *);\n\t\tefi_status_t (*get_next_variable)(long unsigned int *, efi_char16_t *, efi_guid_t *);\n\t\tefi_status_t (*set_variable)(efi_char16_t *, efi_guid_t *, u32, long unsigned int, void *);\n\t\tefi_status_t (*get_next_high_mono_count)(u32 *);\n\t\tvoid (*reset_system)(int, efi_status_t, long unsigned int, efi_char16_t *);\n\t\tefi_status_t (*update_capsule)(efi_capsule_header_t **, long unsigned int, long unsigned int);\n\t\tefi_status_t (*query_capsule_caps)(efi_capsule_header_t **, long unsigned int, u64 *, int *);\n\t\tefi_status_t (*query_variable_info)(u32, u64 *, u64 *, u64 *);\n\t};\n\tefi_runtime_services_32_t mixed_mode;\n} efi_runtime_services_t;\n\ntypedef struct {\n\tefi_guid_t signature_owner;\n\tu8 signature_data[0];\n} efi_signature_data_t;\n\ntypedef struct {\n\tefi_guid_t signature_type;\n\tu32 signature_list_size;\n\tu32 signature_header_size;\n\tu32 signature_size;\n\tu8 signature_header[0];\n} efi_signature_list_t;\n\ntypedef struct {\n\tefi_table_hdr_t hdr;\n\tu32 fw_vendor;\n\tu32 fw_revision;\n\tu32 con_in_handle;\n\tu32 con_in;\n\tu32 con_out_handle;\n\tu32 con_out;\n\tu32 stderr_handle;\n\tu32 stderr;\n\tu32 runtime;\n\tu32 boottime;\n\tu32 nr_tables;\n\tu32 tables;\n} efi_system_table_32_t;\n\ntypedef struct {\n\tefi_table_hdr_t hdr;\n\tu64 fw_vendor;\n\tu32 fw_revision;\n\tu32 __pad1;\n\tu64 con_in_handle;\n\tu64 con_in;\n\tu64 con_out_handle;\n\tu64 con_out;\n\tu64 stderr_handle;\n\tu64 stderr;\n\tu64 runtime;\n\tu64 boottime;\n\tu32 nr_tables;\n\tu32 __pad2;\n\tu64 tables;\n} efi_system_table_64_t;\n\nunion efi_simple_text_input_protocol;\n\ntypedef union efi_simple_text_input_protocol efi_simple_text_input_protocol_t;\n\nunion efi_simple_text_output_protocol;\n\ntypedef union efi_simple_text_output_protocol efi_simple_text_output_protocol_t;\n\nunion efi_boot_services;\n\ntypedef union efi_boot_services efi_boot_services_t;\n\ntypedef union {\n\tstruct {\n\t\tefi_table_hdr_t hdr;\n\t\tlong unsigned int fw_vendor;\n\t\tu32 fw_revision;\n\t\tlong unsigned int con_in_handle;\n\t\tefi_simple_text_input_protocol_t *con_in;\n\t\tlong unsigned int con_out_handle;\n\t\tefi_simple_text_output_protocol_t *con_out;\n\t\tlong unsigned int stderr_handle;\n\t\tlong unsigned int stderr;\n\t\tefi_runtime_services_t *runtime;\n\t\tefi_boot_services_t *boottime;\n\t\tlong unsigned int nr_tables;\n\t\tlong unsigned int tables;\n\t};\n\tefi_system_table_32_t mixed_mode;\n} efi_system_table_t;\n\ntypedef struct {\n\t__le16 e_tag;\n\t__le16 e_perm;\n\t__le32 e_id;\n} ext4_acl_entry;\n\ntypedef struct {\n\t__le32 a_version;\n} ext4_acl_header;\n\ntypedef __kernel_fd_set fd_set;\n\ntypedef struct {\n\tlong unsigned int *in;\n\tlong unsigned int *out;\n\tlong unsigned int *ex;\n\tlong unsigned int *res_in;\n\tlong unsigned int *res_out;\n\tlong unsigned int *res_ex;\n} fd_set_bits;\n\ntypedef struct {\n\tunsigned int t391;\n\tunsigned int t392;\n\tunsigned int n391;\n\tunsigned int n392;\n\tunsigned int n393;\n\tshort unsigned int lmi;\n\tshort unsigned int dce;\n} fr_proto;\n\ntypedef struct {\n\tunsigned int dlci;\n} fr_proto_pvc;\n\ntypedef struct {\n\tunsigned int dlci;\n\tchar master[16];\n} fr_proto_pvc_info;\n\ntypedef union {\n\tstruct {\n\t\tvoid *freelist;\n\t\tlong unsigned int counter;\n\t};\n\tfreelist_full_t full;\n} freelist_aba_t;\n\ntypedef struct {\n\tlong unsigned int v;\n} freeptr_t;\n\ntypedef struct {\n\tlong unsigned int key[2];\n} hsiphash_key_t;\n\ntypedef struct {\n\tu8 kvm_cpu_l1tf_flush_l1d;\n\tunsigned int __nmi_count;\n\tunsigned int apic_timer_irqs;\n\tunsigned int irq_spurious_count;\n\tunsigned int icr_read_retry_count;\n\tunsigned int kvm_posted_intr_ipis;\n\tunsigned int kvm_posted_intr_wakeup_ipis;\n\tunsigned int kvm_posted_intr_nested_ipis;\n\tunsigned int x86_platform_ipis;\n\tunsigned int apic_perf_irqs;\n\tunsigned int apic_irq_work_irqs;\n\tunsigned int irq_resched_count;\n\tunsigned int irq_call_count;\n\tunsigned int irq_tlb_count;\n\tunsigned int irq_thermal_count;\n\tunsigned int irq_threshold_count;\n\tunsigned int irq_deferred_error_count;\n\tunsigned int irq_hv_callback_count;\n\tunsigned int irq_hv_reenlightenment_count;\n\tunsigned int hyperv_stimer0_count;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n} irq_cpustat_t;\n\ntypedef struct {\n\tu64 val;\n} kernel_cap_t;\n\ntypedef struct {\n\tgid_t val;\n} kgid_t;\n\ntypedef struct {\n\tuid_t val;\n} kuid_t;\n\ntypedef union {\n\tkuid_t uid;\n\tkgid_t gid;\n} kid_t;\n\ntypedef struct {\n\tprojid_t val;\n} kprojid_t;\n\ntypedef struct {\n\tU32 offset;\n\tU32 checksum;\n} ldmEntry_t;\n\ntypedef struct {\n\tconst BYTE *split;\n\tU32 hash;\n\tU32 checksum;\n\tldmEntry_t *bucket;\n} ldmMatchCandidate_t;\n\ntypedef struct {\n\tZSTD_paramSwitch_e enableLdm;\n\tU32 hashLog;\n\tU32 bucketSizeLog;\n\tU32 minMatchLength;\n\tU32 hashRateLog;\n\tU32 windowLog;\n} ldmParams_t;\n\ntypedef struct {\n\tU64 rolling;\n\tU64 stopMask;\n} ldmRollingHashState_t;\n\ntypedef struct {\n\tZSTD_window_t window;\n\tldmEntry_t *hashTable;\n\tU32 loadedDictEnd;\n\tBYTE *bucketOffsets;\n\tsize_t splitIndices[64];\n\tldmMatchCandidate_t matchCandidates[64];\n} ldmState_t;\n\ntypedef struct {\n\t__le64 b;\n\t__le64 a;\n} le128;\n\ntypedef struct {\n\tatomic_long_t a;\n} local_t;\n\ntypedef struct {\n\tlocal_t a;\n} local64_t;\n\ntypedef struct {} local_lock_t;\n\ntypedef struct {} lockdep_map_p;\n\nstruct optimistic_spin_queue {\n\tatomic_t tail;\n};\n\nstruct raw_spinlock {\n\tarch_spinlock_t raw_lock;\n};\n\nstruct list_head {\n\tstruct list_head *next;\n\tstruct list_head *prev;\n};\n\nstruct rw_semaphore {\n\tatomic_long_t count;\n\tatomic_long_t owner;\n\tstruct optimistic_spin_queue osq;\n\traw_spinlock_t wait_lock;\n\tstruct list_head wait_list;\n};\n\nstruct mutex {\n\tatomic_long_t owner;\n\traw_spinlock_t wait_lock;\n\tstruct optimistic_spin_queue osq;\n\tstruct list_head wait_list;\n};\n\nstruct ldt_struct;\n\nstruct vdso_image;\n\ntypedef struct {\n\tu64 ctx_id;\n\tatomic64_t tlb_gen;\n\tstruct rw_semaphore ldt_usr_sem;\n\tstruct ldt_struct *ldt;\n\tlong unsigned int flags;\n\tstruct mutex lock;\n\tvoid *vdso;\n\tconst struct vdso_image *vdso_image;\n\tatomic_t perf_rdpmc_allowed;\n\tu16 pkey_allocation_map;\n\ts16 execute_only_pkey;\n} mm_context_t;\n\ntypedef struct {} netdevice_tracker;\n\ntypedef struct {} netns_tracker;\n\ntypedef struct {\n\tchar data[8];\n} nfs4_verifier;\n\ntypedef struct {\n\tlong unsigned int bits[16];\n} nodemask_t;\n\ntypedef struct {\n\tp4dval_t p4d;\n} p4d_t;\n\ntypedef struct {\n\tu64 pme;\n} pagemap_entry_t;\n\ntypedef struct {\n\tu64 val;\n} pfn_t;\n\ntypedef struct {\n\tpgdval_t pgd;\n} pgd_t;\n\ntypedef struct {\n\tpmdval_t pmd;\n} pmd_t;\n\ntypedef struct {\n\tlong unsigned int bits[4];\n} pnp_irq_mask_t;\n\nstruct net;\n\ntypedef struct {\n\tstruct net *net;\n} possible_net_t;\n\ntypedef struct {\n\tpteval_t pte;\n} pte_t;\n\ntypedef struct {\n\tpudval_t pud;\n} pud_t;\n\ntypedef struct {\n\tshort unsigned int encoding;\n\tshort unsigned int parity;\n} raw_hdlc_proto;\n\ntypedef struct {\n\tatomic_t refcnt;\n} rcuref_t;\n\ntypedef struct {\n\tsize_t written;\n\tsize_t count;\n\tunion {\n\t\tchar *buf;\n\t\tvoid *data;\n\t} arg;\n\tint error;\n} read_descriptor_t;\n\ntypedef union {\n} release_pages_arg;\n\ntypedef struct {\n\t__u16 report_key_length;\n\t__u8 reserved1;\n\t__u8 reserved2;\n\t__u8 ucca: 3;\n\t__u8 vra: 3;\n\t__u8 type_code: 2;\n\t__u8 region_mask;\n\t__u8 rpc_scheme;\n\t__u8 reserved3;\n} rpc_state_t;\n\ntypedef struct {\n\tBIT_DStream_t DStream;\n\tZSTD_fseState stateLL;\n\tZSTD_fseState stateOffb;\n\tZSTD_fseState stateML;\n\tsize_t prevOffset[3];\n} seqState_t;\n\ntypedef struct {\n\tU32 *splitLocations;\n\tsize_t idx;\n} seqStoreSplits;\n\ntypedef struct {\n\tsize_t litLength;\n\tsize_t matchLength;\n\tsize_t offset;\n} seq_t;\n\nstruct seqcount {\n\tunsigned int sequence;\n};\n\ntypedef struct seqcount seqcount_t;\n\ntypedef struct {\n\tseqcount_t seqcount;\n} seqcount_latch_t;\n\nstruct seqcount_spinlock {\n\tseqcount_t seqcount;\n};\n\ntypedef struct seqcount_spinlock seqcount_spinlock_t;\n\nstruct spinlock {\n\tunion {\n\t\tstruct raw_spinlock rlock;\n\t};\n};\n\ntypedef struct {\n\tseqcount_spinlock_t seqcount;\n\tspinlock_t lock;\n} seqlock_t;\n\ntypedef struct {\n\tlong unsigned int sig[1];\n} sigset_t;\n\ntypedef struct {\n\tu64 key[2];\n} siphash_key_t;\n\nstruct wait_queue_head {\n\tspinlock_t lock;\n\tstruct list_head head;\n};\n\ntypedef struct wait_queue_head wait_queue_head_t;\n\ntypedef struct {\n\tspinlock_t slock;\n\tint owned;\n\twait_queue_head_t wq;\n} socket_lock_t;\n\ntypedef struct {\n\tchar *from;\n\tchar *to;\n} substring_t;\n\ntypedef struct {\n\tlong unsigned int val;\n} swp_entry_t;\n\ntypedef struct {\n\tunsigned int clock_rate;\n\tunsigned int clock_type;\n\tshort unsigned int loopback;\n} sync_serial_settings;\n\ntypedef struct {\n\tunsigned int clock_rate;\n\tunsigned int clock_type;\n\tshort unsigned int loopback;\n\tunsigned int slot_map;\n} te1_settings;\n\nstruct mm_struct;\n\ntypedef struct {\n\tstruct mm_struct *mm;\n} temp_mm_state_t;\n\ntypedef struct {\n\t__be16 track_information_length;\n\t__u8 track_lsb;\n\t__u8 session_lsb;\n\t__u8 reserved1;\n\t__u8 track_mode: 4;\n\t__u8 copy: 1;\n\t__u8 damage: 1;\n\t__u8 reserved2: 2;\n\t__u8 data_mode: 4;\n\t__u8 fp: 1;\n\t__u8 packet: 1;\n\t__u8 blank: 1;\n\t__u8 rt: 1;\n\t__u8 nwa_v: 1;\n\t__u8 lra_v: 1;\n\t__u8 reserved3: 6;\n\t__be32 track_start;\n\t__be32 next_writable;\n\t__be32 free_blocks;\n\t__be32 fixed_packet_size;\n\t__be32 track_size;\n\t__be32 last_rec_address;\n} track_information;\n\ntypedef struct {\n\tint data;\n\tint audio;\n\tint cdi;\n\tint xa;\n\tlong int error;\n} tracktype;\n\ntypedef struct {\n\tlocal64_t v;\n} u64_stats_t;\n\ntypedef struct {\n\tu64 m_low;\n\tu64 m_high;\n} uint128_t;\n\ntypedef struct {\n\t__u8 b[16];\n} uuid_t;\n\ntypedef struct {\n\tgid_t val;\n} vfsgid_t;\n\ntypedef struct {\n\tuid_t val;\n} vfsuid_t;\n\ntypedef struct {\n\tshort unsigned int dce;\n\tunsigned int modulo;\n\tunsigned int window;\n\tunsigned int t1;\n\tunsigned int t2;\n\tunsigned int n2;\n} x25_hdlc_proto;\n\nstruct in6_addr {\n\tunion {\n\t\t__u8 u6_addr8[16];\n\t\t__be16 u6_addr16[8];\n\t\t__be32 u6_addr32[4];\n\t} in6_u;\n};\n\ntypedef union {\n\t__be32 a4;\n\t__be32 a6[4];\n\tstruct in6_addr in6;\n} xfrm_address_t;\n\ntypedef ZSTD_compressionParameters zstd_compression_parameters;\n\ntypedef ZSTD_frameHeader zstd_frame_header;\n\ntypedef ZSTD_parameters zstd_parameters;\n\nunion IO_APIC_reg_00 {\n\tu32 raw;\n\tstruct {\n\t\tu32 __reserved_2: 14;\n\t\tu32 LTS: 1;\n\t\tu32 delivery_type: 1;\n\t\tu32 __reserved_1: 8;\n\t\tu32 ID: 8;\n\t} bits;\n};\n\nunion IO_APIC_reg_01 {\n\tu32 raw;\n\tstruct {\n\t\tu32 version: 8;\n\t\tu32 __reserved_2: 7;\n\t\tu32 PRQ: 1;\n\t\tu32 entries: 8;\n\t\tu32 __reserved_1: 8;\n\t} bits;\n};\n\nunion IO_APIC_reg_02 {\n\tu32 raw;\n\tstruct {\n\t\tu32 __reserved_2: 24;\n\t\tu32 arbitration: 4;\n\t\tu32 __reserved_1: 4;\n\t} bits;\n};\n\nunion IO_APIC_reg_03 {\n\tu32 raw;\n\tstruct {\n\t\tu32 boot_DT: 1;\n\t\tu32 __reserved_1: 31;\n\t} bits;\n};\n\nstruct IO_APIC_route_entry {\n\tunion {\n\t\tstruct {\n\t\t\tu64 vector: 8;\n\t\t\tu64 delivery_mode: 3;\n\t\t\tu64 dest_mode_logical: 1;\n\t\t\tu64 delivery_status: 1;\n\t\t\tu64 active_low: 1;\n\t\t\tu64 irr: 1;\n\t\t\tu64 is_level: 1;\n\t\t\tu64 masked: 1;\n\t\t\tu64 reserved_0: 15;\n\t\t\tu64 reserved_1: 17;\n\t\t\tu64 virt_destid_8_14: 7;\n\t\t\tu64 destid_0_7: 8;\n\t\t};\n\t\tstruct {\n\t\t\tu64 ir_shared_0: 8;\n\t\t\tu64 ir_zero: 3;\n\t\t\tu64 ir_index_15: 1;\n\t\t\tu64 ir_shared_1: 5;\n\t\t\tu64 ir_reserved_0: 31;\n\t\t\tu64 ir_format: 1;\n\t\t\tu64 ir_index_0_14: 15;\n\t\t};\n\t\tstruct {\n\t\t\tu64 w1: 32;\n\t\t\tu64 w2: 32;\n\t\t};\n\t};\n};\n\nstruct PartitionBlock {\n\t__be32 pb_ID;\n\t__be32 pb_SummedLongs;\n\t__be32 pb_ChkSum;\n\t__be32 pb_HostID;\n\t__be32 pb_Next;\n\t__be32 pb_Flags;\n\t__be32 pb_Reserved1[2];\n\t__be32 pb_DevFlags;\n\t__u8 pb_DriveName[32];\n\t__be32 pb_Reserved2[15];\n\t__be32 pb_Environment[17];\n\t__be32 pb_EReserved[15];\n};\n\nstruct hlist_node {\n\tstruct hlist_node *next;\n\tstruct hlist_node **pprev;\n};\n\nstruct refcount_struct {\n\tatomic_t refs;\n};\n\ntypedef struct refcount_struct refcount_t;\n\nstruct sk_buff;\n\nstruct sk_buff_list {\n\tstruct sk_buff *next;\n\tstruct sk_buff *prev;\n};\n\nstruct sk_buff_head {\n\tunion {\n\t\tstruct {\n\t\t\tstruct sk_buff *next;\n\t\t\tstruct sk_buff *prev;\n\t\t};\n\t\tstruct sk_buff_list list;\n\t};\n\t__u32 qlen;\n\tspinlock_t lock;\n};\n\nstruct qdisc_skb_head {\n\tstruct sk_buff *head;\n\tstruct sk_buff *tail;\n\t__u32 qlen;\n\tspinlock_t lock;\n};\n\nstruct u64_stats_sync {};\n\nstruct gnet_stats_basic_sync {\n\tu64_stats_t bytes;\n\tu64_stats_t packets;\n\tstruct u64_stats_sync syncp;\n};\n\nstruct gnet_stats_queue {\n\t__u32 qlen;\n\t__u32 backlog;\n\t__u32 drops;\n\t__u32 requeues;\n\t__u32 overlimits;\n};\n\nstruct callback_head {\n\tstruct callback_head *next;\n\tvoid (*func)(struct callback_head *);\n};\n\nstruct lock_class_key {};\n\nstruct Qdisc_ops;\n\nstruct qdisc_size_table;\n\nstruct netdev_queue;\n\nstruct net_rate_estimator;\n\nstruct Qdisc {\n\tint (*enqueue)(struct sk_buff *, struct Qdisc *, struct sk_buff **);\n\tstruct sk_buff * (*dequeue)(struct Qdisc *);\n\tunsigned int flags;\n\tu32 limit;\n\tconst struct Qdisc_ops *ops;\n\tstruct qdisc_size_table *stab;\n\tstruct hlist_node hash;\n\tu32 handle;\n\tu32 parent;\n\tstruct netdev_queue *dev_queue;\n\tstruct net_rate_estimator *rate_est;\n\tstruct gnet_stats_basic_sync *cpu_bstats;\n\tstruct gnet_stats_queue *cpu_qstats;\n\tint pad;\n\trefcount_t refcnt;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tstruct sk_buff_head gso_skb;\n\tstruct qdisc_skb_head q;\n\tstruct gnet_stats_basic_sync bstats;\n\tstruct gnet_stats_queue qstats;\n\tint owner;\n\tlong unsigned int state;\n\tlong unsigned int state2;\n\tstruct Qdisc *next_sched;\n\tstruct sk_buff_head skb_bad_txq;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tspinlock_t busylock;\n\tspinlock_t seqlock;\n\tstruct callback_head rcu;\n\tnetdevice_tracker dev_tracker;\n\tstruct lock_class_key root_lock_key;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong int privdata[0];\n};\n\nstruct Qdisc_class_common {\n\tu32 classid;\n\tunsigned int filter_cnt;\n\tstruct hlist_node hnode;\n};\n\nstruct hlist_head;\n\nstruct Qdisc_class_hash {\n\tstruct hlist_head *hash;\n\tunsigned int hashsize;\n\tunsigned int hashmask;\n\tunsigned int hashelems;\n};\n\nstruct tcmsg;\n\nstruct netlink_ext_ack;\n\nstruct nlattr;\n\nstruct qdisc_walker;\n\nstruct tcf_block;\n\nstruct gnet_dump;\n\nstruct Qdisc_class_ops {\n\tunsigned int flags;\n\tstruct netdev_queue * (*select_queue)(struct Qdisc *, struct tcmsg *);\n\tint (*graft)(struct Qdisc *, long unsigned int, struct Qdisc *, struct Qdisc **, struct netlink_ext_ack *);\n\tstruct Qdisc * (*leaf)(struct Qdisc *, long unsigned int);\n\tvoid (*qlen_notify)(struct Qdisc *, long unsigned int);\n\tlong unsigned int (*find)(struct Qdisc *, u32);\n\tint (*change)(struct Qdisc *, u32, u32, struct nlattr **, long unsigned int *, struct netlink_ext_ack *);\n\tint (*delete)(struct Qdisc *, long unsigned int, struct netlink_ext_ack *);\n\tvoid (*walk)(struct Qdisc *, struct qdisc_walker *);\n\tstruct tcf_block * (*tcf_block)(struct Qdisc *, long unsigned int, struct netlink_ext_ack *);\n\tlong unsigned int (*bind_tcf)(struct Qdisc *, long unsigned int, u32);\n\tvoid (*unbind_tcf)(struct Qdisc *, long unsigned int);\n\tint (*dump)(struct Qdisc *, long unsigned int, struct sk_buff *, struct tcmsg *);\n\tint (*dump_stats)(struct Qdisc *, long unsigned int, struct gnet_dump *);\n};\n\nstruct module;\n\nstruct Qdisc_ops {\n\tstruct Qdisc_ops *next;\n\tconst struct Qdisc_class_ops *cl_ops;\n\tchar id[16];\n\tint priv_size;\n\tunsigned int static_flags;\n\tint (*enqueue)(struct sk_buff *, struct Qdisc *, struct sk_buff **);\n\tstruct sk_buff * (*dequeue)(struct Qdisc *);\n\tstruct sk_buff * (*peek)(struct Qdisc *);\n\tint (*init)(struct Qdisc *, struct nlattr *, struct netlink_ext_ack *);\n\tvoid (*reset)(struct Qdisc *);\n\tvoid (*destroy)(struct Qdisc *);\n\tint (*change)(struct Qdisc *, struct nlattr *, struct netlink_ext_ack *);\n\tvoid (*attach)(struct Qdisc *);\n\tint (*change_tx_queue_len)(struct Qdisc *, unsigned int);\n\tvoid (*change_real_num_tx)(struct Qdisc *, unsigned int);\n\tint (*dump)(struct Qdisc *, struct sk_buff *);\n\tint (*dump_stats)(struct Qdisc *, struct gnet_dump *);\n\tvoid (*ingress_block_set)(struct Qdisc *, u32);\n\tvoid (*egress_block_set)(struct Qdisc *, u32);\n\tu32 (*ingress_block_get)(struct Qdisc *);\n\tu32 (*egress_block_get)(struct Qdisc *);\n\tstruct module *owner;\n};\n\nstruct RigidDiskBlock {\n\t__be32 rdb_ID;\n\t__be32 rdb_SummedLongs;\n\t__be32 rdb_ChkSum;\n\t__be32 rdb_HostID;\n\t__be32 rdb_BlockBytes;\n\t__be32 rdb_Flags;\n\t__be32 rdb_BadBlockList;\n\t__be32 rdb_PartitionList;\n\t__be32 rdb_FileSysHeaderList;\n\t__be32 rdb_DriveInit;\n\t__be32 rdb_Reserved1[6];\n\t__be32 rdb_Cylinders;\n\t__be32 rdb_Sectors;\n\t__be32 rdb_Heads;\n\t__be32 rdb_Interleave;\n\t__be32 rdb_Park;\n\t__be32 rdb_Reserved2[3];\n\t__be32 rdb_WritePreComp;\n\t__be32 rdb_ReducedWrite;\n\t__be32 rdb_StepRate;\n\t__be32 rdb_Reserved3[5];\n\t__be32 rdb_RDBBlocksLo;\n\t__be32 rdb_RDBBlocksHi;\n\t__be32 rdb_LoCylinder;\n\t__be32 rdb_HiCylinder;\n\t__be32 rdb_CylBlocks;\n\t__be32 rdb_AutoParkSeconds;\n\t__be32 rdb_HighRDSKBlock;\n\t__be32 rdb_Reserved4;\n\tchar rdb_DiskVendor[8];\n\tchar rdb_DiskProduct[16];\n\tchar rdb_DiskRevision[4];\n\tchar rdb_ControllerVendor[8];\n\tchar rdb_ControllerProduct[16];\n\tchar rdb_ControllerRevision[4];\n\t__be32 rdb_Reserved5[10];\n};\n\nstruct kref {\n\trefcount_t refcount;\n};\n\nstruct swait_queue_head {\n\traw_spinlock_t lock;\n\tstruct list_head task_list;\n};\n\nstruct completion {\n\tunsigned int done;\n\tstruct swait_queue_head wait;\n};\n\nstruct blk_mq_queue_map {\n\tunsigned int *mq_map;\n\tunsigned int nr_queues;\n\tunsigned int queue_offset;\n};\n\nstruct blk_mq_ops;\n\nstruct blk_mq_tags;\n\nstruct blk_mq_tag_set {\n\tconst struct blk_mq_ops *ops;\n\tstruct blk_mq_queue_map map[3];\n\tunsigned int nr_maps;\n\tunsigned int nr_hw_queues;\n\tunsigned int queue_depth;\n\tunsigned int reserved_tags;\n\tunsigned int cmd_size;\n\tint numa_node;\n\tunsigned int timeout;\n\tunsigned int flags;\n\tvoid *driver_data;\n\tstruct blk_mq_tags **tags;\n\tstruct blk_mq_tags *shared_tags;\n\tstruct mutex tag_list_lock;\n\tstruct list_head tag_list;\n\tstruct srcu_struct *srcu;\n};\n\nstruct kset;\n\nstruct kobj_type;\n\nstruct kernfs_node;\n\nstruct kobject {\n\tconst char *name;\n\tstruct list_head entry;\n\tstruct kobject *parent;\n\tstruct kset *kset;\n\tconst struct kobj_type *ktype;\n\tstruct kernfs_node *sd;\n\tstruct kref kref;\n\tunsigned int state_initialized: 1;\n\tunsigned int state_in_sysfs: 1;\n\tunsigned int state_add_uevent_sent: 1;\n\tunsigned int state_remove_uevent_sent: 1;\n\tunsigned int uevent_suppress: 1;\n};\n\nstruct dev_links_info {\n\tstruct list_head suppliers;\n\tstruct list_head consumers;\n\tstruct list_head defer_sync;\n\tenum dl_dev_state status;\n};\n\nstruct pm_message {\n\tint event;\n};\n\ntypedef struct pm_message pm_message_t;\n\nstruct rb_node {\n\tlong unsigned int __rb_parent_color;\n\tstruct rb_node *rb_right;\n\tstruct rb_node *rb_left;\n};\n\nstruct timerqueue_node {\n\tstruct rb_node node;\n\tktime_t expires;\n};\n\nstruct hrtimer_clock_base;\n\nstruct hrtimer {\n\tstruct timerqueue_node node;\n\tktime_t _softexpires;\n\tenum hrtimer_restart (*function)(struct hrtimer *);\n\tstruct hrtimer_clock_base *base;\n\tu8 state;\n\tu8 is_rel;\n\tu8 is_soft;\n\tu8 is_hard;\n};\n\nstruct work_struct;\n\ntypedef void (*work_func_t)(struct work_struct *);\n\nstruct work_struct {\n\tatomic_long_t data;\n\tstruct list_head entry;\n\twork_func_t func;\n};\n\nstruct wakeup_source;\n\nstruct wake_irq;\n\nstruct pm_subsys_data;\n\nstruct device;\n\nstruct dev_pm_qos;\n\nstruct dev_pm_info {\n\tpm_message_t power_state;\n\tbool can_wakeup: 1;\n\tbool async_suspend: 1;\n\tbool in_dpm_list: 1;\n\tbool is_prepared: 1;\n\tbool is_suspended: 1;\n\tbool is_noirq_suspended: 1;\n\tbool is_late_suspended: 1;\n\tbool no_pm: 1;\n\tbool early_init: 1;\n\tbool direct_complete: 1;\n\tu32 driver_flags;\n\tspinlock_t lock;\n\tstruct list_head entry;\n\tstruct completion completion;\n\tstruct wakeup_source *wakeup;\n\tbool wakeup_path: 1;\n\tbool syscore: 1;\n\tbool no_pm_callbacks: 1;\n\tbool async_in_progress: 1;\n\tbool must_resume: 1;\n\tbool may_skip_resume: 1;\n\tstruct hrtimer suspend_timer;\n\tu64 timer_expires;\n\tstruct work_struct work;\n\twait_queue_head_t wait_queue;\n\tstruct wake_irq *wakeirq;\n\tatomic_t usage_count;\n\tatomic_t child_count;\n\tunsigned int disable_depth: 3;\n\tbool idle_notification: 1;\n\tbool request_pending: 1;\n\tbool deferred_resume: 1;\n\tbool needs_force_resume: 1;\n\tbool runtime_auto: 1;\n\tbool ignore_children: 1;\n\tbool no_callbacks: 1;\n\tbool irq_safe: 1;\n\tbool use_autosuspend: 1;\n\tbool timer_autosuspends: 1;\n\tbool memalloc_noio: 1;\n\tunsigned int links_count;\n\tenum rpm_request request;\n\tenum rpm_status runtime_status;\n\tenum rpm_status last_status;\n\tint runtime_error;\n\tint autosuspend_delay;\n\tu64 last_busy;\n\tu64 active_time;\n\tu64 suspended_time;\n\tu64 accounting_timestamp;\n\tstruct pm_subsys_data *subsys_data;\n\tvoid (*set_latency_tolerance)(struct device *, s32);\n\tstruct dev_pm_qos *qos;\n};\n\nstruct irq_domain;\n\nstruct msi_device_data;\n\nstruct dev_msi_info {\n\tstruct irq_domain *domain;\n\tstruct msi_device_data *data;\n};\n\nstruct dev_archdata {};\n\nstruct device_private;\n\nstruct device_type;\n\nstruct bus_type;\n\nstruct device_driver;\n\nstruct dev_pm_domain;\n\nstruct em_perf_domain;\n\nstruct dev_pin_info;\n\nstruct dma_map_ops;\n\nstruct bus_dma_region;\n\nstruct device_dma_parameters;\n\nstruct io_tlb_mem;\n\nstruct device_node;\n\nstruct fwnode_handle;\n\nstruct class;\n\nstruct attribute_group;\n\nstruct iommu_group;\n\nstruct dev_iommu;\n\nstruct device_physical_location;\n\nstruct device {\n\tstruct kobject kobj;\n\tstruct device *parent;\n\tstruct device_private *p;\n\tconst char *init_name;\n\tconst struct device_type *type;\n\tconst struct bus_type *bus;\n\tstruct device_driver *driver;\n\tvoid *platform_data;\n\tvoid *driver_data;\n\tstruct mutex mutex;\n\tstruct dev_links_info links;\n\tstruct dev_pm_info power;\n\tstruct dev_pm_domain *pm_domain;\n\tstruct em_perf_domain *em_pd;\n\tstruct dev_pin_info *pins;\n\tstruct dev_msi_info msi;\n\tconst struct dma_map_ops *dma_ops;\n\tu64 *dma_mask;\n\tu64 coherent_dma_mask;\n\tu64 bus_dma_limit;\n\tconst struct bus_dma_region *dma_range_map;\n\tstruct device_dma_parameters *dma_parms;\n\tstruct list_head dma_pools;\n\tstruct io_tlb_mem *dma_io_tlb_mem;\n\tstruct list_head dma_io_tlb_pools;\n\tspinlock_t dma_io_tlb_lock;\n\tbool dma_uses_io_tlb;\n\tstruct dev_archdata archdata;\n\tstruct device_node *of_node;\n\tstruct fwnode_handle *fwnode;\n\tint numa_node;\n\tdev_t devt;\n\tu32 id;\n\tspinlock_t devres_lock;\n\tstruct list_head devres_head;\n\tconst struct class *class;\n\tconst struct attribute_group **groups;\n\tvoid (*release)(struct device *);\n\tstruct iommu_group *iommu_group;\n\tstruct dev_iommu *iommu;\n\tstruct device_physical_location *physical_location;\n\tenum device_removable removable;\n\tbool offline_disabled: 1;\n\tbool offline: 1;\n\tbool of_node_reused: 1;\n\tbool state_synced: 1;\n\tbool can_match: 1;\n\tbool dma_skip_sync: 1;\n};\n\nstruct scsi_host_template;\n\nstruct scsi_transport_template;\n\nstruct workqueue_struct;\n\nstruct Scsi_Host {\n\tstruct list_head __devices;\n\tstruct list_head __targets;\n\tstruct list_head starved_list;\n\tspinlock_t default_lock;\n\tspinlock_t *host_lock;\n\tstruct mutex scan_mutex;\n\tstruct list_head eh_abort_list;\n\tstruct list_head eh_cmd_q;\n\tstruct task_struct *ehandler;\n\tstruct completion *eh_action;\n\twait_queue_head_t host_wait;\n\tconst struct scsi_host_template *hostt;\n\tstruct scsi_transport_template *transportt;\n\tstruct kref tagset_refcnt;\n\tstruct completion tagset_freed;\n\tstruct blk_mq_tag_set tag_set;\n\tatomic_t host_blocked;\n\tunsigned int host_failed;\n\tunsigned int host_eh_scheduled;\n\tunsigned int host_no;\n\tint eh_deadline;\n\tlong unsigned int last_reset;\n\tunsigned int max_channel;\n\tunsigned int max_id;\n\tu64 max_lun;\n\tunsigned int unique_id;\n\tshort unsigned int max_cmd_len;\n\tint this_id;\n\tint can_queue;\n\tshort int cmd_per_lun;\n\tshort unsigned int sg_tablesize;\n\tshort unsigned int sg_prot_tablesize;\n\tunsigned int max_sectors;\n\tunsigned int opt_sectors;\n\tunsigned int max_segment_size;\n\tunsigned int dma_alignment;\n\tlong unsigned int dma_boundary;\n\tlong unsigned int virt_boundary_mask;\n\tunsigned int nr_hw_queues;\n\tunsigned int nr_maps;\n\tunsigned int active_mode: 2;\n\tunsigned int host_self_blocked: 1;\n\tunsigned int reverse_ordering: 1;\n\tunsigned int tmf_in_progress: 1;\n\tunsigned int async_scan: 1;\n\tunsigned int eh_noresume: 1;\n\tunsigned int no_write_same: 1;\n\tunsigned int host_tagset: 1;\n\tunsigned int queuecommand_may_block: 1;\n\tunsigned int short_inquiry: 1;\n\tunsigned int no_scsi2_lun_in_cdb: 1;\n\tunsigned int no_highmem: 1;\n\tchar work_q_name[20];\n\tstruct workqueue_struct *work_q;\n\tstruct workqueue_struct *tmf_work_q;\n\tunsigned int max_host_blocked;\n\tunsigned int prot_capabilities;\n\tunsigned char prot_guard_type;\n\tlong unsigned int base;\n\tlong unsigned int io_port;\n\tunsigned char n_io_port;\n\tunsigned char dma_channel;\n\tunsigned int irq;\n\tenum scsi_host_state shost_state;\n\tstruct device shost_gendev;\n\tstruct device shost_dev;\n\tvoid *shost_data;\n\tstruct device *dma_dev;\n\tint rpm_autosuspend_delay;\n\tlong unsigned int hostdata[0];\n};\n\nstruct ZSTD_CCtx_params_s {\n\tZSTD_format_e format;\n\tZSTD_compressionParameters cParams;\n\tZSTD_frameParameters fParams;\n\tint compressionLevel;\n\tint forceWindow;\n\tsize_t targetCBlockSize;\n\tint srcSizeHint;\n\tZSTD_dictAttachPref_e attachDictPref;\n\tZSTD_paramSwitch_e literalCompressionMode;\n\tint nbWorkers;\n\tsize_t jobSize;\n\tint overlapLog;\n\tint rsyncable;\n\tldmParams_t ldmParams;\n\tint enableDedicatedDictSearch;\n\tZSTD_bufferMode_e inBufferMode;\n\tZSTD_bufferMode_e outBufferMode;\n\tZSTD_sequenceFormat_e blockDelimiters;\n\tint validateSequences;\n\tZSTD_paramSwitch_e useBlockSplitter;\n\tZSTD_paramSwitch_e useRowMatchFinder;\n\tint deterministicRefPrefix;\n\tZSTD_customMem customMem;\n};\n\ntypedef struct ZSTD_CCtx_params_s ZSTD_CCtx_params;\n\nstruct xxh64_state {\n\tuint64_t total_len;\n\tuint64_t v1;\n\tuint64_t v2;\n\tuint64_t v3;\n\tuint64_t v4;\n\tuint64_t mem64[4];\n\tuint32_t memsize;\n};\n\nstruct POOL_ctx_s;\n\ntypedef struct POOL_ctx_s ZSTD_threadPool;\n\nstruct ZSTD_inBuffer_s {\n\tconst void *src;\n\tsize_t size;\n\tsize_t pos;\n};\n\ntypedef struct ZSTD_inBuffer_s ZSTD_inBuffer;\n\nstruct ZSTD_prefixDict_s {\n\tconst void *dict;\n\tsize_t dictSize;\n\tZSTD_dictContentType_e dictContentType;\n};\n\ntypedef struct ZSTD_prefixDict_s ZSTD_prefixDict;\n\nstruct ZSTD_CCtx_s {\n\tZSTD_compressionStage_e stage;\n\tint cParamsChanged;\n\tint bmi2;\n\tZSTD_CCtx_params requestedParams;\n\tZSTD_CCtx_params appliedParams;\n\tZSTD_CCtx_params simpleApiParams;\n\tU32 dictID;\n\tsize_t dictContentSize;\n\tZSTD_cwksp workspace;\n\tsize_t blockSize;\n\tlong long unsigned int pledgedSrcSizePlusOne;\n\tlong long unsigned int consumedSrcSize;\n\tlong long unsigned int producedCSize;\n\tstruct xxh64_state xxhState;\n\tZSTD_customMem customMem;\n\tZSTD_threadPool *pool;\n\tsize_t staticSize;\n\tSeqCollector seqCollector;\n\tint isFirstBlock;\n\tint initialized;\n\tseqStore_t seqStore;\n\tldmState_t ldmState;\n\trawSeq *ldmSequences;\n\tsize_t maxNbLdmSequences;\n\trawSeqStore_t externSeqStore;\n\tZSTD_blockState_t blockState;\n\tU32 *entropyWorkspace;\n\tZSTD_buffered_policy_e bufferedPolicy;\n\tchar *inBuff;\n\tsize_t inBuffSize;\n\tsize_t inToCompress;\n\tsize_t inBuffPos;\n\tsize_t inBuffTarget;\n\tchar *outBuff;\n\tsize_t outBuffSize;\n\tsize_t outBuffContentSize;\n\tsize_t outBuffFlushedSize;\n\tZSTD_cStreamStage streamStage;\n\tU32 frameEnded;\n\tZSTD_inBuffer expectedInBuffer;\n\tsize_t expectedOutBufferSize;\n\tZSTD_localDict localDict;\n\tconst ZSTD_CDict *cdict;\n\tZSTD_prefixDict prefixDict;\n\tZSTD_blockSplitCtx blockSplitCtx;\n};\n\ntypedef struct ZSTD_CCtx_s ZSTD_CCtx;\n\ntypedef ZSTD_CCtx ZSTD_CStream;\n\ntypedef ZSTD_CCtx zstd_cctx;\n\ntypedef ZSTD_CStream zstd_cstream;\n\nstruct ZSTD_CDict_s {\n\tconst void *dictContent;\n\tsize_t dictContentSize;\n\tZSTD_dictContentType_e dictContentType;\n\tU32 *entropyWorkspace;\n\tZSTD_cwksp workspace;\n\tZSTD_matchState_t matchState;\n\tZSTD_compressedBlockState_t cBlockState;\n\tZSTD_customMem customMem;\n\tU32 dictID;\n\tint compressionLevel;\n\tZSTD_paramSwitch_e useRowMatchFinder;\n};\n\nstruct ZSTD_outBuffer_s {\n\tvoid *dst;\n\tsize_t size;\n\tsize_t pos;\n};\n\ntypedef struct ZSTD_outBuffer_s ZSTD_outBuffer;\n\nstruct ZSTD_DCtx_s {\n\tconst ZSTD_seqSymbol *LLTptr;\n\tconst ZSTD_seqSymbol *MLTptr;\n\tconst ZSTD_seqSymbol *OFTptr;\n\tconst HUF_DTable *HUFptr;\n\tZSTD_entropyDTables_t entropy;\n\tU32 workspace[640];\n\tconst void *previousDstEnd;\n\tconst void *prefixStart;\n\tconst void *virtualStart;\n\tconst void *dictEnd;\n\tsize_t expected;\n\tZSTD_frameHeader fParams;\n\tU64 processedCSize;\n\tU64 decodedSize;\n\tblockType_e bType;\n\tZSTD_dStage stage;\n\tU32 litEntropy;\n\tU32 fseEntropy;\n\tstruct xxh64_state xxhState;\n\tsize_t headerSize;\n\tZSTD_format_e format;\n\tZSTD_forceIgnoreChecksum_e forceIgnoreChecksum;\n\tU32 validateChecksum;\n\tconst BYTE *litPtr;\n\tZSTD_customMem customMem;\n\tsize_t litSize;\n\tsize_t rleSize;\n\tsize_t staticSize;\n\tint bmi2;\n\tZSTD_DDict *ddictLocal;\n\tconst ZSTD_DDict *ddict;\n\tU32 dictID;\n\tint ddictIsCold;\n\tZSTD_dictUses_e dictUses;\n\tZSTD_DDictHashSet *ddictSet;\n\tZSTD_refMultipleDDicts_e refMultipleDDicts;\n\tZSTD_dStreamStage streamStage;\n\tchar *inBuff;\n\tsize_t inBuffSize;\n\tsize_t inPos;\n\tsize_t maxWindowSize;\n\tchar *outBuff;\n\tsize_t outBuffSize;\n\tsize_t outStart;\n\tsize_t outEnd;\n\tsize_t lhSize;\n\tU32 hostageByte;\n\tint noForwardProgress;\n\tZSTD_bufferMode_e outBufferMode;\n\tZSTD_outBuffer expectedOutBuffer;\n\tBYTE *litBuffer;\n\tconst BYTE *litBufferEnd;\n\tZSTD_litLocation_e litBufferLocation;\n\tBYTE litExtraBuffer[65568];\n\tBYTE headerBuffer[18];\n\tsize_t oversizedDuration;\n};\n\ntypedef struct ZSTD_DCtx_s ZSTD_DCtx;\n\ntypedef ZSTD_DCtx ZSTD_DStream;\n\ntypedef ZSTD_DCtx zstd_dctx;\n\ntypedef ZSTD_DStream zstd_dstream;\n\nstruct ZSTD_DDict_s {\n\tvoid *dictBuffer;\n\tconst void *dictContent;\n\tsize_t dictSize;\n\tZSTD_entropyDTables_t entropy;\n\tU32 dictID;\n\tU32 entropyPresent;\n\tZSTD_customMem cMem;\n};\n\ntypedef ZSTD_inBuffer zstd_in_buffer;\n\ntypedef ZSTD_outBuffer zstd_out_buffer;\n\nstruct __aio_sigset {\n\tconst sigset_t *sigmask;\n\tsize_t sigsetsize;\n};\n\nstruct __arch_relative_insn {\n\tu8 op;\n\ts32 raddr;\n} __attribute__((packed));\n\nstruct llist_node {\n\tstruct llist_node *next;\n};\n\nstruct __call_single_node {\n\tstruct llist_node llist;\n\tunion {\n\t\tunsigned int u_flags;\n\t\tatomic_t a_flags;\n\t};\n\tu16 src;\n\tu16 dst;\n};\n\ntypedef void (*smp_call_func_t)(void *);\n\nstruct __call_single_data {\n\tstruct __call_single_node node;\n\tsmp_call_func_t func;\n\tvoid *info;\n};\n\ntypedef struct __call_single_data call_single_data_t;\n\nstruct cpumask;\n\nstruct __cmp_key {\n\tconst struct cpumask *cpus;\n\tstruct cpumask ***masks;\n\tint node;\n\tint cpu;\n\tint w;\n};\n\nstruct __compat_aio_sigset {\n\tcompat_uptr_t sigmask;\n\tcompat_size_t sigsetsize;\n};\n\nstruct __compat_iw_event {\n\t__u16 len;\n\t__u16 cmd;\n\tunion {\n\t\tcompat_caddr_t pointer;\n\t\tstruct {\n\t\t\tstruct {} __empty_ptr_bytes;\n\t\t\t__u8 ptr_bytes[0];\n\t\t};\n\t};\n};\n\nstruct drm_connector;\n\nstruct drm_connector_state;\n\nstruct __drm_connnectors_state {\n\tstruct drm_connector *ptr;\n\tstruct drm_connector_state *state;\n\tstruct drm_connector_state *old_state;\n\tstruct drm_connector_state *new_state;\n\ts32 *out_fence_ptr;\n};\n\nstruct drm_crtc;\n\nstruct drm_crtc_state;\n\nstruct drm_crtc_commit;\n\nstruct __drm_crtcs_state {\n\tstruct drm_crtc *ptr;\n\tstruct drm_crtc_state *state;\n\tstruct drm_crtc_state *old_state;\n\tstruct drm_crtc_state *new_state;\n\tstruct drm_crtc_commit *commit;\n\ts32 *out_fence_ptr;\n\tu64 last_vblank_count;\n};\n\nstruct drm_plane;\n\nstruct drm_plane_state;\n\nstruct __drm_planes_state {\n\tstruct drm_plane *ptr;\n\tstruct drm_plane_state *state;\n\tstruct drm_plane_state *old_state;\n\tstruct drm_plane_state *new_state;\n};\n\nstruct drm_private_obj;\n\nstruct drm_private_state;\n\nstruct __drm_private_objs_state {\n\tstruct drm_private_obj *ptr;\n\tstruct drm_private_state *state;\n\tstruct drm_private_state *old_state;\n\tstruct drm_private_state *new_state;\n};\n\nstruct __extcon_info {\n\tunsigned int type;\n\tunsigned int id;\n\tconst char *name;\n};\n\nstruct __fat_dirent {\n\tlong int d_ino;\n\t__kernel_off_t d_off;\n\tshort unsigned int d_reclen;\n\tchar d_name[256];\n};\n\nstruct __fb_timings {\n\tu32 dclk;\n\tu32 hfreq;\n\tu32 vfreq;\n\tu32 hactive;\n\tu32 vactive;\n\tu32 hblank;\n\tu32 vblank;\n\tu32 htotal;\n\tu32 vtotal;\n};\n\nstruct tracepoint;\n\nstruct __find_tracepoint_cb_data {\n\tconst char *tp_name;\n\tstruct tracepoint *tpoint;\n};\n\nstruct genradix_root;\n\nstruct __genradix {\n\tstruct genradix_root *root;\n};\n\nstruct pmu;\n\nstruct cgroup;\n\nstruct __group_key {\n\tint cpu;\n\tstruct pmu *pmu;\n\tstruct cgroup *cgroup;\n};\n\nstruct __ip6_tnl_parm {\n\tchar name[16];\n\tint link;\n\t__u8 proto;\n\t__u8 encap_limit;\n\t__u8 hop_limit;\n\tbool collect_md;\n\t__be32 flowinfo;\n\t__u32 flags;\n\tstruct in6_addr laddr;\n\tstruct in6_addr raddr;\n\tlong unsigned int i_flags[1];\n\tlong unsigned int o_flags[1];\n\t__be32 i_key;\n\t__be32 o_key;\n\t__u32 fwmark;\n\t__u32 index;\n\t__u8 erspan_ver;\n\t__u8 dir;\n\t__u16 hwid;\n};\n\nstruct __kernel_timespec {\n\t__kernel_time64_t tv_sec;\n\tlong long int tv_nsec;\n};\n\nstruct __kernel_itimerspec {\n\tstruct __kernel_timespec it_interval;\n\tstruct __kernel_timespec it_value;\n};\n\nstruct __kernel_old_timeval {\n\t__kernel_long_t tv_sec;\n\t__kernel_long_t tv_usec;\n};\n\nstruct __kernel_old_itimerval {\n\tstruct __kernel_old_timeval it_interval;\n\tstruct __kernel_old_timeval it_value;\n};\n\nstruct __kernel_old_timespec {\n\t__kernel_old_time_t tv_sec;\n\tlong int tv_nsec;\n};\n\nstruct __kernel_sock_timeval {\n\t__s64 tv_sec;\n\t__s64 tv_usec;\n};\n\nstruct __kernel_sockaddr_storage {\n\tunion {\n\t\tstruct {\n\t\t\t__kernel_sa_family_t ss_family;\n\t\t\tchar __data[126];\n\t\t};\n\t\tvoid *__align;\n\t};\n};\n\nstruct __kernel_timex_timeval {\n\t__kernel_time64_t tv_sec;\n\tlong long int tv_usec;\n};\n\nstruct __kernel_timex {\n\tunsigned int modes;\n\tlong long int offset;\n\tlong long int freq;\n\tlong long int maxerror;\n\tlong long int esterror;\n\tint status;\n\tlong long int constant;\n\tlong long int precision;\n\tlong long int tolerance;\n\tstruct __kernel_timex_timeval time;\n\tlong long int tick;\n\tlong long int ppsfreq;\n\tlong long int jitter;\n\tint shift;\n\tlong long int stabil;\n\tlong long int jitcnt;\n\tlong long int calcnt;\n\tlong long int errcnt;\n\tlong long int stbcnt;\n\tint tai;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct __kfifo {\n\tunsigned int in;\n\tunsigned int out;\n\tunsigned int mask;\n\tunsigned int esize;\n\tvoid *data;\n};\n\nstruct __ksymtab {\n\tlong unsigned int value;\n\tconst char *mod_name;\n\tlong unsigned int mod_start;\n\tlong unsigned int mod_end;\n\tconst char *sec_name;\n\tlong unsigned int sec_start;\n\tlong unsigned int sec_end;\n\tconst char *sym_name;\n\tlong unsigned int sym_start;\n\tlong unsigned int sym_end;\n};\n\ntypedef struct __ksymtab kdb_symtab_t;\n\nstruct __large_struct {\n\tlong unsigned int buf[100];\n};\n\nstruct __old_kernel_stat {\n\tshort unsigned int st_dev;\n\tshort unsigned int st_ino;\n\tshort unsigned int st_mode;\n\tshort unsigned int st_nlink;\n\tshort unsigned int st_uid;\n\tshort unsigned int st_gid;\n\tshort unsigned int st_rdev;\n\tunsigned int st_size;\n\tunsigned int st_atime;\n\tunsigned int st_mtime;\n\tunsigned int st_ctime;\n};\n\nstruct __pldm_timestamp {\n\tu8 b[13];\n};\n\nstruct __pldm_header {\n\tuuid_t id;\n\tu8 revision;\n\t__le16 size;\n\tstruct __pldm_timestamp release_date;\n\t__le16 component_bitmap_len;\n\tu8 version_type;\n\tu8 version_len;\n\tu8 version_string[0];\n} __attribute__((packed));\n\nstruct __pldmfw_component_area {\n\t__le16 component_image_count;\n\tu8 components[0];\n};\n\nstruct __pldmfw_component_info {\n\t__le16 classification;\n\t__le16 identifier;\n\t__le32 comparison_stamp;\n\t__le16 options;\n\t__le16 activation_method;\n\t__le32 location_offset;\n\t__le32 size;\n\tu8 version_type;\n\tu8 version_len;\n\tu8 version_string[0];\n} __attribute__((packed));\n\nstruct __pldmfw_desc_tlv {\n\t__le16 type;\n\t__le16 size;\n\tu8 data[0];\n};\n\nstruct __pldmfw_record_area {\n\tu8 record_count;\n\tu8 records[0];\n};\n\nstruct __pldmfw_record_info {\n\t__le16 record_len;\n\tu8 descriptor_count;\n\t__le32 device_update_flags;\n\tu8 version_type;\n\tu8 version_len;\n\t__le16 package_data_len;\n\tu8 variable_record_data[0];\n} __attribute__((packed));\n\nstruct net_device;\n\nstruct __rt6_probe_work {\n\tstruct work_struct work;\n\tstruct in6_addr target;\n\tstruct net_device *dev;\n\tnetdevice_tracker dev_tracker;\n};\n\nunion sigval {\n\tint sival_int;\n\tvoid *sival_ptr;\n};\n\ntypedef union sigval sigval_t;\n\nunion __sifields {\n\tstruct {\n\t\t__kernel_pid_t _pid;\n\t\t__kernel_uid32_t _uid;\n\t} _kill;\n\tstruct {\n\t\t__kernel_timer_t _tid;\n\t\tint _overrun;\n\t\tsigval_t _sigval;\n\t\tint _sys_private;\n\t} _timer;\n\tstruct {\n\t\t__kernel_pid_t _pid;\n\t\t__kernel_uid32_t _uid;\n\t\tsigval_t _sigval;\n\t} _rt;\n\tstruct {\n\t\t__kernel_pid_t _pid;\n\t\t__kernel_uid32_t _uid;\n\t\tint _status;\n\t\t__kernel_clock_t _utime;\n\t\t__kernel_clock_t _stime;\n\t} _sigchld;\n\tstruct {\n\t\tvoid *_addr;\n\t\tunion {\n\t\t\tint _trapno;\n\t\t\tshort int _addr_lsb;\n\t\t\tstruct {\n\t\t\t\tchar _dummy_bnd[8];\n\t\t\t\tvoid *_lower;\n\t\t\t\tvoid *_upper;\n\t\t\t} _addr_bnd;\n\t\t\tstruct {\n\t\t\t\tchar _dummy_pkey[8];\n\t\t\t\t__u32 _pkey;\n\t\t\t} _addr_pkey;\n\t\t\tstruct {\n\t\t\t\tlong unsigned int _data;\n\t\t\t\t__u32 _type;\n\t\t\t\t__u32 _flags;\n\t\t\t} _perf;\n\t\t};\n\t} _sigfault;\n\tstruct {\n\t\tlong int _band;\n\t\tint _fd;\n\t} _sigpoll;\n\tstruct {\n\t\tvoid *_call_addr;\n\t\tint _syscall;\n\t\tunsigned int _arch;\n\t} _sigsys;\n};\n\nstruct bpf_flow_keys;\n\nstruct bpf_sock;\n\nstruct __sk_buff {\n\t__u32 len;\n\t__u32 pkt_type;\n\t__u32 mark;\n\t__u32 queue_mapping;\n\t__u32 protocol;\n\t__u32 vlan_present;\n\t__u32 vlan_tci;\n\t__u32 vlan_proto;\n\t__u32 priority;\n\t__u32 ingress_ifindex;\n\t__u32 ifindex;\n\t__u32 tc_index;\n\t__u32 cb[5];\n\t__u32 hash;\n\t__u32 tc_classid;\n\t__u32 data;\n\t__u32 data_end;\n\t__u32 napi_id;\n\t__u32 family;\n\t__u32 remote_ip4;\n\t__u32 local_ip4;\n\t__u32 remote_ip6[4];\n\t__u32 local_ip6[4];\n\t__u32 remote_port;\n\t__u32 local_port;\n\t__u32 data_meta;\n\tunion {\n\t\tstruct bpf_flow_keys *flow_keys;\n\t};\n\t__u64 tstamp;\n\t__u32 wire_len;\n\t__u32 gso_segs;\n\tunion {\n\t\tstruct bpf_sock *sk;\n\t};\n\t__u32 gso_size;\n\t__u8 tstamp_type;\n\t__u64 hwtstamp;\n};\n\nstruct dentry;\n\nstruct __track_dentry_update_args {\n\tstruct dentry *dentry;\n\tint op;\n};\n\nstruct __track_range_args {\n\text4_lblk_t start;\n\text4_lblk_t end;\n};\n\nunion __u128_halves {\n\tu128 full;\n\tstruct {\n\t\tu64 low;\n\t\tu64 high;\n\t};\n};\n\nstruct __una_u32 {\n\tu32 x;\n};\n\nstruct inode;\n\nstruct __uprobe_key {\n\tstruct inode *inode;\n\tloff_t offset;\n};\n\nstruct __user_cap_data_struct {\n\t__u32 effective;\n\t__u32 permitted;\n\t__u32 inheritable;\n};\n\ntypedef struct __user_cap_data_struct *cap_user_data_t;\n\nstruct __user_cap_header_struct {\n\t__u32 version;\n\tint pid;\n};\n\ntypedef struct __user_cap_header_struct *cap_user_header_t;\n\nstruct __va_list_tag {\n\tunsigned int gp_offset;\n\tunsigned int fp_offset;\n\tvoid *overflow_arg_area;\n\tvoid *reg_save_area;\n};\n\ntypedef __builtin_va_list va_list;\n\nstruct _bpf_dtab_netdev {\n\tstruct net_device *dev;\n};\n\nstruct _cache_table {\n\tunsigned char descriptor;\n\tchar cache_type;\n\tshort int size;\n};\n\nunion _cpuid4_leaf_eax {\n\tstruct {\n\t\tenum _cache_type type: 5;\n\t\tunsigned int level: 3;\n\t\tunsigned int is_self_initializing: 1;\n\t\tunsigned int is_fully_associative: 1;\n\t\tunsigned int reserved: 4;\n\t\tunsigned int num_threads_sharing: 12;\n\t\tunsigned int num_cores_on_die: 6;\n\t} split;\n\tu32 full;\n};\n\nunion _cpuid4_leaf_ebx {\n\tstruct {\n\t\tunsigned int coherency_line_size: 12;\n\t\tunsigned int physical_line_partition: 10;\n\t\tunsigned int ways_of_associativity: 10;\n\t} split;\n\tu32 full;\n};\n\nunion _cpuid4_leaf_ecx {\n\tstruct {\n\t\tunsigned int number_of_sets: 32;\n\t} split;\n\tu32 full;\n};\n\nstruct amd_northbridge;\n\nstruct _cpuid4_info_regs {\n\tunion _cpuid4_leaf_eax eax;\n\tunion _cpuid4_leaf_ebx ebx;\n\tunion _cpuid4_leaf_ecx ecx;\n\tunsigned int id;\n\tlong unsigned int size;\n\tstruct amd_northbridge *nb;\n};\n\nstruct jump_entry;\n\nstruct static_key_mod;\n\nstruct static_key {\n\tatomic_t enabled;\n\tunion {\n\t\tlong unsigned int type;\n\t\tstruct jump_entry *entries;\n\t\tstruct static_key_mod *next;\n\t};\n};\n\nstruct static_key_true {\n\tstruct static_key key;\n};\n\nstruct static_key_false {\n\tstruct static_key key;\n};\n\nstruct _ddebug {\n\tconst char *modname;\n\tconst char *function;\n\tconst char *filename;\n\tconst char *format;\n\tunsigned int lineno: 18;\n\tunsigned int class_id: 6;\n\tunsigned int flags: 8;\n\tunion {\n\t\tstruct static_key_true dd_key_true;\n\t\tstruct static_key_false dd_key_false;\n\t} key;\n};\n\nstruct ddebug_class_map;\n\nstruct _ddebug_info {\n\tstruct _ddebug *descs;\n\tstruct ddebug_class_map *classes;\n\tunsigned int num_descs;\n\tunsigned int num_classes;\n};\n\nstruct _flow_keys_digest_data {\n\t__be16 n_proto;\n\tu8 ip_proto;\n\tu8 padding;\n\t__be32 ports;\n\t__be32 src;\n\t__be32 dst;\n};\n\nstruct _fpreg {\n\t__u16 significand[4];\n\t__u16 exponent;\n};\n\nstruct _fpxreg {\n\t__u16 significand[4];\n\t__u16 exponent;\n\t__u16 padding[3];\n};\n\nstruct _xmmreg {\n\t__u32 element[4];\n};\n\nstruct _fpx_sw_bytes {\n\t__u32 magic1;\n\t__u32 extended_size;\n\t__u64 xfeatures;\n\t__u32 xstate_size;\n\t__u32 padding[7];\n};\n\nstruct _fpstate_32 {\n\t__u32 cw;\n\t__u32 sw;\n\t__u32 tag;\n\t__u32 ipoff;\n\t__u32 cssel;\n\t__u32 dataoff;\n\t__u32 datasel;\n\tstruct _fpreg _st[8];\n\t__u16 status;\n\t__u16 magic;\n\t__u32 _fxsr_env[6];\n\t__u32 mxcsr;\n\t__u32 reserved;\n\tstruct _fpxreg _fxsr_st[8];\n\tstruct _xmmreg _xmm[8];\n\tunion {\n\t\t__u32 padding1[44];\n\t\t__u32 padding[44];\n\t};\n\tunion {\n\t\t__u32 padding2[12];\n\t\tstruct _fpx_sw_bytes sw_reserved;\n\t};\n};\n\nstruct _gpiochip_for_each_data {\n\tconst char **label;\n\tunsigned int *i;\n};\n\ntypedef struct _gpiochip_for_each_data class__gpiochip_for_each_data_t;\n\nstruct _gpt_entry_attributes {\n\tu64 required_to_function: 1;\n\tu64 reserved: 47;\n\tu64 type_guid_specific: 16;\n};\n\ntypedef struct _gpt_entry_attributes gpt_entry_attributes;\n\nstruct _gpt_entry {\n\tefi_guid_t partition_type_guid;\n\tefi_guid_t unique_partition_guid;\n\t__le64 starting_lba;\n\t__le64 ending_lba;\n\tgpt_entry_attributes attributes;\n\t__le16 partition_name[36];\n};\n\ntypedef struct _gpt_entry gpt_entry;\n\nstruct _gpt_header {\n\t__le64 signature;\n\t__le32 revision;\n\t__le32 header_size;\n\t__le32 header_crc32;\n\t__le32 reserved1;\n\t__le64 my_lba;\n\t__le64 alternate_lba;\n\t__le64 first_usable_lba;\n\t__le64 last_usable_lba;\n\tefi_guid_t disk_guid;\n\t__le64 partition_entry_lba;\n\t__le32 num_partition_entries;\n\t__le32 sizeof_partition_entry;\n\t__le32 partition_entry_array_crc32;\n} __attribute__((packed));\n\ntypedef struct _gpt_header gpt_header;\n\nstruct _gpt_mbr_record {\n\tu8 boot_indicator;\n\tu8 start_head;\n\tu8 start_sector;\n\tu8 start_track;\n\tu8 os_type;\n\tu8 end_head;\n\tu8 end_sector;\n\tu8 end_track;\n\t__le32 starting_lba;\n\t__le32 size_in_lba;\n};\n\ntypedef struct _gpt_mbr_record gpt_mbr_record;\n\nstruct resource {\n\tresource_size_t start;\n\tresource_size_t end;\n\tconst char *name;\n\tlong unsigned int flags;\n\tlong unsigned int desc;\n\tstruct resource *parent;\n\tstruct resource *sibling;\n\tstruct resource *child;\n};\n\nstruct intel_gtt_driver;\n\nstruct pci_dev;\n\nstruct page;\n\nstruct _intel_private {\n\tconst struct intel_gtt_driver *driver;\n\tstruct pci_dev *pcidev;\n\tstruct pci_dev *bridge_dev;\n\tu8 *registers;\n\tphys_addr_t gtt_phys_addr;\n\tu32 PGETBL_save;\n\tu32 *gtt;\n\tbool clear_fake_agp;\n\tint num_dcache_entries;\n\tvoid *i9xx_flush_page;\n\tchar *i81x_gtt_table;\n\tstruct resource ifp_resource;\n\tint resource_valid;\n\tstruct page *scratch_page;\n\tphys_addr_t scratch_page_dma;\n\tint refcount;\n\tunsigned int needs_dmar: 1;\n\tphys_addr_t gma_bus_addr;\n\tresource_size_t stolen_size;\n\tunsigned int gtt_total_entries;\n\tunsigned int gtt_mappable_entries;\n};\n\nstruct _kdb_bp {\n\tlong unsigned int bp_addr;\n\tunsigned int bp_free: 1;\n\tunsigned int bp_enabled: 1;\n\tunsigned int bp_type: 4;\n\tunsigned int bp_installed: 1;\n\tunsigned int bp_delay: 1;\n\tunsigned int bp_delayed: 1;\n\tunsigned int bph_length;\n};\n\ntypedef struct _kdb_bp kdb_bp_t;\n\nstruct _kdbmsg {\n\tint km_diag;\n\tchar *km_msg;\n};\n\ntypedef struct _kdbmsg kdbmsg_t;\n\ntypedef int (*kdb_func_t)(int, const char **);\n\nstruct _kdbtab {\n\tchar *name;\n\tkdb_func_t func;\n\tchar *usage;\n\tchar *help;\n\tshort int minlen;\n\tkdb_cmdflags_t flags;\n\tstruct list_head list_node;\n};\n\ntypedef struct _kdbtab kdbtab_t;\n\nstruct kvm_stats_desc {\n\t__u32 flags;\n\t__s16 exponent;\n\t__u16 size;\n\t__u32 offset;\n\t__u32 bucket_size;\n\tchar name[0];\n};\n\nstruct _kvm_stats_desc {\n\tstruct kvm_stats_desc desc;\n\tchar name[48];\n};\n\nstruct _legacy_mbr {\n\tu8 boot_code[440];\n\t__le32 unique_mbr_signature;\n\t__le16 unknown;\n\tgpt_mbr_record partition_record[4];\n\t__le16 signature;\n} __attribute__((packed));\n\ntypedef struct _legacy_mbr legacy_mbr;\n\nstruct strp_msg {\n\tint full_len;\n\tint offset;\n};\n\nstruct _strp_msg {\n\tstruct strp_msg strp;\n\tint accum_len;\n};\n\nstruct timer_list {\n\tstruct hlist_node entry;\n\tlong unsigned int expires;\n\tvoid (*function)(struct timer_list *);\n\tu32 flags;\n};\n\nstruct delayed_work {\n\tstruct work_struct work;\n\tstruct timer_list timer;\n\tstruct workqueue_struct *wq;\n\tint cpu;\n};\n\nstruct _thermal_state {\n\tu64 next_check;\n\tu64 last_interrupt_time;\n\tstruct delayed_work therm_work;\n\tlong unsigned int count;\n\tlong unsigned int last_count;\n\tlong unsigned int max_time_ms;\n\tlong unsigned int total_time_ms;\n\tbool rate_control_active;\n\tbool new_event;\n\tu8 level;\n\tu8 sample_index;\n\tu8 sample_count;\n\tu8 average;\n\tu8 baseline_temp;\n\tu8 temp_samples[3];\n};\n\nstruct _tlb_table {\n\tunsigned char descriptor;\n\tchar tlb_type;\n\tunsigned int entries;\n\tchar info[128];\n};\n\nstruct aa_policydb;\n\nstruct aa_attachment {\n\tconst char *xmatch_str;\n\tstruct aa_policydb *xmatch;\n\tunsigned int xmatch_len;\n\tint xattr_count;\n\tchar **xattrs;\n};\n\nstruct aa_audit_cache {\n\tspinlock_t lock;\n\tint size;\n\tstruct list_head head;\n};\n\nstruct vfsmount;\n\nstruct path {\n\tstruct vfsmount *mnt;\n\tstruct dentry *dentry;\n};\n\nstruct lsm_network_audit;\n\nstruct lsm_ioctlop_audit;\n\nstruct file;\n\nstruct lsm_ibpkey_audit;\n\nstruct lsm_ibendport_audit;\n\nstruct smack_audit_data;\n\nstruct selinux_audit_data;\n\nstruct apparmor_audit_data;\n\nstruct common_audit_data {\n\tchar type;\n\tunion {\n\t\tstruct path path;\n\t\tstruct dentry *dentry;\n\t\tstruct inode *inode;\n\t\tstruct lsm_network_audit *net;\n\t\tint cap;\n\t\tint ipc_id;\n\t\tstruct task_struct *tsk;\n\t\tstruct {\n\t\t\tkey_serial_t key;\n\t\t\tchar *key_desc;\n\t\t} key_struct;\n\t\tchar *kmod_name;\n\t\tstruct lsm_ioctlop_audit *op;\n\t\tstruct file *file;\n\t\tstruct lsm_ibpkey_audit *ibpkey;\n\t\tstruct lsm_ibendport_audit *ibendport;\n\t\tint reason;\n\t\tconst char *anonclass;\n\t} u;\n\tunion {\n\t\tstruct smack_audit_data *smack_audit_data;\n\t\tstruct selinux_audit_data *selinux_audit_data;\n\t\tstruct apparmor_audit_data *apparmor_audit_data;\n\t};\n};\n\nstruct cred;\n\nstruct aa_label;\n\nstruct sock;\n\nstruct aa_profile;\n\nstruct apparmor_audit_data {\n\tu32 flags;\n\tint error;\n\tint type;\n\tu16 class;\n\tconst char *op;\n\tconst struct cred *subj_cred;\n\tstruct aa_label *subj_label;\n\tconst char *name;\n\tconst char *info;\n\tu32 request;\n\tu32 denied;\n\tstruct task_struct *subjtsk;\n\tunion {\n\t\tstruct {\n\t\t\tstruct aa_label *peer;\n\t\t\tunion {\n\t\t\t\tstruct {\n\t\t\t\t\tconst char *target;\n\t\t\t\t\tkuid_t ouid;\n\t\t\t\t} fs;\n\t\t\t\tstruct {\n\t\t\t\t\tint rlim;\n\t\t\t\t\tlong unsigned int max;\n\t\t\t\t} rlim;\n\t\t\t\tstruct {\n\t\t\t\t\tint signal;\n\t\t\t\t\tint unmappedsig;\n\t\t\t\t};\n\t\t\t\tstruct {\n\t\t\t\t\tint type;\n\t\t\t\t\tint protocol;\n\t\t\t\t\tstruct sock *peer_sk;\n\t\t\t\t\tvoid *addr;\n\t\t\t\t\tint addrlen;\n\t\t\t\t} net;\n\t\t\t\tstruct {\n\t\t\t\t\tkuid_t fsuid;\n\t\t\t\t\tkuid_t ouid;\n\t\t\t\t} mq;\n\t\t\t\tstruct {\n\t\t\t\t\tconst char *target;\n\t\t\t\t} ns;\n\t\t\t};\n\t\t};\n\t\tstruct {\n\t\t\tstruct aa_profile *profile;\n\t\t\tconst char *ns;\n\t\t\tlong int pos;\n\t\t} iface;\n\t\tstruct {\n\t\t\tconst char *src_name;\n\t\t\tconst char *type;\n\t\t\tconst char *trans;\n\t\t\tconst char *data;\n\t\t\tlong unsigned int flags;\n\t\t} mnt;\n\t\tstruct {\n\t\t\tstruct aa_label *target;\n\t\t} uring;\n\t};\n\tstruct common_audit_data common;\n};\n\nstruct aa_knotif {\n\tstruct apparmor_audit_data *ad;\n\tstruct list_head list;\n\tstruct completion ready;\n\tu64 id;\n\tu16 ntype;\n\tu16 flags;\n};\n\nstruct aa_audit_node {\n\tstruct kref count;\n\tstruct apparmor_audit_data data;\n\tstruct list_head list;\n\tstruct aa_knotif knotif;\n};\n\nstruct aa_audit_rule {\n\tstruct aa_label *label;\n};\n\nunion aa_buffer {\n\tstruct list_head list;\n\tstruct {\n\t\tstruct {} __empty_buffer;\n\t\tchar buffer[0];\n\t};\n};\n\nstruct aa_caps {\n\tkernel_cap_t allow;\n\tkernel_cap_t audit;\n\tkernel_cap_t denied;\n\tkernel_cap_t quiet;\n\tkernel_cap_t kill;\n\tkernel_cap_t extended;\n};\n\nstruct rhash_head {\n\tstruct rhash_head *next;\n};\n\nstruct aa_data {\n\tchar *key;\n\tu32 size;\n\tchar *data;\n\tstruct rhash_head head;\n};\n\nstruct table_header;\n\nstruct aa_dfa {\n\tstruct kref count;\n\tu16 flags;\n\tu32 max_oob;\n\tstruct table_header *tables[8];\n};\n\nstruct aa_ext {\n\tvoid *start;\n\tvoid *end;\n\tvoid *pos;\n\tu32 version;\n};\n\nstruct aa_file_ctx {\n\tspinlock_t lock;\n\tstruct aa_label *label;\n\tu32 allow;\n};\n\nstruct aa_inode_sec {\n\tstruct inode *inode;\n\tstruct aa_label *label;\n\tu16 sclass;\n\tbool initialized;\n\tspinlock_t lock;\n};\n\nstruct aa_proxy;\n\nstruct aa_label {\n\tstruct kref count;\n\tstruct rb_node node;\n\tstruct callback_head rcu;\n\tstruct aa_proxy *proxy;\n\tchar *hname;\n\tlong int flags;\n\tu32 secid;\n\tint size;\n\tu64 mediates;\n\tstruct aa_profile *vec[0];\n};\n\nstruct rb_root {\n\tstruct rb_node *rb_node;\n};\n\nstruct aa_labelset {\n\trwlock_t lock;\n\tstruct rb_root root;\n};\n\nstruct aa_ns;\n\nstruct aa_listener {\n\tstruct kref count;\n\tspinlock_t lock;\n\twait_queue_head_t wait;\n\tstruct list_head ns_proxies;\n\tstruct list_head notifications;\n\tstruct list_head pending;\n\tstruct aa_ns *ns;\n\tstruct aa_dfa *filter;\n\tu64 last_id;\n\tu32 mask;\n\tu32 flags;\n};\n\nstruct aa_listener_proxy {\n\tstruct aa_ns *ns;\n\tstruct aa_listener *listener;\n\tstruct list_head llist;\n\tstruct list_head nslist;\n};\n\nstruct aa_load_ent {\n\tstruct list_head list;\n\tstruct aa_profile *new;\n\tstruct aa_profile *old;\n\tstruct aa_profile *rename;\n\tconst char *ns_name;\n};\n\nstruct aa_loaddata {\n\tstruct kref count;\n\tstruct list_head list;\n\tstruct work_struct work;\n\tstruct dentry *dents[6];\n\tstruct aa_ns *ns;\n\tchar *name;\n\tsize_t size;\n\tsize_t compressed_size;\n\tlong int revision;\n\tint abi;\n\tunsigned char *hash;\n\tchar *data;\n};\n\nstruct aa_local_cache {\n\tunsigned int hold;\n\tunsigned int count;\n\tstruct list_head head;\n};\n\nstruct aa_net_compat {\n\tu16 allow[46];\n\tu16 audit[46];\n\tu16 quiet[46];\n};\n\nstruct aa_policy {\n\tconst char *name;\n\tchar *hname;\n\tstruct list_head list;\n\tstruct list_head profiles;\n};\n\nstruct aa_ns_acct {\n\tint max_size;\n\tint max_count;\n\tint size;\n\tint count;\n};\n\nstruct aa_ns {\n\tstruct aa_policy base;\n\tstruct aa_ns *parent;\n\tstruct mutex lock;\n\tstruct aa_ns_acct acct;\n\tstruct aa_profile *unconfined;\n\tstruct list_head sub_ns;\n\tatomic_t uniq_null;\n\tlong int uniq_id;\n\tint level;\n\tlong int revision;\n\twait_queue_head_t wait;\n\tspinlock_t listener_lock;\n\tstruct list_head listeners;\n\tstruct aa_labelset labels;\n\tstruct list_head rawdata_list;\n\tstruct dentry *dents[13];\n};\n\nstruct aa_perms {\n\tu32 allow;\n\tu32 deny;\n\tu32 subtree;\n\tu32 cond;\n\tu32 kill;\n\tu32 complain;\n\tu32 prompt;\n\tu32 audit;\n\tu32 quiet;\n\tu32 hide;\n\tu32 xindex;\n\tu32 tag;\n\tu32 label;\n};\n\nstruct aa_str_table {\n\tint size;\n\tchar **table;\n};\n\nstruct aa_policydb {\n\tstruct kref count;\n\tstruct aa_dfa *dfa;\n\tstruct {\n\t\tstruct aa_perms *perms;\n\t\tu32 size;\n\t};\n\tstruct aa_str_table trans;\n\tunsigned int start[33];\n};\n\nstruct rhashtable;\n\nstruct aa_profile {\n\tstruct aa_policy base;\n\tstruct aa_profile *parent;\n\tstruct aa_ns *ns;\n\tconst char *rename;\n\tenum audit_mode audit;\n\tlong int mode;\n\tu32 path_flags;\n\tint signal;\n\tconst char *disconnected;\n\tstruct aa_attachment attach;\n\tstruct list_head rules;\n\tstruct aa_net_compat *net_compat;\n\tstruct aa_audit_cache learning_cache;\n\tstruct aa_loaddata *rawdata;\n\tunsigned char *hash;\n\tchar *dirname;\n\tstruct dentry *dents[10];\n\tstruct rhashtable *data;\n\tstruct aa_label label;\n};\n\nstruct aa_proxy {\n\tstruct kref count;\n\tstruct aa_label *label;\n};\n\nstruct aa_revision {\n\tstruct aa_ns *ns;\n\tlong int last_read;\n};\n\nstruct rlimit {\n\t__kernel_ulong_t rlim_cur;\n\t__kernel_ulong_t rlim_max;\n};\n\nstruct aa_rlimit {\n\tunsigned int mask;\n\tstruct rlimit limits[16];\n};\n\nstruct aa_secmark;\n\nstruct aa_ruleset {\n\tstruct list_head list;\n\tint size;\n\tstruct aa_policydb *policy;\n\tstruct aa_policydb *file;\n\tstruct aa_caps caps;\n\tstruct aa_rlimit rlimits;\n\tint secmark_count;\n\tstruct aa_secmark *secmark;\n};\n\nstruct aa_secmark {\n\tu8 audit;\n\tu8 deny;\n\tu32 secid;\n\tchar *label;\n};\n\nstruct file_operations;\n\nstruct aa_sfs_entry {\n\tconst char *name;\n\tstruct dentry *dentry;\n\tumode_t mode;\n\tenum aa_sfs_type v_type;\n\tunion {\n\t\tbool boolean;\n\t\tchar *string;\n\t\tlong unsigned int u64;\n\t\tstruct aa_sfs_entry *files;\n\t} v;\n\tconst struct file_operations *file_ops;\n};\n\nstruct aa_sk_ctx {\n\tstruct aa_label *label;\n\tstruct aa_label *peer;\n\tstruct path path;\n};\n\nstruct aa_task_ctx {\n\tstruct aa_label *nnp;\n\tstruct aa_label *onexec;\n\tstruct aa_label *previous;\n\tu64 token;\n};\n\nstruct i2c_client;\n\nstruct aat2870_register;\n\nstruct aat2870_data {\n\tstruct device *dev;\n\tstruct i2c_client *client;\n\tstruct mutex io_lock;\n\tstruct aat2870_register *reg_cache;\n\tint en_pin;\n\tbool is_enable;\n\tint (*init)(struct aat2870_data *);\n\tvoid (*uninit)(struct aat2870_data *);\n\tint (*read)(struct aat2870_data *, u8, u8 *);\n\tint (*write)(struct aat2870_data *, u8, u8);\n\tint (*update)(struct aat2870_data *, u8, u8, u8);\n\tstruct dentry *dentry_root;\n};\n\nstruct aat2870_subdev_info;\n\nstruct aat2870_platform_data {\n\tint en_pin;\n\tstruct aat2870_subdev_info *subdevs;\n\tint num_subdevs;\n\tint (*init)(struct aat2870_data *);\n\tvoid (*uninit)(struct aat2870_data *);\n};\n\nstruct aat2870_register {\n\tbool readable;\n\tbool writeable;\n\tu8 value;\n};\n\nstruct aat2870_subdev_info {\n\tint id;\n\tconst char *name;\n\tvoid *platform_data;\n};\n\nstruct seq_net_private {\n\tstruct net *net;\n\tnetns_tracker ns_tracker;\n};\n\nstruct ac6_iter_state {\n\tstruct seq_net_private p;\n\tstruct net_device *dev;\n};\n\nstruct accept_range {\n\tstruct list_head list;\n\tlong unsigned int start;\n\tlong unsigned int end;\n};\n\nstruct access_coordinate {\n\tunsigned int read_bandwidth;\n\tunsigned int write_bandwidth;\n\tunsigned int read_latency;\n\tunsigned int write_latency;\n};\n\nstruct access_masks {\n\taccess_mask_t fs: 16;\n\taccess_mask_t net: 2;\n};\n\nstruct access_report_info {\n\tstruct callback_head work;\n\tconst char *access;\n\tstruct task_struct *target;\n\tstruct task_struct *agent;\n};\n\nstruct acct_v3 {\n\tchar ac_flag;\n\tchar ac_version;\n\t__u16 ac_tty;\n\t__u32 ac_exitcode;\n\t__u32 ac_uid;\n\t__u32 ac_gid;\n\t__u32 ac_pid;\n\t__u32 ac_ppid;\n\t__u32 ac_btime;\n\t__u32 ac_etime;\n\tcomp_t ac_utime;\n\tcomp_t ac_stime;\n\tcomp_t ac_mem;\n\tcomp_t ac_io;\n\tcomp_t ac_rw;\n\tcomp_t ac_minflt;\n\tcomp_t ac_majflt;\n\tcomp_t ac_swaps;\n\tchar ac_comm[16];\n};\n\ntypedef struct acct_v3 acct_t;\n\nstruct ack_sample {\n\tu32 pkts_acked;\n\ts32 rtt_us;\n\tu32 in_flight;\n};\n\nstruct crypto_tfm;\n\nstruct cipher_alg {\n\tunsigned int cia_min_keysize;\n\tunsigned int cia_max_keysize;\n\tint (*cia_setkey)(struct crypto_tfm *, const u8 *, unsigned int);\n\tvoid (*cia_encrypt)(struct crypto_tfm *, u8 *, const u8 *);\n\tvoid (*cia_decrypt)(struct crypto_tfm *, u8 *, const u8 *);\n};\n\nstruct compress_alg {\n\tint (*coa_compress)(struct crypto_tfm *, const u8 *, unsigned int, u8 *, unsigned int *);\n\tint (*coa_decompress)(struct crypto_tfm *, const u8 *, unsigned int, u8 *, unsigned int *);\n};\n\nstruct crypto_type;\n\nstruct crypto_alg {\n\tstruct list_head cra_list;\n\tstruct list_head cra_users;\n\tu32 cra_flags;\n\tunsigned int cra_blocksize;\n\tunsigned int cra_ctxsize;\n\tunsigned int cra_alignmask;\n\tint cra_priority;\n\trefcount_t cra_refcnt;\n\tchar cra_name[128];\n\tchar cra_driver_name[128];\n\tconst struct crypto_type *cra_type;\n\tunion {\n\t\tstruct cipher_alg cipher;\n\t\tstruct compress_alg compress;\n\t} cra_u;\n\tint (*cra_init)(struct crypto_tfm *);\n\tvoid (*cra_exit)(struct crypto_tfm *);\n\tvoid (*cra_destroy)(struct crypto_alg *);\n\tstruct module *cra_module;\n};\n\nstruct comp_alg_common {\n\tstruct crypto_alg base;\n};\n\nstruct acomp_req;\n\nstruct scatterlist;\n\nstruct crypto_acomp;\n\nstruct acomp_alg {\n\tint (*compress)(struct acomp_req *);\n\tint (*decompress)(struct acomp_req *);\n\tvoid (*dst_free)(struct scatterlist *);\n\tint (*init)(struct crypto_acomp *);\n\tvoid (*exit)(struct crypto_acomp *);\n\tunsigned int reqsize;\n\tunion {\n\t\tstruct {\n\t\t\tstruct crypto_alg base;\n\t\t};\n\t\tstruct comp_alg_common calg;\n\t};\n};\n\ntypedef void (*crypto_completion_t)(void *, int);\n\nstruct crypto_async_request {\n\tstruct list_head list;\n\tcrypto_completion_t complete;\n\tvoid *data;\n\tstruct crypto_tfm *tfm;\n\tu32 flags;\n};\n\nstruct acomp_req {\n\tstruct crypto_async_request base;\n\tstruct scatterlist *src;\n\tstruct scatterlist *dst;\n\tunsigned int slen;\n\tunsigned int dlen;\n\tu32 flags;\n\tvoid *__ctx[0];\n};\n\nstruct power_supply;\n\nunion power_supply_propval;\n\nstruct power_supply_desc {\n\tconst char *name;\n\tenum power_supply_type type;\n\tu8 charge_behaviours;\n\tconst enum power_supply_usb_type *usb_types;\n\tsize_t num_usb_types;\n\tconst enum power_supply_property *properties;\n\tsize_t num_properties;\n\tint (*get_property)(struct power_supply *, enum power_supply_property, union power_supply_propval *);\n\tint (*set_property)(struct power_supply *, enum power_supply_property, const union power_supply_propval *);\n\tint (*property_is_writeable)(struct power_supply *, enum power_supply_property);\n\tvoid (*external_power_changed)(struct power_supply *);\n\tvoid (*set_charged)(struct power_supply *);\n\tbool no_thermal;\n\tint use_for_apm;\n};\n\nstruct notifier_block;\n\ntypedef int (*notifier_fn_t)(struct notifier_block *, long unsigned int, void *);\n\nstruct notifier_block {\n\tnotifier_fn_t notifier_call;\n\tstruct notifier_block *next;\n\tint priority;\n};\n\nstruct acpi_device;\n\nstruct acpi_ac {\n\tstruct power_supply *charger;\n\tstruct power_supply_desc charger_desc;\n\tstruct acpi_device *device;\n\tlong long unsigned int state;\n\tstruct notifier_block battery_nb;\n};\n\nstruct acpi_address16_attribute {\n\tu16 granularity;\n\tu16 minimum;\n\tu16 maximum;\n\tu16 translation_offset;\n\tu16 address_length;\n};\n\nstruct acpi_address32_attribute {\n\tu32 granularity;\n\tu32 minimum;\n\tu32 maximum;\n\tu32 translation_offset;\n\tu32 address_length;\n};\n\nstruct acpi_address64_attribute {\n\tu64 granularity;\n\tu64 minimum;\n\tu64 maximum;\n\tu64 translation_offset;\n\tu64 address_length;\n};\n\nstruct acpi_namespace_node;\n\nstruct acpi_address_range {\n\tstruct acpi_address_range *next;\n\tstruct acpi_namespace_node *region_node;\n\tacpi_physical_address start_address;\n\tacpi_physical_address end_address;\n};\n\nstruct circ_buf {\n\tchar *buf;\n\tint head;\n\tint tail;\n};\n\ntypedef void (*acpi_osd_exec_callback)(void *);\n\nstruct acpi_aml_io {\n\twait_queue_head_t wait;\n\tlong unsigned int flags;\n\tlong unsigned int users;\n\tstruct mutex lock;\n\tstruct task_struct *thread;\n\tchar out_buf[4096];\n\tstruct circ_buf out_crc;\n\tchar in_buf[4096];\n\tstruct circ_buf in_crc;\n\tacpi_osd_exec_callback function;\n\tvoid *context;\n\tlong unsigned int usages;\n};\n\nstruct acpi_battery {\n\tstruct mutex lock;\n\tstruct mutex sysfs_lock;\n\tstruct power_supply *bat;\n\tstruct power_supply_desc bat_desc;\n\tstruct acpi_device *device;\n\tstruct notifier_block pm_nb;\n\tstruct list_head list;\n\tlong unsigned int update_time;\n\tint revision;\n\tint rate_now;\n\tint capacity_now;\n\tint voltage_now;\n\tint design_capacity;\n\tint full_charge_capacity;\n\tint technology;\n\tint design_voltage;\n\tint design_capacity_warning;\n\tint design_capacity_low;\n\tint cycle_count;\n\tint measurement_accuracy;\n\tint max_sampling_time;\n\tint min_sampling_time;\n\tint max_averaging_interval;\n\tint min_averaging_interval;\n\tint capacity_granularity_1;\n\tint capacity_granularity_2;\n\tint alarm;\n\tchar model_number[64];\n\tchar serial_number[64];\n\tchar type[64];\n\tchar oem_info[64];\n\tint state;\n\tint power_unit;\n\tlong unsigned int flags;\n};\n\nstruct acpi_battery_hook {\n\tconst char *name;\n\tint (*add_battery)(struct power_supply *, struct acpi_battery_hook *);\n\tint (*remove_battery)(struct power_supply *, struct acpi_battery_hook *);\n\tstruct list_head list;\n};\n\nstruct acpi_bert_region {\n\tu32 block_status;\n\tu32 raw_data_offset;\n\tu32 raw_data_length;\n\tu32 data_length;\n\tu32 error_severity;\n};\n\nstruct acpi_bit_register_info {\n\tu8 parent_register;\n\tu8 bit_position;\n\tu16 access_bit_mask;\n};\n\nstruct acpi_buffer {\n\tacpi_size length;\n\tvoid *pointer;\n};\n\nstruct acpi_bus_event {\n\tstruct list_head node;\n\tacpi_device_class device_class;\n\tacpi_bus_id bus_id;\n\tu32 type;\n\tu32 data;\n};\n\nstruct acpi_bus_type {\n\tstruct list_head list;\n\tconst char *name;\n\tbool (*match)(struct device *);\n\tstruct acpi_device * (*find_companion)(struct device *);\n\tvoid (*setup)(struct device *);\n};\n\nstruct input_dev;\n\nstruct acpi_button {\n\tunsigned int type;\n\tstruct input_dev *input;\n\tchar phys[32];\n\tlong unsigned int pushed;\n\tint last_state;\n\tktime_t last_time;\n\tbool suspended;\n\tbool lid_state_initialized;\n};\n\nstruct acpi_cdat_header {\n\tu8 type;\n\tu8 reserved;\n\tu16 length;\n};\n\nstruct acpi_cedt_header {\n\tu8 type;\n\tu8 reserved;\n\tu16 length;\n};\n\nstruct acpi_cedt_cfmws {\n\tstruct acpi_cedt_header header;\n\tu32 reserved1;\n\tu64 base_hpa;\n\tu64 window_size;\n\tu8 interleave_ways;\n\tu8 interleave_arithmetic;\n\tu16 reserved2;\n\tu32 granularity;\n\tu16 restrictions;\n\tu16 qtg_id;\n\tu32 interleave_targets[0];\n} __attribute__((packed));\n\nstruct acpi_comment_node {\n\tchar *comment;\n\tstruct acpi_comment_node *next;\n};\n\nstruct acpi_common_descriptor {\n\tvoid *common_pointer;\n\tu8 descriptor_type;\n};\n\nstruct acpi_common_state {\n\tvoid *next;\n\tu8 descriptor_type;\n\tu8 flags;\n\tu16 value;\n\tu16 state;\n};\n\nstruct acpi_connection_info {\n\tu8 *connection;\n\tu16 length;\n\tu8 access_length;\n};\n\nunion acpi_parse_object;\n\nstruct acpi_control_state {\n\tvoid *next;\n\tu8 descriptor_type;\n\tu8 flags;\n\tu16 value;\n\tu16 state;\n\tu16 opcode;\n\tunion acpi_parse_object *predicate_op;\n\tu8 *aml_predicate_start;\n\tu8 *package_end;\n\tu64 loop_timeout;\n};\n\ntypedef struct cpumask *cpumask_var_t;\n\nstruct acpi_pct_register;\n\nstruct acpi_cpufreq_data {\n\tunsigned int resume;\n\tunsigned int cpu_feature;\n\tunsigned int acpi_perf_cpu;\n\tcpumask_var_t freqdomain_cpus;\n\tvoid (*cpu_freq_write)(struct acpi_pct_register *, u32);\n\tu32 (*cpu_freq_read)(struct acpi_pct_register *);\n};\n\nstruct acpi_create_field_info {\n\tstruct acpi_namespace_node *region_node;\n\tstruct acpi_namespace_node *field_node;\n\tstruct acpi_namespace_node *register_node;\n\tstruct acpi_namespace_node *data_register_node;\n\tstruct acpi_namespace_node *connection_node;\n\tu8 *resource_buffer;\n\tu32 bank_value;\n\tu32 field_bit_position;\n\tu32 field_bit_length;\n\tu16 resource_length;\n\tu16 pin_number_index;\n\tu8 field_flags;\n\tu8 attribute;\n\tu8 field_type;\n\tu8 access_length;\n};\n\nstruct acpi_csrt_group {\n\tu32 length;\n\tu32 vendor_id;\n\tu32 subvendor_id;\n\tu16 device_id;\n\tu16 subdevice_id;\n\tu16 revision;\n\tu16 reserved;\n\tu32 shared_info_length;\n};\n\nstruct acpi_csrt_shared_info {\n\tu16 major_version;\n\tu16 minor_version;\n\tu32 mmio_base_low;\n\tu32 mmio_base_high;\n\tu32 gsi_interrupt;\n\tu8 interrupt_polarity;\n\tu8 interrupt_mode;\n\tu8 num_channels;\n\tu8 dma_address_width;\n\tu16 base_request_line;\n\tu16 num_handshake_signals;\n\tu32 max_block_size;\n};\n\nstruct attribute {\n\tconst char *name;\n\tumode_t mode;\n};\n\nstruct address_space;\n\nstruct vm_area_struct;\n\nstruct bin_attribute {\n\tstruct attribute attr;\n\tsize_t size;\n\tvoid *private;\n\tstruct address_space * (*f_mapping)(void);\n\tssize_t (*read)(struct file *, struct kobject *, struct bin_attribute *, char *, loff_t, size_t);\n\tssize_t (*write)(struct file *, struct kobject *, struct bin_attribute *, char *, loff_t, size_t);\n\tloff_t (*llseek)(struct file *, struct kobject *, struct bin_attribute *, loff_t, int);\n\tint (*mmap)(struct file *, struct kobject *, struct bin_attribute *, struct vm_area_struct *);\n};\n\nstruct acpi_data_attr {\n\tstruct bin_attribute attr;\n\tu64 addr;\n};\n\ntypedef void *acpi_handle;\n\nstruct fwnode_operations;\n\nstruct fwnode_handle {\n\tstruct fwnode_handle *secondary;\n\tconst struct fwnode_operations *ops;\n\tstruct device *dev;\n\tstruct list_head suppliers;\n\tstruct list_head consumers;\n\tu8 flags;\n};\n\nunion acpi_object;\n\nstruct acpi_device_data {\n\tconst union acpi_object *pointer;\n\tstruct list_head properties;\n\tconst union acpi_object *of_compatible;\n\tstruct list_head subnodes;\n};\n\nstruct acpi_data_node {\n\tstruct list_head sibling;\n\tconst char *name;\n\tacpi_handle handle;\n\tstruct fwnode_handle fwnode;\n\tstruct fwnode_handle *parent;\n\tstruct acpi_device_data data;\n\tstruct kobject kobj;\n\tstruct completion kobj_done;\n};\n\nstruct acpi_data_node_attr {\n\tstruct attribute attr;\n\tssize_t (*show)(struct acpi_data_node *, char *);\n\tssize_t (*store)(struct acpi_data_node *, const char *, size_t);\n};\n\nstruct acpi_data_obj {\n\tchar *name;\n\tint (*fn)(void *, struct acpi_data_attr *);\n};\n\nstruct acpi_data_table_mapping {\n\tvoid *pointer;\n};\n\nstruct acpi_db_argument_info {\n\tconst char *name;\n};\n\nstruct acpi_db_command_help {\n\tu8 line_count;\n\tchar *invocation;\n\tchar *description;\n};\n\nstruct acpi_db_command_info {\n\tconst char *name;\n\tu8 min_args;\n};\n\nstruct acpi_db_execute_walk {\n\tu32 count;\n\tu32 max_count;\n\tchar name_seg[5];\n};\n\nstruct acpi_db_method_info {\n\tacpi_handle method;\n\tacpi_handle main_thread_gate;\n\tacpi_handle thread_complete_gate;\n\tacpi_handle info_gate;\n\tu64 *threads;\n\tu32 num_threads;\n\tu32 num_created;\n\tu32 num_completed;\n\tchar *name;\n\tu32 flags;\n\tu32 num_loops;\n\tchar pathname[512];\n\tchar **args;\n\tacpi_object_type *types;\n\tchar init_args;\n\tacpi_object_type arg_types[7];\n\tchar *arguments[7];\n\tchar num_threads_str[11];\n\tchar id_of_thread_str[11];\n\tchar index_of_thread_str[11];\n};\n\nstruct acpi_debugger_ops;\n\nstruct acpi_debugger {\n\tconst struct acpi_debugger_ops *ops;\n\tstruct module *owner;\n\tstruct mutex lock;\n};\n\nstruct acpi_debugger_ops {\n\tint (*create_thread)(acpi_osd_exec_callback, void *);\n\tssize_t (*write_log)(const char *);\n\tssize_t (*read_cmd)(char *, size_t);\n\tint (*wait_command_ready)(bool, char *, size_t);\n\tint (*notify_command_complete)(void);\n};\n\nstruct acpi_dep_data {\n\tstruct list_head node;\n\tacpi_handle supplier;\n\tacpi_handle consumer;\n\tbool honor_dep;\n\tbool met;\n\tbool free_when_met;\n};\n\nunion acpi_operand_object;\n\nstruct acpi_object_common {\n\tunion acpi_operand_object *next_object;\n\tu8 descriptor_type;\n\tu8 type;\n\tu16 reference_count;\n\tu8 flags;\n};\n\nstruct acpi_object_integer {\n\tunion acpi_operand_object *next_object;\n\tu8 descriptor_type;\n\tu8 type;\n\tu16 reference_count;\n\tu8 flags;\n\tu8 fill[3];\n\tu64 value;\n};\n\nstruct acpi_object_string {\n\tunion acpi_operand_object *next_object;\n\tu8 descriptor_type;\n\tu8 type;\n\tu16 reference_count;\n\tu8 flags;\n\tchar *pointer;\n\tu32 length;\n};\n\nstruct acpi_object_buffer {\n\tunion acpi_operand_object *next_object;\n\tu8 descriptor_type;\n\tu8 type;\n\tu16 reference_count;\n\tu8 flags;\n\tu8 *pointer;\n\tu32 length;\n\tu32 aml_length;\n\tu8 *aml_start;\n\tstruct acpi_namespace_node *node;\n};\n\nstruct acpi_object_package {\n\tunion acpi_operand_object *next_object;\n\tu8 descriptor_type;\n\tu8 type;\n\tu16 reference_count;\n\tu8 flags;\n\tstruct acpi_namespace_node *node;\n\tunion acpi_operand_object **elements;\n\tu8 *aml_start;\n\tu32 aml_length;\n\tu32 count;\n};\n\nstruct acpi_object_event {\n\tunion acpi_operand_object *next_object;\n\tu8 descriptor_type;\n\tu8 type;\n\tu16 reference_count;\n\tu8 flags;\n\tvoid *os_semaphore;\n};\n\nstruct acpi_walk_state;\n\ntypedef acpi_status (*acpi_internal_method)(struct acpi_walk_state *);\n\nstruct acpi_object_method {\n\tunion acpi_operand_object *next_object;\n\tu8 descriptor_type;\n\tu8 type;\n\tu16 reference_count;\n\tu8 flags;\n\tu8 info_flags;\n\tu8 param_count;\n\tu8 sync_level;\n\tunion acpi_operand_object *mutex;\n\tunion acpi_operand_object *node;\n\tu8 *aml_start;\n\tunion {\n\t\tacpi_internal_method implementation;\n\t\tunion acpi_operand_object *handler;\n\t} dispatch;\n\tu32 aml_length;\n\tacpi_owner_id owner_id;\n\tu8 thread_count;\n};\n\nstruct acpi_thread_state;\n\nstruct acpi_object_mutex {\n\tunion acpi_operand_object *next_object;\n\tu8 descriptor_type;\n\tu8 type;\n\tu16 reference_count;\n\tu8 flags;\n\tu8 sync_level;\n\tu16 acquisition_depth;\n\tvoid *os_mutex;\n\tu64 thread_id;\n\tstruct acpi_thread_state *owner_thread;\n\tunion acpi_operand_object *prev;\n\tunion acpi_operand_object *next;\n\tstruct acpi_namespace_node *node;\n\tu8 original_sync_level;\n};\n\nstruct acpi_object_region {\n\tunion acpi_operand_object *next_object;\n\tu8 descriptor_type;\n\tu8 type;\n\tu16 reference_count;\n\tu8 flags;\n\tu8 space_id;\n\tstruct acpi_namespace_node *node;\n\tunion acpi_operand_object *handler;\n\tunion acpi_operand_object *next;\n\tacpi_physical_address address;\n\tu32 length;\n\tvoid *pointer;\n};\n\nstruct acpi_object_notify_common {\n\tunion acpi_operand_object *next_object;\n\tu8 descriptor_type;\n\tu8 type;\n\tu16 reference_count;\n\tu8 flags;\n\tunion acpi_operand_object *notify_list[2];\n\tunion acpi_operand_object *handler;\n};\n\nstruct acpi_gpe_block_info;\n\nstruct acpi_object_device {\n\tunion acpi_operand_object *next_object;\n\tu8 descriptor_type;\n\tu8 type;\n\tu16 reference_count;\n\tu8 flags;\n\tunion acpi_operand_object *notify_list[2];\n\tunion acpi_operand_object *handler;\n\tstruct acpi_gpe_block_info *gpe_block;\n};\n\nstruct acpi_object_power_resource {\n\tunion acpi_operand_object *next_object;\n\tu8 descriptor_type;\n\tu8 type;\n\tu16 reference_count;\n\tu8 flags;\n\tunion acpi_operand_object *notify_list[2];\n\tunion acpi_operand_object *handler;\n\tu32 system_level;\n\tu32 resource_order;\n};\n\nstruct acpi_object_processor {\n\tunion acpi_operand_object *next_object;\n\tu8 descriptor_type;\n\tu8 type;\n\tu16 reference_count;\n\tu8 flags;\n\tu8 proc_id;\n\tu8 length;\n\tunion acpi_operand_object *notify_list[2];\n\tunion acpi_operand_object *handler;\n\tacpi_io_address address;\n};\n\nstruct acpi_object_thermal_zone {\n\tunion acpi_operand_object *next_object;\n\tu8 descriptor_type;\n\tu8 type;\n\tu16 reference_count;\n\tu8 flags;\n\tunion acpi_operand_object *notify_list[2];\n\tunion acpi_operand_object *handler;\n};\n\nstruct acpi_object_field_common {\n\tunion acpi_operand_object *next_object;\n\tu8 descriptor_type;\n\tu8 type;\n\tu16 reference_count;\n\tu8 flags;\n\tu8 field_flags;\n\tu8 attribute;\n\tu8 access_byte_width;\n\tstruct acpi_namespace_node *node;\n\tu32 bit_length;\n\tu32 base_byte_offset;\n\tu32 value;\n\tu8 start_field_bit_offset;\n\tu8 access_length;\n\tunion acpi_operand_object *region_obj;\n};\n\nstruct acpi_object_region_field {\n\tunion acpi_operand_object *next_object;\n\tu8 descriptor_type;\n\tu8 type;\n\tu16 reference_count;\n\tu8 flags;\n\tu8 field_flags;\n\tu8 attribute;\n\tu8 access_byte_width;\n\tstruct acpi_namespace_node *node;\n\tu32 bit_length;\n\tu32 base_byte_offset;\n\tu32 value;\n\tu8 start_field_bit_offset;\n\tu8 access_length;\n\tu16 resource_length;\n\tunion acpi_operand_object *region_obj;\n\tu8 *resource_buffer;\n\tu16 pin_number_index;\n\tu8 *internal_pcc_buffer;\n};\n\nstruct acpi_object_buffer_field {\n\tunion acpi_operand_object *next_object;\n\tu8 descriptor_type;\n\tu8 type;\n\tu16 reference_count;\n\tu8 flags;\n\tu8 field_flags;\n\tu8 attribute;\n\tu8 access_byte_width;\n\tstruct acpi_namespace_node *node;\n\tu32 bit_length;\n\tu32 base_byte_offset;\n\tu32 value;\n\tu8 start_field_bit_offset;\n\tu8 access_length;\n\tu8 is_create_field;\n\tunion acpi_operand_object *buffer_obj;\n};\n\nstruct acpi_object_bank_field {\n\tunion acpi_operand_object *next_object;\n\tu8 descriptor_type;\n\tu8 type;\n\tu16 reference_count;\n\tu8 flags;\n\tu8 field_flags;\n\tu8 attribute;\n\tu8 access_byte_width;\n\tstruct acpi_namespace_node *node;\n\tu32 bit_length;\n\tu32 base_byte_offset;\n\tu32 value;\n\tu8 start_field_bit_offset;\n\tu8 access_length;\n\tunion acpi_operand_object *region_obj;\n\tunion acpi_operand_object *bank_obj;\n};\n\nstruct acpi_object_index_field {\n\tunion acpi_operand_object *next_object;\n\tu8 descriptor_type;\n\tu8 type;\n\tu16 reference_count;\n\tu8 flags;\n\tu8 field_flags;\n\tu8 attribute;\n\tu8 access_byte_width;\n\tstruct acpi_namespace_node *node;\n\tu32 bit_length;\n\tu32 base_byte_offset;\n\tu32 value;\n\tu8 start_field_bit_offset;\n\tu8 access_length;\n\tunion acpi_operand_object *index_obj;\n\tunion acpi_operand_object *data_obj;\n};\n\ntypedef void (*acpi_notify_handler)(acpi_handle, u32, void *);\n\nstruct acpi_object_notify_handler {\n\tunion acpi_operand_object *next_object;\n\tu8 descriptor_type;\n\tu8 type;\n\tu16 reference_count;\n\tu8 flags;\n\tstruct acpi_namespace_node *node;\n\tu32 handler_type;\n\tacpi_notify_handler handler;\n\tvoid *context;\n\tunion acpi_operand_object *next[2];\n};\n\ntypedef acpi_status (*acpi_adr_space_handler)(u32, acpi_physical_address, u32, u64 *, void *, void *);\n\ntypedef acpi_status (*acpi_adr_space_setup)(acpi_handle, u32, void *, void **);\n\nstruct acpi_object_addr_handler {\n\tunion acpi_operand_object *next_object;\n\tu8 descriptor_type;\n\tu8 type;\n\tu16 reference_count;\n\tu8 flags;\n\tu8 space_id;\n\tu8 handler_flags;\n\tacpi_adr_space_handler handler;\n\tstruct acpi_namespace_node *node;\n\tvoid *context;\n\tvoid *context_mutex;\n\tacpi_adr_space_setup setup;\n\tunion acpi_operand_object *region_list;\n\tunion acpi_operand_object *next;\n};\n\nstruct acpi_object_reference {\n\tunion acpi_operand_object *next_object;\n\tu8 descriptor_type;\n\tu8 type;\n\tu16 reference_count;\n\tu8 flags;\n\tu8 class;\n\tu8 target_type;\n\tu8 resolved;\n\tvoid *object;\n\tstruct acpi_namespace_node *node;\n\tunion acpi_operand_object **where;\n\tu8 *index_pointer;\n\tu8 *aml;\n\tu32 value;\n};\n\nstruct acpi_object_extra {\n\tunion acpi_operand_object *next_object;\n\tu8 descriptor_type;\n\tu8 type;\n\tu16 reference_count;\n\tu8 flags;\n\tstruct acpi_namespace_node *method_REG;\n\tstruct acpi_namespace_node *scope_node;\n\tvoid *region_context;\n\tu8 *aml_start;\n\tu32 aml_length;\n};\n\ntypedef void (*acpi_object_handler)(acpi_handle, void *);\n\nstruct acpi_object_data {\n\tunion acpi_operand_object *next_object;\n\tu8 descriptor_type;\n\tu8 type;\n\tu16 reference_count;\n\tu8 flags;\n\tacpi_object_handler handler;\n\tvoid *pointer;\n};\n\nstruct acpi_object_cache_list {\n\tunion acpi_operand_object *next_object;\n\tu8 descriptor_type;\n\tu8 type;\n\tu16 reference_count;\n\tu8 flags;\n\tunion acpi_operand_object *next;\n};\n\nunion acpi_name_union {\n\tu32 integer;\n\tchar ascii[4];\n};\n\nstruct acpi_namespace_node {\n\tunion acpi_operand_object *object;\n\tu8 descriptor_type;\n\tu8 type;\n\tu16 flags;\n\tunion acpi_name_union name;\n\tstruct acpi_namespace_node *parent;\n\tstruct acpi_namespace_node *child;\n\tstruct acpi_namespace_node *peer;\n\tacpi_owner_id owner_id;\n};\n\nunion acpi_operand_object {\n\tstruct acpi_object_common common;\n\tstruct acpi_object_integer integer;\n\tstruct acpi_object_string string;\n\tstruct acpi_object_buffer buffer;\n\tstruct acpi_object_package package;\n\tstruct acpi_object_event event;\n\tstruct acpi_object_method method;\n\tstruct acpi_object_mutex mutex;\n\tstruct acpi_object_region region;\n\tstruct acpi_object_notify_common common_notify;\n\tstruct acpi_object_device device;\n\tstruct acpi_object_power_resource power_resource;\n\tstruct acpi_object_processor processor;\n\tstruct acpi_object_thermal_zone thermal_zone;\n\tstruct acpi_object_field_common common_field;\n\tstruct acpi_object_region_field field;\n\tstruct acpi_object_buffer_field buffer_field;\n\tstruct acpi_object_bank_field bank_field;\n\tstruct acpi_object_index_field index_field;\n\tstruct acpi_object_notify_handler notify;\n\tstruct acpi_object_addr_handler address_space;\n\tstruct acpi_object_reference reference;\n\tstruct acpi_object_extra extra;\n\tstruct acpi_object_data data;\n\tstruct acpi_object_cache_list cache;\n\tstruct acpi_namespace_node node;\n};\n\nunion acpi_parse_value {\n\tu64 integer;\n\tu32 size;\n\tchar *string;\n\tu8 *buffer;\n\tchar *name;\n\tunion acpi_parse_object *arg;\n};\n\nstruct acpi_parse_obj_common {\n\tunion acpi_parse_object *parent;\n\tu8 descriptor_type;\n\tu8 flags;\n\tu16 aml_opcode;\n\tu8 *aml;\n\tunion acpi_parse_object *next;\n\tstruct acpi_namespace_node *node;\n\tunion acpi_parse_value value;\n\tu8 arg_list_length;\n\tu16 disasm_flags;\n\tu8 disasm_opcode;\n\tchar *operator_symbol;\n\tchar aml_op_name[16];\n};\n\nstruct acpi_parse_obj_named {\n\tunion acpi_parse_object *parent;\n\tu8 descriptor_type;\n\tu8 flags;\n\tu16 aml_opcode;\n\tu8 *aml;\n\tunion acpi_parse_object *next;\n\tstruct acpi_namespace_node *node;\n\tunion acpi_parse_value value;\n\tu8 arg_list_length;\n\tu16 disasm_flags;\n\tu8 disasm_opcode;\n\tchar *operator_symbol;\n\tchar aml_op_name[16];\n\tchar *path;\n\tu8 *data;\n\tu32 length;\n\tu32 name;\n};\n\nstruct acpi_parse_obj_asl {\n\tunion acpi_parse_object *parent;\n\tu8 descriptor_type;\n\tu8 flags;\n\tu16 aml_opcode;\n\tu8 *aml;\n\tunion acpi_parse_object *next;\n\tstruct acpi_namespace_node *node;\n\tunion acpi_parse_value value;\n\tu8 arg_list_length;\n\tu16 disasm_flags;\n\tu8 disasm_opcode;\n\tchar *operator_symbol;\n\tchar aml_op_name[16];\n\tunion acpi_parse_object *child;\n\tunion acpi_parse_object *parent_method;\n\tchar *filename;\n\tu8 file_changed;\n\tchar *parent_filename;\n\tchar *external_name;\n\tchar *namepath;\n\tchar name_seg[4];\n\tu32 extra_value;\n\tu32 column;\n\tu32 line_number;\n\tu32 logical_line_number;\n\tu32 logical_byte_offset;\n\tu32 end_line;\n\tu32 end_logical_line;\n\tu32 acpi_btype;\n\tu32 aml_length;\n\tu32 aml_subtree_length;\n\tu32 final_aml_length;\n\tu32 final_aml_offset;\n\tu32 compile_flags;\n\tu16 parse_opcode;\n\tu8 aml_opcode_length;\n\tu8 aml_pkg_len_bytes;\n\tu8 extra;\n\tchar parse_op_name[20];\n};\n\nunion acpi_parse_object {\n\tstruct acpi_parse_obj_common common;\n\tstruct acpi_parse_obj_named named;\n\tstruct acpi_parse_obj_asl asl;\n};\n\nunion acpi_descriptor {\n\tstruct acpi_common_descriptor common;\n\tunion acpi_operand_object object;\n\tstruct acpi_namespace_node node;\n\tunion acpi_parse_object op;\n};\n\nstruct acpi_device_id {\n\t__u8 id[16];\n\tkernel_ulong_t driver_data;\n\t__u32 cls;\n\t__u32 cls_msk;\n};\n\nstruct acpi_dev_match_info {\n\tstruct acpi_device_id hid[2];\n\tconst char *uid;\n\ts64 hrv;\n};\n\nstruct acpi_dev_walk_context {\n\tint (*fn)(struct acpi_device *, void *);\n\tvoid *data;\n};\n\nstruct acpi_device_status {\n\tu32 present: 1;\n\tu32 enabled: 1;\n\tu32 show_in_ui: 1;\n\tu32 functional: 1;\n\tu32 battery_present: 1;\n\tu32 reserved: 27;\n};\n\nstruct acpi_device_flags {\n\tu32 dynamic_status: 1;\n\tu32 removable: 1;\n\tu32 ejectable: 1;\n\tu32 power_manageable: 1;\n\tu32 match_driver: 1;\n\tu32 initialized: 1;\n\tu32 visited: 1;\n\tu32 hotplug_notify: 1;\n\tu32 is_dock_station: 1;\n\tu32 of_compatible_ok: 1;\n\tu32 coherent_dma: 1;\n\tu32 cca_seen: 1;\n\tu32 enumeration_by_parent: 1;\n\tu32 honor_deps: 1;\n\tu32 reserved: 18;\n};\n\nstruct acpi_pnp_type {\n\tu32 hardware_id: 1;\n\tu32 bus_address: 1;\n\tu32 platform_id: 1;\n\tu32 backlight: 1;\n\tu32 reserved: 28;\n};\n\nstruct acpi_device_pnp {\n\tacpi_bus_id bus_id;\n\tint instance_no;\n\tstruct acpi_pnp_type type;\n\tacpi_bus_address bus_address;\n\tchar *unique_id;\n\tstruct list_head ids;\n\tacpi_device_name device_name;\n\tacpi_device_class device_class;\n\tunion acpi_object *str_obj;\n};\n\nstruct acpi_device_power_flags {\n\tu32 explicit_get: 1;\n\tu32 power_resources: 1;\n\tu32 inrush_current: 1;\n\tu32 power_removed: 1;\n\tu32 ignore_parent: 1;\n\tu32 dsw_present: 1;\n\tu32 reserved: 26;\n};\n\nstruct acpi_device_power_state {\n\tstruct list_head resources;\n\tstruct {\n\t\tu8 valid: 1;\n\t\tu8 explicit_set: 1;\n\t\tu8 reserved: 6;\n\t} flags;\n\tint power;\n\tint latency;\n};\n\nstruct acpi_device_power {\n\tint state;\n\tstruct acpi_device_power_flags flags;\n\tstruct acpi_device_power_state states[5];\n\tu8 state_for_enumeration;\n};\n\nstruct acpi_device_wakeup_flags {\n\tu8 valid: 1;\n\tu8 notifier_present: 1;\n};\n\nstruct acpi_device_wakeup_context {\n\tvoid (*func)(struct acpi_device_wakeup_context *);\n\tstruct device *dev;\n};\n\nstruct acpi_device_wakeup {\n\tacpi_handle gpe_device;\n\tu64 gpe_number;\n\tu64 sleep_state;\n\tstruct list_head resources;\n\tstruct acpi_device_wakeup_flags flags;\n\tstruct acpi_device_wakeup_context context;\n\tstruct wakeup_source *ws;\n\tint prepare_count;\n\tint enable_count;\n};\n\nstruct acpi_device_perf_flags {\n\tu8 reserved: 8;\n};\n\nstruct acpi_device_perf_state;\n\nstruct acpi_device_perf {\n\tint state;\n\tstruct acpi_device_perf_flags flags;\n\tint state_count;\n\tstruct acpi_device_perf_state *states;\n};\n\nstruct proc_dir_entry;\n\nstruct acpi_device_dir {\n\tstruct proc_dir_entry *entry;\n};\n\nstruct acpi_scan_handler;\n\nstruct acpi_hotplug_context;\n\nstruct acpi_device_software_nodes;\n\nstruct acpi_gpio_mapping;\n\nstruct acpi_device {\n\tu32 pld_crc;\n\tint device_type;\n\tacpi_handle handle;\n\tstruct fwnode_handle fwnode;\n\tstruct list_head wakeup_list;\n\tstruct list_head del_list;\n\tstruct acpi_device_status status;\n\tstruct acpi_device_flags flags;\n\tstruct acpi_device_pnp pnp;\n\tstruct acpi_device_power power;\n\tstruct acpi_device_wakeup wakeup;\n\tstruct acpi_device_perf performance;\n\tstruct acpi_device_dir dir;\n\tstruct acpi_device_data data;\n\tstruct acpi_scan_handler *handler;\n\tstruct acpi_hotplug_context *hp;\n\tstruct acpi_device_software_nodes *swnodes;\n\tconst struct acpi_gpio_mapping *driver_gpios;\n\tvoid *driver_data;\n\tstruct device dev;\n\tunsigned int physical_node_count;\n\tunsigned int dep_unmet;\n\tstruct list_head physical_node_list;\n\tstruct mutex physical_node_lock;\n\tvoid (*remove)(struct acpi_device *);\n};\n\nstruct xarray {\n\tspinlock_t xa_lock;\n\tgfp_t xa_flags;\n\tvoid *xa_head;\n};\n\nstruct ida {\n\tstruct xarray xa;\n};\n\nstruct acpi_device_bus_id {\n\tconst char *bus_id;\n\tstruct ida instance_ida;\n\tstruct list_head node;\n};\n\nstruct acpi_pnp_device_id {\n\tu32 length;\n\tchar *string;\n};\n\nstruct acpi_pnp_device_id_list {\n\tu32 count;\n\tu32 list_size;\n\tstruct acpi_pnp_device_id ids[0];\n};\n\nstruct acpi_device_info {\n\tu32 info_size;\n\tu32 name;\n\tacpi_object_type type;\n\tu8 param_count;\n\tu16 valid;\n\tu8 flags;\n\tu8 highest_dstates[4];\n\tu8 lowest_dstates[5];\n\tu64 address;\n\tstruct acpi_pnp_device_id hardware_id;\n\tstruct acpi_pnp_device_id unique_id;\n\tstruct acpi_pnp_device_id class_code;\n\tstruct acpi_pnp_device_id_list compatible_id_list;\n};\n\ntypedef int (*acpi_op_add)(struct acpi_device *);\n\ntypedef void (*acpi_op_remove)(struct acpi_device *);\n\ntypedef void (*acpi_op_notify)(struct acpi_device *, u32);\n\nstruct acpi_device_ops {\n\tacpi_op_add add;\n\tacpi_op_remove remove;\n\tacpi_op_notify notify;\n};\n\nstruct acpi_device_perf_state {\n\tstruct {\n\t\tu8 valid: 1;\n\t\tu8 reserved: 7;\n\t} flags;\n\tu8 power;\n\tu8 performance;\n\tint latency;\n};\n\nstruct acpi_device_physical_node {\n\tstruct list_head node;\n\tstruct device *dev;\n\tunsigned int node_id;\n\tbool put_online: 1;\n};\n\nstruct acpi_device_properties {\n\tstruct list_head list;\n\tconst guid_t *guid;\n\tunion acpi_object *properties;\n\tvoid **bufs;\n};\n\nstruct property_entry {\n\tconst char *name;\n\tsize_t length;\n\tbool is_inline;\n\tenum dev_prop_type type;\n\tunion {\n\t\tconst void *pointer;\n\t\tunion {\n\t\t\tu8 u8_data[8];\n\t\t\tu16 u16_data[4];\n\t\t\tu32 u32_data[2];\n\t\t\tu64 u64_data[1];\n\t\t\tconst char *str[1];\n\t\t} value;\n\t};\n};\n\nstruct software_node;\n\nstruct software_node_ref_args {\n\tconst struct software_node *node;\n\tunsigned int nargs;\n\tu64 args[8];\n};\n\nstruct acpi_device_software_node_port {\n\tchar port_name[9];\n\tu32 data_lanes[8];\n\tu32 lane_polarities[9];\n\tu64 link_frequencies[8];\n\tunsigned int port_nr;\n\tbool crs_csi2_local;\n\tstruct property_entry port_props[2];\n\tstruct property_entry ep_props[8];\n\tstruct software_node_ref_args remote_ep[1];\n};\n\nstruct acpi_device_software_nodes {\n\tstruct property_entry dev_props[6];\n\tstruct software_node *nodes;\n\tconst struct software_node **nodeptrs;\n\tstruct acpi_device_software_node_port *ports;\n\tunsigned int num_ports;\n};\n\nstruct acpi_table_desc;\n\nstruct acpi_evaluate_info;\n\nstruct acpi_device_walk_info {\n\tstruct acpi_table_desc *table_desc;\n\tstruct acpi_evaluate_info *evaluate_info;\n\tu32 device_count;\n\tu32 num_STA;\n\tu32 num_INI;\n};\n\nstruct acpi_dlayer {\n\tconst char *name;\n\tlong unsigned int value;\n};\n\nstruct acpi_dlevel {\n\tconst char *name;\n\tlong unsigned int value;\n};\n\nstruct dma_chan;\n\nstruct acpi_dma_spec;\n\nstruct acpi_dma {\n\tstruct list_head dma_controllers;\n\tstruct device *dev;\n\tstruct dma_chan * (*acpi_dma_xlate)(struct acpi_dma_spec *, struct acpi_dma *);\n\tvoid *data;\n\tshort unsigned int base_request_line;\n\tshort unsigned int end_request_line;\n};\n\ntypedef bool (*dma_filter_fn)(struct dma_chan *, void *);\n\nstruct acpi_dma_filter_info {\n\tdma_cap_mask_t dma_cap;\n\tdma_filter_fn filter_fn;\n};\n\nstruct acpi_dma_spec {\n\tint chan_id;\n\tint slave_id;\n\tstruct device *dev;\n};\n\nstruct acpi_dma_parser_data {\n\tstruct acpi_dma_spec dma_spec;\n\tsize_t index;\n\tsize_t n;\n};\n\nstruct acpi_dmar_header {\n\tu16 type;\n\tu16 length;\n};\n\nstruct acpi_dmar_andd {\n\tstruct acpi_dmar_header header;\n\tu8 reserved[3];\n\tu8 device_number;\n\tunion {\n\t\tchar __pad;\n\t\tstruct {\n\t\t\tstruct {} __Empty_device_name;\n\t\t\tchar device_name[0];\n\t\t};\n\t};\n} __attribute__((packed));\n\nstruct acpi_dmar_atsr {\n\tstruct acpi_dmar_header header;\n\tu8 flags;\n\tu8 reserved;\n\tu16 segment;\n};\n\nstruct acpi_dmar_device_scope {\n\tu8 entry_type;\n\tu8 length;\n\tu16 reserved;\n\tu8 enumeration_id;\n\tu8 bus;\n};\n\nstruct acpi_dmar_hardware_unit {\n\tstruct acpi_dmar_header header;\n\tu8 flags;\n\tu8 size;\n\tu16 segment;\n\tu64 address;\n};\n\nstruct acpi_dmar_pci_path {\n\tu8 device;\n\tu8 function;\n};\n\nstruct acpi_dmar_reserved_memory {\n\tstruct acpi_dmar_header header;\n\tu16 reserved;\n\tu16 segment;\n\tu64 base_address;\n\tu64 end_address;\n};\n\nstruct acpi_dmar_rhsa {\n\tstruct acpi_dmar_header header;\n\tu32 reserved;\n\tu64 base_address;\n\tu32 proximity_domain;\n} __attribute__((packed));\n\nstruct acpi_dmar_satc {\n\tstruct acpi_dmar_header header;\n\tu8 flags;\n\tu8 reserved;\n\tu16 segment;\n};\n\nstruct of_device_id;\n\nstruct dev_pm_ops;\n\nstruct driver_private;\n\nstruct device_driver {\n\tconst char *name;\n\tconst struct bus_type *bus;\n\tstruct module *owner;\n\tconst char *mod_name;\n\tbool suppress_bind_attrs;\n\tenum probe_type probe_type;\n\tconst struct of_device_id *of_match_table;\n\tconst struct acpi_device_id *acpi_match_table;\n\tint (*probe)(struct device *);\n\tvoid (*sync_state)(struct device *);\n\tint (*remove)(struct device *);\n\tvoid (*shutdown)(struct device *);\n\tint (*suspend)(struct device *, pm_message_t);\n\tint (*resume)(struct device *);\n\tconst struct attribute_group **groups;\n\tconst struct attribute_group **dev_groups;\n\tconst struct dev_pm_ops *pm;\n\tvoid (*coredump)(struct device *);\n\tstruct driver_private *p;\n};\n\nstruct acpi_driver {\n\tchar name[80];\n\tchar class[80];\n\tconst struct acpi_device_id *ids;\n\tunsigned int flags;\n\tstruct acpi_device_ops ops;\n\tstruct device_driver drv;\n};\n\nstruct transaction;\n\nstruct acpi_ec {\n\tacpi_handle handle;\n\tint gpe;\n\tint irq;\n\tlong unsigned int command_addr;\n\tlong unsigned int data_addr;\n\tbool global_lock;\n\tlong unsigned int flags;\n\tlong unsigned int reference_count;\n\tstruct mutex mutex;\n\twait_queue_head_t wait;\n\tstruct list_head list;\n\tstruct transaction *curr;\n\tspinlock_t lock;\n\tstruct work_struct work;\n\tlong unsigned int timestamp;\n\tenum acpi_ec_event_state event_state;\n\tunsigned int events_to_process;\n\tunsigned int events_in_progress;\n\tunsigned int queries_in_progress;\n\tbool busy_polling;\n\tunsigned int polling_guard;\n};\n\nstruct transaction {\n\tconst u8 *wdata;\n\tu8 *rdata;\n\tshort unsigned int irq_count;\n\tu8 command;\n\tu8 wi;\n\tu8 ri;\n\tu8 wlen;\n\tu8 rlen;\n\tu8 flags;\n};\n\nstruct acpi_ec_query_handler;\n\nstruct acpi_ec_query {\n\tstruct transaction transaction;\n\tstruct work_struct work;\n\tstruct acpi_ec_query_handler *handler;\n\tstruct acpi_ec *ec;\n};\n\ntypedef int (*acpi_ec_query_func)(void *);\n\nstruct acpi_ec_query_handler {\n\tstruct list_head node;\n\tacpi_ec_query_func func;\n\tacpi_handle handle;\n\tvoid *data;\n\tu8 query_bit;\n\tstruct kref kref;\n};\n\nunion acpi_predefined_info;\n\nstruct acpi_evaluate_info {\n\tstruct acpi_namespace_node *prefix_node;\n\tconst char *relative_pathname;\n\tunion acpi_operand_object **parameters;\n\tstruct acpi_namespace_node *node;\n\tunion acpi_operand_object *obj_desc;\n\tchar *full_pathname;\n\tconst union acpi_predefined_info *predefined;\n\tunion acpi_operand_object *return_object;\n\tunion acpi_operand_object *parent_package;\n\tu32 return_flags;\n\tu32 return_btype;\n\tu16 param_count;\n\tu16 node_flags;\n\tu8 pass_number;\n\tu8 return_object_type;\n\tu8 flags;\n};\n\nstruct acpi_exception_info {\n\tchar *name;\n};\n\nstruct acpi_exdump_info {\n\tu8 opcode;\n\tu8 offset;\n\tconst char *name;\n} __attribute__((packed));\n\nstruct acpi_fadt_info {\n\tconst char *name;\n\tu16 address64;\n\tu16 address32;\n\tu16 length;\n\tu8 default_length;\n\tu8 flags;\n};\n\nstruct acpi_generic_address;\n\nstruct acpi_fadt_pm_info {\n\tstruct acpi_generic_address *target;\n\tu16 source;\n\tu8 register_num;\n};\n\nstruct acpi_fan_fif {\n\tu8 revision;\n\tu8 fine_grain_ctrl;\n\tu8 step_size;\n\tu8 low_speed_notification;\n};\n\nstruct device_attribute {\n\tstruct attribute attr;\n\tssize_t (*show)(struct device *, struct device_attribute *, char *);\n\tssize_t (*store)(struct device *, struct device_attribute *, const char *, size_t);\n};\n\nstruct acpi_fan_fps;\n\nstruct thermal_cooling_device;\n\nstruct acpi_fan {\n\tbool acpi4;\n\tstruct acpi_fan_fif fif;\n\tstruct acpi_fan_fps *fps;\n\tint fps_count;\n\tstruct thermal_cooling_device *cdev;\n\tstruct device_attribute fst_speed;\n\tstruct device_attribute fine_grain_control;\n};\n\nstruct acpi_fan_fps {\n\tu64 control;\n\tu64 trip_point;\n\tu64 speed;\n\tu64 noise_level;\n\tu64 power;\n\tchar name[20];\n\tstruct device_attribute dev_attr;\n};\n\nstruct acpi_fan_fst {\n\tu64 revision;\n\tu64 control;\n\tu64 speed;\n};\n\nstruct acpi_ffh_info {\n\tu64 offset;\n\tu64 length;\n};\n\ntypedef u32 (*acpi_event_handler)(void *);\n\nstruct acpi_fixed_event_handler {\n\tacpi_event_handler handler;\n\tvoid *context;\n};\n\nstruct acpi_fixed_event_info {\n\tu8 status_register_id;\n\tu8 enable_register_id;\n\tu16 status_bit_mask;\n\tu16 enable_bit_mask;\n};\n\nstruct acpi_ged_device {\n\tstruct device *dev;\n\tstruct list_head event_list;\n};\n\nstruct acpi_ged_event {\n\tstruct list_head node;\n\tstruct device *dev;\n\tunsigned int gsi;\n\tunsigned int irq;\n\tacpi_handle handle;\n};\n\nstruct acpi_ged_handler_info {\n\tstruct acpi_ged_handler_info *next;\n\tu32 int_id;\n\tstruct acpi_namespace_node *evt_method;\n};\n\nstruct acpi_generic_address {\n\tu8 space_id;\n\tu8 bit_width;\n\tu8 bit_offset;\n\tu8 access_width;\n\tu64 address;\n} __attribute__((packed));\n\nstruct acpi_update_state {\n\tvoid *next;\n\tu8 descriptor_type;\n\tu8 flags;\n\tu16 value;\n\tu16 state;\n\tunion acpi_operand_object *object;\n};\n\nstruct acpi_scope_state {\n\tvoid *next;\n\tu8 descriptor_type;\n\tu8 flags;\n\tu16 value;\n\tu16 state;\n\tstruct acpi_namespace_node *node;\n};\n\nstruct acpi_pscope_state {\n\tvoid *next;\n\tu8 descriptor_type;\n\tu8 flags;\n\tu16 value;\n\tu16 state;\n\tu32 arg_count;\n\tunion acpi_parse_object *op;\n\tu8 *arg_end;\n\tu8 *pkg_end;\n\tu32 arg_list;\n};\n\nstruct acpi_pkg_state {\n\tvoid *next;\n\tu8 descriptor_type;\n\tu8 flags;\n\tu16 value;\n\tu16 state;\n\tu32 index;\n\tunion acpi_operand_object *source_object;\n\tunion acpi_operand_object *dest_object;\n\tstruct acpi_walk_state *walk_state;\n\tvoid *this_target_obj;\n\tu32 num_packages;\n};\n\nstruct acpi_thread_state {\n\tvoid *next;\n\tu8 descriptor_type;\n\tu8 flags;\n\tu16 value;\n\tu16 state;\n\tu8 current_sync_level;\n\tstruct acpi_walk_state *walk_state_list;\n\tunion acpi_operand_object *acquired_mutex_list;\n\tu64 thread_id;\n};\n\nstruct acpi_result_values {\n\tvoid *next;\n\tu8 descriptor_type;\n\tu8 flags;\n\tu16 value;\n\tu16 state;\n\tunion acpi_operand_object *obj_desc[8];\n};\n\nstruct acpi_global_notify_handler;\n\nstruct acpi_notify_info {\n\tvoid *next;\n\tu8 descriptor_type;\n\tu8 flags;\n\tu16 value;\n\tu16 state;\n\tu8 handler_list_id;\n\tstruct acpi_namespace_node *node;\n\tunion acpi_operand_object *handler_list_head;\n\tstruct acpi_global_notify_handler *global;\n};\n\nunion acpi_generic_state {\n\tstruct acpi_common_state common;\n\tstruct acpi_control_state control;\n\tstruct acpi_update_state update;\n\tstruct acpi_scope_state scope;\n\tstruct acpi_pscope_state parse_scope;\n\tstruct acpi_pkg_state pkg;\n\tstruct acpi_thread_state thread;\n\tstruct acpi_result_values results;\n\tstruct acpi_notify_info notify;\n};\n\nstruct acpi_genl_event {\n\tacpi_device_class device_class;\n\tchar bus_id[15];\n\tu32 type;\n\tu32 data;\n};\n\ntypedef acpi_status (*acpi_walk_callback)(acpi_handle, u32, void *, void **);\n\nstruct acpi_get_devices_info {\n\tacpi_walk_callback user_function;\n\tvoid *context;\n\tconst char *hid;\n};\n\nstruct acpi_global_notify_handler {\n\tacpi_notify_handler handler;\n\tvoid *context;\n};\n\nstruct acpi_gpe_address {\n\tu8 space_id;\n\tu64 address;\n};\n\nstruct acpi_gpe_xrupt_info;\n\nstruct acpi_gpe_register_info;\n\nstruct acpi_gpe_event_info;\n\nstruct acpi_gpe_block_info {\n\tstruct acpi_namespace_node *node;\n\tstruct acpi_gpe_block_info *previous;\n\tstruct acpi_gpe_block_info *next;\n\tstruct acpi_gpe_xrupt_info *xrupt_block;\n\tstruct acpi_gpe_register_info *register_info;\n\tstruct acpi_gpe_event_info *event_info;\n\tu64 address;\n\tu32 register_count;\n\tu16 gpe_count;\n\tu16 block_base_number;\n\tu8 space_id;\n\tu8 initialized;\n};\n\nstruct acpi_gpe_block_status_context {\n\tstruct acpi_gpe_register_info *gpe_skip_register_info;\n\tu8 gpe_skip_mask;\n\tu8 retval;\n};\n\nstruct acpi_gpe_device_info {\n\tu32 index;\n\tu32 next_block_base_index;\n\tacpi_status status;\n\tstruct acpi_namespace_node *gpe_device;\n};\n\nstruct acpi_gpe_handler_info;\n\nstruct acpi_gpe_notify_info;\n\nunion acpi_gpe_dispatch_info {\n\tstruct acpi_namespace_node *method_node;\n\tstruct acpi_gpe_handler_info *handler;\n\tstruct acpi_gpe_notify_info *notify_list;\n};\n\nstruct acpi_gpe_event_info {\n\tunion acpi_gpe_dispatch_info dispatch;\n\tstruct acpi_gpe_register_info *register_info;\n\tu8 flags;\n\tu8 gpe_number;\n\tu8 runtime_count;\n\tu8 disable_for_dispatch;\n};\n\ntypedef u32 (*acpi_gpe_handler)(acpi_handle, u32, void *);\n\nstruct acpi_gpe_handler_info {\n\tacpi_gpe_handler address;\n\tvoid *context;\n\tstruct acpi_namespace_node *method_node;\n\tu8 original_flags;\n\tu8 originally_enabled;\n};\n\nstruct acpi_gpe_notify_info {\n\tstruct acpi_namespace_node *device_node;\n\tstruct acpi_gpe_notify_info *next;\n};\n\nstruct acpi_gpe_register_info {\n\tstruct acpi_gpe_address status_address;\n\tstruct acpi_gpe_address enable_address;\n\tu16 base_gpe_number;\n\tu8 enable_for_wake;\n\tu8 enable_for_run;\n\tu8 mask_for_run;\n\tu8 enable_mask;\n};\n\nstruct acpi_gpe_walk_info {\n\tstruct acpi_namespace_node *gpe_device;\n\tstruct acpi_gpe_block_info *gpe_block;\n\tu16 count;\n\tacpi_owner_id owner_id;\n\tu8 execute_by_owner_id;\n};\n\nstruct acpi_gpe_xrupt_info {\n\tstruct acpi_gpe_xrupt_info *previous;\n\tstruct acpi_gpe_xrupt_info *next;\n\tstruct acpi_gpe_block_info *gpe_block_list_head;\n\tu32 interrupt_number;\n};\n\nstruct gpio_chip;\n\nstruct acpi_gpio_chip {\n\tstruct acpi_connection_info conn_info;\n\tstruct list_head conns;\n\tstruct mutex conn_lock;\n\tstruct gpio_chip *chip;\n\tstruct list_head events;\n\tstruct list_head deferred_req_irqs_list_entry;\n};\n\nstruct gpio_desc;\n\nstruct acpi_gpio_connection {\n\tstruct list_head node;\n\tunsigned int pin;\n\tstruct gpio_desc *desc;\n};\n\ntypedef irqreturn_t (*irq_handler_t)(int, void *);\n\nstruct acpi_gpio_event {\n\tstruct list_head node;\n\tacpi_handle handle;\n\tirq_handler_t handler;\n\tunsigned int pin;\n\tunsigned int irq;\n\tlong unsigned int irqflags;\n\tbool irq_is_wake;\n\tbool irq_requested;\n\tstruct gpio_desc *desc;\n};\n\nstruct acpi_gpio_info {\n\tstruct acpi_device *adev;\n\tenum gpiod_flags flags;\n\tbool gpioint;\n\tint pin_config;\n\tint polarity;\n\tint triggering;\n\tbool wake_capable;\n\tunsigned int debounce;\n\tunsigned int quirks;\n};\n\nstruct acpi_gpio_lookup {\n\tstruct acpi_gpio_info info;\n\tint index;\n\tu16 pin_index;\n\tbool active_low;\n\tstruct gpio_desc *desc;\n\tint n;\n};\n\nstruct acpi_gpio_params;\n\nstruct acpi_gpio_mapping {\n\tconst char *name;\n\tconst struct acpi_gpio_params *data;\n\tunsigned int size;\n\tunsigned int quirks;\n};\n\nstruct acpi_gpio_params {\n\tunsigned int crs_entry_index;\n\tunsigned int line_index;\n\tbool active_low;\n};\n\nstruct acpi_gpiolib_dmi_quirk {\n\tbool no_edge_events_on_boot;\n\tchar *ignore_wake;\n\tchar *ignore_interrupt;\n};\n\nstruct acpi_handle_list {\n\tu32 count;\n\tacpi_handle *handles;\n};\n\nstruct acpi_handler_info {\n\tvoid *handler;\n\tchar *name;\n};\n\nstruct acpi_hardware_id {\n\tstruct list_head list;\n\tconst char *id;\n};\n\nstruct acpi_hest_header {\n\tu16 type;\n\tu16 source_id;\n};\n\nstruct acpi_hest_notify {\n\tu8 type;\n\tu8 length;\n\tu16 config_write_enable;\n\tu32 poll_interval;\n\tu32 vector;\n\tu32 polling_threshold_value;\n\tu32 polling_threshold_window;\n\tu32 error_threshold_value;\n\tu32 error_threshold_window;\n};\n\nstruct acpi_hest_generic {\n\tstruct acpi_hest_header header;\n\tu16 related_source_id;\n\tu8 reserved;\n\tu8 enabled;\n\tu32 records_to_preallocate;\n\tu32 max_sections_per_record;\n\tu32 max_raw_data_length;\n\tstruct acpi_generic_address error_status_address;\n\tstruct acpi_hest_notify notify;\n\tu32 error_block_length;\n};\n\nstruct acpi_hest_generic_data {\n\tu8 section_type[16];\n\tu32 error_severity;\n\tu16 revision;\n\tu8 validation_bits;\n\tu8 flags;\n\tu32 error_data_length;\n\tu8 fru_id[16];\n\tu8 fru_text[20];\n};\n\nstruct acpi_hest_generic_data_v300 {\n\tu8 section_type[16];\n\tu32 error_severity;\n\tu16 revision;\n\tu8 validation_bits;\n\tu8 flags;\n\tu32 error_data_length;\n\tu8 fru_id[16];\n\tu8 fru_text[20];\n\tu64 time_stamp;\n};\n\nstruct acpi_hest_generic_status {\n\tu32 block_status;\n\tu32 raw_data_offset;\n\tu32 raw_data_length;\n\tu32 data_length;\n\tu32 error_severity;\n};\n\nstruct acpi_hest_generic_v2 {\n\tstruct acpi_hest_header header;\n\tu16 related_source_id;\n\tu8 reserved;\n\tu8 enabled;\n\tu32 records_to_preallocate;\n\tu32 max_sections_per_record;\n\tu32 max_raw_data_length;\n\tstruct acpi_generic_address error_status_address;\n\tstruct acpi_hest_notify notify;\n\tu32 error_block_length;\n\tstruct acpi_generic_address read_ack_register;\n\tu64 read_ack_preserve;\n\tu64 read_ack_write;\n} __attribute__((packed));\n\nstruct acpi_hest_ia_corrected {\n\tstruct acpi_hest_header header;\n\tu16 reserved1;\n\tu8 flags;\n\tu8 enabled;\n\tu32 records_to_preallocate;\n\tu32 max_sections_per_record;\n\tstruct acpi_hest_notify notify;\n\tu8 num_hardware_banks;\n\tu8 reserved2[3];\n};\n\nstruct acpi_hest_ia_deferred_check {\n\tstruct acpi_hest_header header;\n\tu16 reserved1;\n\tu8 flags;\n\tu8 enabled;\n\tu32 records_to_preallocate;\n\tu32 max_sections_per_record;\n\tstruct acpi_hest_notify notify;\n\tu8 num_hardware_banks;\n\tu8 reserved2[3];\n};\n\nstruct acpi_hest_ia_error_bank {\n\tu8 bank_number;\n\tu8 clear_status_on_init;\n\tu8 status_format;\n\tu8 reserved;\n\tu32 control_register;\n\tu64 control_data;\n\tu32 status_register;\n\tu32 address_register;\n\tu32 misc_register;\n} __attribute__((packed));\n\nstruct acpi_hest_ia_machine_check {\n\tstruct acpi_hest_header header;\n\tu16 reserved1;\n\tu8 flags;\n\tu8 enabled;\n\tu32 records_to_preallocate;\n\tu32 max_sections_per_record;\n\tu64 global_capability_data;\n\tu64 global_control_data;\n\tu8 num_hardware_banks;\n\tu8 reserved3[7];\n};\n\nstruct acpi_hmat_structure {\n\tu16 type;\n\tu16 reserved;\n\tu32 length;\n};\n\nstruct acpi_hmat_cache {\n\tstruct acpi_hmat_structure header;\n\tu32 memory_PD;\n\tu32 reserved1;\n\tu64 cache_size;\n\tu32 cache_attributes;\n\tu16 reserved2;\n\tu16 number_of_SMBIOShandles;\n};\n\nstruct acpi_hmat_locality {\n\tstruct acpi_hmat_structure header;\n\tu8 flags;\n\tu8 data_type;\n\tu8 min_transfer_size;\n\tu8 reserved1;\n\tu32 number_of_initiator_Pds;\n\tu32 number_of_target_Pds;\n\tu32 reserved2;\n\tu64 entry_base_unit;\n};\n\nstruct acpi_hmat_proximity_domain {\n\tstruct acpi_hmat_structure header;\n\tu16 flags;\n\tu16 reserved1;\n\tu32 processor_PD;\n\tu32 memory_PD;\n\tu32 reserved2;\n\tu64 reserved3;\n\tu64 reserved4;\n};\n\ntypedef int (*acpi_hp_notify)(struct acpi_device *, u32);\n\ntypedef void (*acpi_hp_uevent)(struct acpi_device *, u32);\n\ntypedef void (*acpi_hp_fixup)(struct acpi_device *);\n\nstruct acpi_hotplug_context {\n\tstruct acpi_device *self;\n\tacpi_hp_notify notify;\n\tacpi_hp_uevent uevent;\n\tacpi_hp_fixup fixup;\n};\n\nstruct acpi_hotplug_profile {\n\tstruct kobject kobj;\n\tint (*scan_dependent)(struct acpi_device *);\n\tvoid (*notify_online)(struct acpi_device *);\n\tbool enabled: 1;\n\tbool demand_offline: 1;\n};\n\nstruct acpi_hp_work {\n\tstruct work_struct work;\n\tstruct acpi_device *adev;\n\tu32 src;\n};\n\nstruct acpi_init_walk_info {\n\tu32 table_index;\n\tu32 object_count;\n\tu32 method_count;\n\tu32 serial_method_count;\n\tu32 non_serial_method_count;\n\tu32 serialized_method_count;\n\tu32 device_count;\n\tu32 op_region_count;\n\tu32 field_count;\n\tu32 buffer_count;\n\tu32 package_count;\n\tu32 op_region_init;\n\tu32 field_init;\n\tu32 buffer_init;\n\tu32 package_init;\n\tacpi_owner_id owner_id;\n};\n\nstruct acpi_integrity_info {\n\tu32 nodes;\n\tu32 objects;\n};\n\nstruct acpi_interface_info {\n\tchar *name;\n\tstruct acpi_interface_info *next;\n\tu8 flags;\n\tu8 value;\n};\n\nstruct acpi_io_attribute {\n\tu8 range_type;\n\tu8 translation;\n\tu8 translation_type;\n\tu8 reserved1;\n};\n\nstruct rcu_work {\n\tstruct work_struct work;\n\tstruct callback_head rcu;\n\tstruct workqueue_struct *wq;\n};\n\nstruct acpi_ioremap {\n\tstruct list_head list;\n\tvoid *virt;\n\tacpi_physical_address phys;\n\tacpi_size size;\n\tunion {\n\t\tlong unsigned int refcount;\n\t\tstruct rcu_work rwork;\n\t} track;\n};\n\nstruct acpi_lpat {\n\tint temp;\n\tint raw;\n};\n\nstruct acpi_lpat_conversion_table {\n\tstruct acpi_lpat *lpat;\n\tint lpat_count;\n};\n\nstruct acpi_lpi_state {\n\tu32 min_residency;\n\tu32 wake_latency;\n\tu32 flags;\n\tu32 arch_flags;\n\tu32 res_cnt_freq;\n\tu32 enable_parent_state;\n\tu64 address;\n\tu8 index;\n\tu8 entry_method;\n\tchar desc[32];\n};\n\nstruct acpi_lpi_states_array {\n\tunsigned int size;\n\tunsigned int composite_states_size;\n\tstruct acpi_lpi_state *entries;\n\tstruct acpi_lpi_state *composite_states[8];\n};\n\nstruct acpi_lpit_header {\n\tu32 type;\n\tu32 length;\n\tu16 unique_id;\n\tu16 reserved;\n\tu32 flags;\n};\n\nstruct acpi_lpit_native {\n\tstruct acpi_lpit_header header;\n\tstruct acpi_generic_address entry_trigger;\n\tu32 residency;\n\tu32 latency;\n\tstruct acpi_generic_address residency_counter;\n\tu64 counter_frequency;\n};\n\nstruct acpi_subtable_header {\n\tu8 type;\n\tu8 length;\n};\n\nstruct acpi_madt_core_pic {\n\tstruct acpi_subtable_header header;\n\tu8 version;\n\tu32 processor_id;\n\tu32 core_id;\n\tu32 flags;\n} __attribute__((packed));\n\nstruct acpi_madt_generic_distributor {\n\tstruct acpi_subtable_header header;\n\tu16 reserved;\n\tu32 gic_id;\n\tu64 base_address;\n\tu32 global_irq_base;\n\tu8 version;\n\tu8 reserved2[3];\n};\n\nstruct acpi_madt_generic_interrupt {\n\tstruct acpi_subtable_header header;\n\tu16 reserved;\n\tu32 cpu_interface_number;\n\tu32 uid;\n\tu32 flags;\n\tu32 parking_version;\n\tu32 performance_interrupt;\n\tu64 parked_address;\n\tu64 base_address;\n\tu64 gicv_base_address;\n\tu64 gich_base_address;\n\tu32 vgic_interrupt;\n\tu64 gicr_base_address;\n\tu64 arm_mpidr;\n\tu8 efficiency_class;\n\tu8 reserved2[1];\n\tu16 spe_interrupt;\n\tu16 trbe_interrupt;\n} __attribute__((packed));\n\nstruct acpi_madt_interrupt_override {\n\tstruct acpi_subtable_header header;\n\tu8 bus;\n\tu8 source_irq;\n\tu32 global_irq;\n\tu16 inti_flags;\n} __attribute__((packed));\n\nstruct acpi_madt_interrupt_source {\n\tstruct acpi_subtable_header header;\n\tu16 inti_flags;\n\tu8 type;\n\tu8 id;\n\tu8 eid;\n\tu8 io_sapic_vector;\n\tu32 global_irq;\n\tu32 flags;\n};\n\nstruct acpi_madt_io_apic {\n\tstruct acpi_subtable_header header;\n\tu8 id;\n\tu8 reserved;\n\tu32 address;\n\tu32 global_irq_base;\n};\n\nstruct acpi_madt_io_sapic {\n\tstruct acpi_subtable_header header;\n\tu8 id;\n\tu8 reserved;\n\tu32 global_irq_base;\n\tu64 address;\n};\n\nstruct acpi_madt_local_apic {\n\tstruct acpi_subtable_header header;\n\tu8 processor_id;\n\tu8 id;\n\tu32 lapic_flags;\n};\n\nstruct acpi_madt_local_apic_nmi {\n\tstruct acpi_subtable_header header;\n\tu8 processor_id;\n\tu16 inti_flags;\n\tu8 lint;\n} __attribute__((packed));\n\nstruct acpi_madt_local_apic_override {\n\tstruct acpi_subtable_header header;\n\tu16 reserved;\n\tu64 address;\n} __attribute__((packed));\n\nstruct acpi_madt_local_sapic {\n\tstruct acpi_subtable_header header;\n\tu8 processor_id;\n\tu8 id;\n\tu8 eid;\n\tu8 reserved[3];\n\tu32 lapic_flags;\n\tu32 uid;\n\tchar uid_string[0];\n};\n\nstruct acpi_madt_local_x2apic {\n\tstruct acpi_subtable_header header;\n\tu16 reserved;\n\tu32 local_apic_id;\n\tu32 lapic_flags;\n\tu32 uid;\n};\n\nstruct acpi_madt_local_x2apic_nmi {\n\tstruct acpi_subtable_header header;\n\tu16 inti_flags;\n\tu32 uid;\n\tu8 lint;\n\tu8 reserved[3];\n};\n\nstruct acpi_madt_multiproc_wakeup {\n\tstruct acpi_subtable_header header;\n\tu16 version;\n\tu32 reserved;\n\tu64 mailbox_address;\n\tu64 reset_vector;\n};\n\nstruct acpi_madt_multiproc_wakeup_mailbox {\n\tu16 command;\n\tu16 reserved;\n\tu32 apic_id;\n\tu64 wakeup_vector;\n\tu8 reserved_os[2032];\n\tu8 reserved_firmware[2048];\n};\n\nstruct acpi_madt_nmi_source {\n\tstruct acpi_subtable_header header;\n\tu16 inti_flags;\n\tu32 global_irq;\n};\n\nstruct acpi_madt_rintc {\n\tstruct acpi_subtable_header header;\n\tu8 version;\n\tu8 reserved;\n\tu32 flags;\n\tu64 hart_id;\n\tu32 uid;\n\tu32 ext_intc_id;\n\tu64 imsic_addr;\n\tu32 imsic_size;\n} __attribute__((packed));\n\nstruct acpi_mcfg_allocation {\n\tu64 address;\n\tu16 pci_segment;\n\tu8 start_bus_number;\n\tu8 end_bus_number;\n\tu32 reserved;\n};\n\nstruct acpi_mem_mapping {\n\tacpi_physical_address physical_address;\n\tu8 *logical_address;\n\tacpi_size length;\n\tstruct acpi_mem_mapping *next_mm;\n};\n\nstruct acpi_mem_space_context {\n\tu32 length;\n\tacpi_physical_address address;\n\tstruct acpi_mem_mapping *cur_mm;\n\tstruct acpi_mem_mapping *first_mm;\n};\n\nstruct acpi_memory_attribute {\n\tu8 write_protect;\n\tu8 caching;\n\tu8 range_type;\n\tu8 translation;\n};\n\nstruct acpi_memory_device {\n\tstruct acpi_device *device;\n\tstruct list_head res_list;\n\tint mgid;\n};\n\nstruct acpi_memory_info {\n\tstruct list_head list;\n\tu64 start_addr;\n\tu64 length;\n\tshort unsigned int caching;\n\tshort unsigned int write_protect;\n\tunsigned int enabled: 1;\n};\n\nstruct acpi_mutex_info {\n\tvoid *mutex;\n\tu32 use_count;\n\tu64 thread_id;\n};\n\nstruct acpi_name_info {\n\tchar name[4];\n\tu16 argument_list;\n\tu8 expected_btypes;\n} __attribute__((packed));\n\nstruct acpi_namestring_info {\n\tconst char *external_name;\n\tconst char *next_external_char;\n\tchar *internal_name;\n\tu32 length;\n\tu32 num_segments;\n\tu32 num_carats;\n\tu8 fully_qualified;\n};\n\nstruct acpi_nhlt_config {\n\tu32 capabilities_size;\n\tu8 capabilities[0];\n};\n\nstruct acpi_nhlt_gendevice_config {\n\tu8 virtual_slot;\n\tu8 config_type;\n};\n\nstruct acpi_nhlt_micdevice_config {\n\tu8 virtual_slot;\n\tu8 config_type;\n\tu8 array_type;\n};\n\nstruct acpi_nhlt_vendor_mic_config {\n\tu8 type;\n\tu8 panel;\n\tu16 speaker_position_distance;\n\tu16 horizontal_offset;\n\tu16 vertical_offset;\n\tu8 frequency_low_band;\n\tu8 frequency_high_band;\n\tu16 direction_angle;\n\tu16 elevation_angle;\n\tu16 work_vertical_angle_begin;\n\tu16 work_vertical_angle_end;\n\tu16 work_horizontal_angle_begin;\n\tu16 work_horizontal_angle_end;\n};\n\nstruct acpi_nhlt_vendor_micdevice_config {\n\tu8 virtual_slot;\n\tu8 config_type;\n\tu8 array_type;\n\tu8 mics_count;\n\tstruct acpi_nhlt_vendor_mic_config mics[0];\n};\n\nunion acpi_nhlt_device_config {\n\tu8 virtual_slot;\n\tstruct acpi_nhlt_gendevice_config gen;\n\tstruct acpi_nhlt_micdevice_config mic;\n\tstruct acpi_nhlt_vendor_micdevice_config vendor_mic;\n};\n\nstruct acpi_nhlt_endpoint {\n\tu32 length;\n\tu8 link_type;\n\tu8 instance_id;\n\tu16 vendor_id;\n\tu16 device_id;\n\tu16 revision_id;\n\tu32 subsystem_id;\n\tu8 device_type;\n\tu8 direction;\n\tu8 virtual_bus_id;\n} __attribute__((packed));\n\nstruct acpi_nhlt_wave_formatext {\n\tu16 format_tag;\n\tu16 channel_count;\n\tu32 samples_per_sec;\n\tu32 avg_bytes_per_sec;\n\tu16 block_align;\n\tu16 bits_per_sample;\n\tu16 extra_format_size;\n\tu16 valid_bits_per_sample;\n\tu32 channel_mask;\n\tu8 subformat[16];\n};\n\nstruct acpi_nhlt_format_config {\n\tstruct acpi_nhlt_wave_formatext format;\n\tstruct acpi_nhlt_config config;\n};\n\nstruct acpi_nhlt_formats_config {\n\tu8 formats_count;\n\tstruct acpi_nhlt_format_config formats[0];\n} __attribute__((packed));\n\nunion acpi_object {\n\tacpi_object_type type;\n\tstruct {\n\t\tacpi_object_type type;\n\t\tu64 value;\n\t} integer;\n\tstruct {\n\t\tacpi_object_type type;\n\t\tu32 length;\n\t\tchar *pointer;\n\t} string;\n\tstruct {\n\t\tacpi_object_type type;\n\t\tu32 length;\n\t\tu8 *pointer;\n\t} buffer;\n\tstruct {\n\t\tacpi_object_type type;\n\t\tu32 count;\n\t\tunion acpi_object *elements;\n\t} package;\n\tstruct {\n\t\tacpi_object_type type;\n\t\tacpi_object_type actual_type;\n\t\tacpi_handle handle;\n\t} reference;\n\tstruct {\n\t\tacpi_object_type type;\n\t\tu32 proc_id;\n\t\tacpi_io_address pblk_address;\n\t\tu32 pblk_length;\n\t} processor;\n\tstruct {\n\t\tacpi_object_type type;\n\t\tu32 system_level;\n\t\tu32 resource_order;\n\t} power_resource;\n};\n\nstruct acpi_object_info {\n\tu32 types[28];\n};\n\nstruct acpi_object_list {\n\tu32 count;\n\tunion acpi_object *pointer;\n};\n\nstruct acpi_offsets {\n\tsize_t offset;\n\tu8 mode;\n};\n\nstruct acpi_opcode_info {\n\tchar *name;\n\tu32 parse_args;\n\tu32 runtime_args;\n\tu16 flags;\n\tu8 object_type;\n\tu8 class;\n\tu8 type;\n};\n\nstruct acpi_os_dpc {\n\tacpi_osd_exec_callback function;\n\tvoid *context;\n\tstruct work_struct work;\n};\n\nstruct acpi_osc_context {\n\tchar *uuid_str;\n\tint rev;\n\tstruct acpi_buffer cap;\n\tstruct acpi_buffer ret;\n};\n\nstruct acpi_osi_config {\n\tu8 default_disabling;\n\tunsigned int linux_enable: 1;\n\tunsigned int linux_dmi: 1;\n\tunsigned int linux_cmdline: 1;\n\tunsigned int darwin_enable: 1;\n\tunsigned int darwin_dmi: 1;\n\tunsigned int darwin_cmdline: 1;\n};\n\nstruct acpi_osi_entry {\n\tchar string[64];\n\tbool enable;\n};\n\nstruct acpi_package_info {\n\tu8 type;\n\tu8 object_type1;\n\tu8 count1;\n\tu8 object_type2;\n\tu8 count2;\n\tu16 reserved;\n} __attribute__((packed));\n\nstruct acpi_package_info2 {\n\tu8 type;\n\tu8 count;\n\tu8 object_type[4];\n\tu8 reserved;\n};\n\nstruct acpi_package_info3 {\n\tu8 type;\n\tu8 count;\n\tu8 object_type[2];\n\tu8 tail_object_type;\n\tu16 reserved;\n} __attribute__((packed));\n\nstruct acpi_package_info4 {\n\tu8 type;\n\tu8 object_type1;\n\tu8 count1;\n\tu8 sub_object_types;\n\tu8 pkg_count;\n\tu16 reserved;\n} __attribute__((packed));\n\nstruct acpi_parse_state {\n\tu8 *aml_start;\n\tu8 *aml;\n\tu8 *aml_end;\n\tu8 *pkg_start;\n\tu8 *pkg_end;\n\tunion acpi_parse_object *start_op;\n\tstruct acpi_namespace_node *start_node;\n\tunion acpi_generic_state *scope;\n\tunion acpi_parse_object *start_scope;\n\tu32 aml_size;\n};\n\nstruct acpi_pcc_info {\n\tu8 subspace_id;\n\tu16 length;\n\tu8 *internal_buffer;\n};\n\nstruct acpi_pcct_ext_pcc_master {\n\tstruct acpi_subtable_header header;\n\tu32 platform_interrupt;\n\tu8 flags;\n\tu8 reserved1;\n\tu64 base_address;\n\tu32 length;\n\tstruct acpi_generic_address doorbell_register;\n\tu64 preserve_mask;\n\tu64 write_mask;\n\tu32 latency;\n\tu32 max_access_rate;\n\tu32 min_turnaround_time;\n\tstruct acpi_generic_address platform_ack_register;\n\tu64 ack_preserve_mask;\n\tu64 ack_set_mask;\n\tu64 reserved2;\n\tstruct acpi_generic_address cmd_complete_register;\n\tu64 cmd_complete_mask;\n\tstruct acpi_generic_address cmd_update_register;\n\tu64 cmd_update_preserve_mask;\n\tu64 cmd_update_set_mask;\n\tstruct acpi_generic_address error_status_register;\n\tu64 error_status_mask;\n} __attribute__((packed));\n\nstruct acpi_pcct_ext_pcc_shared_memory {\n\tu32 signature;\n\tu32 flags;\n\tu32 length;\n\tu32 command;\n};\n\nstruct acpi_pcct_hw_reduced {\n\tstruct acpi_subtable_header header;\n\tu32 platform_interrupt;\n\tu8 flags;\n\tu8 reserved;\n\tu64 base_address;\n\tu64 length;\n\tstruct acpi_generic_address doorbell_register;\n\tu64 preserve_mask;\n\tu64 write_mask;\n\tu32 latency;\n\tu32 max_access_rate;\n\tu16 min_turnaround_time;\n} __attribute__((packed));\n\nstruct acpi_pcct_hw_reduced_type2 {\n\tstruct acpi_subtable_header header;\n\tu32 platform_interrupt;\n\tu8 flags;\n\tu8 reserved;\n\tu64 base_address;\n\tu64 length;\n\tstruct acpi_generic_address doorbell_register;\n\tu64 preserve_mask;\n\tu64 write_mask;\n\tu32 latency;\n\tu32 max_access_rate;\n\tu16 min_turnaround_time;\n\tstruct acpi_generic_address platform_ack_register;\n\tu64 ack_preserve_mask;\n\tu64 ack_write_mask;\n} __attribute__((packed));\n\nstruct acpi_pcct_shared_memory {\n\tu32 signature;\n\tu16 command;\n\tu16 status;\n};\n\nstruct acpi_pcct_subspace {\n\tstruct acpi_subtable_header header;\n\tu8 reserved[6];\n\tu64 base_address;\n\tu64 length;\n\tstruct acpi_generic_address doorbell_register;\n\tu64 preserve_mask;\n\tu64 write_mask;\n\tu32 latency;\n\tu32 max_access_rate;\n\tu16 min_turnaround_time;\n} __attribute__((packed));\n\nstruct acpi_pci_device {\n\tacpi_handle device;\n\tstruct acpi_pci_device *next;\n};\n\nstruct acpi_pci_id {\n\tu16 segment;\n\tu16 bus;\n\tu16 device;\n\tu16 function;\n};\n\nstruct acpi_pci_ioapic {\n\tacpi_handle root_handle;\n\tacpi_handle handle;\n\tu32 gsi_base;\n\tstruct resource res;\n\tstruct pci_dev *pdev;\n\tstruct list_head list;\n};\n\nstruct acpi_pci_link_irq {\n\tu32 active;\n\tu8 triggering;\n\tu8 polarity;\n\tu8 resource_type;\n\tu8 possible_count;\n\tu32 possible[16];\n\tu8 initialized: 1;\n\tu8 reserved: 7;\n};\n\nstruct acpi_pci_link {\n\tstruct list_head list;\n\tstruct acpi_device *device;\n\tstruct acpi_pci_link_irq irq;\n\tint refcnt;\n};\n\nstruct pci_bus;\n\nstruct acpi_pci_root {\n\tstruct acpi_device *device;\n\tstruct pci_bus *bus;\n\tu16 segment;\n\tint bridge_type;\n\tstruct resource secondary;\n\tu32 osc_support_set;\n\tu32 osc_control_set;\n\tu32 osc_ext_support_set;\n\tu32 osc_ext_control_set;\n\tphys_addr_t mcfg_addr;\n};\n\nstruct acpi_pci_root_ops;\n\nstruct acpi_pci_root_info {\n\tstruct acpi_pci_root *root;\n\tstruct acpi_device *bridge;\n\tstruct acpi_pci_root_ops *ops;\n\tstruct list_head resources;\n\tchar name[16];\n};\n\nstruct pci_ops;\n\nstruct acpi_pci_root_ops {\n\tstruct pci_ops *pci_ops;\n\tint (*init_info)(struct acpi_pci_root_info *);\n\tvoid (*release_info)(struct acpi_pci_root_info *);\n\tint (*prepare_resources)(struct acpi_pci_root_info *);\n};\n\nstruct acpi_pci_routing_table {\n\tu32 length;\n\tu32 pin;\n\tu64 address;\n\tu32 source_index;\n\tunion {\n\t\tchar pad[4];\n\t\tstruct {\n\t\t\tstruct {} __Empty_source;\n\t\t\tchar source[0];\n\t\t};\n\t};\n};\n\nstruct pci_slot;\n\nstruct acpi_pci_slot {\n\tstruct pci_slot *pci_slot;\n\tstruct list_head list;\n};\n\nstruct acpi_pct_register {\n\tu8 descriptor;\n\tu16 length;\n\tu8 space_id;\n\tu8 bit_width;\n\tu8 bit_offset;\n\tu8 reserved;\n\tu64 address;\n} __attribute__((packed));\n\nstruct acpi_pkg_info {\n\tu8 *free_space;\n\tacpi_size length;\n\tu32 object_space;\n\tu32 num_packages;\n};\n\nstruct acpi_platform_list {\n\tchar oem_id[7];\n\tchar oem_table_id[9];\n\tu32 oem_revision;\n\tchar *table;\n\tenum acpi_predicate pred;\n\tchar *reason;\n\tu32 data;\n};\n\nstruct acpi_pld_info {\n\tu8 revision;\n\tu8 ignore_color;\n\tu8 red;\n\tu8 green;\n\tu8 blue;\n\tu16 width;\n\tu16 height;\n\tu8 user_visible;\n\tu8 dock;\n\tu8 lid;\n\tu8 panel;\n\tu8 vertical_position;\n\tu8 horizontal_position;\n\tu8 shape;\n\tu8 group_orientation;\n\tu8 group_token;\n\tu8 group_position;\n\tu8 bay;\n\tu8 ejectable;\n\tu8 ospm_eject_required;\n\tu8 cabinet_number;\n\tu8 card_cage_number;\n\tu8 reference;\n\tu8 rotation;\n\tu8 order;\n\tu8 reserved;\n\tu16 vertical_offset;\n\tu16 horizontal_offset;\n};\n\nstruct acpi_port_info {\n\tchar *name;\n\tu16 start;\n\tu16 end;\n\tu8 osi_dependency;\n};\n\nstruct acpi_power_dependent_device {\n\tstruct device *dev;\n\tstruct list_head node;\n};\n\nstruct acpi_power_register {\n\tu8 descriptor;\n\tu16 length;\n\tu8 space_id;\n\tu8 bit_width;\n\tu8 bit_offset;\n\tu8 access_size;\n\tu64 address;\n} __attribute__((packed));\n\nstruct acpi_power_resource {\n\tstruct acpi_device device;\n\tstruct list_head list_node;\n\tu32 system_level;\n\tu32 order;\n\tunsigned int ref_count;\n\tu8 state;\n\tstruct mutex resource_lock;\n\tstruct list_head dependents;\n};\n\nstruct acpi_power_resource_entry {\n\tstruct list_head node;\n\tstruct acpi_power_resource *resource;\n};\n\nunion acpi_predefined_info {\n\tstruct acpi_name_info info;\n\tstruct acpi_package_info ret_info;\n\tstruct acpi_package_info2 ret_info2;\n\tstruct acpi_package_info3 ret_info3;\n\tstruct acpi_package_info4 ret_info4;\n};\n\nstruct acpi_predefined_names {\n\tconst char *name;\n\tu8 type;\n\tchar *val;\n};\n\nstruct acpi_prmt_handler_info {\n\tu16 revision;\n\tu16 length;\n\tu8 handler_guid[16];\n\tu64 handler_address;\n\tu64 static_data_buffer_address;\n\tu64 acpi_param_buffer_address;\n} __attribute__((packed));\n\nstruct acpi_prmt_module_header {\n\tu16 revision;\n\tu16 length;\n};\n\nstruct acpi_prmt_module_info {\n\tu16 revision;\n\tu16 length;\n\tu8 module_guid[16];\n\tu16 major_rev;\n\tu16 minor_rev;\n\tu16 handler_info_count;\n\tu32 handler_info_offset;\n\tu64 mmio_list_pointer;\n} __attribute__((packed));\n\nstruct acpi_probe_entry;\n\ntypedef bool (*acpi_probe_entry_validate_subtbl)(struct acpi_subtable_header *, struct acpi_probe_entry *);\n\nstruct acpi_table_header;\n\ntypedef int (*acpi_tbl_table_handler)(struct acpi_table_header *);\n\nunion acpi_subtable_headers;\n\ntypedef int (*acpi_tbl_entry_handler)(union acpi_subtable_headers *, const long unsigned int);\n\nstruct acpi_probe_entry {\n\t__u8 id[5];\n\t__u8 type;\n\tacpi_probe_entry_validate_subtbl subtable_valid;\n\tunion {\n\t\tacpi_tbl_table_handler probe_table;\n\t\tacpi_tbl_entry_handler probe_subtbl;\n\t};\n\tkernel_ulong_t driver_data;\n};\n\nstruct acpi_processor_flags {\n\tu8 power: 1;\n\tu8 performance: 1;\n\tu8 throttling: 1;\n\tu8 limit: 1;\n\tu8 bm_control: 1;\n\tu8 bm_check: 1;\n\tu8 has_cst: 1;\n\tu8 has_lpi: 1;\n\tu8 power_setup_done: 1;\n\tu8 bm_rld_set: 1;\n\tu8 previously_online: 1;\n};\n\nstruct acpi_processor_cx {\n\tu8 valid;\n\tu8 type;\n\tu32 address;\n\tu8 entry_method;\n\tu8 index;\n\tu32 latency;\n\tu8 bm_sts_skip;\n\tchar desc[32];\n};\n\nstruct acpi_processor_power {\n\tint count;\n\tunion {\n\t\tstruct acpi_processor_cx states[8];\n\t\tstruct acpi_lpi_state lpi_states[8];\n\t};\n\tint timer_broadcast_on_state;\n};\n\nstruct acpi_tsd_package {\n\tu64 num_entries;\n\tu64 revision;\n\tu64 domain;\n\tu64 coord_type;\n\tu64 num_processors;\n};\n\nstruct acpi_processor_tx {\n\tu16 power;\n\tu16 performance;\n};\n\nstruct acpi_processor_tx_tss;\n\nstruct acpi_processor;\n\nstruct acpi_processor_throttling {\n\tunsigned int state;\n\tunsigned int platform_limit;\n\tstruct acpi_pct_register control_register;\n\tstruct acpi_pct_register status_register;\n\tunsigned int state_count;\n\tstruct acpi_processor_tx_tss *states_tss;\n\tstruct acpi_tsd_package domain_info;\n\tcpumask_var_t shared_cpu_map;\n\tint (*acpi_processor_get_throttling)(struct acpi_processor *);\n\tint (*acpi_processor_set_throttling)(struct acpi_processor *, int, bool);\n\tu32 address;\n\tu8 duty_offset;\n\tu8 duty_width;\n\tu8 tsd_valid_flag;\n\tunsigned int shared_type;\n\tstruct acpi_processor_tx states[16];\n};\n\nstruct acpi_processor_lx {\n\tint px;\n\tint tx;\n};\n\nstruct acpi_processor_limit {\n\tstruct acpi_processor_lx state;\n\tstruct acpi_processor_lx thermal;\n\tstruct acpi_processor_lx user;\n};\n\nstruct plist_node {\n\tint prio;\n\tstruct list_head prio_list;\n\tstruct list_head node_list;\n};\n\nstruct freq_constraints;\n\nstruct freq_qos_request {\n\tenum freq_qos_req_type type;\n\tstruct plist_node pnode;\n\tstruct freq_constraints *qos;\n};\n\nstruct acpi_processor_performance;\n\nstruct acpi_processor {\n\tacpi_handle handle;\n\tu32 acpi_id;\n\tphys_cpuid_t phys_id;\n\tu32 id;\n\tu32 pblk;\n\tint performance_platform_limit;\n\tint throttling_platform_limit;\n\tstruct acpi_processor_flags flags;\n\tstruct acpi_processor_power power;\n\tstruct acpi_processor_performance *performance;\n\tstruct acpi_processor_throttling throttling;\n\tstruct acpi_processor_limit limit;\n\tstruct thermal_cooling_device *cdev;\n\tstruct device *dev;\n\tstruct freq_qos_request perflib_req;\n\tstruct freq_qos_request thermal_req;\n};\n\nstruct acpi_processor_errata {\n\tu8 smp;\n\tstruct {\n\t\tu8 throttle: 1;\n\t\tu8 fdma: 1;\n\t\tu8 reserved: 6;\n\t\tu32 bmisx;\n\t} piix4;\n};\n\nstruct acpi_psd_package {\n\tu64 num_entries;\n\tu64 revision;\n\tu64 domain;\n\tu64 coord_type;\n\tu64 num_processors;\n};\n\nstruct acpi_processor_px;\n\nstruct acpi_processor_performance {\n\tunsigned int state;\n\tunsigned int platform_limit;\n\tstruct acpi_pct_register control_register;\n\tstruct acpi_pct_register status_register;\n\tunsigned int state_count;\n\tstruct acpi_processor_px *states;\n\tstruct acpi_psd_package domain_info;\n\tcpumask_var_t shared_cpu_map;\n\tunsigned int shared_type;\n};\n\nstruct acpi_processor_px {\n\tu64 core_frequency;\n\tu64 power;\n\tu64 transition_latency;\n\tu64 bus_master_latency;\n\tu64 control;\n\tu64 status;\n};\n\nstruct acpi_processor_throttling_arg {\n\tstruct acpi_processor *pr;\n\tint target_state;\n\tbool force;\n};\n\nstruct acpi_processor_tx_tss {\n\tu64 freqpercentage;\n\tu64 power;\n\tu64 transition_latency;\n\tu64 control;\n\tu64 status;\n};\n\nstruct acpi_prt_entry {\n\tstruct acpi_pci_id id;\n\tu8 pin;\n\tacpi_handle link;\n\tu32 index;\n};\n\nstruct acpi_reg_walk_info {\n\tu32 function;\n\tu32 reg_run_count;\n\tacpi_adr_space_type space_id;\n};\n\nstruct acpi_region_walk_info {\n\tu32 debug_level;\n\tu32 count;\n\tacpi_owner_id owner_id;\n\tu8 display_type;\n\tu32 address_space_id;\n};\n\ntypedef acpi_status (*acpi_repair_function)(struct acpi_evaluate_info *, union acpi_operand_object **);\n\nstruct acpi_repair_info {\n\tchar name[4];\n\tacpi_repair_function repair_function;\n};\n\nstruct acpi_resource_irq {\n\tu8 descriptor_length;\n\tu8 triggering;\n\tu8 polarity;\n\tu8 shareable;\n\tu8 wake_capable;\n\tu8 interrupt_count;\n\tunion {\n\t\tu8 interrupt;\n\t\tstruct {\n\t\t\tstruct {} __Empty_interrupts;\n\t\t\tu8 interrupts[0];\n\t\t};\n\t};\n};\n\nstruct acpi_resource_dma {\n\tu8 type;\n\tu8 bus_master;\n\tu8 transfer;\n\tu8 channel_count;\n\tunion {\n\t\tu8 channel;\n\t\tstruct {\n\t\t\tstruct {} __Empty_channels;\n\t\t\tu8 channels[0];\n\t\t};\n\t};\n};\n\nstruct acpi_resource_start_dependent {\n\tu8 descriptor_length;\n\tu8 compatibility_priority;\n\tu8 performance_robustness;\n};\n\nstruct acpi_resource_io {\n\tu8 io_decode;\n\tu8 alignment;\n\tu8 address_length;\n\tu16 minimum;\n\tu16 maximum;\n} __attribute__((packed));\n\nstruct acpi_resource_fixed_io {\n\tu16 address;\n\tu8 address_length;\n} __attribute__((packed));\n\nstruct acpi_resource_fixed_dma {\n\tu16 request_lines;\n\tu16 channels;\n\tu8 width;\n} __attribute__((packed));\n\nstruct acpi_resource_vendor {\n\tu16 byte_length;\n\tu8 byte_data[0];\n};\n\nstruct acpi_resource_vendor_typed {\n\tu16 byte_length;\n\tu8 uuid_subtype;\n\tu8 uuid[16];\n\tu8 byte_data[0];\n} __attribute__((packed));\n\nstruct acpi_resource_end_tag {\n\tu8 checksum;\n};\n\nstruct acpi_resource_memory24 {\n\tu8 write_protect;\n\tu16 minimum;\n\tu16 maximum;\n\tu16 alignment;\n\tu16 address_length;\n} __attribute__((packed));\n\nstruct acpi_resource_memory32 {\n\tu8 write_protect;\n\tu32 minimum;\n\tu32 maximum;\n\tu32 alignment;\n\tu32 address_length;\n} __attribute__((packed));\n\nstruct acpi_resource_fixed_memory32 {\n\tu8 write_protect;\n\tu32 address;\n\tu32 address_length;\n} __attribute__((packed));\n\nunion acpi_resource_attribute {\n\tstruct acpi_memory_attribute mem;\n\tstruct acpi_io_attribute io;\n\tu8 type_specific;\n};\n\nstruct acpi_resource_source {\n\tu8 index;\n\tu16 string_length;\n\tchar *string_ptr;\n} __attribute__((packed));\n\nstruct acpi_resource_address16 {\n\tu8 resource_type;\n\tu8 producer_consumer;\n\tu8 decode;\n\tu8 min_address_fixed;\n\tu8 max_address_fixed;\n\tunion acpi_resource_attribute info;\n\tstruct acpi_address16_attribute address;\n\tstruct acpi_resource_source resource_source;\n} __attribute__((packed));\n\nstruct acpi_resource_address32 {\n\tu8 resource_type;\n\tu8 producer_consumer;\n\tu8 decode;\n\tu8 min_address_fixed;\n\tu8 max_address_fixed;\n\tunion acpi_resource_attribute info;\n\tstruct acpi_address32_attribute address;\n\tstruct acpi_resource_source resource_source;\n} __attribute__((packed));\n\nstruct acpi_resource_address64 {\n\tu8 resource_type;\n\tu8 producer_consumer;\n\tu8 decode;\n\tu8 min_address_fixed;\n\tu8 max_address_fixed;\n\tunion acpi_resource_attribute info;\n\tstruct acpi_address64_attribute address;\n\tstruct acpi_resource_source resource_source;\n} __attribute__((packed));\n\nstruct acpi_resource_extended_address64 {\n\tu8 resource_type;\n\tu8 producer_consumer;\n\tu8 decode;\n\tu8 min_address_fixed;\n\tu8 max_address_fixed;\n\tunion acpi_resource_attribute info;\n\tu8 revision_ID;\n\tstruct acpi_address64_attribute address;\n\tu64 type_specific;\n} __attribute__((packed));\n\nstruct acpi_resource_extended_irq {\n\tu8 producer_consumer;\n\tu8 triggering;\n\tu8 polarity;\n\tu8 shareable;\n\tu8 wake_capable;\n\tu8 interrupt_count;\n\tstruct acpi_resource_source resource_source;\n\tunion {\n\t\tu32 interrupt;\n\t\tstruct {\n\t\t\tstruct {} __Empty_interrupts;\n\t\t\tu32 interrupts[0];\n\t\t};\n\t};\n} __attribute__((packed));\n\nstruct acpi_resource_generic_register {\n\tu8 space_id;\n\tu8 bit_width;\n\tu8 bit_offset;\n\tu8 access_size;\n\tu64 address;\n} __attribute__((packed));\n\nstruct acpi_resource_gpio {\n\tu8 revision_id;\n\tu8 connection_type;\n\tu8 producer_consumer;\n\tu8 pin_config;\n\tu8 shareable;\n\tu8 wake_capable;\n\tu8 io_restriction;\n\tu8 triggering;\n\tu8 polarity;\n\tu16 drive_strength;\n\tu16 debounce_timeout;\n\tu16 pin_table_length;\n\tu16 vendor_length;\n\tstruct acpi_resource_source resource_source;\n\tu16 *pin_table;\n\tu8 *vendor_data;\n} __attribute__((packed));\n\nstruct acpi_resource_i2c_serialbus {\n\tu8 revision_id;\n\tu8 type;\n\tu8 producer_consumer;\n\tu8 slave_mode;\n\tu8 connection_sharing;\n\tu8 type_revision_id;\n\tu16 type_data_length;\n\tu16 vendor_length;\n\tstruct acpi_resource_source resource_source;\n\tu8 *vendor_data;\n\tu8 access_mode;\n\tu16 slave_address;\n\tu32 connection_speed;\n} __attribute__((packed));\n\nstruct acpi_resource_spi_serialbus {\n\tu8 revision_id;\n\tu8 type;\n\tu8 producer_consumer;\n\tu8 slave_mode;\n\tu8 connection_sharing;\n\tu8 type_revision_id;\n\tu16 type_data_length;\n\tu16 vendor_length;\n\tstruct acpi_resource_source resource_source;\n\tu8 *vendor_data;\n\tu8 wire_mode;\n\tu8 device_polarity;\n\tu8 data_bit_length;\n\tu8 clock_phase;\n\tu8 clock_polarity;\n\tu16 device_selection;\n\tu32 connection_speed;\n} __attribute__((packed));\n\nstruct acpi_resource_uart_serialbus {\n\tu8 revision_id;\n\tu8 type;\n\tu8 producer_consumer;\n\tu8 slave_mode;\n\tu8 connection_sharing;\n\tu8 type_revision_id;\n\tu16 type_data_length;\n\tu16 vendor_length;\n\tstruct acpi_resource_source resource_source;\n\tu8 *vendor_data;\n\tu8 endian;\n\tu8 data_bits;\n\tu8 stop_bits;\n\tu8 flow_control;\n\tu8 parity;\n\tu8 lines_enabled;\n\tu16 rx_fifo_size;\n\tu16 tx_fifo_size;\n\tu32 default_baud_rate;\n} __attribute__((packed));\n\nstruct acpi_resource_csi2_serialbus {\n\tu8 revision_id;\n\tu8 type;\n\tu8 producer_consumer;\n\tu8 slave_mode;\n\tu8 connection_sharing;\n\tu8 type_revision_id;\n\tu16 type_data_length;\n\tu16 vendor_length;\n\tstruct acpi_resource_source resource_source;\n\tu8 *vendor_data;\n\tu8 local_port_instance;\n\tu8 phy_type;\n} __attribute__((packed));\n\nstruct acpi_resource_common_serialbus {\n\tu8 revision_id;\n\tu8 type;\n\tu8 producer_consumer;\n\tu8 slave_mode;\n\tu8 connection_sharing;\n\tu8 type_revision_id;\n\tu16 type_data_length;\n\tu16 vendor_length;\n\tstruct acpi_resource_source resource_source;\n\tu8 *vendor_data;\n} __attribute__((packed));\n\nstruct acpi_resource_pin_function {\n\tu8 revision_id;\n\tu8 pin_config;\n\tu8 shareable;\n\tu16 function_number;\n\tu16 pin_table_length;\n\tu16 vendor_length;\n\tstruct acpi_resource_source resource_source;\n\tu16 *pin_table;\n\tu8 *vendor_data;\n} __attribute__((packed));\n\nstruct acpi_resource_pin_config {\n\tu8 revision_id;\n\tu8 producer_consumer;\n\tu8 shareable;\n\tu8 pin_config_type;\n\tu32 pin_config_value;\n\tu16 pin_table_length;\n\tu16 vendor_length;\n\tstruct acpi_resource_source resource_source;\n\tu16 *pin_table;\n\tu8 *vendor_data;\n} __attribute__((packed));\n\nstruct acpi_resource_label {\n\tu16 string_length;\n\tchar *string_ptr;\n} __attribute__((packed));\n\nstruct acpi_resource_pin_group {\n\tu8 revision_id;\n\tu8 producer_consumer;\n\tu16 pin_table_length;\n\tu16 vendor_length;\n\tu16 *pin_table;\n\tstruct acpi_resource_label resource_label;\n\tu8 *vendor_data;\n} __attribute__((packed));\n\nstruct acpi_resource_pin_group_function {\n\tu8 revision_id;\n\tu8 producer_consumer;\n\tu8 shareable;\n\tu16 function_number;\n\tu16 vendor_length;\n\tstruct acpi_resource_source resource_source;\n\tstruct acpi_resource_label resource_source_label;\n\tu8 *vendor_data;\n} __attribute__((packed));\n\nstruct acpi_resource_pin_group_config {\n\tu8 revision_id;\n\tu8 producer_consumer;\n\tu8 shareable;\n\tu8 pin_config_type;\n\tu32 pin_config_value;\n\tu16 vendor_length;\n\tstruct acpi_resource_source resource_source;\n\tstruct acpi_resource_label resource_source_label;\n\tu8 *vendor_data;\n} __attribute__((packed));\n\nstruct acpi_resource_clock_input {\n\tu8 revision_id;\n\tu8 mode;\n\tu8 scale;\n\tu16 frequency_divisor;\n\tu32 frequency_numerator;\n\tstruct acpi_resource_source resource_source;\n} __attribute__((packed));\n\nstruct acpi_resource_address {\n\tu8 resource_type;\n\tu8 producer_consumer;\n\tu8 decode;\n\tu8 min_address_fixed;\n\tu8 max_address_fixed;\n\tunion acpi_resource_attribute info;\n};\n\nunion acpi_resource_data {\n\tstruct acpi_resource_irq irq;\n\tstruct acpi_resource_dma dma;\n\tstruct acpi_resource_start_dependent start_dpf;\n\tstruct acpi_resource_io io;\n\tstruct acpi_resource_fixed_io fixed_io;\n\tstruct acpi_resource_fixed_dma fixed_dma;\n\tstruct acpi_resource_vendor vendor;\n\tstruct acpi_resource_vendor_typed vendor_typed;\n\tstruct acpi_resource_end_tag end_tag;\n\tstruct acpi_resource_memory24 memory24;\n\tstruct acpi_resource_memory32 memory32;\n\tstruct acpi_resource_fixed_memory32 fixed_memory32;\n\tstruct acpi_resource_address16 address16;\n\tstruct acpi_resource_address32 address32;\n\tstruct acpi_resource_address64 address64;\n\tstruct acpi_resource_extended_address64 ext_address64;\n\tstruct acpi_resource_extended_irq extended_irq;\n\tstruct acpi_resource_generic_register generic_reg;\n\tstruct acpi_resource_gpio gpio;\n\tstruct acpi_resource_i2c_serialbus i2c_serial_bus;\n\tstruct acpi_resource_spi_serialbus spi_serial_bus;\n\tstruct acpi_resource_uart_serialbus uart_serial_bus;\n\tstruct acpi_resource_csi2_serialbus csi2_serial_bus;\n\tstruct acpi_resource_common_serialbus common_serial_bus;\n\tstruct acpi_resource_pin_function pin_function;\n\tstruct acpi_resource_pin_config pin_config;\n\tstruct acpi_resource_pin_group pin_group;\n\tstruct acpi_resource_pin_group_function pin_group_function;\n\tstruct acpi_resource_pin_group_config pin_group_config;\n\tstruct acpi_resource_clock_input clock_input;\n\tstruct acpi_resource_address address;\n};\n\nstruct acpi_resource {\n\tu32 type;\n\tu32 length;\n\tunion acpi_resource_data data;\n};\n\nstruct acpi_rsconvert_info {\n\tu8 opcode;\n\tu8 resource_offset;\n\tu8 aml_offset;\n\tu8 value;\n};\n\nstruct acpi_rsdump_info {\n\tu8 opcode;\n\tu8 offset;\n\tconst char *name;\n\tconst char **pointer;\n} __attribute__((packed));\n\nstruct acpi_rw_lock {\n\tvoid *writer_mutex;\n\tvoid *reader_mutex;\n\tu32 num_readers;\n};\n\nstruct acpi_s2idle_dev_ops {\n\tstruct list_head list_node;\n\tvoid (*prepare)(void);\n\tvoid (*check)(void);\n\tvoid (*restore)(void);\n};\n\nstruct acpi_scan_clear_dep_work {\n\tstruct work_struct work;\n\tstruct acpi_device *adev;\n};\n\nstruct acpi_scan_handler {\n\tstruct list_head list_node;\n\tconst struct acpi_device_id *ids;\n\tbool (*match)(const char *, const struct acpi_device_id **);\n\tint (*attach)(struct acpi_device *, const struct acpi_device_id *);\n\tvoid (*detach)(struct acpi_device *);\n\tvoid (*post_eject)(struct acpi_device *);\n\tvoid (*bind)(struct device *);\n\tvoid (*unbind)(struct device *);\n\tstruct acpi_hotplug_profile hotplug;\n};\n\ntypedef u32 (*acpi_sci_handler)(void *);\n\nstruct acpi_sci_handler_info {\n\tstruct acpi_sci_handler_info *next;\n\tacpi_sci_handler address;\n\tvoid *context;\n};\n\nstruct acpi_serdev_lookup {\n\tacpi_handle device_handle;\n\tacpi_handle controller_handle;\n\tint n;\n\tint index;\n};\n\nstruct acpi_signal_fatal_info {\n\tu32 type;\n\tu32 code;\n\tu32 argument;\n};\n\ntypedef acpi_status (*acpi_object_converter)(struct acpi_namespace_node *, union acpi_operand_object *, union acpi_operand_object **);\n\nstruct acpi_simple_repair_info {\n\tchar name[4];\n\tu32 unexpected_btypes;\n\tu32 package_index;\n\tacpi_object_converter object_converter;\n};\n\nstruct spi_controller;\n\nstruct acpi_spi_lookup {\n\tstruct spi_controller *ctlr;\n\tu32 max_speed_hz;\n\tu32 mode;\n\tint irq;\n\tu8 bits_per_word;\n\tu8 chip_select;\n\tint n;\n\tint index;\n};\n\nstruct acpi_srat_cpu_affinity {\n\tstruct acpi_subtable_header header;\n\tu8 proximity_domain_lo;\n\tu8 apic_id;\n\tu32 flags;\n\tu8 local_sapic_eid;\n\tu8 proximity_domain_hi[3];\n\tu32 clock_domain;\n};\n\nstruct acpi_srat_generic_affinity {\n\tstruct acpi_subtable_header header;\n\tu8 reserved;\n\tu8 device_handle_type;\n\tu32 proximity_domain;\n\tu8 device_handle[16];\n\tu32 flags;\n\tu32 reserved1;\n};\n\nstruct acpi_srat_gicc_affinity {\n\tstruct acpi_subtable_header header;\n\tu32 proximity_domain;\n\tu32 acpi_processor_uid;\n\tu32 flags;\n\tu32 clock_domain;\n} __attribute__((packed));\n\nstruct acpi_srat_mem_affinity {\n\tstruct acpi_subtable_header header;\n\tu32 proximity_domain;\n\tu16 reserved;\n\tu64 base_address;\n\tu64 length;\n\tu32 reserved1;\n\tu32 flags;\n\tu64 reserved2;\n} __attribute__((packed));\n\nstruct acpi_srat_rintc_affinity {\n\tstruct acpi_subtable_header header;\n\tu16 reserved;\n\tu32 proximity_domain;\n\tu32 acpi_processor_uid;\n\tu32 flags;\n\tu32 clock_domain;\n};\n\nstruct acpi_srat_x2apic_cpu_affinity {\n\tstruct acpi_subtable_header header;\n\tu16 reserved;\n\tu32 proximity_domain;\n\tu32 apic_id;\n\tu32 flags;\n\tu32 clock_domain;\n\tu32 reserved2;\n};\n\nstruct acpi_subtable_entry {\n\tunion acpi_subtable_headers *hdr;\n\tenum acpi_subtable_type type;\n};\n\nunion acpi_subtable_headers {\n\tstruct acpi_subtable_header common;\n\tstruct acpi_hmat_structure hmat;\n\tstruct acpi_prmt_module_header prmt;\n\tstruct acpi_cedt_header cedt;\n\tstruct acpi_cdat_header cdat;\n};\n\ntypedef int (*acpi_tbl_entry_handler_arg)(union acpi_subtable_headers *, void *, const long unsigned int);\n\nstruct acpi_subtable_proc {\n\tint id;\n\tacpi_tbl_entry_handler handler;\n\tacpi_tbl_entry_handler_arg handler_arg;\n\tvoid *arg;\n\tint count;\n};\n\nstruct acpi_table_attr {\n\tstruct bin_attribute attr;\n\tchar name[4];\n\tint instance;\n\tchar filename[8];\n\tstruct list_head node;\n};\n\nstruct acpi_table_header {\n\tchar signature[4];\n\tu32 length;\n\tu8 revision;\n\tu8 checksum;\n\tchar oem_id[6];\n\tchar oem_table_id[8];\n\tu32 oem_revision;\n\tchar asl_compiler_id[4];\n\tu32 asl_compiler_revision;\n};\n\nstruct acpi_table_bert {\n\tstruct acpi_table_header header;\n\tu32 region_length;\n\tu64 address;\n};\n\nstruct acpi_table_bgrt {\n\tstruct acpi_table_header header;\n\tu16 version;\n\tu8 status;\n\tu8 image_type;\n\tu64 image_address;\n\tu32 image_offset_x;\n\tu32 image_offset_y;\n};\n\nstruct acpi_table_boot {\n\tstruct acpi_table_header header;\n\tu8 cmos_index;\n\tu8 reserved[3];\n};\n\nstruct acpi_table_ccel {\n\tstruct acpi_table_header header;\n\tu8 CCtype;\n\tu8 Ccsub_type;\n\tu16 reserved;\n\tu64 log_area_minimum_length;\n\tu64 log_area_start_address;\n};\n\nstruct acpi_table_cdat {\n\tu32 length;\n\tu8 revision;\n\tu8 checksum;\n\tu8 reserved[6];\n\tu32 sequence;\n};\n\nstruct acpi_table_csrt {\n\tstruct acpi_table_header header;\n};\n\nstruct acpi_table_desc {\n\tacpi_physical_address address;\n\tstruct acpi_table_header *pointer;\n\tu32 length;\n\tunion acpi_name_union signature;\n\tacpi_owner_id owner_id;\n\tu8 flags;\n\tu16 validation_count;\n};\n\nstruct acpi_table_dmar {\n\tstruct acpi_table_header header;\n\tu8 width;\n\tu8 flags;\n\tu8 reserved[10];\n};\n\nstruct acpi_table_ecdt {\n\tstruct acpi_table_header header;\n\tstruct acpi_generic_address control;\n\tstruct acpi_generic_address data;\n\tu32 uid;\n\tu8 gpe;\n\tu8 id[0];\n} __attribute__((packed));\n\nstruct acpi_table_erst {\n\tstruct acpi_table_header header;\n\tu32 header_length;\n\tu32 reserved;\n\tu32 entries;\n};\n\nstruct acpi_table_facs {\n\tchar signature[4];\n\tu32 length;\n\tu32 hardware_signature;\n\tu32 firmware_waking_vector;\n\tu32 global_lock;\n\tu32 flags;\n\tu64 xfirmware_waking_vector;\n\tu8 version;\n\tu8 reserved[3];\n\tu32 ospm_flags;\n\tu8 reserved1[24];\n};\n\nstruct acpi_table_fadt {\n\tstruct acpi_table_header header;\n\tu32 facs;\n\tu32 dsdt;\n\tu8 model;\n\tu8 preferred_profile;\n\tu16 sci_interrupt;\n\tu32 smi_command;\n\tu8 acpi_enable;\n\tu8 acpi_disable;\n\tu8 s4_bios_request;\n\tu8 pstate_control;\n\tu32 pm1a_event_block;\n\tu32 pm1b_event_block;\n\tu32 pm1a_control_block;\n\tu32 pm1b_control_block;\n\tu32 pm2_control_block;\n\tu32 pm_timer_block;\n\tu32 gpe0_block;\n\tu32 gpe1_block;\n\tu8 pm1_event_length;\n\tu8 pm1_control_length;\n\tu8 pm2_control_length;\n\tu8 pm_timer_length;\n\tu8 gpe0_block_length;\n\tu8 gpe1_block_length;\n\tu8 gpe1_base;\n\tu8 cst_control;\n\tu16 c2_latency;\n\tu16 c3_latency;\n\tu16 flush_size;\n\tu16 flush_stride;\n\tu8 duty_offset;\n\tu8 duty_width;\n\tu8 day_alarm;\n\tu8 month_alarm;\n\tu8 century;\n\tu16 boot_flags;\n\tu8 reserved;\n\tu32 flags;\n\tstruct acpi_generic_address reset_register;\n\tu8 reset_value;\n\tu16 arm_boot_flags;\n\tu8 minor_revision;\n\tu64 Xfacs;\n\tu64 Xdsdt;\n\tstruct acpi_generic_address xpm1a_event_block;\n\tstruct acpi_generic_address xpm1b_event_block;\n\tstruct acpi_generic_address xpm1a_control_block;\n\tstruct acpi_generic_address xpm1b_control_block;\n\tstruct acpi_generic_address xpm2_control_block;\n\tstruct acpi_generic_address xpm_timer_block;\n\tstruct acpi_generic_address xgpe0_block;\n\tstruct acpi_generic_address xgpe1_block;\n\tstruct acpi_generic_address sleep_control;\n\tstruct acpi_generic_address sleep_status;\n\tu64 hypervisor_id;\n} __attribute__((packed));\n\nstruct acpi_table_hest {\n\tstruct acpi_table_header header;\n\tu32 error_source_count;\n};\n\nstruct acpi_table_hpet {\n\tstruct acpi_table_header header;\n\tu32 id;\n\tstruct acpi_generic_address address;\n\tu8 sequence;\n\tu16 minimum_tick;\n\tu8 flags;\n} __attribute__((packed));\n\nstruct acpi_table_list {\n\tstruct acpi_table_desc *tables;\n\tu32 current_table_count;\n\tu32 max_table_count;\n\tu8 flags;\n};\n\nstruct acpi_table_lpit {\n\tstruct acpi_table_header header;\n};\n\nstruct acpi_table_madt {\n\tstruct acpi_table_header header;\n\tu32 address;\n\tu32 flags;\n};\n\nstruct acpi_table_mcfg {\n\tstruct acpi_table_header header;\n\tu8 reserved[8];\n};\n\nstruct acpi_table_nhlt {\n\tstruct acpi_table_header header;\n\tu8 endpoints_count;\n} __attribute__((packed));\n\nstruct acpi_table_pcct {\n\tstruct acpi_table_header header;\n\tu32 flags;\n\tu64 reserved;\n};\n\nstruct acpi_table_rsdp {\n\tchar signature[8];\n\tu8 checksum;\n\tchar oem_id[6];\n\tu8 revision;\n\tu32 rsdt_physical_address;\n\tu32 length;\n\tu64 xsdt_physical_address;\n\tu8 extended_checksum;\n\tu8 reserved[3];\n} __attribute__((packed));\n\nstruct acpi_table_slit {\n\tstruct acpi_table_header header;\n\tu64 locality_count;\n\tu8 entry[0];\n} __attribute__((packed));\n\nstruct acpi_table_spcr {\n\tstruct acpi_table_header header;\n\tu8 interface_type;\n\tu8 reserved[3];\n\tstruct acpi_generic_address serial_port;\n\tu8 interrupt_type;\n\tu8 pc_interrupt;\n\tu32 interrupt;\n\tu8 baud_rate;\n\tu8 parity;\n\tu8 stop_bits;\n\tu8 flow_control;\n\tu8 terminal_type;\n\tu8 reserved1;\n\tu16 pci_device_id;\n\tu16 pci_vendor_id;\n\tu8 pci_bus;\n\tu8 pci_device;\n\tu8 pci_function;\n\tu32 pci_flags;\n\tu8 pci_segment;\n\tu32 reserved2;\n} __attribute__((packed));\n\nstruct acpi_table_srat {\n\tstruct acpi_table_header header;\n\tu32 table_revision;\n\tu64 reserved;\n};\n\nstruct acpi_table_stao {\n\tstruct acpi_table_header header;\n\tu8 ignore_uart;\n} __attribute__((packed));\n\nstruct acpi_table_tpm2 {\n\tstruct acpi_table_header header;\n\tu16 platform_class;\n\tu16 reserved;\n\tu64 control_address;\n\tu32 start_method;\n} __attribute__((packed));\n\nstruct acpi_table_viot {\n\tstruct acpi_table_header header;\n\tu16 node_count;\n\tu16 node_offset;\n\tu8 reserved[8];\n};\n\nstruct acpi_table_wdat {\n\tstruct acpi_table_header header;\n\tu32 header_length;\n\tu16 pci_segment;\n\tu8 pci_bus;\n\tu8 pci_device;\n\tu8 pci_function;\n\tu8 reserved[3];\n\tu32 timer_period;\n\tu32 max_count;\n\tu32 min_count;\n\tu8 flags;\n\tu8 reserved2[3];\n\tu32 entries;\n};\n\nstruct client_hdr {\n\tu32 log_max_len;\n\tu64 log_start_addr;\n} __attribute__((packed));\n\nstruct server_hdr {\n\tu16 reserved;\n\tu64 log_max_len;\n\tu64 log_start_addr;\n} __attribute__((packed));\n\nstruct acpi_tcpa {\n\tstruct acpi_table_header hdr;\n\tu16 platform_class;\n\tunion {\n\t\tstruct client_hdr client;\n\t\tstruct server_hdr server;\n\t};\n};\n\nstruct acpi_thermal_trip {\n\tlong unsigned int temp_dk;\n\tstruct acpi_handle_list devices;\n};\n\nstruct acpi_thermal_passive {\n\tstruct acpi_thermal_trip trip;\n\tlong unsigned int tc1;\n\tlong unsigned int tc2;\n\tlong unsigned int delay;\n};\n\nstruct acpi_thermal_active {\n\tstruct acpi_thermal_trip trip;\n};\n\nstruct acpi_thermal_trips {\n\tstruct acpi_thermal_passive passive;\n\tstruct acpi_thermal_active active[10];\n};\n\nstruct thermal_zone_device;\n\nstruct acpi_thermal {\n\tstruct acpi_device *device;\n\tacpi_bus_id name;\n\tlong unsigned int temp_dk;\n\tlong unsigned int last_temp_dk;\n\tlong unsigned int polling_frequency;\n\tvolatile u8 zombie;\n\tstruct acpi_thermal_trips trips;\n\tstruct thermal_zone_device *thermal_zone;\n\tint kelvin_offset;\n\tstruct work_struct thermal_check_work;\n\tstruct mutex thermal_check_lock;\n\trefcount_t thermal_check_count;\n};\n\nstruct acpi_thermal_bind_data {\n\tstruct thermal_zone_device *thermal;\n\tstruct thermal_cooling_device *cdev;\n\tbool bind;\n};\n\nstruct acpi_tpm2_phy {\n\tu8 start_method_specific[12];\n\tu32 log_area_minimum_length;\n\tu64 log_area_start_address;\n};\n\nstruct acpi_vendor_uuid {\n\tu8 subtype;\n\tu8 data[16];\n};\n\nstruct acpi_vendor_walk_info {\n\tstruct acpi_vendor_uuid *uuid;\n\tstruct acpi_buffer *buffer;\n\tacpi_status status;\n};\n\nstruct acpi_viot_header {\n\tu8 type;\n\tu8 reserved;\n\tu16 length;\n};\n\nstruct acpi_viot_mmio {\n\tstruct acpi_viot_header header;\n\tu32 endpoint;\n\tu64 base_address;\n\tu16 output_node;\n\tu8 reserved[6];\n};\n\nstruct acpi_viot_pci_range {\n\tstruct acpi_viot_header header;\n\tu32 endpoint_start;\n\tu16 segment_start;\n\tu16 segment_end;\n\tu16 bdf_start;\n\tu16 bdf_end;\n\tu16 output_node;\n\tu8 reserved[6];\n};\n\nstruct acpi_viot_virtio_iommu_mmio {\n\tstruct acpi_viot_header header;\n\tu8 reserved[4];\n\tu64 base_address;\n};\n\nstruct acpi_viot_virtio_iommu_pci {\n\tstruct acpi_viot_header header;\n\tu16 segment;\n\tu16 bdf;\n\tu8 reserved[8];\n};\n\nstruct acpi_wakeup_handler {\n\tstruct list_head list_node;\n\tbool (*wakeup)(void *);\n\tvoid *context;\n};\n\nstruct acpi_walk_info {\n\tu32 debug_level;\n\tu32 count;\n\tacpi_owner_id owner_id;\n\tu8 display_type;\n};\n\ntypedef acpi_status (*acpi_parse_downwards)(struct acpi_walk_state *, union acpi_parse_object **);\n\ntypedef acpi_status (*acpi_parse_upwards)(struct acpi_walk_state *);\n\nstruct acpi_walk_state {\n\tstruct acpi_walk_state *next;\n\tu8 descriptor_type;\n\tu8 walk_type;\n\tu16 opcode;\n\tu8 next_op_info;\n\tu8 num_operands;\n\tu8 operand_index;\n\tacpi_owner_id owner_id;\n\tu8 last_predicate;\n\tu8 current_result;\n\tu8 return_used;\n\tu8 scope_depth;\n\tu8 pass_number;\n\tu8 namespace_override;\n\tu8 result_size;\n\tu8 result_count;\n\tu8 *aml;\n\tu32 arg_types;\n\tu32 method_breakpoint;\n\tu32 user_breakpoint;\n\tu32 parse_flags;\n\tstruct acpi_parse_state parser_state;\n\tu32 prev_arg_types;\n\tu32 arg_count;\n\tu16 method_nesting_depth;\n\tu8 method_is_nested;\n\tstruct acpi_namespace_node arguments[7];\n\tstruct acpi_namespace_node local_variables[8];\n\tunion acpi_operand_object *operands[9];\n\tunion acpi_operand_object **params;\n\tu8 *aml_last_while;\n\tunion acpi_operand_object **caller_return_desc;\n\tunion acpi_generic_state *control_state;\n\tstruct acpi_namespace_node *deferred_node;\n\tunion acpi_operand_object *implicit_return_obj;\n\tstruct acpi_namespace_node *method_call_node;\n\tunion acpi_parse_object *method_call_op;\n\tunion acpi_operand_object *method_desc;\n\tstruct acpi_namespace_node *method_node;\n\tchar *method_pathname;\n\tunion acpi_parse_object *op;\n\tconst struct acpi_opcode_info *op_info;\n\tunion acpi_parse_object *origin;\n\tunion acpi_operand_object *result_obj;\n\tunion acpi_generic_state *results;\n\tunion acpi_operand_object *return_desc;\n\tunion acpi_generic_state *scope_info;\n\tunion acpi_parse_object *prev_op;\n\tunion acpi_parse_object *next_op;\n\tstruct acpi_thread_state *thread;\n\tacpi_parse_downwards descending_callback;\n\tacpi_parse_upwards ascending_callback;\n};\n\nstruct acpi_wdat_entry {\n\tu8 action;\n\tu8 instruction;\n\tu16 reserved;\n\tstruct acpi_generic_address register_region;\n\tu32 value;\n\tu32 mask;\n};\n\nstruct acpi_whea_header {\n\tu8 action;\n\tu8 instruction;\n\tu8 flags;\n\tu8 reserved;\n\tstruct acpi_generic_address register_region;\n\tu64 value;\n\tu64 mask;\n};\n\nstruct acpihid_map_entry {\n\tstruct list_head list;\n\tu8 uid[256];\n\tu8 hid[9];\n\tu32 devid;\n\tu32 root_devid;\n\tbool cmd_line;\n\tstruct iommu_group *group;\n};\n\nstruct hotplug_slot;\n\nstruct acpiphp_attention_info {\n\tint (*set_attn)(struct hotplug_slot *, u8);\n\tint (*get_attn)(struct hotplug_slot *, u8 *);\n\tstruct module *owner;\n};\n\nstruct acpiphp_context;\n\nstruct acpiphp_bridge {\n\tstruct list_head list;\n\tstruct list_head slots;\n\tstruct kref ref;\n\tstruct acpiphp_context *context;\n\tint nr_slots;\n\tstruct pci_bus *pci_bus;\n\tstruct pci_dev *pci_dev;\n\tbool is_going_away;\n};\n\nstruct acpiphp_slot;\n\nstruct acpiphp_func {\n\tstruct acpiphp_bridge *parent;\n\tstruct acpiphp_slot *slot;\n\tstruct list_head sibling;\n\tu8 function;\n\tu32 flags;\n};\n\nstruct acpiphp_context {\n\tstruct acpi_hotplug_context hp;\n\tstruct acpiphp_func func;\n\tstruct acpiphp_bridge *bridge;\n\tunsigned int refcount;\n};\n\nstruct acpiphp_root_context {\n\tstruct acpi_hotplug_context hp;\n\tstruct acpiphp_bridge *root_bridge;\n};\n\nstruct slot;\n\nstruct acpiphp_slot {\n\tstruct list_head node;\n\tstruct pci_bus *bus;\n\tstruct list_head funcs;\n\tstruct slot *slot;\n\tu8 device;\n\tu32 flags;\n};\n\nstruct pnp_dev;\n\nstruct acpipnp_parse_option_s {\n\tstruct pnp_dev *dev;\n\tunsigned int option_flags;\n};\n\nstruct action_cache {\n\tlong unsigned int allow_native[8];\n\tlong unsigned int allow_compat[8];\n};\n\nstruct hist_trigger_data;\n\nstruct tracing_map_elt;\n\nstruct trace_buffer;\n\nstruct ring_buffer_event;\n\nstruct action_data;\n\ntypedef void (*action_fn_t)(struct hist_trigger_data *, struct tracing_map_elt *, struct trace_buffer *, void *, struct ring_buffer_event *, void *, struct action_data *, u64 *);\n\ntypedef bool (*check_track_val_fn_t)(u64, u64);\n\nstruct synth_event;\n\nstruct hist_field;\n\nstruct action_data {\n\tenum handler_id handler;\n\tenum action_id action;\n\tchar *action_name;\n\taction_fn_t fn;\n\tunsigned int n_params;\n\tchar *params[64];\n\tunsigned int var_ref_idx[64];\n\tstruct synth_event *synth_event;\n\tbool use_trace_keyword;\n\tchar *synth_event_name;\n\tunion {\n\t\tstruct {\n\t\t\tchar *event;\n\t\t\tchar *event_system;\n\t\t} match_data;\n\t\tstruct {\n\t\t\tchar *var_str;\n\t\t\tstruct hist_field *var_ref;\n\t\t\tstruct hist_field *track_var;\n\t\t\tcheck_track_val_fn_t check_val;\n\t\t\taction_fn_t save_data;\n\t\t} track_data;\n\t};\n};\n\nstruct action_devres {\n\tvoid *data;\n\tvoid (*action)(void *);\n};\n\nstruct action_gate_entry {\n\tu8 gate_state;\n\tu32 interval;\n\ts32 ipv;\n\ts32 maxoctets;\n};\n\nstruct addr_marker {\n\tlong unsigned int start_address;\n\tconst char *name;\n\tlong unsigned int max_lines;\n};\n\nstruct rb_root_cached {\n\tstruct rb_root rb_root;\n\tstruct rb_node *rb_leftmost;\n};\n\nstruct address_space_operations;\n\nstruct address_space {\n\tstruct inode *host;\n\tstruct xarray i_pages;\n\tstruct rw_semaphore invalidate_lock;\n\tgfp_t gfp_mask;\n\tatomic_t i_mmap_writable;\n\tstruct rb_root_cached i_mmap;\n\tlong unsigned int nrpages;\n\tlong unsigned int writeback_index;\n\tconst struct address_space_operations *a_ops;\n\tlong unsigned int flags;\n\terrseq_t wb_err;\n\tspinlock_t i_private_lock;\n\tstruct list_head i_private_list;\n\tstruct rw_semaphore i_mmap_rwsem;\n\tvoid *i_private_data;\n};\n\nstruct writeback_control;\n\nstruct readahead_control;\n\nstruct kiocb;\n\nstruct iov_iter;\n\nstruct swap_info_struct;\n\nstruct address_space_operations {\n\tint (*writepage)(struct page *, struct writeback_control *);\n\tint (*read_folio)(struct file *, struct folio *);\n\tint (*writepages)(struct address_space *, struct writeback_control *);\n\tbool (*dirty_folio)(struct address_space *, struct folio *);\n\tvoid (*readahead)(struct readahead_control *);\n\tint (*write_begin)(struct file *, struct address_space *, loff_t, unsigned int, struct page **, void **);\n\tint (*write_end)(struct file *, struct address_space *, loff_t, unsigned int, unsigned int, struct page *, void *);\n\tsector_t (*bmap)(struct address_space *, sector_t);\n\tvoid (*invalidate_folio)(struct folio *, size_t, size_t);\n\tbool (*release_folio)(struct folio *, gfp_t);\n\tvoid (*free_folio)(struct folio *);\n\tssize_t (*direct_IO)(struct kiocb *, struct iov_iter *);\n\tint (*migrate_folio)(struct address_space *, struct folio *, struct folio *, enum migrate_mode);\n\tint (*launder_folio)(struct folio *);\n\tbool (*is_partially_uptodate)(struct folio *, size_t, size_t);\n\tvoid (*is_dirty_writeback)(struct folio *, bool *, bool *);\n\tint (*error_remove_folio)(struct address_space *, struct folio *);\n\tint (*swap_activate)(struct swap_info_struct *, struct file *, sector_t *);\n\tvoid (*swap_deactivate)(struct file *);\n\tint (*swap_rw)(struct kiocb *, struct iov_iter *);\n};\n\nstruct adjust_trip_data {\n\tstruct acpi_thermal *tz;\n\tu32 event;\n};\n\nstruct adp5520_backlight_platform_data {\n\tu8 fade_in;\n\tu8 fade_out;\n\tu8 fade_led_law;\n\tu8 en_ambl_sens;\n\tu8 abml_filt;\n\tu8 l1_daylight_max;\n\tu8 l1_daylight_dim;\n\tu8 l2_office_max;\n\tu8 l2_office_dim;\n\tu8 l3_dark_max;\n\tu8 l3_dark_dim;\n\tu8 l2_trip;\n\tu8 l2_hyst;\n\tu8 l3_trip;\n\tu8 l3_hyst;\n};\n\nstruct blocking_notifier_head {\n\tstruct rw_semaphore rwsem;\n\tstruct notifier_block *head;\n};\n\nstruct adp5520_chip {\n\tstruct i2c_client *client;\n\tstruct device *dev;\n\tstruct mutex lock;\n\tstruct blocking_notifier_head notifier_list;\n\tint irq;\n\tlong unsigned int id;\n\tuint8_t mode;\n};\n\nstruct adp5520_gpio_platform_data {\n\tunsigned int gpio_start;\n\tu8 gpio_en_mask;\n\tu8 gpio_pullup_mask;\n};\n\nstruct adp5520_keys_platform_data {\n\tint rows_en_mask;\n\tint cols_en_mask;\n\tconst short unsigned int *keymap;\n\tshort unsigned int keymapsize;\n\tunsigned int repeat: 1;\n};\n\nstruct led_info;\n\nstruct adp5520_leds_platform_data {\n\tint num_leds;\n\tstruct led_info *leds;\n\tu8 fade_in;\n\tu8 fade_out;\n\tu8 led_on_time;\n};\n\nstruct adp5520_platform_data {\n\tstruct adp5520_keys_platform_data *keys;\n\tstruct adp5520_gpio_platform_data *gpio;\n\tstruct adp5520_leds_platform_data *leds;\n\tstruct adp5520_backlight_platform_data *backlight;\n};\n\nstruct advisor_ctx {\n\tktime_t start_scan;\n\tlong unsigned int scan_time;\n\tlong unsigned int change;\n\tlong long unsigned int cpu_time;\n};\n\nstruct crypto_aead;\n\nstruct aead_request;\n\nstruct aead_alg {\n\tint (*setkey)(struct crypto_aead *, const u8 *, unsigned int);\n\tint (*setauthsize)(struct crypto_aead *, unsigned int);\n\tint (*encrypt)(struct aead_request *);\n\tint (*decrypt)(struct aead_request *);\n\tint (*init)(struct crypto_aead *);\n\tvoid (*exit)(struct crypto_aead *);\n\tunsigned int ivsize;\n\tunsigned int maxauthsize;\n\tunsigned int chunksize;\n\tstruct crypto_alg base;\n};\n\nstruct crypto_sync_skcipher;\n\nstruct aead_geniv_ctx {\n\tspinlock_t lock;\n\tstruct crypto_aead *child;\n\tstruct crypto_sync_skcipher *sknull;\n\tu8 salt[0];\n};\n\nstruct crypto_template;\n\nstruct crypto_spawn;\n\nstruct crypto_instance {\n\tstruct crypto_alg alg;\n\tstruct crypto_template *tmpl;\n\tunion {\n\t\tstruct hlist_node list;\n\t\tstruct crypto_spawn *spawns;\n\t};\n\tstruct work_struct free_work;\n\tvoid *__ctx[0];\n};\n\nstruct aead_instance {\n\tvoid (*free)(struct aead_instance *);\n\tunion {\n\t\tstruct {\n\t\t\tchar head[64];\n\t\t\tstruct crypto_instance base;\n\t\t} s;\n\t\tstruct aead_alg alg;\n\t};\n};\n\nstruct aead_request {\n\tstruct crypto_async_request base;\n\tunsigned int assoclen;\n\tunsigned int cryptlen;\n\tu8 *iv;\n\tstruct scatterlist *src;\n\tstruct scatterlist *dst;\n\tvoid *__ctx[0];\n};\n\nstruct pcie_tlp_log {\n\tu32 dw[4];\n};\n\nstruct aer_capability_regs {\n\tu32 header;\n\tu32 uncor_status;\n\tu32 uncor_mask;\n\tu32 uncor_severity;\n\tu32 cor_status;\n\tu32 cor_mask;\n\tu32 cap_control;\n\tstruct pcie_tlp_log header_log;\n\tu32 root_command;\n\tu32 root_status;\n\tu16 cor_err_source;\n\tu16 uncor_err_source;\n};\n\nstruct aer_err_info {\n\tstruct pci_dev *dev[5];\n\tint error_dev_num;\n\tunsigned int id: 16;\n\tunsigned int severity: 2;\n\tunsigned int __pad1: 5;\n\tunsigned int multi_error_valid: 1;\n\tunsigned int first_error: 5;\n\tunsigned int __pad2: 2;\n\tunsigned int tlp_header_valid: 1;\n\tunsigned int status;\n\tunsigned int mask;\n\tstruct pcie_tlp_log tlp;\n};\n\nstruct aer_err_source {\n\tu32 status;\n\tu32 id;\n};\n\nstruct aer_recover_entry {\n\tu8 bus;\n\tu8 devfn;\n\tu16 domain;\n\tint severity;\n\tstruct aer_capability_regs *regs;\n};\n\nstruct aer_rpc {\n\tstruct pci_dev *rpd;\n\tstruct {\n\t\tunion {\n\t\t\tstruct __kfifo kfifo;\n\t\t\tstruct aer_err_source *type;\n\t\t\tconst struct aer_err_source *const_type;\n\t\t\tchar (*rectype)[0];\n\t\t\tstruct aer_err_source *ptr;\n\t\t\tconst struct aer_err_source *ptr_const;\n\t\t};\n\t\tstruct aer_err_source buf[128];\n\t} aer_fifo;\n};\n\nstruct aer_stats {\n\tu64 dev_cor_errs[16];\n\tu64 dev_fatal_errs[27];\n\tu64 dev_nonfatal_errs[27];\n\tu64 dev_total_cor_errs;\n\tu64 dev_total_fatal_errs;\n\tu64 dev_total_nonfatal_errs;\n\tu64 rootport_total_cor_errs;\n\tu64 rootport_total_fatal_errs;\n\tu64 rootport_total_nonfatal_errs;\n};\n\nstruct affinity_context {\n\tconst struct cpumask *new_mask;\n\tstruct cpumask *user_mask;\n\tunsigned int flags;\n};\n\nstruct component_master_ops;\n\nstruct component_match;\n\nstruct aggregate_device {\n\tstruct list_head node;\n\tbool bound;\n\tconst struct component_master_ops *ops;\n\tstruct device *parent;\n\tstruct component_match *match;\n};\n\nstruct agp_3_5_dev {\n\tstruct list_head list;\n\tu8 capndx;\n\tu32 maxbw;\n\tstruct pci_dev *dev;\n};\n\nstruct agp_version;\n\nstruct agp_bridge_driver;\n\nstruct vm_operations_struct;\n\nstruct agp_bridge_data {\n\tconst struct agp_version *version;\n\tconst struct agp_bridge_driver *driver;\n\tconst struct vm_operations_struct *vm_ops;\n\tvoid *previous_size;\n\tvoid *current_size;\n\tvoid *dev_private_data;\n\tstruct pci_dev *dev;\n\tu32 *gatt_table;\n\tu32 *gatt_table_real;\n\tlong unsigned int scratch_page;\n\tstruct page *scratch_page_page;\n\tdma_addr_t scratch_page_dma;\n\tlong unsigned int gart_bus_addr;\n\tlong unsigned int gatt_bus_addr;\n\tu32 mode;\n\tlong unsigned int *key_list;\n\tatomic_t current_memory_agp;\n\tatomic_t agp_in_use;\n\tint max_memory_agp;\n\tint aperture_size_idx;\n\tint capndx;\n\tint flags;\n\tchar major_version;\n\tchar minor_version;\n\tstruct list_head list;\n\tu32 apbase_config;\n\tstruct list_head mapped_list;\n\tspinlock_t mapped_lock;\n};\n\nstruct gatt_mask;\n\nstruct agp_memory;\n\nstruct agp_bridge_driver {\n\tstruct module *owner;\n\tconst void *aperture_sizes;\n\tint num_aperture_sizes;\n\tenum aper_size_type size_type;\n\tbool cant_use_aperture;\n\tbool needs_scratch_page;\n\tconst struct gatt_mask *masks;\n\tint (*fetch_size)(void);\n\tint (*configure)(void);\n\tvoid (*agp_enable)(struct agp_bridge_data *, u32);\n\tvoid (*cleanup)(void);\n\tvoid (*tlb_flush)(struct agp_memory *);\n\tlong unsigned int (*mask_memory)(struct agp_bridge_data *, dma_addr_t, int);\n\tvoid (*cache_flush)(void);\n\tint (*create_gatt_table)(struct agp_bridge_data *);\n\tint (*free_gatt_table)(struct agp_bridge_data *);\n\tint (*insert_memory)(struct agp_memory *, off_t, int);\n\tint (*remove_memory)(struct agp_memory *, off_t, int);\n\tstruct agp_memory * (*alloc_by_type)(size_t, int);\n\tvoid (*free_by_type)(struct agp_memory *);\n\tstruct page * (*agp_alloc_page)(struct agp_bridge_data *);\n\tint (*agp_alloc_pages)(struct agp_bridge_data *, struct agp_memory *, size_t);\n\tvoid (*agp_destroy_page)(struct page *, int);\n\tvoid (*agp_destroy_pages)(struct agp_memory *);\n\tint (*agp_type_to_mask_type)(struct agp_bridge_data *, int);\n};\n\nstruct agp_device_ids {\n\tshort unsigned int device_id;\n\tenum chipset_type chipset;\n\tconst char *chipset_name;\n\tint (*chipset_setup)(struct pci_dev *);\n};\n\nstruct agp_version {\n\tu16 major;\n\tu16 minor;\n};\n\nstruct agp_kern_info {\n\tstruct agp_version version;\n\tstruct pci_dev *device;\n\tenum chipset_type chipset;\n\tlong unsigned int mode;\n\tlong unsigned int aper_base;\n\tsize_t aper_size;\n\tint max_memory;\n\tint current_memory;\n\tbool cant_use_aperture;\n\tlong unsigned int page_mask;\n\tconst struct vm_operations_struct *vm_ops;\n};\n\nstruct agp_memory {\n\tstruct agp_memory *next;\n\tstruct agp_memory *prev;\n\tstruct agp_bridge_data *bridge;\n\tstruct page **pages;\n\tsize_t page_count;\n\tint key;\n\tint num_scratch_pages;\n\toff_t pg_start;\n\tu32 type;\n\tu32 physical;\n\tbool is_bound;\n\tbool is_flushed;\n\tstruct list_head mapped_list;\n\tstruct scatterlist *sg_list;\n\tint num_sg;\n};\n\nstruct hash_alg_common {\n\tunsigned int digestsize;\n\tunsigned int statesize;\n\tstruct crypto_alg base;\n};\n\nstruct ahash_request;\n\nstruct crypto_ahash;\n\nstruct ahash_alg {\n\tint (*init)(struct ahash_request *);\n\tint (*update)(struct ahash_request *);\n\tint (*final)(struct ahash_request *);\n\tint (*finup)(struct ahash_request *);\n\tint (*digest)(struct ahash_request *);\n\tint (*export)(struct ahash_request *, void *);\n\tint (*import)(struct ahash_request *, const void *);\n\tint (*setkey)(struct crypto_ahash *, const u8 *, unsigned int);\n\tint (*init_tfm)(struct crypto_ahash *);\n\tvoid (*exit_tfm)(struct crypto_ahash *);\n\tint (*clone_tfm)(struct crypto_ahash *, struct crypto_ahash *);\n\tstruct hash_alg_common halg;\n};\n\nstruct ahash_instance {\n\tvoid (*free)(struct ahash_instance *);\n\tunion {\n\t\tstruct {\n\t\t\tchar head[96];\n\t\t\tstruct crypto_instance base;\n\t\t} s;\n\t\tstruct ahash_alg alg;\n\t};\n};\n\nstruct ahash_request {\n\tstruct crypto_async_request base;\n\tunsigned int nbytes;\n\tstruct scatterlist *src;\n\tu8 *result;\n\tvoid *priv;\n\tvoid *__ctx[0];\n};\n\nstruct wait_page_queue;\n\nstruct kiocb {\n\tstruct file *ki_filp;\n\tloff_t ki_pos;\n\tvoid (*ki_complete)(struct kiocb *, long int);\n\tvoid *private;\n\tint ki_flags;\n\tu16 ki_ioprio;\n\tunion {\n\t\tstruct wait_page_queue *ki_waitq;\n\t\tssize_t (*dio_complete)(void *);\n\t};\n};\n\nstruct fsync_iocb {\n\tstruct file *file;\n\tstruct work_struct work;\n\tbool datasync;\n\tstruct cred *creds;\n};\n\nstruct wait_queue_entry;\n\ntypedef int (*wait_queue_func_t)(struct wait_queue_entry *, unsigned int, int, void *);\n\nstruct wait_queue_entry {\n\tunsigned int flags;\n\tvoid *private;\n\twait_queue_func_t func;\n\tstruct list_head entry;\n};\n\nstruct poll_iocb {\n\tstruct file *file;\n\tstruct wait_queue_head *head;\n\t__poll_t events;\n\tbool cancelled;\n\tbool work_scheduled;\n\tbool work_need_resched;\n\tstruct wait_queue_entry wait;\n\tstruct work_struct work;\n};\n\ntypedef int kiocb_cancel_fn(struct kiocb *);\n\nstruct io_event {\n\t__u64 data;\n\t__u64 obj;\n\t__s64 res;\n\t__s64 res2;\n};\n\nstruct kioctx;\n\nstruct eventfd_ctx;\n\nstruct aio_kiocb {\n\tunion {\n\t\tstruct file *ki_filp;\n\t\tstruct kiocb rw;\n\t\tstruct fsync_iocb fsync;\n\t\tstruct poll_iocb poll;\n\t};\n\tstruct kioctx *ki_ctx;\n\tkiocb_cancel_fn *ki_cancel;\n\tstruct io_event ki_res;\n\tstruct list_head ki_list;\n\trefcount_t ki_refcnt;\n\tstruct eventfd_ctx *ki_eventfd;\n};\n\nstruct poll_table_struct;\n\ntypedef void (*poll_queue_proc)(struct file *, wait_queue_head_t *, struct poll_table_struct *);\n\nstruct poll_table_struct {\n\tpoll_queue_proc _qproc;\n\t__poll_t _key;\n};\n\nstruct aio_poll_table {\n\tstruct poll_table_struct pt;\n\tstruct aio_kiocb *iocb;\n\tbool queued;\n\tint error;\n};\n\nstruct aio_ring {\n\tunsigned int id;\n\tunsigned int nr;\n\tunsigned int head;\n\tunsigned int tail;\n\tunsigned int magic;\n\tunsigned int compat_features;\n\tunsigned int incompat_features;\n\tunsigned int header_length;\n\tstruct io_event io_events[0];\n};\n\nstruct aio_waiter {\n\tstruct wait_queue_entry w;\n\tsize_t min_nr;\n};\n\nstruct akcipher_request;\n\nstruct crypto_akcipher;\n\nstruct akcipher_alg {\n\tint (*sign)(struct akcipher_request *);\n\tint (*verify)(struct akcipher_request *);\n\tint (*encrypt)(struct akcipher_request *);\n\tint (*decrypt)(struct akcipher_request *);\n\tint (*set_pub_key)(struct crypto_akcipher *, const void *, unsigned int);\n\tint (*set_priv_key)(struct crypto_akcipher *, const void *, unsigned int);\n\tunsigned int (*max_size)(struct crypto_akcipher *);\n\tint (*init)(struct crypto_akcipher *);\n\tvoid (*exit)(struct crypto_akcipher *);\n\tstruct crypto_alg base;\n};\n\nstruct akcipher_instance {\n\tvoid (*free)(struct akcipher_instance *);\n\tunion {\n\t\tstruct {\n\t\t\tchar head[72];\n\t\t\tstruct crypto_instance base;\n\t\t} s;\n\t\tstruct akcipher_alg alg;\n\t};\n};\n\nstruct akcipher_request {\n\tstruct crypto_async_request base;\n\tstruct scatterlist *src;\n\tstruct scatterlist *dst;\n\tunsigned int src_len;\n\tunsigned int dst_len;\n\tvoid *__ctx[0];\n};\n\nstruct alarm {\n\tstruct timerqueue_node node;\n\tstruct hrtimer timer;\n\tenum alarmtimer_restart (*function)(struct alarm *, ktime_t);\n\tenum alarmtimer_type type;\n\tint state;\n\tvoid *data;\n};\n\nstruct timerqueue_head {\n\tstruct rb_root_cached rb_root;\n};\n\nstruct timespec64;\n\nstruct alarm_base {\n\tspinlock_t lock;\n\tstruct timerqueue_head timerqueue;\n\tktime_t (*get_ktime)(void);\n\tvoid (*get_timespec)(struct timespec64 *);\n\tclockid_t base_clockid;\n};\n\nstruct source_location {\n\tconst char *file_name;\n\tunion {\n\t\tlong unsigned int reported;\n\t\tstruct {\n\t\t\tu32 line;\n\t\t\tu32 column;\n\t\t};\n\t};\n};\n\nstruct type_descriptor;\n\nstruct alignment_assumption_data {\n\tstruct source_location location;\n\tstruct source_location assumption_location;\n\tstruct type_descriptor *type;\n};\n\nstruct zonelist;\n\nstruct zoneref;\n\nstruct alloc_context {\n\tstruct zonelist *zonelist;\n\tnodemask_t *nodemask;\n\tstruct zoneref *preferred_zoneref;\n\tint migratetype;\n\tenum zone_type highest_zoneidx;\n\tbool spread_dirty_pages;\n};\n\nstruct codetag {\n\tunsigned int flags;\n\tunsigned int lineno;\n\tconst char *modname;\n\tconst char *function;\n\tconst char *filename;\n};\n\nstruct alloc_tag_counters;\n\nstruct alloc_tag {\n\tstruct codetag ct;\n\tstruct alloc_tag_counters *counters;\n};\n\nstruct alloc_tag_counters {\n\tu64 bytes;\n\tu64 calls;\n};\n\nstruct alt_instr {\n\ts32 instr_offset;\n\ts32 repl_offset;\n\tunion {\n\t\tstruct {\n\t\t\tu32 cpuid: 16;\n\t\t\tu32 flags: 16;\n\t\t};\n\t\tu32 ft_flags;\n\t};\n\tu8 instrlen;\n\tu8 replacementlen;\n} __attribute__((packed));\n\nstruct amd_aperf_mperf {\n\tu64 aperf;\n\tu64 mperf;\n\tu64 tsc;\n};\n\nstruct amd_chipset_type {\n\tenum amd_chipset_gen gen;\n\tu8 rev;\n};\n\nstruct amd_chipset_info {\n\tstruct pci_dev *nb_dev;\n\tstruct pci_dev *smbus_dev;\n\tint nb_type;\n\tstruct amd_chipset_type sb_type;\n\tint isoc_reqs;\n\tint probe_count;\n\tbool need_pll_quirk;\n};\n\nstruct amd_cpudata {\n\tint cpu;\n\tstruct freq_qos_request req[2];\n\tu64 cppc_req_cached;\n\tu32 highest_perf;\n\tu32 nominal_perf;\n\tu32 lowest_nonlinear_perf;\n\tu32 lowest_perf;\n\tu32 prefcore_ranking;\n\tu32 min_limit_perf;\n\tu32 max_limit_perf;\n\tu32 min_limit_freq;\n\tu32 max_limit_freq;\n\tu32 max_freq;\n\tu32 min_freq;\n\tu32 nominal_freq;\n\tu32 lowest_nonlinear_freq;\n\tstruct amd_aperf_mperf cur;\n\tstruct amd_aperf_mperf prev;\n\tu64 freq;\n\tbool boost_supported;\n\tbool hw_prefcore;\n\ts16 epp_policy;\n\ts16 epp_cached;\n\tu32 policy;\n\tu64 cppc_cap1_cached;\n\tbool suspended;\n\ts16 epp_default;\n\tbool boost_state;\n};\n\nunion amd_debug_extn_cfg {\n\t__u64 val;\n\tstruct {\n\t\t__u64 rsvd0: 2;\n\t\t__u64 brsmen: 1;\n\t\t__u64 rsvd4_3: 2;\n\t\t__u64 vb: 1;\n\t\t__u64 rsvd2: 10;\n\t\t__u64 msroff: 4;\n\t\t__u64 rsvd3: 4;\n\t\t__u64 pmc: 3;\n\t\t__u64 rsvd4: 37;\n\t};\n};\n\nstruct amd_function {\n\tconst char *name;\n\tconst char * const groups[4];\n\tunsigned int ngroups;\n\tint index;\n};\n\nstruct irq_fwspec;\n\nstruct irq_data;\n\nstruct irq_domain_ops {\n\tint (*match)(struct irq_domain *, struct device_node *, enum irq_domain_bus_token);\n\tint (*select)(struct irq_domain *, struct irq_fwspec *, enum irq_domain_bus_token);\n\tint (*map)(struct irq_domain *, unsigned int, irq_hw_number_t);\n\tvoid (*unmap)(struct irq_domain *, unsigned int);\n\tint (*xlate)(struct irq_domain *, struct device_node *, const u32 *, unsigned int, long unsigned int *, unsigned int *);\n\tint (*alloc)(struct irq_domain *, unsigned int, unsigned int, void *);\n\tvoid (*free)(struct irq_domain *, unsigned int, unsigned int);\n\tint (*activate)(struct irq_domain *, struct irq_data *, bool);\n\tvoid (*deactivate)(struct irq_domain *, struct irq_data *);\n\tint (*translate)(struct irq_domain *, struct irq_fwspec *, long unsigned int *, unsigned int *);\n};\n\nstruct irq_desc;\n\ntypedef void (*irq_flow_handler_t)(struct irq_desc *);\n\nstruct irq_chip;\n\nunion gpio_irq_fwspec;\n\nstruct gpio_irq_chip {\n\tstruct irq_chip *chip;\n\tstruct irq_domain *domain;\n\tstruct fwnode_handle *fwnode;\n\tstruct irq_domain *parent_domain;\n\tint (*child_to_parent_hwirq)(struct gpio_chip *, unsigned int, unsigned int, unsigned int *, unsigned int *);\n\tint (*populate_parent_alloc_arg)(struct gpio_chip *, union gpio_irq_fwspec *, unsigned int, unsigned int);\n\tunsigned int (*child_offset_to_irq)(struct gpio_chip *, unsigned int);\n\tstruct irq_domain_ops child_irq_domain_ops;\n\tirq_flow_handler_t handler;\n\tunsigned int default_type;\n\tstruct lock_class_key *lock_key;\n\tstruct lock_class_key *request_key;\n\tirq_flow_handler_t parent_handler;\n\tunion {\n\t\tvoid *parent_handler_data;\n\t\tvoid **parent_handler_data_array;\n\t};\n\tunsigned int num_parents;\n\tunsigned int *parents;\n\tunsigned int *map;\n\tbool threaded;\n\tbool per_parent_data;\n\tbool initialized;\n\tbool domain_is_allocated_externally;\n\tint (*init_hw)(struct gpio_chip *);\n\tvoid (*init_valid_mask)(struct gpio_chip *, long unsigned int *, unsigned int);\n\tlong unsigned int *valid_mask;\n\tunsigned int first;\n\tvoid (*irq_enable)(struct irq_data *);\n\tvoid (*irq_disable)(struct irq_data *);\n\tvoid (*irq_unmask)(struct irq_data *);\n\tvoid (*irq_mask)(struct irq_data *);\n};\n\nstruct gpio_device;\n\nstruct seq_file;\n\nstruct gpio_chip {\n\tconst char *label;\n\tstruct gpio_device *gpiodev;\n\tstruct device *parent;\n\tstruct fwnode_handle *fwnode;\n\tstruct module *owner;\n\tint (*request)(struct gpio_chip *, unsigned int);\n\tvoid (*free)(struct gpio_chip *, unsigned int);\n\tint (*get_direction)(struct gpio_chip *, unsigned int);\n\tint (*direction_input)(struct gpio_chip *, unsigned int);\n\tint (*direction_output)(struct gpio_chip *, unsigned int, int);\n\tint (*get)(struct gpio_chip *, unsigned int);\n\tint (*get_multiple)(struct gpio_chip *, long unsigned int *, long unsigned int *);\n\tvoid (*set)(struct gpio_chip *, unsigned int, int);\n\tvoid (*set_multiple)(struct gpio_chip *, long unsigned int *, long unsigned int *);\n\tint (*set_config)(struct gpio_chip *, unsigned int, long unsigned int);\n\tint (*to_irq)(struct gpio_chip *, unsigned int);\n\tvoid (*dbg_show)(struct seq_file *, struct gpio_chip *);\n\tint (*init_valid_mask)(struct gpio_chip *, long unsigned int *, unsigned int);\n\tint (*add_pin_ranges)(struct gpio_chip *);\n\tint (*en_hw_timestamp)(struct gpio_chip *, u32, long unsigned int);\n\tint (*dis_hw_timestamp)(struct gpio_chip *, u32, long unsigned int);\n\tint base;\n\tu16 ngpio;\n\tu16 offset;\n\tconst char * const *names;\n\tbool can_sleep;\n\tlong unsigned int (*read_reg)(void *);\n\tvoid (*write_reg)(void *, long unsigned int);\n\tbool be_bits;\n\tvoid *reg_dat;\n\tvoid *reg_set;\n\tvoid *reg_clr;\n\tvoid *reg_dir_out;\n\tvoid *reg_dir_in;\n\tbool bgpio_dir_unreadable;\n\tint bgpio_bits;\n\traw_spinlock_t bgpio_lock;\n\tlong unsigned int bgpio_data;\n\tlong unsigned int bgpio_dir;\n\tstruct gpio_irq_chip irq;\n\tlong unsigned int *valid_mask;\n};\n\nstruct pingroup;\n\nstruct pinctrl_dev;\n\nstruct platform_device;\n\nstruct amd_gpio {\n\traw_spinlock_t lock;\n\tvoid *base;\n\tvoid *iomux_base;\n\tconst struct pingroup *groups;\n\tu32 ngroups;\n\tstruct pinctrl_dev *pctrl;\n\tstruct gpio_chip gc;\n\tunsigned int hwbank_num;\n\tstruct resource *res;\n\tstruct platform_device *pdev;\n\tu32 *saved_regs;\n\tint irq;\n};\n\nstruct amd_hostbridge {\n\tu32 bus;\n\tu32 slot;\n\tu32 device;\n};\n\nstruct iommu_flush_ops;\n\nstruct io_pgtable_cfg {\n\tlong unsigned int quirks;\n\tlong unsigned int pgsize_bitmap;\n\tunsigned int ias;\n\tunsigned int oas;\n\tbool coherent_walk;\n\tconst struct iommu_flush_ops *tlb;\n\tstruct device *iommu_dev;\n\tvoid * (*alloc)(void *, size_t, gfp_t);\n\tvoid (*free)(void *, void *, size_t);\n\tunion {\n\t\tstruct {\n\t\t\tu64 ttbr;\n\t\t\tstruct {\n\t\t\t\tu32 ips: 3;\n\t\t\t\tu32 tg: 2;\n\t\t\t\tu32 sh: 2;\n\t\t\t\tu32 orgn: 2;\n\t\t\t\tu32 irgn: 2;\n\t\t\t\tu32 tsz: 6;\n\t\t\t} tcr;\n\t\t\tu64 mair;\n\t\t} arm_lpae_s1_cfg;\n\t\tstruct {\n\t\t\tu64 vttbr;\n\t\t\tstruct {\n\t\t\t\tu32 ps: 3;\n\t\t\t\tu32 tg: 2;\n\t\t\t\tu32 sh: 2;\n\t\t\t\tu32 orgn: 2;\n\t\t\t\tu32 irgn: 2;\n\t\t\t\tu32 sl: 2;\n\t\t\t\tu32 tsz: 6;\n\t\t\t} vtcr;\n\t\t} arm_lpae_s2_cfg;\n\t\tstruct {\n\t\t\tu32 ttbr;\n\t\t\tu32 tcr;\n\t\t\tu32 nmrr;\n\t\t\tu32 prrr;\n\t\t} arm_v7s_cfg;\n\t\tstruct {\n\t\t\tu64 transtab;\n\t\t\tu64 memattr;\n\t\t} arm_mali_lpae_cfg;\n\t\tstruct {\n\t\t\tu64 ttbr[4];\n\t\t\tu32 n_ttbrs;\n\t\t} apple_dart_cfg;\n\t\tstruct {\n\t\t\tint nid;\n\t\t} amd;\n\t};\n};\n\nstruct iommu_iotlb_gather;\n\nstruct iommu_dirty_bitmap;\n\nstruct io_pgtable_ops {\n\tint (*map_pages)(struct io_pgtable_ops *, long unsigned int, phys_addr_t, size_t, size_t, int, gfp_t, size_t *);\n\tsize_t (*unmap_pages)(struct io_pgtable_ops *, long unsigned int, size_t, size_t, struct iommu_iotlb_gather *);\n\tphys_addr_t (*iova_to_phys)(struct io_pgtable_ops *, long unsigned int);\n\tint (*read_and_clear_dirty)(struct io_pgtable_ops *, long unsigned int, size_t, long unsigned int, struct iommu_dirty_bitmap *);\n};\n\nstruct io_pgtable {\n\tenum io_pgtable_fmt fmt;\n\tvoid *cookie;\n\tstruct io_pgtable_cfg cfg;\n\tstruct io_pgtable_ops ops;\n};\n\nstruct amd_io_pgtable {\n\tstruct io_pgtable_cfg pgtbl_cfg;\n\tstruct io_pgtable pgtbl;\n\tint mode;\n\tu64 *root;\n\tu64 *pgd;\n};\n\nstruct iommu_ops;\n\nstruct iommu_device {\n\tstruct list_head list;\n\tconst struct iommu_ops *ops;\n\tstruct fwnode_handle *fwnode;\n\tstruct device *dev;\n\tstruct iommu_group *singleton_group;\n\tu32 max_pasids;\n};\n\nstruct amd_iommu_pci_seg;\n\nstruct amd_irte_ops;\n\nstruct iopf_queue;\n\nstruct amd_iommu {\n\tstruct list_head list;\n\tint index;\n\traw_spinlock_t lock;\n\tstruct pci_dev *dev;\n\tstruct pci_dev *root_pdev;\n\tu64 mmio_phys;\n\tu64 mmio_phys_end;\n\tu8 *mmio_base;\n\tu32 cap;\n\tu8 acpi_flags;\n\tu64 features;\n\tu64 features2;\n\tu16 devid;\n\tu16 cap_ptr;\n\tstruct amd_iommu_pci_seg *pci_seg;\n\tu64 exclusion_start;\n\tu64 exclusion_length;\n\tu8 *cmd_buf;\n\tu32 cmd_buf_head;\n\tu32 cmd_buf_tail;\n\tu8 *evt_buf;\n\tunsigned char evt_irq_name[16];\n\tu8 *ppr_log;\n\tunsigned char ppr_irq_name[16];\n\tu8 *ga_log;\n\tunsigned char ga_irq_name[16];\n\tu8 *ga_log_tail;\n\tbool int_enabled;\n\tbool need_sync;\n\tbool irtcachedis_enabled;\n\tstruct iommu_device iommu;\n\tu32 stored_addr_lo;\n\tu32 stored_addr_hi;\n\tu32 stored_l1[108];\n\tu32 stored_l2[131];\n\tu8 max_banks;\n\tu8 max_counters;\n\tstruct irq_domain *ir_domain;\n\tstruct amd_irte_ops *irte_ops;\n\tu32 flags;\n\tvolatile u64 *cmd_sem;\n\tatomic64_t cmd_sem_val;\n\tstruct iopf_queue *iopf_queue;\n\tunsigned char iopfq_name[32];\n};\n\nstruct amd_iommu_event_desc {\n\tstruct device_attribute attr;\n\tconst char *event;\n};\n\nstruct llist_head {\n\tstruct llist_node *first;\n};\n\nstruct dev_table_entry;\n\nstruct irq_remap_table;\n\nstruct amd_iommu_pci_seg {\n\tstruct list_head list;\n\tstruct llist_head dev_data_list;\n\tu16 id;\n\tu16 last_bdf;\n\tu32 dev_table_size;\n\tu32 alias_table_size;\n\tu32 rlookup_table_size;\n\tstruct dev_table_entry *dev_table;\n\tstruct amd_iommu **rlookup_table;\n\tstruct irq_remap_table **irq_lookup_table;\n\tstruct dev_table_entry *old_dev_tbl_cpy;\n\tu16 *alias_table;\n\tstruct list_head unity_map;\n};\n\nstruct vcpu_data;\n\nstruct amd_iommu_pi_data {\n\tu32 ga_tag;\n\tu32 prev_ga_tag;\n\tu64 base;\n\tbool is_guest_mode;\n\tstruct vcpu_data *vcpu_data;\n\tvoid *ir_data;\n};\n\nstruct irq_2_irte {\n\tu16 devid;\n\tu16 index;\n};\n\nstruct x86_msi_addr_lo {\n\tunion {\n\t\tstruct {\n\t\t\tu32 reserved_0: 2;\n\t\t\tu32 dest_mode_logical: 1;\n\t\t\tu32 redirect_hint: 1;\n\t\t\tu32 reserved_1: 1;\n\t\t\tu32 virt_destid_8_14: 7;\n\t\t\tu32 destid_0_7: 8;\n\t\t\tu32 base_address: 12;\n\t\t};\n\t\tstruct {\n\t\t\tu32 dmar_reserved_0: 2;\n\t\t\tu32 dmar_index_15: 1;\n\t\t\tu32 dmar_subhandle_valid: 1;\n\t\t\tu32 dmar_format: 1;\n\t\t\tu32 dmar_index_0_14: 15;\n\t\t\tu32 dmar_base_address: 12;\n\t\t};\n\t};\n};\n\ntypedef struct x86_msi_addr_lo arch_msi_msg_addr_lo_t;\n\nstruct x86_msi_addr_hi {\n\tu32 reserved: 8;\n\tu32 destid_8_31: 24;\n};\n\ntypedef struct x86_msi_addr_hi arch_msi_msg_addr_hi_t;\n\nstruct x86_msi_data {\n\tunion {\n\t\tstruct {\n\t\t\tu32 vector: 8;\n\t\t\tu32 delivery_mode: 3;\n\t\t\tu32 dest_mode_logical: 1;\n\t\t\tu32 reserved: 2;\n\t\t\tu32 active_low: 1;\n\t\t\tu32 is_level: 1;\n\t\t};\n\t\tu32 dmar_subhandle;\n\t};\n};\n\ntypedef struct x86_msi_data arch_msi_msg_data_t;\n\nstruct msi_msg {\n\tunion {\n\t\tu32 address_lo;\n\t\tarch_msi_msg_addr_lo_t arch_addr_lo;\n\t};\n\tunion {\n\t\tu32 address_hi;\n\t\tarch_msi_msg_addr_hi_t arch_addr_hi;\n\t};\n\tunion {\n\t\tu32 data;\n\t\tarch_msi_msg_data_t arch_data;\n\t};\n};\n\nstruct irq_cfg;\n\nstruct amd_ir_data {\n\tu32 cached_ga_tag;\n\tstruct amd_iommu *iommu;\n\tstruct irq_2_irte irq_2_irte;\n\tstruct msi_msg msi_entry;\n\tvoid *entry;\n\tstruct irq_cfg *cfg;\n\tint ga_vector;\n\tu64 ga_root_ptr;\n\tu32 ga_tag;\n};\n\nstruct amd_irte_ops {\n\tvoid (*prepare)(void *, u32, bool, u8, u32, int);\n\tvoid (*activate)(struct amd_iommu *, void *, u16, u16);\n\tvoid (*deactivate)(struct amd_iommu *, void *, u16, u16);\n\tvoid (*set_affinity)(struct amd_iommu *, void *, u16, u16, u8, u32);\n\tvoid * (*get)(struct irq_remap_table *, int);\n\tvoid (*set_allocated)(struct irq_remap_table *, int);\n\tbool (*is_allocated)(struct irq_remap_table *, int);\n\tvoid (*clear_allocated)(struct irq_remap_table *, int);\n};\n\nstruct amd_l3_cache {\n\tunsigned int indices;\n\tu8 subcaches[4];\n};\n\nstruct amd_lps0_hid_device_data {\n\tconst bool check_off_by_one;\n};\n\nstruct event_constraint {\n\tunion {\n\t\tlong unsigned int idxmsk[1];\n\t\tu64 idxmsk64;\n\t};\n\tu64 code;\n\tu64 cmask;\n\tint weight;\n\tint overlap;\n\tint flags;\n\tunsigned int size;\n};\n\nstruct perf_event;\n\nstruct amd_nb {\n\tint nb_id;\n\tint refcnt;\n\tstruct perf_event *owners[64];\n\tstruct event_constraint event_constraints[64];\n};\n\nstruct amd_nb_bus_dev_range {\n\tu8 bus;\n\tu8 dev_base;\n\tu8 dev_limit;\n};\n\nstruct threshold_bank;\n\nstruct amd_northbridge {\n\tstruct pci_dev *root;\n\tstruct pci_dev *misc;\n\tstruct pci_dev *link;\n\tstruct amd_l3_cache l3_cache;\n\tstruct threshold_bank *bank4;\n};\n\nstruct amd_northbridge_info {\n\tu16 num;\n\tu64 flags;\n\tstruct amd_northbridge *nb;\n};\n\nstruct freq_band_range {\n\tu64 start;\n\tu64 end;\n};\n\nstruct amd_wbrf_ranges_out {\n\tu32 num_of_ranges;\n\tstruct freq_band_range band_list[11];\n} __attribute__((packed));\n\nstruct aml_resource_small_header {\n\tu8 descriptor_type;\n};\n\nstruct aml_resource_large_header {\n\tu8 descriptor_type;\n\tu16 resource_length;\n} __attribute__((packed));\n\nstruct aml_resource_irq {\n\tu8 descriptor_type;\n\tu16 irq_mask;\n\tu8 flags;\n} __attribute__((packed));\n\nstruct aml_resource_dma {\n\tu8 descriptor_type;\n\tu8 dma_channel_mask;\n\tu8 flags;\n};\n\nstruct aml_resource_start_dependent {\n\tu8 descriptor_type;\n\tu8 flags;\n};\n\nstruct aml_resource_end_dependent {\n\tu8 descriptor_type;\n};\n\nstruct aml_resource_io {\n\tu8 descriptor_type;\n\tu8 flags;\n\tu16 minimum;\n\tu16 maximum;\n\tu8 alignment;\n\tu8 address_length;\n};\n\nstruct aml_resource_fixed_io {\n\tu8 descriptor_type;\n\tu16 address;\n\tu8 address_length;\n} __attribute__((packed));\n\nstruct aml_resource_fixed_dma {\n\tu8 descriptor_type;\n\tu16 request_lines;\n\tu16 channels;\n\tu8 width;\n} __attribute__((packed));\n\nstruct aml_resource_vendor_small {\n\tu8 descriptor_type;\n};\n\nstruct aml_resource_end_tag {\n\tu8 descriptor_type;\n\tu8 checksum;\n};\n\nstruct aml_resource_memory24 {\n\tu8 descriptor_type;\n\tu16 resource_length;\n\tu8 flags;\n\tu16 minimum;\n\tu16 maximum;\n\tu16 alignment;\n\tu16 address_length;\n} __attribute__((packed));\n\nstruct aml_resource_generic_register {\n\tu8 descriptor_type;\n\tu16 resource_length;\n\tu8 address_space_id;\n\tu8 bit_width;\n\tu8 bit_offset;\n\tu8 access_size;\n\tu64 address;\n} __attribute__((packed));\n\nstruct aml_resource_vendor_large {\n\tu8 descriptor_type;\n\tu16 resource_length;\n} __attribute__((packed));\n\nstruct aml_resource_memory32 {\n\tu8 descriptor_type;\n\tu16 resource_length;\n\tu8 flags;\n\tu32 minimum;\n\tu32 maximum;\n\tu32 alignment;\n\tu32 address_length;\n} __attribute__((packed));\n\nstruct aml_resource_fixed_memory32 {\n\tu8 descriptor_type;\n\tu16 resource_length;\n\tu8 flags;\n\tu32 address;\n\tu32 address_length;\n} __attribute__((packed));\n\nstruct aml_resource_address16 {\n\tu8 descriptor_type;\n\tu16 resource_length;\n\tu8 resource_type;\n\tu8 flags;\n\tu8 specific_flags;\n\tu16 granularity;\n\tu16 minimum;\n\tu16 maximum;\n\tu16 translation_offset;\n\tu16 address_length;\n} __attribute__((packed));\n\nstruct aml_resource_address32 {\n\tu8 descriptor_type;\n\tu16 resource_length;\n\tu8 resource_type;\n\tu8 flags;\n\tu8 specific_flags;\n\tu32 granularity;\n\tu32 minimum;\n\tu32 maximum;\n\tu32 translation_offset;\n\tu32 address_length;\n} __attribute__((packed));\n\nstruct aml_resource_address64 {\n\tu8 descriptor_type;\n\tu16 resource_length;\n\tu8 resource_type;\n\tu8 flags;\n\tu8 specific_flags;\n\tu64 granularity;\n\tu64 minimum;\n\tu64 maximum;\n\tu64 translation_offset;\n\tu64 address_length;\n} __attribute__((packed));\n\nstruct aml_resource_extended_address64 {\n\tu8 descriptor_type;\n\tu16 resource_length;\n\tu8 resource_type;\n\tu8 flags;\n\tu8 specific_flags;\n\tu8 revision_ID;\n\tu8 reserved;\n\tu64 granularity;\n\tu64 minimum;\n\tu64 maximum;\n\tu64 translation_offset;\n\tu64 address_length;\n\tu64 type_specific;\n} __attribute__((packed));\n\nstruct aml_resource_extended_irq {\n\tu8 descriptor_type;\n\tu16 resource_length;\n\tu8 flags;\n\tu8 interrupt_count;\n\tunion {\n\t\tu32 interrupt;\n\t\tstruct {\n\t\t\tstruct {} __Empty_interrupts;\n\t\t\tu32 interrupts[0];\n\t\t};\n\t};\n} __attribute__((packed));\n\nstruct aml_resource_gpio {\n\tu8 descriptor_type;\n\tu16 resource_length;\n\tu8 revision_id;\n\tu8 connection_type;\n\tu16 flags;\n\tu16 int_flags;\n\tu8 pin_config;\n\tu16 drive_strength;\n\tu16 debounce_timeout;\n\tu16 pin_table_offset;\n\tu8 res_source_index;\n\tu16 res_source_offset;\n\tu16 vendor_offset;\n\tu16 vendor_length;\n} __attribute__((packed));\n\nstruct aml_resource_i2c_serialbus {\n\tu8 descriptor_type;\n\tu16 resource_length;\n\tu8 revision_id;\n\tu8 res_source_index;\n\tu8 type;\n\tu8 flags;\n\tu16 type_specific_flags;\n\tu8 type_revision_id;\n\tu16 type_data_length;\n\tu32 connection_speed;\n\tu16 slave_address;\n} __attribute__((packed));\n\nstruct aml_resource_spi_serialbus {\n\tu8 descriptor_type;\n\tu16 resource_length;\n\tu8 revision_id;\n\tu8 res_source_index;\n\tu8 type;\n\tu8 flags;\n\tu16 type_specific_flags;\n\tu8 type_revision_id;\n\tu16 type_data_length;\n\tu32 connection_speed;\n\tu8 data_bit_length;\n\tu8 clock_phase;\n\tu8 clock_polarity;\n\tu16 device_selection;\n} __attribute__((packed));\n\nstruct aml_resource_uart_serialbus {\n\tu8 descriptor_type;\n\tu16 resource_length;\n\tu8 revision_id;\n\tu8 res_source_index;\n\tu8 type;\n\tu8 flags;\n\tu16 type_specific_flags;\n\tu8 type_revision_id;\n\tu16 type_data_length;\n\tu32 default_baud_rate;\n\tu16 rx_fifo_size;\n\tu16 tx_fifo_size;\n\tu8 parity;\n\tu8 lines_enabled;\n} __attribute__((packed));\n\nstruct aml_resource_csi2_serialbus {\n\tu8 descriptor_type;\n\tu16 resource_length;\n\tu8 revision_id;\n\tu8 res_source_index;\n\tu8 type;\n\tu8 flags;\n\tu16 type_specific_flags;\n\tu8 type_revision_id;\n\tu16 type_data_length;\n} __attribute__((packed));\n\nstruct aml_resource_common_serialbus {\n\tu8 descriptor_type;\n\tu16 resource_length;\n\tu8 revision_id;\n\tu8 res_source_index;\n\tu8 type;\n\tu8 flags;\n\tu16 type_specific_flags;\n\tu8 type_revision_id;\n\tu16 type_data_length;\n} __attribute__((packed));\n\nstruct aml_resource_pin_function {\n\tu8 descriptor_type;\n\tu16 resource_length;\n\tu8 revision_id;\n\tu16 flags;\n\tu8 pin_config;\n\tu16 function_number;\n\tu16 pin_table_offset;\n\tu8 res_source_index;\n\tu16 res_source_offset;\n\tu16 vendor_offset;\n\tu16 vendor_length;\n} __attribute__((packed));\n\nstruct aml_resource_pin_config {\n\tu8 descriptor_type;\n\tu16 resource_length;\n\tu8 revision_id;\n\tu16 flags;\n\tu8 pin_config_type;\n\tu32 pin_config_value;\n\tu16 pin_table_offset;\n\tu8 res_source_index;\n\tu16 res_source_offset;\n\tu16 vendor_offset;\n\tu16 vendor_length;\n} __attribute__((packed));\n\nstruct aml_resource_pin_group {\n\tu8 descriptor_type;\n\tu16 resource_length;\n\tu8 revision_id;\n\tu16 flags;\n\tu16 pin_table_offset;\n\tu16 label_offset;\n\tu16 vendor_offset;\n\tu16 vendor_length;\n} __attribute__((packed));\n\nstruct aml_resource_pin_group_function {\n\tu8 descriptor_type;\n\tu16 resource_length;\n\tu8 revision_id;\n\tu16 flags;\n\tu16 function_number;\n\tu8 res_source_index;\n\tu16 res_source_offset;\n\tu16 res_source_label_offset;\n\tu16 vendor_offset;\n\tu16 vendor_length;\n} __attribute__((packed));\n\nstruct aml_resource_pin_group_config {\n\tu8 descriptor_type;\n\tu16 resource_length;\n\tu8 revision_id;\n\tu16 flags;\n\tu8 pin_config_type;\n\tu32 pin_config_value;\n\tu8 res_source_index;\n\tu16 res_source_offset;\n\tu16 res_source_label_offset;\n\tu16 vendor_offset;\n\tu16 vendor_length;\n} __attribute__((packed));\n\nstruct aml_resource_clock_input {\n\tu8 descriptor_type;\n\tu16 resource_length;\n\tu8 revision_id;\n\tu16 flags;\n\tu16 frequency_divisor;\n\tu32 frequency_numerator;\n} __attribute__((packed));\n\nstruct aml_resource_address {\n\tu8 descriptor_type;\n\tu16 resource_length;\n\tu8 resource_type;\n\tu8 flags;\n\tu8 specific_flags;\n} __attribute__((packed));\n\nunion aml_resource {\n\tu8 descriptor_type;\n\tstruct aml_resource_small_header small_header;\n\tstruct aml_resource_large_header large_header;\n\tstruct aml_resource_irq irq;\n\tstruct aml_resource_dma dma;\n\tstruct aml_resource_start_dependent start_dpf;\n\tstruct aml_resource_end_dependent end_dpf;\n\tstruct aml_resource_io io;\n\tstruct aml_resource_fixed_io fixed_io;\n\tstruct aml_resource_fixed_dma fixed_dma;\n\tstruct aml_resource_vendor_small vendor_small;\n\tstruct aml_resource_end_tag end_tag;\n\tstruct aml_resource_memory24 memory24;\n\tstruct aml_resource_generic_register generic_reg;\n\tstruct aml_resource_vendor_large vendor_large;\n\tstruct aml_resource_memory32 memory32;\n\tstruct aml_resource_fixed_memory32 fixed_memory32;\n\tstruct aml_resource_address16 address16;\n\tstruct aml_resource_address32 address32;\n\tstruct aml_resource_address64 address64;\n\tstruct aml_resource_extended_address64 ext_address64;\n\tstruct aml_resource_extended_irq extended_irq;\n\tstruct aml_resource_gpio gpio;\n\tstruct aml_resource_i2c_serialbus i2c_serial_bus;\n\tstruct aml_resource_spi_serialbus spi_serial_bus;\n\tstruct aml_resource_uart_serialbus uart_serial_bus;\n\tstruct aml_resource_csi2_serialbus csi2_serial_bus;\n\tstruct aml_resource_common_serialbus common_serial_bus;\n\tstruct aml_resource_pin_function pin_function;\n\tstruct aml_resource_pin_config pin_config;\n\tstruct aml_resource_pin_group pin_group;\n\tstruct aml_resource_pin_group_function pin_group_function;\n\tstruct aml_resource_pin_group_config pin_group_config;\n\tstruct aml_resource_clock_input clock_input;\n\tstruct aml_resource_address address;\n\tu32 dword_item;\n\tu16 word_item;\n\tu8 byte_item;\n};\n\nstruct analog_param_field {\n\tunsigned int even;\n\tunsigned int odd;\n};\n\nstruct analog_param_range {\n\tunsigned int min;\n\tunsigned int typ;\n\tunsigned int max;\n};\n\nstruct analog_parameters {\n\tunsigned int num_lines;\n\tunsigned int line_duration_ns;\n\tstruct analog_param_range hact_ns;\n\tstruct analog_param_range hfp_ns;\n\tstruct analog_param_range hslen_ns;\n\tstruct analog_param_range hbp_ns;\n\tstruct analog_param_range hblk_ns;\n\tunsigned int bt601_hfp;\n\tstruct analog_param_field vfp_lines;\n\tstruct analog_param_field vslen_lines;\n\tstruct analog_param_field vbp_lines;\n};\n\nstruct kobj_uevent_env;\n\nstruct kobj_ns_type_operations;\n\nstruct class {\n\tconst char *name;\n\tconst struct attribute_group **class_groups;\n\tconst struct attribute_group **dev_groups;\n\tint (*dev_uevent)(const struct device *, struct kobj_uevent_env *);\n\tchar * (*devnode)(const struct device *, umode_t *);\n\tvoid (*class_release)(const struct class *);\n\tvoid (*dev_release)(struct device *);\n\tint (*shutdown_pre)(struct device *);\n\tconst struct kobj_ns_type_operations *ns_type;\n\tconst void * (*namespace)(const struct device *);\n\tvoid (*get_ownership)(const struct device *, kuid_t *, kgid_t *);\n\tconst struct dev_pm_ops *pm;\n};\n\nstruct transport_container;\n\nstruct transport_class {\n\tstruct class class;\n\tint (*setup)(struct transport_container *, struct device *, struct device *);\n\tint (*configure)(struct transport_container *, struct device *, struct device *);\n\tint (*remove)(struct transport_container *, struct device *, struct device *);\n};\n\nstruct klist_node;\n\nstruct klist {\n\tspinlock_t k_lock;\n\tstruct list_head k_list;\n\tvoid (*get)(struct klist_node *);\n\tvoid (*put)(struct klist_node *);\n};\n\nstruct attribute_container {\n\tstruct list_head node;\n\tstruct klist containers;\n\tstruct class *class;\n\tconst struct attribute_group *grp;\n\tstruct device_attribute **attrs;\n\tint (*match)(struct attribute_container *, struct device *);\n\tlong unsigned int flags;\n};\n\nstruct anon_transport_class {\n\tstruct transport_class tclass;\n\tstruct attribute_container container;\n};\n\nstruct anon_vma {\n\tstruct anon_vma *root;\n\tstruct rw_semaphore rwsem;\n\tatomic_t refcount;\n\tlong unsigned int num_children;\n\tlong unsigned int num_active_vmas;\n\tstruct anon_vma *parent;\n\tstruct rb_root_cached rb_root;\n};\n\nstruct anon_vma_chain {\n\tstruct vm_area_struct *vma;\n\tstruct anon_vma *anon_vma;\n\tstruct list_head same_vma;\n\tstruct rb_node rb;\n\tlong unsigned int rb_subtree_last;\n};\n\nstruct anon_vma_name {\n\tstruct kref kref;\n\tchar name[0];\n};\n\nstruct apd_private_data;\n\nstruct apd_device_desc {\n\tunsigned int fixed_clk_rate;\n\tstruct property_entry *properties;\n\tint (*setup)(struct apd_private_data *);\n};\n\nstruct clk;\n\nstruct apd_private_data {\n\tstruct clk *clk;\n\tstruct acpi_device *adev;\n\tconst struct apd_device_desc *dev_desc;\n};\n\nstruct apei_exec_ins_type;\n\nstruct apei_exec_context {\n\tu32 ip;\n\tu64 value;\n\tu64 var1;\n\tu64 var2;\n\tu64 src_base;\n\tu64 dst_base;\n\tstruct apei_exec_ins_type *ins_table;\n\tu32 instructions;\n\tstruct acpi_whea_header *action_table;\n\tu32 entries;\n};\n\ntypedef int (*apei_exec_ins_func_t)(struct apei_exec_context *, struct acpi_whea_header *);\n\nstruct apei_exec_ins_type {\n\tu32 flags;\n\tapei_exec_ins_func_t run;\n};\n\nstruct apei_res {\n\tstruct list_head list;\n\tlong unsigned int start;\n\tlong unsigned int end;\n};\n\nstruct apei_resources {\n\tstruct list_head iomem;\n\tstruct list_head ioport;\n};\n\nstruct aper_size_info_16 {\n\tint size;\n\tint num_entries;\n\tint page_order;\n\tu16 size_value;\n};\n\nstruct aper_size_info_32 {\n\tint size;\n\tint num_entries;\n\tint page_order;\n\tu32 size_value;\n};\n\nstruct aper_size_info_8 {\n\tint size;\n\tint num_entries;\n\tint page_order;\n\tu8 size_value;\n};\n\nstruct aper_size_info_fixed {\n\tint size;\n\tint num_entries;\n\tint page_order;\n};\n\nstruct aper_size_info_lvl2 {\n\tint size;\n\tint num_entries;\n\tu32 size_value;\n};\n\nstruct aperfmperf {\n\tseqcount_t seq;\n\tlong unsigned int last_update;\n\tu64 acnt;\n\tu64 mcnt;\n\tu64 aperf;\n\tu64 mperf;\n};\n\nstruct aperture_range {\n\tstruct device *dev;\n\tresource_size_t base;\n\tresource_size_t size;\n\tstruct list_head lh;\n\tvoid (*detach)(struct device *);\n};\n\nstruct api_context {\n\tstruct completion done;\n\tint status;\n};\n\nstruct apic {\n\tvoid (*eoi)(void);\n\tvoid (*native_eoi)(void);\n\tvoid (*write)(u32, u32);\n\tu32 (*read)(u32);\n\tvoid (*wait_icr_idle)(void);\n\tu32 (*safe_wait_icr_idle)(void);\n\tvoid (*send_IPI)(int, int);\n\tvoid (*send_IPI_mask)(const struct cpumask *, int);\n\tvoid (*send_IPI_mask_allbutself)(const struct cpumask *, int);\n\tvoid (*send_IPI_allbutself)(int);\n\tvoid (*send_IPI_all)(int);\n\tvoid (*send_IPI_self)(int);\n\tu32 disable_esr: 1;\n\tu32 dest_mode_logical: 1;\n\tu32 x2apic_set_max_apicid: 1;\n\tu32 nmi_to_offline_cpu: 1;\n\tu32 (*calc_dest_apicid)(unsigned int);\n\tu64 (*icr_read)(void);\n\tvoid (*icr_write)(u32, u32);\n\tu32 max_apic_id;\n\tint (*probe)(void);\n\tint (*acpi_madt_oem_check)(char *, char *);\n\tvoid (*init_apic_ldr)(void);\n\tu32 (*cpu_present_to_apicid)(int);\n\tu32 (*get_apic_id)(u32);\n\tint (*wakeup_secondary_cpu)(u32, long unsigned int);\n\tint (*wakeup_secondary_cpu_64)(u32, long unsigned int);\n\tchar *name;\n};\n\nstruct irq_cfg {\n\tunsigned int dest_apicid;\n\tunsigned int vector;\n};\n\nstruct apic_chip_data {\n\tstruct irq_cfg hw_irq_cfg;\n\tunsigned int vector;\n\tunsigned int prev_vector;\n\tunsigned int cpu;\n\tunsigned int prev_cpu;\n\tunsigned int irq;\n\tstruct hlist_node clist;\n\tunsigned int move_in_progress: 1;\n\tunsigned int is_managed: 1;\n\tunsigned int can_reserve: 1;\n\tunsigned int has_reserved: 1;\n};\n\nunion apic_ir {\n\tlong unsigned int map[4];\n\tu32 regs[8];\n};\n\nstruct apic_override {\n\tvoid (*eoi)(void);\n\tvoid (*native_eoi)(void);\n\tvoid (*write)(u32, u32);\n\tu32 (*read)(u32);\n\tvoid (*send_IPI)(int, int);\n\tvoid (*send_IPI_mask)(const struct cpumask *, int);\n\tvoid (*send_IPI_mask_allbutself)(const struct cpumask *, int);\n\tvoid (*send_IPI_allbutself)(int);\n\tvoid (*send_IPI_all)(int);\n\tvoid (*send_IPI_self)(int);\n\tu64 (*icr_read)(void);\n\tvoid (*icr_write)(u32, u32);\n\tint (*wakeup_secondary_cpu)(u32, long unsigned int);\n\tint (*wakeup_secondary_cpu_64)(u32, long unsigned int);\n};\n\nstruct apm_bios_info {\n\t__u16 version;\n\t__u16 cseg;\n\t__u32 offset;\n\t__u16 cseg_16;\n\t__u16 dseg;\n\t__u16 flags;\n\t__u16 cseg_len;\n\t__u16 cseg_16_len;\n\t__u16 dseg_len;\n};\n\nstruct apparmor_notif_common {\n\t__u16 len;\n\t__u16 version;\n};\n\nstruct apparmor_notif {\n\tstruct apparmor_notif_common base;\n\t__u16 ntype;\n\t__u8 signalled;\n\t__u8 flags;\n\t__u64 id;\n\t__s32 error;\n} __attribute__((packed));\n\nstruct apparmor_notif_filter {\n\tstruct apparmor_notif_common base;\n\t__u32 modeset;\n\t__u32 ns;\n\t__u32 filter;\n\t__u8 data[0];\n};\n\nstruct apparmor_notif_op {\n\tstruct apparmor_notif base;\n\t__u32 allow;\n\t__u32 deny;\n\tpid_t pid;\n\t__u32 label;\n\t__u16 class;\n\t__u16 op;\n};\n\nstruct apparmor_notif_file {\n\tstruct apparmor_notif_op base;\n\tuid_t subj_uid;\n\tuid_t obj_uid;\n\t__u32 name;\n\t__u8 data[0];\n};\n\nstruct apparmor_notif_resp_perm {\n\tstruct apparmor_notif base;\n\t__s32 error;\n\t__u32 allow;\n\t__u32 deny;\n};\n\nstruct apparmor_notif_resp_name {\n\tunion {\n\t\tstruct apparmor_notif base;\n\t\tstruct apparmor_notif_resp_perm perm;\n\t};\n\t__u32 name;\n\t__u8 data[0];\n};\n\nunion apparmor_notif_resp {\n\tstruct apparmor_notif base;\n\tstruct apparmor_notif_resp_perm perm;\n\tstruct apparmor_notif_resp_name name;\n};\n\nunion apparmor_notif_all {\n\tstruct apparmor_notif_common common;\n\tstruct apparmor_notif_filter filter;\n\tstruct apparmor_notif base;\n\tstruct apparmor_notif_op op;\n\tstruct apparmor_notif_file file;\n\tunion apparmor_notif_resp respnse;\n};\n\nstruct workqueue_attrs;\n\nstruct pool_workqueue;\n\nstruct apply_wqattrs_ctx {\n\tstruct workqueue_struct *wq;\n\tstruct workqueue_attrs *attrs;\n\tstruct list_head list;\n\tstruct pool_workqueue *dfl_pwq;\n\tstruct pool_workqueue *pwq_tbl[0];\n};\n\nstruct arch_elf_state {};\n\nstruct arch_hw_breakpoint {\n\tlong unsigned int address;\n\tlong unsigned int mask;\n\tu8 len;\n\tu8 type;\n};\n\nstruct drm_privacy_screen_lookup {\n\tstruct list_head list;\n\tconst char *dev_id;\n\tconst char *con_id;\n\tconst char *provider;\n};\n\nstruct arch_init_data {\n\tstruct drm_privacy_screen_lookup lookup;\n\tbool (*detect)(void);\n};\n\nstruct arch_io_reserve_memtype_wc_devres {\n\tresource_size_t start;\n\tresource_size_t size;\n};\n\nstruct lbr_entry {\n\tu64 from;\n\tu64 to;\n\tu64 info;\n};\n\nstruct arch_lbr_state {\n\tu64 lbr_ctl;\n\tu64 lbr_depth;\n\tu64 ler_from;\n\tu64 ler_to;\n\tu64 ler_info;\n\tstruct lbr_entry entries[0];\n};\n\nstruct arch_mbm_state {\n\tu64 chunks;\n\tu64 prev_msr;\n};\n\nstruct arch_optimized_insn {\n\tkprobe_opcode_t copied_insn[4];\n\tkprobe_opcode_t *insn;\n\tsize_t size;\n};\n\nstruct arch_shared_info {\n\tlong unsigned int max_pfn;\n\txen_pfn_t pfn_to_mfn_frame_list_list;\n\tlong unsigned int nmi_reason;\n\tlong unsigned int p2m_cr3;\n\tlong unsigned int p2m_vaddr;\n\tlong unsigned int p2m_generation;\n};\n\nstruct kprobe;\n\nstruct pt_regs;\n\nstruct arch_specific_insn {\n\tkprobe_opcode_t *insn;\n\tunsigned int boostable: 1;\n\tunsigned char size;\n\tunion {\n\t\tunsigned char opcode;\n\t\tstruct {\n\t\t\tunsigned char type;\n\t\t} jcc;\n\t\tstruct {\n\t\t\tunsigned char type;\n\t\t\tunsigned char asize;\n\t\t} loop;\n\t\tstruct {\n\t\t\tunsigned char reg;\n\t\t} indirect;\n\t};\n\ts32 rel32;\n\tvoid (*emulate_op)(struct kprobe *, struct pt_regs *);\n\tint tp_len;\n};\n\nstruct cpumask {\n\tlong unsigned int bits[128];\n};\n\nstruct arch_tlbflush_unmap_batch {\n\tstruct cpumask cpumask;\n};\n\nstruct uprobe_xol_ops;\n\nstruct arch_uprobe {\n\tunion {\n\t\tu8 insn[16];\n\t\tu8 ixol[16];\n\t};\n\tconst struct uprobe_xol_ops *ops;\n\tunion {\n\t\tstruct {\n\t\t\ts32 offs;\n\t\t\tu8 ilen;\n\t\t\tu8 opc1;\n\t\t} branch;\n\t\tstruct {\n\t\t\tu8 fixups;\n\t\t\tu8 ilen;\n\t\t} defparam;\n\t\tstruct {\n\t\t\tu8 reg_offset;\n\t\t\tu8 ilen;\n\t\t} push;\n\t};\n};\n\nstruct arch_uprobe_task {\n\tlong unsigned int saved_scratch_register;\n\tunsigned int saved_trap_nr;\n\tunsigned int saved_tf;\n};\n\nstruct arch_vcpu_info {\n\tlong unsigned int cr2;\n\tlong unsigned int pad;\n};\n\nstruct arch_vdso_data {};\n\nstruct arg_dev_net_ip {\n\tstruct net *net;\n\tstruct in6_addr *addr;\n};\n\nstruct arg_netdev_event {\n\tconst struct net_device *dev;\n\tunion {\n\t\tunsigned char nh_flags;\n\t\tlong unsigned int event;\n\t};\n};\n\nstruct arphdr {\n\t__be16 ar_hrd;\n\t__be16 ar_pro;\n\tunsigned char ar_hln;\n\tunsigned char ar_pln;\n\t__be16 ar_op;\n};\n\nstruct sockaddr {\n\tsa_family_t sa_family;\n\tunion {\n\t\tchar sa_data_min[14];\n\t\tstruct {\n\t\t\tstruct {} __empty_sa_data;\n\t\t\tchar sa_data[0];\n\t\t};\n\t};\n};\n\nstruct arpreq {\n\tstruct sockaddr arp_pa;\n\tstruct sockaddr arp_ha;\n\tint arp_flags;\n\tstruct sockaddr arp_netmask;\n\tchar arp_dev[16];\n};\n\nstruct trace_array;\n\nstruct trace_array_cpu;\n\nstruct array_buffer {\n\tstruct trace_array *tr;\n\tstruct trace_buffer *buffer;\n\tstruct trace_array_cpu *data;\n\tu64 time_start;\n\tint cpu;\n};\n\nstruct regmap;\n\nstruct as3711 {\n\tstruct device *dev;\n\tstruct regmap *regmap;\n};\n\nstruct as3711_bl_pdata {\n\tbool su1_fb;\n\tint su1_max_uA;\n\tbool su2_fb;\n\tint su2_max_uA;\n\tenum as3711_su2_feedback su2_feedback;\n\tenum as3711_su2_fbprot su2_fbprot;\n\tbool su2_auto_curr1;\n\tbool su2_auto_curr2;\n\tbool su2_auto_curr3;\n};\n\nstruct regulator_init_data;\n\nstruct as3711_regulator_pdata {\n\tstruct regulator_init_data *init_data[12];\n};\n\nstruct as3711_platform_data {\n\tstruct as3711_regulator_pdata regulator;\n\tstruct as3711_bl_pdata backlight;\n};\n\ntypedef int (*asn1_action_t)(void *, size_t, unsigned char, const void *, size_t);\n\nstruct asn1_decoder {\n\tconst unsigned char *machine;\n\tsize_t machlen;\n\tconst asn1_action_t *actions;\n};\n\nstruct assoc_array_ptr;\n\nstruct assoc_array {\n\tstruct assoc_array_ptr *root;\n\tlong unsigned int nr_leaves_on_tree;\n};\n\nstruct assoc_array_node;\n\nstruct assoc_array_delete_collapse_context {\n\tstruct assoc_array_node *node;\n\tconst void *skip_leaf;\n\tint slot;\n};\n\nstruct assoc_array_ops;\n\nstruct assoc_array_edit {\n\tstruct callback_head rcu;\n\tstruct assoc_array *array;\n\tconst struct assoc_array_ops *ops;\n\tconst struct assoc_array_ops *ops_for_excised_subtree;\n\tstruct assoc_array_ptr *leaf;\n\tstruct assoc_array_ptr **leaf_p;\n\tstruct assoc_array_ptr *dead_leaf;\n\tstruct assoc_array_ptr *new_meta[3];\n\tstruct assoc_array_ptr *excised_meta[1];\n\tstruct assoc_array_ptr *excised_subtree;\n\tstruct assoc_array_ptr **set_backpointers[16];\n\tstruct assoc_array_ptr *set_backpointers_to;\n\tstruct assoc_array_node *adjust_count_on;\n\tlong int adjust_count_by;\n\tstruct {\n\t\tstruct assoc_array_ptr **ptr;\n\t\tstruct assoc_array_ptr *to;\n\t} set[2];\n\tstruct {\n\t\tu8 *p;\n\t\tu8 to;\n\t} set_parent_slot[1];\n\tu8 segment_cache[17];\n};\n\nstruct assoc_array_node {\n\tstruct assoc_array_ptr *back_pointer;\n\tu8 parent_slot;\n\tstruct assoc_array_ptr *slots[16];\n\tlong unsigned int nr_leaves_on_branch;\n};\n\nstruct assoc_array_ops {\n\tlong unsigned int (*get_key_chunk)(const void *, int);\n\tlong unsigned int (*get_object_key_chunk)(const void *, int);\n\tbool (*compare_object)(const void *, const void *);\n\tint (*diff_objects)(const void *, const void *);\n\tvoid (*free_object)(void *);\n};\n\nstruct assoc_array_shortcut {\n\tstruct assoc_array_ptr *back_pointer;\n\tint parent_slot;\n\tint skip_to_level;\n\tstruct assoc_array_ptr *next_node;\n\tlong unsigned int index_key[0];\n};\n\nstruct assoc_array_walk_result {\n\tstruct {\n\t\tstruct assoc_array_node *node;\n\t\tint level;\n\t\tint slot;\n\t} terminal_node;\n\tstruct {\n\t\tstruct assoc_array_shortcut *shortcut;\n\t\tint level;\n\t\tint sc_level;\n\t\tlong unsigned int sc_segments;\n\t\tlong unsigned int dissimilarity;\n\t} wrong_shortcut;\n};\n\nstruct asym_cap_data {\n\tstruct list_head link;\n\tstruct callback_head rcu;\n\tlong unsigned int capacity;\n\tlong unsigned int cpus[0];\n};\n\nstruct asymmetric_key_id {\n\tshort unsigned int len;\n\tunsigned char data[0];\n};\n\nstruct asymmetric_key_ids {\n\tvoid *id[3];\n};\n\nstruct key_preparsed_payload;\n\nstruct asymmetric_key_parser {\n\tstruct list_head link;\n\tstruct module *owner;\n\tconst char *name;\n\tint (*parse)(struct key_preparsed_payload *);\n};\n\nstruct key;\n\nstruct kernel_pkey_params;\n\nstruct kernel_pkey_query;\n\nstruct public_key_signature;\n\nstruct asymmetric_key_subtype {\n\tstruct module *owner;\n\tconst char *name;\n\tshort unsigned int name_len;\n\tvoid (*describe)(const struct key *, struct seq_file *);\n\tvoid (*destroy)(void *, void *);\n\tint (*query)(const struct kernel_pkey_params *, struct kernel_pkey_query *);\n\tint (*eds_op)(struct kernel_pkey_params *, const void *, void *);\n\tint (*verify_signature)(const struct key *, const struct public_key_signature *);\n};\n\nstruct usb_dev_state;\n\nstruct pid;\n\nstruct urb;\n\nstruct usb_memory;\n\nstruct async {\n\tstruct list_head asynclist;\n\tstruct usb_dev_state *ps;\n\tstruct pid *pid;\n\tconst struct cred *cred;\n\tunsigned int signr;\n\tunsigned int ifnum;\n\tvoid *userbuffer;\n\tvoid *userurb;\n\tsigval_t userurb_sigval;\n\tstruct urb *urb;\n\tstruct usb_memory *usbm;\n\tunsigned int mem_usage;\n\tint status;\n\tu8 bulk_addr;\n\tu8 bulk_status;\n};\n\nstruct async_domain {\n\tstruct list_head pending;\n\tunsigned int registered: 1;\n};\n\ntypedef void (*async_func_t)(void *, async_cookie_t);\n\nstruct async_entry {\n\tstruct list_head domain_list;\n\tstruct list_head global_list;\n\tstruct work_struct work;\n\tasync_cookie_t cookie;\n\tasync_func_t func;\n\tvoid *data;\n\tstruct async_domain *domain;\n};\n\nstruct io_poll {\n\tstruct file *file;\n\tstruct wait_queue_head *head;\n\t__poll_t events;\n\tint retries;\n\tstruct wait_queue_entry wait;\n};\n\nstruct async_poll {\n\tstruct io_poll poll;\n\tstruct io_poll *double_poll;\n};\n\nstruct async_scan_data {\n\tstruct list_head list;\n\tstruct Scsi_Host *shost;\n\tstruct completion prev_finished;\n};\n\nstruct ata_acpi_drive {\n\tu32 pio;\n\tu32 dma;\n};\n\nstruct ata_acpi_gtf {\n\tu8 tf[7];\n};\n\nstruct ata_acpi_gtm {\n\tstruct ata_acpi_drive drive[2];\n\tu32 flags;\n};\n\nstruct ata_port;\n\nstruct ata_device;\n\nstruct ata_acpi_hotplug_context {\n\tstruct acpi_hotplug_context hp;\n\tunion {\n\t\tstruct ata_port *ap;\n\t\tstruct ata_device *dev;\n\t} data;\n};\n\nstruct ata_blacklist_entry {\n\tconst char *model_num;\n\tconst char *model_rev;\n\tlong unsigned int horkage;\n};\n\nstruct ata_bmdma_prd {\n\t__le32 addr;\n\t__le32 flags_len;\n};\n\nstruct ata_cpr {\n\tu8 num;\n\tu8 num_storage_elements;\n\tu64 start_lba;\n\tu64 num_lbas;\n};\n\nstruct ata_cpr_log {\n\tu8 nr_cpr;\n\tstruct ata_cpr cpr[0];\n};\n\nstruct ata_ering_entry {\n\tunsigned int eflags;\n\tunsigned int err_mask;\n\tu64 timestamp;\n};\n\nstruct ata_ering {\n\tint cursor;\n\tstruct ata_ering_entry ring[32];\n};\n\nstruct ata_link;\n\nstruct scsi_device;\n\nstruct ata_device {\n\tstruct ata_link *link;\n\tunsigned int devno;\n\tunsigned int horkage;\n\tlong unsigned int flags;\n\tstruct scsi_device *sdev;\n\tvoid *private_data;\n\tunion acpi_object *gtf_cache;\n\tunsigned int gtf_filter;\n\tvoid *zpodd;\n\tstruct device tdev;\n\tu64 n_sectors;\n\tu64 n_native_sectors;\n\tunsigned int class;\n\tlong unsigned int unpark_deadline;\n\tu8 pio_mode;\n\tu8 dma_mode;\n\tu8 xfer_mode;\n\tunsigned int xfer_shift;\n\tunsigned int multi_count;\n\tunsigned int max_sectors;\n\tunsigned int cdb_len;\n\tunsigned int pio_mask;\n\tunsigned int mwdma_mask;\n\tunsigned int udma_mask;\n\tu16 cylinders;\n\tu16 heads;\n\tu16 sectors;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tunion {\n\t\tu16 id[256];\n\t\tu32 gscr[128];\n\t};\n\tu8 devslp_timing[8];\n\tu8 ncq_send_recv_cmds[20];\n\tu8 ncq_non_data_cmds[64];\n\tu32 zac_zoned_cap;\n\tu32 zac_zones_optimal_open;\n\tu32 zac_zones_optimal_nonseq;\n\tu32 zac_zones_max_open;\n\tstruct ata_cpr_log *cpr_log;\n\tu8 cdl[512];\n\tint spdn_cnt;\n\tstruct ata_ering ering;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct ata_eh_cmd_timeout_ent {\n\tconst u8 *commands;\n\tconst unsigned int *timeouts;\n};\n\nstruct ata_eh_info {\n\tstruct ata_device *dev;\n\tu32 serror;\n\tunsigned int err_mask;\n\tunsigned int action;\n\tunsigned int dev_action[2];\n\tunsigned int flags;\n\tunsigned int probe_mask;\n\tchar desc[80];\n\tint desc_len;\n};\n\nstruct ata_eh_context {\n\tstruct ata_eh_info i;\n\tint tries[2];\n\tint cmd_timeout_idx[16];\n\tunsigned int classes[2];\n\tunsigned int did_probe_mask;\n\tunsigned int unloaded_mask;\n\tunsigned int saved_ncq_enabled;\n\tu8 saved_xfer_mode[2];\n\tlong unsigned int last_reset;\n};\n\nstruct ata_force_param {\n\tconst char *name;\n\tu8 cbl;\n\tu8 spd_limit;\n\tunsigned int xfer_mask;\n\tunsigned int horkage_on;\n\tunsigned int horkage_off;\n\tu16 lflags_on;\n\tu16 lflags_off;\n};\n\nstruct ata_force_ent {\n\tint port;\n\tint device;\n\tstruct ata_force_param param;\n};\n\nstruct ata_port_operations;\n\nstruct ata_host {\n\tspinlock_t lock;\n\tstruct device *dev;\n\tvoid * const *iomap;\n\tunsigned int n_ports;\n\tunsigned int n_tags;\n\tvoid *private_data;\n\tstruct ata_port_operations *ops;\n\tlong unsigned int flags;\n\tstruct kref kref;\n\tstruct mutex eh_mutex;\n\tstruct task_struct *eh_owner;\n\tstruct ata_port *simplex_claimed;\n\tstruct ata_port *ports[0];\n};\n\nstruct transport_container {\n\tstruct attribute_container ac;\n\tconst struct attribute_group *statistics;\n};\n\nstruct scsi_transport_template {\n\tstruct transport_container host_attrs;\n\tstruct transport_container target_attrs;\n\tstruct transport_container device_attrs;\n\tint (*user_scan)(struct Scsi_Host *, uint, uint, u64);\n\tint device_size;\n\tint device_private_offset;\n\tint target_size;\n\tint target_private_offset;\n\tint host_size;\n\tunsigned int create_work_queue: 1;\n\tvoid (*eh_strategy_handler)(struct Scsi_Host *);\n};\n\nstruct ata_internal {\n\tstruct scsi_transport_template t;\n\tstruct device_attribute private_port_attrs[3];\n\tstruct device_attribute private_link_attrs[3];\n\tstruct device_attribute private_dev_attrs[9];\n\tstruct transport_container link_attr_cont;\n\tstruct transport_container dev_attr_cont;\n\tstruct device_attribute *link_attrs[4];\n\tstruct device_attribute *port_attrs[4];\n\tstruct device_attribute *dev_attrs[10];\n};\n\nstruct ata_ioports {\n\tvoid *cmd_addr;\n\tvoid *data_addr;\n\tvoid *error_addr;\n\tvoid *feature_addr;\n\tvoid *nsect_addr;\n\tvoid *lbal_addr;\n\tvoid *lbam_addr;\n\tvoid *lbah_addr;\n\tvoid *device_addr;\n\tvoid *status_addr;\n\tvoid *command_addr;\n\tvoid *altstatus_addr;\n\tvoid *ctl_addr;\n\tvoid *bmdma_addr;\n\tvoid *scr_addr;\n};\n\nstruct ata_link {\n\tstruct ata_port *ap;\n\tint pmp;\n\tstruct device tdev;\n\tunsigned int active_tag;\n\tu32 sactive;\n\tunsigned int flags;\n\tu32 saved_scontrol;\n\tunsigned int hw_sata_spd_limit;\n\tunsigned int sata_spd_limit;\n\tunsigned int sata_spd;\n\tenum ata_lpm_policy lpm_policy;\n\tstruct ata_eh_info eh_info;\n\tstruct ata_eh_context eh_context;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tstruct ata_device device[2];\n\tlong unsigned int last_lpm_change;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct ata_taskfile {\n\tlong unsigned int flags;\n\tu8 protocol;\n\tu8 ctl;\n\tu8 hob_feature;\n\tu8 hob_nsect;\n\tu8 hob_lbal;\n\tu8 hob_lbam;\n\tu8 hob_lbah;\n\tunion {\n\t\tu8 error;\n\t\tu8 feature;\n\t};\n\tu8 nsect;\n\tu8 lbal;\n\tu8 lbam;\n\tu8 lbah;\n\tu8 device;\n\tunion {\n\t\tu8 status;\n\t\tu8 command;\n\t};\n\tu32 auxiliary;\n};\n\nstruct scatterlist {\n\tlong unsigned int page_link;\n\tunsigned int offset;\n\tunsigned int length;\n\tdma_addr_t dma_address;\n\tunsigned int dma_length;\n\tunsigned int dma_flags;\n};\n\nstruct ata_queued_cmd;\n\ntypedef void (*ata_qc_cb_t)(struct ata_queued_cmd *);\n\nstruct scsi_cmnd;\n\nstruct ata_queued_cmd {\n\tstruct ata_port *ap;\n\tstruct ata_device *dev;\n\tstruct scsi_cmnd *scsicmd;\n\tvoid (*scsidone)(struct scsi_cmnd *);\n\tstruct ata_taskfile tf;\n\tu8 cdb[16];\n\tlong unsigned int flags;\n\tunsigned int tag;\n\tunsigned int hw_tag;\n\tunsigned int n_elem;\n\tunsigned int orig_n_elem;\n\tint dma_dir;\n\tunsigned int sect_size;\n\tunsigned int nbytes;\n\tunsigned int extrabytes;\n\tunsigned int curbytes;\n\tstruct scatterlist sgent;\n\tstruct scatterlist *sg;\n\tstruct scatterlist *cursg;\n\tunsigned int cursg_ofs;\n\tunsigned int err_mask;\n\tstruct ata_taskfile result_tf;\n\tata_qc_cb_t complete_fn;\n\tvoid *private_data;\n\tvoid *lldd_task;\n};\n\nstruct ata_port_stats {\n\tlong unsigned int unhandled_irq;\n\tlong unsigned int idle_irq;\n\tlong unsigned int rw_reqbuf;\n};\n\nstruct ata_port {\n\tstruct Scsi_Host *scsi_host;\n\tstruct ata_port_operations *ops;\n\tspinlock_t *lock;\n\tlong unsigned int flags;\n\tunsigned int pflags;\n\tunsigned int print_id;\n\tunsigned int port_no;\n\tstruct ata_ioports ioaddr;\n\tu8 ctl;\n\tu8 last_ctl;\n\tstruct ata_link *sff_pio_task_link;\n\tstruct delayed_work sff_pio_task;\n\tstruct ata_bmdma_prd *bmdma_prd;\n\tdma_addr_t bmdma_prd_dma;\n\tunsigned int pio_mask;\n\tunsigned int mwdma_mask;\n\tunsigned int udma_mask;\n\tunsigned int cbl;\n\tstruct ata_queued_cmd qcmd[33];\n\tu64 qc_active;\n\tint nr_active_links;\n\tlong: 64;\n\tlong: 64;\n\tstruct ata_link link;\n\tstruct ata_link *slave_link;\n\tint nr_pmp_links;\n\tstruct ata_link *pmp_link;\n\tstruct ata_link *excl_link;\n\tstruct ata_port_stats stats;\n\tstruct ata_host *host;\n\tstruct device *dev;\n\tstruct device tdev;\n\tstruct mutex scsi_scan_mutex;\n\tstruct delayed_work hotplug_task;\n\tstruct delayed_work scsi_rescan_task;\n\tunsigned int hsm_task_state;\n\tstruct list_head eh_done_q;\n\twait_queue_head_t eh_wait_q;\n\tint eh_tries;\n\tstruct completion park_req_pending;\n\tpm_message_t pm_mesg;\n\tenum ata_lpm_policy target_lpm_policy;\n\tstruct timer_list fastdrain_timer;\n\tunsigned int fastdrain_cnt;\n\tasync_cookie_t cookie;\n\tint em_message_type;\n\tvoid *private_data;\n\tstruct ata_acpi_gtm __acpi_init_gtm;\n\tu8 *ncq_sense_buf;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tu8 sector_buf[512];\n};\n\nstruct ata_port_info {\n\tlong unsigned int flags;\n\tlong unsigned int link_flags;\n\tunsigned int pio_mask;\n\tunsigned int mwdma_mask;\n\tunsigned int udma_mask;\n\tstruct ata_port_operations *port_ops;\n\tvoid *private_data;\n};\n\ntypedef int (*ata_prereset_fn_t)(struct ata_link *, long unsigned int);\n\ntypedef int (*ata_reset_fn_t)(struct ata_link *, unsigned int *, long unsigned int);\n\ntypedef void (*ata_postreset_fn_t)(struct ata_link *, unsigned int *);\n\nstruct ata_port_operations {\n\tint (*qc_defer)(struct ata_queued_cmd *);\n\tint (*check_atapi_dma)(struct ata_queued_cmd *);\n\tenum ata_completion_errors (*qc_prep)(struct ata_queued_cmd *);\n\tunsigned int (*qc_issue)(struct ata_queued_cmd *);\n\tvoid (*qc_fill_rtf)(struct ata_queued_cmd *);\n\tvoid (*qc_ncq_fill_rtf)(struct ata_port *, u64);\n\tint (*cable_detect)(struct ata_port *);\n\tunsigned int (*mode_filter)(struct ata_device *, unsigned int);\n\tvoid (*set_piomode)(struct ata_port *, struct ata_device *);\n\tvoid (*set_dmamode)(struct ata_port *, struct ata_device *);\n\tint (*set_mode)(struct ata_link *, struct ata_device **);\n\tunsigned int (*read_id)(struct ata_device *, struct ata_taskfile *, __le16 *);\n\tvoid (*dev_config)(struct ata_device *);\n\tvoid (*freeze)(struct ata_port *);\n\tvoid (*thaw)(struct ata_port *);\n\tata_prereset_fn_t prereset;\n\tata_reset_fn_t softreset;\n\tata_reset_fn_t hardreset;\n\tata_postreset_fn_t postreset;\n\tata_prereset_fn_t pmp_prereset;\n\tata_reset_fn_t pmp_softreset;\n\tata_reset_fn_t pmp_hardreset;\n\tata_postreset_fn_t pmp_postreset;\n\tvoid (*error_handler)(struct ata_port *);\n\tvoid (*lost_interrupt)(struct ata_port *);\n\tvoid (*post_internal_cmd)(struct ata_queued_cmd *);\n\tvoid (*sched_eh)(struct ata_port *);\n\tvoid (*end_eh)(struct ata_port *);\n\tint (*scr_read)(struct ata_link *, unsigned int, u32 *);\n\tint (*scr_write)(struct ata_link *, unsigned int, u32);\n\tvoid (*pmp_attach)(struct ata_port *);\n\tvoid (*pmp_detach)(struct ata_port *);\n\tint (*set_lpm)(struct ata_link *, enum ata_lpm_policy, unsigned int);\n\tint (*port_suspend)(struct ata_port *, pm_message_t);\n\tint (*port_resume)(struct ata_port *);\n\tint (*port_start)(struct ata_port *);\n\tvoid (*port_stop)(struct ata_port *);\n\tvoid (*host_stop)(struct ata_host *);\n\tvoid (*sff_dev_select)(struct ata_port *, unsigned int);\n\tvoid (*sff_set_devctl)(struct ata_port *, u8);\n\tu8 (*sff_check_status)(struct ata_port *);\n\tu8 (*sff_check_altstatus)(struct ata_port *);\n\tvoid (*sff_tf_load)(struct ata_port *, const struct ata_taskfile *);\n\tvoid (*sff_tf_read)(struct ata_port *, struct ata_taskfile *);\n\tvoid (*sff_exec_command)(struct ata_port *, const struct ata_taskfile *);\n\tunsigned int (*sff_data_xfer)(struct ata_queued_cmd *, unsigned char *, unsigned int, int);\n\tvoid (*sff_irq_on)(struct ata_port *);\n\tbool (*sff_irq_check)(struct ata_port *);\n\tvoid (*sff_irq_clear)(struct ata_port *);\n\tvoid (*sff_drain_fifo)(struct ata_queued_cmd *);\n\tvoid (*bmdma_setup)(struct ata_queued_cmd *);\n\tvoid (*bmdma_start)(struct ata_queued_cmd *);\n\tvoid (*bmdma_stop)(struct ata_queued_cmd *);\n\tu8 (*bmdma_status)(struct ata_port *);\n\tssize_t (*em_show)(struct ata_port *, char *);\n\tssize_t (*em_store)(struct ata_port *, const char *, size_t);\n\tssize_t (*sw_activity_show)(struct ata_device *, char *);\n\tssize_t (*sw_activity_store)(struct ata_device *, enum sw_activity);\n\tssize_t (*transmit_led_message)(struct ata_port *, u32, ssize_t);\n\tconst struct ata_port_operations *inherits;\n};\n\nstruct ata_scsi_args {\n\tstruct ata_device *dev;\n\tu16 *id;\n\tstruct scsi_cmnd *cmd;\n};\n\nstruct ata_show_ering_arg {\n\tchar *buf;\n\tint written;\n};\n\nstruct ata_timing {\n\tshort unsigned int mode;\n\tshort unsigned int setup;\n\tshort unsigned int act8b;\n\tshort unsigned int rec8b;\n\tshort unsigned int cyc8b;\n\tshort unsigned int active;\n\tshort unsigned int recover;\n\tshort unsigned int dmack_hold;\n\tshort unsigned int cycle;\n\tshort unsigned int udma;\n};\n\nstruct ata_xfer_ent {\n\tint shift;\n\tint bits;\n\tu8 base;\n};\n\nstruct ps2dev;\n\ntypedef enum ps2_disposition (*ps2_pre_receive_handler_t)(struct ps2dev *, u8, unsigned int);\n\ntypedef void (*ps2_receive_handler_t)(struct ps2dev *, u8);\n\nstruct serio;\n\nstruct ps2dev {\n\tstruct serio *serio;\n\tstruct mutex cmd_mutex;\n\twait_queue_head_t wait;\n\tlong unsigned int flags;\n\tu8 cmdbuf[8];\n\tu8 cmdcnt;\n\tu8 nak;\n\tps2_pre_receive_handler_t pre_receive_handler;\n\tps2_receive_handler_t receive_handler;\n};\n\nstruct vivaldi_data {\n\tu32 function_row_physmap[24];\n\tunsigned int num_function_row_keys;\n};\n\nstruct atkbd {\n\tstruct ps2dev ps2dev;\n\tstruct input_dev *dev;\n\tchar name[64];\n\tchar phys[32];\n\tshort unsigned int id;\n\tshort unsigned int keycode[512];\n\tlong unsigned int force_release_mask[8];\n\tunsigned char set;\n\tbool translated;\n\tbool extra;\n\tbool write;\n\tbool softrepeat;\n\tbool softraw;\n\tbool scroll;\n\tbool enabled;\n\tunsigned char emul;\n\tbool resend;\n\tbool release;\n\tlong unsigned int xl_bit;\n\tunsigned int last;\n\tlong unsigned int time;\n\tlong unsigned int err_count;\n\tstruct delayed_work event_work;\n\tlong unsigned int event_jiffies;\n\tlong unsigned int event_mask;\n\tstruct mutex mutex;\n\tstruct vivaldi_data vdata;\n};\n\nstruct atl_err {\n\tu64 addr;\n\tu64 ipid;\n\tu32 cpu;\n};\n\nstruct atomic_notifier_head {\n\tspinlock_t lock;\n\tstruct notifier_block *head;\n};\n\nstruct attribute_group {\n\tconst char *name;\n\tumode_t (*is_visible)(struct kobject *, struct attribute *, int);\n\tumode_t (*is_bin_visible)(struct kobject *, struct bin_attribute *, int);\n\tstruct attribute **attrs;\n\tstruct bin_attribute **bin_attrs;\n};\n\nstruct audit_aux_data {\n\tstruct audit_aux_data *next;\n\tint type;\n};\n\nstruct audit_cap_data {\n\tkernel_cap_t permitted;\n\tkernel_cap_t inheritable;\n\tunion {\n\t\tunsigned int fE;\n\t\tkernel_cap_t effective;\n\t};\n\tkernel_cap_t ambient;\n\tkuid_t rootid;\n};\n\nstruct audit_aux_data_bprm_fcaps {\n\tstruct audit_aux_data d;\n\tstruct audit_cap_data fcap;\n\tunsigned int fcap_ver;\n\tstruct audit_cap_data old_pcap;\n\tstruct audit_cap_data new_pcap;\n};\n\nstruct lsmblob_selinux {\n\tu32 secid;\n};\n\nstruct smack_known;\n\nstruct lsmblob_smack {\n\tstruct smack_known *skp;\n};\n\nstruct lsmblob_apparmor {\n\tstruct aa_label *label;\n};\n\nstruct lsmblob_bpf {\n\tu32 secid;\n};\n\nstruct lsmblob {\n\tstruct lsmblob_selinux selinux;\n\tstruct lsmblob_smack smack;\n\tstruct lsmblob_apparmor apparmor;\n\tstruct lsmblob_bpf bpf;\n};\n\nstruct audit_aux_data_pids {\n\tstruct audit_aux_data d;\n\tpid_t target_pid[16];\n\tkuid_t target_auid[16];\n\tkuid_t target_uid[16];\n\tunsigned int target_sessionid[16];\n\tstruct lsmblob target_blob[16];\n\tchar target_comm[256];\n\tint pid_count;\n};\n\nstruct timespec64 {\n\ttime64_t tv_sec;\n\tlong int tv_nsec;\n};\n\nstruct audit_stamp {\n\tstruct timespec64 ctime;\n\tunsigned int serial;\n};\n\nstruct audit_context;\n\nstruct audit_buffer {\n\tstruct sk_buff *skb;\n\tstruct sk_buff_head skb_list;\n\tstruct audit_context *ctx;\n\tstruct audit_stamp stamp;\n\tgfp_t gfp_mask;\n};\n\nstruct audit_cache {\n\tstruct aa_profile *profile;\n\tkernel_cap_t caps;\n};\n\nstruct audit_tree;\n\nstruct audit_node {\n\tstruct list_head list;\n\tstruct audit_tree *owner;\n\tunsigned int index;\n};\n\nstruct fsnotify_mark;\n\nstruct audit_chunk {\n\tstruct list_head hash;\n\tlong unsigned int key;\n\tstruct fsnotify_mark *mark;\n\tstruct list_head trees;\n\tint count;\n\tatomic_long_t refs;\n\tstruct callback_head head;\n\tstruct audit_node owners[0];\n};\n\nstruct filename;\n\nstruct audit_names {\n\tstruct list_head list;\n\tstruct filename *name;\n\tint name_len;\n\tbool hidden;\n\tlong unsigned int ino;\n\tdev_t dev;\n\tumode_t mode;\n\tkuid_t uid;\n\tkgid_t gid;\n\tdev_t rdev;\n\tstruct lsmblob oblob;\n\tstruct audit_cap_data fcap;\n\tunsigned int fcap_ver;\n\tunsigned char type;\n\tbool should_free;\n};\n\nstruct mq_attr {\n\t__kernel_long_t mq_flags;\n\t__kernel_long_t mq_maxmsg;\n\t__kernel_long_t mq_msgsize;\n\t__kernel_long_t mq_curmsgs;\n\t__kernel_long_t __reserved[4];\n};\n\nstruct open_how {\n\t__u64 flags;\n\t__u64 mode;\n\t__u64 resolve;\n};\n\nstruct audit_ntp_val {\n\tlong long int oldval;\n\tlong long int newval;\n};\n\nstruct audit_ntp_data {\n\tstruct audit_ntp_val vals[6];\n};\n\nstruct audit_proctitle {\n\tint len;\n\tchar *value;\n};\n\nstruct audit_tree_refs;\n\nstruct audit_context {\n\tint dummy;\n\tenum {\n\t\tAUDIT_CTX_UNUSED = 0,\n\t\tAUDIT_CTX_SYSCALL = 1,\n\t\tAUDIT_CTX_URING = 2,\n\t} context;\n\tenum audit_state state;\n\tenum audit_state current_state;\n\tstruct audit_stamp stamp;\n\tint major;\n\tint uring_op;\n\tlong unsigned int argv[4];\n\tlong int return_code;\n\tu64 prio;\n\tint return_valid;\n\tstruct audit_names preallocated_names[5];\n\tint name_count;\n\tstruct list_head names_list;\n\tchar *filterkey;\n\tstruct path pwd;\n\tstruct audit_aux_data *aux;\n\tstruct audit_aux_data *aux_pids;\n\tstruct __kernel_sockaddr_storage *sockaddr;\n\tsize_t sockaddr_len;\n\tpid_t ppid;\n\tkuid_t uid;\n\tkuid_t euid;\n\tkuid_t suid;\n\tkuid_t fsuid;\n\tkgid_t gid;\n\tkgid_t egid;\n\tkgid_t sgid;\n\tkgid_t fsgid;\n\tlong unsigned int personality;\n\tint arch;\n\tpid_t target_pid;\n\tkuid_t target_auid;\n\tkuid_t target_uid;\n\tunsigned int target_sessionid;\n\tstruct lsmblob target_blob;\n\tchar target_comm[16];\n\tstruct audit_tree_refs *trees;\n\tstruct audit_tree_refs *first_trees;\n\tstruct list_head killed_trees;\n\tint tree_count;\n\tint type;\n\tunion {\n\t\tstruct {\n\t\t\tint nargs;\n\t\t\tlong int args[6];\n\t\t} socketcall;\n\t\tstruct {\n\t\t\tkuid_t uid;\n\t\t\tkgid_t gid;\n\t\t\tumode_t mode;\n\t\t\tstruct lsmblob oblob;\n\t\t\tint has_perm;\n\t\t\tuid_t perm_uid;\n\t\t\tgid_t perm_gid;\n\t\t\tumode_t perm_mode;\n\t\t\tlong unsigned int qbytes;\n\t\t} ipc;\n\t\tstruct {\n\t\t\tmqd_t mqdes;\n\t\t\tstruct mq_attr mqstat;\n\t\t} mq_getsetattr;\n\t\tstruct {\n\t\t\tmqd_t mqdes;\n\t\t\tint sigev_signo;\n\t\t} mq_notify;\n\t\tstruct {\n\t\t\tmqd_t mqdes;\n\t\t\tsize_t msg_len;\n\t\t\tunsigned int msg_prio;\n\t\t\tstruct timespec64 abs_timeout;\n\t\t} mq_sendrecv;\n\t\tstruct {\n\t\t\tint oflag;\n\t\t\tumode_t mode;\n\t\t\tstruct mq_attr attr;\n\t\t} mq_open;\n\t\tstruct {\n\t\t\tpid_t pid;\n\t\t\tstruct audit_cap_data cap;\n\t\t} capset;\n\t\tstruct {\n\t\t\tint fd;\n\t\t\tint flags;\n\t\t} mmap;\n\t\tstruct open_how openat2;\n\t\tstruct {\n\t\t\tint argc;\n\t\t} execve;\n\t\tstruct {\n\t\t\tchar *name;\n\t\t} module;\n\t\tstruct {\n\t\t\tstruct audit_ntp_data ntp_data;\n\t\t\tstruct timespec64 tk_injoffset;\n\t\t} time;\n\t};\n\tint fds[2];\n\tstruct audit_proctitle proctitle;\n};\n\nstruct audit_ctl_mutex {\n\tstruct mutex lock;\n\tvoid *owner;\n};\n\nstruct audit_field;\n\nstruct audit_watch;\n\nstruct audit_fsnotify_mark;\n\nstruct audit_krule {\n\tu32 pflags;\n\tu32 flags;\n\tu32 listnr;\n\tu32 action;\n\tu32 mask[64];\n\tu32 buflen;\n\tu32 field_count;\n\tchar *filterkey;\n\tstruct audit_field *fields;\n\tstruct audit_field *arch_f;\n\tstruct audit_field *inode_f;\n\tstruct audit_watch *watch;\n\tstruct audit_tree *tree;\n\tstruct audit_fsnotify_mark *exe;\n\tstruct list_head rlist;\n\tstruct list_head list;\n\tu64 prio;\n};\n\nstruct audit_entry {\n\tstruct list_head list;\n\tstruct callback_head rcu;\n\tstruct audit_krule rule;\n};\n\nstruct audit_features {\n\t__u32 vers;\n\t__u32 mask;\n\t__u32 features;\n\t__u32 lock;\n};\n\nstruct audit_field {\n\tu32 type;\n\tunion {\n\t\tu32 val;\n\t\tkuid_t uid;\n\t\tkgid_t gid;\n\t\tstruct {\n\t\t\tchar *lsm_str;\n\t\t\tvoid *lsm_rule;\n\t\t};\n\t};\n\tu32 op;\n};\n\nstruct fsnotify_group;\n\nstruct fsnotify_mark_connector;\n\nstruct fsnotify_mark {\n\t__u32 mask;\n\trefcount_t refcnt;\n\tstruct fsnotify_group *group;\n\tstruct list_head g_list;\n\tspinlock_t lock;\n\tstruct hlist_node obj_list;\n\tstruct fsnotify_mark_connector *connector;\n\t__u32 ignore_mask;\n\tunsigned int flags;\n};\n\nstruct audit_fsnotify_mark {\n\tdev_t dev;\n\tlong unsigned int ino;\n\tchar *path;\n\tstruct fsnotify_mark mark;\n\tstruct audit_krule *rule;\n};\n\nstruct audit_net {\n\tstruct sock *sk;\n};\n\nstruct audit_netlink_list {\n\t__u32 portid;\n\tstruct net *net;\n\tstruct sk_buff_head q;\n};\n\nstruct audit_nfcfgop_tab {\n\tenum audit_nfcfgop op;\n\tconst char *s;\n};\n\nstruct audit_parent {\n\tstruct list_head watches;\n\tstruct fsnotify_mark mark;\n};\n\nstruct audit_reply {\n\t__u32 portid;\n\tstruct net *net;\n\tstruct sk_buff *skb;\n};\n\nstruct audit_rule_data {\n\t__u32 flags;\n\t__u32 action;\n\t__u32 field_count;\n\t__u32 mask[64];\n\t__u32 fields[64];\n\t__u32 values[64];\n\t__u32 fieldflags[64];\n\t__u32 buflen;\n\tchar buf[0];\n};\n\nstruct audit_sig_info {\n\tuid_t uid;\n\tpid_t pid;\n\tchar ctx[0];\n};\n\nstruct audit_status {\n\t__u32 mask;\n\t__u32 enabled;\n\t__u32 failure;\n\t__u32 pid;\n\t__u32 rate_limit;\n\t__u32 backlog_limit;\n\t__u32 lost;\n\t__u32 backlog;\n\tunion {\n\t\t__u32 version;\n\t\t__u32 feature_bitmap;\n\t};\n\t__u32 backlog_wait_time;\n\t__u32 backlog_wait_time_actual;\n};\n\nstruct audit_tree {\n\trefcount_t count;\n\tint goner;\n\tstruct audit_chunk *root;\n\tstruct list_head chunks;\n\tstruct list_head rules;\n\tstruct list_head list;\n\tstruct list_head same_root;\n\tstruct callback_head head;\n\tchar pathname[0];\n};\n\nstruct audit_tree_mark {\n\tstruct fsnotify_mark mark;\n\tstruct audit_chunk *chunk;\n};\n\nstruct audit_tree_refs {\n\tstruct audit_tree_refs *next;\n\tstruct audit_chunk *c[31];\n};\n\nstruct audit_tty_status {\n\t__u32 enabled;\n\t__u32 log_passwd;\n};\n\nstruct audit_watch {\n\trefcount_t count;\n\tdev_t dev;\n\tchar *path;\n\tlong unsigned int ino;\n\tstruct audit_parent *parent;\n\tstruct list_head wlist;\n\tstruct list_head rules;\n};\n\nstruct auditd_connection {\n\tstruct pid *pid;\n\tu32 portid;\n\tstruct net *net;\n\tstruct callback_head rcu;\n};\n\nstruct auth_cred {\n\tconst struct cred *cred;\n\tconst char *principal;\n};\n\nstruct auth_ops;\n\nstruct auth_domain {\n\tstruct kref ref;\n\tstruct hlist_node hash;\n\tchar *name;\n\tstruct auth_ops *flavour;\n\tstruct callback_head callback_head;\n};\n\nstruct svc_rqst;\n\nstruct auth_ops {\n\tchar *name;\n\tstruct module *owner;\n\tint flavour;\n\tenum svc_auth_status (*accept)(struct svc_rqst *);\n\tint (*release)(struct svc_rqst *);\n\tvoid (*domain_release)(struct auth_domain *);\n\tenum svc_auth_status (*set_client)(struct svc_rqst *);\n\trpc_authflavor_t (*pseudoflavor)(struct svc_rqst *);\n};\n\nstruct auto_mode_param {\n\tint qp_type;\n};\n\nstruct auto_movable_group_stats {\n\tlong unsigned int movable_pages;\n\tlong unsigned int req_kernel_early_pages;\n};\n\nstruct auto_movable_stats {\n\tlong unsigned int kernel_early_pages;\n\tlong unsigned int movable_pages;\n};\n\nstruct task_group;\n\nstruct autogroup {\n\tstruct kref kref;\n\tstruct task_group *tg;\n\tstruct rw_semaphore lock;\n\tlong unsigned int id;\n\tint nice;\n};\n\nstruct automaton_wwnr {\n\tchar *state_names[2];\n\tchar *event_names[3];\n\tunsigned char function[6];\n\tunsigned char initial_state;\n\tbool final_states[2];\n};\n\nstruct auxiliary_device {\n\tstruct device dev;\n\tconst char *name;\n\tu32 id;\n\tstruct {\n\t\tstruct xarray irqs;\n\t\tstruct mutex lock;\n\t\tbool irq_dir_exists;\n\t} sysfs;\n};\n\nstruct auxiliary_device_id {\n\tchar name[32];\n\tkernel_ulong_t driver_data;\n};\n\nstruct auxiliary_driver {\n\tint (*probe)(struct auxiliary_device *, const struct auxiliary_device_id *);\n\tvoid (*remove)(struct auxiliary_device *);\n\tvoid (*shutdown)(struct auxiliary_device *);\n\tint (*suspend)(struct auxiliary_device *, pm_message_t);\n\tint (*resume)(struct auxiliary_device *);\n\tconst char *name;\n\tstruct device_driver driver;\n\tconst struct auxiliary_device_id *id_table;\n};\n\nstruct auxiliary_irq_info {\n\tstruct device_attribute sysfs_attr;\n\tchar name[11];\n};\n\nstruct av_decision {\n\tu32 allowed;\n\tu32 auditallow;\n\tu32 auditdeny;\n\tu32 seqno;\n\tu32 flags;\n};\n\nstruct hlist_head {\n\tstruct hlist_node *first;\n};\n\nstruct avc_cache {\n\tstruct hlist_head slots[512];\n\tspinlock_t slots_lock[512];\n\tatomic_t lru_hint;\n\tatomic_t active_nodes;\n\tu32 latest_notif;\n};\n\nstruct avc_cache_stats {\n\tunsigned int lookups;\n\tunsigned int misses;\n\tunsigned int allocations;\n\tunsigned int reclaims;\n\tunsigned int frees;\n};\n\nstruct avc_callback_node {\n\tint (*callback)(u32);\n\tu32 events;\n\tstruct avc_callback_node *next;\n};\n\nstruct avc_xperms_node;\n\nstruct avc_entry {\n\tu32 ssid;\n\tu32 tsid;\n\tu16 tclass;\n\tstruct av_decision avd;\n\tstruct avc_xperms_node *xp_node;\n};\n\nstruct avc_node {\n\tstruct avc_entry ae;\n\tstruct hlist_node list;\n\tstruct callback_head rhead;\n};\n\nstruct extended_perms_data;\n\nstruct extended_perms_decision {\n\tu8 used;\n\tu8 driver;\n\tstruct extended_perms_data *allowed;\n\tstruct extended_perms_data *auditallow;\n\tstruct extended_perms_data *dontaudit;\n};\n\nstruct avc_xperms_decision_node {\n\tstruct extended_perms_decision xpd;\n\tstruct list_head xpd_list;\n};\n\nstruct extended_perms_data {\n\tu32 p[8];\n};\n\nstruct extended_perms {\n\tu16 len;\n\tstruct extended_perms_data drivers;\n};\n\nstruct avc_xperms_node {\n\tstruct extended_perms xp;\n\tstruct list_head xpd_head;\n};\n\nstruct avtab_node;\n\nstruct avtab {\n\tstruct avtab_node **htable;\n\tu32 nel;\n\tu32 nslot;\n\tu32 mask;\n};\n\nstruct avtab_extended_perms;\n\nstruct avtab_datum {\n\tunion {\n\t\tu32 data;\n\t\tstruct avtab_extended_perms *xperms;\n\t} u;\n};\n\nstruct avtab_extended_perms {\n\tu8 specified;\n\tu8 driver;\n\tstruct extended_perms_data perms;\n};\n\nstruct avtab_key {\n\tu16 source_type;\n\tu16 target_type;\n\tu16 target_class;\n\tu16 specified;\n};\n\nstruct avtab_node {\n\tstruct avtab_key key;\n\tstruct avtab_datum datum;\n\tstruct avtab_node *next;\n};\n\nstruct regmap_irq_chip_data;\n\nstruct mfd_cell;\n\nstruct regmap_config;\n\nstruct regmap_irq_chip;\n\nstruct axp20x_dev {\n\tstruct device *dev;\n\tint irq;\n\tlong unsigned int irq_flags;\n\tstruct regmap *regmap;\n\tstruct regmap_irq_chip_data *regmap_irqc;\n\tlong int variant;\n\tint nr_cells;\n\tconst struct mfd_cell *cells;\n\tconst struct regmap_config *regmap_cfg;\n\tconst struct regmap_irq_chip *regmap_irq_chip;\n};\n\nstruct backing_aio {\n\tstruct kiocb iocb;\n\trefcount_t ref;\n\tstruct kiocb *orig_iocb;\n\tvoid (*end_write)(struct file *, loff_t, ssize_t);\n\tstruct work_struct work;\n\tlong int res;\n};\n\nstruct percpu_counter {\n\traw_spinlock_t lock;\n\ts64 count;\n\tstruct list_head list;\n\ts32 *counters;\n};\n\nstruct fprop_local_percpu {\n\tstruct percpu_counter events;\n\tunsigned int period;\n\traw_spinlock_t lock;\n};\n\nstruct percpu_ref_data;\n\nstruct percpu_ref {\n\tlong unsigned int percpu_count_ptr;\n\tstruct percpu_ref_data *data;\n};\n\nstruct backing_dev_info;\n\nstruct cgroup_subsys_state;\n\nstruct bdi_writeback {\n\tstruct backing_dev_info *bdi;\n\tlong unsigned int state;\n\tlong unsigned int last_old_flush;\n\tstruct list_head b_dirty;\n\tstruct list_head b_io;\n\tstruct list_head b_more_io;\n\tstruct list_head b_dirty_time;\n\tspinlock_t list_lock;\n\tatomic_t writeback_inodes;\n\tstruct percpu_counter stat[4];\n\tlong unsigned int bw_time_stamp;\n\tlong unsigned int dirtied_stamp;\n\tlong unsigned int written_stamp;\n\tlong unsigned int write_bandwidth;\n\tlong unsigned int avg_write_bandwidth;\n\tlong unsigned int dirty_ratelimit;\n\tlong unsigned int balanced_dirty_ratelimit;\n\tstruct fprop_local_percpu completions;\n\tint dirty_exceeded;\n\tenum wb_reason start_all_reason;\n\tspinlock_t work_lock;\n\tstruct list_head work_list;\n\tstruct delayed_work dwork;\n\tstruct delayed_work bw_dwork;\n\tstruct list_head bdi_node;\n\tstruct percpu_ref refcnt;\n\tstruct fprop_local_percpu memcg_completions;\n\tstruct cgroup_subsys_state *memcg_css;\n\tstruct cgroup_subsys_state *blkcg_css;\n\tstruct list_head memcg_node;\n\tstruct list_head blkcg_node;\n\tstruct list_head b_attached;\n\tstruct list_head offline_node;\n\tunion {\n\t\tstruct work_struct release_work;\n\t\tstruct callback_head rcu;\n\t};\n};\n\nstruct backing_dev_info {\n\tu64 id;\n\tstruct rb_node rb_node;\n\tstruct list_head bdi_list;\n\tlong unsigned int ra_pages;\n\tlong unsigned int io_pages;\n\tstruct kref refcnt;\n\tunsigned int capabilities;\n\tunsigned int min_ratio;\n\tunsigned int max_ratio;\n\tunsigned int max_prop_frac;\n\tatomic_long_t tot_write_bandwidth;\n\tlong unsigned int last_bdp_sleep;\n\tstruct bdi_writeback wb;\n\tstruct list_head wb_list;\n\tstruct xarray cgwb_tree;\n\tstruct mutex cgwb_release_mutex;\n\tstruct rw_semaphore wb_switch_rwsem;\n\twait_queue_head_t wb_waitq;\n\tstruct device *dev;\n\tchar dev_name[64];\n\tstruct device *owner;\n\tstruct timer_list laptop_mode_wb_timer;\n\tstruct dentry *debug_dir;\n};\n\nstruct fown_struct {\n\trwlock_t lock;\n\tstruct pid *pid;\n\tenum pid_type pid_type;\n\tkuid_t uid;\n\tkuid_t euid;\n\tint signum;\n};\n\nstruct file_ra_state {\n\tlong unsigned int start;\n\tunsigned int size;\n\tunsigned int async_size;\n\tunsigned int ra_pages;\n\tunsigned int mmap_miss;\n\tloff_t prev_pos;\n};\n\nstruct file {\n\tunion {\n\t\tstruct callback_head f_task_work;\n\t\tstruct llist_node f_llist;\n\t\tunsigned int f_iocb_flags;\n\t};\n\tspinlock_t f_lock;\n\tfmode_t f_mode;\n\tatomic_long_t f_count;\n\tstruct mutex f_pos_lock;\n\tloff_t f_pos;\n\tunsigned int f_flags;\n\tstruct fown_struct f_owner;\n\tconst struct cred *f_cred;\n\tstruct file_ra_state f_ra;\n\tstruct path f_path;\n\tstruct inode *f_inode;\n\tconst struct file_operations *f_op;\n\tu64 f_version;\n\tvoid *f_security;\n\tvoid *private_data;\n\tstruct hlist_head *f_ep;\n\tstruct address_space *f_mapping;\n\terrseq_t f_wb_err;\n\terrseq_t f_sb_err;\n};\n\nstruct backing_file {\n\tstruct file file;\n\tstruct path user_path;\n};\n\nstruct backing_file_ctx {\n\tconst struct cred *cred;\n\tstruct file *user_file;\n\tvoid (*accessed)(struct file *);\n\tvoid (*end_write)(struct file *, loff_t, ssize_t);\n};\n\nstruct backlight_properties {\n\tint brightness;\n\tint max_brightness;\n\tint power;\n\tenum backlight_type type;\n\tunsigned int state;\n\tenum backlight_scale scale;\n};\n\nstruct backlight_ops;\n\nstruct backlight_device {\n\tstruct backlight_properties props;\n\tstruct mutex update_lock;\n\tstruct mutex ops_lock;\n\tconst struct backlight_ops *ops;\n\tstruct notifier_block fb_notif;\n\tstruct list_head entry;\n\tstruct device dev;\n\tbool fb_bl_on[32];\n\tint use_count;\n};\n\nstruct backlight_ops {\n\tunsigned int options;\n\tint (*update_status)(struct backlight_device *);\n\tint (*get_brightness)(struct backlight_device *);\n\tbool (*controls_device)(struct backlight_device *, struct device *);\n};\n\nstruct bpf_verifier_env;\n\nstruct backtrack_state {\n\tstruct bpf_verifier_env *env;\n\tu32 frame;\n\tu32 reg_masks[8];\n\tu64 stack_masks[8];\n};\n\nstruct badblocks {\n\tstruct device *dev;\n\tint count;\n\tint unacked_exist;\n\tint shift;\n\tu64 *page;\n\tint changed;\n\tseqlock_t lock;\n\tsector_t sector;\n\tsector_t size;\n};\n\nstruct badblocks_context {\n\tsector_t start;\n\tsector_t len;\n\tint ack;\n};\n\nstruct badrange {\n\tstruct list_head list;\n\tspinlock_t lock;\n};\n\nstruct badrange_entry {\n\tu64 start;\n\tu64 length;\n\tstruct list_head list;\n};\n\nstruct balance_callback {\n\tstruct balance_callback *next;\n\tvoid (*func)(struct rq *);\n};\n\nstruct balloon_dev_info {\n\tlong unsigned int isolated_pages;\n\tspinlock_t pages_lock;\n\tstruct list_head pages;\n\tint (*migratepage)(struct balloon_dev_info *, struct page *, struct page *, enum migrate_mode);\n};\n\nstruct balloon_stats {\n\tlong unsigned int current_pages;\n\tlong unsigned int target_pages;\n\tlong unsigned int target_unpopulated;\n\tlong unsigned int balloon_low;\n\tlong unsigned int balloon_high;\n\tlong unsigned int total_pages;\n\tlong unsigned int schedule_delay;\n\tlong unsigned int max_schedule_delay;\n\tlong unsigned int retry_count;\n\tlong unsigned int max_retry_count;\n};\n\nstruct gcry_mpi;\n\ntypedef struct gcry_mpi *MPI;\n\nstruct barrett_ctx_s {\n\tMPI m;\n\tint m_copied;\n\tint k;\n\tMPI y;\n\tMPI r1;\n\tMPI r2;\n\tMPI r3;\n};\n\ntypedef struct barrett_ctx_s *mpi_barrett_t;\n\nstruct batadv_unicast_packet {\n\t__u8 packet_type;\n\t__u8 version;\n\t__u8 ttl;\n\t__u8 ttvn;\n\t__u8 dest[6];\n};\n\nstruct batch_u16 {\n\tu16 entropy[48];\n\tlocal_lock_t lock;\n\tlong unsigned int generation;\n\tunsigned int position;\n};\n\nstruct batch_u32 {\n\tu32 entropy[24];\n\tlocal_lock_t lock;\n\tlong unsigned int generation;\n\tunsigned int position;\n};\n\nstruct batch_u64 {\n\tu64 entropy[12];\n\tlocal_lock_t lock;\n\tlong unsigned int generation;\n\tunsigned int position;\n};\n\nstruct batch_u8 {\n\tu8 entropy[96];\n\tlocal_lock_t lock;\n\tlong unsigned int generation;\n\tunsigned int position;\n};\n\nstruct bd_holder_disk {\n\tstruct list_head list;\n\tstruct kobject *holder_dir;\n\tint refcnt;\n};\n\nstruct gendisk;\n\nstruct request_queue;\n\nstruct disk_stats;\n\nstruct blk_holder_ops;\n\nstruct partition_meta_info;\n\nstruct block_device {\n\tsector_t bd_start_sect;\n\tsector_t bd_nr_sectors;\n\tstruct gendisk *bd_disk;\n\tstruct request_queue *bd_queue;\n\tstruct disk_stats *bd_stats;\n\tlong unsigned int bd_stamp;\n\tatomic_t __bd_flags;\n\tdev_t bd_dev;\n\tstruct address_space *bd_mapping;\n\tatomic_t bd_openers;\n\tspinlock_t bd_size_lock;\n\tvoid *bd_claiming;\n\tvoid *bd_holder;\n\tconst struct blk_holder_ops *bd_holder_ops;\n\tstruct mutex bd_holder_lock;\n\tint bd_holders;\n\tstruct kobject *bd_holder_dir;\n\tatomic_t bd_fsfreeze_count;\n\tstruct mutex bd_fsfreeze_mutex;\n\tstruct partition_meta_info *bd_meta_info;\n\tint bd_writers;\n\tstruct device bd_device;\n};\n\nstruct posix_acl;\n\nstruct inode_operations;\n\nstruct super_block;\n\nstruct file_lock_context;\n\nstruct pipe_inode_info;\n\nstruct cdev;\n\nstruct fscrypt_inode_info;\n\nstruct fsverity_info;\n\nstruct inode {\n\tumode_t i_mode;\n\tshort unsigned int i_opflags;\n\tkuid_t i_uid;\n\tkgid_t i_gid;\n\tunsigned int i_flags;\n\tstruct posix_acl *i_acl;\n\tstruct posix_acl *i_default_acl;\n\tconst struct inode_operations *i_op;\n\tstruct super_block *i_sb;\n\tstruct address_space *i_mapping;\n\tvoid *i_security;\n\tlong unsigned int i_ino;\n\tunion {\n\t\tconst unsigned int i_nlink;\n\t\tunsigned int __i_nlink;\n\t};\n\tdev_t i_rdev;\n\tloff_t i_size;\n\ttime64_t i_atime_sec;\n\ttime64_t i_mtime_sec;\n\ttime64_t i_ctime_sec;\n\tu32 i_atime_nsec;\n\tu32 i_mtime_nsec;\n\tu32 i_ctime_nsec;\n\tu32 i_generation;\n\tspinlock_t i_lock;\n\tshort unsigned int i_bytes;\n\tu8 i_blkbits;\n\tenum rw_hint i_write_hint;\n\tblkcnt_t i_blocks;\n\tlong unsigned int i_state;\n\tstruct rw_semaphore i_rwsem;\n\tlong unsigned int dirtied_when;\n\tlong unsigned int dirtied_time_when;\n\tstruct hlist_node i_hash;\n\tstruct list_head i_io_list;\n\tstruct bdi_writeback *i_wb;\n\tint i_wb_frn_winner;\n\tu16 i_wb_frn_avg_time;\n\tu16 i_wb_frn_history;\n\tstruct list_head i_lru;\n\tstruct list_head i_sb_list;\n\tstruct list_head i_wb_list;\n\tunion {\n\t\tstruct hlist_head i_dentry;\n\t\tstruct callback_head i_rcu;\n\t};\n\tatomic64_t i_version;\n\tatomic64_t i_sequence;\n\tatomic_t i_count;\n\tatomic_t i_dio_count;\n\tatomic_t i_writecount;\n\tatomic_t i_readcount;\n\tunion {\n\t\tconst struct file_operations *i_fop;\n\t\tvoid (*free_inode)(struct inode *);\n\t};\n\tstruct file_lock_context *i_flctx;\n\tstruct address_space i_data;\n\tstruct list_head i_devices;\n\tunion {\n\t\tstruct pipe_inode_info *i_pipe;\n\t\tstruct cdev *i_cdev;\n\t\tchar *i_link;\n\t\tunsigned int i_dir_seq;\n\t};\n\t__u32 i_fsnotify_mask;\n\tstruct fsnotify_mark_connector *i_fsnotify_marks;\n\tstruct fscrypt_inode_info *i_crypt_info;\n\tstruct fsverity_info *i_verity_info;\n\tvoid *i_private;\n};\n\nstruct bdev_inode {\n\tstruct block_device bdev;\n\tstruct inode vfs_inode;\n};\n\nstruct bgl_lock {\n\tspinlock_t lock;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct bgpio_pdata {\n\tconst char *label;\n\tint base;\n\tint ngpio;\n};\n\nstruct bh_accounting {\n\tint nr;\n\tint ratelimit;\n};\n\nstruct bh_lru {\n\tstruct buffer_head *bhs[16];\n};\n\nstruct bictcp {\n\tu32 cnt;\n\tu32 last_max_cwnd;\n\tu32 last_cwnd;\n\tu32 last_time;\n\tu32 bic_origin_point;\n\tu32 bic_K;\n\tu32 delay_min;\n\tu32 epoch_start;\n\tu32 ack_cnt;\n\tu32 tcp_cwnd;\n\tu16 unused;\n\tu8 sample_cnt;\n\tu8 found;\n\tu32 round_start;\n\tu32 end_seq;\n\tu32 last_ack;\n\tu32 curr_rtt;\n};\n\nstruct binfmt_misc {\n\tstruct list_head entries;\n\trwlock_t entries_lock;\n\tbool enabled;\n};\n\nstruct bvec_iter {\n\tsector_t bi_sector;\n\tunsigned int bi_size;\n\tunsigned int bi_idx;\n\tunsigned int bi_bvec_done;\n} __attribute__((packed));\n\nstruct bio;\n\ntypedef void bio_end_io_t(struct bio *);\n\nstruct bio_issue {\n\tu64 value;\n};\n\nstruct bio_vec {\n\tstruct page *bv_page;\n\tunsigned int bv_len;\n\tunsigned int bv_offset;\n};\n\nstruct blkcg_gq;\n\nstruct bio_crypt_ctx;\n\nstruct bio_integrity_payload;\n\nstruct bio_set;\n\nstruct bio {\n\tstruct bio *bi_next;\n\tstruct block_device *bi_bdev;\n\tblk_opf_t bi_opf;\n\tshort unsigned int bi_flags;\n\tshort unsigned int bi_ioprio;\n\tenum rw_hint bi_write_hint;\n\tblk_status_t bi_status;\n\tatomic_t __bi_remaining;\n\tstruct bvec_iter bi_iter;\n\tunion {\n\t\tblk_qc_t bi_cookie;\n\t\tunsigned int __bi_nr_segments;\n\t};\n\tbio_end_io_t *bi_end_io;\n\tvoid *bi_private;\n\tstruct blkcg_gq *bi_blkg;\n\tstruct bio_issue bi_issue;\n\tu64 bi_iocost_cost;\n\tstruct bio_crypt_ctx *bi_crypt_context;\n\tunion {\n\t\tstruct bio_integrity_payload *bi_integrity;\n\t};\n\tshort unsigned int bi_vcnt;\n\tshort unsigned int bi_max_vecs;\n\tatomic_t __bi_cnt;\n\tstruct bio_vec *bi_io_vec;\n\tstruct bio_set *bi_pool;\n\tstruct bio_vec bi_inline_vecs[0];\n};\n\nstruct bio_alloc_cache {\n\tstruct bio *free_list;\n\tstruct bio *free_list_irq;\n\tunsigned int nr;\n\tunsigned int nr_irq;\n};\n\nstruct blk_crypto_key;\n\nstruct bio_crypt_ctx {\n\tconst struct blk_crypto_key *bc_key;\n\tu64 bc_dun[4];\n};\n\nstruct bio_fallback_crypt_ctx {\n\tstruct bio_crypt_ctx crypt_ctx;\n\tstruct bvec_iter crypt_iter;\n\tunion {\n\t\tstruct {\n\t\t\tstruct work_struct work;\n\t\t\tstruct bio *bio;\n\t\t};\n\t\tstruct {\n\t\t\tvoid *bi_private_orig;\n\t\t\tbio_end_io_t *bi_end_io_orig;\n\t\t};\n\t};\n};\n\nstruct bio_integrity_payload {\n\tstruct bio *bip_bio;\n\tstruct bvec_iter bip_iter;\n\tshort unsigned int bip_vcnt;\n\tshort unsigned int bip_max_vcnt;\n\tshort unsigned int bip_flags;\n\tint: 0;\n\tstruct bvec_iter bio_iter;\n\tstruct work_struct bip_work;\n\tstruct bio_vec *bip_vec;\n\tstruct bio_vec bip_inline_vecs[0];\n};\n\nstruct bio_list {\n\tstruct bio *head;\n\tstruct bio *tail;\n};\n\nstruct iovec {\n\tvoid *iov_base;\n\t__kernel_size_t iov_len;\n};\n\nstruct kvec;\n\nstruct iov_iter {\n\tu8 iter_type;\n\tbool nofault;\n\tbool data_source;\n\tsize_t iov_offset;\n\tunion {\n\t\tstruct iovec __ubuf_iovec;\n\t\tstruct {\n\t\t\tunion {\n\t\t\t\tconst struct iovec *__iov;\n\t\t\t\tconst struct kvec *kvec;\n\t\t\t\tconst struct bio_vec *bvec;\n\t\t\t\tstruct xarray *xarray;\n\t\t\t\tvoid *ubuf;\n\t\t\t};\n\t\t\tsize_t count;\n\t\t};\n\t};\n\tunion {\n\t\tlong unsigned int nr_segs;\n\t\tloff_t xarray_start;\n\t};\n};\n\nstruct bio_map_data {\n\tbool is_our_pages: 1;\n\tbool is_null_mapped: 1;\n\tstruct iov_iter iter;\n\tstruct iovec iov[0];\n};\n\nstruct bio_post_read_ctx {\n\tstruct bio *bio;\n\tstruct work_struct work;\n\tunsigned int cur_step;\n\tunsigned int enabled_steps;\n};\n\ntypedef void *mempool_alloc_t(gfp_t, void *);\n\ntypedef void mempool_free_t(void *, void *);\n\nstruct mempool_s {\n\tspinlock_t lock;\n\tint min_nr;\n\tint curr_nr;\n\tvoid **elements;\n\tvoid *pool_data;\n\tmempool_alloc_t *alloc;\n\tmempool_free_t *free;\n\twait_queue_head_t wait;\n};\n\ntypedef struct mempool_s mempool_t;\n\nstruct kmem_cache;\n\nstruct bio_set {\n\tstruct kmem_cache *bio_slab;\n\tunsigned int front_pad;\n\tstruct bio_alloc_cache *cache;\n\tmempool_t bio_pool;\n\tmempool_t bvec_pool;\n\tmempool_t bio_integrity_pool;\n\tmempool_t bvec_integrity_pool;\n\tunsigned int back_pad;\n\tspinlock_t rescue_lock;\n\tstruct bio_list rescue_list;\n\tstruct work_struct rescue_work;\n\tstruct workqueue_struct *rescue_workqueue;\n\tstruct hlist_node cpuhp_dead;\n};\n\nstruct bio_slab {\n\tstruct kmem_cache *slab;\n\tunsigned int slab_ref;\n\tunsigned int slab_size;\n\tchar name[8];\n};\n\nstruct biovec_slab {\n\tint nr_vecs;\n\tchar *name;\n\tstruct kmem_cache *slab;\n};\n\nstruct bitmap_page;\n\nstruct bitmap_counts {\n\tspinlock_t lock;\n\tstruct bitmap_page *bp;\n\tlong unsigned int pages;\n\tlong unsigned int missing_pages;\n\tlong unsigned int chunkshift;\n\tlong unsigned int chunks;\n};\n\nstruct bitmap_storage {\n\tstruct file *file;\n\tstruct page *sb_page;\n\tlong unsigned int sb_index;\n\tstruct page **filemap;\n\tlong unsigned int *filemap_attr;\n\tlong unsigned int file_pages;\n\tlong unsigned int bytes;\n};\n\nstruct mddev;\n\nstruct bitmap {\n\tstruct bitmap_counts counts;\n\tstruct mddev *mddev;\n\t__u64 events_cleared;\n\tint need_sync;\n\tstruct bitmap_storage storage;\n\tlong unsigned int flags;\n\tint allclean;\n\tatomic_t behind_writes;\n\tlong unsigned int behind_writes_used;\n\tlong unsigned int daemon_lastrun;\n\tlong unsigned int last_end_sync;\n\tatomic_t pending_writes;\n\twait_queue_head_t write_wait;\n\twait_queue_head_t overflow_wait;\n\twait_queue_head_t behind_wait;\n\tstruct kernfs_node *sysfs_can_clear;\n\tint cluster_slot;\n};\n\nstruct bitmap_page {\n\tchar *map;\n\tunsigned int hijacked: 1;\n\tunsigned int pending: 1;\n\tunsigned int count: 30;\n};\n\nstruct bitmap_super_s {\n\t__le32 magic;\n\t__le32 version;\n\t__u8 uuid[16];\n\t__le64 events;\n\t__le64 events_cleared;\n\t__le64 sync_size;\n\t__le32 state;\n\t__le32 chunksize;\n\t__le32 daemon_sleep;\n\t__le32 write_behind;\n\t__le32 sectors_reserved;\n\t__le32 nodes;\n\t__u8 cluster_name[64];\n\t__u8 pad[120];\n};\n\ntypedef struct bitmap_super_s bitmap_super_t;\n\nstruct bitmap_unplug_work {\n\tstruct work_struct work;\n\tstruct bitmap *bitmap;\n\tstruct completion *done;\n};\n\nstruct blacklist_entry {\n\tstruct list_head next;\n\tchar *buf;\n};\n\nstruct blake2s_state {\n\tu32 h[8];\n\tu32 t[2];\n\tu32 f[2];\n\tu8 buf[64];\n\tunsigned int buflen;\n\tunsigned int outlen;\n};\n\nstruct blk_crypto_profile;\n\nstruct blk_crypto_attr {\n\tstruct attribute attr;\n\tssize_t (*show)(struct blk_crypto_profile *, struct blk_crypto_attr *, char *);\n};\n\nstruct blk_crypto_config {\n\tenum blk_crypto_mode_num crypto_mode;\n\tunsigned int data_unit_size;\n\tunsigned int dun_bytes;\n};\n\nstruct crypto_skcipher;\n\nstruct blk_crypto_fallback_keyslot {\n\tenum blk_crypto_mode_num crypto_mode;\n\tstruct crypto_skcipher *tfms[5];\n};\n\nunion blk_crypto_iv {\n\t__le64 dun[4];\n\tu8 bytes[32];\n};\n\nstruct blk_crypto_key {\n\tstruct blk_crypto_config crypto_cfg;\n\tunsigned int data_unit_size_bits;\n\tunsigned int size;\n\tu8 raw[64];\n};\n\nstruct blk_crypto_keyslot {\n\tatomic_t slot_refs;\n\tstruct list_head idle_slot_node;\n\tstruct hlist_node hash_node;\n\tconst struct blk_crypto_key *key;\n\tstruct blk_crypto_profile *profile;\n};\n\nstruct blk_crypto_kobj {\n\tstruct kobject kobj;\n\tstruct blk_crypto_profile *profile;\n};\n\nstruct blk_crypto_ll_ops {\n\tint (*keyslot_program)(struct blk_crypto_profile *, const struct blk_crypto_key *, unsigned int);\n\tint (*keyslot_evict)(struct blk_crypto_profile *, const struct blk_crypto_key *, unsigned int);\n};\n\nstruct blk_crypto_mode {\n\tconst char *name;\n\tconst char *cipher_str;\n\tunsigned int keysize;\n\tunsigned int ivsize;\n};\n\nstruct blk_crypto_profile {\n\tstruct blk_crypto_ll_ops ll_ops;\n\tunsigned int max_dun_bytes_supported;\n\tunsigned int modes_supported[5];\n\tstruct device *dev;\n\tunsigned int num_slots;\n\tstruct rw_semaphore lock;\n\tstruct lock_class_key lockdep_key;\n\twait_queue_head_t idle_slots_wait_queue;\n\tstruct list_head idle_slots;\n\tspinlock_t idle_slots_lock;\n\tstruct hlist_head *slot_hashtable;\n\tunsigned int log_slot_ht_size;\n\tstruct blk_crypto_keyslot *slots;\n};\n\nstruct blk_expired_data {\n\tbool has_timedout_rq;\n\tlong unsigned int next;\n\tlong unsigned int timeout_start;\n};\n\nstruct request;\n\nstruct blk_flush_queue {\n\tspinlock_t mq_flush_lock;\n\tunsigned int flush_pending_idx: 1;\n\tunsigned int flush_running_idx: 1;\n\tblk_status_t rq_status;\n\tlong unsigned int flush_pending_since;\n\tstruct list_head flush_queue[2];\n\tlong unsigned int flush_data_in_flight;\n\tstruct request *flush_rq;\n};\n\nstruct blk_holder_ops {\n\tvoid (*mark_dead)(struct block_device *, bool);\n\tvoid (*sync)(struct block_device *);\n\tint (*freeze)(struct block_device *);\n\tint (*thaw)(struct block_device *);\n};\n\nstruct blk_independent_access_range;\n\nstruct blk_ia_range_sysfs_entry {\n\tstruct attribute attr;\n\tssize_t (*show)(struct blk_independent_access_range *, char *);\n};\n\nstruct blk_independent_access_range {\n\tstruct kobject kobj;\n\tsector_t sector;\n\tsector_t nr_sectors;\n};\n\nstruct blk_independent_access_ranges {\n\tstruct kobject kobj;\n\tbool sysfs_registered;\n\tunsigned int nr_ia_ranges;\n\tstruct blk_independent_access_range ia_range[0];\n};\n\nstruct blk_integrity {\n\tunsigned char flags;\n\tenum blk_integrity_checksum csum_type;\n\tunsigned char tuple_size;\n\tunsigned char pi_offset;\n\tunsigned char interval_exp;\n\tunsigned char tag_size;\n};\n\nstruct blk_integrity_iter {\n\tvoid *prot_buf;\n\tvoid *data_buf;\n\tsector_t seed;\n\tunsigned int data_size;\n\tshort unsigned int interval;\n\tconst char *disk_name;\n};\n\nstruct blk_io_trace {\n\t__u32 magic;\n\t__u32 sequence;\n\t__u64 time;\n\t__u64 sector;\n\t__u32 bytes;\n\t__u32 action;\n\t__u32 pid;\n\t__u32 device;\n\t__u32 cpu;\n\t__u16 error;\n\t__u16 pdu_len;\n};\n\nstruct blk_io_trace_remap {\n\t__be32 device_from;\n\t__be32 device_to;\n\t__be64 sector_from;\n};\n\nstruct blk_major_name {\n\tstruct blk_major_name *next;\n\tint major;\n\tchar name[16];\n\tvoid (*probe)(dev_t);\n};\n\nstruct blk_mq_ctx;\n\nstruct blk_mq_hw_ctx;\n\nstruct blk_mq_alloc_data {\n\tstruct request_queue *q;\n\tblk_mq_req_flags_t flags;\n\tunsigned int shallow_depth;\n\tblk_opf_t cmd_flags;\n\treq_flags_t rq_flags;\n\tunsigned int nr_tags;\n\tstruct request **cached_rq;\n\tstruct blk_mq_ctx *ctx;\n\tstruct blk_mq_hw_ctx *hctx;\n};\n\nstruct blk_mq_ctxs;\n\nstruct blk_mq_ctx {\n\tstruct {\n\t\tspinlock_t lock;\n\t\tstruct list_head rq_lists[3];\n\t\tlong: 64;\n\t};\n\tunsigned int cpu;\n\tshort unsigned int index_hw[3];\n\tstruct blk_mq_hw_ctx *hctxs[3];\n\tstruct request_queue *queue;\n\tstruct blk_mq_ctxs *ctxs;\n\tstruct kobject kobj;\n\tlong: 64;\n};\n\nstruct blk_mq_ctxs {\n\tstruct kobject kobj;\n\tstruct blk_mq_ctx *queue_ctx;\n};\n\nstruct seq_operations;\n\nstruct blk_mq_debugfs_attr {\n\tconst char *name;\n\tumode_t mode;\n\tint (*show)(void *, struct seq_file *);\n\tssize_t (*write)(void *, const char *, size_t, loff_t *);\n\tconst struct seq_operations *seq_ops;\n};\n\nstruct sbitmap_word;\n\nstruct sbitmap {\n\tunsigned int depth;\n\tunsigned int shift;\n\tunsigned int map_nr;\n\tbool round_robin;\n\tstruct sbitmap_word *map;\n\tunsigned int *alloc_hint;\n};\n\ntypedef struct wait_queue_entry wait_queue_entry_t;\n\nstruct blk_mq_hw_ctx {\n\tstruct {\n\t\tspinlock_t lock;\n\t\tstruct list_head dispatch;\n\t\tlong unsigned int state;\n\t\tlong: 64;\n\t\tlong: 64;\n\t\tlong: 64;\n\t\tlong: 64;\n\t};\n\tstruct delayed_work run_work;\n\tcpumask_var_t cpumask;\n\tint next_cpu;\n\tint next_cpu_batch;\n\tlong unsigned int flags;\n\tvoid *sched_data;\n\tstruct request_queue *queue;\n\tstruct blk_flush_queue *fq;\n\tvoid *driver_data;\n\tstruct sbitmap ctx_map;\n\tstruct blk_mq_ctx *dispatch_from;\n\tunsigned int dispatch_busy;\n\tshort unsigned int type;\n\tshort unsigned int nr_ctx;\n\tstruct blk_mq_ctx **ctxs;\n\tspinlock_t dispatch_wait_lock;\n\twait_queue_entry_t dispatch_wait;\n\tatomic_t wait_index;\n\tstruct blk_mq_tags *tags;\n\tstruct blk_mq_tags *sched_tags;\n\tunsigned int numa_node;\n\tunsigned int queue_num;\n\tatomic_t nr_active;\n\tstruct hlist_node cpuhp_online;\n\tstruct hlist_node cpuhp_dead;\n\tstruct kobject kobj;\n\tstruct dentry *debugfs_dir;\n\tstruct dentry *sched_debugfs_dir;\n\tstruct list_head hctx_list;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct blk_mq_hw_ctx_sysfs_entry {\n\tstruct attribute attr;\n\tssize_t (*show)(struct blk_mq_hw_ctx *, char *);\n};\n\nstruct blk_mq_queue_data;\n\nstruct io_comp_batch;\n\nstruct blk_mq_ops {\n\tblk_status_t (*queue_rq)(struct blk_mq_hw_ctx *, const struct blk_mq_queue_data *);\n\tvoid (*commit_rqs)(struct blk_mq_hw_ctx *);\n\tvoid (*queue_rqs)(struct request **);\n\tint (*get_budget)(struct request_queue *);\n\tvoid (*put_budget)(struct request_queue *, int);\n\tvoid (*set_rq_budget_token)(struct request *, int);\n\tint (*get_rq_budget_token)(struct request *);\n\tenum blk_eh_timer_return (*timeout)(struct request *);\n\tint (*poll)(struct blk_mq_hw_ctx *, struct io_comp_batch *);\n\tvoid (*complete)(struct request *);\n\tint (*init_hctx)(struct blk_mq_hw_ctx *, void *, unsigned int);\n\tvoid (*exit_hctx)(struct blk_mq_hw_ctx *, unsigned int);\n\tint (*init_request)(struct blk_mq_tag_set *, struct request *, unsigned int, unsigned int);\n\tvoid (*exit_request)(struct blk_mq_tag_set *, struct request *, unsigned int);\n\tvoid (*cleanup_rq)(struct request *);\n\tbool (*busy)(struct request_queue *);\n\tvoid (*map_queues)(struct blk_mq_tag_set *);\n\tvoid (*show_rq)(struct seq_file *, struct request *);\n};\n\nstruct elevator_type;\n\nstruct blk_mq_qe_pair {\n\tstruct list_head node;\n\tstruct request_queue *q;\n\tstruct elevator_type *type;\n};\n\nstruct blk_mq_queue_data {\n\tstruct request *rq;\n\tbool last;\n};\n\nstruct sbq_wait_state;\n\nstruct sbitmap_queue {\n\tstruct sbitmap sb;\n\tunsigned int wake_batch;\n\tatomic_t wake_index;\n\tstruct sbq_wait_state *ws;\n\tatomic_t ws_active;\n\tunsigned int min_shallow_depth;\n\tatomic_t completion_cnt;\n\tatomic_t wakeup_cnt;\n};\n\nstruct blk_mq_tags {\n\tunsigned int nr_tags;\n\tunsigned int nr_reserved_tags;\n\tunsigned int active_queues;\n\tstruct sbitmap_queue bitmap_tags;\n\tstruct sbitmap_queue breserved_tags;\n\tstruct request **rqs;\n\tstruct request **static_rqs;\n\tstruct list_head page_list;\n\tspinlock_t lock;\n};\n\nstruct blk_plug {\n\tstruct request *mq_list;\n\tstruct request *cached_rq;\n\tu64 cur_ktime;\n\tshort unsigned int nr_ios;\n\tshort unsigned int rq_count;\n\tbool multiple_queues;\n\tbool has_elevator;\n\tstruct list_head cb_list;\n};\n\nstruct blk_plug_cb;\n\ntypedef void (*blk_plug_cb_fn)(struct blk_plug_cb *, bool);\n\nstruct blk_plug_cb {\n\tstruct list_head list;\n\tblk_plug_cb_fn callback;\n\tvoid *data;\n};\n\nstruct blk_queue_stats {\n\tstruct list_head callbacks;\n\tspinlock_t lock;\n\tint accounting;\n};\n\nstruct blk_revalidate_zone_args {\n\tstruct gendisk *disk;\n\tlong unsigned int *conv_zones_bitmap;\n\tunsigned int nr_zones;\n\tunsigned int zone_capacity;\n\tunsigned int last_zone_capacity;\n\tsector_t sector;\n};\n\nstruct blk_rq_stat {\n\tu64 mean;\n\tu64 min;\n\tu64 max;\n\tu32 nr_samples;\n\tu64 batch;\n};\n\nstruct blk_rq_wait {\n\tstruct completion done;\n\tblk_status_t ret;\n};\n\nstruct blkif_request_segment {\n\tgrant_ref_t gref;\n\tuint8_t first_sect;\n\tuint8_t last_sect;\n};\n\nstruct blkif_request_rw {\n\tuint8_t nr_segments;\n\tblkif_vdev_t handle;\n\tuint32_t _pad1;\n\tuint64_t id;\n\tblkif_sector_t sector_number;\n\tstruct blkif_request_segment seg[11];\n} __attribute__((packed));\n\nstruct blkif_request_discard {\n\tuint8_t flag;\n\tblkif_vdev_t _pad1;\n\tuint32_t _pad2;\n\tuint64_t id;\n\tblkif_sector_t sector_number;\n\tuint64_t nr_sectors;\n\tuint8_t _pad3;\n} __attribute__((packed));\n\nstruct blkif_request_other {\n\tuint8_t _pad1;\n\tblkif_vdev_t _pad2;\n\tuint32_t _pad3;\n\tuint64_t id;\n} __attribute__((packed));\n\nstruct blkif_request_indirect {\n\tuint8_t indirect_op;\n\tuint16_t nr_segments;\n\tuint32_t _pad1;\n\tuint64_t id;\n\tblkif_sector_t sector_number;\n\tblkif_vdev_t handle;\n\tuint16_t _pad2;\n\tgrant_ref_t indirect_grefs[8];\n\tuint32_t _pad3;\n} __attribute__((packed));\n\nstruct blkif_request {\n\tuint8_t operation;\n\tunion {\n\t\tstruct blkif_request_rw rw;\n\t\tstruct blkif_request_discard discard;\n\t\tstruct blkif_request_other other;\n\t\tstruct blkif_request_indirect indirect;\n\t} u;\n};\n\nstruct grant;\n\nstruct blk_shadow {\n\tstruct blkif_request req;\n\tstruct request *request;\n\tstruct grant **grants_used;\n\tstruct grant **indirect_grants;\n\tstruct scatterlist *sg;\n\tunsigned int num_sg;\n\tenum blk_req_status status;\n\tlong unsigned int associated_id;\n};\n\nstruct blk_stat_callback {\n\tstruct list_head list;\n\tstruct timer_list timer;\n\tstruct blk_rq_stat *cpu_stat;\n\tint (*bucket_fn)(const struct request *);\n\tunsigned int buckets;\n\tstruct blk_rq_stat *stat;\n\tvoid (*timer_fn)(struct blk_stat_callback *);\n\tvoid *data;\n\tstruct callback_head rcu;\n};\n\nstruct rchan;\n\nstruct blk_trace {\n\tint trace_state;\n\tstruct rchan *rchan;\n\tlong unsigned int *sequence;\n\tunsigned char *msg_data;\n\tu16 act_mask;\n\tu64 start_lba;\n\tu64 end_lba;\n\tu32 pid;\n\tu32 dev;\n\tstruct dentry *dir;\n\tstruct list_head running_list;\n\tatomic_t dropped;\n};\n\nstruct blk_user_trace_setup {\n\tchar name[32];\n\t__u16 act_mask;\n\t__u32 buf_size;\n\t__u32 buf_nr;\n\t__u64 start_lba;\n\t__u64 end_lba;\n\t__u32 pid;\n};\n\nstruct blk_zone {\n\t__u64 start;\n\t__u64 len;\n\t__u64 wp;\n\t__u8 type;\n\t__u8 cond;\n\t__u8 non_seq;\n\t__u8 reset;\n\t__u8 resv[4];\n\t__u64 capacity;\n\t__u8 reserved[24];\n};\n\nstruct blk_zone_range {\n\t__u64 sector;\n\t__u64 nr_sectors;\n};\n\nstruct blk_zone_report {\n\t__u64 sector;\n\t__u32 nr_zones;\n\t__u32 flags;\n\tstruct blk_zone zones[0];\n};\n\nstruct blk_zone_wplug {\n\tstruct hlist_node node;\n\trefcount_t ref;\n\tspinlock_t lock;\n\tunsigned int flags;\n\tunsigned int zone_no;\n\tunsigned int wp_offset;\n\tstruct bio_list bio_list;\n\tstruct work_struct bio_work;\n\tstruct callback_head callback_head;\n\tstruct gendisk *disk;\n};\n\nstruct cgroup_subsys;\n\nstruct cgroup_subsys_state {\n\tstruct cgroup *cgroup;\n\tstruct cgroup_subsys *ss;\n\tstruct percpu_ref refcnt;\n\tstruct list_head sibling;\n\tstruct list_head children;\n\tstruct list_head rstat_css_node;\n\tint id;\n\tunsigned int flags;\n\tu64 serial_nr;\n\tatomic_t online_cnt;\n\tstruct work_struct destroy_work;\n\tstruct rcu_work destroy_rwork;\n\tstruct cgroup_subsys_state *parent;\n};\n\nstruct blkcg_policy_data;\n\nstruct blkcg {\n\tstruct cgroup_subsys_state css;\n\tspinlock_t lock;\n\trefcount_t online_pin;\n\tatomic_t congestion_count;\n\tstruct xarray blkg_tree;\n\tstruct blkcg_gq *blkg_hint;\n\tstruct hlist_head blkg_list;\n\tstruct blkcg_policy_data *cpd[6];\n\tstruct list_head all_blkcgs_node;\n\tstruct llist_head *lhead;\n\tchar fc_app_id[129];\n\tstruct list_head cgwb_list;\n};\n\nstruct blkg_iostat {\n\tu64 bytes[3];\n\tu64 ios[3];\n};\n\nstruct blkg_iostat_set {\n\tstruct u64_stats_sync sync;\n\tstruct blkcg_gq *blkg;\n\tstruct llist_node lnode;\n\tint lqueued;\n\tstruct blkg_iostat cur;\n\tstruct blkg_iostat last;\n};\n\nstruct blkg_policy_data;\n\nstruct blkcg_gq {\n\tstruct request_queue *q;\n\tstruct list_head q_node;\n\tstruct hlist_node blkcg_node;\n\tstruct blkcg *blkcg;\n\tstruct blkcg_gq *parent;\n\tstruct percpu_ref refcnt;\n\tbool online;\n\tstruct blkg_iostat_set *iostat_cpu;\n\tstruct blkg_iostat_set iostat;\n\tstruct blkg_policy_data *pd[6];\n\tspinlock_t async_bio_lock;\n\tstruct bio_list async_bios;\n\tunion {\n\t\tstruct work_struct async_bio_work;\n\t\tstruct work_struct free_work;\n\t};\n\tatomic_t use_delay;\n\tatomic64_t delay_nsec;\n\tatomic64_t delay_start;\n\tu64 last_delay;\n\tint last_use;\n\tstruct callback_head callback_head;\n};\n\ntypedef struct blkcg_policy_data *blkcg_pol_alloc_cpd_fn(gfp_t);\n\ntypedef void blkcg_pol_free_cpd_fn(struct blkcg_policy_data *);\n\ntypedef struct blkg_policy_data *blkcg_pol_alloc_pd_fn(struct gendisk *, struct blkcg *, gfp_t);\n\ntypedef void blkcg_pol_init_pd_fn(struct blkg_policy_data *);\n\ntypedef void blkcg_pol_online_pd_fn(struct blkg_policy_data *);\n\ntypedef void blkcg_pol_offline_pd_fn(struct blkg_policy_data *);\n\ntypedef void blkcg_pol_free_pd_fn(struct blkg_policy_data *);\n\ntypedef void blkcg_pol_reset_pd_stats_fn(struct blkg_policy_data *);\n\ntypedef void blkcg_pol_stat_pd_fn(struct blkg_policy_data *, struct seq_file *);\n\nstruct cftype;\n\nstruct blkcg_policy {\n\tint plid;\n\tstruct cftype *dfl_cftypes;\n\tstruct cftype *legacy_cftypes;\n\tblkcg_pol_alloc_cpd_fn *cpd_alloc_fn;\n\tblkcg_pol_free_cpd_fn *cpd_free_fn;\n\tblkcg_pol_alloc_pd_fn *pd_alloc_fn;\n\tblkcg_pol_init_pd_fn *pd_init_fn;\n\tblkcg_pol_online_pd_fn *pd_online_fn;\n\tblkcg_pol_offline_pd_fn *pd_offline_fn;\n\tblkcg_pol_free_pd_fn *pd_free_fn;\n\tblkcg_pol_reset_pd_stats_fn *pd_reset_stats_fn;\n\tblkcg_pol_stat_pd_fn *pd_stat_fn;\n};\n\nstruct blkcg_policy_data {\n\tstruct blkcg *blkcg;\n\tint plid;\n};\n\nstruct blkdev_dio {\n\tunion {\n\t\tstruct kiocb *iocb;\n\t\tstruct task_struct *waiter;\n\t};\n\tsize_t size;\n\tatomic_t ref;\n\tunsigned int flags;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tstruct bio bio;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct xenbus_device;\n\nstruct blkfront_ring_info;\n\nstruct blkfront_info {\n\tstruct mutex mutex;\n\tstruct xenbus_device *xbdev;\n\tstruct gendisk *gd;\n\tu16 sector_size;\n\tunsigned int physical_sector_size;\n\tlong unsigned int vdisk_info;\n\tint vdevice;\n\tblkif_vdev_t handle;\n\tenum blkif_state connected;\n\tunsigned int nr_ring_pages;\n\tstruct request_queue *rq;\n\tunsigned int feature_flush: 1;\n\tunsigned int feature_fua: 1;\n\tunsigned int feature_discard: 1;\n\tunsigned int feature_secdiscard: 1;\n\tunsigned int feature_persistent_parm: 1;\n\tunsigned int feature_persistent: 1;\n\tunsigned int bounce: 1;\n\tunsigned int discard_granularity;\n\tunsigned int discard_alignment;\n\tunsigned int max_indirect_segments;\n\tint is_ready;\n\tstruct blk_mq_tag_set tag_set;\n\tstruct blkfront_ring_info *rinfo;\n\tunsigned int nr_rings;\n\tunsigned int rinfo_size;\n\tstruct list_head requests;\n\tstruct bio_list bio_list;\n\tstruct list_head info_list;\n};\n\nstruct blkif_sring;\n\nstruct blkif_front_ring {\n\tRING_IDX req_prod_pvt;\n\tRING_IDX rsp_cons;\n\tunsigned int nr_ents;\n\tstruct blkif_sring *sring;\n};\n\nstruct gnttab_free_callback {\n\tstruct gnttab_free_callback *next;\n\tvoid (*fn)(void *);\n\tvoid *arg;\n\tu16 count;\n};\n\nstruct blkfront_ring_info {\n\tspinlock_t ring_lock;\n\tstruct blkif_front_ring ring;\n\tunsigned int ring_ref[16];\n\tunsigned int evtchn;\n\tunsigned int irq;\n\tstruct work_struct work;\n\tstruct gnttab_free_callback callback;\n\tstruct list_head indirect_pages;\n\tstruct list_head grants;\n\tunsigned int persistent_gnts_c;\n\tlong unsigned int shadow_free;\n\tstruct blkfront_info *dev_info;\n\tstruct blk_shadow shadow[0];\n};\n\nstruct blkg_conf_ctx {\n\tchar *input;\n\tchar *body;\n\tstruct block_device *bdev;\n\tstruct blkcg_gq *blkg;\n};\n\nstruct blkg_policy_data {\n\tstruct blkcg_gq *blkg;\n\tint plid;\n\tbool online;\n};\n\nstruct blkg_rwstat {\n\tstruct percpu_counter cpu_cnt[5];\n\tatomic64_t aux_cnt[5];\n};\n\nstruct blkg_rwstat_sample {\n\tu64 cnt[5];\n};\n\nstruct blkif_req {\n\tblk_status_t error;\n};\n\nstruct blkif_response {\n\tuint64_t id;\n\tuint8_t operation;\n\tint16_t status;\n};\n\nunion blkif_sring_entry {\n\tstruct blkif_request req;\n\tstruct blkif_response rsp;\n};\n\nstruct blkif_sring {\n\tRING_IDX req_prod;\n\tRING_IDX req_event;\n\tRING_IDX rsp_prod;\n\tRING_IDX rsp_event;\n\tuint8_t __pad[48];\n\tunion blkif_sring_entry ring[0];\n};\n\nstruct blkpg_ioctl_arg {\n\tint op;\n\tint flags;\n\tint datalen;\n\tvoid *data;\n};\n\nstruct blkpg_partition {\n\tlong long int start;\n\tlong long int length;\n\tint pno;\n\tchar devname[64];\n\tchar volname[64];\n};\n\nstruct block_buffer {\n\tu32 filled;\n\tbool is_root_hash;\n\tu8 *data;\n};\n\ntypedef int (*report_zones_cb)(struct blk_zone *, unsigned int, void *);\n\nstruct hd_geometry;\n\nstruct pr_ops;\n\nstruct block_device_operations {\n\tvoid (*submit_bio)(struct bio *);\n\tint (*poll_bio)(struct bio *, struct io_comp_batch *, unsigned int);\n\tint (*open)(struct gendisk *, blk_mode_t);\n\tvoid (*release)(struct gendisk *);\n\tint (*ioctl)(struct block_device *, blk_mode_t, unsigned int, long unsigned int);\n\tint (*compat_ioctl)(struct block_device *, blk_mode_t, unsigned int, long unsigned int);\n\tunsigned int (*check_events)(struct gendisk *, unsigned int);\n\tvoid (*unlock_native_capacity)(struct gendisk *);\n\tint (*getgeo)(struct block_device *, struct hd_geometry *);\n\tint (*set_read_only)(struct block_device *, bool);\n\tvoid (*free_disk)(struct gendisk *);\n\tvoid (*swap_slot_free_notify)(struct block_device *, long unsigned int);\n\tint (*report_zones)(struct gendisk *, sector_t, unsigned int, report_zones_cb, void *);\n\tchar * (*devnode)(struct gendisk *, umode_t *);\n\tint (*get_unique_id)(struct gendisk *, u8 *, enum blk_unique_id);\n\tstruct module *owner;\n\tconst struct pr_ops *pr_ops;\n\tint (*alternative_gpt_sector)(struct gendisk *, sector_t *);\n};\n\nstruct blockgroup_lock {\n\tstruct bgl_lock locks[128];\n};\n\nstruct mem_zone_bm_rtree;\n\nstruct rtree_node;\n\nstruct bm_position {\n\tstruct mem_zone_bm_rtree *zone;\n\tstruct rtree_node *node;\n\tlong unsigned int node_pfn;\n\tlong unsigned int cur_pfn;\n\tint node_bit;\n};\n\nstruct bmp_header {\n\tu16 id;\n\tu32 size;\n} __attribute__((packed));\n\nstruct spi_board_info {\n\tchar modalias[32];\n\tconst void *platform_data;\n\tconst struct software_node *swnode;\n\tvoid *controller_data;\n\tint irq;\n\tu32 max_speed_hz;\n\tu16 bus_num;\n\tu16 chip_select;\n\tu32 mode;\n};\n\nstruct boardinfo {\n\tstruct list_head list;\n\tstruct spi_board_info board_info;\n};\n\nstruct boot_e820_entry {\n\t__u64 addr;\n\t__u64 size;\n\t__u32 type;\n} __attribute__((packed));\n\nstruct screen_info {\n\t__u8 orig_x;\n\t__u8 orig_y;\n\t__u16 ext_mem_k;\n\t__u16 orig_video_page;\n\t__u8 orig_video_mode;\n\t__u8 orig_video_cols;\n\t__u8 flags;\n\t__u8 unused2;\n\t__u16 orig_video_ega_bx;\n\t__u16 unused3;\n\t__u8 orig_video_lines;\n\t__u8 orig_video_isVGA;\n\t__u16 orig_video_points;\n\t__u16 lfb_width;\n\t__u16 lfb_height;\n\t__u16 lfb_depth;\n\t__u32 lfb_base;\n\t__u32 lfb_size;\n\t__u16 cl_magic;\n\t__u16 cl_offset;\n\t__u16 lfb_linelength;\n\t__u8 red_size;\n\t__u8 red_pos;\n\t__u8 green_size;\n\t__u8 green_pos;\n\t__u8 blue_size;\n\t__u8 blue_pos;\n\t__u8 rsvd_size;\n\t__u8 rsvd_pos;\n\t__u16 vesapm_seg;\n\t__u16 vesapm_off;\n\t__u16 pages;\n\t__u16 vesa_attributes;\n\t__u32 capabilities;\n\t__u32 ext_lfb_base;\n\t__u8 _reserved[2];\n} __attribute__((packed));\n\nstruct ist_info {\n\t__u32 signature;\n\t__u32 command;\n\t__u32 event;\n\t__u32 perf_level;\n};\n\nstruct sys_desc_table {\n\t__u16 length;\n\t__u8 table[14];\n};\n\nstruct olpc_ofw_header {\n\t__u32 ofw_magic;\n\t__u32 ofw_version;\n\t__u32 cif_handler;\n\t__u32 irq_desc_table;\n};\n\nstruct edid_info {\n\tunsigned char dummy[128];\n};\n\nstruct efi_info {\n\t__u32 efi_loader_signature;\n\t__u32 efi_systab;\n\t__u32 efi_memdesc_size;\n\t__u32 efi_memdesc_version;\n\t__u32 efi_memmap;\n\t__u32 efi_memmap_size;\n\t__u32 efi_systab_hi;\n\t__u32 efi_memmap_hi;\n};\n\nstruct setup_header {\n\t__u8 setup_sects;\n\t__u16 root_flags;\n\t__u32 syssize;\n\t__u16 ram_size;\n\t__u16 vid_mode;\n\t__u16 root_dev;\n\t__u16 boot_flag;\n\t__u16 jump;\n\t__u32 header;\n\t__u16 version;\n\t__u32 realmode_swtch;\n\t__u16 start_sys_seg;\n\t__u16 kernel_version;\n\t__u8 type_of_loader;\n\t__u8 loadflags;\n\t__u16 setup_move_size;\n\t__u32 code32_start;\n\t__u32 ramdisk_image;\n\t__u32 ramdisk_size;\n\t__u32 bootsect_kludge;\n\t__u16 heap_end_ptr;\n\t__u8 ext_loader_ver;\n\t__u8 ext_loader_type;\n\t__u32 cmd_line_ptr;\n\t__u32 initrd_addr_max;\n\t__u32 kernel_alignment;\n\t__u8 relocatable_kernel;\n\t__u8 min_alignment;\n\t__u16 xloadflags;\n\t__u32 cmdline_size;\n\t__u32 hardware_subarch;\n\t__u64 hardware_subarch_data;\n\t__u32 payload_offset;\n\t__u32 payload_length;\n\t__u64 setup_data;\n\t__u64 pref_address;\n\t__u32 init_size;\n\t__u32 handover_offset;\n\t__u32 kernel_info_offset;\n} __attribute__((packed));\n\nstruct edd_device_params {\n\t__u16 length;\n\t__u16 info_flags;\n\t__u32 num_default_cylinders;\n\t__u32 num_default_heads;\n\t__u32 sectors_per_track;\n\t__u64 number_of_sectors;\n\t__u16 bytes_per_sector;\n\t__u32 dpte_ptr;\n\t__u16 key;\n\t__u8 device_path_info_length;\n\t__u8 reserved2;\n\t__u16 reserved3;\n\t__u8 host_bus_type[4];\n\t__u8 interface_type[8];\n\tunion {\n\t\tstruct {\n\t\t\t__u16 base_address;\n\t\t\t__u16 reserved1;\n\t\t\t__u32 reserved2;\n\t\t} isa;\n\t\tstruct {\n\t\t\t__u8 bus;\n\t\t\t__u8 slot;\n\t\t\t__u8 function;\n\t\t\t__u8 channel;\n\t\t\t__u32 reserved;\n\t\t} pci;\n\t\tstruct {\n\t\t\t__u64 reserved;\n\t\t} ibnd;\n\t\tstruct {\n\t\t\t__u64 reserved;\n\t\t} xprs;\n\t\tstruct {\n\t\t\t__u64 reserved;\n\t\t} htpt;\n\t\tstruct {\n\t\t\t__u64 reserved;\n\t\t} unknown;\n\t} interface_path;\n\tunion {\n\t\tstruct {\n\t\t\t__u8 device;\n\t\t\t__u8 reserved1;\n\t\t\t__u16 reserved2;\n\t\t\t__u32 reserved3;\n\t\t\t__u64 reserved4;\n\t\t} ata;\n\t\tstruct {\n\t\t\t__u8 device;\n\t\t\t__u8 lun;\n\t\t\t__u8 reserved1;\n\t\t\t__u8 reserved2;\n\t\t\t__u32 reserved3;\n\t\t\t__u64 reserved4;\n\t\t} atapi;\n\t\tstruct {\n\t\t\t__u16 id;\n\t\t\t__u64 lun;\n\t\t\t__u16 reserved1;\n\t\t\t__u32 reserved2;\n\t\t} __attribute__((packed)) scsi;\n\t\tstruct {\n\t\t\t__u64 serial_number;\n\t\t\t__u64 reserved;\n\t\t} usb;\n\t\tstruct {\n\t\t\t__u64 eui;\n\t\t\t__u64 reserved;\n\t\t} i1394;\n\t\tstruct {\n\t\t\t__u64 wwid;\n\t\t\t__u64 lun;\n\t\t} fibre;\n\t\tstruct {\n\t\t\t__u64 identity_tag;\n\t\t\t__u64 reserved;\n\t\t} i2o;\n\t\tstruct {\n\t\t\t__u32 array_number;\n\t\t\t__u32 reserved1;\n\t\t\t__u64 reserved2;\n\t\t} raid;\n\t\tstruct {\n\t\t\t__u8 device;\n\t\t\t__u8 reserved1;\n\t\t\t__u16 reserved2;\n\t\t\t__u32 reserved3;\n\t\t\t__u64 reserved4;\n\t\t} sata;\n\t\tstruct {\n\t\t\t__u64 reserved1;\n\t\t\t__u64 reserved2;\n\t\t} unknown;\n\t} device_path;\n\t__u8 reserved4;\n\t__u8 checksum;\n} __attribute__((packed));\n\nstruct edd_info {\n\t__u8 device;\n\t__u8 version;\n\t__u16 interface_support;\n\t__u16 legacy_max_cylinder;\n\t__u8 legacy_max_head;\n\t__u8 legacy_sectors_per_track;\n\tstruct edd_device_params params;\n};\n\nstruct boot_params {\n\tstruct screen_info screen_info;\n\tstruct apm_bios_info apm_bios_info;\n\t__u8 _pad2[4];\n\t__u64 tboot_addr;\n\tstruct ist_info ist_info;\n\t__u64 acpi_rsdp_addr;\n\t__u8 _pad3[8];\n\t__u8 hd0_info[16];\n\t__u8 hd1_info[16];\n\tstruct sys_desc_table sys_desc_table;\n\tstruct olpc_ofw_header olpc_ofw_header;\n\t__u32 ext_ramdisk_image;\n\t__u32 ext_ramdisk_size;\n\t__u32 ext_cmd_line_ptr;\n\t__u8 _pad4[112];\n\t__u32 cc_blob_address;\n\tstruct edid_info edid_info;\n\tstruct efi_info efi_info;\n\t__u32 alt_mem_k;\n\t__u32 scratch;\n\t__u8 e820_entries;\n\t__u8 eddbuf_entries;\n\t__u8 edd_mbr_sig_buf_entries;\n\t__u8 kbd_status;\n\t__u8 secure_boot;\n\t__u8 _pad5[2];\n\t__u8 sentinel;\n\t__u8 _pad6[1];\n\tstruct setup_header hdr;\n\t__u8 _pad7[36];\n\t__u32 edd_mbr_sig_buffer[16];\n\tstruct boot_e820_entry e820_table[128];\n\t__u8 _pad8[48];\n\tstruct edd_info eddbuf[6];\n\t__u8 _pad9[276];\n};\n\nstruct boot_params_to_save {\n\tunsigned int start;\n\tunsigned int len;\n};\n\nstruct fpdt_record_header {\n\tu16 type;\n\tu8 length;\n\tu8 revision;\n};\n\nstruct boot_performance_record {\n\tstruct fpdt_record_header header;\n\tu32 reserved;\n\tu64 firmware_start;\n\tu64 bootloader_load;\n\tu64 bootloader_launch;\n\tu64 exitbootservice_start;\n\tu64 exitbootservice_end;\n};\n\nstruct boot_triggers {\n\tconst char *event;\n\tchar *trigger;\n};\n\nstruct bp_slots_histogram {\n\tatomic_t count[4];\n};\n\nstruct bp_cpuinfo {\n\tunsigned int cpu_pinned;\n\tstruct bp_slots_histogram tsk_pinned;\n};\n\nstruct text_poke_loc;\n\nstruct bp_patching_desc {\n\tstruct text_poke_loc *vec;\n\tint nr_entries;\n\tatomic_t refs;\n};\n\nstruct bpf_active_lock {\n\tvoid *ptr;\n\tu32 id;\n};\n\nstruct bpf_map_ops;\n\nstruct btf_record;\n\nstruct btf;\n\nstruct obj_cgroup;\n\nstruct btf_type;\n\nstruct bpf_map {\n\tconst struct bpf_map_ops *ops;\n\tstruct bpf_map *inner_map_meta;\n\tvoid *security;\n\tenum bpf_map_type map_type;\n\tu32 key_size;\n\tu32 value_size;\n\tu32 max_entries;\n\tu64 map_extra;\n\tu32 map_flags;\n\tu32 id;\n\tstruct btf_record *record;\n\tint numa_node;\n\tu32 btf_key_type_id;\n\tu32 btf_value_type_id;\n\tu32 btf_vmlinux_value_type_id;\n\tstruct btf *btf;\n\tstruct obj_cgroup *objcg;\n\tchar name[16];\n\tstruct mutex freeze_mutex;\n\tatomic64_t refcnt;\n\tatomic64_t usercnt;\n\tunion {\n\t\tstruct work_struct work;\n\t\tstruct callback_head rcu;\n\t};\n\tatomic64_t writecnt;\n\tstruct {\n\t\tconst struct btf_type *attach_func_proto;\n\t\tspinlock_t lock;\n\t\tenum bpf_prog_type type;\n\t\tbool jited;\n\t\tbool xdp_has_frags;\n\t} owner;\n\tbool bypass_spec_v1;\n\tbool frozen;\n\tbool free_after_mult_rcu_gp;\n\tbool free_after_rcu_gp;\n\tatomic64_t sleepable_refcnt;\n\ts64 *elem_count;\n};\n\nstruct maple_tree {\n\tunion {\n\t\tspinlock_t ma_lock;\n\t\tlockdep_map_p ma_external_lock;\n\t};\n\tunsigned int ma_flags;\n\tvoid *ma_root;\n};\n\nstruct vm_struct;\n\nstruct bpf_arena {\n\tstruct bpf_map map;\n\tu64 user_vm_start;\n\tu64 user_vm_end;\n\tstruct vm_struct *kern_vm;\n\tstruct maple_tree mt;\n\tstruct list_head vma_list;\n\tstruct mutex lock;\n};\n\nstruct bpf_array_aux;\n\nstruct bpf_array {\n\tstruct bpf_map map;\n\tu32 elem_size;\n\tu32 index_mask;\n\tstruct bpf_array_aux *aux;\n\tunion {\n\t\tstruct {\n\t\t\tstruct {} __empty_value;\n\t\t\tchar value[0];\n\t\t};\n\t\tstruct {\n\t\t\tstruct {} __empty_ptrs;\n\t\t\tvoid *ptrs[0];\n\t\t};\n\t\tstruct {\n\t\t\tstruct {} __empty_pptrs;\n\t\t\tvoid *pptrs[0];\n\t\t};\n\t};\n};\n\nstruct bpf_array_aux {\n\tstruct list_head poke_progs;\n\tstruct bpf_map *map;\n\tstruct mutex poke_mutex;\n\tstruct work_struct work;\n};\n\nstruct bpf_prog;\n\nstruct bpf_async_cb {\n\tstruct bpf_map *map;\n\tstruct bpf_prog *prog;\n\tvoid *callback_fn;\n\tvoid *value;\n\tunion {\n\t\tstruct callback_head rcu;\n\t\tstruct work_struct delete_work;\n\t};\n\tu64 flags;\n};\n\nstruct bpf_spin_lock {\n\t__u32 val;\n};\n\nstruct bpf_hrtimer;\n\nstruct bpf_work;\n\nstruct bpf_async_kern {\n\tunion {\n\t\tstruct bpf_async_cb *cb;\n\t\tstruct bpf_hrtimer *timer;\n\t\tstruct bpf_work *work;\n\t};\n\tstruct bpf_spin_lock lock;\n};\n\nstruct btf_func_model {\n\tu8 ret_size;\n\tu8 ret_flags;\n\tu8 nr_args;\n\tu8 arg_size[12];\n\tu8 arg_flags[12];\n};\n\nstruct bpf_attach_target_info {\n\tstruct btf_func_model fmodel;\n\tlong int tgt_addr;\n\tstruct module *tgt_mod;\n\tconst char *tgt_name;\n\tconst struct btf_type *tgt_type;\n};\n\nunion bpf_attr {\n\tstruct {\n\t\t__u32 map_type;\n\t\t__u32 key_size;\n\t\t__u32 value_size;\n\t\t__u32 max_entries;\n\t\t__u32 map_flags;\n\t\t__u32 inner_map_fd;\n\t\t__u32 numa_node;\n\t\tchar map_name[16];\n\t\t__u32 map_ifindex;\n\t\t__u32 btf_fd;\n\t\t__u32 btf_key_type_id;\n\t\t__u32 btf_value_type_id;\n\t\t__u32 btf_vmlinux_value_type_id;\n\t\t__u64 map_extra;\n\t\t__s32 value_type_btf_obj_fd;\n\t\t__s32 map_token_fd;\n\t};\n\tstruct {\n\t\t__u32 map_fd;\n\t\t__u64 key;\n\t\tunion {\n\t\t\t__u64 value;\n\t\t\t__u64 next_key;\n\t\t};\n\t\t__u64 flags;\n\t};\n\tstruct {\n\t\t__u64 in_batch;\n\t\t__u64 out_batch;\n\t\t__u64 keys;\n\t\t__u64 values;\n\t\t__u32 count;\n\t\t__u32 map_fd;\n\t\t__u64 elem_flags;\n\t\t__u64 flags;\n\t} batch;\n\tstruct {\n\t\t__u32 prog_type;\n\t\t__u32 insn_cnt;\n\t\t__u64 insns;\n\t\t__u64 license;\n\t\t__u32 log_level;\n\t\t__u32 log_size;\n\t\t__u64 log_buf;\n\t\t__u32 kern_version;\n\t\t__u32 prog_flags;\n\t\tchar prog_name[16];\n\t\t__u32 prog_ifindex;\n\t\t__u32 expected_attach_type;\n\t\t__u32 prog_btf_fd;\n\t\t__u32 func_info_rec_size;\n\t\t__u64 func_info;\n\t\t__u32 func_info_cnt;\n\t\t__u32 line_info_rec_size;\n\t\t__u64 line_info;\n\t\t__u32 line_info_cnt;\n\t\t__u32 attach_btf_id;\n\t\tunion {\n\t\t\t__u32 attach_prog_fd;\n\t\t\t__u32 attach_btf_obj_fd;\n\t\t};\n\t\t__u32 core_relo_cnt;\n\t\t__u64 fd_array;\n\t\t__u64 core_relos;\n\t\t__u32 core_relo_rec_size;\n\t\t__u32 log_true_size;\n\t\t__s32 prog_token_fd;\n\t};\n\tstruct {\n\t\t__u64 pathname;\n\t\t__u32 bpf_fd;\n\t\t__u32 file_flags;\n\t\t__s32 path_fd;\n\t};\n\tstruct {\n\t\tunion {\n\t\t\t__u32 target_fd;\n\t\t\t__u32 target_ifindex;\n\t\t};\n\t\t__u32 attach_bpf_fd;\n\t\t__u32 attach_type;\n\t\t__u32 attach_flags;\n\t\t__u32 replace_bpf_fd;\n\t\tunion {\n\t\t\t__u32 relative_fd;\n\t\t\t__u32 relative_id;\n\t\t};\n\t\t__u64 expected_revision;\n\t};\n\tstruct {\n\t\t__u32 prog_fd;\n\t\t__u32 retval;\n\t\t__u32 data_size_in;\n\t\t__u32 data_size_out;\n\t\t__u64 data_in;\n\t\t__u64 data_out;\n\t\t__u32 repeat;\n\t\t__u32 duration;\n\t\t__u32 ctx_size_in;\n\t\t__u32 ctx_size_out;\n\t\t__u64 ctx_in;\n\t\t__u64 ctx_out;\n\t\t__u32 flags;\n\t\t__u32 cpu;\n\t\t__u32 batch_size;\n\t} test;\n\tstruct {\n\t\tunion {\n\t\t\t__u32 start_id;\n\t\t\t__u32 prog_id;\n\t\t\t__u32 map_id;\n\t\t\t__u32 btf_id;\n\t\t\t__u32 link_id;\n\t\t};\n\t\t__u32 next_id;\n\t\t__u32 open_flags;\n\t};\n\tstruct {\n\t\t__u32 bpf_fd;\n\t\t__u32 info_len;\n\t\t__u64 info;\n\t} info;\n\tstruct {\n\t\tunion {\n\t\t\t__u32 target_fd;\n\t\t\t__u32 target_ifindex;\n\t\t};\n\t\t__u32 attach_type;\n\t\t__u32 query_flags;\n\t\t__u32 attach_flags;\n\t\t__u64 prog_ids;\n\t\tunion {\n\t\t\t__u32 prog_cnt;\n\t\t\t__u32 count;\n\t\t};\n\t\t__u64 prog_attach_flags;\n\t\t__u64 link_ids;\n\t\t__u64 link_attach_flags;\n\t\t__u64 revision;\n\t} query;\n\tstruct {\n\t\t__u64 name;\n\t\t__u32 prog_fd;\n\t\t__u64 cookie;\n\t} raw_tracepoint;\n\tstruct {\n\t\t__u64 btf;\n\t\t__u64 btf_log_buf;\n\t\t__u32 btf_size;\n\t\t__u32 btf_log_size;\n\t\t__u32 btf_log_level;\n\t\t__u32 btf_log_true_size;\n\t\t__u32 btf_flags;\n\t\t__s32 btf_token_fd;\n\t};\n\tstruct {\n\t\t__u32 pid;\n\t\t__u32 fd;\n\t\t__u32 flags;\n\t\t__u32 buf_len;\n\t\t__u64 buf;\n\t\t__u32 prog_id;\n\t\t__u32 fd_type;\n\t\t__u64 probe_offset;\n\t\t__u64 probe_addr;\n\t} task_fd_query;\n\tstruct {\n\t\tunion {\n\t\t\t__u32 prog_fd;\n\t\t\t__u32 map_fd;\n\t\t};\n\t\tunion {\n\t\t\t__u32 target_fd;\n\t\t\t__u32 target_ifindex;\n\t\t};\n\t\t__u32 attach_type;\n\t\t__u32 flags;\n\t\tunion {\n\t\t\t__u32 target_btf_id;\n\t\t\tstruct {\n\t\t\t\t__u64 iter_info;\n\t\t\t\t__u32 iter_info_len;\n\t\t\t};\n\t\t\tstruct {\n\t\t\t\t__u64 bpf_cookie;\n\t\t\t} perf_event;\n\t\t\tstruct {\n\t\t\t\t__u32 flags;\n\t\t\t\t__u32 cnt;\n\t\t\t\t__u64 syms;\n\t\t\t\t__u64 addrs;\n\t\t\t\t__u64 cookies;\n\t\t\t} kprobe_multi;\n\t\t\tstruct {\n\t\t\t\t__u32 target_btf_id;\n\t\t\t\t__u64 cookie;\n\t\t\t} tracing;\n\t\t\tstruct {\n\t\t\t\t__u32 pf;\n\t\t\t\t__u32 hooknum;\n\t\t\t\t__s32 priority;\n\t\t\t\t__u32 flags;\n\t\t\t} netfilter;\n\t\t\tstruct {\n\t\t\t\tunion {\n\t\t\t\t\t__u32 relative_fd;\n\t\t\t\t\t__u32 relative_id;\n\t\t\t\t};\n\t\t\t\t__u64 expected_revision;\n\t\t\t} tcx;\n\t\t\tstruct {\n\t\t\t\t__u64 path;\n\t\t\t\t__u64 offsets;\n\t\t\t\t__u64 ref_ctr_offsets;\n\t\t\t\t__u64 cookies;\n\t\t\t\t__u32 cnt;\n\t\t\t\t__u32 flags;\n\t\t\t\t__u32 pid;\n\t\t\t} uprobe_multi;\n\t\t\tstruct {\n\t\t\t\tunion {\n\t\t\t\t\t__u32 relative_fd;\n\t\t\t\t\t__u32 relative_id;\n\t\t\t\t};\n\t\t\t\t__u64 expected_revision;\n\t\t\t} netkit;\n\t\t};\n\t} link_create;\n\tstruct {\n\t\t__u32 link_fd;\n\t\tunion {\n\t\t\t__u32 new_prog_fd;\n\t\t\t__u32 new_map_fd;\n\t\t};\n\t\t__u32 flags;\n\t\tunion {\n\t\t\t__u32 old_prog_fd;\n\t\t\t__u32 old_map_fd;\n\t\t};\n\t} link_update;\n\tstruct {\n\t\t__u32 link_fd;\n\t} link_detach;\n\tstruct {\n\t\t__u32 type;\n\t} enable_stats;\n\tstruct {\n\t\t__u32 link_fd;\n\t\t__u32 flags;\n\t} iter_create;\n\tstruct {\n\t\t__u32 prog_fd;\n\t\t__u32 map_fd;\n\t\t__u32 flags;\n\t} prog_bind_map;\n\tstruct {\n\t\t__u32 flags;\n\t\t__u32 bpffs_fd;\n\t} token_create;\n};\n\nstruct bpf_binary_header {\n\tu32 size;\n\tlong: 0;\n\tu8 image[0];\n};\n\nstruct bpf_bloom_filter {\n\tstruct bpf_map map;\n\tu32 bitset_mask;\n\tu32 hash_seed;\n\tu32 nr_hash_funcs;\n\tlong unsigned int bitset[0];\n};\n\nstruct bpf_bprintf_buffers {\n\tchar bin_args[512];\n\tchar buf[1024];\n};\n\nstruct bpf_bprintf_data {\n\tu32 *bin_args;\n\tchar *buf;\n\tbool get_bin_args;\n\tbool get_buf;\n};\n\nstruct bpf_btf_info {\n\t__u64 btf;\n\t__u32 btf_size;\n\t__u32 id;\n\t__u64 name;\n\t__u32 name_len;\n\t__u32 kernel_btf;\n};\n\nstruct btf_field;\n\nstruct bpf_call_arg_meta {\n\tstruct bpf_map *map_ptr;\n\tbool raw_mode;\n\tbool pkt_access;\n\tu8 release_regno;\n\tint regno;\n\tint access_size;\n\tint mem_size;\n\tu64 msize_max_value;\n\tint ref_obj_id;\n\tint dynptr_id;\n\tint map_uid;\n\tint func_id;\n\tstruct btf *btf;\n\tu32 btf_id;\n\tstruct btf *ret_btf;\n\tu32 ret_btf_id;\n\tu32 subprogno;\n\tstruct btf_field *kptr_field;\n};\n\nstruct bpf_cand_cache {\n\tconst char *name;\n\tu32 name_len;\n\tu16 kind;\n\tu16 cnt;\n\tstruct {\n\t\tconst struct btf *btf;\n\t\tu32 id;\n\t} cands[0];\n};\n\nstruct bpf_run_ctx {};\n\nstruct bpf_prog_array_item;\n\nstruct bpf_cg_run_ctx {\n\tstruct bpf_run_ctx run_ctx;\n\tconst struct bpf_prog_array_item *prog_item;\n\tint retval;\n};\n\nstruct bpf_cgroup_dev_ctx {\n\t__u32 access_type;\n\t__u32 major;\n\t__u32 minor;\n};\n\nstruct bpf_link_ops;\n\nstruct bpf_link {\n\tatomic64_t refcnt;\n\tu32 id;\n\tenum bpf_link_type type;\n\tconst struct bpf_link_ops *ops;\n\tstruct bpf_prog *prog;\n\tunion {\n\t\tstruct callback_head rcu;\n\t\tstruct work_struct work;\n\t};\n};\n\nstruct bpf_cgroup_link {\n\tstruct bpf_link link;\n\tstruct cgroup *cgroup;\n\tenum bpf_attach_type type;\n};\n\nstruct bpf_cgroup_storage_key {\n\t__u64 cgroup_inode_id;\n\t__u32 attach_type;\n};\n\nstruct bpf_storage_buffer;\n\nstruct bpf_cgroup_storage_map;\n\nstruct bpf_cgroup_storage {\n\tunion {\n\t\tstruct bpf_storage_buffer *buf;\n\t\tvoid *percpu_buf;\n\t};\n\tstruct bpf_cgroup_storage_map *map;\n\tstruct bpf_cgroup_storage_key key;\n\tstruct list_head list_map;\n\tstruct list_head list_cg;\n\tstruct rb_node node;\n\tstruct callback_head rcu;\n};\n\nstruct bpf_cgroup_storage_map {\n\tstruct bpf_map map;\n\tspinlock_t lock;\n\tstruct rb_root root;\n\tstruct list_head list;\n};\n\nstruct bpf_lru_list {\n\tstruct list_head lists[3];\n\tunsigned int counts[2];\n\tstruct list_head *next_inactive_rotation;\n\traw_spinlock_t lock;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct bpf_lru_locallist;\n\nstruct bpf_common_lru {\n\tstruct bpf_lru_list lru_list;\n\tstruct bpf_lru_locallist *local_list;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct bpf_core_accessor {\n\t__u32 type_id;\n\t__u32 idx;\n\tconst char *name;\n};\n\nstruct bpf_core_cand {\n\tconst struct btf *btf;\n\t__u32 id;\n};\n\nstruct bpf_core_cand_list {\n\tstruct bpf_core_cand *cands;\n\tint len;\n};\n\nstruct bpf_verifier_log;\n\nstruct bpf_core_ctx {\n\tstruct bpf_verifier_log *log;\n\tconst struct btf *btf;\n};\n\nstruct bpf_core_relo {\n\t__u32 insn_off;\n\t__u32 type_id;\n\t__u32 access_str_off;\n\tenum bpf_core_relo_kind kind;\n};\n\nstruct bpf_core_relo_res {\n\t__u64 orig_val;\n\t__u64 new_val;\n\tbool poison;\n\tbool validate;\n\tbool fail_memsz_adjust;\n\t__u32 orig_sz;\n\t__u32 orig_type_id;\n\t__u32 new_sz;\n\t__u32 new_type_id;\n};\n\nstruct bpf_core_spec {\n\tconst struct btf *btf;\n\tstruct bpf_core_accessor spec[64];\n\t__u32 root_type_id;\n\tenum bpf_core_relo_kind relo_kind;\n\tint len;\n\tint raw_spec[64];\n\tint raw_len;\n\t__u32 bit_offset;\n};\n\nstruct bpf_cpu_map_entry;\n\nstruct bpf_cpu_map {\n\tstruct bpf_map map;\n\tstruct bpf_cpu_map_entry **cpu_map;\n};\n\nstruct bpf_cpumap_val {\n\t__u32 qsize;\n\tunion {\n\t\tint fd;\n\t\t__u32 id;\n\t} bpf_prog;\n};\n\nstruct xdp_bulk_queue;\n\nstruct ptr_ring;\n\nstruct bpf_cpu_map_entry {\n\tu32 cpu;\n\tint map_id;\n\tstruct xdp_bulk_queue *bulkq;\n\tstruct ptr_ring *queue;\n\tstruct task_struct *kthread;\n\tstruct bpf_cpumap_val value;\n\tstruct bpf_prog *prog;\n\tstruct completion kthread_running;\n\tstruct rcu_work free_work;\n};\n\ntypedef struct cpumask cpumask_t;\n\nstruct bpf_cpumask {\n\tcpumask_t cpumask;\n\trefcount_t usage;\n};\n\nstruct bpf_crypto_type;\n\nstruct bpf_crypto_ctx {\n\tconst struct bpf_crypto_type *type;\n\tvoid *tfm;\n\tu32 siv_len;\n\tstruct callback_head rcu;\n\trefcount_t usage;\n};\n\nstruct bpf_crypto_params {\n\tchar type[14];\n\tu8 reserved[2];\n\tchar algo[128];\n\tu8 key[256];\n\tu32 key_len;\n\tu32 authsize;\n};\n\nstruct bpf_crypto_type {\n\tvoid * (*alloc_tfm)(const char *);\n\tvoid (*free_tfm)(void *);\n\tint (*has_algo)(const char *);\n\tint (*setkey)(void *, const u8 *, unsigned int);\n\tint (*setauthsize)(void *, unsigned int);\n\tint (*encrypt)(void *, const u8 *, u8 *, unsigned int, u8 *);\n\tint (*decrypt)(void *, const u8 *, u8 *, unsigned int, u8 *);\n\tunsigned int (*ivsize)(void *);\n\tunsigned int (*statesize)(void *);\n\tu32 (*get_flags)(void *);\n\tstruct module *owner;\n\tchar name[14];\n};\n\nstruct bpf_crypto_type_list {\n\tconst struct bpf_crypto_type *type;\n\tstruct list_head list;\n};\n\nstruct bpf_ctx_arg_aux {\n\tu32 offset;\n\tenum bpf_reg_type reg_type;\n\tstruct btf *btf;\n\tu32 btf_id;\n};\n\nstruct skb_ext;\n\nstruct sk_buff {\n\tunion {\n\t\tstruct {\n\t\t\tstruct sk_buff *next;\n\t\t\tstruct sk_buff *prev;\n\t\t\tunion {\n\t\t\t\tstruct net_device *dev;\n\t\t\t\tlong unsigned int dev_scratch;\n\t\t\t};\n\t\t};\n\t\tstruct rb_node rbnode;\n\t\tstruct list_head list;\n\t\tstruct llist_node ll_node;\n\t};\n\tstruct sock *sk;\n\tunion {\n\t\tktime_t tstamp;\n\t\tu64 skb_mstamp_ns;\n\t};\n\tchar cb[48];\n\tunion {\n\t\tstruct {\n\t\t\tlong unsigned int _skb_refdst;\n\t\t\tvoid (*destructor)(struct sk_buff *);\n\t\t};\n\t\tstruct list_head tcp_tsorted_anchor;\n\t\tlong unsigned int _sk_redir;\n\t};\n\tlong unsigned int _nfct;\n\tunsigned int len;\n\tunsigned int data_len;\n\t__u16 mac_len;\n\t__u16 hdr_len;\n\t__u16 queue_mapping;\n\t__u8 __cloned_offset[0];\n\t__u8 cloned: 1;\n\t__u8 nohdr: 1;\n\t__u8 fclone: 2;\n\t__u8 peeked: 1;\n\t__u8 head_frag: 1;\n\t__u8 pfmemalloc: 1;\n\t__u8 pp_recycle: 1;\n\t__u8 active_extensions;\n\tunion {\n\t\tstruct {\n\t\t\t__u8 __pkt_type_offset[0];\n\t\t\t__u8 pkt_type: 3;\n\t\t\t__u8 ignore_df: 1;\n\t\t\t__u8 dst_pending_confirm: 1;\n\t\t\t__u8 ip_summed: 2;\n\t\t\t__u8 ooo_okay: 1;\n\t\t\t__u8 __mono_tc_offset[0];\n\t\t\t__u8 tstamp_type: 2;\n\t\t\t__u8 tc_at_ingress: 1;\n\t\t\t__u8 tc_skip_classify: 1;\n\t\t\t__u8 remcsum_offload: 1;\n\t\t\t__u8 csum_complete_sw: 1;\n\t\t\t__u8 csum_level: 2;\n\t\t\t__u8 inner_protocol_type: 1;\n\t\t\t__u8 l4_hash: 1;\n\t\t\t__u8 sw_hash: 1;\n\t\t\t__u8 wifi_acked_valid: 1;\n\t\t\t__u8 wifi_acked: 1;\n\t\t\t__u8 no_fcs: 1;\n\t\t\t__u8 encapsulation: 1;\n\t\t\t__u8 encap_hdr_csum: 1;\n\t\t\t__u8 csum_valid: 1;\n\t\t\t__u8 ndisc_nodetype: 2;\n\t\t\t__u8 ipvs_property: 1;\n\t\t\t__u8 nf_trace: 1;\n\t\t\t__u8 offload_fwd_mark: 1;\n\t\t\t__u8 offload_l3_fwd_mark: 1;\n\t\t\t__u8 redirected: 1;\n\t\t\t__u8 from_ingress: 1;\n\t\t\t__u8 nf_skip_egress: 1;\n\t\t\t__u8 decrypted: 1;\n\t\t\t__u8 slow_gro: 1;\n\t\t\t__u8 csum_not_inet: 1;\n\t\t\t__u16 tc_index;\n\t\t\tu16 alloc_cpu;\n\t\t\tunion {\n\t\t\t\t__wsum csum;\n\t\t\t\tstruct {\n\t\t\t\t\t__u16 csum_start;\n\t\t\t\t\t__u16 csum_offset;\n\t\t\t\t};\n\t\t\t};\n\t\t\t__u32 priority;\n\t\t\tint skb_iif;\n\t\t\t__u32 hash;\n\t\t\tunion {\n\t\t\t\tu32 vlan_all;\n\t\t\t\tstruct {\n\t\t\t\t\t__be16 vlan_proto;\n\t\t\t\t\t__u16 vlan_tci;\n\t\t\t\t};\n\t\t\t};\n\t\t\tunion {\n\t\t\t\tunsigned int napi_id;\n\t\t\t\tunsigned int sender_cpu;\n\t\t\t};\n\t\t\t__u32 secmark;\n\t\t\tunion {\n\t\t\t\t__u32 mark;\n\t\t\t\t__u32 reserved_tailroom;\n\t\t\t};\n\t\t\tunion {\n\t\t\t\t__be16 inner_protocol;\n\t\t\t\t__u8 inner_ipproto;\n\t\t\t};\n\t\t\t__u16 inner_transport_header;\n\t\t\t__u16 inner_network_header;\n\t\t\t__u16 inner_mac_header;\n\t\t\t__be16 protocol;\n\t\t\t__u16 transport_header;\n\t\t\t__u16 network_header;\n\t\t\t__u16 mac_header;\n\t\t};\n\t\tstruct {\n\t\t\t__u8 __pkt_type_offset[0];\n\t\t\t__u8 pkt_type: 3;\n\t\t\t__u8 ignore_df: 1;\n\t\t\t__u8 dst_pending_confirm: 1;\n\t\t\t__u8 ip_summed: 2;\n\t\t\t__u8 ooo_okay: 1;\n\t\t\t__u8 __mono_tc_offset[0];\n\t\t\t__u8 tstamp_type: 2;\n\t\t\t__u8 tc_at_ingress: 1;\n\t\t\t__u8 tc_skip_classify: 1;\n\t\t\t__u8 remcsum_offload: 1;\n\t\t\t__u8 csum_complete_sw: 1;\n\t\t\t__u8 csum_level: 2;\n\t\t\t__u8 inner_protocol_type: 1;\n\t\t\t__u8 l4_hash: 1;\n\t\t\t__u8 sw_hash: 1;\n\t\t\t__u8 wifi_acked_valid: 1;\n\t\t\t__u8 wifi_acked: 1;\n\t\t\t__u8 no_fcs: 1;\n\t\t\t__u8 encapsulation: 1;\n\t\t\t__u8 encap_hdr_csum: 1;\n\t\t\t__u8 csum_valid: 1;\n\t\t\t__u8 ndisc_nodetype: 2;\n\t\t\t__u8 ipvs_property: 1;\n\t\t\t__u8 nf_trace: 1;\n\t\t\t__u8 offload_fwd_mark: 1;\n\t\t\t__u8 offload_l3_fwd_mark: 1;\n\t\t\t__u8 redirected: 1;\n\t\t\t__u8 from_ingress: 1;\n\t\t\t__u8 nf_skip_egress: 1;\n\t\t\t__u8 decrypted: 1;\n\t\t\t__u8 slow_gro: 1;\n\t\t\t__u8 csum_not_inet: 1;\n\t\t\t__u16 tc_index;\n\t\t\tu16 alloc_cpu;\n\t\t\tunion {\n\t\t\t\t__wsum csum;\n\t\t\t\tstruct {\n\t\t\t\t\t__u16 csum_start;\n\t\t\t\t\t__u16 csum_offset;\n\t\t\t\t};\n\t\t\t};\n\t\t\t__u32 priority;\n\t\t\tint skb_iif;\n\t\t\t__u32 hash;\n\t\t\tunion {\n\t\t\t\tu32 vlan_all;\n\t\t\t\tstruct {\n\t\t\t\t\t__be16 vlan_proto;\n\t\t\t\t\t__u16 vlan_tci;\n\t\t\t\t};\n\t\t\t};\n\t\t\tunion {\n\t\t\t\tunsigned int napi_id;\n\t\t\t\tunsigned int sender_cpu;\n\t\t\t};\n\t\t\t__u32 secmark;\n\t\t\tunion {\n\t\t\t\t__u32 mark;\n\t\t\t\t__u32 reserved_tailroom;\n\t\t\t};\n\t\t\tunion {\n\t\t\t\t__be16 inner_protocol;\n\t\t\t\t__u8 inner_ipproto;\n\t\t\t};\n\t\t\t__u16 inner_transport_header;\n\t\t\t__u16 inner_network_header;\n\t\t\t__u16 inner_mac_header;\n\t\t\t__be16 protocol;\n\t\t\t__u16 transport_header;\n\t\t\t__u16 network_header;\n\t\t\t__u16 mac_header;\n\t\t} headers;\n\t};\n\tsk_buff_data_t tail;\n\tsk_buff_data_t end;\n\tunsigned char *head;\n\tunsigned char *data;\n\tunsigned int truesize;\n\trefcount_t users;\n\tstruct skb_ext *extensions;\n};\n\nstruct xdp_md {\n\t__u32 data;\n\t__u32 data_end;\n\t__u32 data_meta;\n\t__u32 ingress_ifindex;\n\t__u32 rx_queue_index;\n\t__u32 egress_ifindex;\n};\n\nstruct xdp_rxq_info;\n\nstruct xdp_txq_info;\n\nstruct xdp_buff {\n\tvoid *data;\n\tvoid *data_end;\n\tvoid *data_meta;\n\tvoid *data_hard_start;\n\tstruct xdp_rxq_info *rxq;\n\tstruct xdp_txq_info *txq;\n\tu32 frame_sz;\n\tu32 flags;\n};\n\nstruct bpf_sock {\n\t__u32 bound_dev_if;\n\t__u32 family;\n\t__u32 type;\n\t__u32 protocol;\n\t__u32 mark;\n\t__u32 priority;\n\t__u32 src_ip4;\n\t__u32 src_ip6[4];\n\t__u32 src_port;\n\t__be16 dst_port;\n\t__u32 dst_ip4;\n\t__u32 dst_ip6[4];\n\t__u32 state;\n\t__s32 rx_queue_mapping;\n};\n\nstruct hlist_nulls_node {\n\tstruct hlist_nulls_node *next;\n\tstruct hlist_nulls_node **pprev;\n};\n\nstruct proto;\n\nstruct inet_timewait_death_row;\n\nstruct sock_common {\n\tunion {\n\t\t__addrpair skc_addrpair;\n\t\tstruct {\n\t\t\t__be32 skc_daddr;\n\t\t\t__be32 skc_rcv_saddr;\n\t\t};\n\t};\n\tunion {\n\t\tunsigned int skc_hash;\n\t\t__u16 skc_u16hashes[2];\n\t};\n\tunion {\n\t\t__portpair skc_portpair;\n\t\tstruct {\n\t\t\t__be16 skc_dport;\n\t\t\t__u16 skc_num;\n\t\t};\n\t};\n\tshort unsigned int skc_family;\n\tvolatile unsigned char skc_state;\n\tunsigned char skc_reuse: 4;\n\tunsigned char skc_reuseport: 1;\n\tunsigned char skc_ipv6only: 1;\n\tunsigned char skc_net_refcnt: 1;\n\tint skc_bound_dev_if;\n\tunion {\n\t\tstruct hlist_node skc_bind_node;\n\t\tstruct hlist_node skc_portaddr_node;\n\t};\n\tstruct proto *skc_prot;\n\tpossible_net_t skc_net;\n\tstruct in6_addr skc_v6_daddr;\n\tstruct in6_addr skc_v6_rcv_saddr;\n\tatomic64_t skc_cookie;\n\tunion {\n\t\tlong unsigned int skc_flags;\n\t\tstruct sock *skc_listener;\n\t\tstruct inet_timewait_death_row *skc_tw_dr;\n\t};\n\tint skc_dontcopy_begin[0];\n\tunion {\n\t\tstruct hlist_node skc_node;\n\t\tstruct hlist_nulls_node skc_nulls_node;\n\t};\n\tshort unsigned int skc_tx_queue_mapping;\n\tshort unsigned int skc_rx_queue_mapping;\n\tunion {\n\t\tint skc_incoming_cpu;\n\t\tu32 skc_rcv_wnd;\n\t\tu32 skc_tw_rcv_nxt;\n\t};\n\trefcount_t skc_refcnt;\n\tint skc_dontcopy_end[0];\n\tunion {\n\t\tu32 skc_rxhash;\n\t\tu32 skc_window_clamp;\n\t\tu32 skc_tw_snd_nxt;\n\t};\n};\n\nstruct page_frag {\n\tstruct page *page;\n\t__u32 offset;\n\t__u32 size;\n};\n\nstruct sock_cgroup_data {\n\tstruct cgroup *cgroup;\n\tu32 classid;\n\tu16 prioidx;\n};\n\nstruct dst_entry;\n\nstruct sk_filter;\n\nstruct socket_wq;\n\nstruct socket;\n\nstruct mem_cgroup;\n\nstruct xfrm_policy;\n\nstruct sock_reuseport;\n\nstruct bpf_local_storage;\n\nstruct sock {\n\tstruct sock_common __sk_common;\n\t__u8 __cacheline_group_begin__sock_write_rx[0];\n\tatomic_t sk_drops;\n\t__s32 sk_peek_off;\n\tstruct sk_buff_head sk_error_queue;\n\tstruct sk_buff_head sk_receive_queue;\n\tstruct {\n\t\tatomic_t rmem_alloc;\n\t\tint len;\n\t\tstruct sk_buff *head;\n\t\tstruct sk_buff *tail;\n\t} sk_backlog;\n\t__u8 __cacheline_group_end__sock_write_rx[0];\n\t__u8 __cacheline_group_begin__sock_read_rx[0];\n\tstruct dst_entry *sk_rx_dst;\n\tint sk_rx_dst_ifindex;\n\tu32 sk_rx_dst_cookie;\n\tunsigned int sk_ll_usec;\n\tunsigned int sk_napi_id;\n\tu16 sk_busy_poll_budget;\n\tu8 sk_prefer_busy_poll;\n\tu8 sk_userlocks;\n\tint sk_rcvbuf;\n\tstruct sk_filter *sk_filter;\n\tunion {\n\t\tstruct socket_wq *sk_wq;\n\t\tstruct socket_wq *sk_wq_raw;\n\t};\n\tvoid (*sk_data_ready)(struct sock *);\n\tlong int sk_rcvtimeo;\n\tint sk_rcvlowat;\n\t__u8 __cacheline_group_end__sock_read_rx[0];\n\t__u8 __cacheline_group_begin__sock_read_rxtx[0];\n\tint sk_err;\n\tstruct socket *sk_socket;\n\tstruct mem_cgroup *sk_memcg;\n\tstruct xfrm_policy *sk_policy[2];\n\t__u8 __cacheline_group_end__sock_read_rxtx[0];\n\t__u8 __cacheline_group_begin__sock_write_rxtx[0];\n\tsocket_lock_t sk_lock;\n\tu32 sk_reserved_mem;\n\tint sk_forward_alloc;\n\tu32 sk_tsflags;\n\t__u8 __cacheline_group_end__sock_write_rxtx[0];\n\t__u8 __cacheline_group_begin__sock_write_tx[0];\n\tint sk_write_pending;\n\tatomic_t sk_omem_alloc;\n\tint sk_sndbuf;\n\tint sk_wmem_queued;\n\trefcount_t sk_wmem_alloc;\n\tlong unsigned int sk_tsq_flags;\n\tunion {\n\t\tstruct sk_buff *sk_send_head;\n\t\tstruct rb_root tcp_rtx_queue;\n\t};\n\tstruct sk_buff_head sk_write_queue;\n\tu32 sk_dst_pending_confirm;\n\tu32 sk_pacing_status;\n\tstruct page_frag sk_frag;\n\tstruct timer_list sk_timer;\n\tlong unsigned int sk_pacing_rate;\n\tatomic_t sk_zckey;\n\tatomic_t sk_tskey;\n\t__u8 __cacheline_group_end__sock_write_tx[0];\n\t__u8 __cacheline_group_begin__sock_read_tx[0];\n\tlong unsigned int sk_max_pacing_rate;\n\tlong int sk_sndtimeo;\n\tu32 sk_priority;\n\tu32 sk_mark;\n\tstruct dst_entry *sk_dst_cache;\n\tnetdev_features_t sk_route_caps;\n\tstruct sk_buff * (*sk_validate_xmit_skb)(struct sock *, struct net_device *, struct sk_buff *);\n\tu16 sk_gso_type;\n\tu16 sk_gso_max_segs;\n\tunsigned int sk_gso_max_size;\n\tgfp_t sk_allocation;\n\tu32 sk_txhash;\n\tu8 sk_pacing_shift;\n\tbool sk_use_task_frag;\n\t__u8 __cacheline_group_end__sock_read_tx[0];\n\tu8 sk_gso_disabled: 1;\n\tu8 sk_kern_sock: 1;\n\tu8 sk_no_check_tx: 1;\n\tu8 sk_no_check_rx: 1;\n\tu8 sk_shutdown;\n\tu16 sk_type;\n\tu16 sk_protocol;\n\tlong unsigned int sk_lingertime;\n\tstruct proto *sk_prot_creator;\n\trwlock_t sk_callback_lock;\n\tint sk_err_soft;\n\tu32 sk_ack_backlog;\n\tu32 sk_max_ack_backlog;\n\tkuid_t sk_uid;\n\tspinlock_t sk_peer_lock;\n\tint sk_bind_phc;\n\tstruct pid *sk_peer_pid;\n\tconst struct cred *sk_peer_cred;\n\tktime_t sk_stamp;\n\tint sk_disconnects;\n\tu8 sk_txrehash;\n\tu8 sk_clockid;\n\tu8 sk_txtime_deadline_mode: 1;\n\tu8 sk_txtime_report_errors: 1;\n\tu8 sk_txtime_unused: 6;\n\tvoid *sk_user_data;\n\tvoid *sk_security;\n\tstruct sock_cgroup_data sk_cgrp_data;\n\tvoid (*sk_state_change)(struct sock *);\n\tvoid (*sk_write_space)(struct sock *);\n\tvoid (*sk_error_report)(struct sock *);\n\tint (*sk_backlog_rcv)(struct sock *, struct sk_buff *);\n\tvoid (*sk_destruct)(struct sock *);\n\tstruct sock_reuseport *sk_reuseport_cb;\n\tstruct bpf_local_storage *sk_bpf_storage;\n\tstruct callback_head sk_rcu;\n\tnetns_tracker ns_tracker;\n};\n\nstruct bpf_sock_addr {\n\t__u32 user_family;\n\t__u32 user_ip4;\n\t__u32 user_ip6[4];\n\t__u32 user_port;\n\t__u32 family;\n\t__u32 type;\n\t__u32 protocol;\n\t__u32 msg_src_ip4;\n\t__u32 msg_src_ip6[4];\n\tunion {\n\t\tstruct bpf_sock *sk;\n\t};\n};\n\nstruct bpf_sock_addr_kern {\n\tstruct sock *sk;\n\tstruct sockaddr *uaddr;\n\tu64 tmp_reg;\n\tvoid *t_ctx;\n\tu32 uaddrlen;\n};\n\nstruct bpf_sock_ops {\n\t__u32 op;\n\tunion {\n\t\t__u32 args[4];\n\t\t__u32 reply;\n\t\t__u32 replylong[4];\n\t};\n\t__u32 family;\n\t__u32 remote_ip4;\n\t__u32 local_ip4;\n\t__u32 remote_ip6[4];\n\t__u32 local_ip6[4];\n\t__u32 remote_port;\n\t__u32 local_port;\n\t__u32 is_fullsock;\n\t__u32 snd_cwnd;\n\t__u32 srtt_us;\n\t__u32 bpf_sock_ops_cb_flags;\n\t__u32 state;\n\t__u32 rtt_min;\n\t__u32 snd_ssthresh;\n\t__u32 rcv_nxt;\n\t__u32 snd_nxt;\n\t__u32 snd_una;\n\t__u32 mss_cache;\n\t__u32 ecn_flags;\n\t__u32 rate_delivered;\n\t__u32 rate_interval_us;\n\t__u32 packets_out;\n\t__u32 retrans_out;\n\t__u32 total_retrans;\n\t__u32 segs_in;\n\t__u32 data_segs_in;\n\t__u32 segs_out;\n\t__u32 data_segs_out;\n\t__u32 lost_out;\n\t__u32 sacked_out;\n\t__u32 sk_txhash;\n\t__u64 bytes_received;\n\t__u64 bytes_acked;\n\tunion {\n\t\tstruct bpf_sock *sk;\n\t};\n\tunion {\n\t\tvoid *skb_data;\n\t};\n\tunion {\n\t\tvoid *skb_data_end;\n\t};\n\t__u32 skb_len;\n\t__u32 skb_tcp_flags;\n\t__u64 skb_hwtstamp;\n};\n\nstruct bpf_sock_ops_kern {\n\tstruct sock *sk;\n\tunion {\n\t\tu32 args[4];\n\t\tu32 reply;\n\t\tu32 replylong[4];\n\t};\n\tstruct sk_buff *syn_skb;\n\tstruct sk_buff *skb;\n\tvoid *skb_data_end;\n\tu8 op;\n\tu8 is_fullsock;\n\tu8 remaining_opt_len;\n\tu64 temp;\n};\n\nstruct sk_msg_md {\n\tunion {\n\t\tvoid *data;\n\t};\n\tunion {\n\t\tvoid *data_end;\n\t};\n\t__u32 family;\n\t__u32 remote_ip4;\n\t__u32 local_ip4;\n\t__u32 remote_ip6[4];\n\t__u32 local_ip6[4];\n\t__u32 remote_port;\n\t__u32 local_port;\n\t__u32 size;\n\tunion {\n\t\tstruct bpf_sock *sk;\n\t};\n};\n\nstruct sk_msg_sg {\n\tu32 start;\n\tu32 curr;\n\tu32 end;\n\tu32 size;\n\tu32 copybreak;\n\tlong unsigned int copy[1];\n\tstruct scatterlist data[19];\n};\n\nstruct sk_msg {\n\tstruct sk_msg_sg sg;\n\tvoid *data;\n\tvoid *data_end;\n\tu32 apply_bytes;\n\tu32 cork_bytes;\n\tu32 flags;\n\tstruct sk_buff *skb;\n\tstruct sock *sk_redir;\n\tstruct sock *sk;\n\tstruct list_head list;\n};\n\nstruct bpf_flow_dissector {\n\tstruct bpf_flow_keys *flow_keys;\n\tconst struct sk_buff *skb;\n\tconst void *data;\n\tconst void *data_end;\n};\n\nstruct fred_cs {\n\tu64 cs: 16;\n\tu64 sl: 2;\n\tu64 wfe: 1;\n};\n\nstruct fred_ss {\n\tu64 ss: 16;\n\tu64 sti: 1;\n\tu64 swevent: 1;\n\tu64 nmi: 1;\n\tint: 13;\n\tu64 vector: 8;\n\tshort: 8;\n\tu64 type: 4;\n\tchar: 4;\n\tu64 enclave: 1;\n\tu64 lm: 1;\n\tu64 nested: 1;\n\tchar: 1;\n\tu64 insnlen: 4;\n};\n\nstruct pt_regs {\n\tlong unsigned int r15;\n\tlong unsigned int r14;\n\tlong unsigned int r13;\n\tlong unsigned int r12;\n\tlong unsigned int bp;\n\tlong unsigned int bx;\n\tlong unsigned int r11;\n\tlong unsigned int r10;\n\tlong unsigned int r9;\n\tlong unsigned int r8;\n\tlong unsigned int ax;\n\tlong unsigned int cx;\n\tlong unsigned int dx;\n\tlong unsigned int si;\n\tlong unsigned int di;\n\tlong unsigned int orig_ax;\n\tlong unsigned int ip;\n\tunion {\n\t\tu16 cs;\n\t\tu64 csx;\n\t\tstruct fred_cs fred_cs;\n\t};\n\tlong unsigned int flags;\n\tlong unsigned int sp;\n\tunion {\n\t\tu16 ss;\n\t\tu64 ssx;\n\t\tstruct fred_ss fred_ss;\n\t};\n};\n\ntypedef struct pt_regs bpf_user_pt_regs_t;\n\nstruct bpf_perf_event_data {\n\tbpf_user_pt_regs_t regs;\n\t__u64 sample_period;\n\t__u64 addr;\n};\n\nstruct perf_sample_data;\n\nstruct bpf_perf_event_data_kern {\n\tbpf_user_pt_regs_t *regs;\n\tstruct perf_sample_data *data;\n\tstruct perf_event *event;\n};\n\nstruct bpf_raw_tracepoint_args {\n\t__u64 args[0];\n};\n\nstruct bpf_sysctl {\n\t__u32 write;\n\t__u32 file_pos;\n};\n\nstruct ctl_table_header;\n\nstruct ctl_table;\n\nstruct bpf_sysctl_kern {\n\tstruct ctl_table_header *head;\n\tconst struct ctl_table *table;\n\tvoid *cur_val;\n\tsize_t cur_len;\n\tvoid *new_val;\n\tsize_t new_len;\n\tint new_updated;\n\tint write;\n\tloff_t *ppos;\n\tu64 tmp_reg;\n};\n\nstruct bpf_sockopt {\n\tunion {\n\t\tstruct bpf_sock *sk;\n\t};\n\tunion {\n\t\tvoid *optval;\n\t};\n\tunion {\n\t\tvoid *optval_end;\n\t};\n\t__s32 level;\n\t__s32 optname;\n\t__s32 optlen;\n\t__s32 retval;\n};\n\nstruct bpf_sockopt_kern {\n\tstruct sock *sk;\n\tu8 *optval;\n\tu8 *optval_end;\n\ts32 level;\n\ts32 optname;\n\ts32 optlen;\n\tstruct task_struct *current_task;\n\tu64 tmp_reg;\n};\n\nstruct sk_reuseport_md {\n\tunion {\n\t\tvoid *data;\n\t};\n\tunion {\n\t\tvoid *data_end;\n\t};\n\t__u32 len;\n\t__u32 eth_protocol;\n\t__u32 ip_protocol;\n\t__u32 bind_inany;\n\t__u32 hash;\n\tunion {\n\t\tstruct bpf_sock *sk;\n\t};\n\tunion {\n\t\tstruct bpf_sock *migrating_sk;\n\t};\n};\n\nstruct sk_reuseport_kern {\n\tstruct sk_buff *skb;\n\tstruct sock *sk;\n\tstruct sock *selected_sk;\n\tstruct sock *migrating_sk;\n\tvoid *data_end;\n\tu32 hash;\n\tu32 reuseport_id;\n\tbool bind_inany;\n};\n\nstruct bpf_sk_lookup {\n\tunion {\n\t\tunion {\n\t\t\tstruct bpf_sock *sk;\n\t\t};\n\t\t__u64 cookie;\n\t};\n\t__u32 family;\n\t__u32 protocol;\n\t__u32 remote_ip4;\n\t__u32 remote_ip6[4];\n\t__be16 remote_port;\n\t__u32 local_ip4;\n\t__u32 local_ip6[4];\n\t__u32 local_port;\n\t__u32 ingress_ifindex;\n};\n\nstruct bpf_sk_lookup_kern {\n\tu16 family;\n\tu16 protocol;\n\t__be16 sport;\n\tu16 dport;\n\tstruct {\n\t\t__be32 saddr;\n\t\t__be32 daddr;\n\t} v4;\n\tstruct {\n\t\tconst struct in6_addr *saddr;\n\t\tconst struct in6_addr *daddr;\n\t} v6;\n\tstruct sock *selected_sk;\n\tu32 ingress_ifindex;\n\tbool no_reuseport;\n};\n\nstruct nf_hook_state;\n\nstruct bpf_nf_ctx {\n\tconst struct nf_hook_state *state;\n\tstruct sk_buff *skb;\n};\n\nstruct bpf_ctx_convert {\n\tstruct __sk_buff BPF_PROG_TYPE_SOCKET_FILTER_prog;\n\tstruct sk_buff BPF_PROG_TYPE_SOCKET_FILTER_kern;\n\tstruct __sk_buff BPF_PROG_TYPE_SCHED_CLS_prog;\n\tstruct sk_buff BPF_PROG_TYPE_SCHED_CLS_kern;\n\tstruct __sk_buff BPF_PROG_TYPE_SCHED_ACT_prog;\n\tstruct sk_buff BPF_PROG_TYPE_SCHED_ACT_kern;\n\tstruct xdp_md BPF_PROG_TYPE_XDP_prog;\n\tstruct xdp_buff BPF_PROG_TYPE_XDP_kern;\n\tstruct __sk_buff BPF_PROG_TYPE_CGROUP_SKB_prog;\n\tstruct sk_buff BPF_PROG_TYPE_CGROUP_SKB_kern;\n\tstruct bpf_sock BPF_PROG_TYPE_CGROUP_SOCK_prog;\n\tstruct sock BPF_PROG_TYPE_CGROUP_SOCK_kern;\n\tstruct bpf_sock_addr BPF_PROG_TYPE_CGROUP_SOCK_ADDR_prog;\n\tstruct bpf_sock_addr_kern BPF_PROG_TYPE_CGROUP_SOCK_ADDR_kern;\n\tstruct __sk_buff BPF_PROG_TYPE_LWT_IN_prog;\n\tstruct sk_buff BPF_PROG_TYPE_LWT_IN_kern;\n\tstruct __sk_buff BPF_PROG_TYPE_LWT_OUT_prog;\n\tstruct sk_buff BPF_PROG_TYPE_LWT_OUT_kern;\n\tstruct __sk_buff BPF_PROG_TYPE_LWT_XMIT_prog;\n\tstruct sk_buff BPF_PROG_TYPE_LWT_XMIT_kern;\n\tstruct __sk_buff BPF_PROG_TYPE_LWT_SEG6LOCAL_prog;\n\tstruct sk_buff BPF_PROG_TYPE_LWT_SEG6LOCAL_kern;\n\tstruct bpf_sock_ops BPF_PROG_TYPE_SOCK_OPS_prog;\n\tstruct bpf_sock_ops_kern BPF_PROG_TYPE_SOCK_OPS_kern;\n\tstruct __sk_buff BPF_PROG_TYPE_SK_SKB_prog;\n\tstruct sk_buff BPF_PROG_TYPE_SK_SKB_kern;\n\tstruct sk_msg_md BPF_PROG_TYPE_SK_MSG_prog;\n\tstruct sk_msg BPF_PROG_TYPE_SK_MSG_kern;\n\tstruct __sk_buff BPF_PROG_TYPE_FLOW_DISSECTOR_prog;\n\tstruct bpf_flow_dissector BPF_PROG_TYPE_FLOW_DISSECTOR_kern;\n\tbpf_user_pt_regs_t BPF_PROG_TYPE_KPROBE_prog;\n\tstruct pt_regs BPF_PROG_TYPE_KPROBE_kern;\n\t__u64 BPF_PROG_TYPE_TRACEPOINT_prog;\n\tu64 BPF_PROG_TYPE_TRACEPOINT_kern;\n\tstruct bpf_perf_event_data BPF_PROG_TYPE_PERF_EVENT_prog;\n\tstruct bpf_perf_event_data_kern BPF_PROG_TYPE_PERF_EVENT_kern;\n\tstruct bpf_raw_tracepoint_args BPF_PROG_TYPE_RAW_TRACEPOINT_prog;\n\tu64 BPF_PROG_TYPE_RAW_TRACEPOINT_kern;\n\tstruct bpf_raw_tracepoint_args BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE_prog;\n\tu64 BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE_kern;\n\tvoid *BPF_PROG_TYPE_TRACING_prog;\n\tvoid *BPF_PROG_TYPE_TRACING_kern;\n\tstruct bpf_cgroup_dev_ctx BPF_PROG_TYPE_CGROUP_DEVICE_prog;\n\tstruct bpf_cgroup_dev_ctx BPF_PROG_TYPE_CGROUP_DEVICE_kern;\n\tstruct bpf_sysctl BPF_PROG_TYPE_CGROUP_SYSCTL_prog;\n\tstruct bpf_sysctl_kern BPF_PROG_TYPE_CGROUP_SYSCTL_kern;\n\tstruct bpf_sockopt BPF_PROG_TYPE_CGROUP_SOCKOPT_prog;\n\tstruct bpf_sockopt_kern BPF_PROG_TYPE_CGROUP_SOCKOPT_kern;\n\tstruct sk_reuseport_md BPF_PROG_TYPE_SK_REUSEPORT_prog;\n\tstruct sk_reuseport_kern BPF_PROG_TYPE_SK_REUSEPORT_kern;\n\tstruct bpf_sk_lookup BPF_PROG_TYPE_SK_LOOKUP_prog;\n\tstruct bpf_sk_lookup_kern BPF_PROG_TYPE_SK_LOOKUP_kern;\n\tvoid *BPF_PROG_TYPE_STRUCT_OPS_prog;\n\tvoid *BPF_PROG_TYPE_STRUCT_OPS_kern;\n\tvoid *BPF_PROG_TYPE_EXT_prog;\n\tvoid *BPF_PROG_TYPE_EXT_kern;\n\tvoid *BPF_PROG_TYPE_LSM_prog;\n\tvoid *BPF_PROG_TYPE_LSM_kern;\n\tvoid *BPF_PROG_TYPE_SYSCALL_prog;\n\tvoid *BPF_PROG_TYPE_SYSCALL_kern;\n\tstruct bpf_nf_ctx BPF_PROG_TYPE_NETFILTER_prog;\n\tstruct bpf_nf_ctx BPF_PROG_TYPE_NETFILTER_kern;\n};\n\nstruct bpf_devmap_val {\n\t__u32 ifindex;\n\tunion {\n\t\tint fd;\n\t\t__u32 id;\n\t} bpf_prog;\n};\n\nstruct bpf_dispatcher_prog {\n\tstruct bpf_prog *prog;\n\trefcount_t users;\n};\n\nstruct latch_tree_node {\n\tstruct rb_node node[2];\n};\n\nstruct bpf_ksym {\n\tlong unsigned int start;\n\tlong unsigned int end;\n\tchar name[512];\n\tstruct list_head lnode;\n\tstruct latch_tree_node tnode;\n\tbool prog;\n};\n\nstruct static_call_key;\n\nstruct bpf_dispatcher {\n\tstruct mutex mutex;\n\tvoid *func;\n\tstruct bpf_dispatcher_prog progs[48];\n\tint num_progs;\n\tvoid *image;\n\tvoid *rw_image;\n\tu32 image_off;\n\tstruct bpf_ksym ksym;\n\tstruct static_call_key *sc_key;\n\tvoid *sc_tramp;\n};\n\nstruct bpf_dtab_netdev;\n\nstruct bpf_dtab {\n\tstruct bpf_map map;\n\tstruct bpf_dtab_netdev **netdev_map;\n\tstruct list_head list;\n\tstruct hlist_head *dev_index_head;\n\tspinlock_t index_lock;\n\tunsigned int items;\n\tu32 n_buckets;\n};\n\nstruct bpf_dtab_netdev {\n\tstruct net_device *dev;\n\tstruct hlist_node index_hlist;\n\tstruct bpf_prog *xdp_prog;\n\tstruct callback_head rcu;\n\tunsigned int idx;\n\tstruct bpf_devmap_val val;\n};\n\nstruct bpf_dummy_ops_state;\n\nstruct bpf_dummy_ops {\n\tint (*test_1)(struct bpf_dummy_ops_state *);\n\tint (*test_2)(struct bpf_dummy_ops_state *, int, short unsigned int, char, long unsigned int);\n\tint (*test_sleepable)(struct bpf_dummy_ops_state *);\n};\n\nstruct bpf_dummy_ops_state {\n\tint val;\n};\n\nstruct bpf_dummy_ops_test_args {\n\tu64 args[12];\n\tstruct bpf_dummy_ops_state state;\n};\n\nstruct bpf_dynptr {\n\t__u64 __opaque[2];\n};\n\nstruct bpf_dynptr_kern {\n\tvoid *data;\n\tu32 size;\n\tu32 offset;\n};\n\nstruct bpf_prog_array_item {\n\tstruct bpf_prog *prog;\n\tunion {\n\t\tstruct bpf_cgroup_storage *cgroup_storage[2];\n\t\tu64 bpf_cookie;\n\t};\n};\n\nstruct bpf_prog_array {\n\tstruct callback_head rcu;\n\tstruct bpf_prog_array_item items[0];\n};\n\nstruct bpf_empty_prog_array {\n\tstruct bpf_prog_array hdr;\n\tstruct bpf_prog *null_prog;\n};\n\nstruct bpf_event_entry {\n\tstruct perf_event *event;\n\tstruct file *perf_file;\n\tstruct file *map_file;\n\tstruct callback_head rcu;\n};\n\nstruct bpf_fentry_test_t {\n\tstruct bpf_fentry_test_t *a;\n};\n\nstruct bpf_fib_lookup {\n\t__u8 family;\n\t__u8 l4_protocol;\n\t__be16 sport;\n\t__be16 dport;\n\tunion {\n\t\t__u16 tot_len;\n\t\t__u16 mtu_result;\n\t};\n\t__u32 ifindex;\n\tunion {\n\t\t__u8 tos;\n\t\t__be32 flowinfo;\n\t\t__u32 rt_metric;\n\t};\n\tunion {\n\t\t__be32 ipv4_src;\n\t\t__u32 ipv6_src[4];\n\t};\n\tunion {\n\t\t__be32 ipv4_dst;\n\t\t__u32 ipv6_dst[4];\n\t};\n\tunion {\n\t\tstruct {\n\t\t\t__be16 h_vlan_proto;\n\t\t\t__be16 h_vlan_TCI;\n\t\t};\n\t\t__u32 tbid;\n\t};\n\tunion {\n\t\tstruct {\n\t\t\t__u32 mark;\n\t\t};\n\t\tstruct {\n\t\t\t__u8 smac[6];\n\t\t\t__u8 dmac[6];\n\t\t};\n\t};\n};\n\nstruct bpf_flow_keys {\n\t__u16 nhoff;\n\t__u16 thoff;\n\t__u16 addr_proto;\n\t__u8 is_frag;\n\t__u8 is_first_frag;\n\t__u8 is_encap;\n\t__u8 ip_proto;\n\t__be16 n_proto;\n\t__be16 sport;\n\t__be16 dport;\n\tunion {\n\t\tstruct {\n\t\t\t__be32 ipv4_src;\n\t\t\t__be32 ipv4_dst;\n\t\t};\n\t\tstruct {\n\t\t\t__u32 ipv6_src[4];\n\t\t\t__u32 ipv6_dst[4];\n\t\t};\n\t};\n\t__u32 flags;\n\t__be32 flow_label;\n};\n\nstruct bpf_func_info {\n\t__u32 insn_off;\n\t__u32 type_id;\n};\n\nstruct bpf_func_info_aux {\n\tu16 linkage;\n\tbool unreliable;\n\tbool called: 1;\n\tbool verified: 1;\n};\n\nstruct bpf_func_proto {\n\tu64 (*func)(u64, u64, u64, u64, u64);\n\tbool gpl_only;\n\tbool pkt_access;\n\tbool might_sleep;\n\tenum bpf_return_type ret_type;\n\tunion {\n\t\tstruct {\n\t\t\tenum bpf_arg_type arg1_type;\n\t\t\tenum bpf_arg_type arg2_type;\n\t\t\tenum bpf_arg_type arg3_type;\n\t\t\tenum bpf_arg_type arg4_type;\n\t\t\tenum bpf_arg_type arg5_type;\n\t\t};\n\t\tenum bpf_arg_type arg_type[5];\n\t};\n\tunion {\n\t\tstruct {\n\t\t\tu32 *arg1_btf_id;\n\t\t\tu32 *arg2_btf_id;\n\t\t\tu32 *arg3_btf_id;\n\t\t\tu32 *arg4_btf_id;\n\t\t\tu32 *arg5_btf_id;\n\t\t};\n\t\tu32 *arg_btf_id[5];\n\t\tstruct {\n\t\t\tsize_t arg1_size;\n\t\t\tsize_t arg2_size;\n\t\t\tsize_t arg3_size;\n\t\t\tsize_t arg4_size;\n\t\t\tsize_t arg5_size;\n\t\t};\n\t\tsize_t arg_size[5];\n\t};\n\tint *ret_btf_id;\n\tbool (*allowed)(const struct bpf_prog *);\n};\n\nstruct tnum {\n\tu64 value;\n\tu64 mask;\n};\n\nstruct bpf_reg_state {\n\tenum bpf_reg_type type;\n\ts32 off;\n\tunion {\n\t\tint range;\n\t\tstruct {\n\t\t\tstruct bpf_map *map_ptr;\n\t\t\tu32 map_uid;\n\t\t};\n\t\tstruct {\n\t\t\tstruct btf *btf;\n\t\t\tu32 btf_id;\n\t\t};\n\t\tstruct {\n\t\t\tu32 mem_size;\n\t\t\tu32 dynptr_id;\n\t\t};\n\t\tstruct {\n\t\t\tenum bpf_dynptr_type type;\n\t\t\tbool first_slot;\n\t\t} dynptr;\n\t\tstruct {\n\t\t\tstruct btf *btf;\n\t\t\tu32 btf_id;\n\t\t\tenum bpf_iter_state state: 2;\n\t\t\tint depth: 30;\n\t\t} iter;\n\t\tstruct {\n\t\t\tlong unsigned int raw1;\n\t\t\tlong unsigned int raw2;\n\t\t} raw;\n\t\tu32 subprogno;\n\t};\n\tstruct tnum var_off;\n\ts64 smin_value;\n\ts64 smax_value;\n\tu64 umin_value;\n\tu64 umax_value;\n\ts32 s32_min_value;\n\ts32 s32_max_value;\n\tu32 u32_min_value;\n\tu32 u32_max_value;\n\tu32 id;\n\tu32 ref_obj_id;\n\tstruct bpf_reg_state *parent;\n\tu32 frameno;\n\ts32 subreg_def;\n\tenum bpf_reg_liveness live;\n\tbool precise;\n};\n\nstruct bpf_retval_range {\n\ts32 minval;\n\ts32 maxval;\n};\n\nstruct bpf_reference_state;\n\nstruct bpf_stack_state;\n\nstruct bpf_func_state {\n\tstruct bpf_reg_state regs[11];\n\tint callsite;\n\tu32 frameno;\n\tu32 subprogno;\n\tu32 async_entry_cnt;\n\tstruct bpf_retval_range callback_ret_range;\n\tbool in_callback_fn;\n\tbool in_async_callback_fn;\n\tbool in_exception_callback_fn;\n\tu32 callback_depth;\n\tint acquired_refs;\n\tstruct bpf_reference_state *refs;\n\tstruct bpf_stack_state *stack;\n\tint allocated_stack;\n};\n\nstruct bpf_hrtimer {\n\tstruct bpf_async_cb cb;\n\tstruct hrtimer timer;\n\tatomic_t cancelling;\n};\n\nstruct bpf_mem_caches;\n\nstruct bpf_mem_cache;\n\nstruct bpf_mem_alloc {\n\tstruct bpf_mem_caches *caches;\n\tstruct bpf_mem_cache *cache;\n\tstruct obj_cgroup *objcg;\n\tbool percpu;\n\tstruct work_struct work;\n};\n\nstruct pcpu_freelist_node;\n\nstruct pcpu_freelist_head {\n\tstruct pcpu_freelist_node *first;\n\traw_spinlock_t lock;\n};\n\nstruct pcpu_freelist {\n\tstruct pcpu_freelist_head *freelist;\n\tstruct pcpu_freelist_head extralist;\n};\n\nstruct bpf_lru_node;\n\ntypedef bool (*del_from_htab_func)(void *, struct bpf_lru_node *);\n\nstruct bpf_lru {\n\tunion {\n\t\tstruct bpf_common_lru common_lru;\n\t\tstruct bpf_lru_list *percpu_lru;\n\t};\n\tdel_from_htab_func del_from_htab;\n\tvoid *del_arg;\n\tunsigned int hash_offset;\n\tunsigned int nr_scans;\n\tbool percpu;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct bucket;\n\nstruct htab_elem;\n\nstruct bpf_htab {\n\tstruct bpf_map map;\n\tstruct bpf_mem_alloc ma;\n\tstruct bpf_mem_alloc pcpu_ma;\n\tstruct bucket *buckets;\n\tvoid *elems;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tunion {\n\t\tstruct pcpu_freelist freelist;\n\t\tstruct bpf_lru lru;\n\t};\n\tstruct htab_elem **extra_elems;\n\tstruct percpu_counter pcount;\n\tatomic_t count;\n\tbool use_percpu_counter;\n\tu32 n_buckets;\n\tu32 elem_size;\n\tu32 hashrnd;\n\tstruct lock_class_key lockdep_key;\n\tint *map_locked[8];\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct bpf_id_pair {\n\tu32 old;\n\tu32 cur;\n};\n\nstruct bpf_idmap {\n\tu32 tmp_id_gen;\n\tstruct bpf_id_pair map[600];\n};\n\nstruct bpf_idset {\n\tu32 count;\n\tu32 ids[600];\n};\n\nstruct bpf_insn {\n\t__u8 code;\n\t__u8 dst_reg: 4;\n\t__u8 src_reg: 4;\n\t__s16 off;\n\t__s32 imm;\n};\n\nstruct bpf_insn_access_aux {\n\tenum bpf_reg_type reg_type;\n\tbool is_ldsx;\n\tunion {\n\t\tint ctx_field_size;\n\t\tstruct {\n\t\t\tstruct btf *btf;\n\t\t\tu32 btf_id;\n\t\t};\n\t};\n\tstruct bpf_verifier_log *log;\n\tbool is_retval;\n};\n\nstruct bpf_map_ptr_state {\n\tstruct bpf_map *map_ptr;\n\tbool poison;\n\tbool unpriv;\n};\n\nstruct bpf_loop_inline_state {\n\tunsigned int initialized: 1;\n\tunsigned int fit_for_inline: 1;\n\tu32 callback_subprogno;\n};\n\nstruct btf_struct_meta;\n\nstruct bpf_insn_aux_data {\n\tunion {\n\t\tenum bpf_reg_type ptr_type;\n\t\tstruct bpf_map_ptr_state map_ptr_state;\n\t\ts32 call_imm;\n\t\tu32 alu_limit;\n\t\tstruct {\n\t\t\tu32 map_index;\n\t\t\tu32 map_off;\n\t\t};\n\t\tstruct {\n\t\t\tenum bpf_reg_type reg_type;\n\t\t\tunion {\n\t\t\t\tstruct {\n\t\t\t\t\tstruct btf *btf;\n\t\t\t\t\tu32 btf_id;\n\t\t\t\t};\n\t\t\t\tu32 mem_size;\n\t\t\t};\n\t\t} btf_var;\n\t\tstruct bpf_loop_inline_state loop_inline_state;\n\t};\n\tunion {\n\t\tu64 obj_new_size;\n\t\tu64 insert_off;\n\t};\n\tstruct btf_struct_meta *kptr_struct_meta;\n\tu64 map_key_state;\n\tint ctx_field_size;\n\tu32 seen;\n\tbool sanitize_stack_spill;\n\tbool zext_dst;\n\tbool needs_zext;\n\tbool storage_get_func_atomic;\n\tbool is_iter_next;\n\tbool call_with_percpu_alloc_ptr;\n\tu8 alu_state;\n\tunsigned int orig_idx;\n\tbool jmp_point;\n\tbool prune_point;\n\tbool force_checkpoint;\n\tbool calls_callback;\n};\n\ntypedef void (*bpf_insn_print_t)(void *, const char *, ...);\n\ntypedef const char * (*bpf_insn_revmap_call_t)(void *, const struct bpf_insn *);\n\ntypedef const char * (*bpf_insn_print_imm_t)(void *, const struct bpf_insn *, __u64);\n\nstruct bpf_insn_cbs {\n\tbpf_insn_print_t cb_print;\n\tbpf_insn_revmap_call_t cb_call;\n\tbpf_insn_print_imm_t cb_imm;\n\tvoid *private_data;\n};\n\nstruct bpf_iter_meta;\n\nstruct bpf_iter__bpf_link {\n\tunion {\n\t\tstruct bpf_iter_meta *meta;\n\t};\n\tunion {\n\t\tstruct bpf_link *link;\n\t};\n};\n\nstruct bpf_iter__bpf_map {\n\tunion {\n\t\tstruct bpf_iter_meta *meta;\n\t};\n\tunion {\n\t\tstruct bpf_map *map;\n\t};\n};\n\nstruct bpf_iter__bpf_map_elem {\n\tunion {\n\t\tstruct bpf_iter_meta *meta;\n\t};\n\tunion {\n\t\tstruct bpf_map *map;\n\t};\n\tunion {\n\t\tvoid *key;\n\t};\n\tunion {\n\t\tvoid *value;\n\t};\n};\n\nstruct bpf_iter__bpf_prog {\n\tunion {\n\t\tstruct bpf_iter_meta *meta;\n\t};\n\tunion {\n\t\tstruct bpf_prog *prog;\n\t};\n};\n\nstruct bpf_iter__bpf_sk_storage_map {\n\tunion {\n\t\tstruct bpf_iter_meta *meta;\n\t};\n\tunion {\n\t\tstruct bpf_map *map;\n\t};\n\tunion {\n\t\tstruct sock *sk;\n\t};\n\tunion {\n\t\tvoid *value;\n\t};\n};\n\nstruct bpf_iter__cgroup {\n\tunion {\n\t\tstruct bpf_iter_meta *meta;\n\t};\n\tunion {\n\t\tstruct cgroup *cgroup;\n\t};\n};\n\nstruct fib6_info;\n\nstruct bpf_iter__ipv6_route {\n\tunion {\n\t\tstruct bpf_iter_meta *meta;\n\t};\n\tunion {\n\t\tstruct fib6_info *rt;\n\t};\n};\n\nstruct kallsym_iter;\n\nstruct bpf_iter__ksym {\n\tunion {\n\t\tstruct bpf_iter_meta *meta;\n\t};\n\tunion {\n\t\tstruct kallsym_iter *ksym;\n\t};\n};\n\nstruct netlink_sock;\n\nstruct bpf_iter__netlink {\n\tunion {\n\t\tstruct bpf_iter_meta *meta;\n\t};\n\tunion {\n\t\tstruct netlink_sock *sk;\n\t};\n};\n\nstruct bpf_iter__sockmap {\n\tunion {\n\t\tstruct bpf_iter_meta *meta;\n\t};\n\tunion {\n\t\tstruct bpf_map *map;\n\t};\n\tunion {\n\t\tvoid *key;\n\t};\n\tunion {\n\t\tstruct sock *sk;\n\t};\n};\n\nstruct bpf_iter__task {\n\tunion {\n\t\tstruct bpf_iter_meta *meta;\n\t};\n\tunion {\n\t\tstruct task_struct *task;\n\t};\n};\n\nstruct bpf_iter__task__safe_trusted {\n\tstruct bpf_iter_meta *meta;\n\tstruct task_struct *task;\n};\n\nstruct bpf_iter__task_file {\n\tunion {\n\t\tstruct bpf_iter_meta *meta;\n\t};\n\tunion {\n\t\tstruct task_struct *task;\n\t};\n\tu32 fd;\n\tunion {\n\t\tstruct file *file;\n\t};\n};\n\nstruct bpf_iter__task_vma {\n\tunion {\n\t\tstruct bpf_iter_meta *meta;\n\t};\n\tunion {\n\t\tstruct task_struct *task;\n\t};\n\tunion {\n\t\tstruct vm_area_struct *vma;\n\t};\n};\n\nstruct bpf_iter__tcp {\n\tunion {\n\t\tstruct bpf_iter_meta *meta;\n\t};\n\tunion {\n\t\tstruct sock_common *sk_common;\n\t};\n\tuid_t uid;\n};\n\nstruct udp_sock;\n\nstruct bpf_iter__udp {\n\tunion {\n\t\tstruct bpf_iter_meta *meta;\n\t};\n\tunion {\n\t\tstruct udp_sock *udp_sk;\n\t};\n\tuid_t uid;\n\tlong: 0;\n\tint bucket;\n};\n\nstruct unix_sock;\n\nstruct bpf_iter__unix {\n\tunion {\n\t\tstruct bpf_iter_meta *meta;\n\t};\n\tunion {\n\t\tstruct unix_sock *unix_sk;\n\t};\n\tuid_t uid;\n};\n\nstruct bpf_iter_aux_info {\n\tstruct bpf_map *map;\n\tstruct {\n\t\tstruct cgroup *start;\n\t\tenum bpf_cgroup_iter_order order;\n\t} cgroup;\n\tstruct {\n\t\tenum bpf_iter_task_type type;\n\t\tu32 pid;\n\t} task;\n};\n\nstruct bpf_iter_bits {\n\t__u64 __opaque[2];\n};\n\nstruct bpf_iter_bits_kern {\n\tunion {\n\t\tlong unsigned int *bits;\n\t\tlong unsigned int bits_copy;\n\t};\n\tint nr_bits;\n\tint bit;\n};\n\nstruct bpf_iter_css {\n\t__u64 __opaque[3];\n};\n\nstruct bpf_iter_css_kern {\n\tstruct cgroup_subsys_state *start;\n\tstruct cgroup_subsys_state *pos;\n\tunsigned int flags;\n};\n\nstruct bpf_iter_css_task {\n\t__u64 __opaque[1];\n};\n\nstruct css_task_iter;\n\nstruct bpf_iter_css_task_kern {\n\tstruct css_task_iter *css_it;\n};\n\nstruct bpf_iter_target_info;\n\nstruct bpf_iter_link {\n\tstruct bpf_link link;\n\tstruct bpf_iter_aux_info aux;\n\tstruct bpf_iter_target_info *tinfo;\n};\n\nunion bpf_iter_link_info {\n\tstruct {\n\t\t__u32 map_fd;\n\t} map;\n\tstruct {\n\t\tenum bpf_cgroup_iter_order order;\n\t\t__u32 cgroup_fd;\n\t\t__u64 cgroup_id;\n\t} cgroup;\n\tstruct {\n\t\t__u32 tid;\n\t\t__u32 pid;\n\t\t__u32 pid_fd;\n\t} task;\n};\n\nstruct bpf_iter_meta {\n\tunion {\n\t\tstruct seq_file *seq;\n\t};\n\tu64 session_id;\n\tu64 seq_num;\n};\n\nstruct bpf_iter_meta__safe_trusted {\n\tstruct seq_file *seq;\n};\n\nstruct bpf_iter_num {\n\t__u64 __opaque[1];\n};\n\nstruct bpf_iter_num_kern {\n\tint cur;\n\tint end;\n};\n\nstruct bpf_iter_seq_info;\n\nstruct bpf_iter_priv_data {\n\tstruct bpf_iter_target_info *tinfo;\n\tconst struct bpf_iter_seq_info *seq_info;\n\tstruct bpf_prog *prog;\n\tu64 session_id;\n\tu64 seq_num;\n\tbool done_stop;\n\tlong: 0;\n\tu8 target_private[0];\n};\n\ntypedef int (*bpf_iter_attach_target_t)(struct bpf_prog *, union bpf_iter_link_info *, struct bpf_iter_aux_info *);\n\ntypedef void (*bpf_iter_detach_target_t)(struct bpf_iter_aux_info *);\n\ntypedef void (*bpf_iter_show_fdinfo_t)(const struct bpf_iter_aux_info *, struct seq_file *);\n\nstruct bpf_link_info;\n\ntypedef int (*bpf_iter_fill_link_info_t)(const struct bpf_iter_aux_info *, struct bpf_link_info *);\n\ntypedef const struct bpf_func_proto * (*bpf_iter_get_func_proto_t)(enum bpf_func_id, const struct bpf_prog *);\n\nstruct bpf_iter_reg {\n\tconst char *target;\n\tbpf_iter_attach_target_t attach_target;\n\tbpf_iter_detach_target_t detach_target;\n\tbpf_iter_show_fdinfo_t show_fdinfo;\n\tbpf_iter_fill_link_info_t fill_link_info;\n\tbpf_iter_get_func_proto_t get_func_proto;\n\tu32 ctx_arg_info_size;\n\tu32 feature;\n\tstruct bpf_ctx_arg_aux ctx_arg_info[2];\n\tconst struct bpf_iter_seq_info *seq_info;\n};\n\nstruct bpf_iter_seq_array_map_info {\n\tstruct bpf_map *map;\n\tvoid *percpu_value_buf;\n\tu32 index;\n};\n\nstruct bpf_iter_seq_hash_map_info {\n\tstruct bpf_map *map;\n\tstruct bpf_htab *htab;\n\tvoid *percpu_value_buf;\n\tu32 bucket_id;\n\tu32 skip_elems;\n};\n\ntypedef int (*bpf_iter_init_seq_priv_t)(void *, struct bpf_iter_aux_info *);\n\ntypedef void (*bpf_iter_fini_seq_priv_t)(void *);\n\nstruct bpf_iter_seq_info {\n\tconst struct seq_operations *seq_ops;\n\tbpf_iter_init_seq_priv_t init_seq_private;\n\tbpf_iter_fini_seq_priv_t fini_seq_private;\n\tu32 seq_priv_size;\n};\n\nstruct bpf_iter_seq_link_info {\n\tu32 link_id;\n};\n\nstruct bpf_iter_seq_map_info {\n\tu32 map_id;\n};\n\nstruct bpf_iter_seq_prog_info {\n\tu32 prog_id;\n};\n\nstruct bpf_iter_seq_sk_storage_map_info {\n\tstruct bpf_map *map;\n\tunsigned int bucket_id;\n\tunsigned int skip_elems;\n};\n\nstruct pid_namespace;\n\nstruct bpf_iter_seq_task_common {\n\tstruct pid_namespace *ns;\n\tenum bpf_iter_task_type type;\n\tu32 pid;\n\tu32 pid_visiting;\n};\n\nstruct bpf_iter_seq_task_file_info {\n\tstruct bpf_iter_seq_task_common common;\n\tstruct task_struct *task;\n\tu32 tid;\n\tu32 fd;\n};\n\nstruct bpf_iter_seq_task_info {\n\tstruct bpf_iter_seq_task_common common;\n\tu32 tid;\n};\n\nstruct bpf_iter_seq_task_vma_info {\n\tstruct bpf_iter_seq_task_common common;\n\tstruct task_struct *task;\n\tstruct mm_struct *mm;\n\tstruct vm_area_struct *vma;\n\tu32 tid;\n\tlong unsigned int prev_vm_start;\n\tlong unsigned int prev_vm_end;\n};\n\nstruct bpf_iter_target_info {\n\tstruct list_head list;\n\tconst struct bpf_iter_reg *reg_info;\n\tu32 btf_id;\n};\n\nstruct bpf_iter_task {\n\t__u64 __opaque[3];\n};\n\nstruct bpf_iter_task_kern {\n\tstruct task_struct *task;\n\tstruct task_struct *pos;\n\tunsigned int flags;\n};\n\nstruct bpf_iter_task_vma {\n\t__u64 __opaque[1];\n};\n\nstruct bpf_iter_task_vma_kern_data;\n\nstruct bpf_iter_task_vma_kern {\n\tstruct bpf_iter_task_vma_kern_data *data;\n};\n\nstruct maple_enode;\n\nstruct maple_alloc;\n\nstruct ma_state {\n\tstruct maple_tree *tree;\n\tlong unsigned int index;\n\tlong unsigned int last;\n\tstruct maple_enode *node;\n\tlong unsigned int min;\n\tlong unsigned int max;\n\tstruct maple_alloc *alloc;\n\tenum maple_status status;\n\tunsigned char depth;\n\tunsigned char offset;\n\tunsigned char mas_flags;\n\tunsigned char end;\n};\n\nstruct vma_iterator {\n\tstruct ma_state mas;\n};\n\nstruct mmap_unlock_irq_work;\n\nstruct bpf_iter_task_vma_kern_data {\n\tstruct task_struct *task;\n\tstruct mm_struct *mm;\n\tstruct mmap_unlock_irq_work *work;\n\tstruct vma_iterator vmi;\n};\n\nstruct bpf_jit_poke_descriptor {\n\tvoid *tailcall_target;\n\tvoid *tailcall_bypass;\n\tvoid *bypass_addr;\n\tvoid *aux;\n\tunion {\n\t\tstruct {\n\t\t\tstruct bpf_map *map;\n\t\t\tu32 key;\n\t\t} tail_call;\n\t};\n\tbool tailcall_target_stable;\n\tu8 adj_off;\n\tu16 reason;\n\tu32 insn_idx;\n};\n\nstruct bpf_jmp_history_entry {\n\tu32 idx;\n\tu32 prev_idx: 22;\n\tu32 flags: 10;\n};\n\nstruct bpf_key {\n\tstruct key *key;\n\tbool has_ref;\n};\n\nstruct bpf_kfunc_btf {\n\tstruct btf *btf;\n\tstruct module *module;\n\tu16 offset;\n};\n\nstruct bpf_kfunc_btf_tab {\n\tstruct bpf_kfunc_btf descs[256];\n\tu32 nr_descs;\n};\n\nstruct bpf_kfunc_call_arg_meta {\n\tstruct btf *btf;\n\tu32 func_id;\n\tu32 kfunc_flags;\n\tconst struct btf_type *func_proto;\n\tconst char *func_name;\n\tu32 ref_obj_id;\n\tu8 release_regno;\n\tbool r0_rdonly;\n\tu32 ret_btf_id;\n\tu64 r0_size;\n\tu32 subprogno;\n\tstruct {\n\t\tu64 value;\n\t\tbool found;\n\t} arg_constant;\n\tstruct btf *arg_btf;\n\tu32 arg_btf_id;\n\tbool arg_owning_ref;\n\tstruct {\n\t\tstruct btf_field *field;\n\t} arg_list_head;\n\tstruct {\n\t\tstruct btf_field *field;\n\t} arg_rbtree_root;\n\tstruct {\n\t\tenum bpf_dynptr_type type;\n\t\tu32 id;\n\t\tu32 ref_obj_id;\n\t} initialized_dynptr;\n\tstruct {\n\t\tu8 spi;\n\t\tu8 frameno;\n\t} iter;\n\tstruct {\n\t\tstruct bpf_map *ptr;\n\t\tint uid;\n\t} map;\n\tu64 mem_size;\n};\n\nstruct bpf_kfunc_desc {\n\tstruct btf_func_model func_model;\n\tu32 func_id;\n\ts32 imm;\n\tu16 offset;\n\tlong unsigned int addr;\n};\n\nstruct bpf_kfunc_desc_tab {\n\tstruct bpf_kfunc_desc descs[256];\n\tu32 nr_descs;\n};\n\nstruct ftrace_ops;\n\nstruct ftrace_regs;\n\ntypedef void (*ftrace_func_t)(long unsigned int, long unsigned int, struct ftrace_ops *, struct ftrace_regs *);\n\nstruct ftrace_hash;\n\nstruct ftrace_ops_hash {\n\tstruct ftrace_hash *notrace_hash;\n\tstruct ftrace_hash *filter_hash;\n\tstruct mutex regex_lock;\n};\n\ntypedef int (*ftrace_ops_func_t)(struct ftrace_ops *, enum ftrace_ops_cmd);\n\nstruct ftrace_ops {\n\tftrace_func_t func;\n\tstruct ftrace_ops *next;\n\tlong unsigned int flags;\n\tvoid *private;\n\tftrace_func_t saved_func;\n\tstruct ftrace_ops_hash local_hash;\n\tstruct ftrace_ops_hash *func_hash;\n\tstruct ftrace_ops_hash old_hash;\n\tlong unsigned int trampoline;\n\tlong unsigned int trampoline_size;\n\tstruct list_head list;\n\tstruct list_head subop_list;\n\tftrace_ops_func_t ops_func;\n\tstruct ftrace_ops *managed;\n\tlong unsigned int direct_call;\n};\n\nstruct fprobe;\n\ntypedef int (*fprobe_entry_cb)(struct fprobe *, long unsigned int, long unsigned int, struct pt_regs *, void *);\n\ntypedef void (*fprobe_exit_cb)(struct fprobe *, long unsigned int, long unsigned int, struct pt_regs *, void *);\n\nstruct rethook;\n\nstruct fprobe {\n\tstruct ftrace_ops ops;\n\tlong unsigned int nmissed;\n\tunsigned int flags;\n\tstruct rethook *rethook;\n\tsize_t entry_data_size;\n\tint nr_maxactive;\n\tfprobe_entry_cb entry_handler;\n\tfprobe_exit_cb exit_handler;\n};\n\nstruct bpf_kprobe_multi_link {\n\tstruct bpf_link link;\n\tstruct fprobe fp;\n\tlong unsigned int *addrs;\n\tu64 *cookies;\n\tu32 cnt;\n\tu32 mods_cnt;\n\tstruct module **mods;\n\tu32 flags;\n};\n\nstruct bpf_session_run_ctx {\n\tstruct bpf_run_ctx run_ctx;\n\tbool is_return;\n\tvoid *data;\n};\n\nstruct bpf_kprobe_multi_run_ctx {\n\tstruct bpf_session_run_ctx session_ctx;\n\tstruct bpf_kprobe_multi_link *link;\n\tlong unsigned int entry_ip;\n};\n\nstruct bpf_line_info {\n\t__u32 insn_off;\n\t__u32 file_name_off;\n\t__u32 line_off;\n\t__u32 line_col;\n};\n\nstruct bpf_link_info {\n\t__u32 type;\n\t__u32 id;\n\t__u32 prog_id;\n\tunion {\n\t\tstruct {\n\t\t\t__u64 tp_name;\n\t\t\t__u32 tp_name_len;\n\t\t} raw_tracepoint;\n\t\tstruct {\n\t\t\t__u32 attach_type;\n\t\t\t__u32 target_obj_id;\n\t\t\t__u32 target_btf_id;\n\t\t} tracing;\n\t\tstruct {\n\t\t\t__u64 cgroup_id;\n\t\t\t__u32 attach_type;\n\t\t} cgroup;\n\t\tstruct {\n\t\t\t__u64 target_name;\n\t\t\t__u32 target_name_len;\n\t\t\tunion {\n\t\t\t\tstruct {\n\t\t\t\t\t__u32 map_id;\n\t\t\t\t} map;\n\t\t\t};\n\t\t\tunion {\n\t\t\t\tstruct {\n\t\t\t\t\t__u64 cgroup_id;\n\t\t\t\t\t__u32 order;\n\t\t\t\t} cgroup;\n\t\t\t\tstruct {\n\t\t\t\t\t__u32 tid;\n\t\t\t\t\t__u32 pid;\n\t\t\t\t} task;\n\t\t\t};\n\t\t} iter;\n\t\tstruct {\n\t\t\t__u32 netns_ino;\n\t\t\t__u32 attach_type;\n\t\t} netns;\n\t\tstruct {\n\t\t\t__u32 ifindex;\n\t\t} xdp;\n\t\tstruct {\n\t\t\t__u32 map_id;\n\t\t} struct_ops;\n\t\tstruct {\n\t\t\t__u32 pf;\n\t\t\t__u32 hooknum;\n\t\t\t__s32 priority;\n\t\t\t__u32 flags;\n\t\t} netfilter;\n\t\tstruct {\n\t\t\t__u64 addrs;\n\t\t\t__u32 count;\n\t\t\t__u32 flags;\n\t\t\t__u64 missed;\n\t\t\t__u64 cookies;\n\t\t} kprobe_multi;\n\t\tstruct {\n\t\t\t__u64 path;\n\t\t\t__u64 offsets;\n\t\t\t__u64 ref_ctr_offsets;\n\t\t\t__u64 cookies;\n\t\t\t__u32 path_size;\n\t\t\t__u32 count;\n\t\t\t__u32 flags;\n\t\t\t__u32 pid;\n\t\t} uprobe_multi;\n\t\tstruct {\n\t\t\t__u32 type;\n\t\t\tunion {\n\t\t\t\tstruct {\n\t\t\t\t\t__u64 file_name;\n\t\t\t\t\t__u32 name_len;\n\t\t\t\t\t__u32 offset;\n\t\t\t\t\t__u64 cookie;\n\t\t\t\t} uprobe;\n\t\t\t\tstruct {\n\t\t\t\t\t__u64 func_name;\n\t\t\t\t\t__u32 name_len;\n\t\t\t\t\t__u32 offset;\n\t\t\t\t\t__u64 addr;\n\t\t\t\t\t__u64 missed;\n\t\t\t\t\t__u64 cookie;\n\t\t\t\t} kprobe;\n\t\t\t\tstruct {\n\t\t\t\t\t__u64 tp_name;\n\t\t\t\t\t__u32 name_len;\n\t\t\t\t\t__u64 cookie;\n\t\t\t\t} tracepoint;\n\t\t\t\tstruct {\n\t\t\t\t\t__u64 config;\n\t\t\t\t\t__u32 type;\n\t\t\t\t\t__u64 cookie;\n\t\t\t\t} event;\n\t\t\t};\n\t\t} perf_event;\n\t\tstruct {\n\t\t\t__u32 ifindex;\n\t\t\t__u32 attach_type;\n\t\t} tcx;\n\t\tstruct {\n\t\t\t__u32 ifindex;\n\t\t\t__u32 attach_type;\n\t\t} netkit;\n\t\tstruct {\n\t\t\t__u32 map_id;\n\t\t\t__u32 attach_type;\n\t\t} sockmap;\n\t};\n};\n\nstruct bpf_link_ops {\n\tvoid (*release)(struct bpf_link *);\n\tvoid (*dealloc)(struct bpf_link *);\n\tvoid (*dealloc_deferred)(struct bpf_link *);\n\tint (*detach)(struct bpf_link *);\n\tint (*update_prog)(struct bpf_link *, struct bpf_prog *, struct bpf_prog *);\n\tvoid (*show_fdinfo)(const struct bpf_link *, struct seq_file *);\n\tint (*fill_link_info)(const struct bpf_link *, struct bpf_link_info *);\n\tint (*update_map)(struct bpf_link *, struct bpf_map *, struct bpf_map *);\n\t__poll_t (*poll)(struct file *, struct poll_table_struct *);\n};\n\nstruct bpf_link_primer {\n\tstruct bpf_link *link;\n\tstruct file *file;\n\tint fd;\n\tu32 id;\n};\n\nstruct bpf_list_head {\n\t__u64 __opaque[2];\n};\n\nstruct bpf_list_node {\n\t__u64 __opaque[3];\n};\n\nstruct bpf_list_node_kern {\n\tstruct list_head list_head;\n\tvoid *owner;\n};\n\nstruct bpf_local_storage_data;\n\nstruct bpf_local_storage_map;\n\nstruct bpf_local_storage {\n\tstruct bpf_local_storage_data *cache[16];\n\tstruct bpf_local_storage_map *smap;\n\tstruct hlist_head list;\n\tvoid *owner;\n\tstruct callback_head rcu;\n\traw_spinlock_t lock;\n};\n\nstruct bpf_local_storage_cache {\n\tspinlock_t idx_lock;\n\tu64 idx_usage_counts[16];\n};\n\nstruct bpf_local_storage_data {\n\tstruct bpf_local_storage_map *smap;\n\tu8 data[0];\n};\n\nstruct bpf_local_storage_elem {\n\tstruct hlist_node map_node;\n\tstruct hlist_node snode;\n\tstruct bpf_local_storage *local_storage;\n\tstruct callback_head rcu;\n\tlong: 64;\n\tstruct bpf_local_storage_data sdata;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct bpf_local_storage_map_bucket;\n\nstruct bpf_local_storage_map {\n\tstruct bpf_map map;\n\tstruct bpf_local_storage_map_bucket *buckets;\n\tu32 bucket_log;\n\tu16 elem_size;\n\tu16 cache_idx;\n\tstruct bpf_mem_alloc selem_ma;\n\tstruct bpf_mem_alloc storage_ma;\n\tbool bpf_ma;\n};\n\nstruct bpf_local_storage_map_bucket {\n\tstruct hlist_head list;\n\traw_spinlock_t lock;\n};\n\nstruct bpf_lpm_trie_key_hdr {\n\t__u32 prefixlen;\n};\n\nstruct bpf_lpm_trie_key_u8 {\n\tunion {\n\t\tstruct bpf_lpm_trie_key_hdr hdr;\n\t\t__u32 prefixlen;\n\t};\n\t__u8 data[0];\n};\n\nstruct bpf_lru_locallist {\n\tstruct list_head lists[2];\n\tu16 next_steal;\n\traw_spinlock_t lock;\n};\n\nstruct bpf_lru_node {\n\tstruct list_head list;\n\tu16 cpu;\n\tu8 type;\n\tu8 ref;\n};\n\nstruct bpf_lwt_prog {\n\tstruct bpf_prog *prog;\n\tchar *name;\n};\n\nstruct bpf_lwt {\n\tstruct bpf_lwt_prog in;\n\tstruct bpf_lwt_prog out;\n\tstruct bpf_lwt_prog xmit;\n\tint family;\n};\n\nstruct bpf_offloaded_map;\n\nstruct bpf_map_dev_ops {\n\tint (*map_get_next_key)(struct bpf_offloaded_map *, void *, void *);\n\tint (*map_lookup_elem)(struct bpf_offloaded_map *, void *, void *);\n\tint (*map_update_elem)(struct bpf_offloaded_map *, void *, void *, u64);\n\tint (*map_delete_elem)(struct bpf_offloaded_map *, void *);\n};\n\nstruct bpf_map_info {\n\t__u32 type;\n\t__u32 id;\n\t__u32 key_size;\n\t__u32 value_size;\n\t__u32 max_entries;\n\t__u32 map_flags;\n\tchar name[16];\n\t__u32 ifindex;\n\t__u32 btf_vmlinux_value_type_id;\n\t__u64 netns_dev;\n\t__u64 netns_ino;\n\t__u32 btf_id;\n\t__u32 btf_key_type_id;\n\t__u32 btf_value_type_id;\n\t__u32 btf_vmlinux_id;\n\t__u64 map_extra;\n};\n\ntypedef u64 (*bpf_callback_t)(u64, u64, u64, u64, u64);\n\nstruct bpf_prog_aux;\n\nstruct bpf_map_ops {\n\tint (*map_alloc_check)(union bpf_attr *);\n\tstruct bpf_map * (*map_alloc)(union bpf_attr *);\n\tvoid (*map_release)(struct bpf_map *, struct file *);\n\tvoid (*map_free)(struct bpf_map *);\n\tint (*map_get_next_key)(struct bpf_map *, void *, void *);\n\tvoid (*map_release_uref)(struct bpf_map *);\n\tvoid * (*map_lookup_elem_sys_only)(struct bpf_map *, void *);\n\tint (*map_lookup_batch)(struct bpf_map *, const union bpf_attr *, union bpf_attr *);\n\tint (*map_lookup_and_delete_elem)(struct bpf_map *, void *, void *, u64);\n\tint (*map_lookup_and_delete_batch)(struct bpf_map *, const union bpf_attr *, union bpf_attr *);\n\tint (*map_update_batch)(struct bpf_map *, struct file *, const union bpf_attr *, union bpf_attr *);\n\tint (*map_delete_batch)(struct bpf_map *, const union bpf_attr *, union bpf_attr *);\n\tvoid * (*map_lookup_elem)(struct bpf_map *, void *);\n\tlong int (*map_update_elem)(struct bpf_map *, void *, void *, u64);\n\tlong int (*map_delete_elem)(struct bpf_map *, void *);\n\tlong int (*map_push_elem)(struct bpf_map *, void *, u64);\n\tlong int (*map_pop_elem)(struct bpf_map *, void *);\n\tlong int (*map_peek_elem)(struct bpf_map *, void *);\n\tvoid * (*map_lookup_percpu_elem)(struct bpf_map *, void *, u32);\n\tvoid * (*map_fd_get_ptr)(struct bpf_map *, struct file *, int);\n\tvoid (*map_fd_put_ptr)(struct bpf_map *, void *, bool);\n\tint (*map_gen_lookup)(struct bpf_map *, struct bpf_insn *);\n\tu32 (*map_fd_sys_lookup_elem)(void *);\n\tvoid (*map_seq_show_elem)(struct bpf_map *, void *, struct seq_file *);\n\tint (*map_check_btf)(const struct bpf_map *, const struct btf *, const struct btf_type *, const struct btf_type *);\n\tint (*map_poke_track)(struct bpf_map *, struct bpf_prog_aux *);\n\tvoid (*map_poke_untrack)(struct bpf_map *, struct bpf_prog_aux *);\n\tvoid (*map_poke_run)(struct bpf_map *, u32, struct bpf_prog *, struct bpf_prog *);\n\tint (*map_direct_value_addr)(const struct bpf_map *, u64 *, u32);\n\tint (*map_direct_value_meta)(const struct bpf_map *, u64, u32 *);\n\tint (*map_mmap)(struct bpf_map *, struct vm_area_struct *);\n\t__poll_t (*map_poll)(struct bpf_map *, struct file *, struct poll_table_struct *);\n\tlong unsigned int (*map_get_unmapped_area)(struct file *, long unsigned int, long unsigned int, long unsigned int, long unsigned int);\n\tint (*map_local_storage_charge)(struct bpf_local_storage_map *, void *, u32);\n\tvoid (*map_local_storage_uncharge)(struct bpf_local_storage_map *, void *, u32);\n\tstruct bpf_local_storage ** (*map_owner_storage_ptr)(void *);\n\tlong int (*map_redirect)(struct bpf_map *, u64, u64);\n\tbool (*map_meta_equal)(const struct bpf_map *, const struct bpf_map *);\n\tint (*map_set_for_each_callback_args)(struct bpf_verifier_env *, struct bpf_func_state *, struct bpf_func_state *);\n\tlong int (*map_for_each_callback)(struct bpf_map *, bpf_callback_t, void *, u64);\n\tu64 (*map_mem_usage)(const struct bpf_map *);\n\tint *map_btf_id;\n\tconst struct bpf_iter_seq_info *iter_seq_info;\n};\n\nstruct rcuwait {\n\tstruct task_struct *task;\n};\n\nstruct irq_work {\n\tstruct __call_single_node node;\n\tvoid (*func)(struct irq_work *);\n\tstruct rcuwait irqwait;\n};\n\nstruct bpf_mem_cache {\n\tstruct llist_head free_llist;\n\tlocal_t active;\n\tstruct llist_head free_llist_extra;\n\tstruct irq_work refill_work;\n\tstruct obj_cgroup *objcg;\n\tint unit_size;\n\tint free_cnt;\n\tint low_watermark;\n\tint high_watermark;\n\tint batch;\n\tint percpu_size;\n\tbool draining;\n\tstruct bpf_mem_cache *tgt;\n\tstruct llist_head free_by_rcu;\n\tstruct llist_node *free_by_rcu_tail;\n\tstruct llist_head waiting_for_gp;\n\tstruct llist_node *waiting_for_gp_tail;\n\tstruct callback_head rcu;\n\tatomic_t call_rcu_in_progress;\n\tstruct llist_head free_llist_extra_rcu;\n\tstruct llist_head free_by_rcu_ttrace;\n\tstruct llist_head waiting_for_gp_ttrace;\n\tstruct callback_head rcu_ttrace;\n\tatomic_t call_rcu_ttrace_in_progress;\n};\n\nstruct bpf_mem_caches {\n\tstruct bpf_mem_cache cache[11];\n};\n\nstruct bpf_mount_opts {\n\tkuid_t uid;\n\tkgid_t gid;\n\tumode_t mode;\n\tu64 delegate_cmds;\n\tu64 delegate_maps;\n\tu64 delegate_progs;\n\tu64 delegate_attachs;\n};\n\nstruct bpf_mprog_fp {\n\tstruct bpf_prog *prog;\n};\n\nstruct bpf_mprog_bundle;\n\nstruct bpf_mprog_entry {\n\tstruct bpf_mprog_fp fp_items[64];\n\tstruct bpf_mprog_bundle *parent;\n};\n\nstruct bpf_mprog_cp {\n\tstruct bpf_link *link;\n};\n\nstruct bpf_mprog_bundle {\n\tstruct bpf_mprog_entry a;\n\tstruct bpf_mprog_entry b;\n\tstruct bpf_mprog_cp cp_items[64];\n\tstruct bpf_prog *ref;\n\tatomic64_t revision;\n\tu32 count;\n};\n\nstruct bpf_nested_pt_regs {\n\tstruct pt_regs regs[3];\n};\n\nstruct bpf_nh_params {\n\tu32 nh_family;\n\tunion {\n\t\tu32 ipv4_nh;\n\t\tstruct in6_addr ipv6_nh;\n\t};\n};\n\nstruct bpf_redirect_info {\n\tu64 tgt_index;\n\tvoid *tgt_value;\n\tstruct bpf_map *map;\n\tu32 flags;\n\tu32 map_id;\n\tenum bpf_map_type map_type;\n\tstruct bpf_nh_params nh;\n\tu32 kern_flags;\n};\n\nstruct bpf_net_context {\n\tstruct bpf_redirect_info ri;\n\tstruct list_head cpu_map_flush_list;\n\tstruct list_head dev_map_flush_list;\n\tstruct list_head xskmap_map_flush_list;\n};\n\nstruct bpf_netns_link {\n\tstruct bpf_link link;\n\tenum bpf_attach_type type;\n\tenum netns_bpf_attach_type netns_type;\n\tstruct net *net;\n\tstruct list_head node;\n};\n\ntypedef unsigned int nf_hookfn(void *, struct sk_buff *, const struct nf_hook_state *);\n\nstruct nf_hook_ops {\n\tnf_hookfn *hook;\n\tstruct net_device *dev;\n\tvoid *priv;\n\tu8 pf;\n\tenum nf_hook_ops_type hook_ops_type: 8;\n\tunsigned int hooknum;\n\tint priority;\n};\n\nstruct nf_defrag_hook;\n\nstruct bpf_nf_link {\n\tstruct bpf_link link;\n\tstruct nf_hook_ops hook_ops;\n\tnetns_tracker ns_tracker;\n\tstruct net *net;\n\tu32 dead;\n\tconst struct nf_defrag_hook *defrag_hook;\n};\n\nstruct bpf_prog_offload_ops;\n\nstruct bpf_offload_dev {\n\tconst struct bpf_prog_offload_ops *ops;\n\tstruct list_head netdevs;\n\tvoid *priv;\n};\n\nstruct bpf_offload_netdev {\n\tstruct rhash_head l;\n\tstruct net_device *netdev;\n\tstruct bpf_offload_dev *offdev;\n\tstruct list_head progs;\n\tstruct list_head maps;\n\tstruct list_head offdev_netdevs;\n};\n\nstruct bpf_offloaded_map {\n\tstruct bpf_map map;\n\tstruct net_device *netdev;\n\tconst struct bpf_map_dev_ops *dev_ops;\n\tvoid *dev_priv;\n\tstruct list_head offloads;\n};\n\nstruct bpf_perf_event_value {\n\t__u64 counter;\n\t__u64 enabled;\n\t__u64 running;\n};\n\nstruct bpf_perf_link {\n\tstruct bpf_link link;\n\tstruct file *perf_file;\n};\n\nstruct bpf_pidns_info {\n\t__u32 pid;\n\t__u32 tgid;\n};\n\nstruct bpf_preload_info {\n\tchar link_name[16];\n\tstruct bpf_link *link;\n};\n\nstruct bpf_preload_ops {\n\tint (*preload)(struct bpf_preload_info *);\n\tstruct module *owner;\n};\n\nstruct sock_filter {\n\t__u16 code;\n\t__u8 jt;\n\t__u8 jf;\n\t__u32 k;\n};\n\nstruct bpf_prog_stats;\n\nstruct sock_fprog_kern;\n\nstruct bpf_prog {\n\tu16 pages;\n\tu16 jited: 1;\n\tu16 jit_requested: 1;\n\tu16 gpl_compatible: 1;\n\tu16 cb_access: 1;\n\tu16 dst_needed: 1;\n\tu16 blinding_requested: 1;\n\tu16 blinded: 1;\n\tu16 is_func: 1;\n\tu16 kprobe_override: 1;\n\tu16 has_callchain_buf: 1;\n\tu16 enforce_expected_attach_type: 1;\n\tu16 call_get_stack: 1;\n\tu16 call_get_func_ip: 1;\n\tu16 tstamp_type_access: 1;\n\tu16 sleepable: 1;\n\tenum bpf_prog_type type;\n\tenum bpf_attach_type expected_attach_type;\n\tu32 len;\n\tu32 jited_len;\n\tu8 tag[8];\n\tstruct bpf_prog_stats *stats;\n\tint *active;\n\tunsigned int (*bpf_func)(const void *, const struct bpf_insn *);\n\tstruct bpf_prog_aux *aux;\n\tstruct sock_fprog_kern *orig_prog;\n\tunion {\n\t\tstruct {\n\t\t\tstruct {} __empty_insns;\n\t\t\tstruct sock_filter insns[0];\n\t\t};\n\t\tstruct {\n\t\t\tstruct {} __empty_insnsi;\n\t\t\tstruct bpf_insn insnsi[0];\n\t\t};\n\t};\n};\n\nstruct bpf_trampoline;\n\nstruct bpf_prog_ops;\n\nstruct btf_mod_pair;\n\nstruct user_struct;\n\nstruct bpf_token;\n\nstruct bpf_prog_offload;\n\nstruct exception_table_entry;\n\nstruct bpf_prog_aux {\n\tatomic64_t refcnt;\n\tu32 used_map_cnt;\n\tu32 used_btf_cnt;\n\tu32 max_ctx_offset;\n\tu32 max_pkt_offset;\n\tu32 max_tp_access;\n\tu32 stack_depth;\n\tu32 id;\n\tu32 func_cnt;\n\tu32 real_func_cnt;\n\tu32 func_idx;\n\tu32 attach_btf_id;\n\tu32 ctx_arg_info_size;\n\tu32 max_rdonly_access;\n\tu32 max_rdwr_access;\n\tstruct btf *attach_btf;\n\tconst struct bpf_ctx_arg_aux *ctx_arg_info;\n\tstruct mutex dst_mutex;\n\tstruct bpf_prog *dst_prog;\n\tstruct bpf_trampoline *dst_trampoline;\n\tenum bpf_prog_type saved_dst_prog_type;\n\tenum bpf_attach_type saved_dst_attach_type;\n\tbool verifier_zext;\n\tbool dev_bound;\n\tbool offload_requested;\n\tbool attach_btf_trace;\n\tbool attach_tracing_prog;\n\tbool func_proto_unreliable;\n\tbool tail_call_reachable;\n\tbool xdp_has_frags;\n\tbool exception_cb;\n\tbool exception_boundary;\n\tbool is_extended;\n\tu64 prog_array_member_cnt;\n\tstruct mutex ext_mutex;\n\tstruct bpf_arena *arena;\n\tconst struct btf_type *attach_func_proto;\n\tconst char *attach_func_name;\n\tstruct bpf_prog **func;\n\tvoid *jit_data;\n\tstruct bpf_jit_poke_descriptor *poke_tab;\n\tstruct bpf_kfunc_desc_tab *kfunc_tab;\n\tstruct bpf_kfunc_btf_tab *kfunc_btf_tab;\n\tu32 size_poke_tab;\n\tstruct bpf_ksym ksym;\n\tconst struct bpf_prog_ops *ops;\n\tstruct bpf_map **used_maps;\n\tstruct mutex used_maps_mutex;\n\tstruct btf_mod_pair *used_btfs;\n\tstruct bpf_prog *prog;\n\tstruct user_struct *user;\n\tu64 load_time;\n\tu32 verified_insns;\n\tint cgroup_atype;\n\tstruct bpf_map *cgroup_storage[2];\n\tchar name[16];\n\tu64 (*bpf_exception_cb)(u64, u64, u64, u64, u64);\n\tvoid *security;\n\tstruct bpf_token *token;\n\tstruct bpf_prog_offload *offload;\n\tstruct btf *btf;\n\tstruct bpf_func_info *func_info;\n\tstruct bpf_func_info_aux *func_info_aux;\n\tstruct bpf_line_info *linfo;\n\tvoid **jited_linfo;\n\tu32 func_info_cnt;\n\tu32 nr_linfo;\n\tu32 linfo_idx;\n\tstruct module *mod;\n\tu32 num_exentries;\n\tstruct exception_table_entry *extable;\n\tunion {\n\t\tstruct work_struct work;\n\t\tstruct callback_head rcu;\n\t};\n};\n\nstruct bpf_prog_dummy {\n\tstruct bpf_prog prog;\n};\n\nstruct bpf_prog_info {\n\t__u32 type;\n\t__u32 id;\n\t__u8 tag[8];\n\t__u32 jited_prog_len;\n\t__u32 xlated_prog_len;\n\t__u64 jited_prog_insns;\n\t__u64 xlated_prog_insns;\n\t__u64 load_time;\n\t__u32 created_by_uid;\n\t__u32 nr_map_ids;\n\t__u64 map_ids;\n\tchar name[16];\n\t__u32 ifindex;\n\t__u32 gpl_compatible: 1;\n\t__u64 netns_dev;\n\t__u64 netns_ino;\n\t__u32 nr_jited_ksyms;\n\t__u32 nr_jited_func_lens;\n\t__u64 jited_ksyms;\n\t__u64 jited_func_lens;\n\t__u32 btf_id;\n\t__u32 func_info_rec_size;\n\t__u64 func_info;\n\t__u32 nr_func_info;\n\t__u32 nr_line_info;\n\t__u64 line_info;\n\t__u64 jited_line_info;\n\t__u32 nr_jited_line_info;\n\t__u32 line_info_rec_size;\n\t__u32 jited_line_info_rec_size;\n\t__u32 nr_prog_tags;\n\t__u64 prog_tags;\n\t__u64 run_time_ns;\n\t__u64 run_cnt;\n\t__u64 recursion_misses;\n\t__u32 verified_insns;\n\t__u32 attach_btf_obj_id;\n\t__u32 attach_btf_id;\n};\n\nstruct bpf_prog_kstats {\n\tu64 nsecs;\n\tu64 cnt;\n\tu64 misses;\n};\n\nstruct bpf_prog_list {\n\tstruct hlist_node node;\n\tstruct bpf_prog *prog;\n\tstruct bpf_cgroup_link *link;\n\tstruct bpf_cgroup_storage *storage[2];\n};\n\nstruct bpf_prog_offload {\n\tstruct bpf_prog *prog;\n\tstruct net_device *netdev;\n\tstruct bpf_offload_dev *offdev;\n\tvoid *dev_priv;\n\tstruct list_head offloads;\n\tbool dev_state;\n\tbool opt_failed;\n\tvoid *jited_image;\n\tu32 jited_len;\n};\n\nstruct bpf_prog_offload_ops {\n\tint (*insn_hook)(struct bpf_verifier_env *, int, int);\n\tint (*finalize)(struct bpf_verifier_env *);\n\tint (*replace_insn)(struct bpf_verifier_env *, u32, struct bpf_insn *);\n\tint (*remove_insns)(struct bpf_verifier_env *, u32, u32);\n\tint (*prepare)(struct bpf_prog *);\n\tint (*translate)(struct bpf_prog *);\n\tvoid (*destroy)(struct bpf_prog *);\n};\n\nstruct bpf_prog_ops {\n\tint (*test_run)(struct bpf_prog *, const union bpf_attr *, union bpf_attr *);\n};\n\nstruct bpf_prog_pack {\n\tstruct list_head list;\n\tvoid *ptr;\n\tlong unsigned int bitmap[0];\n};\n\nstruct bpf_prog_stats {\n\tu64_stats_t cnt;\n\tu64_stats_t nsecs;\n\tu64_stats_t misses;\n\tstruct u64_stats_sync syncp;\n\tlong: 64;\n};\n\nstruct bpf_queue_stack {\n\tstruct bpf_map map;\n\traw_spinlock_t lock;\n\tu32 head;\n\tu32 tail;\n\tu32 size;\n\tchar elements[0];\n};\n\nstruct bpf_raw_event_map {\n\tstruct tracepoint *tp;\n\tvoid *bpf_func;\n\tu32 num_args;\n\tu32 writable_size;\n\tlong: 64;\n};\n\nstruct bpf_raw_tp_link {\n\tstruct bpf_link link;\n\tstruct bpf_raw_event_map *btp;\n\tu64 cookie;\n};\n\nstruct bpf_raw_tp_null_args {\n\tconst char *func;\n\tu64 mask;\n};\n\nstruct bpf_raw_tp_regs {\n\tstruct pt_regs regs[3];\n};\n\nstruct bpf_raw_tp_test_run_info {\n\tstruct bpf_prog *prog;\n\tvoid *ctx;\n\tu32 retval;\n};\n\nstruct bpf_rb_node {\n\t__u64 __opaque[4];\n};\n\nstruct bpf_rb_node_kern {\n\tstruct rb_node rb_node;\n\tvoid *owner;\n};\n\nstruct bpf_rb_root {\n\t__u64 __opaque[2];\n};\n\nstruct bpf_redir_neigh {\n\t__u32 nh_family;\n\tunion {\n\t\t__be32 ipv4_nh;\n\t\t__u32 ipv6_nh[4];\n\t};\n};\n\nstruct bpf_refcount {\n\t__u32 __opaque[1];\n};\n\nstruct bpf_reference_state {\n\tint id;\n\tint insn_idx;\n\tint callback_ref;\n};\n\nstruct bpf_reg_types {\n\tconst enum bpf_reg_type types[10];\n\tu32 *btf_id;\n};\n\nstruct bpf_ringbuf {\n\twait_queue_head_t waitq;\n\tstruct irq_work work;\n\tu64 mask;\n\tstruct page **pages;\n\tint nr_pages;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\traw_spinlock_t spinlock;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tatomic_t busy;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong unsigned int consumer_pos;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong unsigned int producer_pos;\n\tlong unsigned int pending_pos;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tchar data[0];\n};\n\nstruct bpf_ringbuf_hdr {\n\tu32 len;\n\tu32 pg_off;\n};\n\nstruct bpf_ringbuf_map {\n\tstruct bpf_map map;\n\tstruct bpf_ringbuf *rb;\n};\n\nstruct bpf_sanitize_info {\n\tstruct bpf_insn_aux_data aux;\n\tbool mask_to_left;\n};\n\nstruct bpf_scratchpad {\n\tunion {\n\t\t__be32 diff[128];\n\t\tu8 buff[512];\n\t};\n\tlocal_lock_t bh_lock;\n};\n\nstruct bpf_security_struct {\n\tu32 sid;\n};\n\nstruct bpf_tramp_link {\n\tstruct bpf_link link;\n\tstruct hlist_node tramp_hlist;\n\tu64 cookie;\n};\n\nstruct bpf_shim_tramp_link {\n\tstruct bpf_tramp_link link;\n\tstruct bpf_trampoline *trampoline;\n};\n\nstruct sk_psock_progs {\n\tstruct bpf_prog *msg_parser;\n\tstruct bpf_prog *stream_parser;\n\tstruct bpf_prog *stream_verdict;\n\tstruct bpf_prog *skb_verdict;\n\tstruct bpf_link *msg_parser_link;\n\tstruct bpf_link *stream_parser_link;\n\tstruct bpf_link *stream_verdict_link;\n\tstruct bpf_link *skb_verdict_link;\n};\n\nstruct bpf_shtab_bucket;\n\nstruct bpf_shtab {\n\tstruct bpf_map map;\n\tstruct bpf_shtab_bucket *buckets;\n\tu32 buckets_num;\n\tu32 elem_size;\n\tstruct sk_psock_progs progs;\n\tatomic_t count;\n};\n\nstruct bpf_shtab_bucket {\n\tstruct hlist_head head;\n\tspinlock_t lock;\n};\n\nstruct bpf_shtab_elem {\n\tstruct callback_head rcu;\n\tu32 hash;\n\tstruct sock *sk;\n\tstruct hlist_node node;\n\tu8 key[0];\n};\n\nstruct bpf_sk_storage_diag {\n\tu32 nr_maps;\n\tstruct bpf_map *maps[0];\n};\n\nstruct qdisc_skb_cb {\n\tstruct {\n\t\tunsigned int pkt_len;\n\t\tu16 slave_dev_queue_mapping;\n\t\tu16 tc_classid;\n\t};\n\tunsigned char data[20];\n};\n\nstruct bpf_skb_data_end {\n\tstruct qdisc_skb_cb qdisc_cb;\n\tvoid *data_meta;\n\tvoid *data_end;\n};\n\nstruct bpf_sock_tuple {\n\tunion {\n\t\tstruct {\n\t\t\t__be32 saddr;\n\t\t\t__be32 daddr;\n\t\t\t__be16 sport;\n\t\t\t__be16 dport;\n\t\t} ipv4;\n\t\tstruct {\n\t\t\t__be32 saddr[4];\n\t\t\t__be32 daddr[4];\n\t\t\t__be16 sport;\n\t\t\t__be16 dport;\n\t\t} ipv6;\n\t};\n};\n\nstruct bpf_sockopt_buf {\n\tu8 data[32];\n};\n\nstruct bpf_stab {\n\tstruct bpf_map map;\n\tstruct sock **sks;\n\tstruct sk_psock_progs progs;\n\tspinlock_t lock;\n};\n\nstruct bpf_stack_build_id {\n\t__s32 status;\n\tunsigned char build_id[20];\n\tunion {\n\t\t__u64 offset;\n\t\t__u64 ip;\n\t};\n};\n\nstruct stack_map_bucket;\n\nstruct bpf_stack_map {\n\tstruct bpf_map map;\n\tvoid *elems;\n\tstruct pcpu_freelist freelist;\n\tu32 n_buckets;\n\tstruct stack_map_bucket *buckets[0];\n};\n\nstruct bpf_stack_state {\n\tstruct bpf_reg_state spilled_ptr;\n\tu8 slot_type[8];\n};\n\nstruct bpf_storage_blob {\n\tstruct bpf_local_storage *storage;\n};\n\nstruct bpf_storage_buffer {\n\tstruct callback_head rcu;\n\tchar data[0];\n};\n\nstruct bpf_verifier_ops;\n\nstruct btf_member;\n\nstruct bpf_struct_ops {\n\tconst struct bpf_verifier_ops *verifier_ops;\n\tint (*init)(struct btf *);\n\tint (*check_member)(const struct btf_type *, const struct btf_member *, const struct bpf_prog *);\n\tint (*init_member)(const struct btf_type *, const struct btf_member *, void *, const void *);\n\tint (*reg)(void *, struct bpf_link *);\n\tvoid (*unreg)(void *, struct bpf_link *);\n\tint (*update)(void *, void *, struct bpf_link *);\n\tint (*validate)(void *);\n\tvoid *cfi_stubs;\n\tstruct module *owner;\n\tconst char *name;\n\tstruct btf_func_model func_models[64];\n};\n\nstruct bpf_struct_ops_arg_info {\n\tstruct bpf_ctx_arg_aux *info;\n\tu32 cnt;\n};\n\nstruct bpf_struct_ops_common_value {\n\trefcount_t refcnt;\n\tenum bpf_struct_ops_state state;\n};\n\nstruct bpf_struct_ops_bpf_dummy_ops {\n\tstruct bpf_struct_ops_common_value common;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tstruct bpf_dummy_ops data;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct bpf_struct_ops_desc {\n\tstruct bpf_struct_ops *st_ops;\n\tconst struct btf_type *type;\n\tconst struct btf_type *value_type;\n\tu32 type_id;\n\tu32 value_id;\n\tstruct bpf_struct_ops_arg_info *arg_info;\n};\n\nstruct hid_bpf_ctx;\n\nstruct hid_device;\n\nstruct hid_bpf_ops {\n\tint hid_id;\n\tu32 flags;\n\tstruct list_head list;\n\tint (*hid_device_event)(struct hid_bpf_ctx *, enum hid_report_type, u64);\n\tint (*hid_rdesc_fixup)(struct hid_bpf_ctx *);\n\tint (*hid_hw_request)(struct hid_bpf_ctx *, unsigned char, enum hid_report_type, enum hid_class_request, u64);\n\tint (*hid_hw_output_report)(struct hid_bpf_ctx *, u64);\n\tstruct hid_device *hdev;\n};\n\nstruct bpf_struct_ops_hid_bpf_ops {\n\tstruct bpf_struct_ops_common_value common;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tstruct hid_bpf_ops data;\n};\n\nstruct bpf_struct_ops_link {\n\tstruct bpf_link link;\n\tstruct bpf_map *map;\n\twait_queue_head_t wait_hup;\n};\n\nstruct bpf_struct_ops_value {\n\tstruct bpf_struct_ops_common_value common;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tchar data[0];\n};\n\nstruct bpf_struct_ops_map {\n\tstruct bpf_map map;\n\tstruct callback_head rcu;\n\tconst struct bpf_struct_ops_desc *st_ops_desc;\n\tstruct mutex lock;\n\tstruct bpf_link **links;\n\tstruct bpf_ksym **ksyms;\n\tu32 funcs_cnt;\n\tu32 image_pages_cnt;\n\tvoid *image_pages[8];\n\tstruct btf *btf;\n\tstruct bpf_struct_ops_value *uvalue;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tstruct bpf_struct_ops_value kvalue;\n};\n\nstruct rate_sample;\n\nunion tcp_cc_info;\n\nstruct tcp_congestion_ops {\n\tu32 (*ssthresh)(struct sock *);\n\tvoid (*cong_avoid)(struct sock *, u32, u32);\n\tvoid (*set_state)(struct sock *, u8);\n\tvoid (*cwnd_event)(struct sock *, enum tcp_ca_event);\n\tvoid (*in_ack_event)(struct sock *, u32);\n\tvoid (*pkts_acked)(struct sock *, const struct ack_sample *);\n\tu32 (*min_tso_segs)(struct sock *);\n\tvoid (*cong_control)(struct sock *, u32, int, const struct rate_sample *);\n\tu32 (*undo_cwnd)(struct sock *);\n\tu32 (*sndbuf_expand)(struct sock *);\n\tsize_t (*get_info)(struct sock *, u32, int *, union tcp_cc_info *);\n\tchar name[16];\n\tstruct module *owner;\n\tstruct list_head list;\n\tu32 key;\n\tu32 flags;\n\tvoid (*init)(struct sock *);\n\tvoid (*release)(struct sock *);\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct bpf_struct_ops_tcp_congestion_ops {\n\tstruct bpf_struct_ops_common_value common;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tstruct tcp_congestion_ops data;\n};\n\nstruct bpf_subprog_arg_info {\n\tenum bpf_arg_type arg_type;\n\tunion {\n\t\tu32 mem_size;\n\t\tu32 btf_id;\n\t};\n};\n\nstruct bpf_subprog_info {\n\tu32 start;\n\tu32 linfo_idx;\n\tu16 stack_depth;\n\tu16 stack_extra;\n\tbool has_tail_call: 1;\n\tbool tail_call_reachable: 1;\n\tbool has_ld_abs: 1;\n\tbool is_cb: 1;\n\tbool is_async_cb: 1;\n\tbool is_exception_cb: 1;\n\tbool args_cached: 1;\n\tu8 arg_cnt;\n\tstruct bpf_subprog_arg_info args[5];\n};\n\nstruct tcp_iter_state {\n\tstruct seq_net_private p;\n\tenum tcp_seq_states state;\n\tstruct sock *syn_wait_sk;\n\tint bucket;\n\tint offset;\n\tint sbucket;\n\tint num;\n\tloff_t last_pos;\n};\n\nstruct bpf_tcp_iter_state {\n\tstruct tcp_iter_state state;\n\tunsigned int cur_sk;\n\tunsigned int end_sk;\n\tunsigned int max_sk;\n\tstruct sock **batch;\n\tbool st_bucket_done;\n};\n\nstruct bpf_tcp_req_attrs {\n\tu32 rcv_tsval;\n\tu32 rcv_tsecr;\n\tu16 mss;\n\tu8 rcv_wscale;\n\tu8 snd_wscale;\n\tu8 ecn_ok;\n\tu8 wscale_ok;\n\tu8 sack_ok;\n\tu8 tstamp_ok;\n\tu8 usec_ts_ok;\n\tu8 reserved[3];\n};\n\nstruct bpf_tcp_sock {\n\t__u32 snd_cwnd;\n\t__u32 srtt_us;\n\t__u32 rtt_min;\n\t__u32 snd_ssthresh;\n\t__u32 rcv_nxt;\n\t__u32 snd_nxt;\n\t__u32 snd_una;\n\t__u32 mss_cache;\n\t__u32 ecn_flags;\n\t__u32 rate_delivered;\n\t__u32 rate_interval_us;\n\t__u32 packets_out;\n\t__u32 retrans_out;\n\t__u32 total_retrans;\n\t__u32 segs_in;\n\t__u32 data_segs_in;\n\t__u32 segs_out;\n\t__u32 data_segs_out;\n\t__u32 lost_out;\n\t__u32 sacked_out;\n\t__u64 bytes_received;\n\t__u64 bytes_acked;\n\t__u32 dsack_dups;\n\t__u32 delivered;\n\t__u32 delivered_ce;\n\t__u32 icsk_retransmits;\n};\n\nstruct bpf_test_timer {\n\tenum {\n\t\tNO_PREEMPT = 0,\n\t\tNO_MIGRATE = 1,\n\t} mode;\n\tu32 i;\n\tu64 time_start;\n\tu64 time_spent;\n};\n\nstruct bpf_throw_ctx {\n\tstruct bpf_prog_aux *aux;\n\tu64 sp;\n\tu64 bp;\n\tint cnt;\n};\n\nstruct bpf_timer {\n\t__u64 __opaque[2];\n};\n\nstruct user_namespace;\n\nstruct bpf_token {\n\tstruct work_struct work;\n\tatomic64_t refcnt;\n\tstruct user_namespace *userns;\n\tu64 allowed_cmds;\n\tu64 allowed_maps;\n\tu64 allowed_progs;\n\tu64 allowed_attachs;\n\tvoid *security;\n};\n\nstruct bpf_trace_module {\n\tstruct module *module;\n\tstruct list_head list;\n};\n\nstruct bpf_trace_run_ctx {\n\tstruct bpf_run_ctx run_ctx;\n\tu64 bpf_cookie;\n\tbool is_uprobe;\n};\n\nunion perf_sample_weight {\n\t__u64 full;\n\tstruct {\n\t\t__u32 var1_dw;\n\t\t__u16 var2_w;\n\t\t__u16 var3_w;\n\t};\n};\n\nunion perf_mem_data_src {\n\t__u64 val;\n\tstruct {\n\t\t__u64 mem_op: 5;\n\t\t__u64 mem_lvl: 14;\n\t\t__u64 mem_snoop: 5;\n\t\t__u64 mem_lock: 2;\n\t\t__u64 mem_dtlb: 7;\n\t\t__u64 mem_lvl_num: 4;\n\t\t__u64 mem_remote: 1;\n\t\t__u64 mem_snoopx: 2;\n\t\t__u64 mem_blk: 3;\n\t\t__u64 mem_hops: 3;\n\t\t__u64 mem_rsvd: 18;\n\t};\n};\n\nstruct perf_regs {\n\t__u64 abi;\n\tstruct pt_regs *regs;\n};\n\nstruct perf_callchain_entry;\n\nstruct perf_raw_record;\n\nstruct perf_branch_stack;\n\nstruct perf_sample_data {\n\tu64 sample_flags;\n\tu64 period;\n\tu64 dyn_size;\n\tu64 type;\n\tstruct {\n\t\tu32 pid;\n\t\tu32 tid;\n\t} tid_entry;\n\tu64 time;\n\tu64 id;\n\tstruct {\n\t\tu32 cpu;\n\t\tu32 reserved;\n\t} cpu_entry;\n\tu64 ip;\n\tstruct perf_callchain_entry *callchain;\n\tstruct perf_raw_record *raw;\n\tstruct perf_branch_stack *br_stack;\n\tu64 *br_stack_cntr;\n\tunion perf_sample_weight weight;\n\tunion perf_mem_data_src data_src;\n\tu64 txn;\n\tstruct perf_regs regs_user;\n\tstruct perf_regs regs_intr;\n\tu64 stack_user_size;\n\tu64 stream_id;\n\tu64 cgroup;\n\tu64 addr;\n\tu64 phys_addr;\n\tu64 data_page_size;\n\tu64 code_page_size;\n\tu64 aux_size;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct bpf_trace_sample_data {\n\tstruct perf_sample_data sds[3];\n};\n\nstruct bpf_tracing_link {\n\tstruct bpf_tramp_link link;\n\tenum bpf_attach_type attach_type;\n\tstruct bpf_trampoline *trampoline;\n\tstruct bpf_prog *tgt_prog;\n};\n\nstruct bpf_tramp_image {\n\tvoid *image;\n\tint size;\n\tstruct bpf_ksym ksym;\n\tstruct percpu_ref pcref;\n\tvoid *ip_after_call;\n\tvoid *ip_epilogue;\n\tunion {\n\t\tstruct callback_head rcu;\n\t\tstruct work_struct work;\n\t};\n};\n\nstruct bpf_tramp_links {\n\tstruct bpf_tramp_link *links[38];\n\tint nr_links;\n};\n\nstruct bpf_tramp_run_ctx {\n\tstruct bpf_run_ctx run_ctx;\n\tu64 bpf_cookie;\n\tstruct bpf_run_ctx *saved_run_ctx;\n};\n\nstruct bpf_trampoline {\n\tstruct hlist_node hlist;\n\tstruct ftrace_ops *fops;\n\tstruct mutex mutex;\n\trefcount_t refcnt;\n\tu32 flags;\n\tu64 key;\n\tstruct {\n\t\tstruct btf_func_model model;\n\t\tvoid *addr;\n\t\tbool ftrace_managed;\n\t} func;\n\tstruct bpf_prog *extension_prog;\n\tstruct hlist_head progs_hlist[3];\n\tint progs_cnt[3];\n\tstruct bpf_tramp_image *cur_image;\n};\n\nstruct bpf_tunnel_key {\n\t__u32 tunnel_id;\n\tunion {\n\t\t__u32 remote_ipv4;\n\t\t__u32 remote_ipv6[4];\n\t};\n\t__u8 tunnel_tos;\n\t__u8 tunnel_ttl;\n\tunion {\n\t\t__u16 tunnel_ext;\n\t\t__be16 tunnel_flags;\n\t};\n\t__u32 tunnel_label;\n\tunion {\n\t\t__u32 local_ipv4;\n\t\t__u32 local_ipv6[4];\n\t};\n};\n\nstruct bpf_tuple {\n\tstruct bpf_prog *prog;\n\tstruct bpf_link *link;\n};\n\nstruct udp_iter_state {\n\tstruct seq_net_private p;\n\tint bucket;\n};\n\nstruct bpf_udp_iter_state {\n\tstruct udp_iter_state state;\n\tunsigned int cur_sk;\n\tunsigned int end_sk;\n\tunsigned int max_sk;\n\tint offset;\n\tstruct sock **batch;\n\tbool st_bucket_done;\n};\n\nstruct bpf_unix_iter_state {\n\tstruct seq_net_private p;\n\tunsigned int cur_sk;\n\tunsigned int end_sk;\n\tunsigned int max_sk;\n\tstruct sock **batch;\n\tbool st_bucket_done;\n};\n\nstruct uprobe_consumer {\n\tint (*handler)(struct uprobe_consumer *, struct pt_regs *);\n\tint (*ret_handler)(struct uprobe_consumer *, long unsigned int, struct pt_regs *);\n\tbool (*filter)(struct uprobe_consumer *, enum uprobe_filter_ctx, struct mm_struct *);\n\tstruct uprobe_consumer *next;\n};\n\nstruct bpf_uprobe_multi_link;\n\nstruct bpf_uprobe {\n\tstruct bpf_uprobe_multi_link *link;\n\tloff_t offset;\n\tlong unsigned int ref_ctr_offset;\n\tu64 cookie;\n\tstruct uprobe_consumer consumer;\n};\n\nstruct bpf_uprobe_multi_link {\n\tstruct path path;\n\tstruct bpf_link link;\n\tu32 cnt;\n\tu32 flags;\n\tstruct bpf_uprobe *uprobes;\n\tstruct task_struct *task;\n};\n\nstruct bpf_uprobe_multi_run_ctx {\n\tstruct bpf_run_ctx run_ctx;\n\tlong unsigned int entry_ip;\n\tstruct bpf_uprobe *uprobe;\n};\n\nstruct btf_mod_pair {\n\tstruct btf *btf;\n\tstruct module *module;\n};\n\nstruct bpf_verifier_log {\n\tu64 start_pos;\n\tu64 end_pos;\n\tchar *ubuf;\n\tu32 level;\n\tu32 len_total;\n\tu32 len_max;\n\tchar kbuf[1024];\n};\n\nstruct bpf_verifier_stack_elem;\n\nstruct bpf_verifier_state;\n\nstruct bpf_verifier_state_list;\n\nstruct bpf_verifier_env {\n\tu32 insn_idx;\n\tu32 prev_insn_idx;\n\tstruct bpf_prog *prog;\n\tconst struct bpf_verifier_ops *ops;\n\tstruct module *attach_btf_mod;\n\tstruct bpf_verifier_stack_elem *head;\n\tint stack_size;\n\tbool strict_alignment;\n\tbool test_state_freq;\n\tbool test_reg_invariants;\n\tstruct bpf_verifier_state *cur_state;\n\tstruct bpf_verifier_state_list **explored_states;\n\tstruct bpf_verifier_state_list *free_list;\n\tstruct bpf_map *used_maps[64];\n\tstruct btf_mod_pair used_btfs[64];\n\tu32 used_map_cnt;\n\tu32 used_btf_cnt;\n\tu32 id_gen;\n\tu32 hidden_subprog_cnt;\n\tint exception_callback_subprog;\n\tbool explore_alu_limits;\n\tbool allow_ptr_leaks;\n\tbool allow_uninit_stack;\n\tbool bpf_capable;\n\tbool bypass_spec_v1;\n\tbool bypass_spec_v4;\n\tbool seen_direct_write;\n\tbool seen_exception;\n\tstruct bpf_insn_aux_data *insn_aux_data;\n\tconst struct bpf_line_info *prev_linfo;\n\tstruct bpf_verifier_log log;\n\tstruct bpf_subprog_info subprog_info[258];\n\tunion {\n\t\tstruct bpf_idmap idmap_scratch;\n\t\tstruct bpf_idset idset_scratch;\n\t};\n\tstruct {\n\t\tint *insn_state;\n\t\tint *insn_stack;\n\t\tint cur_stack;\n\t} cfg;\n\tstruct backtrack_state bt;\n\tstruct bpf_jmp_history_entry *cur_hist_ent;\n\tu32 pass_cnt;\n\tu32 subprog_cnt;\n\tu32 prev_insn_processed;\n\tu32 insn_processed;\n\tu32 prev_jmps_processed;\n\tu32 jmps_processed;\n\tu64 verification_time;\n\tu32 max_states_per_insn;\n\tu32 total_states;\n\tu32 peak_states;\n\tu32 longest_mark_read_walk;\n\tbpfptr_t fd_array;\n\tu32 scratched_regs;\n\tu64 scratched_stack_slots;\n\tu64 prev_log_pos;\n\tu64 prev_insn_print_pos;\n\tstruct bpf_reg_state fake_reg[2];\n\tchar tmp_str_buf[320];\n};\n\nstruct bpf_verifier_ops {\n\tconst struct bpf_func_proto * (*get_func_proto)(enum bpf_func_id, const struct bpf_prog *);\n\tbool (*is_valid_access)(int, int, enum bpf_access_type, const struct bpf_prog *, struct bpf_insn_access_aux *);\n\tint (*gen_prologue)(struct bpf_insn *, bool, const struct bpf_prog *);\n\tint (*gen_ld_abs)(const struct bpf_insn *, struct bpf_insn *);\n\tu32 (*convert_ctx_access)(enum bpf_access_type, const struct bpf_insn *, struct bpf_insn *, struct bpf_prog *, u32 *);\n\tint (*btf_struct_access)(struct bpf_verifier_log *, const struct bpf_reg_state *, int, int);\n};\n\nstruct bpf_verifier_state {\n\tstruct bpf_func_state *frame[8];\n\tstruct bpf_verifier_state *parent;\n\tu32 branches;\n\tu32 insn_idx;\n\tu32 curframe;\n\tstruct bpf_active_lock active_lock;\n\tbool speculative;\n\tbool active_rcu_lock;\n\tu32 active_preempt_lock;\n\tbool used_as_loop_entry;\n\tbool in_sleepable;\n\tu32 first_insn_idx;\n\tu32 last_insn_idx;\n\tstruct bpf_verifier_state *loop_entry;\n\tstruct bpf_jmp_history_entry *jmp_history;\n\tu32 jmp_history_cnt;\n\tu32 dfs_depth;\n\tu32 callback_unroll_depth;\n\tu32 may_goto_depth;\n};\n\nstruct bpf_verifier_stack_elem {\n\tstruct bpf_verifier_state st;\n\tint insn_idx;\n\tint prev_insn_idx;\n\tstruct bpf_verifier_stack_elem *next;\n\tu32 log_pos;\n};\n\nstruct bpf_verifier_state_list {\n\tstruct bpf_verifier_state state;\n\tstruct bpf_verifier_state_list *next;\n\tint miss_cnt;\n\tint hit_cnt;\n};\n\nstruct bpf_work {\n\tstruct bpf_async_cb cb;\n\tstruct work_struct work;\n\tstruct work_struct delete_work;\n};\n\nstruct bpf_wq {\n\t__u64 __opaque[2];\n};\n\nstruct bpf_xdp_link;\n\nstruct bpf_xdp_entity {\n\tstruct bpf_prog *prog;\n\tstruct bpf_xdp_link *link;\n};\n\nstruct bpf_xdp_link {\n\tstruct bpf_link link;\n\tstruct net_device *dev;\n\tint flags;\n};\n\nstruct bpf_xdp_sock {\n\t__u32 queue_id;\n};\n\nstruct bpf_xfrm_state {\n\t__u32 reqid;\n\t__u32 spi;\n\t__u16 family;\n\t__u16 ext;\n\tunion {\n\t\t__u32 remote_ipv4;\n\t\t__u32 remote_ipv6[4];\n\t};\n};\n\nstruct bpf_xfrm_state_opts {\n\ts32 error;\n\ts32 netns_id;\n\tu32 mark;\n\txfrm_address_t daddr;\n\t__be32 spi;\n\tu8 proto;\n\tu16 family;\n};\n\nstruct bpffs_btf_enums {\n\tconst struct btf *btf;\n\tconst struct btf_type *cmd_t;\n\tconst struct btf_type *map_t;\n\tconst struct btf_type *prog_t;\n\tconst struct btf_type *attach_t;\n};\n\nstruct trace_entry {\n\tshort unsigned int type;\n\tunsigned char flags;\n\tunsigned char preempt_count;\n\tint pid;\n};\n\nstruct bprint_entry {\n\tstruct trace_entry ent;\n\tlong unsigned int ip;\n\tconst char *fmt;\n\tu32 buf[0];\n};\n\nstruct bputs_entry {\n\tstruct trace_entry ent;\n\tlong unsigned int ip;\n\tconst char *str;\n};\n\nstruct br_input_skb_cb {\n\tstruct net_device *brdev;\n\tu16 frag_max_size;\n\tu8 igmp;\n\tu8 mrouters_only: 1;\n\tu8 proxyarp_replied: 1;\n\tu8 src_port_isolated: 1;\n\tu8 promisc: 1;\n\tu8 vlan_filtered: 1;\n\tu8 br_netfilter_broute: 1;\n\tu8 tx_fwd_offload: 1;\n\tint src_hwdom;\n\tlong unsigned int fwd_hwdoms;\n\tu32 backup_nhid;\n};\n\nstruct br_ip {\n\tunion {\n\t\t__be32 ip4;\n\t\tstruct in6_addr ip6;\n\t} src;\n\tunion {\n\t\t__be32 ip4;\n\t\tstruct in6_addr ip6;\n\t\tunsigned char mac_addr[6];\n\t} dst;\n\t__be16 proto;\n\t__u16 vid;\n};\n\nstruct br_mcast_stats {\n\t__u64 igmp_v1queries[2];\n\t__u64 igmp_v2queries[2];\n\t__u64 igmp_v3queries[2];\n\t__u64 igmp_leaves[2];\n\t__u64 igmp_v1reports[2];\n\t__u64 igmp_v2reports[2];\n\t__u64 igmp_v3reports[2];\n\t__u64 igmp_parse_errors;\n\t__u64 mld_v1queries[2];\n\t__u64 mld_v2queries[2];\n\t__u64 mld_leaves[2];\n\t__u64 mld_v1reports[2];\n\t__u64 mld_v2reports[2];\n\t__u64 mld_parse_errors;\n\t__u64 mcast_bytes[2];\n\t__u64 mcast_packets[2];\n};\n\nstruct br_mdb_entry {\n\t__u32 ifindex;\n\t__u8 state;\n\t__u8 flags;\n\t__u16 vid;\n\tstruct {\n\t\tunion {\n\t\t\t__be32 ip4;\n\t\t\tstruct in6_addr ip6;\n\t\t\tunsigned char mac_addr[6];\n\t\t} u;\n\t\t__be16 proto;\n\t} addr;\n};\n\nstruct br_port_msg {\n\t__u8 family;\n\t__u32 ifindex;\n};\n\nstruct metadata_dst;\n\nstruct br_tunnel_info {\n\t__be64 tunnel_id;\n\tstruct metadata_dst *tunnel_dst;\n};\n\nstruct branch_entry {\n\tunion {\n\t\tstruct {\n\t\t\tu64 ip: 58;\n\t\t\tu64 ip_sign_ext: 5;\n\t\t\tu64 mispredict: 1;\n\t\t} split;\n\t\tu64 full;\n\t} from;\n\tunion {\n\t\tstruct {\n\t\t\tu64 ip: 58;\n\t\t\tu64 ip_sign_ext: 3;\n\t\t\tu64 reserved: 1;\n\t\t\tu64 spec: 1;\n\t\t\tu64 valid: 1;\n\t\t} split;\n\t\tu64 full;\n\t} to;\n};\n\nstruct bridge_id {\n\tunsigned char prio[2];\n\tunsigned char addr[6];\n};\n\ntypedef struct bridge_id bridge_id;\n\nstruct bridge_mcast_other_query {\n\tstruct timer_list timer;\n\tstruct timer_list delay_timer;\n};\n\nstruct bridge_mcast_own_query {\n\tstruct timer_list timer;\n\tu32 startup_sent;\n};\n\nstruct bridge_mcast_querier {\n\tstruct br_ip addr;\n\tint port_ifidx;\n\tseqcount_spinlock_t seq;\n};\n\nstruct bridge_mcast_stats {\n\tstruct br_mcast_stats mstats;\n\tstruct u64_stats_sync syncp;\n};\n\nstruct bridge_stp_xstats {\n\t__u64 transition_blk;\n\t__u64 transition_fwd;\n\t__u64 rx_bpdu;\n\t__u64 tx_bpdu;\n\t__u64 rx_tcn;\n\t__u64 tx_tcn;\n};\n\nstruct broadcast_sk {\n\tstruct sock *sk;\n\tstruct work_struct work;\n};\n\nstruct broken_edid {\n\tu8 manufacturer[4];\n\tu32 model;\n\tu32 fix;\n};\n\nstruct fs_pin {\n\twait_queue_head_t wait;\n\tint done;\n\tstruct hlist_node s_list;\n\tstruct hlist_node m_list;\n\tvoid (*kill)(struct fs_pin *);\n};\n\nstruct bsd_acct_struct {\n\tstruct fs_pin pin;\n\tatomic_long_t count;\n\tstruct callback_head rcu;\n\tstruct mutex lock;\n\tint active;\n\tlong unsigned int needcheck;\n\tstruct file *file;\n\tstruct pid_namespace *ns;\n\tstruct work_struct work;\n\tstruct completion done;\n};\n\nstruct bsd_partition {\n\t__le32 p_size;\n\t__le32 p_offset;\n\t__le32 p_fsize;\n\t__u8 p_fstype;\n\t__u8 p_frag;\n\t__le16 p_cpg;\n};\n\nstruct bsd_disklabel {\n\t__le32 d_magic;\n\t__s16 d_type;\n\t__s16 d_subtype;\n\tchar d_typename[16];\n\tchar d_packname[16];\n\t__u32 d_secsize;\n\t__u32 d_nsectors;\n\t__u32 d_ntracks;\n\t__u32 d_ncylinders;\n\t__u32 d_secpercyl;\n\t__u32 d_secperunit;\n\t__u16 d_sparespertrack;\n\t__u16 d_sparespercyl;\n\t__u32 d_acylinders;\n\t__u16 d_rpm;\n\t__u16 d_interleave;\n\t__u16 d_trackskew;\n\t__u16 d_cylskew;\n\t__u32 d_headswitch;\n\t__u32 d_trkseek;\n\t__u32 d_flags;\n\t__u32 d_drivedata[5];\n\t__u32 d_spare[5];\n\t__le32 d_magic2;\n\t__le16 d_checksum;\n\t__le16 d_npartitions;\n\t__le32 d_bbsize;\n\t__le32 d_sbsize;\n\tstruct bsd_partition d_partitions[16];\n};\n\nstruct bsg_buffer {\n\tunsigned int payload_len;\n\tint sg_cnt;\n\tstruct scatterlist *sg_list;\n};\n\nstruct cdev {\n\tstruct kobject kobj;\n\tstruct module *owner;\n\tconst struct file_operations *ops;\n\tstruct list_head list;\n\tdev_t dev;\n\tunsigned int count;\n};\n\nstruct sg_io_v4;\n\ntypedef int bsg_sg_io_fn(struct request_queue *, struct sg_io_v4 *, bool, unsigned int);\n\nstruct bsg_device {\n\tstruct request_queue *queue;\n\tstruct device device;\n\tstruct cdev cdev;\n\tint max_queue;\n\tunsigned int timeout;\n\tunsigned int reserved_size;\n\tbsg_sg_io_fn *sg_io_fn;\n};\n\nstruct bsg_job {\n\tstruct device *dev;\n\tstruct kref kref;\n\tunsigned int timeout;\n\tvoid *request;\n\tvoid *reply;\n\tunsigned int request_len;\n\tunsigned int reply_len;\n\tstruct bsg_buffer request_payload;\n\tstruct bsg_buffer reply_payload;\n\tint result;\n\tunsigned int reply_payload_rcv_len;\n\tstruct request *bidi_rq;\n\tstruct bio *bidi_bio;\n\tvoid *dd_data;\n};\n\ntypedef int bsg_job_fn(struct bsg_job *);\n\ntypedef enum blk_eh_timer_return bsg_timeout_fn(struct request *);\n\nstruct bsg_set {\n\tstruct blk_mq_tag_set tag_set;\n\tstruct bsg_device *bd;\n\tbsg_job_fn *job_fn;\n\tbsg_timeout_fn *timeout_fn;\n};\n\ntypedef bool busy_tag_iter_fn(struct request *, void *);\n\nstruct bt_iter_data {\n\tstruct blk_mq_hw_ctx *hctx;\n\tstruct request_queue *q;\n\tbusy_tag_iter_fn *fn;\n\tvoid *data;\n\tbool reserved;\n};\n\nstruct bt_tags_iter_data {\n\tstruct blk_mq_tags *tags;\n\tbusy_tag_iter_fn *fn;\n\tvoid *data;\n\tunsigned int flags;\n};\n\nstruct btf_header {\n\t__u16 magic;\n\t__u8 version;\n\t__u8 flags;\n\t__u32 hdr_len;\n\t__u32 type_off;\n\t__u32 type_len;\n\t__u32 str_off;\n\t__u32 str_len;\n};\n\nstruct btf_kfunc_set_tab;\n\nstruct btf_id_dtor_kfunc_tab;\n\nstruct btf_struct_metas;\n\nstruct btf_struct_ops_tab;\n\nstruct btf {\n\tvoid *data;\n\tstruct btf_type **types;\n\tu32 *resolved_ids;\n\tu32 *resolved_sizes;\n\tconst char *strings;\n\tvoid *nohdr_data;\n\tstruct btf_header hdr;\n\tu32 nr_types;\n\tu32 types_size;\n\tu32 data_size;\n\trefcount_t refcnt;\n\tu32 id;\n\tstruct callback_head rcu;\n\tstruct btf_kfunc_set_tab *kfunc_set_tab;\n\tstruct btf_id_dtor_kfunc_tab *dtor_kfunc_tab;\n\tstruct btf_struct_metas *struct_meta_tab;\n\tstruct btf_struct_ops_tab *struct_ops_tab;\n\tstruct btf *base_btf;\n\tu32 start_id;\n\tu32 start_str_off;\n\tchar name[56];\n\tbool kernel_btf;\n\t__u32 *base_id_map;\n};\n\nstruct btf_anon_stack {\n\tu32 tid;\n\tu32 offset;\n};\n\nstruct btf_array {\n\t__u32 type;\n\t__u32 index_type;\n\t__u32 nelems;\n};\n\nstruct btf_decl_tag {\n\t__s32 component_idx;\n};\n\nstruct btf_enum {\n\t__u32 name_off;\n\t__s32 val;\n};\n\nstruct btf_enum64 {\n\t__u32 name_off;\n\t__u32 val_lo32;\n\t__u32 val_hi32;\n};\n\ntypedef void (*btf_dtor_kfunc_t)(void *);\n\nstruct btf_field_kptr {\n\tstruct btf *btf;\n\tstruct module *module;\n\tbtf_dtor_kfunc_t dtor;\n\tu32 btf_id;\n};\n\nstruct btf_field_graph_root {\n\tstruct btf *btf;\n\tu32 value_btf_id;\n\tu32 node_offset;\n\tstruct btf_record *value_rec;\n};\n\nstruct btf_field {\n\tu32 offset;\n\tu32 size;\n\tenum btf_field_type type;\n\tunion {\n\t\tstruct btf_field_kptr kptr;\n\t\tstruct btf_field_graph_root graph_root;\n\t};\n};\n\nstruct btf_field_desc {\n\tint t_off_cnt;\n\tint t_offs[2];\n\tint m_sz;\n\tint m_off_cnt;\n\tint m_offs[1];\n};\n\nstruct btf_field_info {\n\tenum btf_field_type type;\n\tu32 off;\n\tunion {\n\t\tstruct {\n\t\t\tu32 type_id;\n\t\t} kptr;\n\t\tstruct {\n\t\t\tconst char *node_name;\n\t\t\tu32 value_btf_id;\n\t\t} graph_root;\n\t};\n};\n\nstruct btf_field_iter {\n\tstruct btf_field_desc desc;\n\tvoid *p;\n\tint m_idx;\n\tint off_idx;\n\tint vlen;\n};\n\nstruct btf_id_dtor_kfunc {\n\tu32 btf_id;\n\tu32 kfunc_btf_id;\n};\n\nstruct btf_id_dtor_kfunc_tab {\n\tu32 cnt;\n\tstruct btf_id_dtor_kfunc dtors[0];\n};\n\nstruct btf_id_set {\n\tu32 cnt;\n\tu32 ids[0];\n};\n\nstruct btf_id_set8 {\n\tu32 cnt;\n\tu32 flags;\n\tstruct {\n\t\tu32 id;\n\t\tu32 flags;\n\t} pairs[0];\n};\n\ntypedef int (*btf_kfunc_filter_t)(const struct bpf_prog *, u32);\n\nstruct btf_kfunc_hook_filter {\n\tbtf_kfunc_filter_t filters[16];\n\tu32 nr_filters;\n};\n\nstruct btf_kfunc_id_set {\n\tstruct module *owner;\n\tstruct btf_id_set8 *set;\n\tbtf_kfunc_filter_t filter;\n};\n\nstruct btf_kfunc_set_tab {\n\tstruct btf_id_set8 *sets[14];\n\tstruct btf_kfunc_hook_filter hook_filters[14];\n};\n\nstruct btf_verifier_env;\n\nstruct resolve_vertex;\n\nstruct btf_show;\n\nstruct btf_kind_operations {\n\ts32 (*check_meta)(struct btf_verifier_env *, const struct btf_type *, u32);\n\tint (*resolve)(struct btf_verifier_env *, const struct resolve_vertex *);\n\tint (*check_member)(struct btf_verifier_env *, const struct btf_type *, const struct btf_member *, const struct btf_type *);\n\tint (*check_kflag_member)(struct btf_verifier_env *, const struct btf_type *, const struct btf_member *, const struct btf_type *);\n\tvoid (*log_details)(struct btf_verifier_env *, const struct btf_type *);\n\tvoid (*show)(const struct btf *, const struct btf_type *, u32, void *, u8, struct btf_show *);\n};\n\nstruct btf_member {\n\t__u32 name_off;\n\t__u32 type;\n\t__u32 offset;\n};\n\nstruct btf_module {\n\tstruct list_head list;\n\tstruct module *module;\n\tstruct btf *btf;\n\tstruct bin_attribute *sysfs_attr;\n\tint flags;\n};\n\nstruct btf_name_info {\n\tconst char *name;\n\tbool needs_size: 1;\n\tunsigned int size: 31;\n\t__u32 id;\n};\n\nstruct btf_param {\n\t__u32 name_off;\n\t__u32 type;\n};\n\nstruct btf_ptr {\n\tvoid *ptr;\n\t__u32 type_id;\n\t__u32 flags;\n};\n\nstruct btf_record {\n\tu32 cnt;\n\tu32 field_mask;\n\tint spin_lock_off;\n\tint timer_off;\n\tint wq_off;\n\tint refcount_off;\n\tstruct btf_field fields[0];\n};\n\nstruct btf_relocate {\n\tstruct btf *btf;\n\tconst struct btf *base_btf;\n\tconst struct btf *dist_base_btf;\n\tunsigned int nr_base_types;\n\tunsigned int nr_split_types;\n\tunsigned int nr_dist_base_types;\n\tint dist_str_len;\n\tint base_str_len;\n\t__u32 *id_map;\n\t__u32 *str_map;\n};\n\nstruct btf_sec_info {\n\tu32 off;\n\tu32 len;\n};\n\nstruct btf_show {\n\tu64 flags;\n\tvoid *target;\n\tvoid (*showfn)(struct btf_show *, const char *, struct __va_list_tag *);\n\tconst struct btf *btf;\n\tstruct {\n\t\tu8 depth;\n\t\tu8 depth_to_show;\n\t\tu8 depth_check;\n\t\tu8 array_member: 1;\n\t\tu8 array_terminated: 1;\n\t\tu16 array_encoding;\n\t\tu32 type_id;\n\t\tint status;\n\t\tconst struct btf_type *type;\n\t\tconst struct btf_member *member;\n\t\tchar name[80];\n\t} state;\n\tstruct {\n\t\tu32 size;\n\t\tvoid *head;\n\t\tvoid *data;\n\t\tu8 safe[32];\n\t} obj;\n};\n\nstruct btf_show_snprintf {\n\tstruct btf_show show;\n\tint len_left;\n\tint len;\n};\n\nstruct btf_struct_meta {\n\tu32 btf_id;\n\tstruct btf_record *record;\n};\n\nstruct btf_struct_metas {\n\tu32 cnt;\n\tstruct btf_struct_meta types[0];\n};\n\nstruct btf_struct_ops_tab {\n\tu32 cnt;\n\tu32 capacity;\n\tstruct bpf_struct_ops_desc ops[0];\n};\n\nstruct btf_type {\n\t__u32 name_off;\n\t__u32 info;\n\tunion {\n\t\t__u32 size;\n\t\t__u32 type;\n\t};\n};\n\nstruct btf_var {\n\t__u32 linkage;\n};\n\nstruct btf_var_secinfo {\n\t__u32 type;\n\t__u32 offset;\n\t__u32 size;\n};\n\nstruct resolve_vertex {\n\tconst struct btf_type *t;\n\tu32 type_id;\n\tu16 next_member;\n};\n\nstruct btf_verifier_env {\n\tstruct btf *btf;\n\tu8 *visit_states;\n\tstruct resolve_vertex stack[32];\n\tstruct bpf_verifier_log log;\n\tu32 log_type_id;\n\tu32 top_stack;\n\tenum verifier_phase phase;\n\tenum resolve_mode resolve_mode;\n};\n\nstruct btree_geo {\n\tint keylen;\n\tint no_pairs;\n\tint no_longs;\n};\n\nstruct btree_head {\n\tlong unsigned int *node;\n\tmempool_t *mempool;\n\tint height;\n};\n\nstruct bts_phys {\n\tstruct page *page;\n\tlong unsigned int size;\n\tlong unsigned int offset;\n\tlong unsigned int displacement;\n};\n\nstruct bts_buffer {\n\tsize_t real_size;\n\tunsigned int nr_pages;\n\tunsigned int nr_bufs;\n\tunsigned int cur_buf;\n\tbool snapshot;\n\tlocal_t data_size;\n\tlocal_t head;\n\tlong unsigned int end;\n\tvoid **data_pages;\n\tstruct bts_phys buf[0];\n};\n\nstruct perf_buffer;\n\nstruct perf_output_handle {\n\tstruct perf_event *event;\n\tstruct perf_buffer *rb;\n\tlong unsigned int wakeup;\n\tlong unsigned int size;\n\tu64 aux_flags;\n\tunion {\n\t\tvoid *addr;\n\t\tlong unsigned int head;\n\t};\n\tint page;\n};\n\nstruct debug_store {\n\tu64 bts_buffer_base;\n\tu64 bts_index;\n\tu64 bts_absolute_maximum;\n\tu64 bts_interrupt_threshold;\n\tu64 pebs_buffer_base;\n\tu64 pebs_index;\n\tu64 pebs_absolute_maximum;\n\tu64 pebs_interrupt_threshold;\n\tu64 pebs_event_reset[48];\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct bts_ctx {\n\tstruct perf_output_handle handle;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tstruct debug_store ds_back;\n\tint state;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct bts_record {\n\tu64 from;\n\tu64 to;\n\tu64 flags;\n};\n\nstruct nd_btt;\n\nstruct nd_region;\n\nstruct btt {\n\tstruct gendisk *btt_disk;\n\tstruct list_head arena_list;\n\tstruct dentry *debugfs_dir;\n\tstruct nd_btt *nd_btt;\n\tu64 nlba;\n\tlong long unsigned int rawsize;\n\tu32 lbasize;\n\tu32 sector_size;\n\tstruct nd_region *nd_region;\n\tstruct mutex init_lock;\n\tint init_state;\n\tint num_arenas;\n\tstruct badblocks *phys_bb;\n};\n\nstruct btt_sb {\n\tu8 signature[16];\n\tu8 uuid[16];\n\tu8 parent_uuid[16];\n\t__le32 flags;\n\t__le16 version_major;\n\t__le16 version_minor;\n\t__le32 external_lbasize;\n\t__le32 external_nlba;\n\t__le32 internal_lbasize;\n\t__le32 internal_nlba;\n\t__le32 nfree;\n\t__le32 infosize;\n\t__le64 nextoff;\n\t__le64 dataoff;\n\t__le64 mapoff;\n\t__le64 logoff;\n\t__le64 info2off;\n\tu8 padding[3968];\n\t__le64 checksum;\n};\n\nstruct hlist_nulls_head {\n\tstruct hlist_nulls_node *first;\n};\n\nstruct bucket {\n\tstruct hlist_nulls_head head;\n\traw_spinlock_t raw_lock;\n};\n\nstruct lockdep_map {};\n\nstruct rhash_lock_head;\n\nstruct bucket_table {\n\tunsigned int size;\n\tunsigned int nest;\n\tu32 hash_rnd;\n\tstruct list_head walkers;\n\tstruct callback_head rcu;\n\tstruct bucket_table *future_tbl;\n\tstruct lockdep_map dep_map;\n\tlong: 64;\n\tstruct rhash_lock_head *buckets[0];\n};\n\nstruct buf_sel_arg {\n\tstruct iovec *iovs;\n\tsize_t out_len;\n\tsize_t max_len;\n\tint nr_iovs;\n\tint mode;\n};\n\nstruct buffer_data_page {\n\tu64 time_stamp;\n\tlocal_t commit;\n\tunsigned char data[0];\n};\n\nstruct buffer_data_read_page {\n\tunsigned int order;\n\tstruct buffer_data_page *data;\n};\n\ntypedef void bh_end_io_t(struct buffer_head *, int);\n\nstruct buffer_head {\n\tlong unsigned int b_state;\n\tstruct buffer_head *b_this_page;\n\tunion {\n\t\tstruct page *b_page;\n\t\tstruct folio *b_folio;\n\t};\n\tsector_t b_blocknr;\n\tsize_t b_size;\n\tchar *b_data;\n\tstruct block_device *b_bdev;\n\tbh_end_io_t *b_end_io;\n\tvoid *b_private;\n\tstruct list_head b_assoc_buffers;\n\tstruct address_space *b_assoc_map;\n\tatomic_t b_count;\n\tspinlock_t b_uptodate_lock;\n};\n\nstruct buffer_page {\n\tstruct list_head list;\n\tlocal_t write;\n\tunsigned int read;\n\tlocal_t entries;\n\tlong unsigned int real_end;\n\tunsigned int order;\n\tu32 id;\n\tstruct buffer_data_page *page;\n};\n\nstruct buffer_ref {\n\tstruct trace_buffer *buffer;\n\tvoid *page;\n\tint cpu;\n\trefcount_t refcount;\n};\n\nstruct bug_entry {\n\tint bug_addr_disp;\n\tint file_disp;\n\tshort unsigned int line;\n\tshort unsigned int flags;\n};\n\nstruct builtin_fw {\n\tchar *name;\n\tvoid *data;\n\tlong unsigned int size;\n};\n\nstruct group_data {\n\tint limit[21];\n\tint base[20];\n\tint permute[258];\n\tint minLen;\n\tint maxLen;\n};\n\nstruct bunzip_data {\n\tint writeCopies;\n\tint writePos;\n\tint writeRunCountdown;\n\tint writeCount;\n\tint writeCurrent;\n\tlong int (*fill)(void *, long unsigned int);\n\tlong int inbufCount;\n\tlong int inbufPos;\n\tunsigned char *inbuf;\n\tunsigned int inbufBitCount;\n\tunsigned int inbufBits;\n\tunsigned int crc32Table[256];\n\tunsigned int headerCRC;\n\tunsigned int totalCRC;\n\tunsigned int writeCRC;\n\tunsigned int *dbuf;\n\tunsigned int dbufSize;\n\tunsigned char selectors[32768];\n\tstruct group_data groups[6];\n\tint io_error;\n\tint byteCount[256];\n\tunsigned char symToByte[256];\n\tunsigned char mtfSymbol[256];\n};\n\nstruct bus_attribute {\n\tstruct attribute attr;\n\tssize_t (*show)(const struct bus_type *, char *);\n\tssize_t (*store)(const struct bus_type *, const char *, size_t);\n};\n\nstruct bus_dma_region {\n\tphys_addr_t cpu_start;\n\tdma_addr_t dma_start;\n\tu64 size;\n};\n\nstruct bus_type {\n\tconst char *name;\n\tconst char *dev_name;\n\tconst struct attribute_group **bus_groups;\n\tconst struct attribute_group **dev_groups;\n\tconst struct attribute_group **drv_groups;\n\tint (*match)(struct device *, const struct device_driver *);\n\tint (*uevent)(const struct device *, struct kobj_uevent_env *);\n\tint (*probe)(struct device *);\n\tvoid (*sync_state)(struct device *);\n\tvoid (*remove)(struct device *);\n\tvoid (*shutdown)(struct device *);\n\tint (*online)(struct device *);\n\tint (*offline)(struct device *);\n\tint (*suspend)(struct device *, pm_message_t);\n\tint (*resume)(struct device *);\n\tint (*num_vf)(struct device *);\n\tint (*dma_configure)(struct device *);\n\tvoid (*dma_cleanup)(struct device *);\n\tconst struct dev_pm_ops *pm;\n\tbool need_parent_lock;\n};\n\nstruct bvec_iter_all {\n\tstruct bio_vec bv;\n\tint idx;\n\tunsigned int done;\n};\n\nstruct bzimage64_data {\n\tvoid *bootparams_buf;\n};\n\nstruct cache_head;\n\nstruct cache_deferred_req {\n\tstruct hlist_node hash;\n\tstruct list_head recent;\n\tstruct cache_head *item;\n\tvoid *owner;\n\tvoid (*revisit)(struct cache_deferred_req *, int);\n};\n\nstruct cache_head {\n\tstruct hlist_node cache_list;\n\ttime64_t expiry_time;\n\ttime64_t last_refresh;\n\tstruct kref ref;\n\tlong unsigned int flags;\n};\n\nstruct cache_map {\n\tu64 start;\n\tu64 end;\n\tu64 flags;\n\tu64 type: 8;\n\tu64 fixed: 1;\n};\n\nstruct cache_req {\n\tstruct cache_deferred_req * (*defer)(struct cache_req *);\n\tlong unsigned int thread_wait;\n};\n\nstruct intel_iommu;\n\nstruct cache_tag {\n\tstruct list_head node;\n\tenum cache_tag_type type;\n\tstruct intel_iommu *iommu;\n\tstruct device *dev;\n\tu16 domain_id;\n\tioasid_t pasid;\n\tunsigned int users;\n};\n\nstruct cacheinfo {\n\tunsigned int id;\n\tenum cache_type type;\n\tunsigned int level;\n\tunsigned int coherency_line_size;\n\tunsigned int number_of_sets;\n\tunsigned int ways_of_associativity;\n\tunsigned int physical_line_partition;\n\tunsigned int size;\n\tcpumask_t shared_cpu_map;\n\tunsigned int attributes;\n\tvoid *fw_token;\n\tbool disable_sysfs;\n\tvoid *priv;\n};\n\nstruct cacheline_padding {\n\tchar x[0];\n};\n\nstruct cachestat {\n\t__u64 nr_cache;\n\t__u64 nr_dirty;\n\t__u64 nr_writeback;\n\t__u64 nr_evicted;\n\t__u64 nr_recently_evicted;\n};\n\nstruct cachestat_range {\n\t__u64 off;\n\t__u64 len;\n};\n\nstruct calipso_doi {\n\tu32 doi;\n\tu32 type;\n\trefcount_t refcount;\n\tstruct list_head list;\n\tstruct callback_head rcu;\n};\n\nstruct calipso_map_cache_bkt {\n\tspinlock_t lock;\n\tu32 size;\n\tstruct list_head list;\n};\n\nstruct netlbl_lsm_cache;\n\nstruct calipso_map_cache_entry {\n\tu32 hash;\n\tunsigned char *key;\n\tsize_t key_len;\n\tstruct netlbl_lsm_cache *lsm_data;\n\tu32 activity;\n\tstruct list_head list;\n};\n\nstruct call_function_data {\n\tcall_single_data_t *csd;\n\tcpumask_var_t cpumask;\n\tcpumask_var_t cpumask_ipi;\n};\n\nstruct callback {\n\tvoid (*fn)(void *);\n\tvoid *data;\n};\n\nstruct callback_register {\n\tuint16_t type;\n\tuint16_t flags;\n\txen_callback_t address;\n};\n\nstruct callchain_cpus_entries {\n\tstruct callback_head callback_head;\n\tstruct perf_callchain_entry *cpu_entries[0];\n};\n\nstruct callthunk_sites {\n\ts32 *call_start;\n\ts32 *call_end;\n\tstruct alt_instr *alt_start;\n\tstruct alt_instr *alt_end;\n};\n\nstruct compact_control;\n\nstruct capture_control {\n\tstruct compact_control *cc;\n\tstruct page *page;\n};\n\nstruct cat_datum {\n\tu32 value;\n\tunsigned char isalias;\n};\n\nstruct cb_id {\n\t__u32 idx;\n\t__u32 val;\n};\n\nstruct cc_attr_flags {\n\t__u64 host_sev_snp: 1;\n\t__u64 __resv: 63;\n};\n\nstruct cc_blob_sev_info {\n\tu32 magic;\n\tu16 version;\n\tu16 reserved;\n\tu64 secrets_phys;\n\tu32 secrets_len;\n\tu32 rsvd1;\n\tu64 cpuid_phys;\n\tu32 cpuid_len;\n\tu32 rsvd2;\n};\n\nstruct setup_data {\n\t__u64 next;\n\t__u32 type;\n\t__u32 len;\n\t__u8 data[0];\n};\n\nstruct cc_setup_data {\n\tstruct setup_data header;\n\tu32 cc_blob_address;\n};\n\nstruct ccs_modesel_head {\n\t__u8 _r1;\n\t__u8 medium;\n\t__u8 _r2;\n\t__u8 block_desc_length;\n\t__u8 density;\n\t__u8 number_blocks_hi;\n\t__u8 number_blocks_med;\n\t__u8 number_blocks_lo;\n\t__u8 _r3;\n\t__u8 block_length_hi;\n\t__u8 block_length_med;\n\t__u8 block_length_lo;\n};\n\nstruct cdrom_msf0 {\n\t__u8 minute;\n\t__u8 second;\n\t__u8 frame;\n};\n\nunion cdrom_addr {\n\tstruct cdrom_msf0 msf;\n\tint lba;\n};\n\nstruct cdrom_blk {\n\tunsigned int from;\n\tshort unsigned int len;\n};\n\nstruct cdrom_mechstat_header {\n\t__u8 curslot: 5;\n\t__u8 changer_state: 2;\n\t__u8 fault: 1;\n\t__u8 reserved1: 4;\n\t__u8 door_open: 1;\n\t__u8 mech_state: 3;\n\t__u8 curlba[3];\n\t__u8 nslots;\n\t__u16 slot_tablelen;\n};\n\nstruct cdrom_slot {\n\t__u8 change: 1;\n\t__u8 reserved1: 6;\n\t__u8 disc_present: 1;\n\t__u8 reserved2[3];\n};\n\nstruct cdrom_changer_info {\n\tstruct cdrom_mechstat_header hdr;\n\tstruct cdrom_slot slots[256];\n};\n\nstruct cdrom_device_ops;\n\nstruct cdrom_device_info {\n\tconst struct cdrom_device_ops *ops;\n\tstruct list_head list;\n\tstruct gendisk *disk;\n\tvoid *handle;\n\tint mask;\n\tint speed;\n\tint capacity;\n\tunsigned int options: 30;\n\tunsigned int mc_flags: 2;\n\tunsigned int vfs_events;\n\tunsigned int ioctl_events;\n\tint use_count;\n\tchar name[20];\n\t__u8 sanyo_slot: 2;\n\t__u8 keeplocked: 1;\n\t__u8 reserved: 5;\n\tint cdda_method;\n\t__u8 last_sense;\n\t__u8 media_written;\n\tshort unsigned int mmc3_profile;\n\tint (*exit)(struct cdrom_device_info *);\n\tint mrw_mode_page;\n\tbool opened_for_data;\n\t__s64 last_media_change_ms;\n};\n\nstruct cdrom_multisession;\n\nstruct cdrom_mcn;\n\nstruct packet_command;\n\nstruct cdrom_device_ops {\n\tint (*open)(struct cdrom_device_info *, int);\n\tvoid (*release)(struct cdrom_device_info *);\n\tint (*drive_status)(struct cdrom_device_info *, int);\n\tunsigned int (*check_events)(struct cdrom_device_info *, unsigned int, int);\n\tint (*tray_move)(struct cdrom_device_info *, int);\n\tint (*lock_door)(struct cdrom_device_info *, int);\n\tint (*select_speed)(struct cdrom_device_info *, long unsigned int);\n\tint (*get_last_session)(struct cdrom_device_info *, struct cdrom_multisession *);\n\tint (*get_mcn)(struct cdrom_device_info *, struct cdrom_mcn *);\n\tint (*reset)(struct cdrom_device_info *);\n\tint (*audio_ioctl)(struct cdrom_device_info *, unsigned int, void *);\n\tint (*generic_packet)(struct cdrom_device_info *, struct packet_command *);\n\tint (*read_cdda_bpc)(struct cdrom_device_info *, void *, u32, u32, u8 *);\n\tconst int capability;\n};\n\nstruct request_sense;\n\nstruct cdrom_generic_command {\n\tunsigned char cmd[12];\n\tunsigned char *buffer;\n\tunsigned int buflen;\n\tint stat;\n\tstruct request_sense *sense;\n\tunsigned char data_direction;\n\tint quiet;\n\tint timeout;\n\tunion {\n\t\tvoid *reserved[1];\n\t\tvoid *unused;\n\t};\n};\n\nstruct cdrom_mcn {\n\t__u8 medium_catalog_number[14];\n};\n\nstruct cdrom_msf {\n\t__u8 cdmsf_min0;\n\t__u8 cdmsf_sec0;\n\t__u8 cdmsf_frame0;\n\t__u8 cdmsf_min1;\n\t__u8 cdmsf_sec1;\n\t__u8 cdmsf_frame1;\n};\n\nstruct cdrom_multisession {\n\tunion cdrom_addr addr;\n\t__u8 xa_flag;\n\t__u8 addr_format;\n};\n\nstruct cdrom_read_audio {\n\tunion cdrom_addr addr;\n\t__u8 addr_format;\n\tint nframes;\n\t__u8 *buf;\n};\n\nstruct cdrom_subchnl {\n\t__u8 cdsc_format;\n\t__u8 cdsc_audiostatus;\n\t__u8 cdsc_adr: 4;\n\t__u8 cdsc_ctrl: 4;\n\t__u8 cdsc_trk;\n\t__u8 cdsc_ind;\n\tunion cdrom_addr cdsc_absaddr;\n\tunion cdrom_addr cdsc_reladdr;\n};\n\nstruct cdrom_sysctl_settings {\n\tchar info[1000];\n\tint autoclose;\n\tint autoeject;\n\tint debug;\n\tint lock;\n\tint check;\n};\n\nstruct cdrom_ti {\n\t__u8 cdti_trk0;\n\t__u8 cdti_ind0;\n\t__u8 cdti_trk1;\n\t__u8 cdti_ind1;\n};\n\nstruct cdrom_timed_media_change_info {\n\t__s64 last_media_change;\n\t__u64 media_flags;\n};\n\nstruct cdrom_tocentry {\n\t__u8 cdte_track;\n\t__u8 cdte_adr: 4;\n\t__u8 cdte_ctrl: 4;\n\t__u8 cdte_format;\n\tunion cdrom_addr cdte_addr;\n\t__u8 cdte_datamode;\n};\n\nstruct cdrom_tochdr {\n\t__u8 cdth_trk0;\n\t__u8 cdth_trk1;\n};\n\nstruct cdrom_volctrl {\n\t__u8 channel0;\n\t__u8 channel1;\n\t__u8 channel2;\n\t__u8 channel3;\n};\n\nstruct ce_array {\n\tu64 *array;\n\tunsigned int n;\n\tunsigned int decay_count;\n\tu64 pfns_poisoned;\n\tu64 ces_entered;\n\tu64 decays_done;\n\tunion {\n\t\tstruct {\n\t\t\t__u32 disabled: 1;\n\t\t\t__u32 __resv: 31;\n\t\t};\n\t\t__u32 flags;\n\t};\n};\n\nstruct clock_event_device;\n\nstruct ce_unbind {\n\tstruct clock_event_device *ce;\n\tint res;\n};\n\nstruct cea_db {\n\tu8 tag_length;\n\tu8 data[0];\n};\n\nstruct drm_edid;\n\nstruct drm_edid_iter {\n\tconst struct drm_edid *drm_edid;\n\tint index;\n};\n\nstruct displayid_iter {\n\tconst struct drm_edid *drm_edid;\n\tconst u8 *section;\n\tint length;\n\tint idx;\n\tint ext_index;\n\tu8 version;\n\tu8 primary_use;\n};\n\nstruct cea_db_iter {\n\tstruct drm_edid_iter edid_iter;\n\tstruct displayid_iter displayid_iter;\n\tconst u8 *collection;\n\tint index;\n\tint end;\n};\n\nstruct cea_exception_stacks {\n\tchar DF_stack_guard[4096];\n\tchar DF_stack[8192];\n\tchar NMI_stack_guard[4096];\n\tchar NMI_stack[8192];\n\tchar DB_stack_guard[4096];\n\tchar DB_stack[8192];\n\tchar MCE_stack_guard[4096];\n\tchar MCE_stack[8192];\n\tchar VC_stack_guard[4096];\n\tchar VC_stack[8192];\n\tchar VC2_stack_guard[4096];\n\tchar VC2_stack[8192];\n\tchar IST_top_guard[4096];\n};\n\nstruct cea_sad {\n\tu8 format;\n\tu8 channels;\n\tu8 freq;\n\tu8 byte2;\n};\n\nstruct cee_pfc {\n\t__u8 willing;\n\t__u8 error;\n\t__u8 pfc_en;\n\t__u8 tcs_supported;\n};\n\nstruct cee_pg {\n\t__u8 willing;\n\t__u8 error;\n\t__u8 pg_en;\n\t__u8 tcs_supported;\n\t__u8 pg_bw[8];\n\t__u8 prio_pg[8];\n};\n\nstruct cet_user_state {\n\tu64 user_cet;\n\tu64 user_ssp;\n};\n\nstruct cfg80211_bss_select_adjust {\n\tenum nl80211_band band;\n\ts8 delta;\n};\n\nstruct cfg80211_bss_selection {\n\tenum nl80211_bss_select_attr behaviour;\n\tunion {\n\t\tenum nl80211_band band_pref;\n\t\tstruct cfg80211_bss_select_adjust adjust;\n\t} param;\n};\n\nstruct ieee80211_edmg {\n\tu8 channels;\n\tenum ieee80211_edmg_bw_config bw_config;\n};\n\nstruct ieee80211_channel;\n\nstruct cfg80211_chan_def {\n\tstruct ieee80211_channel *chan;\n\tenum nl80211_chan_width width;\n\tu32 center_freq1;\n\tu32 center_freq2;\n\tstruct ieee80211_edmg edmg;\n\tu16 freq1_offset;\n\tu16 punctured;\n};\n\nstruct cfg80211_crypto_settings {\n\tu32 wpa_versions;\n\tu32 cipher_group;\n\tint n_ciphers_pairwise;\n\tu32 ciphers_pairwise[5];\n\tint n_akm_suites;\n\tu32 akm_suites[10];\n\tbool control_port;\n\t__be16 control_port_ethertype;\n\tbool control_port_no_encrypt;\n\tbool control_port_over_nl80211;\n\tbool control_port_no_preauth;\n\tconst u8 *psk;\n\tconst u8 *sae_pwd;\n\tu8 sae_pwd_len;\n\tenum nl80211_sae_pwe_mechanism sae_pwe;\n};\n\nstruct ieee80211_mcs_info {\n\tu8 rx_mask[10];\n\t__le16 rx_highest;\n\tu8 tx_params;\n\tu8 reserved[3];\n};\n\nstruct ieee80211_ht_cap {\n\t__le16 cap_info;\n\tu8 ampdu_params_info;\n\tstruct ieee80211_mcs_info mcs;\n\t__le16 extended_ht_cap_info;\n\t__le32 tx_BF_cap_info;\n\tu8 antenna_selection_info;\n} __attribute__((packed));\n\nstruct ieee80211_vht_mcs_info {\n\t__le16 rx_mcs_map;\n\t__le16 rx_highest;\n\t__le16 tx_mcs_map;\n\t__le16 tx_highest;\n};\n\nstruct ieee80211_vht_cap {\n\t__le32 vht_cap_info;\n\tstruct ieee80211_vht_mcs_info supp_mcs;\n};\n\nstruct cfg80211_connect_params {\n\tstruct ieee80211_channel *channel;\n\tstruct ieee80211_channel *channel_hint;\n\tconst u8 *bssid;\n\tconst u8 *bssid_hint;\n\tconst u8 *ssid;\n\tsize_t ssid_len;\n\tenum nl80211_auth_type auth_type;\n\tconst u8 *ie;\n\tsize_t ie_len;\n\tbool privacy;\n\tenum nl80211_mfp mfp;\n\tstruct cfg80211_crypto_settings crypto;\n\tconst u8 *key;\n\tu8 key_len;\n\tu8 key_idx;\n\tu32 flags;\n\tint bg_scan_period;\n\tstruct ieee80211_ht_cap ht_capa;\n\tstruct ieee80211_ht_cap ht_capa_mask;\n\tstruct ieee80211_vht_cap vht_capa;\n\tstruct ieee80211_vht_cap vht_capa_mask;\n\tbool pbss;\n\tstruct cfg80211_bss_selection bss_select;\n\tconst u8 *prev_bssid;\n\tconst u8 *fils_erp_username;\n\tsize_t fils_erp_username_len;\n\tconst u8 *fils_erp_realm;\n\tsize_t fils_erp_realm_len;\n\tu16 fils_erp_next_seq_num;\n\tconst u8 *fils_erp_rrk;\n\tsize_t fils_erp_rrk_len;\n\tbool want_1x;\n\tstruct ieee80211_edmg edmg;\n};\n\nstruct key_params;\n\nstruct cfg80211_ibss_params {\n\tconst u8 *ssid;\n\tconst u8 *bssid;\n\tstruct cfg80211_chan_def chandef;\n\tconst u8 *ie;\n\tu8 ssid_len;\n\tu8 ie_len;\n\tu16 beacon_interval;\n\tu32 basic_rates;\n\tbool channel_fixed;\n\tbool privacy;\n\tbool control_port;\n\tbool control_port_over_nl80211;\n\tbool userspace_handles_dfs;\n\tint mcast_rate[6];\n\tstruct ieee80211_ht_cap ht_capa;\n\tstruct ieee80211_ht_cap ht_capa_mask;\n\tstruct key_params *wep_keys;\n\tint wep_tx_key;\n};\n\nstruct cfg80211_ssid {\n\tu8 ssid[32];\n\tu8 ssid_len;\n};\n\nstruct cfg80211_match_set {\n\tstruct cfg80211_ssid ssid;\n\tu8 bssid[6];\n\ts32 rssi_thold;\n};\n\nstruct cfg80211_pkt_pattern {\n\tconst u8 *mask;\n\tconst u8 *pattern;\n\tint pattern_len;\n\tint pkt_offset;\n};\n\nstruct cfg80211_pmsr_capabilities {\n\tunsigned int max_peers;\n\tu8 report_ap_tsf: 1;\n\tu8 randomize_mac_addr: 1;\n\tstruct {\n\t\tu32 preambles;\n\t\tu32 bandwidths;\n\t\ts8 max_bursts_exponent;\n\t\tu8 max_ftms_per_burst;\n\t\tu8 supported: 1;\n\t\tu8 asap: 1;\n\t\tu8 non_asap: 1;\n\t\tu8 request_lci: 1;\n\t\tu8 request_civicloc: 1;\n\t\tu8 trigger_based: 1;\n\t\tu8 non_trigger_based: 1;\n\t} ftm;\n};\n\nstruct cfg80211_sar_freq_ranges;\n\nstruct cfg80211_sar_capa {\n\tenum nl80211_sar_type type;\n\tu32 num_freq_ranges;\n\tconst struct cfg80211_sar_freq_ranges *freq_ranges;\n};\n\nstruct cfg80211_sar_freq_ranges {\n\tu32 start_freq;\n\tu32 end_freq;\n};\n\nstruct cfg80211_sched_scan_plan {\n\tu32 interval;\n\tu32 iterations;\n};\n\nstruct wiphy;\n\nstruct cfg80211_sched_scan_request {\n\tu64 reqid;\n\tstruct cfg80211_ssid *ssids;\n\tint n_ssids;\n\tu32 n_channels;\n\tconst u8 *ie;\n\tsize_t ie_len;\n\tu32 flags;\n\tstruct cfg80211_match_set *match_sets;\n\tint n_match_sets;\n\ts32 min_rssi_thold;\n\tu32 delay;\n\tstruct cfg80211_sched_scan_plan *scan_plans;\n\tint n_scan_plans;\n\tu8 mac_addr[6];\n\tu8 mac_addr_mask[6];\n\tbool relative_rssi_set;\n\ts8 relative_rssi;\n\tstruct cfg80211_bss_select_adjust rssi_adjust;\n\tstruct wiphy *wiphy;\n\tstruct net_device *dev;\n\tlong unsigned int scan_start;\n\tbool report_results;\n\tstruct callback_head callback_head;\n\tu32 owner_nlportid;\n\tbool nl_owner_dead;\n\tstruct list_head list;\n\tstruct ieee80211_channel *channels[0];\n};\n\nstruct cfg80211_wowlan_tcp;\n\nstruct cfg80211_wowlan {\n\tbool any;\n\tbool disconnect;\n\tbool magic_pkt;\n\tbool gtk_rekey_failure;\n\tbool eap_identity_req;\n\tbool four_way_handshake;\n\tbool rfkill_release;\n\tstruct cfg80211_pkt_pattern *patterns;\n\tstruct cfg80211_wowlan_tcp *tcp;\n\tint n_patterns;\n\tstruct cfg80211_sched_scan_request *nd_config;\n};\n\nstruct nl80211_wowlan_tcp_data_seq {\n\t__u32 start;\n\t__u32 offset;\n\t__u32 len;\n};\n\nstruct nl80211_wowlan_tcp_data_token {\n\t__u32 offset;\n\t__u32 len;\n\t__u8 token_stream[0];\n};\n\nstruct cfg80211_wowlan_tcp {\n\tstruct socket *sock;\n\t__be32 src;\n\t__be32 dst;\n\tu16 src_port;\n\tu16 dst_port;\n\tu8 dst_mac[6];\n\tint payload_len;\n\tconst u8 *payload;\n\tstruct nl80211_wowlan_tcp_data_seq payload_seq;\n\tu32 data_interval;\n\tu32 wake_len;\n\tconst u8 *wake_data;\n\tconst u8 *wake_mask;\n\tu32 tokens_size;\n\tstruct nl80211_wowlan_tcp_data_token payload_tok;\n};\n\nstruct cfs_bandwidth {\n\traw_spinlock_t lock;\n\tktime_t period;\n\tu64 quota;\n\tu64 runtime;\n\tu64 burst;\n\tu64 runtime_snap;\n\ts64 hierarchical_quota;\n\tu8 idle;\n\tu8 period_active;\n\tu8 slack_started;\n\tstruct hrtimer period_timer;\n\tstruct hrtimer slack_timer;\n\tstruct list_head throttled_cfs_rq;\n\tint nr_periods;\n\tint nr_throttled;\n\tint nr_burst;\n\tu64 throttled_time;\n\tu64 burst_time;\n};\n\nstruct load_weight {\n\tlong unsigned int weight;\n\tu32 inv_weight;\n};\n\nstruct sched_avg {\n\tu64 last_update_time;\n\tu64 load_sum;\n\tu64 runnable_sum;\n\tu32 util_sum;\n\tu32 period_contrib;\n\tlong unsigned int load_avg;\n\tlong unsigned int runnable_avg;\n\tlong unsigned int util_avg;\n\tunsigned int util_est;\n};\n\nstruct sched_entity;\n\nstruct cfs_rq {\n\tstruct load_weight load;\n\tunsigned int nr_running;\n\tunsigned int h_nr_running;\n\tunsigned int idle_nr_running;\n\tunsigned int idle_h_nr_running;\n\ts64 avg_vruntime;\n\tu64 avg_load;\n\tu64 exec_clock;\n\tu64 min_vruntime;\n\tunsigned int forceidle_seq;\n\tu64 min_vruntime_fi;\n\tstruct rb_root_cached tasks_timeline;\n\tstruct sched_entity *curr;\n\tstruct sched_entity *next;\n\tunsigned int nr_spread_over;\n\tlong: 64;\n\tstruct sched_avg avg;\n\tstruct {\n\t\traw_spinlock_t lock;\n\t\tint nr;\n\t\tlong unsigned int load_avg;\n\t\tlong unsigned int util_avg;\n\t\tlong unsigned int runnable_avg;\n\t\tlong: 64;\n\t\tlong: 64;\n\t\tlong: 64;\n\t\tlong: 64;\n\t} removed;\n\tu64 last_update_tg_load_avg;\n\tlong unsigned int tg_load_avg_contrib;\n\tlong int propagate;\n\tlong int prop_runnable_sum;\n\tlong unsigned int h_load;\n\tu64 last_h_load_update;\n\tstruct sched_entity *h_load_next;\n\tstruct rq *rq;\n\tint on_list;\n\tstruct list_head leaf_cfs_rq_list;\n\tstruct task_group *tg;\n\tint idle;\n\tint runtime_enabled;\n\ts64 runtime_remaining;\n\tu64 throttled_pelt_idle;\n\tu64 throttled_clock;\n\tu64 throttled_clock_pelt;\n\tu64 throttled_clock_pelt_time;\n\tu64 throttled_clock_self;\n\tu64 throttled_clock_self_time;\n\tint throttled;\n\tint throttle_count;\n\tstruct list_head throttled_list;\n\tstruct list_head throttled_csd_list;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct cfs_schedulable_data {\n\tstruct task_group *tg;\n\tu64 period;\n\tu64 quota;\n};\n\nstruct kernfs_ops;\n\nstruct kernfs_open_file;\n\nstruct cftype {\n\tchar name[64];\n\tlong unsigned int private;\n\tsize_t max_write_len;\n\tunsigned int flags;\n\tunsigned int file_offset;\n\tstruct cgroup_subsys *ss;\n\tstruct list_head node;\n\tstruct kernfs_ops *kf_ops;\n\tint (*open)(struct kernfs_open_file *);\n\tvoid (*release)(struct kernfs_open_file *);\n\tu64 (*read_u64)(struct cgroup_subsys_state *, struct cftype *);\n\ts64 (*read_s64)(struct cgroup_subsys_state *, struct cftype *);\n\tint (*seq_show)(struct seq_file *, void *);\n\tvoid * (*seq_start)(struct seq_file *, loff_t *);\n\tvoid * (*seq_next)(struct seq_file *, void *, loff_t *);\n\tvoid (*seq_stop)(struct seq_file *, void *);\n\tint (*write_u64)(struct cgroup_subsys_state *, struct cftype *, u64);\n\tint (*write_s64)(struct cgroup_subsys_state *, struct cftype *, s64);\n\tssize_t (*write)(struct kernfs_open_file *, char *, size_t, loff_t);\n\t__poll_t (*poll)(struct kernfs_open_file *, struct poll_table_struct *);\n\tstruct lock_class_key lockdep_key;\n};\n\nstruct cgroup_file {\n\tstruct kernfs_node *kn;\n\tlong unsigned int notified_at;\n\tstruct timer_list notify_timer;\n};\n\nstruct task_cputime {\n\tu64 stime;\n\tu64 utime;\n\tlong long unsigned int sum_exec_runtime;\n};\n\nstruct cgroup_base_stat {\n\tstruct task_cputime cputime;\n\tu64 forceidle_sum;\n};\n\nstruct prev_cputime {\n\tu64 utime;\n\tu64 stime;\n\traw_spinlock_t lock;\n};\n\nstruct cgroup_bpf {\n\tstruct bpf_prog_array *effective[38];\n\tstruct hlist_head progs[38];\n\tu8 flags[38];\n\tstruct list_head storages;\n\tstruct bpf_prog_array *inactive;\n\tstruct percpu_ref refcnt;\n\tstruct work_struct release_work;\n};\n\nstruct cgroup_freezer_state {\n\tbool freeze;\n\tint e_freeze;\n\tint nr_frozen_descendants;\n\tint nr_frozen_tasks;\n};\n\nstruct cgroup_root;\n\nstruct cgroup_rstat_cpu;\n\nstruct psi_group;\n\nstruct cgroup {\n\tstruct cgroup_subsys_state self;\n\tlong unsigned int flags;\n\tint level;\n\tint max_depth;\n\tint nr_descendants;\n\tint nr_dying_descendants;\n\tint max_descendants;\n\tint nr_populated_csets;\n\tint nr_populated_domain_children;\n\tint nr_populated_threaded_children;\n\tint nr_threaded_children;\n\tstruct kernfs_node *kn;\n\tstruct cgroup_file procs_file;\n\tstruct cgroup_file events_file;\n\tstruct cgroup_file psi_files[3];\n\tu16 subtree_control;\n\tu16 subtree_ss_mask;\n\tu16 old_subtree_control;\n\tu16 old_subtree_ss_mask;\n\tstruct cgroup_subsys_state *subsys[14];\n\tstruct cgroup_root *root;\n\tstruct list_head cset_links;\n\tstruct list_head e_csets[14];\n\tstruct cgroup *dom_cgrp;\n\tstruct cgroup *old_dom_cgrp;\n\tstruct cgroup_rstat_cpu *rstat_cpu;\n\tstruct list_head rstat_css_list;\n\tlong: 64;\n\tlong: 64;\n\tstruct cacheline_padding _pad_;\n\tstruct cgroup *rstat_flush_next;\n\tstruct cgroup_base_stat last_bstat;\n\tstruct cgroup_base_stat bstat;\n\tstruct prev_cputime prev_cputime;\n\tstruct list_head pidlists;\n\tstruct mutex pidlist_mutex;\n\twait_queue_head_t offline_waitq;\n\tstruct work_struct release_agent_work;\n\tstruct psi_group *psi;\n\tstruct cgroup_bpf bpf;\n\tstruct cgroup_freezer_state freezer;\n\tstruct bpf_local_storage *bpf_cgrp_storage;\n\tstruct cgroup *ancestors[0];\n\tlong: 64;\n};\n\nstruct cgroup__safe_rcu {\n\tstruct kernfs_node *kn;\n};\n\nstruct cgroup_cls_state {\n\tstruct cgroup_subsys_state css;\n\tu32 classid;\n};\n\nstruct css_set;\n\nstruct css_task_iter {\n\tstruct cgroup_subsys *ss;\n\tunsigned int flags;\n\tstruct list_head *cset_pos;\n\tstruct list_head *cset_head;\n\tstruct list_head *tcset_pos;\n\tstruct list_head *tcset_head;\n\tstruct list_head *task_pos;\n\tstruct list_head *cur_tasks_head;\n\tstruct css_set *cur_cset;\n\tstruct css_set *cur_dcset;\n\tstruct task_struct *cur_task;\n\tstruct list_head iters_node;\n};\n\nstruct cgroup_namespace;\n\nstruct cgroup_pidlist;\n\nstruct cgroup_file_ctx {\n\tstruct cgroup_namespace *ns;\n\tstruct {\n\t\tvoid *trigger;\n\t} psi;\n\tstruct {\n\t\tbool started;\n\t\tstruct css_task_iter iter;\n\t} procs;\n\tstruct {\n\t\tstruct cgroup_pidlist *pidlist;\n\t} procs1;\n};\n\nstruct kernfs_root;\n\nstruct kernfs_fs_context {\n\tstruct kernfs_root *root;\n\tvoid *ns_tag;\n\tlong unsigned int magic;\n\tbool new_sb_created;\n};\n\nstruct cgroup_fs_context {\n\tstruct kernfs_fs_context kfc;\n\tstruct cgroup_root *root;\n\tstruct cgroup_namespace *ns;\n\tunsigned int flags;\n\tbool cpuset_clone_children;\n\tbool none;\n\tbool all_ss;\n\tu16 subsys_mask;\n\tchar *name;\n\tchar *release_agent;\n};\n\nstruct cgroup_iter_priv {\n\tstruct cgroup_subsys_state *start_css;\n\tbool visited_all;\n\tbool terminate;\n\tint order;\n};\n\nstruct cgroup_lsm_atype {\n\tu32 attach_btf_id;\n\tint refcnt;\n};\n\nstruct cgroup_taskset {\n\tstruct list_head src_csets;\n\tstruct list_head dst_csets;\n\tint nr_tasks;\n\tint ssid;\n\tstruct list_head *csets;\n\tstruct css_set *cur_cset;\n\tstruct task_struct *cur_task;\n};\n\nstruct cgroup_mgctx {\n\tstruct list_head preloaded_src_csets;\n\tstruct list_head preloaded_dst_csets;\n\tstruct cgroup_taskset tset;\n\tu16 ss_mask;\n};\n\nstruct proc_ns_operations;\n\nstruct ns_common {\n\tstruct dentry *stashed;\n\tconst struct proc_ns_operations *ops;\n\tunsigned int inum;\n\trefcount_t count;\n};\n\nstruct ucounts;\n\nstruct cgroup_namespace {\n\tstruct ns_common ns;\n\tstruct user_namespace *user_ns;\n\tstruct ucounts *ucounts;\n\tstruct css_set *root_cset;\n};\n\nstruct cgroup_pidlist {\n\tstruct {\n\t\tenum cgroup_filetype type;\n\t\tstruct pid_namespace *ns;\n\t} key;\n\tpid_t *list;\n\tint length;\n\tstruct list_head links;\n\tstruct cgroup *owner;\n\tstruct delayed_work destroy_dwork;\n};\n\nstruct cgroup_root {\n\tstruct kernfs_root *kf_root;\n\tunsigned int subsys_mask;\n\tint hierarchy_id;\n\tstruct list_head root_list;\n\tstruct callback_head rcu;\n\tlong: 64;\n\tlong: 64;\n\tstruct cgroup cgrp;\n\tstruct cgroup *cgrp_ancestor_storage;\n\tatomic_t nr_cgrps;\n\tunsigned int flags;\n\tchar release_agent_path[4096];\n\tchar name[64];\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct cgroup_rstat_cpu {\n\tstruct u64_stats_sync bsync;\n\tstruct cgroup_base_stat bstat;\n\tstruct cgroup_base_stat last_bstat;\n\tstruct cgroup_base_stat subtree_bstat;\n\tstruct cgroup_base_stat last_subtree_bstat;\n\tstruct cgroup *updated_children;\n\tstruct cgroup *updated_next;\n};\n\nstruct idr {\n\tstruct xarray idr_rt;\n\tunsigned int idr_base;\n\tunsigned int idr_next;\n};\n\nstruct cgroup_subsys {\n\tstruct cgroup_subsys_state * (*css_alloc)(struct cgroup_subsys_state *);\n\tint (*css_online)(struct cgroup_subsys_state *);\n\tvoid (*css_offline)(struct cgroup_subsys_state *);\n\tvoid (*css_released)(struct cgroup_subsys_state *);\n\tvoid (*css_free)(struct cgroup_subsys_state *);\n\tvoid (*css_reset)(struct cgroup_subsys_state *);\n\tvoid (*css_rstat_flush)(struct cgroup_subsys_state *, int);\n\tint (*css_extra_stat_show)(struct seq_file *, struct cgroup_subsys_state *);\n\tint (*css_local_stat_show)(struct seq_file *, struct cgroup_subsys_state *);\n\tint (*can_attach)(struct cgroup_taskset *);\n\tvoid (*cancel_attach)(struct cgroup_taskset *);\n\tvoid (*attach)(struct cgroup_taskset *);\n\tvoid (*post_attach)(void);\n\tint (*can_fork)(struct task_struct *, struct css_set *);\n\tvoid (*cancel_fork)(struct task_struct *, struct css_set *);\n\tvoid (*fork)(struct task_struct *);\n\tvoid (*exit)(struct task_struct *);\n\tvoid (*release)(struct task_struct *);\n\tvoid (*bind)(struct cgroup_subsys_state *);\n\tbool early_init: 1;\n\tbool implicit_on_dfl: 1;\n\tbool threaded: 1;\n\tint id;\n\tconst char *name;\n\tconst char *legacy_name;\n\tstruct cgroup_root *root;\n\tstruct idr css_idr;\n\tstruct list_head cfts;\n\tstruct cftype *dfl_cftypes;\n\tstruct cftype *legacy_cftypes;\n\tunsigned int depends_on;\n};\n\nstruct cgroupstats {\n\t__u64 nr_sleeping;\n\t__u64 nr_running;\n\t__u64 nr_stopped;\n\t__u64 nr_uninterruptible;\n\t__u64 nr_io_wait;\n};\n\nstruct cgrp_cset_link {\n\tstruct cgroup *cgrp;\n\tstruct css_set *cset;\n\tstruct list_head cset_link;\n\tstruct list_head cgrp_link;\n};\n\nstruct linked_page;\n\nstruct chain_allocator {\n\tstruct linked_page *chain;\n\tunsigned int used_space;\n\tgfp_t gfp_mask;\n\tint safe_needed;\n};\n\nstruct e820_entry;\n\nstruct change_member {\n\tstruct e820_entry *entry;\n\tlong long unsigned int addr;\n};\n\nstruct ppp_file {\n\tenum {\n\t\tINTERFACE = 1,\n\t\tCHANNEL = 2,\n\t} kind;\n\tstruct sk_buff_head xq;\n\tstruct sk_buff_head rq;\n\twait_queue_head_t rwait;\n\trefcount_t refcnt;\n\tint hdrlen;\n\tint index;\n\tint dead;\n};\n\nstruct ppp_channel;\n\nstruct ppp;\n\nstruct channel {\n\tstruct ppp_file file;\n\tstruct list_head list;\n\tstruct ppp_channel *chan;\n\tstruct rw_semaphore chan_sem;\n\tspinlock_t downl;\n\tstruct ppp *ppp;\n\tstruct net *chan_net;\n\tnetns_tracker ns_tracker;\n\tstruct list_head clist;\n\trwlock_t upl;\n\tstruct channel *bridge;\n\tu8 avail;\n\tu8 had_frag;\n\tu32 lastseq;\n\tint speed;\n};\n\nstruct ethnl_reply_data {\n\tstruct net_device *dev;\n};\n\nstruct ethtool_channels {\n\t__u32 cmd;\n\t__u32 max_rx;\n\t__u32 max_tx;\n\t__u32 max_other;\n\t__u32 max_combined;\n\t__u32 rx_count;\n\t__u32 tx_count;\n\t__u32 other_count;\n\t__u32 combined_count;\n};\n\nstruct channels_reply_data {\n\tstruct ethnl_reply_data base;\n\tstruct ethtool_channels channels;\n};\n\nstruct char_device_struct {\n\tstruct char_device_struct *next;\n\tunsigned int major;\n\tunsigned int baseminor;\n\tint minorct;\n\tchar name[64];\n\tstruct cdev *cdev;\n};\n\nstruct extcon_dev;\n\nstruct charger_regulator;\n\nstruct charger_manager;\n\nstruct charger_cable {\n\tconst char *extcon_name;\n\tconst char *name;\n\tstruct extcon_dev *extcon_dev;\n\tu64 extcon_type;\n\tstruct work_struct wq;\n\tstruct notifier_block nb;\n\tbool attached;\n\tstruct charger_regulator *charger;\n\tint min_uA;\n\tint max_uA;\n\tstruct charger_manager *cm;\n};\n\nstruct charger_desc {\n\tconst char *psy_name;\n\tenum polling_modes polling_mode;\n\tunsigned int polling_interval_ms;\n\tunsigned int fullbatt_vchkdrop_uV;\n\tunsigned int fullbatt_uV;\n\tunsigned int fullbatt_soc;\n\tunsigned int fullbatt_full_capacity;\n\tenum data_source battery_present;\n\tconst char **psy_charger_stat;\n\tint num_charger_regulators;\n\tstruct charger_regulator *charger_regulators;\n\tconst struct attribute_group **sysfs_groups;\n\tconst char *psy_fuel_gauge;\n\tconst char *thermal_zone;\n\tint temp_min;\n\tint temp_max;\n\tint temp_diff;\n\tbool measure_battery_temp;\n\tu32 charging_max_duration_ms;\n\tu32 discharging_max_duration_ms;\n};\n\nstruct charger_manager {\n\tstruct list_head entry;\n\tstruct device *dev;\n\tstruct charger_desc *desc;\n\tstruct thermal_zone_device *tzd_batt;\n\tbool charger_enabled;\n\tint emergency_stop;\n\tchar psy_name_buf[31];\n\tstruct power_supply_desc charger_psy_desc;\n\tstruct power_supply *charger_psy;\n\tu64 charging_start_time;\n\tu64 charging_end_time;\n\tint battery_status;\n};\n\nstruct regulator;\n\nstruct charger_regulator {\n\tconst char *regulator_name;\n\tstruct regulator *consumer;\n\tint externally_control;\n\tstruct charger_cable *cables;\n\tint num_cables;\n\tstruct attribute_group attr_grp;\n\tstruct device_attribute attr_name;\n\tstruct device_attribute attr_state;\n\tstruct device_attribute attr_externally_control;\n\tstruct attribute *attrs[4];\n\tstruct charger_manager *cm;\n};\n\nstruct qdisc_walker {\n\tint stop;\n\tint skip;\n\tint count;\n\tint (*fn)(struct Qdisc *, long unsigned int, struct qdisc_walker *);\n};\n\nstruct check_loop_arg {\n\tstruct qdisc_walker w;\n\tstruct Qdisc *p;\n\tint depth;\n};\n\nstruct check_mount {\n\tstruct vfsmount *mnt;\n\tunsigned int mounted;\n};\n\nstruct chips_init_reg {\n\tunsigned char addr;\n\tunsigned char data;\n};\n\nstruct chipset {\n\tu32 vendor;\n\tu32 device;\n\tu32 class;\n\tu32 class_mask;\n\tu32 flags;\n\tvoid (*f)(int, int, int);\n};\n\nstruct chksum_ctx {\n\tu32 key;\n};\n\nstruct chksum_desc_ctx {\n\tu32 crc;\n};\n\nstruct chksum_desc_ctx___2 {\n\t__u16 crc;\n};\n\nstruct cipher_context {\n\tchar iv[20];\n\tchar rec_seq[8];\n};\n\nstruct cipso_v4_std_map_tbl;\n\nstruct cipso_v4_doi {\n\tu32 doi;\n\tu32 type;\n\tunion {\n\t\tstruct cipso_v4_std_map_tbl *std;\n\t} map;\n\tu8 tags[5];\n\trefcount_t refcount;\n\tstruct list_head list;\n\tstruct callback_head rcu;\n};\n\nstruct cipso_v4_map_cache_bkt {\n\tspinlock_t lock;\n\tu32 size;\n\tstruct list_head list;\n};\n\nstruct cipso_v4_map_cache_entry {\n\tu32 hash;\n\tunsigned char *key;\n\tsize_t key_len;\n\tstruct netlbl_lsm_cache *lsm_data;\n\tu32 activity;\n\tstruct list_head list;\n};\n\nstruct cipso_v4_std_map_tbl {\n\tstruct {\n\t\tu32 *cipso;\n\t\tu32 *local;\n\t\tu32 cipso_size;\n\t\tu32 local_size;\n\t} lvl;\n\tstruct {\n\t\tu32 *cipso;\n\t\tu32 *local;\n\t\tu32 cipso_size;\n\t\tu32 local_size;\n\t} cat;\n};\n\nstruct mmc_card;\n\nstruct sdio_func;\n\ntypedef int tpl_parse_t(struct mmc_card *, struct sdio_func *, const unsigned char *, unsigned int);\n\nstruct cis_tpl {\n\tunsigned char code;\n\tunsigned char min_size;\n\ttpl_parse_t *parse;\n};\n\nstruct class_attribute {\n\tstruct attribute attr;\n\tssize_t (*show)(const struct class *, const struct class_attribute *, char *);\n\tssize_t (*store)(const struct class *, const struct class_attribute *, const char *, size_t);\n};\n\nstruct class_attribute_string {\n\tstruct class_attribute attr;\n\tchar *str;\n};\n\nstruct class_compat {\n\tstruct kobject *kobj;\n};\n\nstruct hashtab_node;\n\nstruct hashtab {\n\tstruct hashtab_node **htable;\n\tu32 size;\n\tu32 nel;\n};\n\nstruct symtab {\n\tstruct hashtab table;\n\tu32 nprim;\n};\n\nstruct common_datum;\n\nstruct constraint_node;\n\nstruct class_datum {\n\tu32 value;\n\tchar *comkey;\n\tstruct common_datum *comdatum;\n\tstruct symtab permissions;\n\tstruct constraint_node *constraints;\n\tstruct constraint_node *validatetrans;\n\tchar default_user;\n\tchar default_role;\n\tchar default_type;\n\tchar default_range;\n};\n\nstruct klist_iter {\n\tstruct klist *i_klist;\n\tstruct klist_node *i_cur;\n};\n\nstruct subsys_private;\n\nstruct class_dev_iter {\n\tstruct klist_iter ki;\n\tconst struct device_type *type;\n\tstruct subsys_private *sp;\n};\n\nstruct class_dir {\n\tstruct kobject kobj;\n\tconst struct class *class;\n};\n\nstruct class_info {\n\tint class;\n\tchar *class_name;\n};\n\nstruct class_interface {\n\tstruct list_head node;\n\tconst struct class *class;\n\tint (*add_dev)(struct device *);\n\tvoid (*remove_dev)(struct device *);\n};\n\nstruct mmu_notifier_range {\n\tstruct mm_struct *mm;\n\tlong unsigned int start;\n\tlong unsigned int end;\n\tunsigned int flags;\n\tenum mmu_notifier_event event;\n\tvoid *owner;\n};\n\nstruct wp_walk {\n\tstruct mmu_notifier_range range;\n\tlong unsigned int tlbflush_start;\n\tlong unsigned int tlbflush_end;\n\tlong unsigned int total;\n};\n\nstruct clean_walk {\n\tstruct wp_walk base;\n\tlong unsigned int bitmap_pgoff;\n\tlong unsigned int *bitmap;\n\tlong unsigned int start;\n\tlong unsigned int end;\n};\n\nstruct clear_badblocks_context {\n\tresource_size_t phys;\n\tresource_size_t cleared;\n};\n\nstruct clear_refs_private {\n\tenum clear_refs_types type;\n};\n\nstruct clk_core;\n\nstruct clk {\n\tstruct clk_core *core;\n\tstruct device *dev;\n\tconst char *dev_id;\n\tconst char *con_id;\n\tlong unsigned int min_rate;\n\tlong unsigned int max_rate;\n\tunsigned int exclusive_count;\n\tstruct hlist_node clks_node;\n};\n\nstruct clk_bulk_data {\n\tconst char *id;\n\tstruct clk *clk;\n};\n\nstruct clk_bulk_devres {\n\tstruct clk_bulk_data *clks;\n\tint num_clks;\n};\n\nstruct clk_init_data;\n\nstruct clk_hw {\n\tstruct clk_core *core;\n\tstruct clk *clk;\n\tconst struct clk_init_data *init;\n};\n\nstruct clk_rate_request;\n\nstruct clk_duty;\n\nstruct clk_ops {\n\tint (*prepare)(struct clk_hw *);\n\tvoid (*unprepare)(struct clk_hw *);\n\tint (*is_prepared)(struct clk_hw *);\n\tvoid (*unprepare_unused)(struct clk_hw *);\n\tint (*enable)(struct clk_hw *);\n\tvoid (*disable)(struct clk_hw *);\n\tint (*is_enabled)(struct clk_hw *);\n\tvoid (*disable_unused)(struct clk_hw *);\n\tint (*save_context)(struct clk_hw *);\n\tvoid (*restore_context)(struct clk_hw *);\n\tlong unsigned int (*recalc_rate)(struct clk_hw *, long unsigned int);\n\tlong int (*round_rate)(struct clk_hw *, long unsigned int, long unsigned int *);\n\tint (*determine_rate)(struct clk_hw *, struct clk_rate_request *);\n\tint (*set_parent)(struct clk_hw *, u8);\n\tu8 (*get_parent)(struct clk_hw *);\n\tint (*set_rate)(struct clk_hw *, long unsigned int, long unsigned int);\n\tint (*set_rate_and_parent)(struct clk_hw *, long unsigned int, long unsigned int, u8);\n\tlong unsigned int (*recalc_accuracy)(struct clk_hw *, long unsigned int);\n\tint (*get_phase)(struct clk_hw *);\n\tint (*set_phase)(struct clk_hw *, int);\n\tint (*get_duty_cycle)(struct clk_hw *, struct clk_duty *);\n\tint (*set_duty_cycle)(struct clk_hw *, struct clk_duty *);\n\tint (*init)(struct clk_hw *);\n\tvoid (*terminate)(struct clk_hw *);\n\tvoid (*debug_init)(struct clk_hw *, struct dentry *);\n};\n\nstruct clk_composite {\n\tstruct clk_hw hw;\n\tstruct clk_ops ops;\n\tstruct clk_hw *mux_hw;\n\tstruct clk_hw *rate_hw;\n\tstruct clk_hw *gate_hw;\n\tconst struct clk_ops *mux_ops;\n\tconst struct clk_ops *rate_ops;\n\tconst struct clk_ops *gate_ops;\n};\n\nstruct clk_duty {\n\tunsigned int num;\n\tunsigned int den;\n};\n\nstruct clk_parent_map;\n\nstruct clk_core {\n\tconst char *name;\n\tconst struct clk_ops *ops;\n\tstruct clk_hw *hw;\n\tstruct module *owner;\n\tstruct device *dev;\n\tstruct hlist_node rpm_node;\n\tstruct device_node *of_node;\n\tstruct clk_core *parent;\n\tstruct clk_parent_map *parents;\n\tu8 num_parents;\n\tu8 new_parent_index;\n\tlong unsigned int rate;\n\tlong unsigned int req_rate;\n\tlong unsigned int new_rate;\n\tstruct clk_core *new_parent;\n\tstruct clk_core *new_child;\n\tlong unsigned int flags;\n\tbool orphan;\n\tbool rpm_enabled;\n\tunsigned int enable_count;\n\tunsigned int prepare_count;\n\tunsigned int protect_count;\n\tlong unsigned int min_rate;\n\tlong unsigned int max_rate;\n\tlong unsigned int accuracy;\n\tint phase;\n\tstruct clk_duty duty;\n\tstruct hlist_head children;\n\tstruct hlist_node child_node;\n\tstruct hlist_head clks;\n\tunsigned int notifier_count;\n\tstruct dentry *dentry;\n\tstruct hlist_node debug_node;\n\tstruct kref ref;\n};\n\nstruct clk_div_table {\n\tunsigned int val;\n\tunsigned int div;\n};\n\nstruct clk_divider {\n\tstruct clk_hw hw;\n\tvoid *reg;\n\tu8 shift;\n\tu8 width;\n\tu8 flags;\n\tconst struct clk_div_table *table;\n\tspinlock_t *lock;\n};\n\nstruct clk_fixed_factor {\n\tstruct clk_hw hw;\n\tunsigned int mult;\n\tunsigned int div;\n\tlong unsigned int acc;\n\tunsigned int flags;\n};\n\nstruct clk_fixed_rate {\n\tstruct clk_hw hw;\n\tlong unsigned int fixed_rate;\n\tlong unsigned int fixed_accuracy;\n\tlong unsigned int flags;\n};\n\nstruct clk_fractional_divider {\n\tstruct clk_hw hw;\n\tvoid *reg;\n\tu8 mshift;\n\tu8 mwidth;\n\tu8 nshift;\n\tu8 nwidth;\n\tu8 flags;\n\tvoid (*approximation)(struct clk_hw *, long unsigned int, long unsigned int *, long unsigned int *, long unsigned int *);\n\tspinlock_t *lock;\n};\n\nstruct clk_gate {\n\tstruct clk_hw hw;\n\tvoid *reg;\n\tu8 bit_idx;\n\tu8 flags;\n\tspinlock_t *lock;\n};\n\nstruct clk_gpio {\n\tstruct clk_hw hw;\n\tstruct gpio_desc *gpiod;\n};\n\nstruct clk_parent_data;\n\nstruct clk_init_data {\n\tconst char *name;\n\tconst struct clk_ops *ops;\n\tconst char * const *parent_names;\n\tconst struct clk_parent_data *parent_data;\n\tconst struct clk_hw **parent_hws;\n\tu8 num_parents;\n\tlong unsigned int flags;\n};\n\nstruct clk_lookup {\n\tstruct list_head node;\n\tconst char *dev_id;\n\tconst char *con_id;\n\tstruct clk *clk;\n\tstruct clk_hw *clk_hw;\n};\n\nstruct clk_lookup_alloc {\n\tstruct clk_lookup cl;\n\tchar dev_id[24];\n\tchar con_id[16];\n};\n\nstruct clk_multiplier {\n\tstruct clk_hw hw;\n\tvoid *reg;\n\tu8 shift;\n\tu8 width;\n\tu8 flags;\n\tspinlock_t *lock;\n};\n\nstruct clk_mux {\n\tstruct clk_hw hw;\n\tvoid *reg;\n\tconst u32 *table;\n\tu32 mask;\n\tu8 shift;\n\tu8 flags;\n\tspinlock_t *lock;\n};\n\nstruct srcu_node;\n\nstruct srcu_usage {\n\tstruct srcu_node *node;\n\tstruct srcu_node *level[4];\n\tint srcu_size_state;\n\tstruct mutex srcu_cb_mutex;\n\tspinlock_t lock;\n\tstruct mutex srcu_gp_mutex;\n\tlong unsigned int srcu_gp_seq;\n\tlong unsigned int srcu_gp_seq_needed;\n\tlong unsigned int srcu_gp_seq_needed_exp;\n\tlong unsigned int srcu_gp_start;\n\tlong unsigned int srcu_last_gp_end;\n\tlong unsigned int srcu_size_jiffies;\n\tlong unsigned int srcu_n_lock_retries;\n\tlong unsigned int srcu_n_exp_nodelay;\n\tbool sda_is_static;\n\tlong unsigned int srcu_barrier_seq;\n\tstruct mutex srcu_barrier_mutex;\n\tstruct completion srcu_barrier_completion;\n\tatomic_t srcu_barrier_cpu_cnt;\n\tlong unsigned int reschedule_jiffies;\n\tlong unsigned int reschedule_count;\n\tstruct delayed_work work;\n\tstruct srcu_struct *srcu_ssp;\n};\n\nstruct srcu_data;\n\nstruct srcu_struct {\n\tunsigned int srcu_idx;\n\tstruct srcu_data *sda;\n\tstruct lockdep_map dep_map;\n\tstruct srcu_usage *srcu_sup;\n};\n\nstruct srcu_notifier_head {\n\tstruct mutex mutex;\n\tstruct srcu_usage srcuu;\n\tstruct srcu_struct srcu;\n\tstruct notifier_block *head;\n};\n\nstruct clk_notifier {\n\tstruct clk *clk;\n\tstruct srcu_notifier_head notifier_head;\n\tstruct list_head node;\n};\n\nstruct clk_notifier_data {\n\tstruct clk *clk;\n\tlong unsigned int old_rate;\n\tlong unsigned int new_rate;\n};\n\nstruct clk_notifier_devres {\n\tstruct clk *clk;\n\tstruct notifier_block *nb;\n};\n\nstruct clk_parent_data {\n\tconst struct clk_hw *hw;\n\tconst char *fw_name;\n\tconst char *name;\n\tint index;\n};\n\nstruct clk_parent_map {\n\tconst struct clk_hw *hw;\n\tstruct clk_core *core;\n\tconst char *fw_name;\n\tconst char *name;\n\tint index;\n};\n\nstruct clk_plt {\n\tstruct clk_hw hw;\n\tvoid *reg;\n\tstruct clk_lookup *lookup;\n\tspinlock_t lock;\n};\n\nstruct clk_plt_fixed;\n\nstruct clk_plt_data {\n\tstruct clk_plt_fixed **parents;\n\tu8 nparents;\n\tstruct clk_plt *clks[6];\n\tstruct clk_lookup *mclk_lookup;\n\tstruct clk_lookup *ether_clk_lookup;\n};\n\nstruct clk_plt_fixed {\n\tstruct clk_hw *clk;\n\tstruct clk_lookup *lookup;\n};\n\nstruct clk_rate_request {\n\tstruct clk_core *core;\n\tlong unsigned int rate;\n\tlong unsigned int min_rate;\n\tlong unsigned int max_rate;\n\tlong unsigned int best_parent_rate;\n\tstruct clk_hw *best_parent_hw;\n};\n\nstruct clock_event_device {\n\tvoid (*event_handler)(struct clock_event_device *);\n\tint (*set_next_event)(long unsigned int, struct clock_event_device *);\n\tint (*set_next_ktime)(ktime_t, struct clock_event_device *);\n\tktime_t next_event;\n\tu64 max_delta_ns;\n\tu64 min_delta_ns;\n\tu32 mult;\n\tu32 shift;\n\tenum clock_event_state state_use_accessors;\n\tunsigned int features;\n\tlong unsigned int retries;\n\tint (*set_state_periodic)(struct clock_event_device *);\n\tint (*set_state_oneshot)(struct clock_event_device *);\n\tint (*set_state_oneshot_stopped)(struct clock_event_device *);\n\tint (*set_state_shutdown)(struct clock_event_device *);\n\tint (*tick_resume)(struct clock_event_device *);\n\tvoid (*broadcast)(const struct cpumask *);\n\tvoid (*suspend)(struct clock_event_device *);\n\tvoid (*resume)(struct clock_event_device *);\n\tlong unsigned int min_delta_ticks;\n\tlong unsigned int max_delta_ticks;\n\tconst char *name;\n\tint rating;\n\tint irq;\n\tint bound_on;\n\tconst struct cpumask *cpumask;\n\tstruct list_head list;\n\tstruct module *owner;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct clock_identity {\n\tu8 id[8];\n};\n\nstruct clocksource_base;\n\nstruct clocksource {\n\tu64 (*read)(struct clocksource *);\n\tu64 mask;\n\tu32 mult;\n\tu32 shift;\n\tu64 max_idle_ns;\n\tu32 maxadj;\n\tu32 uncertainty_margin;\n\tu64 max_cycles;\n\tu64 max_raw_delta;\n\tconst char *name;\n\tstruct list_head list;\n\tu32 freq_khz;\n\tint rating;\n\tenum clocksource_ids id;\n\tenum vdso_clock_mode vdso_clock_mode;\n\tlong unsigned int flags;\n\tstruct clocksource_base *base;\n\tint (*enable)(struct clocksource *);\n\tvoid (*disable)(struct clocksource *);\n\tvoid (*suspend)(struct clocksource *);\n\tvoid (*resume)(struct clocksource *);\n\tvoid (*mark_unstable)(struct clocksource *);\n\tvoid (*tick_stable)(struct clocksource *);\n\tstruct list_head wd_list;\n\tu64 cs_last;\n\tu64 wd_last;\n\tstruct module *owner;\n};\n\nstruct clocksource_base {\n\tenum clocksource_ids id;\n\tu32 freq_khz;\n\tu64 offset;\n\tu32 numerator;\n\tu32 denominator;\n};\n\nstruct clone_args {\n\t__u64 flags;\n\t__u64 pidfd;\n\t__u64 child_tid;\n\t__u64 parent_tid;\n\t__u64 exit_signal;\n\t__u64 stack;\n\t__u64 stack_size;\n\t__u64 tls;\n\t__u64 set_tid;\n\t__u64 set_tid_size;\n\t__u64 cgroup;\n};\n\nstruct dm_table;\n\nstruct dm_io;\n\nstruct clone_info {\n\tstruct dm_table *map;\n\tstruct bio *bio;\n\tstruct dm_io *io;\n\tsector_t sector;\n\tunsigned int sector_count;\n\tbool is_abnormal_io: 1;\n\tbool submit_as_polled: 1;\n};\n\ntypedef void closure_fn(struct work_struct *);\n\nstruct closure_syncer;\n\nstruct closure {\n\tunion {\n\t\tstruct {\n\t\t\tstruct workqueue_struct *wq;\n\t\t\tstruct closure_syncer *s;\n\t\t\tstruct llist_node list;\n\t\t\tclosure_fn *fn;\n\t\t};\n\t\tstruct work_struct work;\n\t};\n\tstruct closure *parent;\n\tatomic_t remaining;\n\tbool closure_get_happened;\n};\n\nstruct closure_syncer {\n\tstruct task_struct *task;\n\tint done;\n};\n\nstruct closure_waitlist {\n\tstruct llist_head list;\n};\n\nstruct cmdline_subpart;\n\nstruct cmdline_parts {\n\tchar name[32];\n\tunsigned int nr_subparts;\n\tstruct cmdline_subpart *subpart;\n\tstruct cmdline_parts *next_parts;\n};\n\nstruct cmdline_subpart {\n\tchar name[32];\n\tsector_t from;\n\tsector_t size;\n\tint flags;\n\tstruct cmdline_subpart *next_subpart;\n};\n\nstruct cmis_cdb_advert_rpl {\n\tu8 inst_supported;\n\tu8 read_write_len_ext;\n\tu8 resv1;\n\tu8 resv2;\n};\n\nstruct cmis_cdb_fw_mng_features_rpl {\n\tu8 resv1;\n\tu8 resv2;\n\tu8 start_cmd_payload_size;\n\tu8 resv3;\n\tu8 read_write_len_ext;\n\tu8 write_mechanism;\n\tu8 resv4;\n\tu8 resv5;\n\t__be16 max_duration_start;\n\t__be16 resv6;\n\t__be16 max_duration_write;\n\t__be16 max_duration_complete;\n\t__be16 resv7;\n};\n\nstruct cmis_cdb_module_features_rpl {\n\tu8 resv1[34];\n\t__be16 max_completion_time;\n};\n\nstruct cmis_cdb_query_status_pl {\n\tu16 response_delay;\n};\n\nstruct cmis_cdb_query_status_rpl {\n\tu8 length;\n\tu8 status;\n};\n\nstruct cmis_cdb_run_fw_image_pl {\n\tu8 resv1;\n\tu8 image_to_run;\n\tu16 delay_to_reset;\n};\n\nstruct cmis_cdb_start_fw_download_pl_h {\n\t__be32 image_size;\n\t__be32 resv1;\n};\n\nstruct cmis_cdb_start_fw_download_pl {\n\tunion {\n\t\tstruct {\n\t\t\t__be32 image_size;\n\t\t\t__be32 resv1;\n\t\t};\n\t\tstruct cmis_cdb_start_fw_download_pl_h head;\n\t};\n\tu8 vendor_data[112];\n};\n\nstruct cmis_cdb_write_fw_block_lpl_pl {\n\t__be32 block_address;\n\tu8 fw_block[116];\n};\n\nstruct cmis_fw_update_fw_mng_features {\n\tu8 start_cmd_payload_size;\n\tu16 max_duration_start;\n\tu16 max_duration_write;\n\tu16 max_duration_complete;\n};\n\nstruct cmis_password_entry_pl {\n\t__be32 password;\n};\n\nstruct cmis_rev_rpl {\n\tu8 rev;\n};\n\nstruct cmis_wait_for_cond_rpl {\n\tu8 state;\n};\n\nstruct cmos_rtc;\n\nstruct rtc_time;\n\nstruct cmos_read_alarm_callback_param {\n\tstruct cmos_rtc *cmos;\n\tstruct rtc_time *time;\n\tunsigned char rtc_control;\n};\n\nstruct rtc_time {\n\tint tm_sec;\n\tint tm_min;\n\tint tm_hour;\n\tint tm_mday;\n\tint tm_mon;\n\tint tm_year;\n\tint tm_wday;\n\tint tm_yday;\n\tint tm_isdst;\n};\n\nstruct rtc_wkalrm {\n\tunsigned char enabled;\n\tunsigned char pending;\n\tstruct rtc_time time;\n};\n\nstruct rtc_device;\n\nstruct cmos_rtc {\n\tstruct rtc_device *rtc;\n\tstruct device *dev;\n\tint irq;\n\tstruct resource *iomem;\n\ttime64_t alarm_expires;\n\tvoid (*wake_on)(struct device *);\n\tvoid (*wake_off)(struct device *);\n\tu8 enabled_wake;\n\tu8 suspend_ctrl;\n\tu8 day_alrm;\n\tu8 mon_alrm;\n\tu8 century;\n\tstruct rtc_wkalrm saved_wkalrm;\n};\n\nstruct cmos_rtc_board_info {\n\tvoid (*wake_on)(struct device *);\n\tvoid (*wake_off)(struct device *);\n\tu32 flags;\n\tint address_space;\n\tu8 rtc_day_alarm;\n\tu8 rtc_mon_alarm;\n\tu8 rtc_century;\n};\n\nstruct cmos_set_alarm_callback_param {\n\tstruct cmos_rtc *cmos;\n\tunsigned char mon;\n\tunsigned char mday;\n\tunsigned char hrs;\n\tunsigned char min;\n\tunsigned char sec;\n\tstruct rtc_wkalrm *t;\n};\n\nstruct crypto_comp;\n\nstruct cmp_data {\n\tstruct task_struct *thr;\n\tstruct crypto_comp *cc;\n\tatomic_t ready;\n\tatomic_t stop;\n\tint ret;\n\twait_queue_head_t go;\n\twait_queue_head_t done;\n\tsize_t unc_len;\n\tsize_t cmp_len;\n\tunsigned char unc[131072];\n\tunsigned char cmp[143360];\n};\n\nstruct cmsghdr {\n\t__kernel_size_t cmsg_len;\n\tint cmsg_level;\n\tint cmsg_type;\n};\n\nstruct cn_callback_id {\n\tunsigned char name[32];\n\tstruct cb_id id;\n};\n\nstruct cn_queue_dev;\n\nstruct cn_msg;\n\nstruct netlink_skb_parms;\n\nstruct cn_callback_entry {\n\tstruct list_head callback_entry;\n\trefcount_t refcnt;\n\tstruct cn_queue_dev *pdev;\n\tstruct cn_callback_id id;\n\tvoid (*callback)(struct cn_msg *, struct netlink_skb_parms *);\n\tu32 seq;\n\tu32 group;\n};\n\nstruct cn_dev {\n\tstruct cb_id id;\n\tu32 seq;\n\tu32 groups;\n\tstruct sock *nls;\n\tstruct cn_queue_dev *cbdev;\n};\n\nstruct cn_msg {\n\tstruct cb_id id;\n\t__u32 seq;\n\t__u32 ack;\n\t__u16 len;\n\t__u16 flags;\n\t__u8 data[0];\n};\n\nstruct cn_queue_dev {\n\tatomic_t refcnt;\n\tunsigned char name[32];\n\tstruct list_head queue_list;\n\tspinlock_t queue_lock;\n\tstruct sock *nls;\n};\n\nstruct ethtool_coalesce {\n\t__u32 cmd;\n\t__u32 rx_coalesce_usecs;\n\t__u32 rx_max_coalesced_frames;\n\t__u32 rx_coalesce_usecs_irq;\n\t__u32 rx_max_coalesced_frames_irq;\n\t__u32 tx_coalesce_usecs;\n\t__u32 tx_max_coalesced_frames;\n\t__u32 tx_coalesce_usecs_irq;\n\t__u32 tx_max_coalesced_frames_irq;\n\t__u32 stats_block_coalesce_usecs;\n\t__u32 use_adaptive_rx_coalesce;\n\t__u32 use_adaptive_tx_coalesce;\n\t__u32 pkt_rate_low;\n\t__u32 rx_coalesce_usecs_low;\n\t__u32 rx_max_coalesced_frames_low;\n\t__u32 tx_coalesce_usecs_low;\n\t__u32 tx_max_coalesced_frames_low;\n\t__u32 pkt_rate_high;\n\t__u32 rx_coalesce_usecs_high;\n\t__u32 rx_max_coalesced_frames_high;\n\t__u32 tx_coalesce_usecs_high;\n\t__u32 tx_max_coalesced_frames_high;\n\t__u32 rate_sample_interval;\n};\n\nstruct kernel_ethtool_coalesce {\n\tu8 use_cqe_mode_tx;\n\tu8 use_cqe_mode_rx;\n\tu32 tx_aggr_max_bytes;\n\tu32 tx_aggr_max_frames;\n\tu32 tx_aggr_time_usecs;\n};\n\nstruct coalesce_reply_data {\n\tstruct ethnl_reply_data base;\n\tstruct ethtool_coalesce coalesce;\n\tstruct kernel_ethtool_coalesce kernel_coalesce;\n\tu32 supported_params;\n};\n\nstruct collapse_control {\n\tbool is_khugepaged;\n\tu32 node_load[1024];\n\tnodemask_t alloc_nmask;\n};\n\nstruct comm_proc_event {\n\t__kernel_pid_t process_pid;\n\t__kernel_pid_t process_tgid;\n\tchar comm[16];\n};\n\nstruct commit_header {\n\t__be32 h_magic;\n\t__be32 h_blocktype;\n\t__be32 h_sequence;\n\tunsigned char h_chksum_type;\n\tunsigned char h_chksum_size;\n\tunsigned char h_padding[2];\n\t__be32 h_chksum[8];\n\t__be64 h_commit_sec;\n\t__be32 h_commit_nsec;\n};\n\nstruct common_datum {\n\tu32 value;\n\tstruct symtab permissions;\n};\n\nstruct comp_opts {\n\tint dict_size;\n};\n\nstruct zone;\n\nstruct compact_control {\n\tstruct list_head freepages[11];\n\tstruct list_head migratepages;\n\tunsigned int nr_freepages;\n\tunsigned int nr_migratepages;\n\tlong unsigned int free_pfn;\n\tlong unsigned int migrate_pfn;\n\tlong unsigned int fast_start_pfn;\n\tstruct zone *zone;\n\tlong unsigned int total_migrate_scanned;\n\tlong unsigned int total_free_scanned;\n\tshort unsigned int fast_search_fail;\n\tshort int search_order;\n\tconst gfp_t gfp_mask;\n\tint order;\n\tint migratetype;\n\tconst unsigned int alloc_flags;\n\tconst int highest_zoneidx;\n\tenum migrate_mode mode;\n\tbool ignore_skip_hint;\n\tbool no_set_skip_hint;\n\tbool ignore_block_suitable;\n\tbool direct_compaction;\n\tbool proactive_compaction;\n\tbool whole_zone;\n\tbool contended;\n\tbool finish_pageblock;\n\tbool alloc_contig;\n};\n\nstruct compat_blk_user_trace_setup {\n\tchar name[32];\n\tu16 act_mask;\n\tint: 0;\n\tu32 buf_size;\n\tu32 buf_nr;\n\tcompat_u64 start_lba;\n\tcompat_u64 end_lba;\n\tu32 pid;\n} __attribute__((packed));\n\nstruct compat_blkpg_ioctl_arg {\n\tcompat_int_t op;\n\tcompat_int_t flags;\n\tcompat_int_t datalen;\n\tcompat_caddr_t data;\n};\n\nstruct compat_cdrom_generic_command {\n\tunsigned char cmd[12];\n\tcompat_caddr_t buffer;\n\tcompat_uint_t buflen;\n\tcompat_int_t stat;\n\tcompat_caddr_t sense;\n\tunsigned char data_direction;\n\tunsigned char pad[3];\n\tcompat_int_t quiet;\n\tcompat_int_t timeout;\n\tcompat_caddr_t unused;\n};\n\nstruct compat_cdrom_read_audio {\n\tunion cdrom_addr addr;\n\tu8 addr_format;\n\tcompat_int_t nframes;\n\tcompat_caddr_t buf;\n};\n\nstruct compat_cmsghdr {\n\tcompat_size_t cmsg_len;\n\tcompat_int_t cmsg_level;\n\tcompat_int_t cmsg_type;\n};\n\nstruct compat_console_font_op {\n\tcompat_uint_t op;\n\tcompat_uint_t flags;\n\tcompat_uint_t width;\n\tcompat_uint_t height;\n\tcompat_uint_t charcount;\n\tcompat_caddr_t data;\n};\n\nstruct compat_dirent {\n\tu32 d_ino;\n\tcompat_off_t d_off;\n\tu16 d_reclen;\n\tchar d_name[256];\n};\n\nstruct compat_elf_prpsinfo {\n\tchar pr_state;\n\tchar pr_sname;\n\tchar pr_zomb;\n\tchar pr_nice;\n\tcompat_ulong_t pr_flag;\n\t__compat_uid_t pr_uid;\n\t__compat_gid_t pr_gid;\n\tcompat_pid_t pr_pid;\n\tcompat_pid_t pr_ppid;\n\tcompat_pid_t pr_pgrp;\n\tcompat_pid_t pr_sid;\n\tchar pr_fname[16];\n\tchar pr_psargs[80];\n};\n\nstruct compat_elf_siginfo {\n\tcompat_int_t si_signo;\n\tcompat_int_t si_code;\n\tcompat_int_t si_errno;\n};\n\nstruct old_timeval32 {\n\told_time32_t tv_sec;\n\ts32 tv_usec;\n};\n\nstruct compat_elf_prstatus_common {\n\tstruct compat_elf_siginfo pr_info;\n\tshort int pr_cursig;\n\tcompat_ulong_t pr_sigpend;\n\tcompat_ulong_t pr_sighold;\n\tcompat_pid_t pr_pid;\n\tcompat_pid_t pr_ppid;\n\tcompat_pid_t pr_pgrp;\n\tcompat_pid_t pr_sid;\n\tstruct old_timeval32 pr_utime;\n\tstruct old_timeval32 pr_stime;\n\tstruct old_timeval32 pr_cutime;\n\tstruct old_timeval32 pr_cstime;\n};\n\nstruct user_regs_struct {\n\tlong unsigned int r15;\n\tlong unsigned int r14;\n\tlong unsigned int r13;\n\tlong unsigned int r12;\n\tlong unsigned int bp;\n\tlong unsigned int bx;\n\tlong unsigned int r11;\n\tlong unsigned int r10;\n\tlong unsigned int r9;\n\tlong unsigned int r8;\n\tlong unsigned int ax;\n\tlong unsigned int cx;\n\tlong unsigned int dx;\n\tlong unsigned int si;\n\tlong unsigned int di;\n\tlong unsigned int orig_ax;\n\tlong unsigned int ip;\n\tlong unsigned int cs;\n\tlong unsigned int flags;\n\tlong unsigned int sp;\n\tlong unsigned int ss;\n\tlong unsigned int fs_base;\n\tlong unsigned int gs_base;\n\tlong unsigned int ds;\n\tlong unsigned int es;\n\tlong unsigned int fs;\n\tlong unsigned int gs;\n};\n\ntypedef struct user_regs_struct compat_elf_gregset_t;\n\nstruct compat_elf_prstatus {\n\tstruct compat_elf_prstatus_common common;\n\tcompat_elf_gregset_t pr_reg;\n\tcompat_int_t pr_fpvalid;\n};\n\nstruct ethtool_tcpip4_spec {\n\t__be32 ip4src;\n\t__be32 ip4dst;\n\t__be16 psrc;\n\t__be16 pdst;\n\t__u8 tos;\n};\n\nstruct ethtool_ah_espip4_spec {\n\t__be32 ip4src;\n\t__be32 ip4dst;\n\t__be32 spi;\n\t__u8 tos;\n};\n\nstruct ethtool_usrip4_spec {\n\t__be32 ip4src;\n\t__be32 ip4dst;\n\t__be32 l4_4_bytes;\n\t__u8 tos;\n\t__u8 ip_ver;\n\t__u8 proto;\n};\n\nstruct ethtool_tcpip6_spec {\n\t__be32 ip6src[4];\n\t__be32 ip6dst[4];\n\t__be16 psrc;\n\t__be16 pdst;\n\t__u8 tclass;\n};\n\nstruct ethtool_ah_espip6_spec {\n\t__be32 ip6src[4];\n\t__be32 ip6dst[4];\n\t__be32 spi;\n\t__u8 tclass;\n};\n\nstruct ethtool_usrip6_spec {\n\t__be32 ip6src[4];\n\t__be32 ip6dst[4];\n\t__be32 l4_4_bytes;\n\t__u8 tclass;\n\t__u8 l4_proto;\n};\n\nstruct ethhdr {\n\tunsigned char h_dest[6];\n\tunsigned char h_source[6];\n\t__be16 h_proto;\n};\n\nunion ethtool_flow_union {\n\tstruct ethtool_tcpip4_spec tcp_ip4_spec;\n\tstruct ethtool_tcpip4_spec udp_ip4_spec;\n\tstruct ethtool_tcpip4_spec sctp_ip4_spec;\n\tstruct ethtool_ah_espip4_spec ah_ip4_spec;\n\tstruct ethtool_ah_espip4_spec esp_ip4_spec;\n\tstruct ethtool_usrip4_spec usr_ip4_spec;\n\tstruct ethtool_tcpip6_spec tcp_ip6_spec;\n\tstruct ethtool_tcpip6_spec udp_ip6_spec;\n\tstruct ethtool_tcpip6_spec sctp_ip6_spec;\n\tstruct ethtool_ah_espip6_spec ah_ip6_spec;\n\tstruct ethtool_ah_espip6_spec esp_ip6_spec;\n\tstruct ethtool_usrip6_spec usr_ip6_spec;\n\tstruct ethhdr ether_spec;\n\t__u8 hdata[52];\n};\n\nstruct ethtool_flow_ext {\n\t__u8 padding[2];\n\tunsigned char h_dest[6];\n\t__be16 vlan_etype;\n\t__be16 vlan_tci;\n\t__be32 data[2];\n};\n\nstruct compat_ethtool_rx_flow_spec {\n\tu32 flow_type;\n\tunion ethtool_flow_union h_u;\n\tstruct ethtool_flow_ext h_ext;\n\tunion ethtool_flow_union m_u;\n\tstruct ethtool_flow_ext m_ext;\n\tcompat_u64 ring_cookie;\n\tu32 location;\n} __attribute__((packed));\n\nstruct compat_ethtool_rxnfc {\n\tu32 cmd;\n\tu32 flow_type;\n\tcompat_u64 data;\n\tstruct compat_ethtool_rx_flow_spec fs;\n\tu32 rule_cnt;\n\tu32 rule_locs[0];\n} __attribute__((packed));\n\nstruct compat_ext4_new_group_input {\n\tu32 group;\n\tcompat_u64 block_bitmap;\n\tcompat_u64 inode_bitmap;\n\tcompat_u64 inode_table;\n\tu32 blocks_count;\n\tu16 reserved_blocks;\n\tu16 unused;\n} __attribute__((packed));\n\nstruct compat_flock {\n\tshort int l_type;\n\tshort int l_whence;\n\tcompat_off_t l_start;\n\tcompat_off_t l_len;\n\tcompat_pid_t l_pid;\n};\n\nstruct compat_flock64 {\n\tshort int l_type;\n\tshort int l_whence;\n\tcompat_loff_t l_start;\n\tcompat_loff_t l_len;\n\tcompat_pid_t l_pid;\n} __attribute__((packed));\n\nstruct compat_fs_qfilestat {\n\tcompat_u64 dqb_bhardlimit;\n\tcompat_u64 qfs_nblks;\n\tcompat_uint_t qfs_nextents;\n} __attribute__((packed));\n\nstruct compat_fs_quota_stat {\n\t__s8 qs_version;\n\t__u16 qs_flags;\n\t__s8 qs_pad;\n\tlong: 0;\n\tstruct compat_fs_qfilestat qs_uquota;\n\tstruct compat_fs_qfilestat qs_gquota;\n\tcompat_uint_t qs_incoredqs;\n\tcompat_int_t qs_btimelimit;\n\tcompat_int_t qs_itimelimit;\n\tcompat_int_t qs_rtbtimelimit;\n\t__u16 qs_bwarnlimit;\n\t__u16 qs_iwarnlimit;\n};\n\nstruct dir_context;\n\ntypedef bool (*filldir_t)(struct dir_context *, const char *, int, loff_t, u64, unsigned int);\n\nstruct dir_context {\n\tfilldir_t actor;\n\tloff_t pos;\n};\n\nstruct compat_linux_dirent;\n\nstruct compat_getdents_callback {\n\tstruct dir_context ctx;\n\tstruct compat_linux_dirent *current_dir;\n\tint prev_reclen;\n\tint count;\n\tint error;\n};\n\nstruct compat_group_filter {\n\tunion {\n\t\tstruct {\n\t\t\t__u32 gf_interface_aux;\n\t\t\tstruct __kernel_sockaddr_storage gf_group_aux;\n\t\t\t__u32 gf_fmode_aux;\n\t\t\t__u32 gf_numsrc_aux;\n\t\t\tstruct __kernel_sockaddr_storage gf_slist[1];\n\t\t} __attribute__((packed));\n\t\tstruct {\n\t\t\t__u32 gf_interface;\n\t\t\tstruct __kernel_sockaddr_storage gf_group;\n\t\t\t__u32 gf_fmode;\n\t\t\t__u32 gf_numsrc;\n\t\t\tstruct __kernel_sockaddr_storage gf_slist_flex[0];\n\t\t} __attribute__((packed));\n\t};\n};\n\nstruct compat_group_req {\n\t__u32 gr_interface;\n\tstruct __kernel_sockaddr_storage gr_group;\n} __attribute__((packed));\n\nstruct compat_group_source_req {\n\t__u32 gsr_interface;\n\tstruct __kernel_sockaddr_storage gsr_group;\n\tstruct __kernel_sockaddr_storage gsr_source;\n} __attribute__((packed));\n\nstruct compat_hd_geometry {\n\tunsigned char heads;\n\tunsigned char sectors;\n\tshort unsigned int cylinders;\n\tu32 start;\n};\n\nstruct compat_hpet_info {\n\tcompat_ulong_t hi_ireqfreq;\n\tcompat_ulong_t hi_flags;\n\tshort unsigned int hi_hpet;\n\tshort unsigned int hi_timer;\n};\n\nstruct compat_if_dqblk {\n\tcompat_u64 dqb_bhardlimit;\n\tcompat_u64 dqb_bsoftlimit;\n\tcompat_u64 dqb_curspace;\n\tcompat_u64 dqb_ihardlimit;\n\tcompat_u64 dqb_isoftlimit;\n\tcompat_u64 dqb_curinodes;\n\tcompat_u64 dqb_btime;\n\tcompat_u64 dqb_itime;\n\tcompat_uint_t dqb_valid;\n} __attribute__((packed));\n\nstruct compat_if_settings {\n\tunsigned int type;\n\tunsigned int size;\n\tcompat_uptr_t ifs_ifsu;\n};\n\nstruct compat_ifconf {\n\tcompat_int_t ifc_len;\n\tcompat_caddr_t ifcbuf;\n};\n\nstruct compat_ifmap {\n\tcompat_ulong_t mem_start;\n\tcompat_ulong_t mem_end;\n\tshort unsigned int base_addr;\n\tunsigned char irq;\n\tunsigned char dma;\n\tunsigned char port;\n};\n\nstruct compat_ifreq {\n\tunion {\n\t\tchar ifrn_name[16];\n\t} ifr_ifrn;\n\tunion {\n\t\tstruct sockaddr ifru_addr;\n\t\tstruct sockaddr ifru_dstaddr;\n\t\tstruct sockaddr ifru_broadaddr;\n\t\tstruct sockaddr ifru_netmask;\n\t\tstruct sockaddr ifru_hwaddr;\n\t\tshort int ifru_flags;\n\t\tcompat_int_t ifru_ivalue;\n\t\tcompat_int_t ifru_mtu;\n\t\tstruct compat_ifmap ifru_map;\n\t\tchar ifru_slave[16];\n\t\tchar ifru_newname[16];\n\t\tcompat_caddr_t ifru_data;\n\t\tstruct compat_if_settings ifru_settings;\n\t} ifr_ifru;\n};\n\nstruct compat_in6_rtmsg {\n\tstruct in6_addr rtmsg_dst;\n\tstruct in6_addr rtmsg_src;\n\tstruct in6_addr rtmsg_gateway;\n\tu32 rtmsg_type;\n\tu16 rtmsg_dst_len;\n\tu16 rtmsg_src_len;\n\tu32 rtmsg_metric;\n\tu32 rtmsg_info;\n\tu32 rtmsg_flags;\n\ts32 rtmsg_ifindex;\n};\n\nstruct compat_iovec {\n\tcompat_uptr_t iov_base;\n\tcompat_size_t iov_len;\n};\n\nstruct compat_ipc64_perm {\n\tcompat_key_t key;\n\t__compat_uid32_t uid;\n\t__compat_gid32_t gid;\n\t__compat_uid32_t cuid;\n\t__compat_gid32_t cgid;\n\tcompat_mode_t mode;\n\tunsigned char __pad1[2];\n\tcompat_ushort_t seq;\n\tcompat_ushort_t __pad2;\n\tcompat_ulong_t unused1;\n\tcompat_ulong_t unused2;\n};\n\nstruct compat_ipc_kludge {\n\tcompat_uptr_t msgp;\n\tcompat_long_t msgtyp;\n};\n\nstruct compat_ipc_perm {\n\tkey_t key;\n\t__compat_uid_t uid;\n\t__compat_gid_t gid;\n\t__compat_uid_t cuid;\n\t__compat_gid_t cgid;\n\tcompat_mode_t mode;\n\tshort unsigned int seq;\n};\n\nstruct compat_iw_point {\n\tcompat_caddr_t pointer;\n\t__u16 length;\n\t__u16 flags;\n};\n\nstruct compat_kexec_segment {\n\tcompat_uptr_t buf;\n\tcompat_size_t bufsz;\n\tcompat_ulong_t mem;\n\tcompat_size_t memsz;\n};\n\nstruct compat_keyctl_kdf_params {\n\tcompat_uptr_t hashname;\n\tcompat_uptr_t otherinfo;\n\t__u32 otherinfolen;\n\t__u32 __spare[8];\n};\n\nstruct compat_linux_dirent {\n\tcompat_ulong_t d_ino;\n\tcompat_ulong_t d_off;\n\tshort unsigned int d_reclen;\n\tchar d_name[0];\n};\n\nstruct compat_loop_info {\n\tcompat_int_t lo_number;\n\tcompat_dev_t lo_device;\n\tcompat_ulong_t lo_inode;\n\tcompat_dev_t lo_rdevice;\n\tcompat_int_t lo_offset;\n\tcompat_int_t lo_encrypt_type;\n\tcompat_int_t lo_encrypt_key_size;\n\tcompat_int_t lo_flags;\n\tchar lo_name[64];\n\tunsigned char lo_encrypt_key[32];\n\tcompat_ulong_t lo_init[2];\n\tchar reserved[4];\n};\n\nstruct compat_msghdr {\n\tcompat_uptr_t msg_name;\n\tcompat_int_t msg_namelen;\n\tcompat_uptr_t msg_iov;\n\tcompat_size_t msg_iovlen;\n\tcompat_uptr_t msg_control;\n\tcompat_size_t msg_controllen;\n\tcompat_uint_t msg_flags;\n};\n\nstruct compat_mmsghdr {\n\tstruct compat_msghdr msg_hdr;\n\tcompat_uint_t msg_len;\n};\n\nstruct compat_mq_attr {\n\tcompat_long_t mq_flags;\n\tcompat_long_t mq_maxmsg;\n\tcompat_long_t mq_msgsize;\n\tcompat_long_t mq_curmsgs;\n\tcompat_long_t __reserved[4];\n};\n\nstruct compat_msgbuf {\n\tcompat_long_t mtype;\n\tchar mtext[1];\n};\n\nstruct compat_msqid64_ds {\n\tstruct compat_ipc64_perm msg_perm;\n\tcompat_ulong_t msg_stime;\n\tcompat_ulong_t msg_stime_high;\n\tcompat_ulong_t msg_rtime;\n\tcompat_ulong_t msg_rtime_high;\n\tcompat_ulong_t msg_ctime;\n\tcompat_ulong_t msg_ctime_high;\n\tcompat_ulong_t msg_cbytes;\n\tcompat_ulong_t msg_qnum;\n\tcompat_ulong_t msg_qbytes;\n\tcompat_pid_t msg_lspid;\n\tcompat_pid_t msg_lrpid;\n\tcompat_ulong_t __unused4;\n\tcompat_ulong_t __unused5;\n};\n\nstruct compat_msqid_ds {\n\tstruct compat_ipc_perm msg_perm;\n\tcompat_uptr_t msg_first;\n\tcompat_uptr_t msg_last;\n\told_time32_t msg_stime;\n\told_time32_t msg_rtime;\n\told_time32_t msg_ctime;\n\tcompat_ulong_t msg_lcbytes;\n\tcompat_ulong_t msg_lqbytes;\n\tshort unsigned int msg_cbytes;\n\tshort unsigned int msg_qnum;\n\tshort unsigned int msg_qbytes;\n\tcompat_ipc_pid_t msg_lspid;\n\tcompat_ipc_pid_t msg_lrpid;\n};\n\nstruct compat_old_linux_dirent {\n\tcompat_ulong_t d_ino;\n\tcompat_ulong_t d_offset;\n\tshort unsigned int d_namlen;\n\tchar d_name[0];\n};\n\nstruct compat_old_sigaction {\n\tcompat_uptr_t sa_handler;\n\tcompat_old_sigset_t sa_mask;\n\tcompat_ulong_t sa_flags;\n\tcompat_uptr_t sa_restorer;\n};\n\nstruct compat_readdir_callback {\n\tstruct dir_context ctx;\n\tstruct compat_old_linux_dirent *dirent;\n\tint result;\n};\n\nstruct compat_resume_swap_area {\n\tcompat_loff_t offset;\n\tu32 dev;\n} __attribute__((packed));\n\nstruct compat_rlimit {\n\tcompat_ulong_t rlim_cur;\n\tcompat_ulong_t rlim_max;\n};\n\nstruct compat_robust_list {\n\tcompat_uptr_t next;\n};\n\nstruct compat_robust_list_head {\n\tstruct compat_robust_list list;\n\tcompat_long_t futex_offset;\n\tcompat_uptr_t list_op_pending;\n};\n\nstruct compat_rtentry {\n\tu32 rt_pad1;\n\tstruct sockaddr rt_dst;\n\tstruct sockaddr rt_gateway;\n\tstruct sockaddr rt_genmask;\n\tshort unsigned int rt_flags;\n\tshort int rt_pad2;\n\tu32 rt_pad3;\n\tunsigned char rt_tos;\n\tunsigned char rt_class;\n\tshort int rt_pad4;\n\tshort int rt_metric;\n\tcompat_uptr_t rt_dev;\n\tu32 rt_mtu;\n\tu32 rt_window;\n\tshort unsigned int rt_irtt;\n};\n\nstruct compat_rusage {\n\tstruct old_timeval32 ru_utime;\n\tstruct old_timeval32 ru_stime;\n\tcompat_long_t ru_maxrss;\n\tcompat_long_t ru_ixrss;\n\tcompat_long_t ru_idrss;\n\tcompat_long_t ru_isrss;\n\tcompat_long_t ru_minflt;\n\tcompat_long_t ru_majflt;\n\tcompat_long_t ru_nswap;\n\tcompat_long_t ru_inblock;\n\tcompat_long_t ru_oublock;\n\tcompat_long_t ru_msgsnd;\n\tcompat_long_t ru_msgrcv;\n\tcompat_long_t ru_nsignals;\n\tcompat_long_t ru_nvcsw;\n\tcompat_long_t ru_nivcsw;\n};\n\nstruct compat_sel_arg_struct {\n\tcompat_ulong_t n;\n\tcompat_uptr_t inp;\n\tcompat_uptr_t outp;\n\tcompat_uptr_t exp;\n\tcompat_uptr_t tvp;\n};\n\nstruct compat_semid64_ds {\n\tstruct compat_ipc64_perm sem_perm;\n\tcompat_ulong_t sem_otime;\n\tcompat_ulong_t sem_otime_high;\n\tcompat_ulong_t sem_ctime;\n\tcompat_ulong_t sem_ctime_high;\n\tcompat_ulong_t sem_nsems;\n\tcompat_ulong_t __unused3;\n\tcompat_ulong_t __unused4;\n};\n\nstruct compat_semid_ds {\n\tstruct compat_ipc_perm sem_perm;\n\told_time32_t sem_otime;\n\told_time32_t sem_ctime;\n\tcompat_uptr_t sem_base;\n\tcompat_uptr_t sem_pending;\n\tcompat_uptr_t sem_pending_last;\n\tcompat_uptr_t undo;\n\tshort unsigned int sem_nsems;\n};\n\nstruct compat_sg_io_hdr {\n\tcompat_int_t interface_id;\n\tcompat_int_t dxfer_direction;\n\tunsigned char cmd_len;\n\tunsigned char mx_sb_len;\n\tshort unsigned int iovec_count;\n\tcompat_uint_t dxfer_len;\n\tcompat_uint_t dxferp;\n\tcompat_uptr_t cmdp;\n\tcompat_uptr_t sbp;\n\tcompat_uint_t timeout;\n\tcompat_uint_t flags;\n\tcompat_int_t pack_id;\n\tcompat_uptr_t usr_ptr;\n\tunsigned char status;\n\tunsigned char masked_status;\n\tunsigned char msg_status;\n\tunsigned char sb_len_wr;\n\tshort unsigned int host_status;\n\tshort unsigned int driver_status;\n\tcompat_int_t resid;\n\tcompat_uint_t duration;\n\tcompat_uint_t info;\n};\n\nstruct compat_sg_req_info {\n\tchar req_state;\n\tchar orphan;\n\tchar sg_io_owned;\n\tchar problem;\n\tint pack_id;\n\tcompat_uptr_t usr_ptr;\n\tunsigned int duration;\n\tint unused;\n};\n\nstruct compat_shm_info {\n\tcompat_int_t used_ids;\n\tcompat_ulong_t shm_tot;\n\tcompat_ulong_t shm_rss;\n\tcompat_ulong_t shm_swp;\n\tcompat_ulong_t swap_attempts;\n\tcompat_ulong_t swap_successes;\n};\n\nstruct compat_shmid64_ds {\n\tstruct compat_ipc64_perm shm_perm;\n\tcompat_size_t shm_segsz;\n\tcompat_ulong_t shm_atime;\n\tcompat_ulong_t shm_atime_high;\n\tcompat_ulong_t shm_dtime;\n\tcompat_ulong_t shm_dtime_high;\n\tcompat_ulong_t shm_ctime;\n\tcompat_ulong_t shm_ctime_high;\n\tcompat_pid_t shm_cpid;\n\tcompat_pid_t shm_lpid;\n\tcompat_ulong_t shm_nattch;\n\tcompat_ulong_t __unused4;\n\tcompat_ulong_t __unused5;\n};\n\nstruct compat_shmid_ds {\n\tstruct compat_ipc_perm shm_perm;\n\tint shm_segsz;\n\told_time32_t shm_atime;\n\told_time32_t shm_dtime;\n\told_time32_t shm_ctime;\n\tcompat_ipc_pid_t shm_cpid;\n\tcompat_ipc_pid_t shm_lpid;\n\tshort unsigned int shm_nattch;\n\tshort unsigned int shm_unused;\n\tcompat_uptr_t shm_unused2;\n\tcompat_uptr_t shm_unused3;\n};\n\nstruct compat_shminfo64 {\n\tcompat_ulong_t shmmax;\n\tcompat_ulong_t shmmin;\n\tcompat_ulong_t shmmni;\n\tcompat_ulong_t shmseg;\n\tcompat_ulong_t shmall;\n\tcompat_ulong_t __unused1;\n\tcompat_ulong_t __unused2;\n\tcompat_ulong_t __unused3;\n\tcompat_ulong_t __unused4;\n};\n\nstruct compat_sigaction {\n\tcompat_uptr_t sa_handler;\n\tcompat_ulong_t sa_flags;\n\tcompat_uptr_t sa_restorer;\n\tcompat_sigset_t sa_mask;\n};\n\nstruct compat_sigaltstack {\n\tcompat_uptr_t ss_sp;\n\tint ss_flags;\n\tcompat_size_t ss_size;\n};\n\ntypedef struct compat_sigaltstack compat_stack_t;\n\nunion compat_sigval {\n\tcompat_int_t sival_int;\n\tcompat_uptr_t sival_ptr;\n};\n\ntypedef union compat_sigval compat_sigval_t;\n\nstruct compat_sigevent {\n\tcompat_sigval_t sigev_value;\n\tcompat_int_t sigev_signo;\n\tcompat_int_t sigev_notify;\n\tunion {\n\t\tcompat_int_t _pad[13];\n\t\tcompat_int_t _tid;\n\t\tstruct {\n\t\t\tcompat_uptr_t _function;\n\t\t\tcompat_uptr_t _attribute;\n\t\t} _sigev_thread;\n\t} _sigev_un;\n};\n\nstruct compat_siginfo {\n\tint si_signo;\n\tint si_errno;\n\tint si_code;\n\tunion {\n\t\tint _pad[29];\n\t\tstruct {\n\t\t\tcompat_pid_t _pid;\n\t\t\t__compat_uid32_t _uid;\n\t\t} _kill;\n\t\tstruct {\n\t\t\tcompat_timer_t _tid;\n\t\t\tint _overrun;\n\t\t\tcompat_sigval_t _sigval;\n\t\t} _timer;\n\t\tstruct {\n\t\t\tcompat_pid_t _pid;\n\t\t\t__compat_uid32_t _uid;\n\t\t\tcompat_sigval_t _sigval;\n\t\t} _rt;\n\t\tstruct {\n\t\t\tcompat_pid_t _pid;\n\t\t\t__compat_uid32_t _uid;\n\t\t\tint _status;\n\t\t\tcompat_clock_t _utime;\n\t\t\tcompat_clock_t _stime;\n\t\t} _sigchld;\n\t\tstruct {\n\t\t\tcompat_uptr_t _addr;\n\t\t\tunion {\n\t\t\t\tint _trapno;\n\t\t\t\tshort int _addr_lsb;\n\t\t\t\tstruct {\n\t\t\t\t\tchar _dummy_bnd[4];\n\t\t\t\t\tcompat_uptr_t _lower;\n\t\t\t\t\tcompat_uptr_t _upper;\n\t\t\t\t} _addr_bnd;\n\t\t\t\tstruct {\n\t\t\t\t\tchar _dummy_pkey[4];\n\t\t\t\t\tu32 _pkey;\n\t\t\t\t} _addr_pkey;\n\t\t\t\tstruct {\n\t\t\t\t\tcompat_ulong_t _data;\n\t\t\t\t\tu32 _type;\n\t\t\t\t\tu32 _flags;\n\t\t\t\t} _perf;\n\t\t\t};\n\t\t} _sigfault;\n\t\tstruct {\n\t\t\tcompat_long_t _band;\n\t\t\tint _fd;\n\t\t} _sigpoll;\n\t\tstruct {\n\t\t\tcompat_uptr_t _call_addr;\n\t\t\tint _syscall;\n\t\t\tunsigned int _arch;\n\t\t} _sigsys;\n\t} _sifields;\n};\n\ntypedef struct compat_siginfo compat_siginfo_t;\n\nstruct compat_sigset_argpack {\n\tcompat_uptr_t p;\n\tcompat_size_t size;\n};\n\nstruct compat_sioc_mif_req6 {\n\tmifi_t mifi;\n\tcompat_ulong_t icount;\n\tcompat_ulong_t ocount;\n\tcompat_ulong_t ibytes;\n\tcompat_ulong_t obytes;\n};\n\nstruct in_addr {\n\t__be32 s_addr;\n};\n\nstruct compat_sioc_sg_req {\n\tstruct in_addr src;\n\tstruct in_addr grp;\n\tcompat_ulong_t pktcnt;\n\tcompat_ulong_t bytecnt;\n\tcompat_ulong_t wrong_if;\n};\n\nstruct sockaddr_in6 {\n\tshort unsigned int sin6_family;\n\t__be16 sin6_port;\n\t__be32 sin6_flowinfo;\n\tstruct in6_addr sin6_addr;\n\t__u32 sin6_scope_id;\n};\n\nstruct compat_sioc_sg_req6 {\n\tstruct sockaddr_in6 src;\n\tstruct sockaddr_in6 grp;\n\tcompat_ulong_t pktcnt;\n\tcompat_ulong_t bytecnt;\n\tcompat_ulong_t wrong_if;\n};\n\nstruct compat_sioc_vif_req {\n\tvifi_t vifi;\n\tcompat_ulong_t icount;\n\tcompat_ulong_t ocount;\n\tcompat_ulong_t ibytes;\n\tcompat_ulong_t obytes;\n};\n\nstruct compat_sock_fprog {\n\tu16 len;\n\tcompat_uptr_t filter;\n};\n\nstruct compat_stat {\n\tu32 st_dev;\n\tcompat_ino_t st_ino;\n\tcompat_mode_t st_mode;\n\tcompat_nlink_t st_nlink;\n\t__compat_uid_t st_uid;\n\t__compat_gid_t st_gid;\n\tu32 st_rdev;\n\tu32 st_size;\n\tu32 st_blksize;\n\tu32 st_blocks;\n\tu32 st_atime;\n\tu32 st_atime_nsec;\n\tu32 st_mtime;\n\tu32 st_mtime_nsec;\n\tu32 st_ctime;\n\tu32 st_ctime_nsec;\n\tu32 __unused4;\n\tu32 __unused5;\n};\n\nstruct compat_statfs {\n\tint f_type;\n\tint f_bsize;\n\tint f_blocks;\n\tint f_bfree;\n\tint f_bavail;\n\tint f_files;\n\tint f_ffree;\n\tcompat_fsid_t f_fsid;\n\tint f_namelen;\n\tint f_frsize;\n\tint f_flags;\n\tint f_spare[4];\n};\n\nstruct compat_statfs64 {\n\t__u32 f_type;\n\t__u32 f_bsize;\n\t__u64 f_blocks;\n\t__u64 f_bfree;\n\t__u64 f_bavail;\n\t__u64 f_files;\n\t__u64 f_ffree;\n\t__kernel_fsid_t f_fsid;\n\t__u32 f_namelen;\n\t__u32 f_frsize;\n\t__u32 f_flags;\n\t__u32 f_spare[4];\n} __attribute__((packed));\n\nstruct compat_sysinfo {\n\ts32 uptime;\n\tu32 loads[3];\n\tu32 totalram;\n\tu32 freeram;\n\tu32 sharedram;\n\tu32 bufferram;\n\tu32 totalswap;\n\tu32 freeswap;\n\tu16 procs;\n\tu16 pad;\n\tu32 totalhigh;\n\tu32 freehigh;\n\tu32 mem_unit;\n\tchar _f[8];\n};\n\nstruct compat_tms {\n\tcompat_clock_t tms_utime;\n\tcompat_clock_t tms_stime;\n\tcompat_clock_t tms_cutime;\n\tcompat_clock_t tms_cstime;\n};\n\nstruct compat_unimapdesc {\n\tshort unsigned int entry_ct;\n\tcompat_caddr_t entries;\n};\n\nstruct compat_ustat {\n\tcompat_daddr_t f_tfree;\n\tcompat_ino_t f_tinode;\n\tchar f_fname[6];\n\tchar f_fpack[6];\n};\n\nstruct component_ops;\n\nstruct component {\n\tstruct list_head node;\n\tstruct aggregate_device *adev;\n\tbool bound;\n\tconst struct component_ops *ops;\n\tint subcomponent;\n\tstruct device *dev;\n};\n\nstruct component_master_ops {\n\tint (*bind)(struct device *);\n\tvoid (*unbind)(struct device *);\n};\n\nstruct component_match_array;\n\nstruct component_match {\n\tsize_t alloc;\n\tsize_t num;\n\tstruct component_match_array *compare;\n};\n\nstruct component_match_array {\n\tvoid *data;\n\tint (*compare)(struct device *, void *);\n\tint (*compare_typed)(struct device *, int, void *);\n\tvoid (*release)(struct device *, void *);\n\tstruct component *component;\n\tbool duplicate;\n};\n\nstruct component_ops {\n\tint (*bind)(struct device *, struct device *, void *);\n\tvoid (*unbind)(struct device *, struct device *, void *);\n};\n\ntypedef int (*decompress_fn)(unsigned char *, long int, long int (*)(void *, long unsigned int), long int (*)(void *, long unsigned int), unsigned char *, long int *, void (*)(char *));\n\nstruct compress_format {\n\tunsigned char magic[2];\n\tconst char *name;\n\tdecompress_fn decompressor;\n};\n\nstruct compstat;\n\nstruct compressor {\n\tint compress_proto;\n\tvoid * (*comp_alloc)(unsigned char *, int);\n\tvoid (*comp_free)(void *);\n\tint (*comp_init)(void *, unsigned char *, int, int, int, int);\n\tvoid (*comp_reset)(void *);\n\tint (*compress)(void *, unsigned char *, unsigned char *, int, int);\n\tvoid (*comp_stat)(void *, struct compstat *);\n\tvoid * (*decomp_alloc)(unsigned char *, int);\n\tvoid (*decomp_free)(void *);\n\tint (*decomp_init)(void *, unsigned char *, int, int, int, int, int);\n\tvoid (*decomp_reset)(void *);\n\tint (*decompress)(void *, unsigned char *, int, unsigned char *, int);\n\tvoid (*incomp)(void *, unsigned char *, int);\n\tvoid (*decomp_stat)(void *, struct compstat *);\n\tstruct module *owner;\n\tunsigned int comp_extra;\n};\n\nstruct compressor_entry {\n\tstruct list_head list;\n\tstruct compressor *comp;\n};\n\nstruct compstat {\n\t__u32 unc_bytes;\n\t__u32 unc_packets;\n\t__u32 comp_bytes;\n\t__u32 comp_packets;\n\t__u32 inc_bytes;\n\t__u32 inc_packets;\n\t__u32 in_count;\n\t__u32 bytes_out;\n\tdouble ratio;\n};\n\nstruct consw;\n\nstruct con_driver {\n\tconst struct consw *con;\n\tconst char *desc;\n\tstruct device *dev;\n\tint node;\n\tint first;\n\tint last;\n\tint flag;\n};\n\nstruct cond_av_list {\n\tstruct avtab_node **nodes;\n\tu32 len;\n};\n\nstruct cond_bool_datum {\n\t__u32 value;\n\tint state;\n};\n\nstruct cond_expr_node;\n\nstruct cond_expr {\n\tstruct cond_expr_node *nodes;\n\tu32 len;\n};\n\nstruct cond_expr_node {\n\tu32 expr_type;\n\tu32 boolean;\n};\n\nstruct policydb;\n\nstruct cond_insertf_data {\n\tstruct policydb *p;\n\tstruct avtab_node **dst;\n\tstruct cond_av_list *other;\n};\n\nstruct cond_node {\n\tint cur_state;\n\tstruct cond_expr expr;\n\tstruct cond_av_list true_list;\n\tstruct cond_av_list false_list;\n};\n\ntypedef bool (*cond_update_fn_t)(struct trace_array *, void *);\n\nstruct cond_snapshot {\n\tvoid *cond_data;\n\tcond_update_fn_t update;\n};\n\nstruct config_group;\n\nstruct config_item_type;\n\nstruct config_item {\n\tchar *ci_name;\n\tchar ci_namebuf[20];\n\tstruct kref ci_kref;\n\tstruct list_head ci_entry;\n\tstruct config_item *ci_parent;\n\tstruct config_group *ci_group;\n\tconst struct config_item_type *ci_type;\n\tstruct dentry *ci_dentry;\n};\n\nstruct configfs_subsystem;\n\nstruct config_group {\n\tstruct config_item cg_item;\n\tstruct list_head cg_children;\n\tstruct configfs_subsystem *cg_subsys;\n\tstruct list_head default_groups;\n\tstruct list_head group_entry;\n};\n\nstruct configfs_item_operations;\n\nstruct configfs_group_operations;\n\nstruct configfs_attribute;\n\nstruct configfs_bin_attribute;\n\nstruct config_item_type {\n\tstruct module *ct_owner;\n\tstruct configfs_item_operations *ct_item_ops;\n\tstruct configfs_group_operations *ct_group_ops;\n\tstruct configfs_attribute **ct_attrs;\n\tstruct configfs_bin_attribute **ct_bin_attrs;\n};\n\nstruct deflate_state;\n\ntypedef struct deflate_state deflate_state;\n\ntypedef block_state (*compress_func)(deflate_state *, int);\n\nstruct config_s {\n\tush good_length;\n\tush max_lazy;\n\tush nice_length;\n\tush max_chain;\n\tcompress_func func;\n};\n\ntypedef struct config_s config;\n\nstruct configfs_attribute {\n\tconst char *ca_name;\n\tstruct module *ca_owner;\n\tumode_t ca_mode;\n\tssize_t (*show)(struct config_item *, char *);\n\tssize_t (*store)(struct config_item *, const char *, size_t);\n};\n\nstruct configfs_bin_attribute {\n\tstruct configfs_attribute cb_attr;\n\tvoid *cb_private;\n\tsize_t cb_max_size;\n\tssize_t (*read)(struct config_item *, void *, size_t);\n\tssize_t (*write)(struct config_item *, const void *, size_t);\n};\n\nstruct configfs_buffer {\n\tsize_t count;\n\tloff_t pos;\n\tchar *page;\n\tstruct configfs_item_operations *ops;\n\tstruct mutex mutex;\n\tint needs_read_fill;\n\tbool read_in_progress;\n\tbool write_in_progress;\n\tchar *bin_buffer;\n\tint bin_buffer_size;\n\tint cb_max_size;\n\tstruct config_item *item;\n\tstruct module *owner;\n\tunion {\n\t\tstruct configfs_attribute *attr;\n\t\tstruct configfs_bin_attribute *bin_attr;\n\t};\n};\n\nstruct iattr;\n\nstruct configfs_fragment;\n\nstruct configfs_dirent {\n\tatomic_t s_count;\n\tint s_dependent_count;\n\tstruct list_head s_sibling;\n\tstruct list_head s_children;\n\tint s_links;\n\tvoid *s_element;\n\tint s_type;\n\tumode_t s_mode;\n\tstruct dentry *s_dentry;\n\tstruct iattr *s_iattr;\n\tstruct configfs_fragment *s_frag;\n};\n\nstruct configfs_fragment {\n\tatomic_t frag_count;\n\tstruct rw_semaphore frag_sem;\n\tbool frag_dead;\n};\n\nstruct configfs_group_operations {\n\tstruct config_item * (*make_item)(struct config_group *, const char *);\n\tstruct config_group * (*make_group)(struct config_group *, const char *);\n\tvoid (*disconnect_notify)(struct config_group *, struct config_item *);\n\tvoid (*drop_item)(struct config_group *, struct config_item *);\n\tbool (*is_visible)(struct config_item *, struct configfs_attribute *, int);\n\tbool (*is_bin_visible)(struct config_item *, struct configfs_bin_attribute *, int);\n};\n\nstruct configfs_item_operations {\n\tvoid (*release)(struct config_item *);\n\tint (*allow_link)(struct config_item *, struct config_item *);\n\tvoid (*drop_link)(struct config_item *, struct config_item *);\n};\n\nstruct configfs_subsystem {\n\tstruct config_group su_group;\n\tstruct mutex su_mutex;\n};\n\nstruct conflict_context {\n\tstruct nd_region *nd_region;\n\tresource_size_t start;\n\tresource_size_t size;\n};\n\nstruct tty_driver;\n\nstruct nbcon_write_context;\n\nstruct printk_buffers;\n\nstruct console {\n\tchar name[16];\n\tvoid (*write)(struct console *, const char *, unsigned int);\n\tint (*read)(struct console *, char *, unsigned int);\n\tstruct tty_driver * (*device)(struct console *, int *);\n\tvoid (*unblank)(void);\n\tint (*setup)(struct console *, char *);\n\tint (*exit)(struct console *);\n\tint (*match)(struct console *, char *, int, char *);\n\tshort int flags;\n\tshort int index;\n\tint cflag;\n\tuint ispeed;\n\tuint ospeed;\n\tu64 seq;\n\tlong unsigned int dropped;\n\tvoid *data;\n\tstruct hlist_node node;\n\tbool (*write_atomic)(struct console *, struct nbcon_write_context *);\n\tatomic_t nbcon_state;\n\tatomic_long_t nbcon_seq;\n\tstruct printk_buffers *pbufs;\n};\n\nstruct winsize {\n\tshort unsigned int ws_row;\n\tshort unsigned int ws_col;\n\tshort unsigned int ws_xpixel;\n\tshort unsigned int ws_ypixel;\n};\n\nstruct hvc_struct;\n\nstruct console___2 {\n\tstruct list_head list;\n\tstruct hvc_struct *hvc;\n\tstruct winsize ws;\n\tu32 vtermno;\n};\n\nstruct console_cmdline {\n\tchar name[16];\n\tint index;\n\tchar devname[32];\n\tbool user_specified;\n\tchar *options;\n};\n\nstruct console_font {\n\tunsigned int width;\n\tunsigned int height;\n\tunsigned int charcount;\n\tunsigned char *data;\n};\n\nstruct console_font_op {\n\tunsigned int op;\n\tunsigned int flags;\n\tunsigned int width;\n\tunsigned int height;\n\tunsigned int charcount;\n\tunsigned char *data;\n};\n\nstruct constant_table {\n\tconst char *name;\n\tint value;\n};\n\nstruct ebitmap_node;\n\nstruct ebitmap {\n\tstruct ebitmap_node *node;\n\tu32 highbit;\n};\n\nstruct type_set;\n\nstruct constraint_expr {\n\tu32 expr_type;\n\tu32 attr;\n\tu32 op;\n\tstruct ebitmap names;\n\tstruct type_set *type_names;\n\tstruct constraint_expr *next;\n};\n\nstruct constraint_node {\n\tu32 permissions;\n\tstruct constraint_expr *expr;\n\tstruct constraint_node *next;\n};\n\nstruct vc_data;\n\nstruct consw {\n\tstruct module *owner;\n\tconst char * (*con_startup)(void);\n\tvoid (*con_init)(struct vc_data *, bool);\n\tvoid (*con_deinit)(struct vc_data *);\n\tvoid (*con_clear)(struct vc_data *, unsigned int, unsigned int, unsigned int);\n\tvoid (*con_putc)(struct vc_data *, u16, unsigned int, unsigned int);\n\tvoid (*con_putcs)(struct vc_data *, const u16 *, unsigned int, unsigned int, unsigned int);\n\tvoid (*con_cursor)(struct vc_data *, bool);\n\tbool (*con_scroll)(struct vc_data *, unsigned int, unsigned int, enum con_scroll, unsigned int);\n\tbool (*con_switch)(struct vc_data *);\n\tbool (*con_blank)(struct vc_data *, enum vesa_blank_mode, bool);\n\tint (*con_font_set)(struct vc_data *, const struct console_font *, unsigned int, unsigned int);\n\tint (*con_font_get)(struct vc_data *, struct console_font *, unsigned int);\n\tint (*con_font_default)(struct vc_data *, struct console_font *, const char *);\n\tint (*con_resize)(struct vc_data *, unsigned int, unsigned int, bool);\n\tvoid (*con_set_palette)(struct vc_data *, const unsigned char *);\n\tvoid (*con_scrolldelta)(struct vc_data *, int);\n\tbool (*con_set_origin)(struct vc_data *);\n\tvoid (*con_save_screen)(struct vc_data *);\n\tu8 (*con_build_attr)(struct vc_data *, u8, enum vc_intensity, bool, bool, bool, bool);\n\tvoid (*con_invert_region)(struct vc_data *, u16 *, int);\n\tvoid (*con_debug_enter)(struct vc_data *);\n\tvoid (*con_debug_leave)(struct vc_data *);\n};\n\nstruct microcode_amd;\n\nstruct cont_desc {\n\tstruct microcode_amd *mc;\n\tu32 cpuid_1_eax;\n\tu32 psize;\n\tu8 *data;\n\tsize_t size;\n};\n\nstruct container_dev {\n\tstruct device dev;\n\tint (*offline)(struct container_dev *);\n};\n\nstruct mls_level {\n\tu32 sens;\n\tstruct ebitmap cat;\n};\n\nstruct mls_range {\n\tstruct mls_level level[2];\n};\n\nstruct context___2 {\n\tu32 user;\n\tu32 role;\n\tu32 type;\n\tu32 len;\n\tstruct mls_range range;\n\tchar *str;\n};\n\nstruct context_entry {\n\tu64 lo;\n\tu64 hi;\n};\n\nstruct context_tracking {\n\tbool active;\n\tint recursion;\n\tatomic_t state;\n\tlong int dynticks_nesting;\n\tlong int dynticks_nmi_nesting;\n};\n\nstruct contig_page_info {\n\tlong unsigned int free_pages;\n\tlong unsigned int free_blocks_total;\n\tlong unsigned int free_blocks_suitable;\n};\n\nstruct virtio_net_ctrl_hdr {\n\t__u8 class;\n\t__u8 cmd;\n};\n\nstruct control_buf {\n\tstruct virtio_net_ctrl_hdr hdr;\n\tvirtio_net_ctrl_ack status;\n};\n\nstruct hotplug_slot_ops;\n\nstruct hotplug_slot {\n\tconst struct hotplug_slot_ops *ops;\n\tstruct list_head slot_list;\n\tstruct pci_slot *pci_slot;\n\tstruct module *owner;\n\tconst char *mod_name;\n};\n\nstruct pcie_device;\n\nstruct controller {\n\tstruct pcie_device *pcie;\n\tu64 dsn;\n\tu32 slot_cap;\n\tunsigned int inband_presence_disabled: 1;\n\tu16 slot_ctrl;\n\tstruct mutex ctrl_lock;\n\tlong unsigned int cmd_started;\n\tunsigned int cmd_busy: 1;\n\twait_queue_head_t queue;\n\tatomic_t pending_events;\n\tunsigned int notification_enabled: 1;\n\tunsigned int power_fault_detected;\n\tstruct task_struct *poll_thread;\n\tu8 state;\n\tstruct mutex state_lock;\n\tstruct delayed_work button_work;\n\tstruct hotplug_slot hotplug_slot;\n\tstruct rw_semaphore reset_lock;\n\tunsigned int depth;\n\tunsigned int ist_running;\n\tint request_result;\n\twait_queue_head_t requester;\n};\n\nstruct hpc_ops;\n\nstruct controller___2 {\n\tstruct mutex crit_sect;\n\tstruct mutex cmd_lock;\n\tint num_slots;\n\tint slot_num_inc;\n\tstruct pci_dev *pci_dev;\n\tstruct list_head slot_list;\n\tconst struct hpc_ops *hpc_ops;\n\twait_queue_head_t queue;\n\tu8 slot_device_offset;\n\tu32 pcix_misc2_reg;\n\tu32 first_slot;\n\tu32 cap_offset;\n\tlong unsigned int mmio_base;\n\tlong unsigned int mmio_size;\n\tvoid *creg;\n\tstruct timer_list poll_timer;\n};\n\nstruct convert_context_args {\n\tstruct policydb *oldp;\n\tstruct policydb *newp;\n};\n\nstruct cooling_dev_stats {\n\tspinlock_t lock;\n\tunsigned int total_trans;\n\tlong unsigned int state;\n\tktime_t last_time;\n\tktime_t *time_in_state;\n\tunsigned int *trans_table;\n};\n\nstruct copy_from_grant {\n\tconst struct blk_shadow *s;\n\tunsigned int grant_idx;\n\tunsigned int bvec_offset;\n\tchar *bvec_data;\n};\n\nstruct copy_subpage_arg {\n\tstruct folio *dst;\n\tstruct folio *src;\n\tstruct vm_area_struct *vma;\n};\n\nstruct core_name {\n\tchar *corename;\n\tint used;\n\tint size;\n};\n\nstruct core_thread {\n\tstruct task_struct *task;\n\tstruct core_thread *next;\n};\n\nstruct core_state {\n\tatomic_t nr_threads;\n\tstruct core_thread dumper;\n\tstruct completion startup;\n};\n\nstruct core_text {\n\tlong unsigned int base;\n\tlong unsigned int end;\n\tconst char *name;\n};\n\nstruct core_vma_metadata {\n\tlong unsigned int start;\n\tlong unsigned int end;\n\tlong unsigned int flags;\n\tlong unsigned int dump_size;\n\tlong unsigned int pgoff;\n\tstruct file *file;\n};\n\nstruct kernel_siginfo;\n\ntypedef struct kernel_siginfo kernel_siginfo_t;\n\nstruct coredump_params {\n\tconst kernel_siginfo_t *siginfo;\n\tstruct file *file;\n\tlong unsigned int limit;\n\tlong unsigned int mm_flags;\n\tint cpu;\n\tloff_t written;\n\tloff_t pos;\n\tloff_t to_skip;\n\tint vma_count;\n\tsize_t vma_data_size;\n\tstruct core_vma_metadata *vma_meta;\n};\n\nstruct coredump_proc_event {\n\t__kernel_pid_t process_pid;\n\t__kernel_pid_t process_tgid;\n\t__kernel_pid_t parent_pid;\n\t__kernel_pid_t parent_tgid;\n};\n\nstruct counted_str {\n\tstruct kref count;\n\tchar name[0];\n};\n\nstruct regulator_dev;\n\nstruct regulator_coupler;\n\nstruct coupling_desc {\n\tstruct regulator_dev **coupled_rdevs;\n\tstruct regulator_coupler *coupler;\n\tint n_resolved;\n\tint n_coupled;\n};\n\nstruct pgprot {\n\tpgprotval_t pgprot;\n};\n\ntypedef struct pgprot pgprot_t;\n\nstruct cpa_data {\n\tlong unsigned int *vaddr;\n\tpgd_t *pgd;\n\tpgprot_t mask_set;\n\tpgprot_t mask_clr;\n\tlong unsigned int numpages;\n\tlong unsigned int curpage;\n\tlong unsigned int pfn;\n\tunsigned int flags;\n\tunsigned int force_split: 1;\n\tunsigned int force_static_prot: 1;\n\tunsigned int force_flush_all: 1;\n\tstruct page **pages;\n};\n\nstruct cpc_reg {\n\tu8 descriptor;\n\tu16 length;\n\tu8 space_id;\n\tu8 bit_width;\n\tu8 bit_offset;\n\tu8 access_width;\n\tu64 address;\n} __attribute__((packed));\n\nstruct cpc_register_resource {\n\tacpi_object_type type;\n\tu64 *sys_mem_vaddr;\n\tunion {\n\t\tstruct cpc_reg reg;\n\t\tu64 int_value;\n\t} cpc_entry;\n};\n\nstruct cpc_desc {\n\tint num_entries;\n\tint version;\n\tint cpu_id;\n\tint write_cmd_status;\n\tint write_cmd_id;\n\traw_spinlock_t rmw_lock;\n\tstruct cpc_register_resource cpc_regs[21];\n\tstruct acpi_psd_package domain_info;\n\tstruct kobject kobj;\n};\n\nstruct cpci_hp_controller_ops;\n\nstruct cpci_hp_controller {\n\tunsigned int irq;\n\tlong unsigned int irq_flags;\n\tchar *devname;\n\tvoid *dev_id;\n\tchar *name;\n\tstruct cpci_hp_controller_ops *ops;\n};\n\nstruct slot___2;\n\nstruct cpci_hp_controller_ops {\n\tint (*query_enum)(void);\n\tint (*enable_irq)(void);\n\tint (*disable_irq)(void);\n\tint (*check_irq)(void *);\n\tint (*hardware_test)(struct slot___2 *, u32);\n\tu8 (*get_power)(struct slot___2 *);\n\tint (*set_power)(struct slot___2 *, int);\n};\n\nstruct cper_arm_err_info {\n\tu8 version;\n\tu8 length;\n\tu16 validation_bits;\n\tu8 type;\n\tu16 multiple_error;\n\tu8 flags;\n\tu64 error_info;\n\tu64 virt_fault_addr;\n\tu64 physical_fault_addr;\n} __attribute__((packed));\n\nstruct cper_cxl_event_devid {\n\tu16 vendor_id;\n\tu16 device_id;\n\tu8 func_num;\n\tu8 device_num;\n\tu8 bus_num;\n\tu16 segment_num;\n\tu16 slot_num;\n\tu8 reserved;\n} __attribute__((packed));\n\nstruct cper_cxl_event_sn {\n\tu32 lower_dw;\n\tu32 upper_dw;\n};\n\nstruct cper_ia_err_info {\n\tguid_t err_type;\n\tu64 validation_bits;\n\tu64 check_info;\n\tu64 target_id;\n\tu64 requestor_id;\n\tu64 responder_id;\n\tu64 ip;\n};\n\nstruct cper_ia_proc_ctx {\n\tu16 reg_ctx_type;\n\tu16 reg_arr_size;\n\tu32 msr_addr;\n\tu64 mm_reg_addr;\n};\n\nstruct cper_record_header {\n\tchar signature[4];\n\tu16 revision;\n\tu32 signature_end;\n\tu16 section_count;\n\tu32 error_severity;\n\tu32 validation_bits;\n\tu32 record_length;\n\tu64 timestamp;\n\tguid_t platform_id;\n\tguid_t partition_id;\n\tguid_t creator_id;\n\tguid_t notification_type;\n\tu64 record_id;\n\tu32 flags;\n\tu64 persistence_information;\n\tu8 reserved[12];\n} __attribute__((packed));\n\nstruct cper_section_descriptor {\n\tu32 section_offset;\n\tu32 section_length;\n\tu16 revision;\n\tu8 validation_bits;\n\tu8 reserved;\n\tu32 flags;\n\tguid_t section_type;\n\tguid_t fru_id;\n\tu32 section_severity;\n\tu8 fru_text[20];\n};\n\nstruct mce {\n\t__u64 status;\n\t__u64 misc;\n\t__u64 addr;\n\t__u64 mcgstatus;\n\t__u64 ip;\n\t__u64 tsc;\n\t__u64 time;\n\t__u8 cpuvendor;\n\t__u8 inject_flags;\n\t__u8 severity;\n\t__u8 pad;\n\t__u32 cpuid;\n\t__u8 cs;\n\t__u8 bank;\n\t__u8 cpu;\n\t__u8 finished;\n\t__u32 extcpu;\n\t__u32 socketid;\n\t__u32 apicid;\n\t__u64 mcgcap;\n\t__u64 synd;\n\t__u64 ipid;\n\t__u64 ppin;\n\t__u32 microcode;\n\t__u64 kflags;\n};\n\nstruct cper_mce_record {\n\tstruct cper_record_header hdr;\n\tstruct cper_section_descriptor sec_hdr;\n\tstruct mce mce;\n};\n\nstruct cper_mem_err_compact {\n\tu64 validation_bits;\n\tu16 node;\n\tu16 card;\n\tu16 module;\n\tu16 bank;\n\tu16 device;\n\tu16 row;\n\tu16 column;\n\tu16 bit_pos;\n\tu64 requestor_id;\n\tu64 responder_id;\n\tu64 target_id;\n\tu16 rank;\n\tu16 mem_array_handle;\n\tu16 mem_dev_handle;\n\tu8 extended;\n} __attribute__((packed));\n\nstruct cper_pstore_record {\n\tstruct cper_record_header hdr;\n\tstruct cper_section_descriptor sec_hdr;\n\tchar data[0];\n};\n\nstruct cper_sec_fw_err_rec_ref {\n\tu8 record_type;\n\tu8 revision;\n\tu8 reserved[6];\n\tu64 record_identifier;\n\tguid_t record_identifier_guid;\n};\n\nstruct cper_sec_mem_err {\n\tu64 validation_bits;\n\tu64 error_status;\n\tu64 physical_addr;\n\tu64 physical_addr_mask;\n\tu16 node;\n\tu16 card;\n\tu16 module;\n\tu16 bank;\n\tu16 device;\n\tu16 row;\n\tu16 column;\n\tu16 bit_pos;\n\tu64 requestor_id;\n\tu64 responder_id;\n\tu64 target_id;\n\tu8 error_type;\n\tu8 extended;\n\tu16 rank;\n\tu16 mem_array_handle;\n\tu16 mem_dev_handle;\n};\n\nstruct cper_sec_pcie {\n\tu64 validation_bits;\n\tu32 port_type;\n\tstruct {\n\t\tu8 minor;\n\t\tu8 major;\n\t\tu8 reserved[2];\n\t} version;\n\tu16 command;\n\tu16 status;\n\tu32 reserved;\n\tstruct {\n\t\tu16 vendor_id;\n\t\tu16 device_id;\n\t\tu8 class_code[3];\n\t\tu8 function;\n\t\tu8 device;\n\t\tu16 segment;\n\t\tu8 bus;\n\t\tu8 secondary_bus;\n\t\tu16 slot;\n\t\tu8 reserved;\n\t} __attribute__((packed)) device_id;\n\tstruct {\n\t\tu32 lower;\n\t\tu32 upper;\n\t} serial_number;\n\tstruct {\n\t\tu16 secondary_status;\n\t\tu16 control;\n\t} bridge;\n\tu8 capability[60];\n\tu8 aer_info[96];\n};\n\nstruct cper_sec_proc_arm {\n\tu32 validation_bits;\n\tu16 err_info_num;\n\tu16 context_info_num;\n\tu32 section_length;\n\tu8 affinity_level;\n\tu8 reserved[3];\n\tu64 mpidr;\n\tu64 midr;\n\tu32 running_state;\n\tu32 psci_state;\n};\n\nstruct cper_sec_proc_generic {\n\tu64 validation_bits;\n\tu8 proc_type;\n\tu8 proc_isa;\n\tu8 proc_error_type;\n\tu8 operation;\n\tu8 flags;\n\tu8 level;\n\tu16 reserved;\n\tu64 cpu_version;\n\tchar cpu_brand[128];\n\tu64 proc_id;\n\tu64 target_addr;\n\tu64 requestor_id;\n\tu64 responder_id;\n\tu64 ip;\n};\n\nstruct cper_sec_proc_ia {\n\tu64 validation_bits;\n\tu64 lapic_id;\n\tu8 cpuid[48];\n};\n\nstruct cper_sec_prot_err {\n\tu64 valid_bits;\n\tu8 agent_type;\n\tu8 reserved[7];\n\tunion {\n\t\tu64 rcrb_base_addr;\n\t\tstruct {\n\t\t\tu8 function;\n\t\t\tu8 device;\n\t\t\tu8 bus;\n\t\t\tu16 segment;\n\t\t\tu8 reserved_1[3];\n\t\t} __attribute__((packed));\n\t} agent_addr;\n\tstruct {\n\t\tu16 vendor_id;\n\t\tu16 device_id;\n\t\tu16 subsystem_vendor_id;\n\t\tu16 subsystem_id;\n\t\tu8 class_code[2];\n\t\tu16 slot;\n\t\tu8 reserved_1[4];\n\t} device_id;\n\tstruct {\n\t\tu32 lower_dw;\n\t\tu32 upper_dw;\n\t} dev_serial_num;\n\tu8 capability[60];\n\tu16 dvsec_len;\n\tu16 err_len;\n\tu8 reserved_2[4];\n} __attribute__((packed));\n\nstruct cpio_data {\n\tvoid *data;\n\tsize_t size;\n\tchar name[18];\n};\n\nstruct cppc_perf_caps {\n\tu32 guaranteed_perf;\n\tu32 highest_perf;\n\tu32 nominal_perf;\n\tu32 lowest_perf;\n\tu32 lowest_nonlinear_perf;\n\tu32 lowest_freq;\n\tu32 nominal_freq;\n\tu32 energy_perf;\n\tbool auto_sel;\n};\n\nstruct cppc_perf_ctrls {\n\tu32 max_perf;\n\tu32 min_perf;\n\tu32 desired_perf;\n\tu32 energy_perf;\n};\n\nstruct cppc_perf_fb_ctrs {\n\tu64 reference;\n\tu64 delivered;\n\tu64 reference_perf;\n\tu64 wraparound_time;\n};\n\nstruct cppc_cpudata {\n\tstruct list_head node;\n\tstruct cppc_perf_caps perf_caps;\n\tstruct cppc_perf_ctrls perf_ctrls;\n\tstruct cppc_perf_fb_ctrs perf_fb_ctrs;\n\tunsigned int shared_type;\n\tcpumask_var_t shared_cpu_map;\n};\n\nstruct pcc_mbox_chan;\n\nstruct cppc_pcc_data {\n\tstruct pcc_mbox_chan *pcc_channel;\n\tvoid *pcc_comm_addr;\n\tbool pcc_channel_acquired;\n\tunsigned int deadline_us;\n\tunsigned int pcc_mpar;\n\tunsigned int pcc_mrtt;\n\tunsigned int pcc_nominal;\n\tbool pending_pcc_write_cmd;\n\tbool platform_owns_pcc;\n\tunsigned int pcc_write_cnt;\n\tstruct rw_semaphore pcc_lock;\n\twait_queue_head_t pcc_write_wait_q;\n\tktime_t last_cmd_cmpl_time;\n\tktime_t last_mpar_reset;\n\tint mpar_count;\n\tint refcount;\n};\n\nstruct cpu {\n\tint node_id;\n\tint hotpluggable;\n\tstruct device dev;\n};\n\nstruct cpu_attr {\n\tstruct device_attribute attr;\n\tconst struct cpumask * const map;\n};\n\nstruct cpu_cacheinfo {\n\tstruct cacheinfo *info_list;\n\tunsigned int per_cpu_data_slice_size;\n\tunsigned int num_levels;\n\tunsigned int num_leaves;\n\tbool cpu_map_populated;\n\tbool early_ci_levels;\n};\n\nstruct update_util_data {\n\tvoid (*func)(struct update_util_data *, u64, unsigned int);\n};\n\nstruct policy_dbs_info;\n\nstruct cpu_dbs_info {\n\tu64 prev_cpu_idle;\n\tu64 prev_update_time;\n\tu64 prev_cpu_nice;\n\tunsigned int prev_load;\n\tstruct update_util_data update_util;\n\tstruct policy_dbs_info *policy_dbs;\n};\n\nstruct cpuinfo_x86;\n\nstruct cpu_dev {\n\tconst char *c_vendor;\n\tconst char *c_ident[2];\n\tvoid (*c_early_init)(struct cpuinfo_x86 *);\n\tvoid (*c_bsp_init)(struct cpuinfo_x86 *);\n\tvoid (*c_init)(struct cpuinfo_x86 *);\n\tvoid (*c_identify)(struct cpuinfo_x86 *);\n\tvoid (*c_detect_tlb)(struct cpuinfo_x86 *);\n\tint c_x86_vendor;\n};\n\nstruct cpu_down_work {\n\tunsigned int cpu;\n\tenum cpuhp_state target;\n};\n\nstruct entry_stack {\n\tchar stack[4096];\n};\n\nstruct entry_stack_page {\n\tstruct entry_stack stack;\n};\n\nstruct x86_hw_tss {\n\tu32 reserved1;\n\tu64 sp0;\n\tu64 sp1;\n\tu64 sp2;\n\tu64 reserved2;\n\tu64 ist[7];\n\tu32 reserved3;\n\tu32 reserved4;\n\tu16 reserved5;\n\tu16 io_bitmap_base;\n} __attribute__((packed));\n\nstruct x86_io_bitmap {\n\tu64 prev_sequence;\n\tunsigned int prev_max;\n\tlong unsigned int bitmap[1025];\n\tlong unsigned int mapall[1025];\n};\n\nstruct tss_struct {\n\tstruct x86_hw_tss x86_tss;\n\tstruct x86_io_bitmap io_bitmap;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct debug_store_buffers {\n\tchar bts_buffer[65536];\n\tchar pebs_buffer[65536];\n};\n\nstruct cpu_entry_area {\n\tchar gdt[4096];\n\tstruct entry_stack_page entry_stack_page;\n\tstruct tss_struct tss;\n\tstruct cea_exception_stacks estacks;\n\tstruct debug_store cpu_debug_store;\n\tstruct debug_store_buffers cpu_debug_buffers;\n};\n\nstruct folio_batch {\n\tunsigned char nr;\n\tunsigned char i;\n\tbool percpu_pvec_drained;\n\tstruct folio *folios[31];\n};\n\nstruct cpu_fbatches {\n\tlocal_lock_t lock;\n\tstruct folio_batch lru_add;\n\tstruct folio_batch lru_deactivate_file;\n\tstruct folio_batch lru_deactivate;\n\tstruct folio_batch lru_lazyfree;\n\tstruct folio_batch activate;\n};\n\nstruct perf_branch_entry {\n\t__u64 from;\n\t__u64 to;\n\t__u64 mispred: 1;\n\t__u64 predicted: 1;\n\t__u64 in_tx: 1;\n\t__u64 abort: 1;\n\t__u64 cycles: 16;\n\t__u64 type: 4;\n\t__u64 spec: 2;\n\t__u64 new_type: 4;\n\t__u64 priv: 3;\n\t__u64 reserved: 31;\n};\n\nstruct perf_branch_stack {\n\t__u64 nr;\n\t__u64 hw_idx;\n\tstruct perf_branch_entry entries[0];\n};\n\nstruct perf_guest_switch_msr {\n\tunsigned int msr;\n\tu64 host;\n\tu64 guest;\n};\n\nstruct er_account;\n\nstruct intel_shared_regs;\n\nstruct intel_excl_cntrs;\n\nstruct cpu_hw_events {\n\tstruct perf_event *events[64];\n\tlong unsigned int active_mask[1];\n\tlong unsigned int dirty[1];\n\tint enabled;\n\tint n_events;\n\tint n_added;\n\tint n_txn;\n\tint n_txn_pair;\n\tint n_txn_metric;\n\tint assign[64];\n\tu64 tags[64];\n\tstruct perf_event *event_list[64];\n\tstruct event_constraint *event_constraint[64];\n\tint n_excl;\n\tunsigned int txn_flags;\n\tint is_fake;\n\tstruct debug_store *ds;\n\tvoid *ds_pebs_vaddr;\n\tvoid *ds_bts_vaddr;\n\tu64 pebs_enabled;\n\tint n_pebs;\n\tint n_large_pebs;\n\tint n_pebs_via_pt;\n\tint pebs_output;\n\tu64 pebs_data_cfg;\n\tu64 active_pebs_data_cfg;\n\tint pebs_record_size;\n\tu64 fixed_ctrl_val;\n\tu64 active_fixed_ctrl_val;\n\tint lbr_users;\n\tint lbr_pebs_users;\n\tstruct perf_branch_stack lbr_stack;\n\tstruct perf_branch_entry lbr_entries[32];\n\tu64 lbr_counters[32];\n\tunion {\n\t\tstruct er_account *lbr_sel;\n\t\tstruct er_account *lbr_ctl;\n\t};\n\tu64 br_sel;\n\tvoid *last_task_ctx;\n\tint last_log_id;\n\tint lbr_select;\n\tvoid *lbr_xsave;\n\tu64 intel_ctrl_guest_mask;\n\tu64 intel_ctrl_host_mask;\n\tstruct perf_guest_switch_msr guest_switch_msrs[64];\n\tu64 intel_cp_status;\n\tstruct intel_shared_regs *shared_regs;\n\tstruct event_constraint *constraint_list;\n\tstruct intel_excl_cntrs *excl_cntrs;\n\tint excl_thread_id;\n\tu64 tfa_shadow;\n\tint n_metric;\n\tstruct amd_nb *amd_nb;\n\tint brs_active;\n\tu64 perf_ctr_virt_mask;\n\tint n_pair;\n\tvoid *kfree_on_online[2];\n\tstruct pmu *pmu;\n};\n\nstruct cpu_id {\n\t__u8 x86;\n\t__u8 x86_model;\n\t__u8 x86_stepping;\n};\n\nstruct cpu_itimer {\n\tu64 expires;\n\tu64 incr;\n};\n\nstruct cpufreq_frequency_table;\n\nstruct cpu_model {\n\tconst struct cpu_id *cpu_id;\n\tconst char *model_name;\n\tunsigned int max_freq;\n\tstruct cpufreq_frequency_table *op_points;\n};\n\nstruct cpu_perf_ibs {\n\tstruct perf_event *event;\n\tlong unsigned int state[1];\n};\n\nstruct cpu_rmap {\n\tstruct kref refcount;\n\tu16 size;\n\tvoid **obj;\n\tstruct {\n\t\tu16 index;\n\t\tu16 dist;\n\t} near[0];\n};\n\nstruct cpu_signature {\n\tunsigned int sig;\n\tunsigned int pf;\n\tunsigned int rev;\n};\n\nstruct cpu_stop_done {\n\tatomic_t nr_todo;\n\tint ret;\n\tstruct completion completion;\n};\n\ntypedef int (*cpu_stop_fn_t)(void *);\n\nstruct cpu_stop_work {\n\tstruct list_head list;\n\tcpu_stop_fn_t fn;\n\tlong unsigned int caller;\n\tvoid *arg;\n\tstruct cpu_stop_done *done;\n};\n\nstruct cpu_stopper {\n\tstruct task_struct *thread;\n\traw_spinlock_t lock;\n\tbool enabled;\n\tstruct list_head works;\n\tstruct cpu_stop_work stop_work;\n\tlong unsigned int caller;\n\tcpu_stop_fn_t fn;\n};\n\nstruct cpu_timer {\n\tstruct timerqueue_node node;\n\tstruct timerqueue_head *head;\n\tstruct pid *pid;\n\tstruct list_head elist;\n\tint firing;\n\tstruct task_struct *handling;\n};\n\nstruct cpu_user_regs {\n\tuint64_t r15;\n\tuint64_t r14;\n\tuint64_t r13;\n\tuint64_t r12;\n\tunion {\n\t\tuint64_t rbp;\n\t\tuint64_t ebp;\n\t\tuint32_t _ebp;\n\t};\n\tunion {\n\t\tuint64_t rbx;\n\t\tuint64_t ebx;\n\t\tuint32_t _ebx;\n\t};\n\tuint64_t r11;\n\tuint64_t r10;\n\tuint64_t r9;\n\tuint64_t r8;\n\tunion {\n\t\tuint64_t rax;\n\t\tuint64_t eax;\n\t\tuint32_t _eax;\n\t};\n\tunion {\n\t\tuint64_t rcx;\n\t\tuint64_t ecx;\n\t\tuint32_t _ecx;\n\t};\n\tunion {\n\t\tuint64_t rdx;\n\t\tuint64_t edx;\n\t\tuint32_t _edx;\n\t};\n\tunion {\n\t\tuint64_t rsi;\n\t\tuint64_t esi;\n\t\tuint32_t _esi;\n\t};\n\tunion {\n\t\tuint64_t rdi;\n\t\tuint64_t edi;\n\t\tuint32_t _edi;\n\t};\n\tuint32_t error_code;\n\tuint32_t entry_vector;\n\tunion {\n\t\tuint64_t rip;\n\t\tuint64_t eip;\n\t\tuint32_t _eip;\n\t};\n\tuint16_t cs;\n\tuint16_t _pad0[1];\n\tuint8_t saved_upcall_mask;\n\tuint8_t _pad1[3];\n\tunion {\n\t\tuint64_t rflags;\n\t\tuint64_t eflags;\n\t\tuint32_t _eflags;\n\t};\n\tunion {\n\t\tuint64_t rsp;\n\t\tuint64_t esp;\n\t\tuint32_t _esp;\n\t};\n\tuint16_t ss;\n\tuint16_t _pad2[3];\n\tuint16_t es;\n\tuint16_t _pad3[3];\n\tuint16_t ds;\n\tuint16_t _pad4[3];\n\tuint16_t fs;\n\tuint16_t _pad5[3];\n\tuint16_t gs;\n\tuint16_t _pad6[3];\n};\n\nstruct cpu_vfs_cap_data {\n\t__u32 magic_etc;\n\tkuid_t rootid;\n\tkernel_cap_t permitted;\n\tkernel_cap_t inheritable;\n};\n\nstruct kernel_cpustat;\n\nstruct cpuacct {\n\tstruct cgroup_subsys_state css;\n\tu64 *cpuusage;\n\tstruct kernel_cpustat *cpustat;\n};\n\nstruct pstate_data {\n\tint current_pstate;\n\tint min_pstate;\n\tint max_pstate;\n\tint max_pstate_physical;\n\tint perf_ctl_scaling;\n\tint scaling;\n\tint turbo_pstate;\n\tunsigned int min_freq;\n\tunsigned int max_freq;\n\tunsigned int turbo_freq;\n};\n\nstruct vid_data {\n\tint min;\n\tint max;\n\tint turbo;\n\tint32_t ratio;\n};\n\nstruct sample {\n\tint32_t core_avg_perf;\n\tint32_t busy_scaled;\n\tu64 aperf;\n\tu64 mperf;\n\tu64 tsc;\n\tu64 time;\n};\n\nstruct cpudata {\n\tint cpu;\n\tunsigned int policy;\n\tstruct update_util_data update_util;\n\tbool update_util_set;\n\tstruct pstate_data pstate;\n\tstruct vid_data vid;\n\tu64 last_update;\n\tu64 last_sample_time;\n\tu64 aperf_mperf_shift;\n\tu64 prev_aperf;\n\tu64 prev_mperf;\n\tu64 prev_tsc;\n\tstruct sample sample;\n\tint32_t min_perf_ratio;\n\tint32_t max_perf_ratio;\n\tstruct acpi_processor_performance acpi_perf_data;\n\tbool valid_pss_table;\n\tunsigned int iowait_boost;\n\ts16 epp_powersave;\n\ts16 epp_policy;\n\ts16 epp_default;\n\ts16 epp_cached;\n\tu64 hwp_req_cached;\n\tu64 hwp_cap_cached;\n\tu64 last_io_update;\n\tunsigned int sched_flags;\n\tu32 hwp_boost_min;\n\tbool suspended;\n\tstruct delayed_work hwp_notify_work;\n};\n\nstruct cpudl_item;\n\nstruct cpudl {\n\traw_spinlock_t lock;\n\tint size;\n\tcpumask_var_t free_cpus;\n\tstruct cpudl_item *elements;\n};\n\nstruct cpudl_item {\n\tu64 dl;\n\tint cpu;\n\tint idx;\n};\n\nstruct cpufreq_cpuinfo {\n\tunsigned int max_freq;\n\tunsigned int min_freq;\n\tunsigned int transition_latency;\n};\n\nstruct cpufreq_policy;\n\nstruct cpufreq_policy_data;\n\nstruct freq_attr;\n\nstruct cpufreq_driver {\n\tchar name[16];\n\tu16 flags;\n\tvoid *driver_data;\n\tint (*init)(struct cpufreq_policy *);\n\tint (*verify)(struct cpufreq_policy_data *);\n\tint (*setpolicy)(struct cpufreq_policy *);\n\tint (*target)(struct cpufreq_policy *, unsigned int, unsigned int);\n\tint (*target_index)(struct cpufreq_policy *, unsigned int);\n\tunsigned int (*fast_switch)(struct cpufreq_policy *, unsigned int);\n\tvoid (*adjust_perf)(unsigned int, long unsigned int, long unsigned int, long unsigned int);\n\tunsigned int (*get_intermediate)(struct cpufreq_policy *, unsigned int);\n\tint (*target_intermediate)(struct cpufreq_policy *, unsigned int);\n\tunsigned int (*get)(unsigned int);\n\tvoid (*update_limits)(unsigned int);\n\tint (*bios_limit)(int, unsigned int *);\n\tint (*online)(struct cpufreq_policy *);\n\tint (*offline)(struct cpufreq_policy *);\n\tvoid (*exit)(struct cpufreq_policy *);\n\tint (*suspend)(struct cpufreq_policy *);\n\tint (*resume)(struct cpufreq_policy *);\n\tvoid (*ready)(struct cpufreq_policy *);\n\tstruct freq_attr **attr;\n\tbool boost_enabled;\n\tint (*set_boost)(struct cpufreq_policy *, int);\n\tvoid (*register_em)(struct cpufreq_policy *);\n};\n\nstruct cpufreq_freqs {\n\tstruct cpufreq_policy *policy;\n\tunsigned int old;\n\tunsigned int new;\n\tu8 flags;\n};\n\nstruct cpufreq_frequency_table {\n\tunsigned int flags;\n\tunsigned int driver_data;\n\tunsigned int frequency;\n};\n\nstruct cpufreq_governor {\n\tchar name[16];\n\tint (*init)(struct cpufreq_policy *);\n\tvoid (*exit)(struct cpufreq_policy *);\n\tint (*start)(struct cpufreq_policy *);\n\tvoid (*stop)(struct cpufreq_policy *);\n\tvoid (*limits)(struct cpufreq_policy *);\n\tssize_t (*show_setspeed)(struct cpufreq_policy *, char *);\n\tint (*store_setspeed)(struct cpufreq_policy *, unsigned int);\n\tstruct list_head governor_list;\n\tstruct module *owner;\n\tu8 flags;\n};\n\nstruct plist_head {\n\tstruct list_head node_list;\n};\n\nstruct pm_qos_constraints {\n\tstruct plist_head list;\n\ts32 target_value;\n\ts32 default_value;\n\ts32 no_constraint_value;\n\tenum pm_qos_type type;\n\tstruct blocking_notifier_head *notifiers;\n};\n\nstruct freq_constraints {\n\tstruct pm_qos_constraints min_freq;\n\tstruct blocking_notifier_head min_freq_notifiers;\n\tstruct pm_qos_constraints max_freq;\n\tstruct blocking_notifier_head max_freq_notifiers;\n};\n\nstruct cpufreq_stats;\n\nstruct cpufreq_policy {\n\tcpumask_var_t cpus;\n\tcpumask_var_t related_cpus;\n\tcpumask_var_t real_cpus;\n\tunsigned int shared_type;\n\tunsigned int cpu;\n\tstruct clk *clk;\n\tstruct cpufreq_cpuinfo cpuinfo;\n\tunsigned int min;\n\tunsigned int max;\n\tunsigned int cur;\n\tunsigned int suspend_freq;\n\tunsigned int policy;\n\tunsigned int last_policy;\n\tstruct cpufreq_governor *governor;\n\tvoid *governor_data;\n\tchar last_governor[16];\n\tstruct work_struct update;\n\tstruct freq_constraints constraints;\n\tstruct freq_qos_request *min_freq_req;\n\tstruct freq_qos_request *max_freq_req;\n\tstruct cpufreq_frequency_table *freq_table;\n\tenum cpufreq_table_sorting freq_table_sorted;\n\tstruct list_head policy_list;\n\tstruct kobject kobj;\n\tstruct completion kobj_unregister;\n\tstruct rw_semaphore rwsem;\n\tbool fast_switch_possible;\n\tbool fast_switch_enabled;\n\tbool strict_target;\n\tbool efficiencies_available;\n\tunsigned int transition_delay_us;\n\tbool dvfs_possible_from_any_cpu;\n\tbool boost_enabled;\n\tunsigned int cached_target_freq;\n\tunsigned int cached_resolved_idx;\n\tbool transition_ongoing;\n\tspinlock_t transition_lock;\n\twait_queue_head_t transition_wait;\n\tstruct task_struct *transition_task;\n\tstruct cpufreq_stats *stats;\n\tvoid *driver_data;\n\tstruct thermal_cooling_device *cdev;\n\tstruct notifier_block nb_min;\n\tstruct notifier_block nb_max;\n};\n\nstruct cpufreq_policy_data {\n\tstruct cpufreq_cpuinfo cpuinfo;\n\tstruct cpufreq_frequency_table *freq_table;\n\tunsigned int cpu;\n\tunsigned int min;\n\tunsigned int max;\n};\n\nstruct cpufreq_stats {\n\tunsigned int total_trans;\n\tlong long unsigned int last_time;\n\tunsigned int max_state;\n\tunsigned int state_num;\n\tunsigned int last_index;\n\tu64 *time_in_state;\n\tunsigned int *freq_table;\n\tunsigned int *trans_table;\n\tunsigned int reset_pending;\n\tlong long unsigned int reset_time;\n};\n\nstruct cpuhp_cpu_state {\n\tenum cpuhp_state state;\n\tenum cpuhp_state target;\n\tenum cpuhp_state fail;\n\tstruct task_struct *thread;\n\tbool should_run;\n\tbool rollback;\n\tbool single;\n\tbool bringup;\n\tstruct hlist_node *node;\n\tstruct hlist_node *last;\n\tenum cpuhp_state cb_state;\n\tint result;\n\tatomic_t ap_sync_state;\n\tstruct completion done_up;\n\tstruct completion done_down;\n};\n\nstruct cpuhp_step {\n\tconst char *name;\n\tunion {\n\t\tint (*single)(unsigned int);\n\t\tint (*multi)(unsigned int, struct hlist_node *);\n\t} startup;\n\tunion {\n\t\tint (*single)(unsigned int);\n\t\tint (*multi)(unsigned int, struct hlist_node *);\n\t} teardown;\n\tstruct hlist_head list;\n\tbool cant_stop;\n\tbool multi_instance;\n};\n\nunion cpuid10_eax {\n\tstruct {\n\t\tunsigned int version_id: 8;\n\t\tunsigned int num_counters: 8;\n\t\tunsigned int bit_width: 8;\n\t\tunsigned int mask_length: 8;\n\t} split;\n\tunsigned int full;\n};\n\nunion cpuid10_ebx {\n\tstruct {\n\t\tunsigned int no_unhalted_core_cycles: 1;\n\t\tunsigned int no_instructions_retired: 1;\n\t\tunsigned int no_unhalted_reference_cycles: 1;\n\t\tunsigned int no_llc_reference: 1;\n\t\tunsigned int no_llc_misses: 1;\n\t\tunsigned int no_branch_instruction_retired: 1;\n\t\tunsigned int no_branch_misses_retired: 1;\n\t} split;\n\tunsigned int full;\n};\n\nunion cpuid10_edx {\n\tstruct {\n\t\tunsigned int num_counters_fixed: 5;\n\t\tunsigned int bit_width_fixed: 8;\n\t\tunsigned int reserved1: 2;\n\t\tunsigned int anythread_deprecated: 1;\n\t\tunsigned int reserved2: 16;\n\t} split;\n\tunsigned int full;\n};\n\nunion cpuid28_eax {\n\tstruct {\n\t\tunsigned int lbr_depth_mask: 8;\n\t\tunsigned int reserved: 22;\n\t\tunsigned int lbr_deep_c_reset: 1;\n\t\tunsigned int lbr_lip: 1;\n\t} split;\n\tunsigned int full;\n};\n\nunion cpuid28_ebx {\n\tstruct {\n\t\tunsigned int lbr_cpl: 1;\n\t\tunsigned int lbr_filter: 1;\n\t\tunsigned int lbr_call_stack: 1;\n\t} split;\n\tunsigned int full;\n};\n\nunion cpuid28_ecx {\n\tstruct {\n\t\tunsigned int lbr_mispred: 1;\n\t\tunsigned int lbr_timed_lbr: 1;\n\t\tunsigned int lbr_br_type: 1;\n\t\tunsigned int reserved: 13;\n\t\tunsigned int lbr_counters: 4;\n\t} split;\n\tunsigned int full;\n};\n\nunion hfi_capabilities {\n\tstruct {\n\t\tu8 performance: 1;\n\t\tu8 energy_efficiency: 1;\n\t\tu8 __reserved: 6;\n\t} split;\n\tu8 bits;\n};\n\nunion cpuid6_edx {\n\tstruct {\n\t\tunion hfi_capabilities capabilities;\n\t\tu32 table_pages: 4;\n\t\tu32 __reserved: 4;\n\t\ts32 index: 16;\n\t} split;\n\tu32 full;\n};\n\nunion cpuid_0x10_1_eax {\n\tstruct {\n\t\tunsigned int cbm_len: 5;\n\t} split;\n\tunsigned int full;\n};\n\nunion cpuid_0x10_3_eax {\n\tstruct {\n\t\tunsigned int max_delay: 12;\n\t} split;\n\tunsigned int full;\n};\n\nunion cpuid_0x10_x_ecx {\n\tstruct {\n\t\tunsigned int reserved: 3;\n\t\tunsigned int noncont: 1;\n\t} split;\n\tunsigned int full;\n};\n\nunion cpuid_0x10_x_edx {\n\tstruct {\n\t\tunsigned int cos_max: 16;\n\t} split;\n\tunsigned int full;\n};\n\nunion cpuid_0x80000022_ebx {\n\tstruct {\n\t\tunsigned int num_core_pmc: 4;\n\t\tunsigned int lbr_v2_stack_sz: 6;\n\t\tunsigned int num_df_pmc: 6;\n\t\tunsigned int num_umc_pmc: 6;\n\t} split;\n\tunsigned int full;\n};\n\nstruct cpuid_bit {\n\tu16 feature;\n\tu8 reg;\n\tu8 bit;\n\tu32 level;\n\tu32 sub_leaf;\n};\n\nstruct cpuid_dep {\n\tunsigned int feature;\n\tunsigned int depends;\n};\n\nstruct cpuid_dependent_feature {\n\tu32 feature;\n\tu32 level;\n};\n\nstruct cpuid_leaf {\n\tu32 fn;\n\tu32 subfn;\n\tu32 eax;\n\tu32 ebx;\n\tu32 ecx;\n\tu32 edx;\n};\n\nstruct cpuidle_device;\n\nstruct cpuidle_attr {\n\tstruct attribute attr;\n\tssize_t (*show)(struct cpuidle_device *, char *);\n\tssize_t (*store)(struct cpuidle_device *, const char *, size_t);\n};\n\nstruct cpuidle_state_usage {\n\tlong long unsigned int disable;\n\tlong long unsigned int usage;\n\tu64 time_ns;\n\tlong long unsigned int above;\n\tlong long unsigned int below;\n\tlong long unsigned int rejected;\n\tlong long unsigned int s2idle_usage;\n\tlong long unsigned int s2idle_time;\n};\n\nstruct cpuidle_driver_kobj;\n\nstruct cpuidle_state_kobj;\n\nstruct cpuidle_device_kobj;\n\nstruct cpuidle_device {\n\tunsigned int registered: 1;\n\tunsigned int enabled: 1;\n\tunsigned int poll_time_limit: 1;\n\tunsigned int cpu;\n\tktime_t next_hrtimer;\n\tint last_state_idx;\n\tu64 last_residency_ns;\n\tu64 poll_limit_ns;\n\tu64 forced_idle_latency_limit_ns;\n\tstruct cpuidle_state_usage states_usage[10];\n\tstruct cpuidle_state_kobj *kobjs[10];\n\tstruct cpuidle_driver_kobj *kobj_driver;\n\tstruct cpuidle_device_kobj *kobj_dev;\n\tstruct list_head device_list;\n};\n\nstruct cpuidle_device_kobj {\n\tstruct cpuidle_device *dev;\n\tstruct completion kobj_unregister;\n\tstruct kobject kobj;\n};\n\nstruct cpuidle_driver;\n\nstruct cpuidle_state {\n\tchar name[16];\n\tchar desc[32];\n\ts64 exit_latency_ns;\n\ts64 target_residency_ns;\n\tunsigned int flags;\n\tunsigned int exit_latency;\n\tint power_usage;\n\tunsigned int target_residency;\n\tint (*enter)(struct cpuidle_device *, struct cpuidle_driver *, int);\n\tint (*enter_dead)(struct cpuidle_device *, int);\n\tint (*enter_s2idle)(struct cpuidle_device *, struct cpuidle_driver *, int);\n};\n\nstruct cpuidle_driver {\n\tconst char *name;\n\tstruct module *owner;\n\tunsigned int bctimer: 1;\n\tstruct cpuidle_state states[10];\n\tint state_count;\n\tint safe_state_index;\n\tstruct cpumask *cpumask;\n\tconst char *governor;\n};\n\nstruct cpuidle_governor {\n\tchar name[16];\n\tstruct list_head governor_list;\n\tunsigned int rating;\n\tint (*enable)(struct cpuidle_driver *, struct cpuidle_device *);\n\tvoid (*disable)(struct cpuidle_driver *, struct cpuidle_device *);\n\tint (*select)(struct cpuidle_driver *, struct cpuidle_device *, bool *);\n\tvoid (*reflect)(struct cpuidle_device *, int);\n};\n\nstruct cpuidle_state_attr {\n\tstruct attribute attr;\n\tssize_t (*show)(struct cpuidle_state *, struct cpuidle_state_usage *, char *);\n\tssize_t (*store)(struct cpuidle_state *, struct cpuidle_state_usage *, const char *, size_t);\n};\n\nstruct cpuidle_state_kobj {\n\tstruct cpuidle_state *state;\n\tstruct cpuidle_state_usage *state_usage;\n\tstruct completion kobj_unregister;\n\tstruct kobject kobj;\n\tstruct cpuidle_device *device;\n};\n\nstruct cpuinfo_topology {\n\tu32 apicid;\n\tu32 initial_apicid;\n\tu32 pkg_id;\n\tu32 die_id;\n\tu32 cu_id;\n\tu32 core_id;\n\tu32 logical_pkg_id;\n\tu32 logical_die_id;\n\tu32 amd_node_id;\n\tu32 llc_id;\n\tu32 l2c_id;\n};\n\nstruct cpuinfo_x86 {\n\tunion {\n\t\tstruct {\n\t\t\t__u8 x86_model;\n\t\t\t__u8 x86;\n\t\t\t__u8 x86_vendor;\n\t\t\t__u8 x86_reserved;\n\t\t};\n\t\t__u32 x86_vfm;\n\t};\n\t__u8 x86_stepping;\n\tint x86_tlbsize;\n\t__u32 vmx_capability[5];\n\t__u8 x86_virt_bits;\n\t__u8 x86_phys_bits;\n\t__u32 extended_cpuid_level;\n\tint cpuid_level;\n\tunion {\n\t\t__u32 x86_capability[24];\n\t\tlong unsigned int x86_capability_alignment;\n\t};\n\tchar x86_vendor_id[16];\n\tchar x86_model_id[64];\n\tstruct cpuinfo_topology topo;\n\tunsigned int x86_cache_size;\n\tint x86_cache_alignment;\n\tint x86_cache_max_rmid;\n\tint x86_cache_occ_scale;\n\tint x86_cache_mbm_width_offset;\n\tint x86_power;\n\tlong unsigned int loops_per_jiffy;\n\tu64 ppin;\n\tu16 x86_clflush_size;\n\tu16 booted_cores;\n\tu16 cpu_index;\n\tbool smt_active;\n\tu32 microcode;\n\tu8 x86_cache_bits;\n\tunsigned int initialized: 1;\n};\n\nstruct cpumap {\n\tunsigned int available;\n\tunsigned int allocated;\n\tunsigned int managed;\n\tunsigned int managed_allocated;\n\tbool initialized;\n\tbool online;\n\tlong unsigned int *managed_map;\n\tlong unsigned int alloc_map[0];\n};\n\nunion cpumask_rcuhead {\n\tcpumask_t cpumask;\n\tstruct callback_head rcu;\n};\n\nstruct cpupri_vec {\n\tatomic_t count;\n\tcpumask_var_t mask;\n};\n\nstruct cpupri {\n\tstruct cpupri_vec pri_to_cpu[101];\n\tint *cpu_to_pri;\n};\n\nstruct fmeter {\n\tint cnt;\n\tint val;\n\ttime64_t time;\n\tspinlock_t lock;\n};\n\nstruct cpuset {\n\tstruct cgroup_subsys_state css;\n\tlong unsigned int flags;\n\tcpumask_var_t cpus_allowed;\n\tnodemask_t mems_allowed;\n\tcpumask_var_t effective_cpus;\n\tnodemask_t effective_mems;\n\tcpumask_var_t effective_xcpus;\n\tcpumask_var_t exclusive_cpus;\n\tnodemask_t old_mems_allowed;\n\tstruct fmeter fmeter;\n\tint attach_in_progress;\n\tint pn;\n\tint relax_domain_level;\n\tint nr_subparts;\n\tint partition_root_state;\n\tint use_parent_ecpus;\n\tint child_ecpus_count;\n\tint nr_deadline_tasks;\n\tint nr_migrate_dl_tasks;\n\tu64 sum_migrate_dl_bw;\n\tenum prs_errcode prs_err;\n\tstruct cgroup_file partition_file;\n\tstruct list_head remote_sibling;\n};\n\nstruct cpuset_migrate_mm_work {\n\tstruct work_struct work;\n\tstruct mm_struct *mm;\n\tnodemask_t from;\n\tnodemask_t to;\n};\n\nstruct cpuset_remove_tasks_struct {\n\tstruct work_struct work;\n\tstruct cpuset *cs;\n};\n\nstruct range {\n\tu64 start;\n\tu64 end;\n};\n\nstruct crash_mem {\n\tunsigned int max_nr_ranges;\n\tunsigned int nr_ranges;\n\tstruct range ranges[0];\n};\n\nstruct crash_memmap_data {\n\tstruct boot_params *params;\n\tunsigned int type;\n};\n\nstruct crb_regs_head;\n\nstruct crb_regs_tail;\n\nstruct crb_priv {\n\tu32 sm;\n\tconst char *hid;\n\tstruct crb_regs_head *regs_h;\n\tstruct crb_regs_tail *regs_t;\n\tu8 *cmd;\n\tu8 *rsp;\n\tu32 cmd_size;\n\tu32 smc_func_id;\n\tu32 *pluton_start_addr;\n\tu32 *pluton_reply_addr;\n};\n\nstruct crb_regs_head {\n\tu32 loc_state;\n\tu32 reserved1;\n\tu32 loc_ctrl;\n\tu32 loc_sts;\n\tu8 reserved2[32];\n\tu64 intf_id;\n\tu64 ctrl_ext;\n};\n\nstruct crb_regs_tail {\n\tu32 ctrl_req;\n\tu32 ctrl_sts;\n\tu32 ctrl_cancel;\n\tu32 ctrl_start;\n\tu32 ctrl_int_enable;\n\tu32 ctrl_int_sts;\n\tu32 ctrl_cmd_size;\n\tu32 ctrl_cmd_pa_low;\n\tu32 ctrl_cmd_pa_high;\n\tu32 ctrl_rsp_size;\n\tu64 ctrl_rsp_pa;\n};\n\nstruct crc64_pi_tuple {\n\t__be64 guard_tag;\n\t__be16 app_tag;\n\t__u8 ref_tag[6];\n};\n\nstruct crc_data {\n\tstruct task_struct *thr;\n\tatomic_t ready;\n\tatomic_t stop;\n\tunsigned int run_threads;\n\twait_queue_head_t go;\n\twait_queue_head_t done;\n\tu32 *crc32;\n\tsize_t *unc_len[3];\n\tunsigned char *unc[3];\n};\n\nstruct group_info;\n\nstruct cred {\n\tatomic_long_t usage;\n\tkuid_t uid;\n\tkgid_t gid;\n\tkuid_t suid;\n\tkgid_t sgid;\n\tkuid_t euid;\n\tkgid_t egid;\n\tkuid_t fsuid;\n\tkgid_t fsgid;\n\tunsigned int securebits;\n\tkernel_cap_t cap_inheritable;\n\tkernel_cap_t cap_permitted;\n\tkernel_cap_t cap_effective;\n\tkernel_cap_t cap_bset;\n\tkernel_cap_t cap_ambient;\n\tunsigned char jit_keyring;\n\tstruct key *session_keyring;\n\tstruct key *process_keyring;\n\tstruct key *thread_keyring;\n\tstruct key *request_key_auth;\n\tvoid *security;\n\tstruct user_struct *user;\n\tstruct user_namespace *user_ns;\n\tstruct ucounts *ucounts;\n\tstruct group_info *group_info;\n\tunion {\n\t\tint non_rcu;\n\t\tstruct callback_head rcu;\n\t};\n};\n\nstruct cred_label {\n\tconst struct cred *cred;\n\tstruct aa_label *label;\n};\n\nstruct crng {\n\tu8 key[32];\n\tlong unsigned int generation;\n\tlocal_lock_t lock;\n};\n\nstruct cros_ec_command {\n\tuint32_t version;\n\tuint32_t command;\n\tuint32_t outsize;\n\tuint32_t insize;\n\tuint32_t result;\n\tuint8_t data[0];\n};\n\nstruct cros_ec_debugfs;\n\nstruct ec_response_get_features {\n\tuint32_t flags[2];\n};\n\nstruct cros_ec_device;\n\nstruct cros_ec_dev {\n\tstruct device class_dev;\n\tstruct cros_ec_device *ec_dev;\n\tstruct device *dev;\n\tstruct cros_ec_debugfs *debug_info;\n\tbool has_kb_wake_angle;\n\tu16 cmd_offset;\n\tstruct ec_response_get_features features;\n};\n\nstruct ec_response_motion_sense_fifo_info {\n\tuint16_t size;\n\tuint16_t count;\n\tuint32_t timestamp;\n\tuint16_t total_lost;\n\tuint16_t lost[0];\n} __attribute__((packed));\n\nunion ec_response_get_next_data_v3 {\n\tuint8_t key_matrix[18];\n\tuint32_t host_event;\n\tuint64_t host_event64;\n\tstruct {\n\t\tuint8_t reserved[3];\n\t\tstruct ec_response_motion_sense_fifo_info info;\n\t} sensor_fifo;\n\tuint32_t buttons;\n\tuint32_t switches;\n\tuint32_t fp_events;\n\tuint32_t sysrq;\n\tuint32_t cec_events;\n\tuint8_t cec_message[16];\n};\n\nstruct ec_response_get_next_event_v3 {\n\tuint8_t event_type;\n\tunion ec_response_get_next_data_v3 data;\n};\n\nstruct cros_ec_device {\n\tconst char *phys_name;\n\tstruct device *dev;\n\tstruct class *cros_class;\n\tint (*cmd_readmem)(struct cros_ec_device *, unsigned int, unsigned int, void *);\n\tu16 max_request;\n\tu16 max_response;\n\tu16 max_passthru;\n\tu16 proto_version;\n\tvoid *priv;\n\tint irq;\n\tu8 *din;\n\tu8 *dout;\n\tint din_size;\n\tint dout_size;\n\tbool wake_enabled;\n\tbool suspended;\n\tint (*cmd_xfer)(struct cros_ec_device *, struct cros_ec_command *);\n\tint (*pkt_xfer)(struct cros_ec_device *, struct cros_ec_command *);\n\tstruct lock_class_key lockdep_key;\n\tstruct mutex lock;\n\tu8 mkbp_event_supported;\n\tbool host_sleep_v1;\n\tstruct blocking_notifier_head event_notifier;\n\tstruct ec_response_get_next_event_v3 event_data;\n\tint event_size;\n\tu32 host_event_wake_mask;\n\tu32 last_resume_result;\n\tu16 suspend_timeout_ms;\n\tktime_t last_event_time;\n\tstruct notifier_block notifier_ready;\n\tstruct platform_device *ec;\n\tstruct platform_device *pd;\n\tstruct blocking_notifier_head panic_notifier;\n};\n\nstruct crs_csi2 {\n\tstruct list_head entry;\n\tacpi_handle handle;\n\tstruct acpi_device_software_nodes *swnodes;\n\tstruct list_head connections;\n\tu32 port_count;\n};\n\nstruct crs_csi2_connection {\n\tstruct list_head entry;\n\tstruct acpi_resource_csi2_serialbus csi2_data;\n\tacpi_handle remote_handle;\n\tchar remote_name[0];\n};\n\nstruct crypto_tfm {\n\trefcount_t refcnt;\n\tu32 crt_flags;\n\tint node;\n\tvoid (*exit)(struct crypto_tfm *);\n\tstruct crypto_alg *__crt_alg;\n\tvoid *__crt_ctx[0];\n};\n\nstruct crypto_acomp {\n\tint (*compress)(struct acomp_req *);\n\tint (*decompress)(struct acomp_req *);\n\tvoid (*dst_free)(struct scatterlist *);\n\tunsigned int reqsize;\n\tstruct crypto_tfm base;\n};\n\nstruct crypto_wait {\n\tstruct completion completion;\n\tint err;\n};\n\nstruct crypto_acomp_ctx {\n\tstruct crypto_acomp *acomp;\n\tstruct acomp_req *req;\n\tstruct crypto_wait wait;\n\tu8 *buffer;\n\tstruct mutex mutex;\n\tbool is_sleepable;\n};\n\nstruct crypto_aead {\n\tunsigned int authsize;\n\tunsigned int reqsize;\n\tstruct crypto_tfm base;\n};\n\nstruct crypto_spawn {\n\tstruct list_head list;\n\tstruct crypto_alg *alg;\n\tunion {\n\t\tstruct crypto_instance *inst;\n\t\tstruct crypto_spawn *next;\n\t};\n\tconst struct crypto_type *frontend;\n\tu32 mask;\n\tbool dead;\n\tbool registered;\n};\n\nstruct crypto_aead_spawn {\n\tstruct crypto_spawn base;\n};\n\nstruct crypto_aes_ctx {\n\tu32 key_enc[60];\n\tu32 key_dec[60];\n\tu32 key_length;\n};\n\nstruct crypto_ahash {\n\tbool using_shash;\n\tunsigned int statesize;\n\tunsigned int reqsize;\n\tstruct crypto_tfm base;\n};\n\nstruct crypto_ahash_spawn {\n\tstruct crypto_spawn base;\n};\n\nstruct crypto_akcipher {\n\tunsigned int reqsize;\n\tstruct crypto_tfm base;\n};\n\nstruct crypto_akcipher_spawn {\n\tstruct crypto_spawn base;\n};\n\nstruct crypto_akcipher_sync_data {\n\tstruct crypto_akcipher *tfm;\n\tconst void *src;\n\tvoid *dst;\n\tunsigned int slen;\n\tunsigned int dlen;\n\tstruct akcipher_request *req;\n\tstruct crypto_wait cwait;\n\tstruct scatterlist sg;\n\tu8 *buf;\n};\n\nstruct crypto_attr_alg {\n\tchar name[128];\n};\n\nstruct crypto_attr_type {\n\tu32 type;\n\tu32 mask;\n};\n\nstruct crypto_cipher {\n\tstruct crypto_tfm base;\n};\n\nstruct crypto_cipher_spawn {\n\tstruct crypto_spawn base;\n};\n\nstruct crypto_comp {\n\tstruct crypto_tfm base;\n};\n\nstruct crypto_cts_ctx {\n\tstruct crypto_skcipher *child;\n};\n\nstruct skcipher_request {\n\tunsigned int cryptlen;\n\tu8 *iv;\n\tstruct scatterlist *src;\n\tstruct scatterlist *dst;\n\tstruct crypto_async_request base;\n\tvoid *__ctx[0];\n};\n\nstruct crypto_cts_reqctx {\n\tstruct scatterlist sg[2];\n\tunsigned int offset;\n\tstruct skcipher_request subreq;\n};\n\nstruct crypto_gcm_ctx {\n\tstruct crypto_skcipher *ctr;\n\tstruct crypto_ahash *ghash;\n};\n\nstruct crypto_gcm_ghash_ctx {\n\tunsigned int cryptlen;\n\tstruct scatterlist *src;\n\tint (*complete)(struct aead_request *, u32);\n};\n\nstruct crypto_gcm_req_priv_ctx {\n\tu8 iv[16];\n\tu8 auth_tag[16];\n\tu8 iauth_tag[16];\n\tstruct scatterlist src[3];\n\tstruct scatterlist dst[3];\n\tstruct scatterlist sg;\n\tstruct crypto_gcm_ghash_ctx ghash_ctx;\n\tunion {\n\t\tstruct ahash_request ahreq;\n\t\tstruct skcipher_request skreq;\n\t} u;\n};\n\nstruct crypto_hash_walk {\n\tchar *data;\n\tunsigned int offset;\n\tunsigned int flags;\n\tstruct page *pg;\n\tunsigned int entrylen;\n\tunsigned int total;\n\tstruct scatterlist *sg;\n};\n\nstruct crypto_kpp {\n\tunsigned int reqsize;\n\tstruct crypto_tfm base;\n};\n\nstruct crypto_kpp_spawn {\n\tstruct crypto_spawn base;\n};\n\nstruct crypto_larval {\n\tstruct crypto_alg alg;\n\tstruct crypto_alg *adult;\n\tstruct completion completion;\n\tu32 mask;\n\tbool test_started;\n};\n\nstruct crypto_lskcipher {\n\tstruct crypto_tfm base;\n};\n\nstruct crypto_lskcipher_spawn {\n\tstruct crypto_spawn base;\n};\n\nstruct crypto_queue {\n\tstruct list_head list;\n\tstruct list_head *backlog;\n\tunsigned int qlen;\n\tunsigned int max_qlen;\n};\n\nstruct crypto_report_acomp {\n\tchar type[64];\n};\n\nstruct crypto_report_aead {\n\tchar type[64];\n\tchar geniv[64];\n\tunsigned int blocksize;\n\tunsigned int maxauthsize;\n\tunsigned int ivsize;\n};\n\nstruct crypto_report_akcipher {\n\tchar type[64];\n};\n\nstruct crypto_report_blkcipher {\n\tchar type[64];\n\tchar geniv[64];\n\tunsigned int blocksize;\n\tunsigned int min_keysize;\n\tunsigned int max_keysize;\n\tunsigned int ivsize;\n};\n\nstruct crypto_report_comp {\n\tchar type[64];\n};\n\nstruct crypto_report_hash {\n\tchar type[64];\n\tunsigned int blocksize;\n\tunsigned int digestsize;\n};\n\nstruct crypto_report_kpp {\n\tchar type[64];\n};\n\nstruct crypto_report_rng {\n\tchar type[64];\n\tunsigned int seedsize;\n};\n\nstruct crypto_rfc3686_ctx {\n\tstruct crypto_skcipher *child;\n\tu8 nonce[4];\n};\n\nstruct crypto_rfc3686_req_ctx {\n\tu8 iv[16];\n\tstruct skcipher_request subreq;\n};\n\nstruct crypto_rfc4106_ctx {\n\tstruct crypto_aead *child;\n\tu8 nonce[4];\n};\n\nstruct crypto_rfc4106_req_ctx {\n\tstruct scatterlist src[3];\n\tstruct scatterlist dst[3];\n\tstruct aead_request subreq;\n};\n\nstruct crypto_rfc4543_ctx {\n\tstruct crypto_aead *child;\n\tstruct crypto_sync_skcipher *null;\n\tu8 nonce[4];\n};\n\nstruct crypto_rfc4543_instance_ctx {\n\tstruct crypto_aead_spawn aead;\n};\n\nstruct crypto_rfc4543_req_ctx {\n\tstruct aead_request subreq;\n};\n\nstruct crypto_rng {\n\tstruct crypto_tfm base;\n};\n\nstruct crypto_scomp {\n\tstruct crypto_tfm base;\n};\n\nstruct crypto_shash {\n\tunsigned int descsize;\n\tstruct crypto_tfm base;\n};\n\nstruct crypto_shash_spawn {\n\tstruct crypto_spawn base;\n};\n\nstruct crypto_sig {\n\tstruct crypto_tfm base;\n};\n\nstruct crypto_skcipher {\n\tunsigned int reqsize;\n\tstruct crypto_tfm base;\n};\n\nstruct crypto_skcipher_spawn {\n\tstruct crypto_spawn base;\n};\n\nstruct crypto_sync_skcipher {\n\tstruct crypto_skcipher base;\n};\n\nstruct rtattr;\n\nstruct crypto_template {\n\tstruct list_head list;\n\tstruct hlist_head instances;\n\tstruct module *module;\n\tint (*create)(struct crypto_template *, struct rtattr **);\n\tchar name[128];\n};\n\nstruct crypto_test_param {\n\tchar driver[128];\n\tchar alg[128];\n\tu32 type;\n};\n\nstruct crypto_type {\n\tunsigned int (*ctxsize)(struct crypto_alg *, u32, u32);\n\tunsigned int (*extsize)(struct crypto_alg *);\n\tint (*init_tfm)(struct crypto_tfm *);\n\tvoid (*show)(struct seq_file *, struct crypto_alg *);\n\tint (*report)(struct sk_buff *, struct crypto_alg *);\n\tvoid (*free)(struct crypto_instance *);\n\tunsigned int type;\n\tunsigned int maskclear;\n\tunsigned int maskset;\n\tunsigned int tfmsize;\n};\n\nstruct rtattr {\n\tshort unsigned int rta_len;\n\tshort unsigned int rta_type;\n};\n\nstruct cryptomgr_param {\n\tstruct rtattr *tb[34];\n\tstruct {\n\t\tstruct rtattr attr;\n\t\tstruct crypto_attr_type data;\n\t} type;\n\tstruct {\n\t\tstruct rtattr attr;\n\t\tstruct crypto_attr_alg data;\n\t} attrs[32];\n\tchar template[128];\n\tstruct crypto_larval *larval;\n\tu32 otype;\n\tu32 omask;\n};\n\nstruct crystal_cove_config {\n\tlong unsigned int irq_flags;\n\tstruct mfd_cell *cell_dev;\n\tint n_cell_devs;\n\tconst struct regmap_config *regmap_config;\n\tconst struct regmap_irq_chip *irq_chip;\n};\n\nstruct crystalcove_gpio {\n\tstruct mutex buslock;\n\tstruct gpio_chip chip;\n\tstruct regmap *regmap;\n\tint update;\n\tint intcnt_value;\n\tbool set_irq_mask;\n};\n\nstruct crystalcove_pwm {\n\tstruct regmap *regmap;\n};\n\nstruct cs_dbs_tuners {\n\tunsigned int down_threshold;\n\tunsigned int freq_step;\n};\n\nstruct dbs_data;\n\nstruct policy_dbs_info {\n\tstruct cpufreq_policy *policy;\n\tstruct mutex update_mutex;\n\tu64 last_sample_time;\n\ts64 sample_delay_ns;\n\tatomic_t work_count;\n\tstruct irq_work irq_work;\n\tstruct work_struct work;\n\tstruct dbs_data *dbs_data;\n\tstruct list_head list;\n\tunsigned int rate_mult;\n\tunsigned int idle_periods;\n\tbool is_shared;\n\tbool work_in_progress;\n};\n\nstruct cs_policy_dbs_info {\n\tstruct policy_dbs_info policy_dbs;\n\tunsigned int down_skip;\n\tunsigned int requested_freq;\n};\n\nstruct csi2_resources_walk_data {\n\tacpi_handle handle;\n\tstruct list_head connections;\n};\n\nstruct mem_ctl_info;\n\nstruct rank_info;\n\nstruct csrow_info {\n\tstruct device dev;\n\tlong unsigned int first_page;\n\tlong unsigned int last_page;\n\tlong unsigned int page_mask;\n\tint csrow_idx;\n\tu32 ue_count;\n\tu32 ce_count;\n\tstruct mem_ctl_info *mci;\n\tu32 nr_channels;\n\tstruct rank_info **channels;\n};\n\nstruct css_set {\n\tstruct cgroup_subsys_state *subsys[14];\n\trefcount_t refcount;\n\tstruct css_set *dom_cset;\n\tstruct cgroup *dfl_cgrp;\n\tint nr_tasks;\n\tstruct list_head tasks;\n\tstruct list_head mg_tasks;\n\tstruct list_head dying_tasks;\n\tstruct list_head task_iters;\n\tstruct list_head e_cset_node[14];\n\tstruct list_head threaded_csets;\n\tstruct list_head threaded_csets_node;\n\tstruct hlist_node hlist;\n\tstruct list_head cgrp_links;\n\tstruct list_head mg_src_preload_node;\n\tstruct list_head mg_dst_preload_node;\n\tstruct list_head mg_node;\n\tstruct cgroup *mg_src_cgrp;\n\tstruct cgroup *mg_dst_cgrp;\n\tstruct css_set *mg_dst_cset;\n\tbool dead;\n\tstruct callback_head callback_head;\n};\n\nstruct css_set__safe_rcu {\n\tstruct cgroup *dfl_cgrp;\n};\n\nstruct iphdr {\n\t__u8 ihl: 4;\n\t__u8 version: 4;\n\t__u8 tos;\n\t__be16 tot_len;\n\t__be16 id;\n\t__be16 frag_off;\n\t__u8 ttl;\n\t__u8 protocol;\n\t__sum16 check;\n\tunion {\n\t\tstruct {\n\t\t\t__be32 saddr;\n\t\t\t__be32 daddr;\n\t\t};\n\t\tstruct {\n\t\t\t__be32 saddr;\n\t\t\t__be32 daddr;\n\t\t} addrs;\n\t};\n};\n\nstruct tcphdr {\n\t__be16 source;\n\t__be16 dest;\n\t__be32 seq;\n\t__be32 ack_seq;\n\t__u16 res1: 4;\n\t__u16 doff: 4;\n\t__u16 fin: 1;\n\t__u16 syn: 1;\n\t__u16 rst: 1;\n\t__u16 psh: 1;\n\t__u16 ack: 1;\n\t__u16 urg: 1;\n\t__u16 ece: 1;\n\t__u16 cwr: 1;\n\t__be16 window;\n\t__sum16 check;\n\t__be16 urg_ptr;\n};\n\nstruct cstate {\n\tbyte_t cs_this;\n\tbool initialized;\n\tstruct cstate *next;\n\tstruct iphdr cs_ip;\n\tstruct tcphdr cs_tcp;\n\tunsigned char cs_ipopt[64];\n\tunsigned char cs_tcpopt[64];\n\tint cs_hsize;\n};\n\nstruct cstate___2 {\n\tint state;\n\tuint32_t rep0;\n\tuint32_t rep1;\n\tuint32_t rep2;\n\tuint32_t rep3;\n};\n\nstruct cstate_entry {\n\tstruct {\n\t\tunsigned int eax;\n\t\tunsigned int ecx;\n\t} states[8];\n};\n\nstruct csum_pseudo_header {\n\t__be64 data_seq;\n\t__be32 subflow_seq;\n\t__be16 data_len;\n\t__sum16 csum;\n};\n\nstruct csum_state {\n\t__wsum csum;\n\tsize_t off;\n};\n\nstruct ct_data_s {\n\tunion {\n\t\tush freq;\n\t\tush code;\n\t} fc;\n\tunion {\n\t\tush dad;\n\t\tush len;\n\t} dl;\n};\n\ntypedef struct ct_data_s ct_data;\n\nstruct ctl_table_root;\n\nstruct ctl_table_set;\n\nstruct ctl_dir;\n\nstruct ctl_node;\n\nstruct ctl_table_header {\n\tunion {\n\t\tstruct {\n\t\t\tstruct ctl_table *ctl_table;\n\t\t\tint ctl_table_size;\n\t\t\tint used;\n\t\t\tint count;\n\t\t\tint nreg;\n\t\t};\n\t\tstruct callback_head rcu;\n\t};\n\tstruct completion *unregistering;\n\tconst struct ctl_table *ctl_table_arg;\n\tstruct ctl_table_root *root;\n\tstruct ctl_table_set *set;\n\tstruct ctl_dir *parent;\n\tstruct ctl_node *node;\n\tstruct hlist_head inodes;\n\tenum {\n\t\tSYSCTL_TABLE_TYPE_DEFAULT = 0,\n\t\tSYSCTL_TABLE_TYPE_PERMANENTLY_EMPTY = 1,\n\t} type;\n};\n\nstruct ctl_dir {\n\tstruct ctl_table_header header;\n\tstruct rb_root root;\n};\n\nstruct edac_device_ctl_info;\n\nstruct ctl_info_attribute {\n\tstruct attribute attr;\n\tssize_t (*show)(struct edac_device_ctl_info *, char *);\n\tssize_t (*store)(struct edac_device_ctl_info *, const char *, size_t);\n};\n\nstruct ctl_node {\n\tstruct rb_node node;\n\tstruct ctl_table_header *header;\n};\n\ntypedef int proc_handler(const struct ctl_table *, int, void *, size_t *, loff_t *);\n\nstruct ctl_table_poll;\n\nstruct ctl_table {\n\tconst char *procname;\n\tvoid *data;\n\tint maxlen;\n\tumode_t mode;\n\tproc_handler *proc_handler;\n\tstruct ctl_table_poll *poll;\n\tvoid *extra1;\n\tvoid *extra2;\n};\n\nstruct ctl_table_poll {\n\tatomic_t event;\n\twait_queue_head_t wait;\n};\n\nstruct ctl_table_set {\n\tint (*is_seen)(struct ctl_table_set *);\n\tstruct ctl_dir dir;\n};\n\nstruct ctl_table_root {\n\tstruct ctl_table_set default_set;\n\tstruct ctl_table_set * (*lookup)(struct ctl_table_root *);\n\tvoid (*set_ownership)(struct ctl_table_header *, kuid_t *, kgid_t *);\n\tint (*permissions)(struct ctl_table_header *, const struct ctl_table *);\n};\n\nstruct netlink_policy_dump_state;\n\nstruct genl_family;\n\nstruct genl_op_iter;\n\nstruct ctrl_dump_policy_ctx {\n\tstruct netlink_policy_dump_state *state;\n\tconst struct genl_family *rt;\n\tstruct genl_op_iter *op_iter;\n\tu32 op;\n\tu16 fam_id;\n\tu8 dump_map: 1;\n\tu8 single_op: 1;\n};\n\nstruct ctrl_pos {\n\tlong unsigned int refaulted;\n\tlong unsigned int total;\n\tint gain;\n};\n\nstruct ctx_rq_wait {\n\tstruct completion comp;\n\tatomic_t count;\n};\n\nstruct ctx_switch_entry {\n\tstruct trace_entry ent;\n\tunsigned int prev_pid;\n\tunsigned int next_pid;\n\tunsigned int next_cpu;\n\tunsigned char prev_prio;\n\tunsigned char prev_state;\n\tunsigned char next_prio;\n\tunsigned char next_state;\n};\n\nstruct cvt_timing {\n\tu8 code[3];\n};\n\nstruct cxl_event_record_hdr {\n\tu8 length;\n\tu8 flags[3];\n\t__le16 handle;\n\t__le16 related_handle;\n\t__le64 timestamp;\n\tu8 maint_op_class;\n\tu8 reserved[15];\n};\n\nstruct cxl_event_generic {\n\tstruct cxl_event_record_hdr hdr;\n\tu8 data[80];\n};\n\nstruct cxl_event_media_hdr {\n\tstruct cxl_event_record_hdr hdr;\n\t__le64 phys_addr;\n\tu8 descriptor;\n\tu8 type;\n\tu8 transaction_type;\n\tu8 validity_flags[2];\n\tu8 channel;\n\tu8 rank;\n} __attribute__((packed));\n\nstruct cxl_event_gen_media {\n\tstruct cxl_event_media_hdr media_hdr;\n\tu8 device[3];\n\tu8 component_id[16];\n\tu8 reserved[46];\n};\n\nstruct cxl_event_dram {\n\tstruct cxl_event_media_hdr media_hdr;\n\tu8 nibble_mask[3];\n\tu8 bank_group;\n\tu8 bank;\n\tu8 row[3];\n\tu8 column[2];\n\tu8 correction_mask[32];\n\tu8 reserved[23];\n};\n\nstruct cxl_get_health_info {\n\tu8 health_status;\n\tu8 media_status;\n\tu8 add_status;\n\tu8 life_used;\n\tu8 device_temp[2];\n\tu8 dirty_shutdown_cnt[4];\n\tu8 cor_vol_err_cnt[4];\n\tu8 cor_per_err_cnt[4];\n};\n\nstruct cxl_event_mem_module {\n\tstruct cxl_event_record_hdr hdr;\n\tu8 event_type;\n\tstruct cxl_get_health_info info;\n\tu8 reserved[61];\n};\n\nunion cxl_event {\n\tstruct cxl_event_generic generic;\n\tstruct cxl_event_gen_media gen_media;\n\tstruct cxl_event_dram dram;\n\tstruct cxl_event_mem_module mem_module;\n\tstruct cxl_event_media_hdr media_hdr;\n};\n\nstruct cxl_cper_event_rec {\n\tstruct {\n\t\tu32 length;\n\t\tu64 validation_bits;\n\t\tstruct cper_cxl_event_devid device_id;\n\t\tstruct cper_cxl_event_sn dev_serial_num;\n\t} __attribute__((packed)) hdr;\n\tunion cxl_event event;\n};\n\nstruct cxl_cper_work_data {\n\tenum cxl_event_type event_type;\n\tstruct cxl_cper_event_rec rec;\n} __attribute__((packed));\n\nstruct cxl_mbox_cmd_rc {\n\tint err;\n\tconst char *desc;\n};\n\nstruct cxl_ras_capability_regs {\n\tu32 uncor_status;\n\tu32 uncor_mask;\n\tu32 uncor_severity;\n\tu32 cor_status;\n\tu32 cor_mask;\n\tu32 cap_control;\n\tu32 header_log[16];\n};\n\nstruct cyc2ns_data {\n\tu32 cyc2ns_mul;\n\tu32 cyc2ns_shift;\n\tu64 cyc2ns_offset;\n};\n\nstruct cyc2ns {\n\tstruct cyc2ns_data data[2];\n\tseqcount_latch_t seq;\n};\n\nstruct cyclecounter {\n\tu64 (*read)(const struct cyclecounter *);\n\tu64 mask;\n\tu32 mult;\n\tu32 shift;\n};\n\nstruct d0_features {\n\t__be16 code;\n\tu8 r_version;\n\tu8 length;\n\tu8 features[0];\n};\n\nstruct d0_geometry_features {\n\tu8 header[4];\n\tu8 reserved01;\n\tu8 reserved02[7];\n\t__be32 logical_block_size;\n\t__be64 alignment_granularity;\n\t__be64 lowest_aligned_lba;\n};\n\nstruct d0_header {\n\t__be32 length;\n\t__be32 revision;\n\t__be32 reserved01;\n\t__be32 reserved02;\n\tu8 ignored[32];\n};\n\nstruct d0_locking_features {\n\tu8 supported_features;\n\tu8 reserved01[3];\n\t__be32 reserved02;\n\t__be32 reserved03;\n};\n\nstruct d0_opal_v100 {\n\t__be16 baseComID;\n\t__be16 numComIDs;\n};\n\nstruct d0_opal_v200 {\n\t__be16 baseComID;\n\t__be16 numComIDs;\n\tu8 range_crossing;\n\tu8 num_locking_admin_auth[2];\n\tu8 num_locking_user_auth[2];\n\tu8 initialPIN;\n\tu8 revertedPIN;\n\tu8 reserved01;\n\t__be32 reserved02;\n};\n\nstruct d0_single_user_mode {\n\t__be32 num_locking_objects;\n\tu8 reserved01;\n\tu8 reserved02;\n\t__be16 reserved03;\n\t__be32 reserved04;\n};\n\nstruct d0_tper_features {\n\tu8 supported_features;\n\tu8 reserved01[3];\n\t__be32 reserved02;\n\t__be32 reserved03;\n};\n\nstruct d_partition {\n\t__le32 p_res;\n\tu8 p_fstype;\n\tu8 p_res2[3];\n\t__le32 p_offset;\n\t__le32 p_size;\n};\n\nstruct d_partition___2 {\n\t__le32 p_size;\n\t__le32 p_offset;\n\t__le32 p_fsize;\n\tu8 p_fstype;\n\tu8 p_frag;\n\t__le16 p_cpg;\n};\n\nstruct da903x_chip_ops;\n\nstruct da903x_chip {\n\tstruct i2c_client *client;\n\tstruct device *dev;\n\tconst struct da903x_chip_ops *ops;\n\tint type;\n\tuint32_t events_mask;\n\tstruct mutex lock;\n\tstruct work_struct irq_work;\n\tstruct blocking_notifier_head notifier_list;\n};\n\nstruct da903x_chip_ops {\n\tint (*init_chip)(struct da903x_chip *);\n\tint (*unmask_events)(struct da903x_chip *, unsigned int);\n\tint (*mask_events)(struct da903x_chip *, unsigned int);\n\tint (*read_events)(struct da903x_chip *, unsigned int *);\n\tint (*read_status)(struct da903x_chip *, unsigned int *);\n};\n\nstruct da903x_subdev_info;\n\nstruct da903x_platform_data {\n\tint num_subdevs;\n\tstruct da903x_subdev_info *subdevs;\n};\n\nstruct da903x_subdev_info {\n\tint id;\n\tconst char *name;\n\tvoid *platform_data;\n};\n\nstruct da9052 {\n\tstruct device *dev;\n\tstruct regmap *regmap;\n\tstruct mutex auxadc_lock;\n\tstruct completion done;\n\tint irq_base;\n\tstruct regmap_irq_chip_data *irq_data;\n\tu8 chip_id;\n\tint chip_irq;\n\tint (*fix_io)(struct da9052 *, unsigned char);\n};\n\nstruct led_platform_data;\n\nstruct da9052_pdata {\n\tstruct led_platform_data *pled;\n\tint (*init)(struct da9052 *);\n\tint irq_base;\n\tint gpio_base;\n\tint use_for_apm;\n\tstruct regulator_init_data *regulators[14];\n};\n\nstruct da9055 {\n\tstruct regmap *regmap;\n\tstruct regmap_irq_chip_data *irq_data;\n\tstruct device *dev;\n\tstruct i2c_client *i2c_client;\n\tint irq_base;\n\tint chip_irq;\n};\n\nstruct da9055_pdata {\n\tint (*init)(struct da9055 *);\n\tint irq_base;\n\tint gpio_base;\n\tstruct regulator_init_data *regulators[8];\n\tbool reset_enable;\n\tenum gpio_select *reg_ren;\n\tenum gpio_select *reg_rsel;\n};\n\nstruct da9063 {\n\tstruct device *dev;\n\tenum da9063_type type;\n\tunsigned char variant_code;\n\tunsigned int flags;\n\tstruct regmap *regmap;\n\tint chip_irq;\n\tunsigned int irq_base;\n\tstruct regmap_irq_chip_data *regmap_irq;\n};\n\nstruct da_monitor {\n\tbool monitoring;\n\tunsigned int curr_state;\n};\n\nstruct data_chunk {\n\tsize_t size;\n\tsize_t icg;\n\tsize_t dst_icg;\n\tsize_t src_icg;\n};\n\nstruct data_dirent {\n\tuint32_t virtual_address;\n\tuint32_t size;\n};\n\nstruct data_directory {\n\tstruct data_dirent exports;\n\tstruct data_dirent imports;\n\tstruct data_dirent resources;\n\tstruct data_dirent exceptions;\n\tstruct data_dirent certs;\n\tstruct data_dirent base_relocations;\n\tstruct data_dirent debug;\n\tstruct data_dirent arch;\n\tstruct data_dirent global_ptr;\n\tstruct data_dirent tls;\n\tstruct data_dirent load_config;\n\tstruct data_dirent bound_imports;\n\tstruct data_dirent import_addrs;\n\tstruct data_dirent delay_imports;\n\tstruct data_dirent clr_runtime_hdr;\n\tstruct data_dirent reserved;\n};\n\nstruct dax_operations;\n\nstruct dax_holder_operations;\n\nstruct dax_device {\n\tstruct inode inode;\n\tstruct cdev cdev;\n\tvoid *private;\n\tlong unsigned int flags;\n\tconst struct dax_operations *ops;\n\tvoid *holder_data;\n\tconst struct dax_holder_operations *holder_ops;\n};\n\nstruct dev_dax;\n\nstruct dax_device_driver {\n\tstruct device_driver drv;\n\tstruct list_head ids;\n\tenum dax_driver_type type;\n\tint (*probe)(struct dev_dax *);\n\tvoid (*remove)(struct dev_dax *);\n};\n\nstruct dax_holder_operations {\n\tint (*notify_failure)(struct dax_device *, u64, u64, int);\n};\n\nstruct dax_id {\n\tstruct list_head list;\n\tchar dev_name[30];\n};\n\nstruct dax_mapping {\n\tstruct device dev;\n\tint range_id;\n\tint id;\n};\n\nstruct dax_operations {\n\tlong int (*direct_access)(struct dax_device *, long unsigned int, long int, enum dax_access_mode, void **, pfn_t *);\n\tbool (*dax_supported)(struct dax_device *, struct block_device *, int, sector_t, sector_t);\n\tint (*zero_page_range)(struct dax_device *, long unsigned int, size_t);\n\tsize_t (*recovery_write)(struct dax_device *, long unsigned int, void *, size_t, struct iov_iter *);\n};\n\nstruct dax_region {\n\tint id;\n\tint target_node;\n\tstruct kref kref;\n\tstruct device *dev;\n\tunsigned int align;\n\tstruct ida ida;\n\tstruct resource res;\n\tstruct device *seed;\n\tstruct device *youngest;\n};\n\nstruct xhci_dbc;\n\nstruct dbc_driver {\n\tint (*configure)(struct xhci_dbc *);\n\tvoid (*disconnect)(struct xhci_dbc *);\n};\n\nstruct xhci_ring;\n\nstruct dbc_ep {\n\tstruct xhci_dbc *dbc;\n\tstruct list_head list_pending;\n\tstruct xhci_ring *ring;\n\tunsigned int direction: 1;\n\tunsigned int halted: 1;\n};\n\nstruct dbc_info_context {\n\t__le64 string0;\n\t__le64 manufacturer;\n\t__le64 product;\n\t__le64 serial;\n\t__le32 length;\n\t__le32 __reserved_0[7];\n};\n\nstruct tty_buffer {\n\tunion {\n\t\tstruct tty_buffer *next;\n\t\tstruct llist_node free;\n\t};\n\tunsigned int used;\n\tunsigned int size;\n\tunsigned int commit;\n\tunsigned int lookahead;\n\tunsigned int read;\n\tbool flags;\n\tlong: 0;\n\tu8 data[0];\n};\n\nstruct tty_bufhead {\n\tstruct tty_buffer *head;\n\tstruct work_struct work;\n\tstruct mutex lock;\n\tatomic_t priority;\n\tstruct tty_buffer sentinel;\n\tstruct llist_head free;\n\tatomic_t mem_used;\n\tint mem_limit;\n\tstruct tty_buffer *tail;\n};\n\nstruct tty_struct;\n\nstruct tty_port_operations;\n\nstruct tty_port_client_operations;\n\nstruct tty_port {\n\tstruct tty_bufhead buf;\n\tstruct tty_struct *tty;\n\tstruct tty_struct *itty;\n\tconst struct tty_port_operations *ops;\n\tconst struct tty_port_client_operations *client_ops;\n\tspinlock_t lock;\n\tint blocked_open;\n\tint count;\n\twait_queue_head_t open_wait;\n\twait_queue_head_t delta_msr_wait;\n\tlong unsigned int flags;\n\tlong unsigned int iflags;\n\tunsigned char console: 1;\n\tstruct mutex mutex;\n\tstruct mutex buf_mutex;\n\tu8 *xmit_buf;\n\tstruct {\n\t\tunion {\n\t\t\tstruct __kfifo kfifo;\n\t\t\tu8 *type;\n\t\t\tconst u8 *const_type;\n\t\t\tchar (*rectype)[0];\n\t\t\tu8 *ptr;\n\t\t\tconst u8 *ptr_const;\n\t\t};\n\t\tu8 buf[0];\n\t} xmit_fifo;\n\tunsigned int close_delay;\n\tunsigned int closing_wait;\n\tint drain_delay;\n\tstruct kref kref;\n\tvoid *client_data;\n};\n\nstruct tasklet_struct {\n\tstruct tasklet_struct *next;\n\tlong unsigned int state;\n\tatomic_t count;\n\tbool use_callback;\n\tunion {\n\t\tvoid (*func)(long unsigned int);\n\t\tvoid (*callback)(struct tasklet_struct *);\n\t};\n\tlong unsigned int data;\n};\n\nstruct dbc_port {\n\tstruct tty_port port;\n\tspinlock_t port_lock;\n\tint minor;\n\tstruct list_head read_pool;\n\tstruct list_head read_queue;\n\tunsigned int n_read;\n\tstruct tasklet_struct push;\n\tstruct list_head write_pool;\n\tunsigned int tx_boundary;\n\tbool registered;\n};\n\nstruct dbc_regs {\n\t__le32 capability;\n\t__le32 doorbell;\n\t__le32 ersts;\n\t__le32 __reserved_0;\n\t__le64 erstba;\n\t__le64 erdp;\n\t__le32 control;\n\t__le32 status;\n\t__le32 portsc;\n\t__le32 __reserved_1;\n\t__le64 dccp;\n\t__le32 devinfo1;\n\t__le32 devinfo2;\n};\n\nunion xhci_trb;\n\nstruct dbc_request {\n\tvoid *buf;\n\tunsigned int length;\n\tdma_addr_t dma;\n\tvoid (*complete)(struct xhci_dbc *, struct dbc_request *);\n\tstruct list_head list_pool;\n\tint status;\n\tunsigned int actual;\n\tstruct xhci_dbc *dbc;\n\tstruct list_head list_pending;\n\tdma_addr_t trb_dma;\n\tunion xhci_trb *trb;\n\tunsigned int direction: 1;\n};\n\nstruct dbc_str_descs {\n\tchar string0[64];\n\tchar manufacturer[64];\n\tchar product[64];\n\tchar serial[64];\n};\n\nstruct dbg_reg_def_t {\n\tchar *name;\n\tint size;\n\tint offset;\n};\n\nstruct gov_attr_set {\n\tstruct kobject kobj;\n\tstruct list_head policy_list;\n\tstruct mutex update_lock;\n\tint usage_count;\n};\n\nstruct dbs_governor;\n\nstruct dbs_data {\n\tstruct gov_attr_set attr_set;\n\tstruct dbs_governor *gov;\n\tvoid *tuners;\n\tunsigned int ignore_nice_load;\n\tunsigned int sampling_rate;\n\tunsigned int sampling_down_factor;\n\tunsigned int up_threshold;\n\tunsigned int io_is_busy;\n};\n\nstruct sysfs_ops;\n\nstruct kobj_type {\n\tvoid (*release)(struct kobject *);\n\tconst struct sysfs_ops *sysfs_ops;\n\tconst struct attribute_group **default_groups;\n\tconst struct kobj_ns_type_operations * (*child_ns_type)(const struct kobject *);\n\tconst void * (*namespace)(const struct kobject *);\n\tvoid (*get_ownership)(const struct kobject *, kuid_t *, kgid_t *);\n};\n\nstruct dbs_governor {\n\tstruct cpufreq_governor gov;\n\tstruct kobj_type kobj_type;\n\tstruct dbs_data *gdbs_data;\n\tunsigned int (*gov_dbs_update)(struct cpufreq_policy *);\n\tstruct policy_dbs_info * (*alloc)(void);\n\tvoid (*free)(struct policy_dbs_info *);\n\tint (*init)(struct dbs_data *);\n\tvoid (*exit)(struct dbs_data *);\n\tvoid (*start)(struct cpufreq_policy *);\n};\n\nstruct dcb_app {\n\t__u8 selector;\n\t__u8 priority;\n\t__u16 protocol;\n};\n\nstruct dcb_app_type {\n\tint ifindex;\n\tstruct dcb_app app;\n\tstruct list_head list;\n\tu8 dcbx;\n};\n\nstruct dcb_ieee_app_dscp_map {\n\tu8 map[64];\n};\n\nstruct dcb_ieee_app_prio_map {\n\tu64 map[8];\n};\n\nstruct dcb_peer_app_info {\n\t__u8 willing;\n\t__u8 error;\n};\n\nstruct dcb_rewr_prio_pcp_map {\n\tu16 map[8];\n};\n\nstruct dcbmsg {\n\t__u8 dcb_family;\n\t__u8 cmd;\n\t__u16 dcb_pad;\n};\n\nstruct dcbnl_buffer {\n\t__u8 prio2buffer[8];\n\t__u32 buffer_size[8];\n\t__u32 total_size;\n};\n\nstruct ieee_ets;\n\nstruct ieee_maxrate;\n\nstruct ieee_qcn;\n\nstruct ieee_qcn_stats;\n\nstruct ieee_pfc;\n\nstruct dcbnl_rtnl_ops {\n\tint (*ieee_getets)(struct net_device *, struct ieee_ets *);\n\tint (*ieee_setets)(struct net_device *, struct ieee_ets *);\n\tint (*ieee_getmaxrate)(struct net_device *, struct ieee_maxrate *);\n\tint (*ieee_setmaxrate)(struct net_device *, struct ieee_maxrate *);\n\tint (*ieee_getqcn)(struct net_device *, struct ieee_qcn *);\n\tint (*ieee_setqcn)(struct net_device *, struct ieee_qcn *);\n\tint (*ieee_getqcnstats)(struct net_device *, struct ieee_qcn_stats *);\n\tint (*ieee_getpfc)(struct net_device *, struct ieee_pfc *);\n\tint (*ieee_setpfc)(struct net_device *, struct ieee_pfc *);\n\tint (*ieee_getapp)(struct net_device *, struct dcb_app *);\n\tint (*ieee_setapp)(struct net_device *, struct dcb_app *);\n\tint (*ieee_delapp)(struct net_device *, struct dcb_app *);\n\tint (*ieee_peer_getets)(struct net_device *, struct ieee_ets *);\n\tint (*ieee_peer_getpfc)(struct net_device *, struct ieee_pfc *);\n\tu8 (*getstate)(struct net_device *);\n\tu8 (*setstate)(struct net_device *, u8);\n\tvoid (*getpermhwaddr)(struct net_device *, u8 *);\n\tvoid (*setpgtccfgtx)(struct net_device *, int, u8, u8, u8, u8);\n\tvoid (*setpgbwgcfgtx)(struct net_device *, int, u8);\n\tvoid (*setpgtccfgrx)(struct net_device *, int, u8, u8, u8, u8);\n\tvoid (*setpgbwgcfgrx)(struct net_device *, int, u8);\n\tvoid (*getpgtccfgtx)(struct net_device *, int, u8 *, u8 *, u8 *, u8 *);\n\tvoid (*getpgbwgcfgtx)(struct net_device *, int, u8 *);\n\tvoid (*getpgtccfgrx)(struct net_device *, int, u8 *, u8 *, u8 *, u8 *);\n\tvoid (*getpgbwgcfgrx)(struct net_device *, int, u8 *);\n\tvoid (*setpfccfg)(struct net_device *, int, u8);\n\tvoid (*getpfccfg)(struct net_device *, int, u8 *);\n\tu8 (*setall)(struct net_device *);\n\tu8 (*getcap)(struct net_device *, int, u8 *);\n\tint (*getnumtcs)(struct net_device *, int, u8 *);\n\tint (*setnumtcs)(struct net_device *, int, u8);\n\tu8 (*getpfcstate)(struct net_device *);\n\tvoid (*setpfcstate)(struct net_device *, u8);\n\tvoid (*getbcncfg)(struct net_device *, int, u32 *);\n\tvoid (*setbcncfg)(struct net_device *, int, u32);\n\tvoid (*getbcnrp)(struct net_device *, int, u8 *);\n\tvoid (*setbcnrp)(struct net_device *, int, u8);\n\tint (*setapp)(struct net_device *, u8, u16, u8);\n\tint (*getapp)(struct net_device *, u8, u16);\n\tu8 (*getfeatcfg)(struct net_device *, int, u8 *);\n\tu8 (*setfeatcfg)(struct net_device *, int, u8);\n\tu8 (*getdcbx)(struct net_device *);\n\tu8 (*setdcbx)(struct net_device *, u8);\n\tint (*peer_getappinfo)(struct net_device *, struct dcb_peer_app_info *, u16 *);\n\tint (*peer_getapptable)(struct net_device *, struct dcb_app *);\n\tint (*cee_peer_getpg)(struct net_device *, struct cee_pg *);\n\tint (*cee_peer_getpfc)(struct net_device *, struct cee_pfc *);\n\tint (*dcbnl_getbuffer)(struct net_device *, struct dcbnl_buffer *);\n\tint (*dcbnl_setbuffer)(struct net_device *, struct dcbnl_buffer *);\n\tint (*dcbnl_setapptrust)(struct net_device *, u8 *, int);\n\tint (*dcbnl_getapptrust)(struct net_device *, u8 *, int *);\n\tint (*dcbnl_setrewr)(struct net_device *, struct dcb_app *);\n\tint (*dcbnl_delrewr)(struct net_device *, struct dcb_app *);\n};\n\nstruct dccp_hdr {\n\t__be16 dccph_sport;\n\t__be16 dccph_dport;\n\t__u8 dccph_doff;\n\t__u8 dccph_cscov: 4;\n\t__u8 dccph_ccval: 4;\n\t__sum16 dccph_checksum;\n\t__u8 dccph_x: 1;\n\t__u8 dccph_type: 4;\n\t__u8 dccph_reserved: 3;\n\t__u8 dccph_seq2;\n\t__be16 dccph_seq;\n};\n\nstruct io_stats_per_prio {\n\tuint32_t inserted;\n\tuint32_t merged;\n\tuint32_t dispatched;\n\tatomic_t completed;\n};\n\nstruct dd_per_prio {\n\tstruct list_head dispatch;\n\tstruct rb_root sort_list[2];\n\tstruct list_head fifo_list[2];\n\tsector_t latest_pos[2];\n\tstruct io_stats_per_prio stats;\n};\n\nstruct ddebug_class_map {\n\tstruct list_head link;\n\tstruct module *mod;\n\tconst char *mod_name;\n\tconst char **class_names;\n\tconst int length;\n\tconst int base;\n\tenum class_map_type map_type;\n};\n\nstruct ddebug_class_param {\n\tunion {\n\t\tlong unsigned int *bits;\n\t\tunsigned int *lvl;\n\t};\n\tchar flags[8];\n\tconst struct ddebug_class_map *map;\n};\n\nstruct ddebug_table;\n\nstruct ddebug_iter {\n\tstruct ddebug_table *table;\n\tint idx;\n};\n\nstruct ddebug_query {\n\tconst char *filename;\n\tconst char *module;\n\tconst char *function;\n\tconst char *format;\n\tconst char *class_string;\n\tunsigned int first_lineno;\n\tunsigned int last_lineno;\n};\n\nstruct ddebug_table {\n\tstruct list_head link;\n\tstruct list_head maps;\n\tconst char *mod_name;\n\tunsigned int num_ddebugs;\n\tstruct _ddebug *ddebugs;\n};\n\nstruct deadline_data {\n\tstruct dd_per_prio per_prio[3];\n\tenum dd_data_dir last_dir;\n\tunsigned int batching;\n\tunsigned int starved;\n\tint fifo_expire[2];\n\tint fifo_batch;\n\tint writes_starved;\n\tint front_merges;\n\tu32 async_depth;\n\tint prio_aging_expire;\n\tspinlock_t lock;\n};\n\nstruct usb_bus;\n\nstruct debug_buffer {\n\tssize_t (*fill_func)(struct debug_buffer *);\n\tstruct usb_bus *bus;\n\tstruct mutex mutex;\n\tsize_t count;\n\tchar *output_buf;\n\tsize_t alloc_size;\n};\n\nstruct ohci_hcd;\n\nstruct debug_buffer___2 {\n\tssize_t (*fill_func)(struct debug_buffer___2 *);\n\tstruct ohci_hcd *ohci;\n\tstruct mutex mutex;\n\tsize_t count;\n\tchar *page;\n};\n\nstruct debug_reply_data {\n\tstruct ethnl_reply_data base;\n\tu32 msg_mask;\n};\n\nstruct debugfs_blob_wrapper {\n\tvoid *data;\n\tlong unsigned int size;\n};\n\nstruct debugfs_cancellation {\n\tstruct list_head list;\n\tvoid (*cancel)(struct dentry *, void *);\n\tvoid *cancel_data;\n};\n\nstruct debugfs_devm_entry {\n\tint (*read)(struct seq_file *, void *);\n\tstruct device *dev;\n};\n\nstruct debugfs_fs_info {\n\tkuid_t uid;\n\tkgid_t gid;\n\tumode_t mode;\n\tunsigned int opts;\n};\n\ntypedef struct vfsmount * (*debugfs_automount_t)(struct dentry *, void *);\n\nstruct debugfs_fsdata {\n\tconst struct file_operations *real_fops;\n\tunion {\n\t\tdebugfs_automount_t automount;\n\t\tstruct {\n\t\t\trefcount_t active_users;\n\t\t\tstruct completion active_users_drained;\n\t\t\tstruct mutex cancellations_mtx;\n\t\t\tstruct list_head cancellations;\n\t\t};\n\t};\n};\n\nstruct debugfs_reg32 {\n\tchar *name;\n\tlong unsigned int offset;\n};\n\nstruct debugfs_regset32 {\n\tconst struct debugfs_reg32 *regs;\n\tint nregs;\n\tvoid *base;\n\tstruct device *dev;\n};\n\nstruct debugfs_u32_array {\n\tu32 *array;\n\tu32 n_elements;\n};\n\nstruct debuggerinfo_struct {\n\tvoid *debuggerinfo;\n\tstruct task_struct *task;\n\tint exception_state;\n\tint ret_state;\n\tint irq_depth;\n\tint enter_kgdb;\n\tbool rounding_up;\n};\n\nstruct dec_data {\n\tstruct task_struct *thr;\n\tstruct crypto_comp *cc;\n\tatomic_t ready;\n\tatomic_t stop;\n\tint ret;\n\twait_queue_head_t go;\n\twait_queue_head_t done;\n\tsize_t unc_len;\n\tsize_t cmp_len;\n\tunsigned char unc[131072];\n\tunsigned char cmp[143360];\n};\n\nstruct decomp_stream {\n\tvoid *stream;\n\tstruct list_head list;\n};\n\nstruct deepsleep_control_data {\n\tu8 reg_add;\n\tu8 ds_pos_bit;\n};\n\nstruct dma_fence;\n\nstruct dma_fence_cb;\n\ntypedef void (*dma_fence_func_t)(struct dma_fence *, struct dma_fence_cb *);\n\nstruct dma_fence_cb {\n\tstruct list_head node;\n\tdma_fence_func_t func;\n};\n\nstruct default_wait_cb {\n\tstruct dma_fence_cb base;\n\tstruct task_struct *task;\n};\n\nstruct deferred_entry {\n\tstruct list_head list;\n\tgrant_ref_t ref;\n\tuint16_t warn_delay;\n\tstruct page *page;\n};\n\nstruct deferred_split {\n\tspinlock_t split_queue_lock;\n\tstruct list_head split_queue;\n\tlong unsigned int split_queue_len;\n};\n\nstruct internal_state;\n\nstruct z_stream_s {\n\tconst Byte *next_in;\n\tuLong avail_in;\n\tuLong total_in;\n\tByte *next_out;\n\tuLong avail_out;\n\tuLong total_out;\n\tchar *msg;\n\tstruct internal_state *state;\n\tvoid *workspace;\n\tint data_type;\n\tuLong adler;\n\tuLong reserved;\n};\n\nstruct deflate_ctx {\n\tstruct z_stream_s comp_stream;\n\tstruct z_stream_s decomp_stream;\n};\n\ntypedef struct z_stream_s z_stream;\n\ntypedef z_stream *z_streamp;\n\nstruct static_tree_desc_s;\n\ntypedef struct static_tree_desc_s static_tree_desc;\n\nstruct tree_desc_s {\n\tct_data *dyn_tree;\n\tint max_code;\n\tstatic_tree_desc *stat_desc;\n};\n\nstruct deflate_state {\n\tz_streamp strm;\n\tint status;\n\tByte *pending_buf;\n\tulg pending_buf_size;\n\tByte *pending_out;\n\tint pending;\n\tint noheader;\n\tByte data_type;\n\tByte method;\n\tint last_flush;\n\tuInt w_size;\n\tuInt w_bits;\n\tuInt w_mask;\n\tByte *window;\n\tulg window_size;\n\tPos *prev;\n\tPos *head;\n\tuInt ins_h;\n\tuInt hash_size;\n\tuInt hash_bits;\n\tuInt hash_mask;\n\tuInt hash_shift;\n\tlong int block_start;\n\tuInt match_length;\n\tIPos prev_match;\n\tint match_available;\n\tuInt strstart;\n\tuInt match_start;\n\tuInt lookahead;\n\tuInt prev_length;\n\tuInt max_chain_length;\n\tuInt max_lazy_match;\n\tint level;\n\tint strategy;\n\tuInt good_match;\n\tint nice_match;\n\tstruct ct_data_s dyn_ltree[573];\n\tstruct ct_data_s dyn_dtree[61];\n\tstruct ct_data_s bl_tree[39];\n\tstruct tree_desc_s l_desc;\n\tstruct tree_desc_s d_desc;\n\tstruct tree_desc_s bl_desc;\n\tush bl_count[16];\n\tint heap[573];\n\tint heap_len;\n\tint heap_max;\n\tuch depth[573];\n\tuch *l_buf;\n\tuInt lit_bufsize;\n\tuInt last_lit;\n\tush *d_buf;\n\tulg opt_len;\n\tulg static_len;\n\tulg compressed_len;\n\tuInt matches;\n\tint last_eob_len;\n\tush bi_buf;\n\tint bi_valid;\n};\n\nstruct deflate_workspace {\n\tdeflate_state deflate_memory;\n\tByte *window_memory;\n\tPos *prev_memory;\n\tPos *head_memory;\n\tchar *overlay_memory;\n};\n\ntypedef struct deflate_workspace deflate_workspace;\n\nstruct delayed_call {\n\tvoid (*fn)(void *);\n\tvoid *arg;\n};\n\nstruct uprobe;\n\nstruct delayed_uprobe {\n\tstruct list_head list;\n\tstruct uprobe *uprobe;\n\tstruct mm_struct *mm;\n};\n\nstruct demotion_nodes {\n\tnodemask_t preferred;\n};\n\nstruct hlist_bl_node {\n\tstruct hlist_bl_node *next;\n\tstruct hlist_bl_node **pprev;\n};\n\nstruct qstr {\n\tunion {\n\t\tstruct {\n\t\t\tu32 hash;\n\t\t\tu32 len;\n\t\t};\n\t\tu64 hash_len;\n\t};\n\tconst unsigned char *name;\n};\n\nstruct lockref {\n\tunion {\n\t\t__u64 lock_count;\n\t\tstruct {\n\t\t\tspinlock_t lock;\n\t\t\tint count;\n\t\t};\n\t};\n};\n\nstruct dentry_operations;\n\nstruct dentry {\n\tunsigned int d_flags;\n\tseqcount_spinlock_t d_seq;\n\tstruct hlist_bl_node d_hash;\n\tstruct dentry *d_parent;\n\tstruct qstr d_name;\n\tstruct inode *d_inode;\n\tunsigned char d_iname[40];\n\tconst struct dentry_operations *d_op;\n\tstruct super_block *d_sb;\n\tlong unsigned int d_time;\n\tvoid *d_fsdata;\n\tstruct lockref d_lockref;\n\tunion {\n\t\tstruct list_head d_lru;\n\t\twait_queue_head_t *d_wait;\n\t};\n\tstruct hlist_node d_sib;\n\tstruct hlist_head d_children;\n\tunion {\n\t\tstruct hlist_node d_alias;\n\t\tstruct hlist_bl_node d_in_lookup_hash;\n\t\tstruct callback_head d_rcu;\n\t} d_u;\n};\n\nstruct dentry__safe_trusted {\n\tstruct inode *d_inode;\n};\n\nstruct dentry_info_args {\n\tint parent_ino;\n\tint dname_len;\n\tint ino;\n\tint inode_len;\n\tchar *dname;\n};\n\nstruct dentry_operations {\n\tint (*d_revalidate)(struct dentry *, unsigned int);\n\tint (*d_weak_revalidate)(struct dentry *, unsigned int);\n\tint (*d_hash)(const struct dentry *, struct qstr *);\n\tint (*d_compare)(const struct dentry *, unsigned int, const char *, const struct qstr *);\n\tint (*d_delete)(const struct dentry *);\n\tint (*d_init)(struct dentry *);\n\tvoid (*d_release)(struct dentry *);\n\tvoid (*d_prune)(struct dentry *);\n\tvoid (*d_iput)(struct dentry *, struct inode *);\n\tchar * (*d_dname)(struct dentry *, char *, int);\n\tstruct vfsmount * (*d_automount)(struct path *);\n\tint (*d_manage)(const struct path *, bool);\n\tstruct dentry * (*d_real)(struct dentry *, enum d_real_type);\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct dentry_stat_t {\n\tlong int nr_dentry;\n\tlong int nr_unused;\n\tlong int age_limit;\n\tlong int want_pages;\n\tlong int nr_negative;\n\tlong int dummy;\n};\n\nstruct desc_ptr {\n\tshort unsigned int size;\n\tlong unsigned int address;\n} __attribute__((packed));\n\nstruct desc_struct {\n\tu16 limit0;\n\tu16 base0;\n\tu16 base1: 8;\n\tu16 type: 4;\n\tu16 s: 1;\n\tu16 dpl: 2;\n\tu16 p: 1;\n\tu16 limit1: 4;\n\tu16 avl: 1;\n\tu16 l: 1;\n\tu16 d: 1;\n\tu16 g: 1;\n\tu16 base2: 8;\n};\n\nstruct slab;\n\nstruct detached_freelist {\n\tstruct slab *slab;\n\tvoid *tail;\n\tvoid *freelist;\n\tint cnt;\n\tstruct kmem_cache *s;\n};\n\nstruct detailed_data_monitor_range {\n\tu8 min_vfreq;\n\tu8 max_vfreq;\n\tu8 min_hfreq_khz;\n\tu8 max_hfreq_khz;\n\tu8 pixel_clock_mhz;\n\tu8 flags;\n\tunion {\n\t\tstruct {\n\t\t\tu8 reserved;\n\t\t\tu8 hfreq_start_khz;\n\t\t\tu8 c;\n\t\t\t__le16 m;\n\t\t\tu8 k;\n\t\t\tu8 j;\n\t\t} __attribute__((packed)) gtf2;\n\t\tstruct {\n\t\t\tu8 version;\n\t\t\tu8 data1;\n\t\t\tu8 data2;\n\t\t\tu8 supported_aspects;\n\t\t\tu8 flags;\n\t\t\tu8 supported_scalings;\n\t\t\tu8 preferred_refresh;\n\t\t} cvt;\n\t} formula;\n};\n\nstruct detailed_data_string {\n\tu8 str[13];\n};\n\nstruct detailed_data_wpindex {\n\tu8 white_yx_lo;\n\tu8 white_x_hi;\n\tu8 white_y_hi;\n\tu8 gamma;\n};\n\nstruct detailed_mode_closure {\n\tstruct drm_connector *connector;\n\tconst struct drm_edid *drm_edid;\n\tbool preferred;\n\tint modes;\n};\n\nstruct std_timing {\n\tu8 hsize;\n\tu8 vfreq_aspect;\n};\n\nstruct detailed_non_pixel {\n\tu8 pad1;\n\tu8 type;\n\tu8 pad2;\n\tunion {\n\t\tstruct detailed_data_string str;\n\t\tstruct detailed_data_monitor_range range;\n\t\tstruct detailed_data_wpindex color;\n\t\tstruct std_timing timings[6];\n\t\tstruct cvt_timing cvt[4];\n\t} data;\n};\n\nstruct detailed_pixel_timing {\n\tu8 hactive_lo;\n\tu8 hblank_lo;\n\tu8 hactive_hblank_hi;\n\tu8 vactive_lo;\n\tu8 vblank_lo;\n\tu8 vactive_vblank_hi;\n\tu8 hsync_offset_lo;\n\tu8 hsync_pulse_width_lo;\n\tu8 vsync_offset_pulse_width_lo;\n\tu8 hsync_vsync_offset_pulse_width_hi;\n\tu8 width_mm_lo;\n\tu8 height_mm_lo;\n\tu8 width_height_mm_hi;\n\tu8 hborder;\n\tu8 vborder;\n\tu8 misc;\n};\n\nstruct detailed_timing {\n\t__le16 pixel_clock;\n\tunion {\n\t\tstruct detailed_pixel_timing pixel_data;\n\t\tstruct detailed_non_pixel other_data;\n\t} data;\n};\n\nstruct detected_devices_node {\n\tstruct list_head list;\n\tdev_t dev;\n};\n\nstruct dev_cgroup {\n\tstruct cgroup_subsys_state css;\n\tstruct list_head exceptions;\n\tenum devcg_behavior behavior;\n};\n\nstruct dev_pagemap;\n\nstruct dev_dax_range;\n\nstruct dev_dax {\n\tstruct dax_region *region;\n\tstruct dax_device *dax_dev;\n\tunsigned int align;\n\tint target_node;\n\tbool dyn_id;\n\tint id;\n\tstruct ida ida;\n\tstruct device dev;\n\tstruct dev_pagemap *pgmap;\n\tbool memmap_on_memory;\n\tint nr_range;\n\tstruct dev_dax_range *ranges;\n};\n\nstruct dev_dax_data {\n\tstruct dax_region *dax_region;\n\tstruct dev_pagemap *pgmap;\n\tresource_size_t size;\n\tint id;\n\tbool memmap_on_memory;\n};\n\nstruct dev_dax_range {\n\tlong unsigned int pgoff;\n\tstruct range range;\n\tstruct dax_mapping *mapping;\n};\n\nstruct dev_exception_item {\n\tu32 major;\n\tu32 minor;\n\tshort int type;\n\tshort int access;\n\tstruct list_head list;\n\tstruct callback_head rcu;\n};\n\nstruct dev_ext_attribute {\n\tstruct device_attribute attr;\n\tvoid *var;\n};\n\nstruct efi_generic_dev_path {\n\tu8 type;\n\tu8 sub_type;\n\tu16 length;\n};\n\nstruct efi_acpi_dev_path {\n\tstruct efi_generic_dev_path header;\n\tu32 hid;\n\tu32 uid;\n};\n\nstruct efi_pci_dev_path {\n\tstruct efi_generic_dev_path header;\n\tu8 fn;\n\tu8 dev;\n};\n\nstruct efi_vendor_dev_path {\n\tstruct efi_generic_dev_path header;\n\tefi_guid_t vendorguid;\n\tu8 vendordata[0];\n};\n\nstruct efi_rel_offset_dev_path {\n\tstruct efi_generic_dev_path header;\n\tu32 reserved;\n\tu64 starting_offset;\n\tu64 ending_offset;\n};\n\nstruct efi_dev_path {\n\tunion {\n\t\tstruct efi_generic_dev_path header;\n\t\tstruct efi_acpi_dev_path acpi;\n\t\tstruct efi_pci_dev_path pci;\n\t\tstruct efi_vendor_dev_path vendor;\n\t\tstruct efi_rel_offset_dev_path rel_offset;\n\t};\n};\n\nstruct dev_header {\n\tu32 len;\n\tu32 prop_count;\n\tstruct efi_dev_path path[0];\n};\n\nstruct dev_ifalias {\n\tstruct callback_head rcuhead;\n\tchar ifalias[0];\n};\n\nstruct iommu_fault_param;\n\nstruct iommu_fwspec;\n\nstruct dev_iommu {\n\tstruct mutex lock;\n\tstruct iommu_fault_param *fault_param;\n\tstruct iommu_fwspec *fwspec;\n\tstruct iommu_device *iommu_dev;\n\tvoid *priv;\n\tu32 max_pasids;\n\tu32 attach_deferred: 1;\n\tu32 pci_32bit_workaround: 1;\n\tu32 require_direct: 1;\n\tu32 shadow_on_flush: 1;\n};\n\nstruct dev_kfree_skb_cb {\n\tenum skb_drop_reason reason;\n};\n\nstruct vmem_altmap {\n\tlong unsigned int base_pfn;\n\tconst long unsigned int end_pfn;\n\tconst long unsigned int reserve;\n\tlong unsigned int free;\n\tlong unsigned int align;\n\tlong unsigned int alloc;\n\tbool inaccessible;\n};\n\nstruct dev_pagemap_ops;\n\nstruct dev_pagemap {\n\tstruct vmem_altmap altmap;\n\tstruct percpu_ref ref;\n\tstruct completion done;\n\tenum memory_type type;\n\tunsigned int flags;\n\tlong unsigned int vmemmap_shift;\n\tconst struct dev_pagemap_ops *ops;\n\tvoid *owner;\n\tint nr_range;\n\tunion {\n\t\tstruct range range;\n\t\tstruct {\n\t\t\tstruct {} __empty_ranges;\n\t\t\tstruct range ranges[0];\n\t\t};\n\t};\n};\n\nstruct vm_fault;\n\nstruct dev_pagemap_ops {\n\tvoid (*page_free)(struct page *);\n\tvm_fault_t (*migrate_to_ram)(struct vm_fault *);\n\tint (*memory_failure)(struct dev_pagemap *, long unsigned int, long unsigned int, int);\n};\n\nstruct dev_pasid_info {\n\tstruct list_head link_domain;\n\tstruct device *dev;\n\tioasid_t pasid;\n};\n\nstruct pinctrl;\n\nstruct pinctrl_state;\n\nstruct dev_pin_info {\n\tstruct pinctrl *p;\n\tstruct pinctrl_state *default_state;\n\tstruct pinctrl_state *init_state;\n\tstruct pinctrl_state *sleep_state;\n\tstruct pinctrl_state *idle_state;\n};\n\nstruct dev_pm_ops {\n\tint (*prepare)(struct device *);\n\tvoid (*complete)(struct device *);\n\tint (*suspend)(struct device *);\n\tint (*resume)(struct device *);\n\tint (*freeze)(struct device *);\n\tint (*thaw)(struct device *);\n\tint (*poweroff)(struct device *);\n\tint (*restore)(struct device *);\n\tint (*suspend_late)(struct device *);\n\tint (*resume_early)(struct device *);\n\tint (*freeze_late)(struct device *);\n\tint (*thaw_early)(struct device *);\n\tint (*poweroff_late)(struct device *);\n\tint (*restore_early)(struct device *);\n\tint (*suspend_noirq)(struct device *);\n\tint (*resume_noirq)(struct device *);\n\tint (*freeze_noirq)(struct device *);\n\tint (*thaw_noirq)(struct device *);\n\tint (*poweroff_noirq)(struct device *);\n\tint (*restore_noirq)(struct device *);\n\tint (*runtime_suspend)(struct device *);\n\tint (*runtime_resume)(struct device *);\n\tint (*runtime_idle)(struct device *);\n};\n\nstruct dev_pm_domain {\n\tstruct dev_pm_ops ops;\n\tint (*start)(struct device *);\n\tvoid (*detach)(struct device *, bool);\n\tint (*activate)(struct device *);\n\tvoid (*sync)(struct device *);\n\tvoid (*dismiss)(struct device *);\n\tint (*set_performance_state)(struct device *, unsigned int);\n};\n\nstruct dev_pm_domain_attach_data {\n\tconst char * const *pd_names;\n\tconst u32 num_pd_names;\n\tconst u32 pd_flags;\n};\n\nstruct device_link;\n\nstruct dev_pm_domain_list {\n\tstruct device **pd_devs;\n\tstruct device_link **pd_links;\n\tu32 num_pds;\n};\n\nstruct dev_pm_opp_supply;\n\nstruct dev_pm_opp_icc_bw;\n\nstruct opp_table;\n\nstruct dev_pm_opp {\n\tstruct list_head node;\n\tstruct kref kref;\n\tbool available;\n\tbool dynamic;\n\tbool turbo;\n\tbool suspend;\n\tbool removed;\n\tlong unsigned int *rates;\n\tunsigned int level;\n\tstruct dev_pm_opp_supply *supplies;\n\tstruct dev_pm_opp_icc_bw *bandwidth;\n\tlong unsigned int clock_latency_ns;\n\tstruct dev_pm_opp **required_opps;\n\tstruct opp_table *opp_table;\n\tstruct device_node *np;\n\tstruct dentry *dentry;\n\tconst char *of_name;\n};\n\ntypedef int (*config_clks_t)(struct device *, struct opp_table *, struct dev_pm_opp *, void *, bool);\n\ntypedef int (*config_regulators_t)(struct device *, struct dev_pm_opp *, struct dev_pm_opp *, struct regulator **, unsigned int);\n\nstruct dev_pm_opp_config {\n\tconst char * const *clk_names;\n\tconfig_clks_t config_clks;\n\tconst char *prop_name;\n\tconfig_regulators_t config_regulators;\n\tconst unsigned int *supported_hw;\n\tunsigned int supported_hw_count;\n\tconst char * const *regulator_names;\n\tconst char * const *genpd_names;\n\tstruct device ***virt_devs;\n\tstruct device **required_devs;\n};\n\nstruct dev_pm_opp_data {\n\tbool turbo;\n\tunsigned int level;\n\tlong unsigned int freq;\n\tlong unsigned int u_volt;\n};\n\nstruct dev_pm_opp_icc_bw {\n\tu32 avg;\n\tu32 peak;\n};\n\nstruct dev_pm_opp_supply {\n\tlong unsigned int u_volt;\n\tlong unsigned int u_volt_min;\n\tlong unsigned int u_volt_max;\n\tlong unsigned int u_amp;\n\tlong unsigned int u_watt;\n};\n\nstruct pm_qos_flags {\n\tstruct list_head list;\n\ts32 effective_flags;\n};\n\nstruct dev_pm_qos_request;\n\nstruct dev_pm_qos {\n\tstruct pm_qos_constraints resume_latency;\n\tstruct pm_qos_constraints latency_tolerance;\n\tstruct freq_constraints freq;\n\tstruct pm_qos_flags flags;\n\tstruct dev_pm_qos_request *resume_latency_req;\n\tstruct dev_pm_qos_request *latency_tolerance_req;\n\tstruct dev_pm_qos_request *flags_req;\n};\n\nstruct pm_qos_flags_request {\n\tstruct list_head node;\n\ts32 flags;\n};\n\nstruct dev_pm_qos_request {\n\tenum dev_pm_qos_req_type type;\n\tunion {\n\t\tstruct plist_node pnode;\n\t\tstruct pm_qos_flags_request flr;\n\t\tstruct freq_qos_request freq;\n\t} data;\n\tstruct device *dev;\n};\n\nstruct dev_power_governor {\n\tbool (*power_down_ok)(struct dev_pm_domain *);\n\tbool (*suspend_ok)(struct device *);\n};\n\nstruct dev_printk_info {\n\tchar subsystem[16];\n\tchar device[48];\n};\n\nstruct dev_table_entry {\n\tu64 data[4];\n};\n\nstruct devcd_entry {\n\tstruct device devcd_dev;\n\tvoid *data;\n\tsize_t datalen;\n\tstruct mutex mutex;\n\tbool delete_work;\n\tstruct module *owner;\n\tssize_t (*read)(char *, loff_t, size_t, void *, size_t);\n\tvoid (*free)(void *);\n\tstruct delayed_work del_wk;\n\tstruct device *failing_dev;\n};\n\nstruct devfreq_dev_status {\n\tlong unsigned int total_time;\n\tlong unsigned int busy_time;\n\tlong unsigned int current_frequency;\n\tvoid *private_data;\n};\n\nstruct devfreq_stats {\n\tunsigned int total_trans;\n\tunsigned int *trans_table;\n\tu64 *time_in_state;\n\tu64 last_update;\n};\n\nstruct devfreq_dev_profile;\n\nstruct devfreq_governor;\n\nstruct devfreq {\n\tstruct list_head node;\n\tstruct mutex lock;\n\tstruct device dev;\n\tstruct devfreq_dev_profile *profile;\n\tconst struct devfreq_governor *governor;\n\tstruct opp_table *opp_table;\n\tstruct notifier_block nb;\n\tstruct delayed_work work;\n\tlong unsigned int *freq_table;\n\tunsigned int max_state;\n\tlong unsigned int previous_freq;\n\tstruct devfreq_dev_status last_status;\n\tvoid *data;\n\tvoid *governor_data;\n\tstruct dev_pm_qos_request user_min_freq_req;\n\tstruct dev_pm_qos_request user_max_freq_req;\n\tlong unsigned int scaling_min_freq;\n\tlong unsigned int scaling_max_freq;\n\tbool stop_polling;\n\tlong unsigned int suspend_freq;\n\tlong unsigned int resume_freq;\n\tatomic_t suspend_count;\n\tstruct devfreq_stats stats;\n\tstruct srcu_notifier_head transition_notifier_list;\n\tstruct thermal_cooling_device *cdev;\n\tstruct notifier_block nb_min;\n\tstruct notifier_block nb_max;\n};\n\nstruct thermal_cooling_device_ops {\n\tint (*get_max_state)(struct thermal_cooling_device *, long unsigned int *);\n\tint (*get_cur_state)(struct thermal_cooling_device *, long unsigned int *);\n\tint (*set_cur_state)(struct thermal_cooling_device *, long unsigned int);\n\tint (*get_requested_power)(struct thermal_cooling_device *, u32 *);\n\tint (*state2power)(struct thermal_cooling_device *, long unsigned int, u32 *);\n\tint (*power2state)(struct thermal_cooling_device *, u32, long unsigned int *);\n};\n\nstruct devfreq_cooling_power;\n\nstruct devfreq_cooling_device {\n\tstruct thermal_cooling_device *cdev;\n\tstruct thermal_cooling_device_ops cooling_ops;\n\tstruct devfreq *devfreq;\n\tlong unsigned int cooling_state;\n\tu32 *freq_table;\n\tsize_t max_state;\n\tstruct devfreq_cooling_power *power_ops;\n\tu32 res_util;\n\tint capped_state;\n\tstruct dev_pm_qos_request req_max_freq;\n\tstruct em_perf_domain *em_pd;\n};\n\nstruct devfreq_cooling_power {\n\tint (*get_real_power)(struct devfreq *, u32 *, long unsigned int, long unsigned int);\n};\n\nstruct devfreq_cpu_data {\n\tstruct list_head node;\n\tstruct device *dev;\n\tunsigned int first_cpu;\n\tstruct opp_table *opp_table;\n\tunsigned int cur_freq;\n\tunsigned int min_freq;\n\tunsigned int max_freq;\n};\n\nstruct devfreq_dev_profile {\n\tlong unsigned int initial_freq;\n\tunsigned int polling_ms;\n\tenum devfreq_timer timer;\n\tint (*target)(struct device *, long unsigned int *, u32);\n\tint (*get_dev_status)(struct device *, struct devfreq_dev_status *);\n\tint (*get_cur_freq)(struct device *, long unsigned int *);\n\tvoid (*exit)(struct device *);\n\tlong unsigned int *freq_table;\n\tunsigned int max_state;\n\tbool is_cooling_device;\n};\n\nstruct devfreq_event_data {\n\tlong unsigned int load_count;\n\tlong unsigned int total_count;\n};\n\nstruct devfreq_event_ops;\n\nstruct devfreq_event_desc {\n\tconst char *name;\n\tu32 event_type;\n\tvoid *driver_data;\n\tconst struct devfreq_event_ops *ops;\n};\n\nstruct devfreq_event_dev {\n\tstruct list_head node;\n\tstruct device dev;\n\tstruct mutex lock;\n\tu32 enable_count;\n\tconst struct devfreq_event_desc *desc;\n};\n\nstruct devfreq_event_ops {\n\tint (*enable)(struct devfreq_event_dev *);\n\tint (*disable)(struct devfreq_event_dev *);\n\tint (*reset)(struct devfreq_event_dev *);\n\tint (*set_event)(struct devfreq_event_dev *);\n\tint (*get_event)(struct devfreq_event_dev *, struct devfreq_event_data *);\n};\n\nstruct devfreq_freqs {\n\tlong unsigned int old;\n\tlong unsigned int new;\n};\n\nstruct devfreq_governor {\n\tstruct list_head node;\n\tconst char name[16];\n\tconst u64 attrs;\n\tconst u64 flags;\n\tint (*get_target_freq)(struct devfreq *, long unsigned int *);\n\tint (*event_handler)(struct devfreq *, unsigned int, void *);\n};\n\nstruct devfreq_notifier_devres {\n\tstruct devfreq *devfreq;\n\tstruct notifier_block *nb;\n\tunsigned int list;\n};\n\nstruct devfreq_passive_data {\n\tstruct devfreq *parent;\n\tint (*get_target_freq)(struct devfreq *, long unsigned int *);\n\tenum devfreq_parent_dev_type parent_type;\n\tstruct devfreq *this;\n\tstruct notifier_block nb;\n\tstruct list_head cpu_data_list;\n};\n\nstruct devfreq_simple_ondemand_data {\n\tunsigned int upthreshold;\n\tunsigned int downdifferential;\n};\n\nstruct device_attach_data {\n\tstruct device *dev;\n\tbool check_async;\n\tbool want_async;\n\tbool have_async;\n};\n\nunion device_attr_group_devres {\n\tconst struct attribute_group *group;\n\tconst struct attribute_group **groups;\n};\n\nstruct device_dma_parameters {\n\tunsigned int max_segment_size;\n\tunsigned int min_align_mask;\n\tlong unsigned int segment_boundary_mask;\n};\n\nstruct dmar_domain;\n\nstruct pasid_table;\n\nstruct device_domain_info {\n\tstruct list_head link;\n\tu32 segment;\n\tu8 bus;\n\tu8 devfn;\n\tu16 pfsid;\n\tu8 pasid_supported: 3;\n\tu8 pasid_enabled: 1;\n\tu8 pri_supported: 1;\n\tu8 pri_enabled: 1;\n\tu8 ats_supported: 1;\n\tu8 ats_enabled: 1;\n\tu8 dtlb_extra_inval: 1;\n\tu8 ats_qdep;\n\tstruct device *dev;\n\tstruct intel_iommu *iommu;\n\tstruct dmar_domain *domain;\n\tstruct pasid_table *pasid_table;\n\tstruct rb_node node;\n};\n\nstruct device_link {\n\tstruct device *supplier;\n\tstruct list_head s_node;\n\tstruct device *consumer;\n\tstruct list_head c_node;\n\tstruct device link_dev;\n\tenum device_link_state status;\n\tu32 flags;\n\trefcount_t rpm_active;\n\tstruct kref kref;\n\tstruct work_struct rm_work;\n\tbool supplier_preactivated;\n};\n\nstruct property;\n\nstruct device_node {\n\tconst char *name;\n\tphandle phandle;\n\tconst char *full_name;\n\tstruct fwnode_handle fwnode;\n\tstruct property *properties;\n\tstruct property *deadprops;\n\tstruct device_node *parent;\n\tstruct device_node *child;\n\tstruct device_node *sibling;\n\tlong unsigned int _flags;\n\tvoid *data;\n};\n\nstruct device_physical_location {\n\tenum device_physical_location_panel panel;\n\tenum device_physical_location_vertical_position vertical_position;\n\tenum device_physical_location_horizontal_position horizontal_position;\n\tbool dock;\n\tbool lid;\n};\n\nstruct klist_node {\n\tvoid *n_klist;\n\tstruct list_head n_node;\n\tstruct kref n_ref;\n};\n\nstruct device_private {\n\tstruct klist klist_children;\n\tstruct klist_node knode_parent;\n\tstruct klist_node knode_driver;\n\tstruct klist_node knode_bus;\n\tstruct klist_node knode_class;\n\tstruct list_head deferred_probe;\n\tconst struct device_driver *async_driver;\n\tchar *deferred_probe_reason;\n\tstruct device *device;\n\tu8 dead: 1;\n};\n\nstruct device_type {\n\tconst char *name;\n\tconst struct attribute_group **groups;\n\tint (*uevent)(const struct device *, struct kobj_uevent_env *);\n\tchar * (*devnode)(const struct device *, umode_t *, kuid_t *, kgid_t *);\n\tvoid (*release)(struct device *);\n\tconst struct dev_pm_ops *pm;\n};\n\nstruct devid_map {\n\tstruct list_head list;\n\tu8 id;\n\tu32 devid;\n\tbool cmd_line;\n};\n\nstruct devinet_sysctl_table {\n\tstruct ctl_table_header *sysctl_header;\n\tstruct ctl_table devinet_vars[33];\n};\n\nstruct ratelimit_state {\n\traw_spinlock_t lock;\n\tint interval;\n\tint burst;\n\tint printed;\n\tint missed;\n\tlong unsigned int begin;\n\tlong unsigned int flags;\n};\n\nstruct printk_buffers {\n\tchar outbuf[2048];\n\tchar scratchbuf[1024];\n};\n\nstruct devkmsg_user {\n\tatomic64_t seq;\n\tstruct ratelimit_state rs;\n\tstruct mutex lock;\n\tstruct printk_buffers pbufs;\n};\n\nstruct devlink_dev_stats {\n\tu32 reload_stats[6];\n\tu32 remote_reload_stats[6];\n};\n\nstruct devlink_dpipe_headers;\n\nstruct devlink_ops;\n\nstruct devlink_rel;\n\nstruct devlink {\n\tu32 index;\n\tstruct xarray ports;\n\tstruct list_head rate_list;\n\tstruct list_head sb_list;\n\tstruct list_head dpipe_table_list;\n\tstruct list_head resource_list;\n\tstruct xarray params;\n\tstruct list_head region_list;\n\tstruct list_head reporter_list;\n\tstruct devlink_dpipe_headers *dpipe_headers;\n\tstruct list_head trap_list;\n\tstruct list_head trap_group_list;\n\tstruct list_head trap_policer_list;\n\tstruct list_head linecard_list;\n\tconst struct devlink_ops *ops;\n\tstruct xarray snapshot_ids;\n\tstruct devlink_dev_stats stats;\n\tstruct device *dev;\n\tpossible_net_t _net;\n\tstruct mutex lock;\n\tstruct lock_class_key lock_key;\n\tu8 reload_failed: 1;\n\trefcount_t refcount;\n\tstruct rcu_work rwork;\n\tstruct devlink_rel *rel;\n\tstruct xarray nested_rels;\n\tchar priv[0];\n};\n\nstruct devlink_dpipe_header;\n\nstruct devlink_dpipe_action {\n\tenum devlink_dpipe_action_type type;\n\tunsigned int header_index;\n\tstruct devlink_dpipe_header *header;\n\tunsigned int field_id;\n};\n\nstruct genl_info;\n\nstruct devlink_dpipe_dump_ctx {\n\tstruct genl_info *info;\n\tenum devlink_command cmd;\n\tstruct sk_buff *skb;\n\tstruct nlattr *nest;\n\tvoid *hdr;\n};\n\nstruct devlink_dpipe_value;\n\nstruct devlink_dpipe_entry {\n\tu64 index;\n\tstruct devlink_dpipe_value *match_values;\n\tunsigned int match_values_count;\n\tstruct devlink_dpipe_value *action_values;\n\tunsigned int action_values_count;\n\tu64 counter;\n\tbool counter_valid;\n};\n\nstruct devlink_dpipe_field {\n\tconst char *name;\n\tunsigned int id;\n\tunsigned int bitwidth;\n\tenum devlink_dpipe_field_mapping_type mapping_type;\n};\n\nstruct devlink_dpipe_header {\n\tconst char *name;\n\tunsigned int id;\n\tstruct devlink_dpipe_field *fields;\n\tunsigned int fields_count;\n\tbool global;\n};\n\nstruct devlink_dpipe_headers {\n\tstruct devlink_dpipe_header **headers;\n\tunsigned int headers_count;\n};\n\nstruct devlink_dpipe_match {\n\tenum devlink_dpipe_match_type type;\n\tunsigned int header_index;\n\tstruct devlink_dpipe_header *header;\n\tunsigned int field_id;\n};\n\nstruct devlink_dpipe_table_ops;\n\nstruct devlink_dpipe_table {\n\tvoid *priv;\n\tstruct list_head list;\n\tconst char *name;\n\tbool counters_enabled;\n\tbool counter_control_extern;\n\tbool resource_valid;\n\tu64 resource_id;\n\tu64 resource_units;\n\tconst struct devlink_dpipe_table_ops *table_ops;\n\tstruct callback_head rcu;\n};\n\nstruct devlink_dpipe_table_ops {\n\tint (*actions_dump)(void *, struct sk_buff *);\n\tint (*matches_dump)(void *, struct sk_buff *);\n\tint (*entries_dump)(void *, bool, struct devlink_dpipe_dump_ctx *);\n\tint (*counters_set_update)(void *, bool);\n\tu64 (*size_get)(void *);\n};\n\nstruct devlink_dpipe_value {\n\tunion {\n\t\tstruct devlink_dpipe_action *action;\n\t\tstruct devlink_dpipe_match *match;\n\t};\n\tunsigned int mapping_value;\n\tbool mapping_valid;\n\tunsigned int value_size;\n\tvoid *value;\n\tvoid *mask;\n};\n\nstruct devlink_flash_component_lookup_ctx {\n\tconst char *lookup_name;\n\tbool lookup_name_found;\n};\n\nstruct devlink_flash_notify {\n\tconst char *status_msg;\n\tconst char *component;\n\tlong unsigned int done;\n\tlong unsigned int total;\n\tlong unsigned int timeout;\n};\n\nstruct firmware;\n\nstruct devlink_flash_update_params {\n\tconst struct firmware *fw;\n\tconst char *component;\n\tu32 overwrite_mask;\n};\n\nstruct devlink_fmsg {\n\tstruct list_head item_list;\n\tint err;\n\tbool putting_binary;\n};\n\nstruct devlink_fmsg_item {\n\tstruct list_head list;\n\tint attrtype;\n\tu8 nla_type;\n\tu16 len;\n\tint value[0];\n};\n\nstruct devlink_health_reporter_ops;\n\nstruct devlink_port;\n\nstruct devlink_health_reporter {\n\tstruct list_head list;\n\tvoid *priv;\n\tconst struct devlink_health_reporter_ops *ops;\n\tstruct devlink *devlink;\n\tstruct devlink_port *devlink_port;\n\tstruct devlink_fmsg *dump_fmsg;\n\tu64 graceful_period;\n\tbool auto_recover;\n\tbool auto_dump;\n\tu8 health_state;\n\tu64 dump_ts;\n\tu64 dump_real_ts;\n\tu64 error_count;\n\tu64 recovery_count;\n\tu64 last_recovery_ts;\n};\n\nstruct devlink_health_reporter_ops {\n\tchar *name;\n\tint (*recover)(struct devlink_health_reporter *, void *, struct netlink_ext_ack *);\n\tint (*dump)(struct devlink_health_reporter *, struct devlink_fmsg *, void *, struct netlink_ext_ack *);\n\tint (*diagnose)(struct devlink_health_reporter *, struct devlink_fmsg *, struct netlink_ext_ack *);\n\tint (*test)(struct devlink_health_reporter *, struct netlink_ext_ack *);\n};\n\nstruct devlink_info_req {\n\tstruct sk_buff *msg;\n\tvoid (*version_cb)(const char *, enum devlink_info_version_type, void *);\n\tvoid *version_cb_priv;\n};\n\nstruct devlink_linecard_ops;\n\nstruct devlink_linecard_type;\n\nstruct devlink_linecard {\n\tstruct list_head list;\n\tstruct devlink *devlink;\n\tunsigned int index;\n\tconst struct devlink_linecard_ops *ops;\n\tvoid *priv;\n\tenum devlink_linecard_state state;\n\tstruct mutex state_lock;\n\tconst char *type;\n\tstruct devlink_linecard_type *types;\n\tunsigned int types_count;\n\tu32 rel_index;\n};\n\nstruct devlink_linecard_ops {\n\tint (*provision)(struct devlink_linecard *, void *, const char *, const void *, struct netlink_ext_ack *);\n\tint (*unprovision)(struct devlink_linecard *, void *, struct netlink_ext_ack *);\n\tbool (*same_provision)(struct devlink_linecard *, void *, const char *, const void *);\n\tunsigned int (*types_count)(struct devlink_linecard *, void *);\n\tvoid (*types_get)(struct devlink_linecard *, void *, unsigned int, const char **, const void **);\n};\n\nstruct devlink_linecard_type {\n\tconst char *type;\n\tconst void *priv;\n};\n\nstruct devlink_nl_dump_state {\n\tlong unsigned int instance;\n\tint idx;\n\tunion {\n\t\tstruct {\n\t\t\tu64 start_offset;\n\t\t};\n\t\tstruct {\n\t\t\tu64 dump_ts;\n\t\t};\n\t};\n};\n\nstruct devlink_obj_desc;\n\nstruct devlink_nl_sock_priv {\n\tstruct devlink_obj_desc *flt;\n\tspinlock_t flt_lock;\n};\n\nstruct devlink_obj_desc {\n\tstruct callback_head rcu;\n\tconst char *bus_name;\n\tconst char *dev_name;\n\tunsigned int port_index;\n\tbool port_index_valid;\n\tlong int data[0];\n};\n\nstruct devlink_sb_pool_info;\n\nstruct devlink_trap;\n\nstruct devlink_trap_group;\n\nstruct devlink_trap_policer;\n\nstruct devlink_port_new_attrs;\n\nstruct devlink_rate;\n\nstruct devlink_ops {\n\tu32 supported_flash_update_params;\n\tlong unsigned int reload_actions;\n\tlong unsigned int reload_limits;\n\tint (*reload_down)(struct devlink *, bool, enum devlink_reload_action, enum devlink_reload_limit, struct netlink_ext_ack *);\n\tint (*reload_up)(struct devlink *, enum devlink_reload_action, enum devlink_reload_limit, u32 *, struct netlink_ext_ack *);\n\tint (*sb_pool_get)(struct devlink *, unsigned int, u16, struct devlink_sb_pool_info *);\n\tint (*sb_pool_set)(struct devlink *, unsigned int, u16, u32, enum devlink_sb_threshold_type, struct netlink_ext_ack *);\n\tint (*sb_port_pool_get)(struct devlink_port *, unsigned int, u16, u32 *);\n\tint (*sb_port_pool_set)(struct devlink_port *, unsigned int, u16, u32, struct netlink_ext_ack *);\n\tint (*sb_tc_pool_bind_get)(struct devlink_port *, unsigned int, u16, enum devlink_sb_pool_type, u16 *, u32 *);\n\tint (*sb_tc_pool_bind_set)(struct devlink_port *, unsigned int, u16, enum devlink_sb_pool_type, u16, u32, struct netlink_ext_ack *);\n\tint (*sb_occ_snapshot)(struct devlink *, unsigned int);\n\tint (*sb_occ_max_clear)(struct devlink *, unsigned int);\n\tint (*sb_occ_port_pool_get)(struct devlink_port *, unsigned int, u16, u32 *, u32 *);\n\tint (*sb_occ_tc_port_bind_get)(struct devlink_port *, unsigned int, u16, enum devlink_sb_pool_type, u32 *, u32 *);\n\tint (*eswitch_mode_get)(struct devlink *, u16 *);\n\tint (*eswitch_mode_set)(struct devlink *, u16, struct netlink_ext_ack *);\n\tint (*eswitch_inline_mode_get)(struct devlink *, u8 *);\n\tint (*eswitch_inline_mode_set)(struct devlink *, u8, struct netlink_ext_ack *);\n\tint (*eswitch_encap_mode_get)(struct devlink *, enum devlink_eswitch_encap_mode *);\n\tint (*eswitch_encap_mode_set)(struct devlink *, enum devlink_eswitch_encap_mode, struct netlink_ext_ack *);\n\tint (*info_get)(struct devlink *, struct devlink_info_req *, struct netlink_ext_ack *);\n\tint (*flash_update)(struct devlink *, struct devlink_flash_update_params *, struct netlink_ext_ack *);\n\tint (*trap_init)(struct devlink *, const struct devlink_trap *, void *);\n\tvoid (*trap_fini)(struct devlink *, const struct devlink_trap *, void *);\n\tint (*trap_action_set)(struct devlink *, const struct devlink_trap *, enum devlink_trap_action, struct netlink_ext_ack *);\n\tint (*trap_group_init)(struct devlink *, const struct devlink_trap_group *);\n\tint (*trap_group_set)(struct devlink *, const struct devlink_trap_group *, const struct devlink_trap_policer *, struct netlink_ext_ack *);\n\tint (*trap_group_action_set)(struct devlink *, const struct devlink_trap_group *, enum devlink_trap_action, struct netlink_ext_ack *);\n\tint (*trap_drop_counter_get)(struct devlink *, const struct devlink_trap *, u64 *);\n\tint (*trap_policer_init)(struct devlink *, const struct devlink_trap_policer *);\n\tvoid (*trap_policer_fini)(struct devlink *, const struct devlink_trap_policer *);\n\tint (*trap_policer_set)(struct devlink *, const struct devlink_trap_policer *, u64, u64, struct netlink_ext_ack *);\n\tint (*trap_policer_counter_get)(struct devlink *, const struct devlink_trap_policer *, u64 *);\n\tint (*port_new)(struct devlink *, const struct devlink_port_new_attrs *, struct netlink_ext_ack *, struct devlink_port **);\n\tint (*rate_leaf_tx_share_set)(struct devlink_rate *, void *, u64, struct netlink_ext_ack *);\n\tint (*rate_leaf_tx_max_set)(struct devlink_rate *, void *, u64, struct netlink_ext_ack *);\n\tint (*rate_leaf_tx_priority_set)(struct devlink_rate *, void *, u32, struct netlink_ext_ack *);\n\tint (*rate_leaf_tx_weight_set)(struct devlink_rate *, void *, u32, struct netlink_ext_ack *);\n\tint (*rate_node_tx_share_set)(struct devlink_rate *, void *, u64, struct netlink_ext_ack *);\n\tint (*rate_node_tx_max_set)(struct devlink_rate *, void *, u64, struct netlink_ext_ack *);\n\tint (*rate_node_tx_priority_set)(struct devlink_rate *, void *, u32, struct netlink_ext_ack *);\n\tint (*rate_node_tx_weight_set)(struct devlink_rate *, void *, u32, struct netlink_ext_ack *);\n\tint (*rate_node_new)(struct devlink_rate *, void **, struct netlink_ext_ack *);\n\tint (*rate_node_del)(struct devlink_rate *, void *, struct netlink_ext_ack *);\n\tint (*rate_leaf_parent_set)(struct devlink_rate *, struct devlink_rate *, void *, void *, struct netlink_ext_ack *);\n\tint (*rate_node_parent_set)(struct devlink_rate *, struct devlink_rate *, void *, void *, struct netlink_ext_ack *);\n\tbool (*selftest_check)(struct devlink *, unsigned int, struct netlink_ext_ack *);\n\tenum devlink_selftest_status (*selftest_run)(struct devlink *, unsigned int, struct netlink_ext_ack *);\n};\n\nstruct devlink_param_gset_ctx;\n\nunion devlink_param_value;\n\nstruct devlink_param {\n\tu32 id;\n\tconst char *name;\n\tbool generic;\n\tenum devlink_param_type type;\n\tlong unsigned int supported_cmodes;\n\tint (*get)(struct devlink *, u32, struct devlink_param_gset_ctx *);\n\tint (*set)(struct devlink *, u32, struct devlink_param_gset_ctx *, struct netlink_ext_ack *);\n\tint (*validate)(struct devlink *, u32, union devlink_param_value, struct netlink_ext_ack *);\n};\n\nunion devlink_param_value {\n\tu8 vu8;\n\tu16 vu16;\n\tu32 vu32;\n\tchar vstr[32];\n\tbool vbool;\n};\n\nstruct devlink_param_gset_ctx {\n\tunion devlink_param_value val;\n\tenum devlink_param_cmode cmode;\n};\n\nstruct devlink_param_item {\n\tstruct list_head list;\n\tconst struct devlink_param *param;\n\tunion devlink_param_value driverinit_value;\n\tbool driverinit_value_valid;\n\tunion devlink_param_value driverinit_value_new;\n\tbool driverinit_value_new_valid;\n};\n\nstruct netdev_phys_item_id {\n\tunsigned char id[32];\n\tunsigned char id_len;\n};\n\nstruct devlink_port_phys_attrs {\n\tu32 port_number;\n\tu32 split_subport_number;\n};\n\nstruct devlink_port_pci_pf_attrs {\n\tu32 controller;\n\tu16 pf;\n\tu8 external: 1;\n};\n\nstruct devlink_port_pci_vf_attrs {\n\tu32 controller;\n\tu16 pf;\n\tu16 vf;\n\tu8 external: 1;\n};\n\nstruct devlink_port_pci_sf_attrs {\n\tu32 controller;\n\tu32 sf;\n\tu16 pf;\n\tu8 external: 1;\n};\n\nstruct devlink_port_attrs {\n\tu8 split: 1;\n\tu8 splittable: 1;\n\tu32 lanes;\n\tenum devlink_port_flavour flavour;\n\tstruct netdev_phys_item_id switch_id;\n\tunion {\n\t\tstruct devlink_port_phys_attrs phys;\n\t\tstruct devlink_port_pci_pf_attrs pci_pf;\n\t\tstruct devlink_port_pci_vf_attrs pci_vf;\n\t\tstruct devlink_port_pci_sf_attrs pci_sf;\n\t};\n};\n\nstruct devlink_port_ops;\n\nstruct ib_device;\n\nstruct devlink_port {\n\tstruct list_head list;\n\tstruct list_head region_list;\n\tstruct devlink *devlink;\n\tconst struct devlink_port_ops *ops;\n\tunsigned int index;\n\tspinlock_t type_lock;\n\tenum devlink_port_type type;\n\tenum devlink_port_type desired_type;\n\tunion {\n\t\tstruct {\n\t\t\tstruct net_device *netdev;\n\t\t\tint ifindex;\n\t\t\tchar ifname[16];\n\t\t} type_eth;\n\t\tstruct {\n\t\t\tstruct ib_device *ibdev;\n\t\t} type_ib;\n\t};\n\tstruct devlink_port_attrs attrs;\n\tu8 attrs_set: 1;\n\tu8 switch_port: 1;\n\tu8 registered: 1;\n\tu8 initialized: 1;\n\tstruct delayed_work type_warn_dw;\n\tstruct list_head reporter_list;\n\tstruct devlink_rate *devlink_rate;\n\tstruct devlink_linecard *linecard;\n\tu32 rel_index;\n};\n\nstruct devlink_port_new_attrs {\n\tenum devlink_port_flavour flavour;\n\tunsigned int port_index;\n\tu32 controller;\n\tu32 sfnum;\n\tu16 pfnum;\n\tu8 port_index_valid: 1;\n\tu8 controller_valid: 1;\n\tu8 sfnum_valid: 1;\n};\n\nstruct devlink_port_ops {\n\tint (*port_split)(struct devlink *, struct devlink_port *, unsigned int, struct netlink_ext_ack *);\n\tint (*port_unsplit)(struct devlink *, struct devlink_port *, struct netlink_ext_ack *);\n\tint (*port_type_set)(struct devlink_port *, enum devlink_port_type);\n\tint (*port_del)(struct devlink *, struct devlink_port *, struct netlink_ext_ack *);\n\tint (*port_fn_hw_addr_get)(struct devlink_port *, u8 *, int *, struct netlink_ext_ack *);\n\tint (*port_fn_hw_addr_set)(struct devlink_port *, const u8 *, int, struct netlink_ext_ack *);\n\tint (*port_fn_roce_get)(struct devlink_port *, bool *, struct netlink_ext_ack *);\n\tint (*port_fn_roce_set)(struct devlink_port *, bool, struct netlink_ext_ack *);\n\tint (*port_fn_migratable_get)(struct devlink_port *, bool *, struct netlink_ext_ack *);\n\tint (*port_fn_migratable_set)(struct devlink_port *, bool, struct netlink_ext_ack *);\n\tint (*port_fn_state_get)(struct devlink_port *, enum devlink_port_fn_state *, enum devlink_port_fn_opstate *, struct netlink_ext_ack *);\n\tint (*port_fn_state_set)(struct devlink_port *, enum devlink_port_fn_state, struct netlink_ext_ack *);\n\tint (*port_fn_ipsec_crypto_get)(struct devlink_port *, bool *, struct netlink_ext_ack *);\n\tint (*port_fn_ipsec_crypto_set)(struct devlink_port *, bool, struct netlink_ext_ack *);\n\tint (*port_fn_ipsec_packet_get)(struct devlink_port *, bool *, struct netlink_ext_ack *);\n\tint (*port_fn_ipsec_packet_set)(struct devlink_port *, bool, struct netlink_ext_ack *);\n\tint (*port_fn_max_io_eqs_get)(struct devlink_port *, u32 *, struct netlink_ext_ack *);\n\tint (*port_fn_max_io_eqs_set)(struct devlink_port *, u32, struct netlink_ext_ack *);\n};\n\nstruct devlink_port_region_ops {\n\tconst char *name;\n\tvoid (*destructor)(const void *);\n\tint (*snapshot)(struct devlink_port *, const struct devlink_port_region_ops *, struct netlink_ext_ack *, u8 **);\n\tint (*read)(struct devlink_port *, const struct devlink_port_region_ops *, struct netlink_ext_ack *, u64, u32, u8 *);\n\tvoid *priv;\n};\n\nstruct devlink_rate {\n\tstruct list_head list;\n\tenum devlink_rate_type type;\n\tstruct devlink *devlink;\n\tvoid *priv;\n\tu64 tx_share;\n\tu64 tx_max;\n\tstruct devlink_rate *parent;\n\tunion {\n\t\tstruct devlink_port *devlink_port;\n\t\tstruct {\n\t\t\tchar *name;\n\t\t\trefcount_t refcnt;\n\t\t};\n\t};\n\tu32 tx_priority;\n\tu32 tx_weight;\n};\n\nstruct devlink_region_ops;\n\nstruct devlink_region {\n\tstruct devlink *devlink;\n\tstruct devlink_port *port;\n\tstruct list_head list;\n\tunion {\n\t\tconst struct devlink_region_ops *ops;\n\t\tconst struct devlink_port_region_ops *port_ops;\n\t};\n\tstruct mutex snapshot_lock;\n\tstruct list_head snapshot_list;\n\tu32 max_snapshots;\n\tu32 cur_snapshots;\n\tu64 size;\n};\n\nstruct devlink_region_ops {\n\tconst char *name;\n\tvoid (*destructor)(const void *);\n\tint (*snapshot)(struct devlink *, const struct devlink_region_ops *, struct netlink_ext_ack *, u8 **);\n\tint (*read)(struct devlink *, const struct devlink_region_ops *, struct netlink_ext_ack *, u64, u32, u8 *);\n\tvoid *priv;\n};\n\ntypedef void devlink_rel_notify_cb_t(struct devlink *, u32);\n\ntypedef void devlink_rel_cleanup_cb_t(struct devlink *, u32, u32);\n\nstruct devlink_rel {\n\tu32 index;\n\trefcount_t refcount;\n\tu32 devlink_index;\n\tstruct {\n\t\tu32 devlink_index;\n\t\tu32 obj_index;\n\t\tdevlink_rel_notify_cb_t *notify_cb;\n\t\tdevlink_rel_cleanup_cb_t *cleanup_cb;\n\t\tstruct delayed_work notify_work;\n\t} nested_in;\n};\n\nstruct devlink_reload_combination {\n\tenum devlink_reload_action action;\n\tenum devlink_reload_limit limit;\n};\n\nstruct devlink_resource_size_params {\n\tu64 size_min;\n\tu64 size_max;\n\tu64 size_granularity;\n\tenum devlink_resource_unit unit;\n};\n\ntypedef u64 devlink_resource_occ_get_t(void *);\n\nstruct devlink_resource {\n\tconst char *name;\n\tu64 id;\n\tu64 size;\n\tu64 size_new;\n\tbool size_valid;\n\tstruct devlink_resource *parent;\n\tstruct devlink_resource_size_params size_params;\n\tstruct list_head list;\n\tstruct list_head resource_list;\n\tdevlink_resource_occ_get_t *occ_get;\n\tvoid *occ_get_priv;\n};\n\nstruct devlink_sb {\n\tstruct list_head list;\n\tunsigned int index;\n\tu32 size;\n\tu16 ingress_pools_count;\n\tu16 egress_pools_count;\n\tu16 ingress_tc_count;\n\tu16 egress_tc_count;\n};\n\nstruct devlink_sb_pool_info {\n\tenum devlink_sb_pool_type pool_type;\n\tu32 size;\n\tenum devlink_sb_threshold_type threshold_type;\n\tu32 cell_size;\n};\n\nstruct devlink_snapshot {\n\tstruct list_head list;\n\tstruct devlink_region *region;\n\tu8 *data;\n\tu32 id;\n};\n\nstruct devlink_stats {\n\tu64_stats_t rx_bytes;\n\tu64_stats_t rx_packets;\n\tstruct u64_stats_sync syncp;\n};\n\nstruct devlink_trap {\n\tenum devlink_trap_type type;\n\tenum devlink_trap_action init_action;\n\tbool generic;\n\tu16 id;\n\tconst char *name;\n\tu16 init_group_id;\n\tu32 metadata_cap;\n};\n\nstruct devlink_trap_group {\n\tconst char *name;\n\tu16 id;\n\tbool generic;\n\tu32 init_policer_id;\n};\n\nstruct devlink_trap_policer_item;\n\nstruct devlink_trap_group_item {\n\tconst struct devlink_trap_group *group;\n\tstruct devlink_trap_policer_item *policer_item;\n\tstruct list_head list;\n\tstruct devlink_stats *stats;\n};\n\nstruct devlink_trap_item {\n\tconst struct devlink_trap *trap;\n\tstruct devlink_trap_group_item *group_item;\n\tstruct list_head list;\n\tenum devlink_trap_action action;\n\tstruct devlink_stats *stats;\n\tvoid *priv;\n};\n\nstruct flow_action_cookie;\n\nstruct devlink_trap_metadata {\n\tconst char *trap_name;\n\tconst char *trap_group_name;\n\tstruct net_device *input_dev;\n\tnetdevice_tracker dev_tracker;\n\tconst struct flow_action_cookie *fa_cookie;\n\tenum devlink_trap_type trap_type;\n};\n\nstruct devlink_trap_policer {\n\tu32 id;\n\tu64 init_rate;\n\tu64 init_burst;\n\tu64 max_rate;\n\tu64 min_rate;\n\tu64 max_burst;\n\tu64 min_burst;\n};\n\nstruct devlink_trap_policer_item {\n\tconst struct devlink_trap_policer *policer;\n\tu64 rate;\n\tu64 burst;\n\tstruct list_head list;\n};\n\nstruct devm_clk_state {\n\tstruct clk *clk;\n\tvoid (*exit)(struct clk *);\n};\n\ntypedef void (*dr_release_t)(struct device *, void *);\n\nstruct devres_node {\n\tstruct list_head entry;\n\tdr_release_t release;\n\tconst char *name;\n\tsize_t size;\n};\n\nstruct devres {\n\tstruct devres_node node;\n\tu8 data[0];\n};\n\nstruct devres_group {\n\tstruct devres_node node[2];\n\tvoid *id;\n\tint color;\n};\n\nstruct dh {\n\tconst void *key;\n\tconst void *p;\n\tconst void *g;\n\tunsigned int key_size;\n\tunsigned int p_size;\n\tunsigned int g_size;\n};\n\nstruct dh_ctx {\n\tMPI p;\n\tMPI g;\n\tMPI xa;\n};\n\nstruct dh_safe_prime {\n\tunsigned int max_strength;\n\tunsigned int p_size;\n\tconst char *p;\n};\n\nstruct dh_safe_prime_instance_ctx {\n\tstruct crypto_kpp_spawn dh_spawn;\n\tconst struct dh_safe_prime *safe_prime;\n};\n\nstruct dh_safe_prime_tfm_ctx {\n\tstruct crypto_kpp *dh_tfm;\n};\n\nstruct dictionary {\n\tuint8_t *buf;\n\tsize_t start;\n\tsize_t pos;\n\tsize_t full;\n\tsize_t limit;\n\tsize_t end;\n\tuint32_t size;\n\tuint32_t size_max;\n\tuint32_t allocated;\n\tenum xz_mode mode;\n};\n\nstruct die_args {\n\tstruct pt_regs *regs;\n\tconst char *str;\n\tlong int err;\n\tint trapnr;\n\tint signr;\n};\n\nstruct dim_stats {\n\tint ppms;\n\tint bpms;\n\tint epms;\n\tint cpms;\n\tint cpe_ratio;\n};\n\nstruct dim_sample {\n\tktime_t time;\n\tu32 pkt_ctr;\n\tu32 byte_ctr;\n\tu16 event_ctr;\n\tu32 comp_ctr;\n};\n\nstruct dim {\n\tu8 state;\n\tstruct dim_stats prev_stats;\n\tstruct dim_sample start_sample;\n\tstruct dim_sample measuring_sample;\n\tstruct work_struct work;\n\tvoid *priv;\n\tu8 profile_ix;\n\tu8 mode;\n\tu8 tune_state;\n\tu8 steps_right;\n\tu8 steps_left;\n\tu8 tired;\n};\n\nstruct dim_cq_moder {\n\tu16 usec;\n\tu16 pkts;\n\tu16 comps;\n\tu8 cq_period_mode;\n\tstruct callback_head rcu;\n};\n\nstruct dim_irq_moder {\n\tu8 profile_flags;\n\tu8 coal_flags;\n\tu8 dim_rx_mode;\n\tu8 dim_tx_mode;\n\tstruct dim_cq_moder *rx_profile;\n\tstruct dim_cq_moder *tx_profile;\n\tvoid (*rx_dim_work)(struct work_struct *);\n\tvoid (*tx_dim_work)(struct work_struct *);\n};\n\nstruct dimm_info {\n\tstruct device dev;\n\tchar label[32];\n\tunsigned int location[3];\n\tstruct mem_ctl_info *mci;\n\tunsigned int idx;\n\tu32 grain;\n\tenum dev_type dtype;\n\tenum mem_type mtype;\n\tenum edac_type edac_mode;\n\tu32 nr_pages;\n\tunsigned int csrow;\n\tunsigned int cschannel;\n\tu16 smbios_handle;\n\tu32 ce_count;\n\tu32 ue_count;\n};\n\ntypedef int dio_iodone_t(struct kiocb *, loff_t, ssize_t, void *);\n\nstruct dio {\n\tint flags;\n\tblk_opf_t opf;\n\tstruct gendisk *bio_disk;\n\tstruct inode *inode;\n\tloff_t i_size;\n\tdio_iodone_t *end_io;\n\tbool is_pinned;\n\tvoid *private;\n\tspinlock_t bio_lock;\n\tint page_errors;\n\tint is_async;\n\tbool defer_completion;\n\tbool should_dirty;\n\tint io_error;\n\tlong unsigned int refcount;\n\tstruct bio *bio_list;\n\tstruct task_struct *waiter;\n\tstruct kiocb *iocb;\n\tssize_t result;\n\tunion {\n\t\tstruct page *pages[64];\n\t\tstruct work_struct complete_work;\n\t};\n\tlong: 64;\n};\n\ntypedef int get_block_t(struct inode *, sector_t, struct buffer_head *, int);\n\nstruct dio_submit {\n\tstruct bio *bio;\n\tunsigned int blkbits;\n\tunsigned int blkfactor;\n\tunsigned int start_zero_done;\n\tint pages_in_io;\n\tsector_t block_in_file;\n\tunsigned int blocks_available;\n\tint reap_counter;\n\tsector_t final_block_in_request;\n\tint boundary;\n\tget_block_t *get_block;\n\tloff_t logical_offset_in_bio;\n\tsector_t final_block_in_bio;\n\tsector_t next_block_for_io;\n\tstruct page *cur_page;\n\tunsigned int cur_page_offset;\n\tunsigned int cur_page_len;\n\tsector_t cur_page_block;\n\tloff_t cur_page_fs_offset;\n\tstruct iov_iter *iter;\n\tunsigned int head;\n\tunsigned int tail;\n\tsize_t from;\n\tsize_t to;\n};\n\nstruct dir_entry {\n\tstruct list_head list;\n\ttime64_t mtime;\n\tchar name[0];\n};\n\nstruct fname;\n\nstruct dir_private_info {\n\tstruct rb_root root;\n\tstruct rb_node *curr_node;\n\tstruct fname *extra_fname;\n\tloff_t last_pos;\n\t__u32 curr_hash;\n\t__u32 curr_minor_hash;\n\t__u32 next_hash;\n};\n\nstruct wb_domain;\n\nstruct dirty_throttle_control {\n\tstruct wb_domain *dom;\n\tstruct dirty_throttle_control *gdtc;\n\tstruct bdi_writeback *wb;\n\tstruct fprop_local_percpu *wb_completions;\n\tlong unsigned int avail;\n\tlong unsigned int dirty;\n\tlong unsigned int thresh;\n\tlong unsigned int bg_thresh;\n\tlong unsigned int wb_dirty;\n\tlong unsigned int wb_thresh;\n\tlong unsigned int wb_bg_thresh;\n\tlong unsigned int pos_ratio;\n\tbool freerun;\n\tbool dirty_exceeded;\n};\n\nstruct disk_comp_opts {\n\t__le32 dictionary_size;\n\t__le32 flags;\n};\n\nstruct disk_events {\n\tstruct list_head node;\n\tstruct gendisk *disk;\n\tspinlock_t lock;\n\tstruct mutex block_mutex;\n\tint block;\n\tunsigned int pending;\n\tunsigned int clearing;\n\tlong int poll_msecs;\n\tstruct delayed_work dwork;\n};\n\nstruct disk_report_zones_cb_args {\n\tstruct gendisk *disk;\n\treport_zones_cb user_cb;\n\tvoid *user_data;\n};\n\nstruct disk_stats {\n\tu64 nsecs[4];\n\tlong unsigned int sectors[4];\n\tlong unsigned int ios[4];\n\tlong unsigned int merges[4];\n\tlong unsigned int io_ticks;\n\tlocal_t in_flight[2];\n};\n\nstruct disklabel {\n\tu8 d_reserved[270];\n\tstruct d_partition d_partitions[2];\n\tu8 d_blank[208];\n\t__le16 d_magic;\n} __attribute__((packed));\n\nstruct disklabel___2 {\n\t__le32 d_magic;\n\t__le16 d_type;\n\t__le16 d_subtype;\n\tu8 d_typename[16];\n\tu8 d_packname[16];\n\t__le32 d_secsize;\n\t__le32 d_nsectors;\n\t__le32 d_ntracks;\n\t__le32 d_ncylinders;\n\t__le32 d_secpercyl;\n\t__le32 d_secprtunit;\n\t__le16 d_sparespertrack;\n\t__le16 d_sparespercyl;\n\t__le32 d_acylinders;\n\t__le16 d_rpm;\n\t__le16 d_interleave;\n\t__le16 d_trackskew;\n\t__le16 d_cylskew;\n\t__le32 d_headswitch;\n\t__le32 d_trkseek;\n\t__le32 d_flags;\n\t__le32 d_drivedata[5];\n\t__le32 d_spare[5];\n\t__le32 d_magic2;\n\t__le16 d_checksum;\n\t__le16 d_npartitions;\n\t__le32 d_bbsize;\n\t__le32 d_sbsize;\n\tstruct d_partition___2 d_partitions[18];\n};\n\nstruct dispatch_rq_data {\n\tstruct blk_mq_hw_ctx *hctx;\n\tstruct request *rq;\n};\n\nstruct timing_entry {\n\tu32 min;\n\tu32 typ;\n\tu32 max;\n};\n\nstruct display_timing {\n\tstruct timing_entry pixelclock;\n\tstruct timing_entry hactive;\n\tstruct timing_entry hfront_porch;\n\tstruct timing_entry hback_porch;\n\tstruct timing_entry hsync_len;\n\tstruct timing_entry vactive;\n\tstruct timing_entry vfront_porch;\n\tstruct timing_entry vback_porch;\n\tstruct timing_entry vsync_len;\n\tenum display_flags flags;\n};\n\nstruct display_timings {\n\tunsigned int num_timings;\n\tunsigned int native_mode;\n\tstruct display_timing **timings;\n};\n\nstruct displayid_block {\n\tu8 tag;\n\tu8 rev;\n\tu8 num_bytes;\n};\n\nstruct displayid_detailed_timings_1 {\n\tu8 pixel_clock[3];\n\tu8 flags;\n\tu8 hactive[2];\n\tu8 hblank[2];\n\tu8 hsync[2];\n\tu8 hsw[2];\n\tu8 vactive[2];\n\tu8 vblank[2];\n\tu8 vsync[2];\n\tu8 vsw[2];\n};\n\nstruct displayid_detailed_timing_block {\n\tstruct displayid_block base;\n\tstruct displayid_detailed_timings_1 timings[0];\n};\n\nstruct displayid_header {\n\tu8 rev;\n\tu8 bytes;\n\tu8 prod_id;\n\tu8 ext_count;\n};\n\nstruct displayid_tiled_block {\n\tstruct displayid_block base;\n\tu8 tile_cap;\n\tu8 topo[3];\n\tu8 tile_size[4];\n\tu8 tile_pixel_bezel[5];\n\tu8 topology_id[8];\n};\n\nstruct displayid_vesa_vendor_specific_block {\n\tstruct displayid_block base;\n\tu8 oui[3];\n\tu8 data_structure_type;\n\tu8 mso;\n};\n\nstruct volumeid {\n\tu8 vid_unused[248];\n\tu8 vid_mac[8];\n};\n\nstruct dkconfig {\n\tu8 ios_unused0[128];\n\t__be32 ios_slcblk;\n\t__be16 ios_slccnt;\n\tu8 ios_unused1[122];\n};\n\nstruct dkblk0 {\n\tstruct volumeid dk_vid;\n\tstruct dkconfig dk_ios;\n};\n\nstruct dl_bw {\n\traw_spinlock_t lock;\n\tu64 bw;\n\tu64 total_bw;\n};\n\nstruct dl_rq {\n\tstruct rb_root_cached root;\n\tunsigned int dl_nr_running;\n\tstruct {\n\t\tu64 curr;\n\t\tu64 next;\n\t} earliest_dl;\n\tbool overloaded;\n\tstruct rb_root_cached pushable_dl_tasks_root;\n\tu64 running_bw;\n\tu64 this_bw;\n\tu64 extra_bw;\n\tu64 max_bw;\n\tu64 bw_ratio;\n};\n\nstruct dm_arg {\n\tunsigned int min;\n\tunsigned int max;\n\tchar *error;\n};\n\nstruct dm_arg_set {\n\tunsigned int argc;\n\tchar **argv;\n};\n\nstruct mapped_device;\n\nstruct dm_crypto_profile {\n\tstruct blk_crypto_profile profile;\n\tstruct mapped_device *md;\n};\n\nstruct dm_dev {\n\tstruct block_device *bdev;\n\tstruct file *bdev_file;\n\tstruct dax_device *dax_dev;\n\tblk_mode_t mode;\n\tchar name[16];\n};\n\nstruct dm_dev_internal {\n\tstruct list_head list;\n\trefcount_t count;\n\tstruct dm_dev *dm_dev;\n};\n\nstruct dm_ioctl {\n\t__u32 version[3];\n\t__u32 data_size;\n\t__u32 data_start;\n\t__u32 target_count;\n\t__s32 open_count;\n\t__u32 flags;\n\t__u32 event_nr;\n\t__u32 padding;\n\t__u64 dev;\n\tchar name[128];\n\tchar uuid[129];\n\tchar data[7];\n};\n\nstruct dm_target_spec;\n\nstruct dm_device {\n\tstruct dm_ioctl dmi;\n\tstruct dm_target_spec *table[256];\n\tchar *target_args_array[256];\n\tstruct list_head list;\n};\n\nstruct dm_device_zone_count {\n\tsector_t start;\n\tsector_t len;\n\tunsigned int total_nr_seq_zones;\n\tunsigned int target_nr_seq_zones;\n};\n\nstruct dm_file {\n\tvolatile unsigned int global_event_nr;\n};\n\nstruct dm_hw_stat_delta {\n\tlong unsigned int last_rx;\n\tlong unsigned int last_drop_val;\n\tstruct callback_head rcu;\n};\n\nstruct dm_ima_device_table_metadata {\n\tchar *device_metadata;\n\tunsigned int device_metadata_len;\n\tunsigned int num_targets;\n\tchar *hash;\n\tunsigned int hash_len;\n};\n\nstruct dm_ima_measurements {\n\tstruct dm_ima_device_table_metadata active_table;\n\tstruct dm_ima_device_table_metadata inactive_table;\n\tunsigned int dm_version_str_len;\n};\n\nstruct dm_stats_aux {\n\tbool merged;\n\tlong long unsigned int duration_ns;\n};\n\nstruct dm_target;\n\nstruct dm_target_io {\n\tshort unsigned int magic;\n\tblk_short_t flags;\n\tunsigned int target_bio_nr;\n\tstruct dm_io *io;\n\tstruct dm_target *ti;\n\tunsigned int *len_ptr;\n\tsector_t old_sector;\n\tstruct bio clone;\n};\n\nstruct dm_io {\n\tshort unsigned int magic;\n\tblk_short_t flags;\n\tspinlock_t lock;\n\tlong unsigned int start_time;\n\tvoid *data;\n\tstruct dm_io *next;\n\tstruct dm_stats_aux stats_aux;\n\tblk_status_t status;\n\tatomic_t io_count;\n\tstruct mapped_device *md;\n\tstruct bio *orig_bio;\n\tunsigned int sector_offset;\n\tunsigned int sectors;\n\tstruct dm_target_io tio;\n};\n\nstruct dm_io_client {\n\tmempool_t pool;\n\tstruct bio_set bios;\n};\n\nstruct page_list;\n\nstruct dm_io_memory {\n\tenum dm_io_mem_type type;\n\tunsigned int offset;\n\tunion {\n\t\tstruct page_list *pl;\n\t\tstruct bio *bio;\n\t\tvoid *vma;\n\t\tvoid *addr;\n\t} ptr;\n};\n\ntypedef void (*io_notify_fn)(long unsigned int, void *);\n\nstruct dm_io_notify {\n\tio_notify_fn fn;\n\tvoid *context;\n};\n\nstruct dm_io_region {\n\tstruct block_device *bdev;\n\tsector_t sector;\n\tsector_t count;\n};\n\nstruct dm_io_request {\n\tblk_opf_t bi_opf;\n\tstruct dm_io_memory mem;\n\tstruct dm_io_notify notify;\n\tstruct dm_io_client *client;\n};\n\nstruct dm_kcopyd_throttle;\n\nstruct dm_kcopyd_client {\n\tstruct page_list *pages;\n\tunsigned int nr_reserved_pages;\n\tunsigned int nr_free_pages;\n\tunsigned int sub_job_size;\n\tstruct dm_io_client *io_client;\n\twait_queue_head_t destroyq;\n\tmempool_t job_pool;\n\tstruct workqueue_struct *kcopyd_wq;\n\tstruct work_struct kcopyd_work;\n\tstruct dm_kcopyd_throttle *throttle;\n\tatomic_t nr_jobs;\n\tspinlock_t job_lock;\n\tstruct list_head callback_jobs;\n\tstruct list_head complete_jobs;\n\tstruct list_head io_jobs;\n\tstruct list_head pages_jobs;\n};\n\nstruct dm_kcopyd_throttle {\n\tunsigned int throttle;\n\tunsigned int num_io_jobs;\n\tunsigned int io_period;\n\tunsigned int total_period;\n\tunsigned int last_jiffies;\n};\n\nstruct dm_kobject_holder {\n\tstruct kobject kobj;\n\tstruct completion completion;\n};\n\nstruct dm_md_mempools {\n\tstruct bio_set bs;\n\tstruct bio_set io_bs;\n};\n\nstruct dm_name_list {\n\t__u64 dev;\n\t__u32 next;\n\tchar name[0];\n};\n\nstruct pr_keys;\n\nstruct pr_held_reservation;\n\nstruct dm_pr {\n\tu64 old_key;\n\tu64 new_key;\n\tu32 flags;\n\tbool abort;\n\tbool fail_early;\n\tint ret;\n\tenum pr_type type;\n\tstruct pr_keys *read_keys;\n\tstruct pr_held_reservation *rsv;\n};\n\nstruct dm_report_zones_args {\n\tstruct dm_target *tgt;\n\tsector_t next_sector;\n\tvoid *orig_data;\n\treport_zones_cb orig_cb;\n\tunsigned int zone_idx;\n\tsector_t start;\n};\n\nstruct dm_rq_target_io;\n\nstruct dm_rq_clone_bio_info {\n\tstruct bio *orig;\n\tstruct dm_rq_target_io *tio;\n\tstruct bio clone;\n};\n\nstruct kthread_work;\n\ntypedef void (*kthread_work_func_t)(struct kthread_work *);\n\nstruct kthread_worker;\n\nstruct kthread_work {\n\tstruct list_head node;\n\tkthread_work_func_t func;\n\tstruct kthread_worker *worker;\n\tint canceling;\n};\n\nunion map_info {\n\tvoid *ptr;\n};\n\nstruct dm_rq_target_io {\n\tstruct mapped_device *md;\n\tstruct dm_target *ti;\n\tstruct request *orig;\n\tstruct request *clone;\n\tstruct kthread_work work;\n\tblk_status_t error;\n\tunion map_info info;\n\tstruct dm_stats_aux stats_aux;\n\tlong unsigned int duration_jiffies;\n\tunsigned int n_sectors;\n\tunsigned int completed;\n};\n\nstruct dm_stat_percpu {\n\tlong long unsigned int sectors[2];\n\tlong long unsigned int ios[2];\n\tlong long unsigned int merges[2];\n\tlong long unsigned int ticks[2];\n\tlong long unsigned int io_ticks[2];\n\tlong long unsigned int io_ticks_total;\n\tlong long unsigned int time_in_queue;\n\tlong long unsigned int *histogram;\n};\n\nstruct dm_stat_shared {\n\tatomic_t in_flight[2];\n\tlong long unsigned int stamp;\n\tstruct dm_stat_percpu tmp;\n};\n\nstruct dm_stat {\n\tstruct list_head list_entry;\n\tint id;\n\tunsigned int stat_flags;\n\tsize_t n_entries;\n\tsector_t start;\n\tsector_t end;\n\tsector_t step;\n\tunsigned int n_histogram_entries;\n\tlong long unsigned int *histogram_boundaries;\n\tconst char *program_id;\n\tconst char *aux_data;\n\tstruct callback_head callback_head;\n\tsize_t shared_alloc_size;\n\tsize_t percpu_alloc_size;\n\tsize_t histogram_alloc_size;\n\tstruct dm_stat_percpu *stat_percpu[8192];\n\tstruct dm_stat_shared stat_shared[0];\n};\n\nstruct dm_stats_last_position;\n\nstruct dm_stats {\n\tstruct mutex mutex;\n\tstruct list_head list;\n\tstruct dm_stats_last_position *last;\n\tbool precise_timestamps;\n};\n\nstruct dm_stats_last_position {\n\tsector_t last_sector;\n\tunsigned int last_rw;\n};\n\nstruct dm_sysfs_attr {\n\tstruct attribute attr;\n\tssize_t (*show)(struct mapped_device *, char *);\n\tssize_t (*store)(struct mapped_device *, const char *, size_t);\n};\n\nstruct target_type;\n\nstruct dm_table {\n\tstruct mapped_device *md;\n\tenum dm_queue_mode type;\n\tunsigned int depth;\n\tunsigned int counts[16];\n\tsector_t *index[16];\n\tunsigned int num_targets;\n\tunsigned int num_allocated;\n\tsector_t *highs;\n\tstruct dm_target *targets;\n\tstruct target_type *immutable_target_type;\n\tbool integrity_supported: 1;\n\tbool singleton: 1;\n\tbool flush_bypasses_map: 1;\n\tblk_mode_t mode;\n\tstruct list_head devices;\n\tstruct rw_semaphore devices_lock;\n\tvoid (*event_fn)(void *);\n\tvoid *event_context;\n\tstruct dm_md_mempools *mempools;\n\tstruct blk_crypto_profile *crypto_profile;\n};\n\nstruct dm_target {\n\tstruct dm_table *table;\n\tstruct target_type *type;\n\tsector_t begin;\n\tsector_t len;\n\tuint32_t max_io_len;\n\tunsigned int num_flush_bios;\n\tunsigned int num_discard_bios;\n\tunsigned int num_secure_erase_bios;\n\tunsigned int num_write_zeroes_bios;\n\tunsigned int per_io_data_size;\n\tvoid *private;\n\tchar *error;\n\tbool flush_supported: 1;\n\tbool discards_supported: 1;\n\tbool zone_reset_all_supported: 1;\n\tbool max_discard_granularity: 1;\n\tbool limit_swap_bios: 1;\n\tbool emulate_zone_append: 1;\n\tbool accounts_remapped_io: 1;\n\tbool needs_bio_set_dev: 1;\n\tbool flush_bypasses_map: 1;\n\tbool mempool_needs_integrity: 1;\n};\n\nstruct dm_target_deps {\n\t__u32 count;\n\t__u32 padding;\n\t__u64 dev[0];\n};\n\nstruct dm_target_msg {\n\t__u64 sector;\n\tchar message[0];\n};\n\nstruct dm_target_spec {\n\t__u64 sector_start;\n\t__u64 length;\n\t__s32 status;\n\t__u32 next;\n\tchar target_type[16];\n};\n\nstruct dm_target_versions {\n\t__u32 next;\n\t__u32 version[3];\n\tchar name[0];\n};\n\nstruct kobj_uevent_env {\n\tchar *argv[3];\n\tchar *envp[64];\n\tint envp_idx;\n\tchar buf[2048];\n\tint buflen;\n};\n\nstruct dm_uevent {\n\tstruct mapped_device *md;\n\tenum kobject_action action;\n\tstruct kobj_uevent_env ku_env;\n\tstruct list_head elist;\n\tchar name[128];\n\tchar uuid[129];\n};\n\nstruct queue_limits;\n\nstruct dm_zone_resource_limits {\n\tunsigned int mapped_nr_seq_zones;\n\tstruct queue_limits *lim;\n\tbool reliable_limits;\n};\n\ntypedef void (*dma_async_tx_callback)(void *);\n\nstruct dmaengine_result;\n\ntypedef void (*dma_async_tx_callback_result)(void *, const struct dmaengine_result *);\n\nstruct dmaengine_unmap_data;\n\nstruct dma_descriptor_metadata_ops;\n\nstruct dma_async_tx_descriptor {\n\tdma_cookie_t cookie;\n\tenum dma_ctrl_flags flags;\n\tdma_addr_t phys;\n\tstruct dma_chan *chan;\n\tdma_cookie_t (*tx_submit)(struct dma_async_tx_descriptor *);\n\tint (*desc_free)(struct dma_async_tx_descriptor *);\n\tdma_async_tx_callback callback;\n\tdma_async_tx_callback_result callback_result;\n\tvoid *callback_param;\n\tstruct dmaengine_unmap_data *unmap;\n\tenum dma_desc_metadata_mode desc_metadata_mode;\n\tstruct dma_descriptor_metadata_ops *metadata_ops;\n};\n\nstruct dma_block {\n\tstruct dma_block *next_block;\n\tdma_addr_t dma;\n};\n\nstruct iosys_map {\n\tunion {\n\t\tvoid *vaddr_iomem;\n\t\tvoid *vaddr;\n\t};\n\tbool is_iomem;\n};\n\nstruct dma_buf_poll_cb_t {\n\tstruct dma_fence_cb cb;\n\twait_queue_head_t *poll;\n\t__poll_t active;\n};\n\nstruct dma_buf_ops;\n\nstruct dma_resv;\n\nstruct dma_buf {\n\tsize_t size;\n\tstruct file *file;\n\tstruct list_head attachments;\n\tconst struct dma_buf_ops *ops;\n\tunsigned int vmapping_counter;\n\tstruct iosys_map vmap_ptr;\n\tconst char *exp_name;\n\tconst char *name;\n\tspinlock_t name_lock;\n\tstruct module *owner;\n\tstruct list_head list_node;\n\tvoid *priv;\n\tstruct dma_resv *resv;\n\twait_queue_head_t poll;\n\tstruct dma_buf_poll_cb_t cb_in;\n\tstruct dma_buf_poll_cb_t cb_out;\n};\n\nstruct dma_buf_attachment;\n\nstruct dma_buf_attach_ops {\n\tbool allow_peer2peer;\n\tvoid (*move_notify)(struct dma_buf_attachment *);\n};\n\nstruct sg_table;\n\nstruct dma_buf_attachment {\n\tstruct dma_buf *dmabuf;\n\tstruct device *dev;\n\tstruct list_head node;\n\tstruct sg_table *sgt;\n\tenum dma_data_direction dir;\n\tbool peer2peer;\n\tconst struct dma_buf_attach_ops *importer_ops;\n\tvoid *importer_priv;\n\tvoid *priv;\n};\n\nstruct dma_buf_export_info {\n\tconst char *exp_name;\n\tstruct module *owner;\n\tconst struct dma_buf_ops *ops;\n\tsize_t size;\n\tint flags;\n\tstruct dma_resv *resv;\n\tvoid *priv;\n};\n\nstruct dma_buf_export_sync_file {\n\t__u32 flags;\n\t__s32 fd;\n};\n\nstruct dma_buf_import_sync_file {\n\t__u32 flags;\n\t__s32 fd;\n};\n\nstruct dma_buf_ops {\n\tbool cache_sgt_mapping;\n\tint (*attach)(struct dma_buf *, struct dma_buf_attachment *);\n\tvoid (*detach)(struct dma_buf *, struct dma_buf_attachment *);\n\tint (*pin)(struct dma_buf_attachment *);\n\tvoid (*unpin)(struct dma_buf_attachment *);\n\tstruct sg_table * (*map_dma_buf)(struct dma_buf_attachment *, enum dma_data_direction);\n\tvoid (*unmap_dma_buf)(struct dma_buf_attachment *, struct sg_table *, enum dma_data_direction);\n\tvoid (*release)(struct dma_buf *);\n\tint (*begin_cpu_access)(struct dma_buf *, enum dma_data_direction);\n\tint (*end_cpu_access)(struct dma_buf *, enum dma_data_direction);\n\tint (*mmap)(struct dma_buf *, struct vm_area_struct *);\n\tint (*vmap)(struct dma_buf *, struct iosys_map *);\n\tvoid (*vunmap)(struct dma_buf *, struct iosys_map *);\n};\n\nstruct dma_buf_sync {\n\t__u64 flags;\n};\n\nstruct dma_device;\n\nstruct dma_chan_dev;\n\nstruct dma_chan_percpu;\n\nstruct dma_router;\n\nstruct dma_chan {\n\tstruct dma_device *device;\n\tstruct device *slave;\n\tdma_cookie_t cookie;\n\tdma_cookie_t completed_cookie;\n\tint chan_id;\n\tstruct dma_chan_dev *dev;\n\tconst char *name;\n\tchar *dbg_client_name;\n\tstruct list_head device_node;\n\tstruct dma_chan_percpu *local;\n\tint client_count;\n\tint table_count;\n\tstruct dma_router *router;\n\tvoid *route_data;\n\tvoid *private;\n};\n\nstruct dma_chan___2 {\n\tint lock;\n\tconst char *device_id;\n};\n\nstruct dma_chan_dev {\n\tstruct dma_chan *chan;\n\tstruct device device;\n\tint dev_id;\n\tbool chan_dma_dev;\n};\n\nstruct dma_chan_percpu {\n\tlong unsigned int memcpy_count;\n\tlong unsigned int bytes_transferred;\n};\n\nstruct dma_chan_tbl_ent {\n\tstruct dma_chan *chan;\n};\n\nstruct dma_descriptor_metadata_ops {\n\tint (*attach)(struct dma_async_tx_descriptor *, void *, size_t);\n\tvoid * (*get_ptr)(struct dma_async_tx_descriptor *, size_t *, size_t *);\n\tint (*set_len)(struct dma_async_tx_descriptor *, size_t);\n};\n\nstruct dma_slave_map;\n\nstruct dma_filter {\n\tdma_filter_fn fn;\n\tint mapcnt;\n\tconst struct dma_slave_map *map;\n};\n\nstruct dma_vec;\n\nstruct dma_interleaved_template;\n\nstruct dma_slave_caps;\n\nstruct dma_slave_config;\n\nstruct dma_tx_state;\n\nstruct dma_device {\n\tstruct kref ref;\n\tunsigned int chancnt;\n\tunsigned int privatecnt;\n\tstruct list_head channels;\n\tstruct list_head global_node;\n\tstruct dma_filter filter;\n\tdma_cap_mask_t cap_mask;\n\tenum dma_desc_metadata_mode desc_metadata_modes;\n\tshort unsigned int max_xor;\n\tshort unsigned int max_pq;\n\tenum dmaengine_alignment copy_align;\n\tenum dmaengine_alignment xor_align;\n\tenum dmaengine_alignment pq_align;\n\tenum dmaengine_alignment fill_align;\n\tint dev_id;\n\tstruct device *dev;\n\tstruct module *owner;\n\tstruct ida chan_ida;\n\tu32 src_addr_widths;\n\tu32 dst_addr_widths;\n\tu32 directions;\n\tu32 min_burst;\n\tu32 max_burst;\n\tu32 max_sg_burst;\n\tbool descriptor_reuse;\n\tenum dma_residue_granularity residue_granularity;\n\tint (*device_alloc_chan_resources)(struct dma_chan *);\n\tint (*device_router_config)(struct dma_chan *);\n\tvoid (*device_free_chan_resources)(struct dma_chan *);\n\tstruct dma_async_tx_descriptor * (*device_prep_dma_memcpy)(struct dma_chan *, dma_addr_t, dma_addr_t, size_t, long unsigned int);\n\tstruct dma_async_tx_descriptor * (*device_prep_dma_xor)(struct dma_chan *, dma_addr_t, dma_addr_t *, unsigned int, size_t, long unsigned int);\n\tstruct dma_async_tx_descriptor * (*device_prep_dma_xor_val)(struct dma_chan *, dma_addr_t *, unsigned int, size_t, enum sum_check_flags *, long unsigned int);\n\tstruct dma_async_tx_descriptor * (*device_prep_dma_pq)(struct dma_chan *, dma_addr_t *, dma_addr_t *, unsigned int, const unsigned char *, size_t, long unsigned int);\n\tstruct dma_async_tx_descriptor * (*device_prep_dma_pq_val)(struct dma_chan *, dma_addr_t *, dma_addr_t *, unsigned int, const unsigned char *, size_t, enum sum_check_flags *, long unsigned int);\n\tstruct dma_async_tx_descriptor * (*device_prep_dma_memset)(struct dma_chan *, dma_addr_t, int, size_t, long unsigned int);\n\tstruct dma_async_tx_descriptor * (*device_prep_dma_memset_sg)(struct dma_chan *, struct scatterlist *, unsigned int, int, long unsigned int);\n\tstruct dma_async_tx_descriptor * (*device_prep_dma_interrupt)(struct dma_chan *, long unsigned int);\n\tstruct dma_async_tx_descriptor * (*device_prep_peripheral_dma_vec)(struct dma_chan *, const struct dma_vec *, size_t, enum dma_transfer_direction, long unsigned int);\n\tstruct dma_async_tx_descriptor * (*device_prep_slave_sg)(struct dma_chan *, struct scatterlist *, unsigned int, enum dma_transfer_direction, long unsigned int, void *);\n\tstruct dma_async_tx_descriptor * (*device_prep_dma_cyclic)(struct dma_chan *, dma_addr_t, size_t, size_t, enum dma_transfer_direction, long unsigned int);\n\tstruct dma_async_tx_descriptor * (*device_prep_interleaved_dma)(struct dma_chan *, struct dma_interleaved_template *, long unsigned int);\n\tstruct dma_async_tx_descriptor * (*device_prep_dma_imm_data)(struct dma_chan *, dma_addr_t, u64, long unsigned int);\n\tvoid (*device_caps)(struct dma_chan *, struct dma_slave_caps *);\n\tint (*device_config)(struct dma_chan *, struct dma_slave_config *);\n\tint (*device_pause)(struct dma_chan *);\n\tint (*device_resume)(struct dma_chan *);\n\tint (*device_terminate_all)(struct dma_chan *);\n\tvoid (*device_synchronize)(struct dma_chan *);\n\tenum dma_status (*device_tx_status)(struct dma_chan *, dma_cookie_t, struct dma_tx_state *);\n\tvoid (*device_issue_pending)(struct dma_chan *);\n\tvoid (*device_release)(struct dma_device *);\n\tvoid (*dbg_summary_show)(struct seq_file *, struct dma_device *);\n\tstruct dentry *dbg_dev_root;\n};\n\nstruct dma_devres {\n\tsize_t size;\n\tvoid *vaddr;\n\tdma_addr_t dma_handle;\n\tlong unsigned int attrs;\n};\n\nstruct dma_fence_ops;\n\nstruct dma_fence {\n\tspinlock_t *lock;\n\tconst struct dma_fence_ops *ops;\n\tunion {\n\t\tstruct list_head cb_list;\n\t\tktime_t timestamp;\n\t\tstruct callback_head rcu;\n\t};\n\tu64 context;\n\tu64 seqno;\n\tlong unsigned int flags;\n\tstruct kref refcount;\n\tint error;\n};\n\nstruct dma_fence_array;\n\nstruct dma_fence_array_cb {\n\tstruct dma_fence_cb cb;\n\tstruct dma_fence_array *array;\n};\n\nstruct dma_fence_array {\n\tstruct dma_fence base;\n\tspinlock_t lock;\n\tunsigned int num_fences;\n\tatomic_t num_pending;\n\tstruct dma_fence **fences;\n\tstruct irq_work work;\n\tstruct dma_fence_array_cb callbacks[0];\n};\n\nstruct dma_fence_chain {\n\tstruct dma_fence base;\n\tstruct dma_fence *prev;\n\tu64 prev_seqno;\n\tstruct dma_fence *fence;\n\tunion {\n\t\tstruct dma_fence_cb cb;\n\t\tstruct irq_work work;\n\t};\n\tspinlock_t lock;\n};\n\nstruct dma_fence_ops {\n\tbool use_64bit_seqno;\n\tconst char * (*get_driver_name)(struct dma_fence *);\n\tconst char * (*get_timeline_name)(struct dma_fence *);\n\tbool (*enable_signaling)(struct dma_fence *);\n\tbool (*signaled)(struct dma_fence *);\n\tlong int (*wait)(struct dma_fence *, bool, long int);\n\tvoid (*release)(struct dma_fence *);\n\tvoid (*fence_value_str)(struct dma_fence *, char *, int);\n\tvoid (*timeline_value_str)(struct dma_fence *, char *, int);\n\tvoid (*set_deadline)(struct dma_fence *, ktime_t);\n};\n\nstruct dma_fence_unwrap {\n\tstruct dma_fence *chain;\n\tstruct dma_fence *array;\n\tunsigned int index;\n};\n\nstruct dma_heap_ops;\n\nstruct dma_heap {\n\tconst char *name;\n\tconst struct dma_heap_ops *ops;\n\tvoid *priv;\n\tdev_t heap_devt;\n\tstruct list_head list;\n\tstruct cdev heap_cdev;\n};\n\nstruct dma_heap_allocation_data {\n\t__u64 len;\n\t__u32 fd;\n\t__u32 fd_flags;\n\t__u64 heap_flags;\n};\n\nstruct dma_heap_attachment {\n\tstruct device *dev;\n\tstruct sg_table *table;\n\tstruct list_head list;\n\tbool mapped;\n};\n\nstruct dma_heap_export_info {\n\tconst char *name;\n\tconst struct dma_heap_ops *ops;\n\tvoid *priv;\n};\n\nstruct dma_heap_ops {\n\tstruct dma_buf * (*allocate)(struct dma_heap *, long unsigned int, u32, u64);\n};\n\nstruct dma_interleaved_template {\n\tdma_addr_t src_start;\n\tdma_addr_t dst_start;\n\tenum dma_transfer_direction dir;\n\tbool src_inc;\n\tbool dst_inc;\n\tbool src_sgl;\n\tbool dst_sgl;\n\tsize_t numf;\n\tsize_t frame_size;\n\tstruct data_chunk sgl[0];\n};\n\nstruct dma_map_ops {\n\tunsigned int flags;\n\tvoid * (*alloc)(struct device *, size_t, dma_addr_t *, gfp_t, long unsigned int);\n\tvoid (*free)(struct device *, size_t, void *, dma_addr_t, long unsigned int);\n\tstruct page * (*alloc_pages_op)(struct device *, size_t, dma_addr_t *, enum dma_data_direction, gfp_t);\n\tvoid (*free_pages)(struct device *, size_t, struct page *, dma_addr_t, enum dma_data_direction);\n\tstruct sg_table * (*alloc_noncontiguous)(struct device *, size_t, enum dma_data_direction, gfp_t, long unsigned int);\n\tvoid (*free_noncontiguous)(struct device *, size_t, struct sg_table *, enum dma_data_direction);\n\tint (*mmap)(struct device *, struct vm_area_struct *, void *, dma_addr_t, size_t, long unsigned int);\n\tint (*get_sgtable)(struct device *, struct sg_table *, void *, dma_addr_t, size_t, long unsigned int);\n\tdma_addr_t (*map_page)(struct device *, struct page *, long unsigned int, size_t, enum dma_data_direction, long unsigned int);\n\tvoid (*unmap_page)(struct device *, dma_addr_t, size_t, enum dma_data_direction, long unsigned int);\n\tint (*map_sg)(struct device *, struct scatterlist *, int, enum dma_data_direction, long unsigned int);\n\tvoid (*unmap_sg)(struct device *, struct scatterlist *, int, enum dma_data_direction, long unsigned int);\n\tdma_addr_t (*map_resource)(struct device *, phys_addr_t, size_t, enum dma_data_direction, long unsigned int);\n\tvoid (*unmap_resource)(struct device *, dma_addr_t, size_t, enum dma_data_direction, long unsigned int);\n\tvoid (*sync_single_for_cpu)(struct device *, dma_addr_t, size_t, enum dma_data_direction);\n\tvoid (*sync_single_for_device)(struct device *, dma_addr_t, size_t, enum dma_data_direction);\n\tvoid (*sync_sg_for_cpu)(struct device *, struct scatterlist *, int, enum dma_data_direction);\n\tvoid (*sync_sg_for_device)(struct device *, struct scatterlist *, int, enum dma_data_direction);\n\tvoid (*cache_sync)(struct device *, void *, size_t, enum dma_data_direction);\n\tint (*dma_supported)(struct device *, u64);\n\tu64 (*get_required_mask)(struct device *);\n\tsize_t (*max_mapping_size)(struct device *);\n\tsize_t (*opt_mapping_size)(void);\n\tlong unsigned int (*get_merge_boundary)(struct device *);\n};\n\nstruct dma_page {\n\tstruct list_head page_list;\n\tvoid *vaddr;\n\tdma_addr_t dma;\n};\n\nstruct dma_pool {\n\tstruct list_head page_list;\n\tspinlock_t lock;\n\tstruct dma_block *next_block;\n\tsize_t nr_blocks;\n\tsize_t nr_active;\n\tsize_t nr_pages;\n\tstruct device *dev;\n\tunsigned int size;\n\tunsigned int allocation;\n\tunsigned int boundary;\n\tchar name[32];\n\tstruct list_head pools;\n};\n\nstruct dma_pte {\n\tu64 val;\n};\n\nstruct ww_acquire_ctx;\n\nstruct ww_mutex {\n\tstruct mutex base;\n\tstruct ww_acquire_ctx *ctx;\n};\n\nstruct dma_resv_list;\n\nstruct dma_resv {\n\tstruct ww_mutex lock;\n\tstruct dma_resv_list *fences;\n};\n\nstruct dma_resv_iter {\n\tstruct dma_resv *obj;\n\tenum dma_resv_usage usage;\n\tstruct dma_fence *fence;\n\tenum dma_resv_usage fence_usage;\n\tunsigned int index;\n\tstruct dma_resv_list *fences;\n\tunsigned int num_fences;\n\tbool is_restarted;\n};\n\nstruct dma_resv_list {\n\tstruct callback_head rcu;\n\tu32 num_fences;\n\tu32 max_fences;\n\tstruct dma_fence *table[0];\n};\n\nstruct dma_router {\n\tstruct device *dev;\n\tvoid (*route_free)(struct device *, void *);\n};\n\nstruct sg_table {\n\tstruct scatterlist *sgl;\n\tunsigned int nents;\n\tunsigned int orig_nents;\n};\n\nstruct dma_sgt_handle {\n\tstruct sg_table sgt;\n\tstruct page **pages;\n};\n\nstruct dma_slave_caps {\n\tu32 src_addr_widths;\n\tu32 dst_addr_widths;\n\tu32 directions;\n\tu32 min_burst;\n\tu32 max_burst;\n\tu32 max_sg_burst;\n\tbool cmd_pause;\n\tbool cmd_resume;\n\tbool cmd_terminate;\n\tenum dma_residue_granularity residue_granularity;\n\tbool descriptor_reuse;\n};\n\nstruct dma_slave_config {\n\tenum dma_transfer_direction direction;\n\tphys_addr_t src_addr;\n\tphys_addr_t dst_addr;\n\tenum dma_slave_buswidth src_addr_width;\n\tenum dma_slave_buswidth dst_addr_width;\n\tu32 src_maxburst;\n\tu32 dst_maxburst;\n\tu32 src_port_window_size;\n\tu32 dst_port_window_size;\n\tbool device_fc;\n\tvoid *peripheral_config;\n\tsize_t peripheral_size;\n};\n\nstruct dma_slave_map {\n\tconst char *devname;\n\tconst char *slave;\n\tvoid *param;\n};\n\nstruct dma_tx_state {\n\tdma_cookie_t last;\n\tdma_cookie_t used;\n\tu32 residue;\n\tu32 in_flight_bytes;\n};\n\nstruct dma_vec {\n\tdma_addr_t addr;\n\tsize_t len;\n};\n\nstruct dmaengine_desc_callback {\n\tdma_async_tx_callback callback;\n\tdma_async_tx_callback_result callback_result;\n\tvoid *callback_param;\n};\n\nstruct dmaengine_result {\n\tenum dmaengine_tx_result result;\n\tu32 residue;\n};\n\nstruct dmaengine_unmap_data {\n\tu16 map_cnt;\n\tu8 to_cnt;\n\tu8 from_cnt;\n\tu8 bidi_cnt;\n\tstruct device *dev;\n\tstruct kref kref;\n\tsize_t len;\n\tdma_addr_t addr[0];\n};\n\nstruct dmaengine_unmap_pool {\n\tstruct kmem_cache *cache;\n\tconst char *name;\n\tmempool_t *pool;\n\tsize_t size;\n};\n\nstruct dmar_dev_scope;\n\nstruct dmar_atsr_unit {\n\tstruct list_head list;\n\tstruct acpi_dmar_header *hdr;\n\tstruct dmar_dev_scope *devices;\n\tint devices_cnt;\n\tu8 include_all: 1;\n};\n\nstruct dmar_dev_scope {\n\tstruct device *dev;\n\tu8 bus;\n\tu8 devfn;\n};\n\nstruct iommu_hwpt_vtd_s1 {\n\t__u64 flags;\n\t__u64 pgtbl_addr;\n\t__u32 addr_width;\n\t__u32 __reserved;\n};\n\nstruct mmu_notifier_ops;\n\nstruct mmu_notifier {\n\tstruct hlist_node hlist;\n\tconst struct mmu_notifier_ops *ops;\n\tstruct mm_struct *mm;\n\tstruct callback_head rcu;\n\tunsigned int users;\n};\n\nstruct iommu_domain_geometry {\n\tdma_addr_t aperture_start;\n\tdma_addr_t aperture_end;\n\tbool force_aperture;\n};\n\nstruct iommu_domain;\n\ntypedef int (*iommu_fault_handler_t)(struct iommu_domain *, struct device *, long unsigned int, int, void *);\n\nstruct iommu_domain_ops;\n\nstruct iommu_dirty_ops;\n\nstruct iommu_dma_cookie;\n\nstruct iopf_group;\n\nstruct iommu_domain {\n\tunsigned int type;\n\tconst struct iommu_domain_ops *ops;\n\tconst struct iommu_dirty_ops *dirty_ops;\n\tconst struct iommu_ops *owner;\n\tlong unsigned int pgsize_bitmap;\n\tstruct iommu_domain_geometry geometry;\n\tstruct iommu_dma_cookie *iova_cookie;\n\tint (*iopf_handler)(struct iopf_group *);\n\tvoid *fault_data;\n\tunion {\n\t\tstruct {\n\t\t\tiommu_fault_handler_t handler;\n\t\t\tvoid *handler_token;\n\t\t};\n\t\tstruct {\n\t\t\tstruct mm_struct *mm;\n\t\t\tint users;\n\t\t\tstruct list_head next;\n\t\t};\n\t};\n};\n\nstruct dmar_domain {\n\tint nid;\n\tstruct xarray iommu_array;\n\tu8 has_iotlb_device: 1;\n\tu8 iommu_coherency: 1;\n\tu8 force_snooping: 1;\n\tu8 set_pte_snp: 1;\n\tu8 use_first_level: 1;\n\tu8 dirty_tracking: 1;\n\tu8 nested_parent: 1;\n\tu8 has_mappings: 1;\n\tspinlock_t lock;\n\tstruct list_head devices;\n\tstruct list_head dev_pasids;\n\tspinlock_t cache_lock;\n\tstruct list_head cache_tags;\n\tint iommu_superpage;\n\tunion {\n\t\tstruct {\n\t\t\tstruct dma_pte *pgd;\n\t\t\tint gaw;\n\t\t\tint agaw;\n\t\t\tu64 max_addr;\n\t\t\tspinlock_t s1_lock;\n\t\t\tstruct list_head s1_domains;\n\t\t};\n\t\tstruct {\n\t\t\tstruct dmar_domain *s2_domain;\n\t\t\tlong unsigned int s1_pgtbl;\n\t\t\tstruct iommu_hwpt_vtd_s1 s1_cfg;\n\t\t\tstruct list_head s2_link;\n\t\t};\n\t\tstruct {\n\t\t\tstruct mmu_notifier notifier;\n\t\t};\n\t};\n\tstruct iommu_domain domain;\n};\n\nstruct dmar_drhd_unit {\n\tstruct list_head list;\n\tstruct acpi_dmar_header *hdr;\n\tu64 reg_base_addr;\n\tlong unsigned int reg_size;\n\tstruct dmar_dev_scope *devices;\n\tint devices_cnt;\n\tu16 segment;\n\tu8 ignored: 1;\n\tu8 include_all: 1;\n\tu8 gfx_dedicated: 1;\n\tstruct intel_iommu *iommu;\n};\n\nstruct dmar_pci_path {\n\tu8 bus;\n\tu8 device;\n\tu8 function;\n};\n\nstruct dmar_pci_notify_info {\n\tstruct pci_dev *dev;\n\tlong unsigned int event;\n\tint bus;\n\tu16 seg;\n\tu16 level;\n\tstruct dmar_pci_path path[0];\n};\n\ntypedef int (*dmar_res_handler_t)(struct acpi_dmar_header *, void *);\n\nstruct dmar_res_callback {\n\tdmar_res_handler_t cb[6];\n\tvoid *arg[6];\n\tbool ignore_unhandled;\n\tbool print_entry;\n};\n\nstruct dmar_rmrr_unit {\n\tstruct list_head list;\n\tstruct acpi_dmar_header *hdr;\n\tu64 base_address;\n\tu64 end_address;\n\tstruct dmar_dev_scope *devices;\n\tint devices_cnt;\n};\n\nstruct dmar_satc_unit {\n\tstruct list_head list;\n\tstruct acpi_dmar_header *hdr;\n\tstruct dmar_dev_scope *devices;\n\tstruct intel_iommu *iommu;\n\tint devices_cnt;\n\tu8 atc_required: 1;\n};\n\nstruct dmi_device {\n\tstruct list_head list;\n\tint type;\n\tconst char *name;\n\tvoid *device_data;\n};\n\nstruct dmi_dev_onboard {\n\tstruct dmi_device dev;\n\tint instance;\n\tint segment;\n\tint bus;\n\tint devfn;\n};\n\nstruct dmi_device_attribute {\n\tstruct device_attribute dev_attr;\n\tint field;\n};\n\nstruct dmi_header {\n\tu8 type;\n\tu8 length;\n\tu16 handle;\n};\n\nstruct dmi_memdev_info {\n\tconst char *device;\n\tconst char *bank;\n\tu64 size;\n\tu16 handle;\n\tu8 type;\n};\n\nstruct dmi_strmatch {\n\tunsigned char slot: 7;\n\tunsigned char exact_match: 1;\n\tchar substr[79];\n};\n\nstruct dmi_system_id {\n\tint (*callback)(const struct dmi_system_id *);\n\tconst char *ident;\n\tstruct dmi_strmatch matches[4];\n\tvoid *driver_data;\n};\n\nstruct fb_videomode;\n\nstruct dmt_videomode {\n\tu32 dmt_id;\n\tu32 std_2byte_code;\n\tu32 cvt_3byte_code;\n\tconst struct fb_videomode *mode;\n};\n\nstruct dnotify_struct;\n\nstruct dnotify_mark {\n\tstruct fsnotify_mark fsn_mark;\n\tstruct dnotify_struct *dn;\n};\n\ntypedef void *fl_owner_t;\n\nstruct dnotify_struct {\n\tstruct dnotify_struct *dn_next;\n\t__u32 dn_mask;\n\tint dn_fd;\n\tstruct file *dn_filp;\n\tfl_owner_t dn_owner;\n};\n\nstruct dns_payload_header {\n\t__u8 zero;\n\t__u8 content;\n\t__u8 version;\n};\n\nstruct dns_server_list_v1_header {\n\tstruct dns_payload_header hdr;\n\t__u8 source;\n\t__u8 status;\n\t__u8 nr_servers;\n};\n\nstruct do_proc_dointvec_minmax_conv_param {\n\tint *min;\n\tint *max;\n};\n\nstruct do_proc_douintvec_minmax_conv_param {\n\tunsigned int *min;\n\tunsigned int *max;\n};\n\nstruct dock_dependent_device {\n\tstruct list_head list;\n\tstruct acpi_device *adev;\n};\n\nstruct dock_station {\n\tacpi_handle handle;\n\tlong unsigned int last_dock_time;\n\tu32 flags;\n\tstruct list_head dependent_devices;\n\tstruct list_head sibling;\n\tstruct platform_device *dock_device;\n};\n\nstruct dom0_vga_console_info {\n\tuint8_t video_type;\n\tunion {\n\t\tstruct {\n\t\t\tuint16_t font_height;\n\t\t\tuint16_t cursor_x;\n\t\t\tuint16_t cursor_y;\n\t\t\tuint16_t rows;\n\t\t\tuint16_t columns;\n\t\t} text_mode_3;\n\t\tstruct {\n\t\t\tuint16_t width;\n\t\t\tuint16_t height;\n\t\t\tuint16_t bytes_per_line;\n\t\t\tuint16_t bits_per_pixel;\n\t\t\tuint32_t lfb_base;\n\t\t\tuint32_t lfb_size;\n\t\t\tuint8_t red_pos;\n\t\t\tuint8_t red_size;\n\t\t\tuint8_t green_pos;\n\t\t\tuint8_t green_size;\n\t\t\tuint8_t blue_pos;\n\t\t\tuint8_t blue_size;\n\t\t\tuint8_t rsvd_pos;\n\t\t\tuint8_t rsvd_size;\n\t\t\tuint32_t gbl_caps;\n\t\t\tuint16_t mode_attrs;\n\t\t\tuint16_t pad;\n\t\t\tuint32_t ext_lfb_base;\n\t\t} vesa_lfb;\n\t} u;\n};\n\nstruct double_list {\n\tstruct list_head *top;\n\tstruct list_head *bottom;\n};\n\nstruct dp_sdp_header {\n\tu8 HB0;\n\tu8 HB1;\n\tu8 HB2;\n\tu8 HB3;\n};\n\nstruct dp_sdp {\n\tstruct dp_sdp_header sdp_header;\n\tu8 db[32];\n};\n\nstruct dpages {\n\tvoid (*get_page)(struct dpages *, struct page **, long unsigned int *, unsigned int *);\n\tvoid (*next_page)(struct dpages *);\n\tunion {\n\t\tunsigned int context_u;\n\t\tstruct bvec_iter context_bi;\n\t};\n\tvoid *context_ptr;\n\tvoid *vma_invalidate_address;\n\tlong unsigned int vma_invalidate_size;\n};\n\nstruct dpll_device {\n\tu32 id;\n\tu32 device_idx;\n\tu64 clock_id;\n\tstruct module *module;\n\tenum dpll_type type;\n\tstruct xarray pin_refs;\n\trefcount_t refcount;\n\tstruct list_head registration_list;\n};\n\nstruct dpll_device_ops {\n\tint (*mode_get)(const struct dpll_device *, void *, enum dpll_mode *, struct netlink_ext_ack *);\n\tint (*lock_status_get)(const struct dpll_device *, void *, enum dpll_lock_status *, enum dpll_lock_status_error *, struct netlink_ext_ack *);\n\tint (*temp_get)(const struct dpll_device *, void *, s32 *, struct netlink_ext_ack *);\n};\n\nstruct dpll_device_registration {\n\tstruct list_head list;\n\tconst struct dpll_device_ops *ops;\n\tvoid *priv;\n};\n\nstruct dpll_dump_ctx {\n\tlong unsigned int idx;\n};\n\nstruct dpll_pin_phase_adjust_range {\n\ts32 min;\n\ts32 max;\n};\n\nstruct dpll_pin_frequency;\n\nstruct dpll_pin_properties {\n\tconst char *board_label;\n\tconst char *panel_label;\n\tconst char *package_label;\n\tenum dpll_pin_type type;\n\tlong unsigned int capabilities;\n\tu32 freq_supported_num;\n\tstruct dpll_pin_frequency *freq_supported;\n\tstruct dpll_pin_phase_adjust_range phase_range;\n};\n\nstruct dpll_pin {\n\tu32 id;\n\tu32 pin_idx;\n\tu64 clock_id;\n\tstruct module *module;\n\tstruct xarray dpll_refs;\n\tstruct xarray parent_refs;\n\tstruct dpll_pin_properties prop;\n\trefcount_t refcount;\n\tstruct callback_head rcu;\n};\n\nstruct dpll_pin_esync {\n\tu64 freq;\n\tconst struct dpll_pin_frequency *range;\n\tu8 range_num;\n\tu8 pulse;\n};\n\nstruct dpll_pin_frequency {\n\tu64 min;\n\tu64 max;\n};\n\nstruct dpll_pin_ops {\n\tint (*frequency_set)(const struct dpll_pin *, void *, const struct dpll_device *, void *, const u64, struct netlink_ext_ack *);\n\tint (*frequency_get)(const struct dpll_pin *, void *, const struct dpll_device *, void *, u64 *, struct netlink_ext_ack *);\n\tint (*direction_set)(const struct dpll_pin *, void *, const struct dpll_device *, void *, const enum dpll_pin_direction, struct netlink_ext_ack *);\n\tint (*direction_get)(const struct dpll_pin *, void *, const struct dpll_device *, void *, enum dpll_pin_direction *, struct netlink_ext_ack *);\n\tint (*state_on_pin_get)(const struct dpll_pin *, void *, const struct dpll_pin *, void *, enum dpll_pin_state *, struct netlink_ext_ack *);\n\tint (*state_on_dpll_get)(const struct dpll_pin *, void *, const struct dpll_device *, void *, enum dpll_pin_state *, struct netlink_ext_ack *);\n\tint (*state_on_pin_set)(const struct dpll_pin *, void *, const struct dpll_pin *, void *, const enum dpll_pin_state, struct netlink_ext_ack *);\n\tint (*state_on_dpll_set)(const struct dpll_pin *, void *, const struct dpll_device *, void *, const enum dpll_pin_state, struct netlink_ext_ack *);\n\tint (*prio_get)(const struct dpll_pin *, void *, const struct dpll_device *, void *, u32 *, struct netlink_ext_ack *);\n\tint (*prio_set)(const struct dpll_pin *, void *, const struct dpll_device *, void *, const u32, struct netlink_ext_ack *);\n\tint (*phase_offset_get)(const struct dpll_pin *, void *, const struct dpll_device *, void *, s64 *, struct netlink_ext_ack *);\n\tint (*phase_adjust_get)(const struct dpll_pin *, void *, const struct dpll_device *, void *, s32 *, struct netlink_ext_ack *);\n\tint (*phase_adjust_set)(const struct dpll_pin *, void *, const struct dpll_device *, void *, const s32, struct netlink_ext_ack *);\n\tint (*ffo_get)(const struct dpll_pin *, void *, const struct dpll_device *, void *, s64 *, struct netlink_ext_ack *);\n\tint (*esync_set)(const struct dpll_pin *, void *, const struct dpll_device *, void *, u64, struct netlink_ext_ack *);\n\tint (*esync_get)(const struct dpll_pin *, void *, const struct dpll_device *, void *, struct dpll_pin_esync *, struct netlink_ext_ack *);\n};\n\nstruct dpll_pin_ref {\n\tunion {\n\t\tstruct dpll_device *dpll;\n\t\tstruct dpll_pin *pin;\n\t};\n\tstruct list_head registration_list;\n\trefcount_t refcount;\n};\n\nstruct dpll_pin_registration {\n\tstruct list_head list;\n\tconst struct dpll_pin_ops *ops;\n\tvoid *priv;\n\tvoid *cookie;\n};\n\nstruct dql {\n\tunsigned int num_queued;\n\tunsigned int adj_limit;\n\tunsigned int last_obj_cnt;\n\tshort unsigned int stall_thrs;\n\tlong unsigned int history_head;\n\tlong unsigned int history[4];\n\tlong: 64;\n\tunsigned int limit;\n\tunsigned int num_completed;\n\tunsigned int prev_ovlimit;\n\tunsigned int prev_num_queued;\n\tunsigned int prev_last_obj_cnt;\n\tunsigned int lowest_slack;\n\tlong unsigned int slack_start_time;\n\tunsigned int max_limit;\n\tunsigned int min_limit;\n\tunsigned int slack_hold_time;\n\tshort unsigned int stall_max;\n\tlong unsigned int last_reap;\n\tlong unsigned int stall_cnt;\n};\n\nstruct dqstats {\n\tlong unsigned int stat[8];\n\tstruct percpu_counter counter[8];\n};\n\nstruct kqid {\n\tunion {\n\t\tkuid_t uid;\n\t\tkgid_t gid;\n\t\tkprojid_t projid;\n\t};\n\tenum quota_type type;\n};\n\nstruct mem_dqblk {\n\tqsize_t dqb_bhardlimit;\n\tqsize_t dqb_bsoftlimit;\n\tqsize_t dqb_curspace;\n\tqsize_t dqb_rsvspace;\n\tqsize_t dqb_ihardlimit;\n\tqsize_t dqb_isoftlimit;\n\tqsize_t dqb_curinodes;\n\ttime64_t dqb_btime;\n\ttime64_t dqb_itime;\n};\n\nstruct dquot {\n\tstruct hlist_node dq_hash;\n\tstruct list_head dq_inuse;\n\tstruct list_head dq_free;\n\tstruct list_head dq_dirty;\n\tstruct mutex dq_lock;\n\tspinlock_t dq_dqb_lock;\n\tatomic_t dq_count;\n\tstruct super_block *dq_sb;\n\tstruct kqid dq_id;\n\tloff_t dq_off;\n\tlong unsigned int dq_flags;\n\tstruct mem_dqblk dq_dqb;\n};\n\nstruct dquot_operations {\n\tint (*write_dquot)(struct dquot *);\n\tstruct dquot * (*alloc_dquot)(struct super_block *, int);\n\tvoid (*destroy_dquot)(struct dquot *);\n\tint (*acquire_dquot)(struct dquot *);\n\tint (*release_dquot)(struct dquot *);\n\tint (*mark_dirty)(struct dquot *);\n\tint (*write_info)(struct super_block *, int);\n\tqsize_t * (*get_reserved_space)(struct inode *);\n\tint (*get_projid)(struct inode *, kprojid_t *);\n\tint (*get_inode_usage)(struct inode *, qsize_t *);\n\tint (*get_next_id)(struct super_block *, struct kqid *);\n};\n\nstruct dquot_warn {\n\tstruct super_block *w_sb;\n\tstruct kqid w_dq_id;\n\tshort int w_type;\n};\n\nstruct drbg_core {\n\tdrbg_flag_t flags;\n\t__u8 statelen;\n\t__u8 blocklen_bytes;\n\tchar cra_name[128];\n\tchar backend_cra_name[128];\n};\n\nstruct drbg_string {\n\tconst unsigned char *buf;\n\tsize_t len;\n\tstruct list_head list;\n};\n\nstruct drbg_state_ops;\n\nstruct drbg_state {\n\tstruct mutex drbg_mutex;\n\tunsigned char *V;\n\tunsigned char *Vbuf;\n\tunsigned char *C;\n\tunsigned char *Cbuf;\n\tsize_t reseed_ctr;\n\tsize_t reseed_threshold;\n\tunsigned char *scratchpad;\n\tunsigned char *scratchpadbuf;\n\tvoid *priv_data;\n\tstruct crypto_skcipher *ctr_handle;\n\tstruct skcipher_request *ctr_req;\n\t__u8 *outscratchpadbuf;\n\t__u8 *outscratchpad;\n\tstruct crypto_wait ctr_wait;\n\tstruct scatterlist sg_in;\n\tstruct scatterlist sg_out;\n\tenum drbg_seed_state seeded;\n\tlong unsigned int last_seed_time;\n\tbool pr;\n\tbool fips_primed;\n\tunsigned char *prev;\n\tstruct crypto_rng *jent;\n\tconst struct drbg_state_ops *d_ops;\n\tconst struct drbg_core *core;\n\tstruct drbg_string test_data;\n};\n\nstruct drbg_state_ops {\n\tint (*update)(struct drbg_state *, struct list_head *, int);\n\tint (*generate)(struct drbg_state *, unsigned char *, unsigned int, struct list_head *);\n\tint (*crypto_init)(struct drbg_state *);\n\tint (*crypto_fini)(struct drbg_state *);\n};\n\nstruct driver_attribute {\n\tstruct attribute attr;\n\tssize_t (*show)(struct device_driver *, char *);\n\tssize_t (*store)(struct device_driver *, const char *, size_t);\n};\n\nstruct module_kobject;\n\nstruct driver_private {\n\tstruct kobject kobj;\n\tstruct klist klist_devices;\n\tstruct klist_node knode_bus;\n\tstruct module_kobject *mkobj;\n\tstruct device_driver *driver;\n};\n\nstruct drm_object_properties;\n\nstruct drm_mode_object {\n\tuint32_t id;\n\tuint32_t type;\n\tstruct drm_object_properties *properties;\n\tstruct kref refcount;\n\tvoid (*free_cb)(struct kref *);\n};\n\nstruct drm_device;\n\nstruct drm_format_info;\n\nstruct drm_framebuffer_funcs;\n\nstruct drm_gem_object;\n\nstruct drm_framebuffer {\n\tstruct drm_device *dev;\n\tstruct list_head head;\n\tstruct drm_mode_object base;\n\tchar comm[16];\n\tconst struct drm_format_info *format;\n\tconst struct drm_framebuffer_funcs *funcs;\n\tunsigned int pitches[4];\n\tunsigned int offsets[4];\n\tuint64_t modifier;\n\tunsigned int width;\n\tunsigned int height;\n\tint flags;\n\tstruct list_head filp_head;\n\tstruct drm_gem_object *obj[4];\n};\n\nstruct drm_afbc_framebuffer {\n\tstruct drm_framebuffer base;\n\tu32 block_width;\n\tu32 block_height;\n\tu32 aligned_width;\n\tu32 aligned_height;\n\tu32 offset;\n\tu32 afbc_size;\n};\n\nstruct drm_rect {\n\tint x1;\n\tint y1;\n\tint x2;\n\tint y2;\n};\n\nstruct drm_atomic_helper_damage_iter {\n\tstruct drm_rect plane_src;\n\tconst struct drm_rect *clips;\n\tuint32_t num_clips;\n\tuint32_t curr_clip;\n\tbool full_update;\n};\n\nstruct drm_modeset_acquire_ctx;\n\nstruct drm_atomic_state {\n\tstruct kref ref;\n\tstruct drm_device *dev;\n\tbool allow_modeset: 1;\n\tbool legacy_cursor_update: 1;\n\tbool async_update: 1;\n\tbool duplicated: 1;\n\tstruct __drm_planes_state *planes;\n\tstruct __drm_crtcs_state *crtcs;\n\tint num_connector;\n\tstruct __drm_connnectors_state *connectors;\n\tint num_private_objs;\n\tstruct __drm_private_objs_state *private_objs;\n\tstruct drm_modeset_acquire_ctx *acquire_ctx;\n\tstruct drm_crtc_commit *fake_commit;\n\tstruct work_struct commit_work;\n};\n\nstruct drm_auth {\n\tdrm_magic_t magic;\n};\n\nstruct drm_modeset_lock {\n\tstruct ww_mutex mutex;\n\tstruct list_head head;\n};\n\nstruct drm_private_state_funcs;\n\nstruct drm_private_obj {\n\tstruct list_head head;\n\tstruct drm_modeset_lock lock;\n\tstruct drm_private_state *state;\n\tconst struct drm_private_state_funcs *funcs;\n};\n\nstruct drm_encoder;\n\nstruct drm_bridge_timings;\n\nstruct drm_bridge_funcs;\n\nstruct i2c_adapter;\n\nstruct drm_bridge {\n\tstruct drm_private_obj base;\n\tstruct drm_device *dev;\n\tstruct drm_encoder *encoder;\n\tstruct list_head chain_node;\n\tstruct device_node *of_node;\n\tstruct list_head list;\n\tconst struct drm_bridge_timings *timings;\n\tconst struct drm_bridge_funcs *funcs;\n\tvoid *driver_private;\n\tenum drm_bridge_ops ops;\n\tint type;\n\tbool interlace_allowed;\n\tbool pre_enable_prev_first;\n\tstruct i2c_adapter *ddc;\n\tstruct mutex hpd_mutex;\n\tvoid (*hpd_cb)(void *, enum drm_connector_status);\n\tvoid *hpd_data;\n\tconst char *vendor;\n\tconst char *product;\n\tunsigned int supported_formats;\n\tunsigned int max_bpc;\n};\n\nstruct drm_display_info;\n\nstruct drm_display_mode;\n\nstruct drm_bridge_state;\n\nstruct drm_bridge_funcs {\n\tint (*attach)(struct drm_bridge *, enum drm_bridge_attach_flags);\n\tvoid (*detach)(struct drm_bridge *);\n\tenum drm_mode_status (*mode_valid)(struct drm_bridge *, const struct drm_display_info *, const struct drm_display_mode *);\n\tbool (*mode_fixup)(struct drm_bridge *, const struct drm_display_mode *, struct drm_display_mode *);\n\tvoid (*disable)(struct drm_bridge *);\n\tvoid (*post_disable)(struct drm_bridge *);\n\tvoid (*mode_set)(struct drm_bridge *, const struct drm_display_mode *, const struct drm_display_mode *);\n\tvoid (*pre_enable)(struct drm_bridge *);\n\tvoid (*enable)(struct drm_bridge *);\n\tvoid (*atomic_pre_enable)(struct drm_bridge *, struct drm_bridge_state *);\n\tvoid (*atomic_enable)(struct drm_bridge *, struct drm_bridge_state *);\n\tvoid (*atomic_disable)(struct drm_bridge *, struct drm_bridge_state *);\n\tvoid (*atomic_post_disable)(struct drm_bridge *, struct drm_bridge_state *);\n\tstruct drm_bridge_state * (*atomic_duplicate_state)(struct drm_bridge *);\n\tvoid (*atomic_destroy_state)(struct drm_bridge *, struct drm_bridge_state *);\n\tu32 * (*atomic_get_output_bus_fmts)(struct drm_bridge *, struct drm_bridge_state *, struct drm_crtc_state *, struct drm_connector_state *, unsigned int *);\n\tu32 * (*atomic_get_input_bus_fmts)(struct drm_bridge *, struct drm_bridge_state *, struct drm_crtc_state *, struct drm_connector_state *, u32, unsigned int *);\n\tint (*atomic_check)(struct drm_bridge *, struct drm_bridge_state *, struct drm_crtc_state *, struct drm_connector_state *);\n\tstruct drm_bridge_state * (*atomic_reset)(struct drm_bridge *);\n\tenum drm_connector_status (*detect)(struct drm_bridge *);\n\tint (*get_modes)(struct drm_bridge *, struct drm_connector *);\n\tconst struct drm_edid * (*edid_read)(struct drm_bridge *, struct drm_connector *);\n\tvoid (*hpd_notify)(struct drm_bridge *, enum drm_connector_status);\n\tvoid (*hpd_enable)(struct drm_bridge *);\n\tvoid (*hpd_disable)(struct drm_bridge *);\n\tenum drm_mode_status (*hdmi_tmds_char_rate_valid)(const struct drm_bridge *, const struct drm_display_mode *, long long unsigned int);\n\tint (*hdmi_clear_infoframe)(struct drm_bridge *, enum hdmi_infoframe_type);\n\tint (*hdmi_write_infoframe)(struct drm_bridge *, enum hdmi_infoframe_type, const u8 *, size_t);\n\tvoid (*debugfs_init)(struct drm_bridge *, struct dentry *);\n};\n\nstruct drm_private_state {\n\tstruct drm_atomic_state *state;\n\tstruct drm_private_obj *obj;\n};\n\nstruct drm_bus_cfg {\n\tu32 format;\n\tu32 flags;\n};\n\nstruct drm_bridge_state {\n\tstruct drm_private_state base;\n\tstruct drm_bridge *bridge;\n\tstruct drm_bus_cfg input_bus_cfg;\n\tstruct drm_bus_cfg output_bus_cfg;\n};\n\nstruct drm_bridge_timings {\n\tu32 input_bus_flags;\n\tu32 setup_time_ps;\n\tu32 hold_time_ps;\n\tbool dual_link;\n};\n\nstruct drm_client {\n\tint idx;\n\tint auth;\n\tlong unsigned int pid;\n\tlong unsigned int uid;\n\tlong unsigned int magic;\n\tlong unsigned int iocs;\n};\n\nstruct drm_client32 {\n\tint idx;\n\tint auth;\n\tu32 pid;\n\tu32 uid;\n\tu32 magic;\n\tu32 iocs;\n};\n\ntypedef struct drm_client32 drm_client32_t;\n\nstruct drm_client_dev;\n\nstruct drm_client_buffer {\n\tstruct drm_client_dev *client;\n\tu32 pitch;\n\tstruct drm_gem_object *gem;\n\tstruct iosys_map map;\n\tstruct drm_framebuffer *fb;\n};\n\nstruct drm_client_funcs;\n\nstruct drm_file;\n\nstruct drm_mode_set;\n\nstruct drm_client_dev {\n\tstruct drm_device *dev;\n\tconst char *name;\n\tstruct list_head list;\n\tconst struct drm_client_funcs *funcs;\n\tstruct drm_file *file;\n\tstruct mutex modeset_mutex;\n\tstruct drm_mode_set *modesets;\n\tbool hotplug_failed;\n};\n\nstruct drm_client_funcs {\n\tstruct module *owner;\n\tvoid (*unregister)(struct drm_client_dev *);\n\tint (*restore)(struct drm_client_dev *);\n\tint (*hotplug)(struct drm_client_dev *);\n};\n\nstruct drm_client_offset {\n\tint x;\n\tint y;\n};\n\nstruct drm_clip_rect {\n\tshort unsigned int x1;\n\tshort unsigned int y1;\n\tshort unsigned int x2;\n\tshort unsigned int y2;\n};\n\nstruct drm_connector_tv_margins {\n\tunsigned int bottom;\n\tunsigned int left;\n\tunsigned int right;\n\tunsigned int top;\n};\n\nstruct drm_cmdline_mode {\n\tchar name[32];\n\tbool specified;\n\tbool refresh_specified;\n\tbool bpp_specified;\n\tunsigned int pixel_clock;\n\tint xres;\n\tint yres;\n\tint bpp;\n\tint refresh;\n\tbool rb;\n\tbool interlace;\n\tbool cvt;\n\tbool margins;\n\tenum drm_connector_force force;\n\tunsigned int rotation_reflection;\n\tenum drm_panel_orientation panel_orientation;\n\tstruct drm_connector_tv_margins tv_margins;\n\tenum drm_connector_tv_mode tv_mode;\n\tbool tv_mode_specified;\n};\n\nstruct drm_color_lut {\n\t__u16 red;\n\t__u16 green;\n\t__u16 blue;\n\t__u16 reserved;\n};\n\nstruct drm_conn_prop_enum_list {\n\tint type;\n\tconst char *name;\n\tstruct ida ida;\n};\n\nstruct drm_scrambling {\n\tbool supported;\n\tbool low_rates;\n};\n\nstruct drm_scdc {\n\tbool supported;\n\tbool read_request;\n\tstruct drm_scrambling scrambling;\n};\n\nstruct drm_hdmi_dsc_cap {\n\tbool v_1p2;\n\tbool native_420;\n\tbool all_bpp;\n\tu8 bpc_supported;\n\tu8 max_slices;\n\tint clk_per_slice;\n\tu8 max_lanes;\n\tu8 max_frl_rate_per_lane;\n\tu8 total_chunk_kbytes;\n};\n\nstruct drm_hdmi_info {\n\tstruct drm_scdc scdc;\n\tlong unsigned int y420_vdb_modes[4];\n\tlong unsigned int y420_cmdb_modes[4];\n\tu8 y420_dc_modes;\n\tu8 max_frl_rate_per_lane;\n\tu8 max_lanes;\n\tstruct drm_hdmi_dsc_cap dsc_cap;\n};\n\nstruct drm_monitor_range_info {\n\tu16 min_vfreq;\n\tu16 max_vfreq;\n};\n\nstruct drm_luminance_range_info {\n\tu32 min_luminance;\n\tu32 max_luminance;\n};\n\nstruct drm_display_info {\n\tunsigned int width_mm;\n\tunsigned int height_mm;\n\tunsigned int bpc;\n\tenum subpixel_order subpixel_order;\n\tint panel_orientation;\n\tu32 color_formats;\n\tconst u32 *bus_formats;\n\tunsigned int num_bus_formats;\n\tu32 bus_flags;\n\tint max_tmds_clock;\n\tbool dvi_dual;\n\tbool is_hdmi;\n\tbool has_audio;\n\tbool has_hdmi_infoframe;\n\tbool rgb_quant_range_selectable;\n\tu8 edid_hdmi_rgb444_dc_modes;\n\tu8 edid_hdmi_ycbcr444_dc_modes;\n\tu8 cea_rev;\n\tstruct drm_hdmi_info hdmi;\n\tbool non_desktop;\n\tstruct drm_monitor_range_info monitor_range;\n\tstruct drm_luminance_range_info luminance_range;\n\tu8 mso_stream_count;\n\tu8 mso_pixel_overlap;\n\tu32 max_dsc_bpp;\n\tu8 *vics;\n\tint vics_len;\n\tu32 quirks;\n\tu16 source_physical_address;\n};\n\nstruct drm_property;\n\nstruct drm_object_properties {\n\tint count;\n\tstruct drm_property *properties[64];\n\tuint64_t values[64];\n};\n\nstruct hdr_static_metadata {\n\t__u8 eotf;\n\t__u8 metadata_type;\n\t__u16 max_cll;\n\t__u16 max_fall;\n\t__u16 min_cll;\n};\n\nstruct hdr_sink_metadata {\n\t__u32 metadata_type;\n\tunion {\n\t\tstruct hdr_static_metadata hdmi_type1;\n\t};\n};\n\nstruct hdmi_any_infoframe {\n\tenum hdmi_infoframe_type type;\n\tunsigned char version;\n\tunsigned char length;\n};\n\nstruct hdmi_avi_infoframe {\n\tenum hdmi_infoframe_type type;\n\tunsigned char version;\n\tunsigned char length;\n\tbool itc;\n\tunsigned char pixel_repeat;\n\tenum hdmi_colorspace colorspace;\n\tenum hdmi_scan_mode scan_mode;\n\tenum hdmi_colorimetry colorimetry;\n\tenum hdmi_picture_aspect picture_aspect;\n\tenum hdmi_active_aspect active_aspect;\n\tenum hdmi_extended_colorimetry extended_colorimetry;\n\tenum hdmi_quantization_range quantization_range;\n\tenum hdmi_nups nups;\n\tunsigned char video_code;\n\tenum hdmi_ycc_quantization_range ycc_quantization_range;\n\tenum hdmi_content_type content_type;\n\tshort unsigned int top_bar;\n\tshort unsigned int bottom_bar;\n\tshort unsigned int left_bar;\n\tshort unsigned int right_bar;\n};\n\nstruct hdmi_spd_infoframe {\n\tenum hdmi_infoframe_type type;\n\tunsigned char version;\n\tunsigned char length;\n\tchar vendor[8];\n\tchar product[16];\n\tenum hdmi_spd_sdi sdi;\n};\n\nstruct hdmi_vendor_infoframe {\n\tenum hdmi_infoframe_type type;\n\tunsigned char version;\n\tunsigned char length;\n\tunsigned int oui;\n\tu8 vic;\n\tenum hdmi_3d_structure s3d_struct;\n\tunsigned int s3d_ext_data;\n};\n\nunion hdmi_vendor_any_infoframe {\n\tstruct {\n\t\tenum hdmi_infoframe_type type;\n\t\tunsigned char version;\n\t\tunsigned char length;\n\t\tunsigned int oui;\n\t} any;\n\tstruct hdmi_vendor_infoframe hdmi;\n};\n\nstruct hdmi_audio_infoframe {\n\tenum hdmi_infoframe_type type;\n\tunsigned char version;\n\tunsigned char length;\n\tunsigned char channels;\n\tenum hdmi_audio_coding_type coding_type;\n\tenum hdmi_audio_sample_size sample_size;\n\tenum hdmi_audio_sample_frequency sample_frequency;\n\tenum hdmi_audio_coding_type_ext coding_type_ext;\n\tunsigned char channel_allocation;\n\tunsigned char level_shift_value;\n\tbool downmix_inhibit;\n};\n\nstruct hdmi_drm_infoframe {\n\tenum hdmi_infoframe_type type;\n\tunsigned char version;\n\tunsigned char length;\n\tenum hdmi_eotf eotf;\n\tenum hdmi_metadata_type metadata_type;\n\tstruct {\n\t\tu16 x;\n\t\tu16 y;\n\t} display_primaries[3];\n\tstruct {\n\t\tu16 x;\n\t\tu16 y;\n\t} white_point;\n\tu16 max_display_mastering_luminance;\n\tu16 min_display_mastering_luminance;\n\tu16 max_cll;\n\tu16 max_fall;\n};\n\nunion hdmi_infoframe {\n\tstruct hdmi_any_infoframe any;\n\tstruct hdmi_avi_infoframe avi;\n\tstruct hdmi_spd_infoframe spd;\n\tunion hdmi_vendor_any_infoframe vendor;\n\tstruct hdmi_audio_infoframe audio;\n\tstruct hdmi_drm_infoframe drm;\n};\n\nstruct drm_connector_hdmi_infoframe {\n\tunion hdmi_infoframe data;\n\tbool set;\n};\n\nstruct drm_connector_hdmi_funcs;\n\nstruct drm_connector_hdmi {\n\tunsigned char vendor[8];\n\tunsigned char product[16];\n\tlong unsigned int supported_formats;\n\tconst struct drm_connector_hdmi_funcs *funcs;\n\tstruct {\n\t\tstruct mutex lock;\n\t\tstruct drm_connector_hdmi_infoframe audio;\n\t} infoframes;\n};\n\nstruct drm_connector_funcs;\n\nstruct drm_property_blob;\n\nstruct drm_privacy_screen;\n\nstruct drm_connector_helper_funcs;\n\nstruct drm_tile_group;\n\nstruct drm_connector {\n\tstruct drm_device *dev;\n\tstruct device *kdev;\n\tstruct device_attribute *attr;\n\tstruct fwnode_handle *fwnode;\n\tstruct list_head head;\n\tstruct list_head global_connector_list_entry;\n\tstruct drm_mode_object base;\n\tchar *name;\n\tstruct mutex mutex;\n\tunsigned int index;\n\tint connector_type;\n\tint connector_type_id;\n\tbool interlace_allowed;\n\tbool doublescan_allowed;\n\tbool stereo_allowed;\n\tbool ycbcr_420_allowed;\n\tenum drm_connector_registration_state registration_state;\n\tstruct list_head modes;\n\tenum drm_connector_status status;\n\tstruct list_head probed_modes;\n\tstruct drm_display_info display_info;\n\tconst struct drm_connector_funcs *funcs;\n\tstruct drm_property_blob *edid_blob_ptr;\n\tstruct drm_object_properties properties;\n\tstruct drm_property *scaling_mode_property;\n\tstruct drm_property *vrr_capable_property;\n\tstruct drm_property *colorspace_property;\n\tstruct drm_property_blob *path_blob_ptr;\n\tunsigned int max_bpc;\n\tstruct drm_property *max_bpc_property;\n\tstruct drm_privacy_screen *privacy_screen;\n\tstruct notifier_block privacy_screen_notifier;\n\tstruct drm_property *privacy_screen_sw_state_property;\n\tstruct drm_property *privacy_screen_hw_state_property;\n\tstruct drm_property *broadcast_rgb_property;\n\tuint8_t polled;\n\tint dpms;\n\tconst struct drm_connector_helper_funcs *helper_private;\n\tstruct drm_cmdline_mode cmdline_mode;\n\tenum drm_connector_force force;\n\tconst struct drm_edid *edid_override;\n\tstruct mutex edid_override_mutex;\n\tu64 epoch_counter;\n\tu32 possible_encoders;\n\tstruct drm_encoder *encoder;\n\tuint8_t eld[128];\n\tbool latency_present[2];\n\tint video_latency[2];\n\tint audio_latency[2];\n\tstruct i2c_adapter *ddc;\n\tint null_edid_counter;\n\tunsigned int bad_edid_counter;\n\tbool edid_corrupt;\n\tu8 real_edid_checksum;\n\tstruct dentry *debugfs_entry;\n\tstruct drm_connector_state *state;\n\tstruct drm_property_blob *tile_blob_ptr;\n\tbool has_tile;\n\tstruct drm_tile_group *tile_group;\n\tbool tile_is_single_monitor;\n\tuint8_t num_h_tile;\n\tuint8_t num_v_tile;\n\tuint8_t tile_h_loc;\n\tuint8_t tile_v_loc;\n\tuint16_t tile_h_size;\n\tuint16_t tile_v_size;\n\tstruct llist_node free_node;\n\tstruct hdr_sink_metadata hdr_sink_metadata;\n\tstruct drm_connector_hdmi hdmi;\n};\n\nstruct drm_printer;\n\nstruct drm_connector_funcs {\n\tint (*dpms)(struct drm_connector *, int);\n\tvoid (*reset)(struct drm_connector *);\n\tenum drm_connector_status (*detect)(struct drm_connector *, bool);\n\tvoid (*force)(struct drm_connector *);\n\tint (*fill_modes)(struct drm_connector *, uint32_t, uint32_t);\n\tint (*set_property)(struct drm_connector *, struct drm_property *, uint64_t);\n\tint (*late_register)(struct drm_connector *);\n\tvoid (*early_unregister)(struct drm_connector *);\n\tvoid (*destroy)(struct drm_connector *);\n\tstruct drm_connector_state * (*atomic_duplicate_state)(struct drm_connector *);\n\tvoid (*atomic_destroy_state)(struct drm_connector *, struct drm_connector_state *);\n\tint (*atomic_set_property)(struct drm_connector *, struct drm_connector_state *, struct drm_property *, uint64_t);\n\tint (*atomic_get_property)(struct drm_connector *, const struct drm_connector_state *, struct drm_property *, uint64_t *);\n\tvoid (*atomic_print_state)(struct drm_printer *, const struct drm_connector_state *);\n\tvoid (*oob_hotplug_event)(struct drm_connector *, enum drm_connector_status);\n\tvoid (*debugfs_init)(struct drm_connector *, struct dentry *);\n};\n\nstruct drm_connector_hdmi_funcs {\n\tenum drm_mode_status (*tmds_char_rate_valid)(const struct drm_connector *, const struct drm_display_mode *, long long unsigned int);\n\tint (*clear_infoframe)(struct drm_connector *, enum hdmi_infoframe_type);\n\tint (*write_infoframe)(struct drm_connector *, enum hdmi_infoframe_type, const u8 *, size_t);\n};\n\nstruct drm_connector_hdmi_state {\n\tenum drm_hdmi_broadcast_rgb broadcast_rgb;\n\tstruct {\n\t\tstruct drm_connector_hdmi_infoframe avi;\n\t\tstruct drm_connector_hdmi_infoframe hdr_drm;\n\t\tstruct drm_connector_hdmi_infoframe spd;\n\t\tstruct drm_connector_hdmi_infoframe hdmi;\n\t} infoframes;\n\tbool is_limited_range;\n\tunsigned int output_bpc;\n\tenum hdmi_colorspace output_format;\n\tlong long unsigned int tmds_char_rate;\n};\n\nstruct drm_writeback_connector;\n\nstruct drm_writeback_job;\n\nstruct drm_connector_helper_funcs {\n\tint (*get_modes)(struct drm_connector *);\n\tint (*detect_ctx)(struct drm_connector *, struct drm_modeset_acquire_ctx *, bool);\n\tenum drm_mode_status (*mode_valid)(struct drm_connector *, struct drm_display_mode *);\n\tint (*mode_valid_ctx)(struct drm_connector *, struct drm_display_mode *, struct drm_modeset_acquire_ctx *, enum drm_mode_status *);\n\tstruct drm_encoder * (*best_encoder)(struct drm_connector *);\n\tstruct drm_encoder * (*atomic_best_encoder)(struct drm_connector *, struct drm_atomic_state *);\n\tint (*atomic_check)(struct drm_connector *, struct drm_atomic_state *);\n\tvoid (*atomic_commit)(struct drm_connector *, struct drm_atomic_state *);\n\tint (*prepare_writeback_job)(struct drm_writeback_connector *, struct drm_writeback_job *);\n\tvoid (*cleanup_writeback_job)(struct drm_writeback_connector *, struct drm_writeback_job *);\n\tvoid (*enable_hpd)(struct drm_connector *);\n\tvoid (*disable_hpd)(struct drm_connector *);\n};\n\nstruct drm_connector_list_iter {\n\tstruct drm_device *dev;\n\tstruct drm_connector *conn;\n};\n\nstruct drm_tv_connector_state {\n\tenum drm_mode_subconnector select_subconnector;\n\tenum drm_mode_subconnector subconnector;\n\tstruct drm_connector_tv_margins margins;\n\tunsigned int legacy_mode;\n\tunsigned int mode;\n\tunsigned int brightness;\n\tunsigned int contrast;\n\tunsigned int flicker_reduction;\n\tunsigned int overscan;\n\tunsigned int saturation;\n\tunsigned int hue;\n};\n\nstruct drm_connector_state {\n\tstruct drm_connector *connector;\n\tstruct drm_crtc *crtc;\n\tstruct drm_encoder *best_encoder;\n\tenum drm_link_status link_status;\n\tstruct drm_atomic_state *state;\n\tstruct drm_crtc_commit *commit;\n\tstruct drm_tv_connector_state tv;\n\tbool self_refresh_aware;\n\tenum hdmi_picture_aspect picture_aspect_ratio;\n\tunsigned int content_type;\n\tunsigned int hdcp_content_type;\n\tunsigned int scaling_mode;\n\tunsigned int content_protection;\n\tenum drm_colorspace colorspace;\n\tstruct drm_writeback_job *writeback_job;\n\tu8 max_requested_bpc;\n\tu8 max_bpc;\n\tenum drm_privacy_screen_status privacy_screen_sw_state;\n\tstruct drm_property_blob *hdr_output_metadata;\n\tstruct drm_connector_hdmi_state hdmi;\n};\n\nstruct drm_display_mode {\n\tint clock;\n\tu16 hdisplay;\n\tu16 hsync_start;\n\tu16 hsync_end;\n\tu16 htotal;\n\tu16 hskew;\n\tu16 vdisplay;\n\tu16 vsync_start;\n\tu16 vsync_end;\n\tu16 vtotal;\n\tu16 vscan;\n\tu32 flags;\n\tint crtc_clock;\n\tu16 crtc_hdisplay;\n\tu16 crtc_hblank_start;\n\tu16 crtc_hblank_end;\n\tu16 crtc_hsync_start;\n\tu16 crtc_hsync_end;\n\tu16 crtc_htotal;\n\tu16 crtc_hskew;\n\tu16 crtc_vdisplay;\n\tu16 crtc_vblank_start;\n\tu16 crtc_vblank_end;\n\tu16 crtc_vsync_start;\n\tu16 crtc_vsync_end;\n\tu16 crtc_vtotal;\n\tu16 width_mm;\n\tu16 height_mm;\n\tu8 type;\n\tbool expose_to_userspace;\n\tstruct list_head head;\n\tchar name[32];\n\tenum drm_mode_status status;\n\tenum hdmi_picture_aspect picture_aspect_ratio;\n};\n\nstruct drm_crtc_crc_entry;\n\nstruct drm_crtc_crc {\n\tspinlock_t lock;\n\tconst char *source;\n\tbool opened;\n\tbool overflow;\n\tstruct drm_crtc_crc_entry *entries;\n\tint head;\n\tint tail;\n\tsize_t values_cnt;\n\twait_queue_head_t wq;\n};\n\nstruct drm_crtc_funcs;\n\nstruct drm_crtc_helper_funcs;\n\nstruct drm_self_refresh_data;\n\nstruct drm_crtc {\n\tstruct drm_device *dev;\n\tstruct device_node *port;\n\tstruct list_head head;\n\tchar *name;\n\tstruct drm_modeset_lock mutex;\n\tstruct drm_mode_object base;\n\tstruct drm_plane *primary;\n\tstruct drm_plane *cursor;\n\tunsigned int index;\n\tint cursor_x;\n\tint cursor_y;\n\tbool enabled;\n\tstruct drm_display_mode mode;\n\tstruct drm_display_mode hwmode;\n\tint x;\n\tint y;\n\tconst struct drm_crtc_funcs *funcs;\n\tuint32_t gamma_size;\n\tuint16_t *gamma_store;\n\tconst struct drm_crtc_helper_funcs *helper_private;\n\tstruct drm_object_properties properties;\n\tstruct drm_property *scaling_filter_property;\n\tstruct drm_crtc_state *state;\n\tstruct list_head commit_list;\n\tspinlock_t commit_lock;\n\tstruct dentry *debugfs_entry;\n\tstruct drm_crtc_crc crc;\n\tunsigned int fence_context;\n\tspinlock_t fence_lock;\n\tlong unsigned int fence_seqno;\n\tchar timeline_name[32];\n\tstruct drm_self_refresh_data *self_refresh_data;\n};\n\nstruct drm_pending_vblank_event;\n\nstruct drm_crtc_commit {\n\tstruct drm_crtc *crtc;\n\tstruct kref ref;\n\tstruct completion flip_done;\n\tstruct completion hw_done;\n\tstruct completion cleanup_done;\n\tstruct list_head commit_entry;\n\tstruct drm_pending_vblank_event *event;\n\tbool abort_completion;\n};\n\nstruct drm_crtc_crc_entry {\n\tbool has_frame_counter;\n\tuint32_t frame;\n\tuint32_t crcs[10];\n};\n\nstruct drm_crtc_funcs {\n\tvoid (*reset)(struct drm_crtc *);\n\tint (*cursor_set)(struct drm_crtc *, struct drm_file *, uint32_t, uint32_t, uint32_t);\n\tint (*cursor_set2)(struct drm_crtc *, struct drm_file *, uint32_t, uint32_t, uint32_t, int32_t, int32_t);\n\tint (*cursor_move)(struct drm_crtc *, int, int);\n\tint (*gamma_set)(struct drm_crtc *, u16 *, u16 *, u16 *, uint32_t, struct drm_modeset_acquire_ctx *);\n\tvoid (*destroy)(struct drm_crtc *);\n\tint (*set_config)(struct drm_mode_set *, struct drm_modeset_acquire_ctx *);\n\tint (*page_flip)(struct drm_crtc *, struct drm_framebuffer *, struct drm_pending_vblank_event *, uint32_t, struct drm_modeset_acquire_ctx *);\n\tint (*page_flip_target)(struct drm_crtc *, struct drm_framebuffer *, struct drm_pending_vblank_event *, uint32_t, uint32_t, struct drm_modeset_acquire_ctx *);\n\tint (*set_property)(struct drm_crtc *, struct drm_property *, uint64_t);\n\tstruct drm_crtc_state * (*atomic_duplicate_state)(struct drm_crtc *);\n\tvoid (*atomic_destroy_state)(struct drm_crtc *, struct drm_crtc_state *);\n\tint (*atomic_set_property)(struct drm_crtc *, struct drm_crtc_state *, struct drm_property *, uint64_t);\n\tint (*atomic_get_property)(struct drm_crtc *, const struct drm_crtc_state *, struct drm_property *, uint64_t *);\n\tint (*late_register)(struct drm_crtc *);\n\tvoid (*early_unregister)(struct drm_crtc *);\n\tint (*set_crc_source)(struct drm_crtc *, const char *);\n\tint (*verify_crc_source)(struct drm_crtc *, const char *, size_t *);\n\tconst char * const * (*get_crc_sources)(struct drm_crtc *, size_t *);\n\tvoid (*atomic_print_state)(struct drm_printer *, const struct drm_crtc_state *);\n\tu32 (*get_vblank_counter)(struct drm_crtc *);\n\tint (*enable_vblank)(struct drm_crtc *);\n\tvoid (*disable_vblank)(struct drm_crtc *);\n\tbool (*get_vblank_timestamp)(struct drm_crtc *, int *, ktime_t *, bool);\n};\n\nstruct drm_crtc_get_sequence {\n\t__u32 crtc_id;\n\t__u32 active;\n\t__u64 sequence;\n\t__s64 sequence_ns;\n};\n\nstruct drm_crtc_helper_funcs {\n\tvoid (*dpms)(struct drm_crtc *, int);\n\tvoid (*prepare)(struct drm_crtc *);\n\tvoid (*commit)(struct drm_crtc *);\n\tenum drm_mode_status (*mode_valid)(struct drm_crtc *, const struct drm_display_mode *);\n\tbool (*mode_fixup)(struct drm_crtc *, const struct drm_display_mode *, struct drm_display_mode *);\n\tint (*mode_set)(struct drm_crtc *, struct drm_display_mode *, struct drm_display_mode *, int, int, struct drm_framebuffer *);\n\tvoid (*mode_set_nofb)(struct drm_crtc *);\n\tint (*mode_set_base)(struct drm_crtc *, int, int, struct drm_framebuffer *);\n\tint (*mode_set_base_atomic)(struct drm_crtc *, struct drm_framebuffer *, int, int, enum mode_set_atomic);\n\tvoid (*disable)(struct drm_crtc *);\n\tint (*atomic_check)(struct drm_crtc *, struct drm_atomic_state *);\n\tvoid (*atomic_begin)(struct drm_crtc *, struct drm_atomic_state *);\n\tvoid (*atomic_flush)(struct drm_crtc *, struct drm_atomic_state *);\n\tvoid (*atomic_enable)(struct drm_crtc *, struct drm_atomic_state *);\n\tvoid (*atomic_disable)(struct drm_crtc *, struct drm_atomic_state *);\n\tbool (*get_scanout_position)(struct drm_crtc *, bool, int *, int *, ktime_t *, ktime_t *, const struct drm_display_mode *);\n};\n\nstruct drm_crtc_queue_sequence {\n\t__u32 crtc_id;\n\t__u32 flags;\n\t__u64 sequence;\n\t__u64 user_data;\n};\n\nstruct drm_crtc_state {\n\tstruct drm_crtc *crtc;\n\tbool enable;\n\tbool active;\n\tbool planes_changed: 1;\n\tbool mode_changed: 1;\n\tbool active_changed: 1;\n\tbool connectors_changed: 1;\n\tbool zpos_changed: 1;\n\tbool color_mgmt_changed: 1;\n\tbool no_vblank: 1;\n\tu32 plane_mask;\n\tu32 connector_mask;\n\tu32 encoder_mask;\n\tstruct drm_display_mode adjusted_mode;\n\tstruct drm_display_mode mode;\n\tstruct drm_property_blob *mode_blob;\n\tstruct drm_property_blob *degamma_lut;\n\tstruct drm_property_blob *ctm;\n\tstruct drm_property_blob *gamma_lut;\n\tu32 target_vblank;\n\tbool async_flip;\n\tbool vrr_enabled;\n\tbool self_refresh_active;\n\tenum drm_scaling_filter scaling_filter;\n\tstruct drm_pending_vblank_event *event;\n\tstruct drm_crtc_commit *commit;\n\tstruct drm_atomic_state *state;\n};\n\nstruct drm_debugfs_info {\n\tconst char *name;\n\tint (*show)(struct seq_file *, void *);\n\tu32 driver_features;\n\tvoid *data;\n};\n\nstruct drm_debugfs_entry {\n\tstruct drm_device *dev;\n\tstruct drm_debugfs_info file;\n\tstruct list_head list;\n};\n\nstruct drm_mode_config_funcs;\n\nstruct drm_mode_config_helper_funcs;\n\nstruct drm_mode_config {\n\tstruct mutex mutex;\n\tstruct drm_modeset_lock connection_mutex;\n\tstruct drm_modeset_acquire_ctx *acquire_ctx;\n\tstruct mutex idr_mutex;\n\tstruct idr object_idr;\n\tstruct idr tile_idr;\n\tstruct mutex fb_lock;\n\tint num_fb;\n\tstruct list_head fb_list;\n\tspinlock_t connector_list_lock;\n\tint num_connector;\n\tstruct ida connector_ida;\n\tstruct list_head connector_list;\n\tstruct llist_head connector_free_list;\n\tstruct work_struct connector_free_work;\n\tint num_encoder;\n\tstruct list_head encoder_list;\n\tint num_total_plane;\n\tstruct list_head plane_list;\n\tstruct raw_spinlock panic_lock;\n\tint num_crtc;\n\tstruct list_head crtc_list;\n\tstruct list_head property_list;\n\tstruct list_head privobj_list;\n\tint min_width;\n\tint min_height;\n\tint max_width;\n\tint max_height;\n\tconst struct drm_mode_config_funcs *funcs;\n\tbool poll_enabled;\n\tbool poll_running;\n\tbool delayed_event;\n\tstruct delayed_work output_poll_work;\n\tstruct mutex blob_lock;\n\tstruct list_head property_blob_list;\n\tstruct drm_property *edid_property;\n\tstruct drm_property *dpms_property;\n\tstruct drm_property *path_property;\n\tstruct drm_property *tile_property;\n\tstruct drm_property *link_status_property;\n\tstruct drm_property *plane_type_property;\n\tstruct drm_property *prop_src_x;\n\tstruct drm_property *prop_src_y;\n\tstruct drm_property *prop_src_w;\n\tstruct drm_property *prop_src_h;\n\tstruct drm_property *prop_crtc_x;\n\tstruct drm_property *prop_crtc_y;\n\tstruct drm_property *prop_crtc_w;\n\tstruct drm_property *prop_crtc_h;\n\tstruct drm_property *prop_fb_id;\n\tstruct drm_property *prop_in_fence_fd;\n\tstruct drm_property *prop_out_fence_ptr;\n\tstruct drm_property *prop_crtc_id;\n\tstruct drm_property *prop_fb_damage_clips;\n\tstruct drm_property *prop_active;\n\tstruct drm_property *prop_mode_id;\n\tstruct drm_property *prop_vrr_enabled;\n\tstruct drm_property *dvi_i_subconnector_property;\n\tstruct drm_property *dvi_i_select_subconnector_property;\n\tstruct drm_property *dp_subconnector_property;\n\tstruct drm_property *tv_subconnector_property;\n\tstruct drm_property *tv_select_subconnector_property;\n\tstruct drm_property *legacy_tv_mode_property;\n\tstruct drm_property *tv_mode_property;\n\tstruct drm_property *tv_left_margin_property;\n\tstruct drm_property *tv_right_margin_property;\n\tstruct drm_property *tv_top_margin_property;\n\tstruct drm_property *tv_bottom_margin_property;\n\tstruct drm_property *tv_brightness_property;\n\tstruct drm_property *tv_contrast_property;\n\tstruct drm_property *tv_flicker_reduction_property;\n\tstruct drm_property *tv_overscan_property;\n\tstruct drm_property *tv_saturation_property;\n\tstruct drm_property *tv_hue_property;\n\tstruct drm_property *scaling_mode_property;\n\tstruct drm_property *aspect_ratio_property;\n\tstruct drm_property *content_type_property;\n\tstruct drm_property *degamma_lut_property;\n\tstruct drm_property *degamma_lut_size_property;\n\tstruct drm_property *ctm_property;\n\tstruct drm_property *gamma_lut_property;\n\tstruct drm_property *gamma_lut_size_property;\n\tstruct drm_property *suggested_x_property;\n\tstruct drm_property *suggested_y_property;\n\tstruct drm_property *non_desktop_property;\n\tstruct drm_property *panel_orientation_property;\n\tstruct drm_property *writeback_fb_id_property;\n\tstruct drm_property *writeback_pixel_formats_property;\n\tstruct drm_property *writeback_out_fence_ptr_property;\n\tstruct drm_property *hdr_output_metadata_property;\n\tstruct drm_property *content_protection_property;\n\tstruct drm_property *hdcp_content_type_property;\n\tuint32_t preferred_depth;\n\tuint32_t prefer_shadow;\n\tbool quirk_addfb_prefer_xbgr_30bpp;\n\tbool quirk_addfb_prefer_host_byte_order;\n\tbool async_page_flip;\n\tbool fb_modifiers_not_supported;\n\tbool normalize_zpos;\n\tstruct drm_property *modifiers_property;\n\tstruct drm_property *size_hints_property;\n\tuint32_t cursor_width;\n\tuint32_t cursor_height;\n\tstruct drm_atomic_state *suspend_state;\n\tconst struct drm_mode_config_helper_funcs *helper_private;\n};\n\nstruct drm_vram_mm;\n\nstruct drm_driver;\n\nstruct drm_minor;\n\nstruct drm_master;\n\nstruct drm_vblank_crtc;\n\nstruct drm_vma_offset_manager;\n\nstruct drm_fb_helper;\n\nstruct drm_device {\n\tint if_version;\n\tstruct kref ref;\n\tstruct device *dev;\n\tstruct {\n\t\tstruct list_head resources;\n\t\tvoid *final_kfree;\n\t\tspinlock_t lock;\n\t} managed;\n\tconst struct drm_driver *driver;\n\tvoid *dev_private;\n\tstruct drm_minor *primary;\n\tstruct drm_minor *render;\n\tstruct drm_minor *accel;\n\tbool registered;\n\tstruct drm_master *master;\n\tu32 driver_features;\n\tbool unplugged;\n\tstruct inode *anon_inode;\n\tchar *unique;\n\tstruct mutex struct_mutex;\n\tstruct mutex master_mutex;\n\tatomic_t open_count;\n\tstruct mutex filelist_mutex;\n\tstruct list_head filelist;\n\tstruct list_head filelist_internal;\n\tstruct mutex clientlist_mutex;\n\tstruct list_head clientlist;\n\tbool vblank_disable_immediate;\n\tstruct drm_vblank_crtc *vblank;\n\tspinlock_t vblank_time_lock;\n\tspinlock_t vbl_lock;\n\tu32 max_vblank_count;\n\tstruct list_head vblank_event_list;\n\tspinlock_t event_lock;\n\tunsigned int num_crtcs;\n\tstruct drm_mode_config mode_config;\n\tstruct mutex object_name_lock;\n\tstruct idr object_name_idr;\n\tstruct drm_vma_offset_manager *vma_offset_manager;\n\tstruct drm_vram_mm *vram_mm;\n\tenum switch_power_state switch_power_state;\n\tstruct drm_fb_helper *fb_helper;\n\tstruct dentry *debugfs_root;\n};\n\nstruct drm_dmi_panel_orientation_data {\n\tint width;\n\tint height;\n\tconst char * const *bios_dates;\n\tint orientation;\n};\n\nstruct drm_mode_create_dumb;\n\nstruct drm_ioctl_desc;\n\nstruct drm_driver {\n\tint (*load)(struct drm_device *, long unsigned int);\n\tint (*open)(struct drm_device *, struct drm_file *);\n\tvoid (*postclose)(struct drm_device *, struct drm_file *);\n\tvoid (*lastclose)(struct drm_device *);\n\tvoid (*unload)(struct drm_device *);\n\tvoid (*release)(struct drm_device *);\n\tvoid (*master_set)(struct drm_device *, struct drm_file *, bool);\n\tvoid (*master_drop)(struct drm_device *, struct drm_file *);\n\tvoid (*debugfs_init)(struct drm_minor *);\n\tstruct drm_gem_object * (*gem_create_object)(struct drm_device *, size_t);\n\tint (*prime_handle_to_fd)(struct drm_device *, struct drm_file *, uint32_t, uint32_t, int *);\n\tint (*prime_fd_to_handle)(struct drm_device *, struct drm_file *, int, uint32_t *);\n\tstruct drm_gem_object * (*gem_prime_import)(struct drm_device *, struct dma_buf *);\n\tstruct drm_gem_object * (*gem_prime_import_sg_table)(struct drm_device *, struct dma_buf_attachment *, struct sg_table *);\n\tint (*dumb_create)(struct drm_file *, struct drm_device *, struct drm_mode_create_dumb *);\n\tint (*dumb_map_offset)(struct drm_file *, struct drm_device *, uint32_t, uint64_t *);\n\tvoid (*show_fdinfo)(struct drm_printer *, struct drm_file *);\n\tint major;\n\tint minor;\n\tint patchlevel;\n\tchar *name;\n\tchar *desc;\n\tchar *date;\n\tu32 driver_features;\n\tconst struct drm_ioctl_desc *ioctls;\n\tint num_ioctls;\n\tconst struct file_operations *fops;\n};\n\nstruct drm_dsc_rc_range_parameters {\n\tu8 range_min_qp;\n\tu8 range_max_qp;\n\tu8 range_bpg_offset;\n};\n\nstruct drm_dsc_config {\n\tu8 line_buf_depth;\n\tu8 bits_per_component;\n\tbool convert_rgb;\n\tu8 slice_count;\n\tu16 slice_width;\n\tu16 slice_height;\n\tbool simple_422;\n\tu16 pic_width;\n\tu16 pic_height;\n\tu8 rc_tgt_offset_high;\n\tu8 rc_tgt_offset_low;\n\tu16 bits_per_pixel;\n\tu8 rc_edge_factor;\n\tu8 rc_quant_incr_limit1;\n\tu8 rc_quant_incr_limit0;\n\tu16 initial_xmit_delay;\n\tu16 initial_dec_delay;\n\tbool block_pred_enable;\n\tu8 first_line_bpg_offset;\n\tu16 initial_offset;\n\tu16 rc_buf_thresh[14];\n\tstruct drm_dsc_rc_range_parameters rc_range_params[15];\n\tu16 rc_model_size;\n\tu8 flatness_min_qp;\n\tu8 flatness_max_qp;\n\tu8 initial_scale_value;\n\tu16 scale_decrement_interval;\n\tu16 scale_increment_interval;\n\tu16 nfl_bpg_offset;\n\tu16 slice_bpg_offset;\n\tu16 final_offset;\n\tbool vbr_enable;\n\tu8 mux_word_size;\n\tu16 slice_chunk_size;\n\tu16 rc_bits;\n\tu8 dsc_version_minor;\n\tu8 dsc_version_major;\n\tbool native_422;\n\tbool native_420;\n\tu8 second_line_bpg_offset;\n\tu16 nsl_bpg_offset;\n\tu16 second_line_offset_adj;\n};\n\nstruct drm_dsc_picture_parameter_set {\n\tu8 dsc_version;\n\tu8 pps_identifier;\n\tu8 pps_reserved;\n\tu8 pps_3;\n\tu8 pps_4;\n\tu8 bits_per_pixel_low;\n\t__be16 pic_height;\n\t__be16 pic_width;\n\t__be16 slice_height;\n\t__be16 slice_width;\n\t__be16 chunk_size;\n\tu8 initial_xmit_delay_high;\n\tu8 initial_xmit_delay_low;\n\t__be16 initial_dec_delay;\n\tu8 pps20_reserved;\n\tu8 initial_scale_value;\n\t__be16 scale_increment_interval;\n\tu8 scale_decrement_interval_high;\n\tu8 scale_decrement_interval_low;\n\tu8 pps26_reserved;\n\tu8 first_line_bpg_offset;\n\t__be16 nfl_bpg_offset;\n\t__be16 slice_bpg_offset;\n\t__be16 initial_offset;\n\t__be16 final_offset;\n\tu8 flatness_min_qp;\n\tu8 flatness_max_qp;\n\t__be16 rc_model_size;\n\tu8 rc_edge_factor;\n\tu8 rc_quant_incr_limit0;\n\tu8 rc_quant_incr_limit1;\n\tu8 rc_tgt_offset;\n\tu8 rc_buf_thresh[14];\n\t__be16 rc_range_parameters[15];\n\tu8 native_422_420;\n\tu8 second_line_bpg_offset;\n\t__be16 nsl_bpg_offset;\n\t__be16 second_line_offset_adj;\n\tu32 pps_long_94_reserved;\n\tu32 pps_long_98_reserved;\n\tu32 pps_long_102_reserved;\n\tu32 pps_long_106_reserved;\n\tu32 pps_long_110_reserved;\n\tu32 pps_long_114_reserved;\n\tu32 pps_long_118_reserved;\n\tu32 pps_long_122_reserved;\n\t__be16 pps_short_126_reserved;\n} __attribute__((packed));\n\nstruct edid;\n\nstruct drm_edid {\n\tsize_t size;\n\tconst struct edid *edid;\n};\n\nstruct drm_edid_ident {\n\tu32 panel_id;\n\tconst char *name;\n};\n\nstruct drm_edid_match_closure {\n\tconst struct drm_edid_ident *ident;\n\tbool matched;\n};\n\nstruct drm_edid_product_id {\n\t__be16 manufacturer_name;\n\t__le16 product_code;\n\t__le32 serial_number;\n\tu8 week_of_manufacture;\n\tu8 year_of_manufacture;\n} __attribute__((packed));\n\nstruct drm_encoder_funcs;\n\nstruct drm_encoder_helper_funcs;\n\nstruct drm_encoder {\n\tstruct drm_device *dev;\n\tstruct list_head head;\n\tstruct drm_mode_object base;\n\tchar *name;\n\tint encoder_type;\n\tunsigned int index;\n\tuint32_t possible_crtcs;\n\tuint32_t possible_clones;\n\tstruct drm_crtc *crtc;\n\tstruct list_head bridge_chain;\n\tconst struct drm_encoder_funcs *funcs;\n\tconst struct drm_encoder_helper_funcs *helper_private;\n\tstruct dentry *debugfs_entry;\n};\n\nstruct drm_encoder_funcs {\n\tvoid (*reset)(struct drm_encoder *);\n\tvoid (*destroy)(struct drm_encoder *);\n\tint (*late_register)(struct drm_encoder *);\n\tvoid (*early_unregister)(struct drm_encoder *);\n\tvoid (*debugfs_init)(struct drm_encoder *, struct dentry *);\n};\n\nstruct drm_encoder_helper_funcs {\n\tvoid (*dpms)(struct drm_encoder *, int);\n\tenum drm_mode_status (*mode_valid)(struct drm_encoder *, const struct drm_display_mode *);\n\tbool (*mode_fixup)(struct drm_encoder *, const struct drm_display_mode *, struct drm_display_mode *);\n\tvoid (*prepare)(struct drm_encoder *);\n\tvoid (*commit)(struct drm_encoder *);\n\tvoid (*mode_set)(struct drm_encoder *, struct drm_display_mode *, struct drm_display_mode *);\n\tvoid (*atomic_mode_set)(struct drm_encoder *, struct drm_crtc_state *, struct drm_connector_state *);\n\tenum drm_connector_status (*detect)(struct drm_encoder *, struct drm_connector *);\n\tvoid (*atomic_disable)(struct drm_encoder *, struct drm_atomic_state *);\n\tvoid (*atomic_enable)(struct drm_encoder *, struct drm_atomic_state *);\n\tvoid (*disable)(struct drm_encoder *);\n\tvoid (*enable)(struct drm_encoder *);\n\tint (*atomic_check)(struct drm_encoder *, struct drm_crtc_state *, struct drm_connector_state *);\n};\n\nstruct drm_encoder_slave_funcs;\n\nstruct drm_encoder_slave {\n\tstruct drm_encoder base;\n\tconst struct drm_encoder_slave_funcs *slave_funcs;\n\tvoid *slave_priv;\n\tvoid *bus_priv;\n};\n\nstruct drm_encoder_slave_funcs {\n\tvoid (*set_config)(struct drm_encoder *, void *);\n\tvoid (*destroy)(struct drm_encoder *);\n\tvoid (*dpms)(struct drm_encoder *, int);\n\tvoid (*save)(struct drm_encoder *);\n\tvoid (*restore)(struct drm_encoder *);\n\tbool (*mode_fixup)(struct drm_encoder *, const struct drm_display_mode *, struct drm_display_mode *);\n\tint (*mode_valid)(struct drm_encoder *, struct drm_display_mode *);\n\tvoid (*mode_set)(struct drm_encoder *, struct drm_display_mode *, struct drm_display_mode *);\n\tenum drm_connector_status (*detect)(struct drm_encoder *, struct drm_connector *);\n\tint (*get_modes)(struct drm_encoder *, struct drm_connector *);\n\tint (*create_resources)(struct drm_encoder *, struct drm_connector *);\n\tint (*set_property)(struct drm_encoder *, struct drm_connector *, struct drm_property *, uint64_t);\n};\n\nstruct drm_event {\n\t__u32 type;\n\t__u32 length;\n};\n\nstruct drm_event_crtc_sequence {\n\tstruct drm_event base;\n\t__u64 user_data;\n\t__s64 time_ns;\n\t__u64 sequence;\n};\n\nstruct drm_event_vblank {\n\tstruct drm_event base;\n\t__u64 user_data;\n\t__u32 tv_sec;\n\t__u32 tv_usec;\n\t__u32 sequence;\n\t__u32 crtc_id;\n};\n\nstruct ww_acquire_ctx {\n\tstruct task_struct *task;\n\tlong unsigned int stamp;\n\tunsigned int acquired;\n\tshort unsigned int wounded;\n\tshort unsigned int is_wait_die;\n};\n\nstruct drm_exec {\n\tu32 flags;\n\tstruct ww_acquire_ctx ticket;\n\tunsigned int num_objects;\n\tunsigned int max_objects;\n\tstruct drm_gem_object **objects;\n\tstruct drm_gem_object *contended;\n\tstruct drm_gem_object *prelocked;\n};\n\nstruct fb_info;\n\nstruct fb_deferred_io {\n\tlong unsigned int delay;\n\tbool sort_pagereflist;\n\tint open_count;\n\tstruct mutex lock;\n\tstruct list_head pagereflist;\n\tstruct page * (*get_page)(struct fb_info *, long unsigned int);\n\tvoid (*deferred_io)(struct fb_info *, struct list_head *);\n};\n\nstruct drm_fb_helper_funcs;\n\nstruct drm_fb_helper {\n\tstruct drm_client_dev client;\n\tstruct drm_client_buffer *buffer;\n\tstruct drm_framebuffer *fb;\n\tstruct drm_device *dev;\n\tconst struct drm_fb_helper_funcs *funcs;\n\tstruct fb_info *info;\n\tu32 pseudo_palette[17];\n\tstruct drm_clip_rect damage_clip;\n\tspinlock_t damage_lock;\n\tstruct work_struct damage_work;\n\tstruct work_struct resume_work;\n\tstruct mutex lock;\n\tstruct list_head kernel_fb_list;\n\tbool delayed_hotplug;\n\tbool deferred_setup;\n\tint preferred_bpp;\n\tstruct fb_deferred_io fbdefio;\n};\n\nstruct drm_fb_helper_surface_size;\n\nstruct drm_fb_helper_funcs {\n\tint (*fb_probe)(struct drm_fb_helper *, struct drm_fb_helper_surface_size *);\n\tint (*fb_dirty)(struct drm_fb_helper *, struct drm_clip_rect *);\n};\n\nstruct drm_fb_helper_surface_size {\n\tu32 fb_width;\n\tu32 fb_height;\n\tu32 surface_width;\n\tu32 surface_height;\n\tu32 surface_bpp;\n\tu32 surface_depth;\n};\n\nstruct drm_prime_file_private {\n\tstruct mutex lock;\n\tstruct rb_root dmabufs;\n\tstruct rb_root handles;\n};\n\nstruct drm_file {\n\tbool authenticated;\n\tbool stereo_allowed;\n\tbool universal_planes;\n\tbool atomic;\n\tbool aspect_ratio_allowed;\n\tbool writeback_connectors;\n\tbool was_master;\n\tbool is_master;\n\tbool supports_virtualized_cursor_plane;\n\tstruct drm_master *master;\n\tspinlock_t master_lookup_lock;\n\tstruct pid *pid;\n\tu64 client_id;\n\tdrm_magic_t magic;\n\tstruct list_head lhead;\n\tstruct drm_minor *minor;\n\tstruct idr object_idr;\n\tspinlock_t table_lock;\n\tstruct idr syncobj_idr;\n\tspinlock_t syncobj_table_lock;\n\tstruct file *filp;\n\tvoid *driver_priv;\n\tstruct list_head fbs;\n\tstruct mutex fbs_lock;\n\tstruct list_head blobs;\n\twait_queue_head_t event_wait;\n\tstruct list_head pending_event_list;\n\tstruct list_head event_list;\n\tint event_space;\n\tstruct mutex event_read_lock;\n\tstruct drm_prime_file_private prime;\n};\n\nstruct drm_flip_task {\n\tstruct list_head node;\n\tvoid *data;\n};\n\nstruct drm_flip_work;\n\ntypedef void (*drm_flip_func_t)(struct drm_flip_work *, void *);\n\nstruct drm_flip_work {\n\tconst char *name;\n\tdrm_flip_func_t func;\n\tstruct work_struct worker;\n\tstruct list_head queued;\n\tstruct list_head commited;\n\tspinlock_t lock;\n};\n\nstruct drm_format_conv_state {\n\tstruct {\n\t\tvoid *mem;\n\t\tsize_t size;\n\t\tbool preallocated;\n\t} tmp;\n};\n\nstruct drm_format_info {\n\tu32 format;\n\tu8 depth;\n\tu8 num_planes;\n\tunion {\n\t\tu8 cpp[4];\n\t\tu8 char_per_block[4];\n\t};\n\tu8 block_w[4];\n\tu8 block_h[4];\n\tu8 hsub;\n\tu8 vsub;\n\tbool has_alpha;\n\tbool is_yuv;\n\tbool is_color_indexed;\n};\n\nstruct drm_format_modifier {\n\t__u64 formats;\n\t__u32 offset;\n\t__u32 pad;\n\t__u64 modifier;\n};\n\nstruct drm_format_modifier_blob {\n\t__u32 version;\n\t__u32 flags;\n\t__u32 count_formats;\n\t__u32 formats_offset;\n\t__u32 count_modifiers;\n\t__u32 modifiers_offset;\n};\n\nstruct drm_framebuffer_funcs {\n\tvoid (*destroy)(struct drm_framebuffer *);\n\tint (*create_handle)(struct drm_framebuffer *, struct drm_file *, unsigned int *);\n\tint (*dirty)(struct drm_framebuffer *, struct drm_file *, unsigned int, unsigned int, struct drm_clip_rect *, unsigned int);\n};\n\nstruct drm_gem_close {\n\t__u32 handle;\n\t__u32 pad;\n};\n\nstruct drm_gem_flink {\n\t__u32 handle;\n\t__u32 name;\n};\n\nstruct drm_gem_lru {\n\tstruct mutex *lock;\n\tlong int count;\n\tstruct list_head list;\n};\n\nstruct drm_mm;\n\nstruct drm_mm_node {\n\tlong unsigned int color;\n\tu64 start;\n\tu64 size;\n\tstruct drm_mm *mm;\n\tstruct list_head node_list;\n\tstruct list_head hole_stack;\n\tstruct rb_node rb;\n\tstruct rb_node rb_hole_size;\n\tstruct rb_node rb_hole_addr;\n\tu64 __subtree_last;\n\tu64 hole_size;\n\tu64 subtree_max_hole;\n\tlong unsigned int flags;\n};\n\nstruct drm_vma_offset_node {\n\trwlock_t vm_lock;\n\tstruct drm_mm_node vm_node;\n\tstruct rb_root vm_files;\n\tvoid *driver_private;\n};\n\nstruct drm_gem_object_funcs;\n\nstruct drm_gem_object {\n\tstruct kref refcount;\n\tunsigned int handle_count;\n\tstruct drm_device *dev;\n\tstruct file *filp;\n\tstruct drm_vma_offset_node vma_node;\n\tsize_t size;\n\tint name;\n\tstruct dma_buf *dma_buf;\n\tstruct dma_buf_attachment *import_attach;\n\tstruct dma_resv *resv;\n\tstruct dma_resv _resv;\n\tstruct {\n\t\tstruct list_head list;\n\t} gpuva;\n\tconst struct drm_gem_object_funcs *funcs;\n\tstruct list_head lru_node;\n\tstruct drm_gem_lru *lru;\n};\n\nstruct drm_gem_object_funcs {\n\tvoid (*free)(struct drm_gem_object *);\n\tint (*open)(struct drm_gem_object *, struct drm_file *);\n\tvoid (*close)(struct drm_gem_object *, struct drm_file *);\n\tvoid (*print_info)(struct drm_printer *, unsigned int, const struct drm_gem_object *);\n\tstruct dma_buf * (*export)(struct drm_gem_object *, int);\n\tint (*pin)(struct drm_gem_object *);\n\tvoid (*unpin)(struct drm_gem_object *);\n\tstruct sg_table * (*get_sg_table)(struct drm_gem_object *);\n\tint (*vmap)(struct drm_gem_object *, struct iosys_map *);\n\tvoid (*vunmap)(struct drm_gem_object *, struct iosys_map *);\n\tint (*mmap)(struct drm_gem_object *, struct vm_area_struct *);\n\tint (*evict)(struct drm_gem_object *);\n\tenum drm_gem_object_status (*status)(struct drm_gem_object *);\n\tsize_t (*rss)(struct drm_gem_object *);\n\tconst struct vm_operations_struct *vm_ops;\n};\n\nstruct drm_gem_open {\n\t__u32 name;\n\t__u32 handle;\n\t__u64 size;\n};\n\nstruct drm_gem_shmem_object {\n\tstruct drm_gem_object base;\n\tstruct page **pages;\n\tunsigned int pages_use_count;\n\tint madv;\n\tstruct list_head madv_list;\n\tstruct sg_table *sgt;\n\tvoid *vaddr;\n\tunsigned int vmap_use_count;\n\tbool pages_mark_dirty_on_put: 1;\n\tbool pages_mark_accessed_on_put: 1;\n\tbool map_wc: 1;\n};\n\nstruct drm_get_cap {\n\t__u64 capability;\n\t__u64 value;\n};\n\nstruct drm_gpuvm;\n\nstruct drm_gpuvm_bo;\n\nstruct drm_gpuva {\n\tstruct drm_gpuvm *vm;\n\tstruct drm_gpuvm_bo *vm_bo;\n\tenum drm_gpuva_flags flags;\n\tstruct {\n\t\tu64 addr;\n\t\tu64 range;\n\t} va;\n\tstruct {\n\t\tu64 offset;\n\t\tstruct drm_gem_object *obj;\n\t\tstruct list_head entry;\n\t} gem;\n\tstruct {\n\t\tstruct rb_node node;\n\t\tstruct list_head entry;\n\t\tu64 __subtree_last;\n\t} rb;\n};\n\nstruct drm_gpuva_op_map {\n\tstruct {\n\t\tu64 addr;\n\t\tu64 range;\n\t} va;\n\tstruct {\n\t\tu64 offset;\n\t\tstruct drm_gem_object *obj;\n\t} gem;\n};\n\nstruct drm_gpuva_op_unmap;\n\nstruct drm_gpuva_op_remap {\n\tstruct drm_gpuva_op_map *prev;\n\tstruct drm_gpuva_op_map *next;\n\tstruct drm_gpuva_op_unmap *unmap;\n};\n\nstruct drm_gpuva_op_unmap {\n\tstruct drm_gpuva *va;\n\tbool keep;\n};\n\nstruct drm_gpuva_op_prefetch {\n\tstruct drm_gpuva *va;\n};\n\nstruct drm_gpuva_op {\n\tstruct list_head entry;\n\tenum drm_gpuva_op_type op;\n\tunion {\n\t\tstruct drm_gpuva_op_map map;\n\t\tstruct drm_gpuva_op_remap remap;\n\t\tstruct drm_gpuva_op_unmap unmap;\n\t\tstruct drm_gpuva_op_prefetch prefetch;\n\t};\n};\n\nstruct drm_gpuvm_ops;\n\nstruct drm_gpuvm {\n\tconst char *name;\n\tenum drm_gpuvm_flags flags;\n\tstruct drm_device *drm;\n\tu64 mm_start;\n\tu64 mm_range;\n\tstruct {\n\t\tstruct rb_root_cached tree;\n\t\tstruct list_head list;\n\t} rb;\n\tstruct kref kref;\n\tstruct drm_gpuva kernel_alloc_node;\n\tconst struct drm_gpuvm_ops *ops;\n\tstruct drm_gem_object *r_obj;\n\tstruct {\n\t\tstruct list_head list;\n\t\tstruct list_head *local_list;\n\t\tspinlock_t lock;\n\t} extobj;\n\tstruct {\n\t\tstruct list_head list;\n\t\tstruct list_head *local_list;\n\t\tspinlock_t lock;\n\t} evict;\n};\n\nstruct drm_gpuvm_bo {\n\tstruct drm_gpuvm *vm;\n\tstruct drm_gem_object *obj;\n\tbool evicted;\n\tstruct kref kref;\n\tstruct {\n\t\tstruct list_head gpuva;\n\t\tstruct {\n\t\t\tstruct list_head gem;\n\t\t\tstruct list_head extobj;\n\t\t\tstruct list_head evict;\n\t\t} entry;\n\t} list;\n};\n\nstruct drm_gpuvm_ops {\n\tvoid (*vm_free)(struct drm_gpuvm *);\n\tstruct drm_gpuva_op * (*op_alloc)(void);\n\tvoid (*op_free)(struct drm_gpuva_op *);\n\tstruct drm_gpuvm_bo * (*vm_bo_alloc)(void);\n\tvoid (*vm_bo_free)(struct drm_gpuvm_bo *);\n\tint (*vm_bo_validate)(struct drm_gpuvm_bo *, struct drm_exec *);\n\tint (*sm_step_map)(struct drm_gpuva_op *, void *);\n\tint (*sm_step_remap)(struct drm_gpuva_op *, void *);\n\tint (*sm_step_unmap)(struct drm_gpuva_op *, void *);\n};\n\nstruct i2c_device_id;\n\nstruct i2c_board_info;\n\nstruct i2c_driver {\n\tunsigned int class;\n\tint (*probe)(struct i2c_client *);\n\tvoid (*remove)(struct i2c_client *);\n\tvoid (*shutdown)(struct i2c_client *);\n\tvoid (*alert)(struct i2c_client *, enum i2c_alert_protocol, unsigned int);\n\tint (*command)(struct i2c_client *, unsigned int, void *);\n\tstruct device_driver driver;\n\tconst struct i2c_device_id *id_table;\n\tint (*detect)(struct i2c_client *, struct i2c_board_info *);\n\tconst short unsigned int *address_list;\n\tstruct list_head clients;\n\tu32 flags;\n};\n\nstruct drm_i2c_encoder_driver {\n\tstruct i2c_driver i2c_driver;\n\tint (*encoder_init)(struct i2c_client *, struct drm_device *, struct drm_encoder_slave *);\n};\n\nstruct drm_info_list {\n\tconst char *name;\n\tint (*show)(struct seq_file *, void *);\n\tu32 driver_features;\n\tvoid *data;\n};\n\nstruct drm_info_node {\n\tstruct drm_minor *minor;\n\tconst struct drm_info_list *info_ent;\n\tstruct list_head list;\n\tstruct dentry *dent;\n};\n\ntypedef int drm_ioctl_t(struct drm_device *, void *, struct drm_file *);\n\nstruct drm_ioctl_desc {\n\tunsigned int cmd;\n\tenum drm_ioctl_flags flags;\n\tdrm_ioctl_t *func;\n\tconst char *name;\n};\n\nstruct drm_master {\n\tstruct kref refcount;\n\tstruct drm_device *dev;\n\tchar *unique;\n\tint unique_len;\n\tstruct idr magic_map;\n\tvoid *driver_priv;\n\tstruct drm_master *lessor;\n\tint lessee_id;\n\tstruct list_head lessee_list;\n\tstruct list_head lessees;\n\tstruct idr leases;\n\tstruct idr lessee_idr;\n};\n\nstruct drm_memory_stats {\n\tu64 shared;\n\tu64 private;\n\tu64 resident;\n\tu64 purgeable;\n\tu64 active;\n};\n\nstruct drm_minor {\n\tint index;\n\tint type;\n\tstruct device *kdev;\n\tstruct drm_device *dev;\n\tstruct dentry *debugfs_symlink;\n\tstruct dentry *debugfs_root;\n};\n\nstruct drm_mm {\n\tvoid (*color_adjust)(const struct drm_mm_node *, long unsigned int, u64 *, u64 *);\n\tstruct list_head hole_stack;\n\tstruct drm_mm_node head_node;\n\tstruct rb_root_cached interval_tree;\n\tstruct rb_root_cached holes_size;\n\tstruct rb_root holes_addr;\n\tlong unsigned int scan_active;\n};\n\nstruct drm_mm_scan {\n\tstruct drm_mm *mm;\n\tu64 size;\n\tu64 alignment;\n\tu64 remainder_mask;\n\tu64 range_start;\n\tu64 range_end;\n\tu64 hit_start;\n\tu64 hit_end;\n\tlong unsigned int color;\n\tenum drm_mm_insert_mode mode;\n};\n\nstruct drm_mode_atomic {\n\t__u32 flags;\n\t__u32 count_objs;\n\t__u64 objs_ptr;\n\t__u64 count_props_ptr;\n\t__u64 props_ptr;\n\t__u64 prop_values_ptr;\n\t__u64 reserved;\n\t__u64 user_data;\n};\n\nstruct drm_mode_card_res {\n\t__u64 fb_id_ptr;\n\t__u64 crtc_id_ptr;\n\t__u64 connector_id_ptr;\n\t__u64 encoder_id_ptr;\n\t__u32 count_fbs;\n\t__u32 count_crtcs;\n\t__u32 count_connectors;\n\t__u32 count_encoders;\n\t__u32 min_width;\n\t__u32 max_width;\n\t__u32 min_height;\n\t__u32 max_height;\n};\n\nstruct drm_mode_closefb {\n\t__u32 fb_id;\n\t__u32 pad;\n};\n\nstruct drm_mode_fb_cmd2;\n\nstruct drm_mode_config_funcs {\n\tstruct drm_framebuffer * (*fb_create)(struct drm_device *, struct drm_file *, const struct drm_mode_fb_cmd2 *);\n\tconst struct drm_format_info * (*get_format_info)(const struct drm_mode_fb_cmd2 *);\n\tvoid (*output_poll_changed)(struct drm_device *);\n\tenum drm_mode_status (*mode_valid)(struct drm_device *, const struct drm_display_mode *);\n\tint (*atomic_check)(struct drm_device *, struct drm_atomic_state *);\n\tint (*atomic_commit)(struct drm_device *, struct drm_atomic_state *, bool);\n\tstruct drm_atomic_state * (*atomic_state_alloc)(struct drm_device *);\n\tvoid (*atomic_state_clear)(struct drm_atomic_state *);\n\tvoid (*atomic_state_free)(struct drm_atomic_state *);\n};\n\nstruct drm_mode_config_helper_funcs {\n\tvoid (*atomic_commit_tail)(struct drm_atomic_state *);\n\tint (*atomic_commit_setup)(struct drm_atomic_state *);\n};\n\nstruct drm_mode_connector_set_property {\n\t__u64 value;\n\t__u32 prop_id;\n\t__u32 connector_id;\n};\n\nstruct drm_mode_create_blob {\n\t__u64 data;\n\t__u32 length;\n\t__u32 blob_id;\n};\n\nstruct drm_mode_create_dumb {\n\t__u32 height;\n\t__u32 width;\n\t__u32 bpp;\n\t__u32 flags;\n\t__u32 handle;\n\t__u32 pitch;\n\t__u64 size;\n};\n\nstruct drm_mode_create_lease {\n\t__u64 object_ids;\n\t__u32 object_count;\n\t__u32 flags;\n\t__u32 lessee_id;\n\t__u32 fd;\n};\n\nstruct drm_mode_modeinfo {\n\t__u32 clock;\n\t__u16 hdisplay;\n\t__u16 hsync_start;\n\t__u16 hsync_end;\n\t__u16 htotal;\n\t__u16 hskew;\n\t__u16 vdisplay;\n\t__u16 vsync_start;\n\t__u16 vsync_end;\n\t__u16 vtotal;\n\t__u16 vscan;\n\t__u32 vrefresh;\n\t__u32 flags;\n\t__u32 type;\n\tchar name[32];\n};\n\nstruct drm_mode_crtc {\n\t__u64 set_connectors_ptr;\n\t__u32 count_connectors;\n\t__u32 crtc_id;\n\t__u32 fb_id;\n\t__u32 x;\n\t__u32 y;\n\t__u32 gamma_size;\n\t__u32 mode_valid;\n\tstruct drm_mode_modeinfo mode;\n};\n\nstruct drm_mode_crtc_lut {\n\t__u32 crtc_id;\n\t__u32 gamma_size;\n\t__u64 red;\n\t__u64 green;\n\t__u64 blue;\n};\n\nstruct drm_mode_crtc_page_flip_target {\n\t__u32 crtc_id;\n\t__u32 fb_id;\n\t__u32 flags;\n\t__u32 sequence;\n\t__u64 user_data;\n};\n\nstruct drm_mode_cursor {\n\t__u32 flags;\n\t__u32 crtc_id;\n\t__s32 x;\n\t__s32 y;\n\t__u32 width;\n\t__u32 height;\n\t__u32 handle;\n};\n\nstruct drm_mode_cursor2 {\n\t__u32 flags;\n\t__u32 crtc_id;\n\t__s32 x;\n\t__s32 y;\n\t__u32 width;\n\t__u32 height;\n\t__u32 handle;\n\t__s32 hot_x;\n\t__s32 hot_y;\n};\n\nstruct drm_mode_destroy_blob {\n\t__u32 blob_id;\n};\n\nstruct drm_mode_destroy_dumb {\n\t__u32 handle;\n};\n\nstruct drm_mode_fb_cmd {\n\t__u32 fb_id;\n\t__u32 width;\n\t__u32 height;\n\t__u32 pitch;\n\t__u32 bpp;\n\t__u32 depth;\n\t__u32 handle;\n};\n\nstruct drm_mode_fb_cmd2 {\n\t__u32 fb_id;\n\t__u32 width;\n\t__u32 height;\n\t__u32 pixel_format;\n\t__u32 flags;\n\t__u32 handles[4];\n\t__u32 pitches[4];\n\t__u32 offsets[4];\n\t__u64 modifier[4];\n};\n\nstruct drm_mode_fb_cmd232 {\n\tu32 fb_id;\n\tu32 width;\n\tu32 height;\n\tu32 pixel_format;\n\tu32 flags;\n\tu32 handles[4];\n\tu32 pitches[4];\n\tu32 offsets[4];\n\tu64 modifier[4];\n} __attribute__((packed));\n\nstruct drm_mode_fb_dirty_cmd {\n\t__u32 fb_id;\n\t__u32 flags;\n\t__u32 color;\n\t__u32 num_clips;\n\t__u64 clips_ptr;\n};\n\nstruct drm_mode_get_blob {\n\t__u32 blob_id;\n\t__u32 length;\n\t__u64 data;\n};\n\nstruct drm_mode_get_connector {\n\t__u64 encoders_ptr;\n\t__u64 modes_ptr;\n\t__u64 props_ptr;\n\t__u64 prop_values_ptr;\n\t__u32 count_modes;\n\t__u32 count_props;\n\t__u32 count_encoders;\n\t__u32 encoder_id;\n\t__u32 connector_id;\n\t__u32 connector_type;\n\t__u32 connector_type_id;\n\t__u32 connection;\n\t__u32 mm_width;\n\t__u32 mm_height;\n\t__u32 subpixel;\n\t__u32 pad;\n};\n\nstruct drm_mode_get_encoder {\n\t__u32 encoder_id;\n\t__u32 encoder_type;\n\t__u32 crtc_id;\n\t__u32 possible_crtcs;\n\t__u32 possible_clones;\n};\n\nstruct drm_mode_get_lease {\n\t__u32 count_objects;\n\t__u32 pad;\n\t__u64 objects_ptr;\n};\n\nstruct drm_mode_get_plane {\n\t__u32 plane_id;\n\t__u32 crtc_id;\n\t__u32 fb_id;\n\t__u32 possible_crtcs;\n\t__u32 gamma_size;\n\t__u32 count_format_types;\n\t__u64 format_type_ptr;\n};\n\nstruct drm_mode_get_plane_res {\n\t__u64 plane_id_ptr;\n\t__u32 count_planes;\n};\n\nstruct drm_mode_get_property {\n\t__u64 values_ptr;\n\t__u64 enum_blob_ptr;\n\t__u32 prop_id;\n\t__u32 flags;\n\tchar name[32];\n\t__u32 count_values;\n\t__u32 count_enum_blobs;\n};\n\nstruct drm_mode_list_lessees {\n\t__u32 count_lessees;\n\t__u32 pad;\n\t__u64 lessees_ptr;\n};\n\nstruct drm_mode_map_dumb {\n\t__u32 handle;\n\t__u32 pad;\n\t__u64 offset;\n};\n\nstruct drm_mode_obj_get_properties {\n\t__u64 props_ptr;\n\t__u64 prop_values_ptr;\n\t__u32 count_props;\n\t__u32 obj_id;\n\t__u32 obj_type;\n};\n\nstruct drm_mode_obj_set_property {\n\t__u64 value;\n\t__u32 prop_id;\n\t__u32 obj_id;\n\t__u32 obj_type;\n};\n\nstruct drm_mode_property_enum {\n\t__u64 value;\n\tchar name[32];\n};\n\nstruct drm_mode_rect {\n\t__s32 x1;\n\t__s32 y1;\n\t__s32 x2;\n\t__s32 y2;\n};\n\nstruct drm_mode_revoke_lease {\n\t__u32 lessee_id;\n};\n\nstruct drm_mode_rmfb_work {\n\tstruct work_struct work;\n\tstruct list_head fbs;\n};\n\nstruct drm_mode_set {\n\tstruct drm_framebuffer *fb;\n\tstruct drm_crtc *crtc;\n\tstruct drm_display_mode *mode;\n\tuint32_t x;\n\tuint32_t y;\n\tstruct drm_connector **connectors;\n\tsize_t num_connectors;\n};\n\nstruct drm_mode_set_plane {\n\t__u32 plane_id;\n\t__u32 crtc_id;\n\t__u32 fb_id;\n\t__u32 flags;\n\t__s32 crtc_x;\n\t__s32 crtc_y;\n\t__u32 crtc_w;\n\t__u32 crtc_h;\n\t__u32 src_x;\n\t__u32 src_y;\n\t__u32 src_h;\n\t__u32 src_w;\n};\n\nstruct drm_modeset_acquire_ctx {\n\tstruct ww_acquire_ctx ww_ctx;\n\tstruct drm_modeset_lock *contended;\n\tdepot_stack_handle_t stack_depot;\n\tstruct list_head locked;\n\tbool trylock_only;\n\tbool interruptible;\n};\n\nstruct drm_named_mode {\n\tconst char *name;\n\tunsigned int pixel_clock_khz;\n\tunsigned int xres;\n\tunsigned int yres;\n\tunsigned int flags;\n\tunsigned int tv_mode;\n};\n\nstruct sync_file;\n\nstruct drm_out_fence_state {\n\ts32 *out_fence_ptr;\n\tstruct sync_file *sync_file;\n\tint fd;\n};\n\nstruct drm_panel_funcs;\n\nstruct drm_panel {\n\tstruct device *dev;\n\tstruct backlight_device *backlight;\n\tconst struct drm_panel_funcs *funcs;\n\tint connector_type;\n\tstruct list_head list;\n\tstruct list_head followers;\n\tstruct mutex follower_lock;\n\tbool prepare_prev_first;\n\tbool prepared;\n\tbool enabled;\n};\n\nstruct drm_panel_follower_funcs;\n\nstruct drm_panel_follower {\n\tconst struct drm_panel_follower_funcs *funcs;\n\tstruct list_head list;\n\tstruct drm_panel *panel;\n};\n\nstruct drm_panel_follower_funcs {\n\tint (*panel_prepared)(struct drm_panel_follower *);\n\tint (*panel_unpreparing)(struct drm_panel_follower *);\n};\n\nstruct drm_panel_funcs {\n\tint (*prepare)(struct drm_panel *);\n\tint (*enable)(struct drm_panel *);\n\tint (*disable)(struct drm_panel *);\n\tint (*unprepare)(struct drm_panel *);\n\tint (*get_modes)(struct drm_panel *, struct drm_connector *);\n\tenum drm_panel_orientation (*get_orientation)(struct drm_panel *);\n\tint (*get_timings)(struct drm_panel *, unsigned int, struct display_timing *);\n\tvoid (*debugfs_init)(struct drm_panel *, struct dentry *);\n};\n\nstruct drm_pending_event {\n\tstruct completion *completion;\n\tvoid (*completion_release)(struct completion *);\n\tstruct drm_event *event;\n\tstruct dma_fence *fence;\n\tstruct drm_file *file_priv;\n\tstruct list_head link;\n\tstruct list_head pending_link;\n};\n\nstruct drm_pending_vblank_event {\n\tstruct drm_pending_event base;\n\tunsigned int pipe;\n\tu64 sequence;\n\tunion {\n\t\tstruct drm_event base;\n\t\tstruct drm_event_vblank vbl;\n\t\tstruct drm_event_crtc_sequence seq;\n\t} event;\n};\n\nstruct kmsg_dumper {\n\tstruct list_head list;\n\tvoid (*dump)(struct kmsg_dumper *, enum kmsg_dump_reason);\n\tenum kmsg_dump_reason max_reason;\n\tbool registered;\n};\n\nstruct drm_plane_funcs;\n\nstruct drm_plane_helper_funcs;\n\nstruct drm_plane {\n\tstruct drm_device *dev;\n\tstruct list_head head;\n\tchar *name;\n\tstruct drm_modeset_lock mutex;\n\tstruct drm_mode_object base;\n\tuint32_t possible_crtcs;\n\tuint32_t *format_types;\n\tunsigned int format_count;\n\tbool format_default;\n\tuint64_t *modifiers;\n\tunsigned int modifier_count;\n\tstruct drm_crtc *crtc;\n\tstruct drm_framebuffer *fb;\n\tstruct drm_framebuffer *old_fb;\n\tconst struct drm_plane_funcs *funcs;\n\tstruct drm_object_properties properties;\n\tenum drm_plane_type type;\n\tunsigned int index;\n\tconst struct drm_plane_helper_funcs *helper_private;\n\tstruct drm_plane_state *state;\n\tstruct drm_property *alpha_property;\n\tstruct drm_property *zpos_property;\n\tstruct drm_property *rotation_property;\n\tstruct drm_property *blend_mode_property;\n\tstruct drm_property *color_encoding_property;\n\tstruct drm_property *color_range_property;\n\tstruct drm_property *scaling_filter_property;\n\tstruct drm_property *hotspot_x_property;\n\tstruct drm_property *hotspot_y_property;\n\tstruct kmsg_dumper kmsg_panic;\n};\n\nstruct drm_plane_funcs {\n\tint (*update_plane)(struct drm_plane *, struct drm_crtc *, struct drm_framebuffer *, int, int, unsigned int, unsigned int, uint32_t, uint32_t, uint32_t, uint32_t, struct drm_modeset_acquire_ctx *);\n\tint (*disable_plane)(struct drm_plane *, struct drm_modeset_acquire_ctx *);\n\tvoid (*destroy)(struct drm_plane *);\n\tvoid (*reset)(struct drm_plane *);\n\tint (*set_property)(struct drm_plane *, struct drm_property *, uint64_t);\n\tstruct drm_plane_state * (*atomic_duplicate_state)(struct drm_plane *);\n\tvoid (*atomic_destroy_state)(struct drm_plane *, struct drm_plane_state *);\n\tint (*atomic_set_property)(struct drm_plane *, struct drm_plane_state *, struct drm_property *, uint64_t);\n\tint (*atomic_get_property)(struct drm_plane *, const struct drm_plane_state *, struct drm_property *, uint64_t *);\n\tint (*late_register)(struct drm_plane *);\n\tvoid (*early_unregister)(struct drm_plane *);\n\tvoid (*atomic_print_state)(struct drm_printer *, const struct drm_plane_state *);\n\tbool (*format_mod_supported)(struct drm_plane *, uint32_t, uint64_t);\n};\n\nstruct drm_scanout_buffer;\n\nstruct drm_plane_helper_funcs {\n\tint (*prepare_fb)(struct drm_plane *, struct drm_plane_state *);\n\tvoid (*cleanup_fb)(struct drm_plane *, struct drm_plane_state *);\n\tint (*begin_fb_access)(struct drm_plane *, struct drm_plane_state *);\n\tvoid (*end_fb_access)(struct drm_plane *, struct drm_plane_state *);\n\tint (*atomic_check)(struct drm_plane *, struct drm_atomic_state *);\n\tvoid (*atomic_update)(struct drm_plane *, struct drm_atomic_state *);\n\tvoid (*atomic_enable)(struct drm_plane *, struct drm_atomic_state *);\n\tvoid (*atomic_disable)(struct drm_plane *, struct drm_atomic_state *);\n\tint (*atomic_async_check)(struct drm_plane *, struct drm_atomic_state *);\n\tvoid (*atomic_async_update)(struct drm_plane *, struct drm_atomic_state *);\n\tint (*get_scanout_buffer)(struct drm_plane *, struct drm_scanout_buffer *);\n\tvoid (*panic_flush)(struct drm_plane *);\n};\n\nstruct drm_plane_size_hint {\n\t__u16 width;\n\t__u16 height;\n};\n\nstruct drm_plane_state {\n\tstruct drm_plane *plane;\n\tstruct drm_crtc *crtc;\n\tstruct drm_framebuffer *fb;\n\tstruct dma_fence *fence;\n\tint32_t crtc_x;\n\tint32_t crtc_y;\n\tuint32_t crtc_w;\n\tuint32_t crtc_h;\n\tuint32_t src_x;\n\tuint32_t src_y;\n\tuint32_t src_h;\n\tuint32_t src_w;\n\tint32_t hotspot_x;\n\tint32_t hotspot_y;\n\tu16 alpha;\n\tuint16_t pixel_blend_mode;\n\tunsigned int rotation;\n\tunsigned int zpos;\n\tunsigned int normalized_zpos;\n\tenum drm_color_encoding color_encoding;\n\tenum drm_color_range color_range;\n\tstruct drm_property_blob *fb_damage_clips;\n\tbool ignore_damage_clips;\n\tstruct drm_rect src;\n\tstruct drm_rect dst;\n\tbool visible;\n\tenum drm_scaling_filter scaling_filter;\n\tstruct drm_crtc_commit *commit;\n\tstruct drm_atomic_state *state;\n\tbool color_mgmt_changed: 1;\n};\n\nstruct drm_prime_handle {\n\t__u32 handle;\n\t__u32 flags;\n\t__s32 fd;\n};\n\nstruct drm_prime_member {\n\tstruct dma_buf *dma_buf;\n\tuint32_t handle;\n\tstruct rb_node dmabuf_rb;\n\tstruct rb_node handle_rb;\n};\n\nstruct drm_print_iterator {\n\tvoid *data;\n\tssize_t start;\n\tssize_t remain;\n\tssize_t offset;\n};\n\nstruct va_format;\n\nstruct drm_printer {\n\tvoid (*printfn)(struct drm_printer *, struct va_format *);\n\tvoid (*puts)(struct drm_printer *, const char *);\n\tvoid *arg;\n\tconst void *origin;\n\tconst char *prefix;\n\tenum drm_debug_category category;\n};\n\nstruct drm_privacy_screen_ops;\n\nstruct drm_privacy_screen {\n\tstruct device dev;\n\tstruct mutex lock;\n\tstruct list_head list;\n\tstruct blocking_notifier_head notifier_head;\n\tconst struct drm_privacy_screen_ops *ops;\n\tenum drm_privacy_screen_status sw_state;\n\tenum drm_privacy_screen_status hw_state;\n\tvoid *drvdata;\n};\n\nstruct drm_privacy_screen_ops {\n\tint (*set_sw_state)(struct drm_privacy_screen *, enum drm_privacy_screen_status);\n\tvoid (*get_hw_state)(struct drm_privacy_screen *);\n};\n\nstruct drm_private_state_funcs {\n\tstruct drm_private_state * (*atomic_duplicate_state)(struct drm_private_obj *);\n\tvoid (*atomic_destroy_state)(struct drm_private_obj *, struct drm_private_state *);\n\tvoid (*atomic_print_state)(struct drm_printer *, const struct drm_private_state *);\n};\n\nstruct drm_prop_enum_list {\n\tint type;\n\tconst char *name;\n};\n\nstruct drm_property {\n\tstruct list_head head;\n\tstruct drm_mode_object base;\n\tuint32_t flags;\n\tchar name[32];\n\tuint32_t num_values;\n\tuint64_t *values;\n\tstruct drm_device *dev;\n\tstruct list_head enum_list;\n};\n\nstruct drm_property_blob {\n\tstruct drm_mode_object base;\n\tstruct drm_device *dev;\n\tstruct list_head head_global;\n\tstruct list_head head_file;\n\tsize_t length;\n\tvoid *data;\n};\n\nstruct drm_property_enum {\n\tuint64_t value;\n\tstruct list_head head;\n\tchar name[32];\n};\n\nstruct drm_scanout_buffer {\n\tconst struct drm_format_info *format;\n\tstruct iosys_map map[4];\n\tunsigned int width;\n\tunsigned int height;\n\tunsigned int pitch[4];\n\tvoid (*set_pixel)(struct drm_scanout_buffer *, unsigned int, unsigned int, u32);\n};\n\nstruct ewma_psr_time {\n\tlong unsigned int internal;\n};\n\nstruct drm_self_refresh_data {\n\tstruct drm_crtc *crtc;\n\tstruct delayed_work entry_work;\n\tstruct mutex avg_mutex;\n\tstruct ewma_psr_time entry_avg_ms;\n\tstruct ewma_psr_time exit_avg_ms;\n};\n\nstruct drm_set_client_cap {\n\t__u64 capability;\n\t__u64 value;\n};\n\nstruct drm_set_version {\n\tint drm_di_major;\n\tint drm_di_minor;\n\tint drm_dd_major;\n\tint drm_dd_minor;\n};\n\nstruct drm_shadow_plane_state {\n\tstruct drm_plane_state base;\n\tstruct drm_format_conv_state fmtcnv_state;\n\tstruct iosys_map map[4];\n\tstruct iosys_map data[4];\n};\n\nstruct drm_simple_display_pipe_funcs;\n\nstruct drm_simple_display_pipe {\n\tstruct drm_crtc crtc;\n\tstruct drm_plane plane;\n\tstruct drm_encoder encoder;\n\tstruct drm_connector *connector;\n\tconst struct drm_simple_display_pipe_funcs *funcs;\n};\n\nstruct drm_simple_display_pipe_funcs {\n\tenum drm_mode_status (*mode_valid)(struct drm_simple_display_pipe *, const struct drm_display_mode *);\n\tvoid (*enable)(struct drm_simple_display_pipe *, struct drm_crtc_state *, struct drm_plane_state *);\n\tvoid (*disable)(struct drm_simple_display_pipe *);\n\tint (*check)(struct drm_simple_display_pipe *, struct drm_plane_state *, struct drm_crtc_state *);\n\tvoid (*update)(struct drm_simple_display_pipe *, struct drm_plane_state *);\n\tint (*prepare_fb)(struct drm_simple_display_pipe *, struct drm_plane_state *);\n\tvoid (*cleanup_fb)(struct drm_simple_display_pipe *, struct drm_plane_state *);\n\tint (*begin_fb_access)(struct drm_simple_display_pipe *, struct drm_plane_state *);\n\tvoid (*end_fb_access)(struct drm_simple_display_pipe *, struct drm_plane_state *);\n\tint (*enable_vblank)(struct drm_simple_display_pipe *);\n\tvoid (*disable_vblank)(struct drm_simple_display_pipe *);\n\tvoid (*reset_crtc)(struct drm_simple_display_pipe *);\n\tstruct drm_crtc_state * (*duplicate_crtc_state)(struct drm_simple_display_pipe *);\n\tvoid (*destroy_crtc_state)(struct drm_simple_display_pipe *, struct drm_crtc_state *);\n\tvoid (*reset_plane)(struct drm_simple_display_pipe *);\n\tstruct drm_plane_state * (*duplicate_plane_state)(struct drm_simple_display_pipe *);\n\tvoid (*destroy_plane_state)(struct drm_simple_display_pipe *, struct drm_plane_state *);\n};\n\nstruct drm_stats {\n\tlong unsigned int count;\n\tstruct {\n\t\tlong unsigned int value;\n\t\tenum drm_stat_type type;\n\t} data[15];\n};\n\nstruct drm_stats32 {\n\tu32 count;\n\tstruct {\n\t\tu32 value;\n\t\tenum drm_stat_type type;\n\t} data[15];\n};\n\ntypedef struct drm_stats32 drm_stats32_t;\n\nstruct drm_syncobj {\n\tstruct kref refcount;\n\tstruct dma_fence *fence;\n\tstruct list_head cb_list;\n\tstruct list_head ev_fd_list;\n\tspinlock_t lock;\n\tstruct file *file;\n};\n\nstruct drm_syncobj_array {\n\t__u64 handles;\n\t__u32 count_handles;\n\t__u32 pad;\n};\n\nstruct drm_syncobj_create {\n\t__u32 handle;\n\t__u32 flags;\n};\n\nstruct drm_syncobj_destroy {\n\t__u32 handle;\n\t__u32 pad;\n};\n\nstruct drm_syncobj_eventfd {\n\t__u32 handle;\n\t__u32 flags;\n\t__u64 point;\n\t__s32 fd;\n\t__u32 pad;\n};\n\nstruct drm_syncobj_handle {\n\t__u32 handle;\n\t__u32 flags;\n\t__s32 fd;\n\t__u32 pad;\n};\n\nstruct drm_syncobj_timeline_array {\n\t__u64 handles;\n\t__u64 points;\n\t__u32 count_handles;\n\t__u32 flags;\n};\n\nstruct drm_syncobj_timeline_wait {\n\t__u64 handles;\n\t__u64 points;\n\t__s64 timeout_nsec;\n\t__u32 count_handles;\n\t__u32 flags;\n\t__u32 first_signaled;\n\t__u32 pad;\n\t__u64 deadline_nsec;\n};\n\nstruct drm_syncobj_transfer {\n\t__u32 src_handle;\n\t__u32 dst_handle;\n\t__u64 src_point;\n\t__u64 dst_point;\n\t__u32 flags;\n\t__u32 pad;\n};\n\nstruct drm_syncobj_wait {\n\t__u64 handles;\n\t__s64 timeout_nsec;\n\t__u32 count_handles;\n\t__u32 flags;\n\t__u32 first_signaled;\n\t__u32 pad;\n\t__u64 deadline_nsec;\n};\n\nstruct drm_tile_group {\n\tstruct kref refcount;\n\tstruct drm_device *dev;\n\tint id;\n\tu8 group_data[8];\n};\n\nstruct drm_unique {\n\t__kernel_size_t unique_len;\n\tchar *unique;\n};\n\nstruct drm_unique32 {\n\tu32 unique_len;\n\tu32 unique;\n};\n\ntypedef struct drm_unique32 drm_unique32_t;\n\nstruct drm_vblank_crtc {\n\tstruct drm_device *dev;\n\twait_queue_head_t queue;\n\tstruct timer_list disable_timer;\n\tseqlock_t seqlock;\n\tatomic64_t count;\n\tktime_t time;\n\tatomic_t refcount;\n\tu32 last;\n\tu32 max_vblank_count;\n\tunsigned int inmodeset;\n\tunsigned int pipe;\n\tint framedur_ns;\n\tint linedur_ns;\n\tstruct drm_display_mode hwmode;\n\tbool enabled;\n\tstruct kthread_worker *worker;\n\tstruct list_head pending_work;\n\twait_queue_head_t work_wait_queue;\n};\n\nstruct drm_vblank_work {\n\tstruct kthread_work base;\n\tstruct drm_vblank_crtc *vblank;\n\tu64 count;\n\tint cancelling;\n\tstruct list_head node;\n};\n\nstruct drm_version {\n\tint version_major;\n\tint version_minor;\n\tint version_patchlevel;\n\t__kernel_size_t name_len;\n\tchar *name;\n\t__kernel_size_t date_len;\n\tchar *date;\n\t__kernel_size_t desc_len;\n\tchar *desc;\n};\n\nstruct drm_version_32 {\n\tint version_major;\n\tint version_minor;\n\tint version_patchlevel;\n\tu32 name_len;\n\tu32 name;\n\tu32 date_len;\n\tu32 date;\n\tu32 desc_len;\n\tu32 desc;\n};\n\ntypedef struct drm_version_32 drm_version32_t;\n\nstruct drm_vma_offset_file {\n\tstruct rb_node vm_rb;\n\tstruct drm_file *vm_tag;\n\tlong unsigned int vm_count;\n};\n\nstruct drm_vma_offset_manager {\n\trwlock_t vm_lock;\n\tstruct drm_mm vm_addr_space_mm;\n};\n\nstruct drm_wait_vblank_request {\n\tenum drm_vblank_seq_type type;\n\tunsigned int sequence;\n\tlong unsigned int signal;\n};\n\nstruct drm_wait_vblank_reply {\n\tenum drm_vblank_seq_type type;\n\tunsigned int sequence;\n\tlong int tval_sec;\n\tlong int tval_usec;\n};\n\nunion drm_wait_vblank {\n\tstruct drm_wait_vblank_request request;\n\tstruct drm_wait_vblank_reply reply;\n};\n\nstruct drm_wait_vblank_request32 {\n\tenum drm_vblank_seq_type type;\n\tunsigned int sequence;\n\tu32 signal;\n};\n\nstruct drm_wait_vblank_reply32 {\n\tenum drm_vblank_seq_type type;\n\tunsigned int sequence;\n\ts32 tval_sec;\n\ts32 tval_usec;\n};\n\nunion drm_wait_vblank32 {\n\tstruct drm_wait_vblank_request32 request;\n\tstruct drm_wait_vblank_reply32 reply;\n};\n\ntypedef union drm_wait_vblank32 drm_wait_vblank32_t;\n\nstruct drm_writeback_connector {\n\tstruct drm_connector base;\n\tstruct drm_encoder encoder;\n\tstruct drm_property_blob *pixel_formats_blob_ptr;\n\tspinlock_t job_lock;\n\tstruct list_head job_queue;\n\tunsigned int fence_context;\n\tspinlock_t fence_lock;\n\tlong unsigned int fence_seqno;\n\tchar timeline_name[32];\n};\n\nstruct drm_writeback_job {\n\tstruct drm_writeback_connector *connector;\n\tbool prepared;\n\tstruct work_struct cleanup_work;\n\tstruct list_head list_entry;\n\tstruct drm_framebuffer *fb;\n\tstruct dma_fence *out_fence;\n\tvoid *priv;\n};\n\ntypedef void (*drmres_release_t)(struct drm_device *, void *);\n\nstruct drmres_node {\n\tstruct list_head entry;\n\tdrmres_release_t release;\n\tconst char *name;\n\tsize_t size;\n};\n\nstruct drmres {\n\tstruct drmres_node node;\n\tu8 data[0];\n};\n\nstruct drop_reason_list {\n\tconst char * const *reasons;\n\tsize_t n_reasons;\n};\n\nstruct drv_cmd {\n\tstruct acpi_pct_register *reg;\n\tu32 val;\n\tunion {\n\t\tvoid (*write)(struct acpi_pct_register *, u32);\n\t\tu32 (*read)(struct acpi_pct_register *);\n\t} func;\n};\n\nstruct pci_driver;\n\nstruct pci_device_id;\n\nstruct drv_dev_and_id {\n\tstruct pci_driver *drv;\n\tstruct pci_dev *dev;\n\tconst struct pci_device_id *id;\n};\n\nstruct dsa_bridge {\n\tstruct net_device *dev;\n\tunsigned int num;\n\tbool tx_fwd_offload;\n\trefcount_t refcount;\n};\n\nstruct dsa_chip_data {\n\tstruct device *host_dev;\n\tint sw_addr;\n\tstruct device *netdev[12];\n\tint eeprom_len;\n\tstruct device_node *of_node;\n\tchar *port_names[12];\n\tstruct device_node *port_dn[12];\n\ts8 rtable[4];\n};\n\nstruct dsa_lag {\n\tstruct net_device *dev;\n\tunsigned int id;\n\tstruct mutex fdb_lock;\n\tstruct list_head fdbs;\n\trefcount_t refcount;\n};\n\nstruct dsa_port;\n\nstruct dsa_db {\n\tenum dsa_db_type type;\n\tunion {\n\t\tconst struct dsa_port *dp;\n\t\tstruct dsa_lag lag;\n\t\tstruct dsa_bridge bridge;\n\t};\n};\n\nstruct dsa_switch;\n\nstruct dsa_device_ops {\n\tstruct sk_buff * (*xmit)(struct sk_buff *, struct net_device *);\n\tstruct sk_buff * (*rcv)(struct sk_buff *, struct net_device *);\n\tvoid (*flow_dissect)(const struct sk_buff *, __be16 *, int *);\n\tint (*connect)(struct dsa_switch *);\n\tvoid (*disconnect)(struct dsa_switch *);\n\tunsigned int needed_headroom;\n\tunsigned int needed_tailroom;\n\tconst char *name;\n\tenum dsa_tag_protocol proto;\n\tbool promisc_on_conduit;\n};\n\nstruct dsa_mall_mirror_tc_entry {\n\tu8 to_local_port;\n\tbool ingress;\n};\n\nstruct dsa_mall_policer_tc_entry {\n\tu32 burst;\n\tu64 rate_bytes_per_sec;\n};\n\nstruct dsa_platform_data {\n\tstruct device *netdev;\n\tstruct net_device *of_netdev;\n\tint nr_chips;\n\tstruct dsa_chip_data *chip;\n};\n\nstruct phylink;\n\nstruct phylink_link_state;\n\nstruct phylink_config {\n\tstruct device *dev;\n\tenum phylink_op_type type;\n\tbool poll_fixed_state;\n\tbool mac_managed_pm;\n\tbool mac_requires_rxc;\n\tbool default_an_inband;\n\tvoid (*get_fixed_state)(struct phylink_config *, struct phylink_link_state *);\n\tlong unsigned int supported_interfaces[1];\n\tlong unsigned int mac_capabilities;\n};\n\nstruct dsa_switch_tree;\n\nstruct ethtool_ops;\n\nstruct dsa_port {\n\tunion {\n\t\tstruct net_device *conduit;\n\t\tstruct net_device *user;\n\t};\n\tconst struct dsa_device_ops *tag_ops;\n\tstruct dsa_switch_tree *dst;\n\tstruct sk_buff * (*rcv)(struct sk_buff *, struct net_device *);\n\tstruct dsa_switch *ds;\n\tunsigned int index;\n\tenum {\n\t\tDSA_PORT_TYPE_UNUSED = 0,\n\t\tDSA_PORT_TYPE_CPU = 1,\n\t\tDSA_PORT_TYPE_DSA = 2,\n\t\tDSA_PORT_TYPE_USER = 3,\n\t} type;\n\tconst char *name;\n\tstruct dsa_port *cpu_dp;\n\tu8 mac[6];\n\tu8 stp_state;\n\tu8 vlan_filtering: 1;\n\tu8 learning: 1;\n\tu8 lag_tx_enabled: 1;\n\tu8 conduit_admin_up: 1;\n\tu8 conduit_oper_up: 1;\n\tu8 cpu_port_in_lag: 1;\n\tu8 setup: 1;\n\tstruct device_node *dn;\n\tunsigned int ageing_time;\n\tstruct dsa_bridge *bridge;\n\tstruct devlink_port devlink_port;\n\tstruct phylink *pl;\n\tstruct phylink_config pl_config;\n\tstruct dsa_lag *lag;\n\tstruct net_device *hsr_dev;\n\tstruct list_head list;\n\tconst struct ethtool_ops *orig_ethtool_ops;\n\tstruct mutex addr_lists_lock;\n\tstruct list_head fdbs;\n\tstruct list_head mdbs;\n\tstruct mutex vlans_lock;\n\tunion {\n\t\tstruct list_head vlans;\n\t\tstruct list_head user_vlans;\n\t};\n};\n\nstruct kernel_hwtstamp_config;\n\nstruct dsa_stubs {\n\tint (*conduit_hwtstamp_validate)(struct net_device *, const struct kernel_hwtstamp_config *, struct netlink_ext_ack *);\n};\n\nstruct dsa_8021q_context;\n\nstruct dsa_switch_ops;\n\nstruct phylink_mac_ops;\n\nstruct mii_bus;\n\nstruct dsa_switch {\n\tstruct device *dev;\n\tstruct dsa_switch_tree *dst;\n\tunsigned int index;\n\tu32 setup: 1;\n\tu32 vlan_filtering_is_global: 1;\n\tu32 needs_standalone_vlan_filtering: 1;\n\tu32 configure_vlan_while_not_filtering: 1;\n\tu32 untag_bridge_pvid: 1;\n\tu32 untag_vlan_aware_bridge_pvid: 1;\n\tu32 assisted_learning_on_cpu_port: 1;\n\tu32 vlan_filtering: 1;\n\tu32 mtu_enforcement_ingress: 1;\n\tu32 fdb_isolation: 1;\n\tu32 dscp_prio_mapping_is_global: 1;\n\tstruct notifier_block nb;\n\tvoid *priv;\n\tvoid *tagger_data;\n\tstruct dsa_chip_data *cd;\n\tconst struct dsa_switch_ops *ops;\n\tconst struct phylink_mac_ops *phylink_mac_ops;\n\tu32 phys_mii_mask;\n\tstruct mii_bus *user_mii_bus;\n\tunsigned int ageing_time_min;\n\tunsigned int ageing_time_max;\n\tstruct dsa_8021q_context *tag_8021q_ctx;\n\tstruct devlink *devlink;\n\tunsigned int num_tx_queues;\n\tunsigned int num_lag_ids;\n\tunsigned int max_num_bridges;\n\tunsigned int num_ports;\n};\n\ntypedef int dsa_fdb_dump_cb_t(const unsigned char *, u16, bool, void *);\n\nstruct phylink_pcs;\n\nstruct phy_device;\n\nstruct ethtool_eth_phy_stats;\n\nstruct ethtool_eth_mac_stats;\n\nstruct ethtool_eth_ctrl_stats;\n\nstruct ethtool_rmon_stats;\n\nstruct ethtool_rmon_hist_range;\n\nstruct rtnl_link_stats64;\n\nstruct ethtool_pause_stats;\n\nstruct ethtool_test;\n\nstruct ethtool_wolinfo;\n\nstruct kernel_ethtool_ts_info;\n\nstruct ethtool_mm_state;\n\nstruct ethtool_mm_cfg;\n\nstruct ethtool_mm_stats;\n\nstruct ethtool_keee;\n\nstruct ethtool_eeprom;\n\nstruct ethtool_regs;\n\nstruct netdev_notifier_changeupper_info;\n\nstruct switchdev_mst_state;\n\nstruct switchdev_brport_flags;\n\nstruct switchdev_obj_port_vlan;\n\nstruct switchdev_vlan_msti;\n\nstruct switchdev_obj_port_mdb;\n\nstruct ethtool_rxnfc;\n\nstruct flow_cls_offload;\n\nstruct netdev_lag_upper_info;\n\nstruct ifreq;\n\nstruct switchdev_obj_mrp;\n\nstruct switchdev_obj_ring_role_mrp;\n\nstruct dsa_switch_ops {\n\tenum dsa_tag_protocol (*get_tag_protocol)(struct dsa_switch *, int, enum dsa_tag_protocol);\n\tint (*change_tag_protocol)(struct dsa_switch *, enum dsa_tag_protocol);\n\tint (*connect_tag_protocol)(struct dsa_switch *, enum dsa_tag_protocol);\n\tint (*port_change_conduit)(struct dsa_switch *, int, struct net_device *, struct netlink_ext_ack *);\n\tint (*setup)(struct dsa_switch *);\n\tvoid (*teardown)(struct dsa_switch *);\n\tint (*port_setup)(struct dsa_switch *, int);\n\tvoid (*port_teardown)(struct dsa_switch *, int);\n\tu32 (*get_phy_flags)(struct dsa_switch *, int);\n\tint (*phy_read)(struct dsa_switch *, int, int);\n\tint (*phy_write)(struct dsa_switch *, int, int, u16);\n\tvoid (*phylink_get_caps)(struct dsa_switch *, int, struct phylink_config *);\n\tstruct phylink_pcs * (*phylink_mac_select_pcs)(struct dsa_switch *, int, phy_interface_t);\n\tvoid (*phylink_mac_config)(struct dsa_switch *, int, unsigned int, const struct phylink_link_state *);\n\tvoid (*phylink_mac_link_down)(struct dsa_switch *, int, unsigned int, phy_interface_t);\n\tvoid (*phylink_mac_link_up)(struct dsa_switch *, int, unsigned int, phy_interface_t, struct phy_device *, int, int, bool, bool);\n\tvoid (*phylink_fixed_state)(struct dsa_switch *, int, struct phylink_link_state *);\n\tvoid (*get_strings)(struct dsa_switch *, int, u32, uint8_t *);\n\tvoid (*get_ethtool_stats)(struct dsa_switch *, int, uint64_t *);\n\tint (*get_sset_count)(struct dsa_switch *, int, int);\n\tvoid (*get_ethtool_phy_stats)(struct dsa_switch *, int, uint64_t *);\n\tvoid (*get_eth_phy_stats)(struct dsa_switch *, int, struct ethtool_eth_phy_stats *);\n\tvoid (*get_eth_mac_stats)(struct dsa_switch *, int, struct ethtool_eth_mac_stats *);\n\tvoid (*get_eth_ctrl_stats)(struct dsa_switch *, int, struct ethtool_eth_ctrl_stats *);\n\tvoid (*get_rmon_stats)(struct dsa_switch *, int, struct ethtool_rmon_stats *, const struct ethtool_rmon_hist_range **);\n\tvoid (*get_stats64)(struct dsa_switch *, int, struct rtnl_link_stats64 *);\n\tvoid (*get_pause_stats)(struct dsa_switch *, int, struct ethtool_pause_stats *);\n\tvoid (*self_test)(struct dsa_switch *, int, struct ethtool_test *, u64 *);\n\tvoid (*get_wol)(struct dsa_switch *, int, struct ethtool_wolinfo *);\n\tint (*set_wol)(struct dsa_switch *, int, struct ethtool_wolinfo *);\n\tint (*get_ts_info)(struct dsa_switch *, int, struct kernel_ethtool_ts_info *);\n\tint (*get_mm)(struct dsa_switch *, int, struct ethtool_mm_state *);\n\tint (*set_mm)(struct dsa_switch *, int, struct ethtool_mm_cfg *, struct netlink_ext_ack *);\n\tvoid (*get_mm_stats)(struct dsa_switch *, int, struct ethtool_mm_stats *);\n\tint (*port_get_default_prio)(struct dsa_switch *, int);\n\tint (*port_set_default_prio)(struct dsa_switch *, int, u8);\n\tint (*port_get_dscp_prio)(struct dsa_switch *, int, u8);\n\tint (*port_add_dscp_prio)(struct dsa_switch *, int, u8, u8);\n\tint (*port_del_dscp_prio)(struct dsa_switch *, int, u8, u8);\n\tint (*port_set_apptrust)(struct dsa_switch *, int, const u8 *, int);\n\tint (*port_get_apptrust)(struct dsa_switch *, int, u8 *, int *);\n\tint (*suspend)(struct dsa_switch *);\n\tint (*resume)(struct dsa_switch *);\n\tint (*port_enable)(struct dsa_switch *, int, struct phy_device *);\n\tvoid (*port_disable)(struct dsa_switch *, int);\n\tint (*port_set_mac_address)(struct dsa_switch *, int, const unsigned char *);\n\tstruct dsa_port * (*preferred_default_local_cpu_port)(struct dsa_switch *);\n\tint (*set_mac_eee)(struct dsa_switch *, int, struct ethtool_keee *);\n\tint (*get_mac_eee)(struct dsa_switch *, int, struct ethtool_keee *);\n\tint (*get_eeprom_len)(struct dsa_switch *);\n\tint (*get_eeprom)(struct dsa_switch *, struct ethtool_eeprom *, u8 *);\n\tint (*set_eeprom)(struct dsa_switch *, struct ethtool_eeprom *, u8 *);\n\tint (*get_regs_len)(struct dsa_switch *, int);\n\tvoid (*get_regs)(struct dsa_switch *, int, struct ethtool_regs *, void *);\n\tint (*port_prechangeupper)(struct dsa_switch *, int, struct netdev_notifier_changeupper_info *);\n\tint (*set_ageing_time)(struct dsa_switch *, unsigned int);\n\tint (*port_bridge_join)(struct dsa_switch *, int, struct dsa_bridge, bool *, struct netlink_ext_ack *);\n\tvoid (*port_bridge_leave)(struct dsa_switch *, int, struct dsa_bridge);\n\tvoid (*port_stp_state_set)(struct dsa_switch *, int, u8);\n\tint (*port_mst_state_set)(struct dsa_switch *, int, const struct switchdev_mst_state *);\n\tvoid (*port_fast_age)(struct dsa_switch *, int);\n\tint (*port_vlan_fast_age)(struct dsa_switch *, int, u16);\n\tint (*port_pre_bridge_flags)(struct dsa_switch *, int, struct switchdev_brport_flags, struct netlink_ext_ack *);\n\tint (*port_bridge_flags)(struct dsa_switch *, int, struct switchdev_brport_flags, struct netlink_ext_ack *);\n\tvoid (*port_set_host_flood)(struct dsa_switch *, int, bool, bool);\n\tint (*port_vlan_filtering)(struct dsa_switch *, int, bool, struct netlink_ext_ack *);\n\tint (*port_vlan_add)(struct dsa_switch *, int, const struct switchdev_obj_port_vlan *, struct netlink_ext_ack *);\n\tint (*port_vlan_del)(struct dsa_switch *, int, const struct switchdev_obj_port_vlan *);\n\tint (*vlan_msti_set)(struct dsa_switch *, struct dsa_bridge, const struct switchdev_vlan_msti *);\n\tint (*port_fdb_add)(struct dsa_switch *, int, const unsigned char *, u16, struct dsa_db);\n\tint (*port_fdb_del)(struct dsa_switch *, int, const unsigned char *, u16, struct dsa_db);\n\tint (*port_fdb_dump)(struct dsa_switch *, int, dsa_fdb_dump_cb_t *, void *);\n\tint (*lag_fdb_add)(struct dsa_switch *, struct dsa_lag, const unsigned char *, u16, struct dsa_db);\n\tint (*lag_fdb_del)(struct dsa_switch *, struct dsa_lag, const unsigned char *, u16, struct dsa_db);\n\tint (*port_mdb_add)(struct dsa_switch *, int, const struct switchdev_obj_port_mdb *, struct dsa_db);\n\tint (*port_mdb_del)(struct dsa_switch *, int, const struct switchdev_obj_port_mdb *, struct dsa_db);\n\tint (*get_rxnfc)(struct dsa_switch *, int, struct ethtool_rxnfc *, u32 *);\n\tint (*set_rxnfc)(struct dsa_switch *, int, struct ethtool_rxnfc *);\n\tint (*cls_flower_add)(struct dsa_switch *, int, struct flow_cls_offload *, bool);\n\tint (*cls_flower_del)(struct dsa_switch *, int, struct flow_cls_offload *, bool);\n\tint (*cls_flower_stats)(struct dsa_switch *, int, struct flow_cls_offload *, bool);\n\tint (*port_mirror_add)(struct dsa_switch *, int, struct dsa_mall_mirror_tc_entry *, bool, struct netlink_ext_ack *);\n\tvoid (*port_mirror_del)(struct dsa_switch *, int, struct dsa_mall_mirror_tc_entry *);\n\tint (*port_policer_add)(struct dsa_switch *, int, struct dsa_mall_policer_tc_entry *);\n\tvoid (*port_policer_del)(struct dsa_switch *, int);\n\tint (*port_setup_tc)(struct dsa_switch *, int, enum tc_setup_type, void *);\n\tint (*crosschip_bridge_join)(struct dsa_switch *, int, int, int, struct dsa_bridge, struct netlink_ext_ack *);\n\tvoid (*crosschip_bridge_leave)(struct dsa_switch *, int, int, int, struct dsa_bridge);\n\tint (*crosschip_lag_change)(struct dsa_switch *, int, int);\n\tint (*crosschip_lag_join)(struct dsa_switch *, int, int, struct dsa_lag, struct netdev_lag_upper_info *, struct netlink_ext_ack *);\n\tint (*crosschip_lag_leave)(struct dsa_switch *, int, int, struct dsa_lag);\n\tint (*port_hwtstamp_get)(struct dsa_switch *, int, struct ifreq *);\n\tint (*port_hwtstamp_set)(struct dsa_switch *, int, struct ifreq *);\n\tvoid (*port_txtstamp)(struct dsa_switch *, int, struct sk_buff *);\n\tbool (*port_rxtstamp)(struct dsa_switch *, int, struct sk_buff *, unsigned int);\n\tint (*devlink_param_get)(struct dsa_switch *, u32, struct devlink_param_gset_ctx *);\n\tint (*devlink_param_set)(struct dsa_switch *, u32, struct devlink_param_gset_ctx *);\n\tint (*devlink_info_get)(struct dsa_switch *, struct devlink_info_req *, struct netlink_ext_ack *);\n\tint (*devlink_sb_pool_get)(struct dsa_switch *, unsigned int, u16, struct devlink_sb_pool_info *);\n\tint (*devlink_sb_pool_set)(struct dsa_switch *, unsigned int, u16, u32, enum devlink_sb_threshold_type, struct netlink_ext_ack *);\n\tint (*devlink_sb_port_pool_get)(struct dsa_switch *, int, unsigned int, u16, u32 *);\n\tint (*devlink_sb_port_pool_set)(struct dsa_switch *, int, unsigned int, u16, u32, struct netlink_ext_ack *);\n\tint (*devlink_sb_tc_pool_bind_get)(struct dsa_switch *, int, unsigned int, u16, enum devlink_sb_pool_type, u16 *, u32 *);\n\tint (*devlink_sb_tc_pool_bind_set)(struct dsa_switch *, int, unsigned int, u16, enum devlink_sb_pool_type, u16, u32, struct netlink_ext_ack *);\n\tint (*devlink_sb_occ_snapshot)(struct dsa_switch *, unsigned int);\n\tint (*devlink_sb_occ_max_clear)(struct dsa_switch *, unsigned int);\n\tint (*devlink_sb_occ_port_pool_get)(struct dsa_switch *, int, unsigned int, u16, u32 *, u32 *);\n\tint (*devlink_sb_occ_tc_port_bind_get)(struct dsa_switch *, int, unsigned int, u16, enum devlink_sb_pool_type, u32 *, u32 *);\n\tint (*port_change_mtu)(struct dsa_switch *, int, int);\n\tint (*port_max_mtu)(struct dsa_switch *, int);\n\tint (*port_lag_change)(struct dsa_switch *, int);\n\tint (*port_lag_join)(struct dsa_switch *, int, struct dsa_lag, struct netdev_lag_upper_info *, struct netlink_ext_ack *);\n\tint (*port_lag_leave)(struct dsa_switch *, int, struct dsa_lag);\n\tint (*port_hsr_join)(struct dsa_switch *, int, struct net_device *, struct netlink_ext_ack *);\n\tint (*port_hsr_leave)(struct dsa_switch *, int, struct net_device *);\n\tint (*port_mrp_add)(struct dsa_switch *, int, const struct switchdev_obj_mrp *);\n\tint (*port_mrp_del)(struct dsa_switch *, int, const struct switchdev_obj_mrp *);\n\tint (*port_mrp_add_ring_role)(struct dsa_switch *, int, const struct switchdev_obj_ring_role_mrp *);\n\tint (*port_mrp_del_ring_role)(struct dsa_switch *, int, const struct switchdev_obj_ring_role_mrp *);\n\tint (*tag_8021q_vlan_add)(struct dsa_switch *, int, u16, u16);\n\tint (*tag_8021q_vlan_del)(struct dsa_switch *, int, u16);\n\tvoid (*conduit_state_change)(struct dsa_switch *, const struct net_device *, bool);\n};\n\nstruct raw_notifier_head {\n\tstruct notifier_block *head;\n};\n\nstruct dsa_switch_tree {\n\tstruct list_head list;\n\tstruct list_head ports;\n\tstruct raw_notifier_head nh;\n\tunsigned int index;\n\tstruct kref refcount;\n\tstruct dsa_lag **lags;\n\tconst struct dsa_device_ops *tag_ops;\n\tenum dsa_tag_protocol default_proto;\n\tbool setup;\n\tstruct dsa_platform_data *pd;\n\tstruct list_head rtable;\n\tunsigned int lags_len;\n\tunsigned int last_switch;\n};\n\nstruct dst_cache_pcpu;\n\nstruct dst_cache {\n\tstruct dst_cache_pcpu *cache;\n\tlong unsigned int reset_ts;\n};\n\nstruct dst_cache_pcpu {\n\tlong unsigned int refresh_ts;\n\tstruct dst_entry *dst;\n\tu32 cookie;\n\tunion {\n\t\tstruct in_addr in_saddr;\n\t\tstruct in6_addr in6_saddr;\n\t};\n};\n\nstruct dst_ops;\n\nstruct xfrm_state;\n\nstruct uncached_list;\n\nstruct lwtunnel_state;\n\nstruct dst_entry {\n\tstruct net_device *dev;\n\tstruct dst_ops *ops;\n\tlong unsigned int _metrics;\n\tlong unsigned int expires;\n\tstruct xfrm_state *xfrm;\n\tint (*input)(struct sk_buff *);\n\tint (*output)(struct net *, struct sock *, struct sk_buff *);\n\tshort unsigned int flags;\n\tshort int obsolete;\n\tshort unsigned int header_len;\n\tshort unsigned int trailer_len;\n\trcuref_t __rcuref;\n\tint __use;\n\tlong unsigned int lastuse;\n\tstruct callback_head callback_head;\n\tshort int error;\n\tshort int __pad;\n\t__u32 tclassid;\n\tnetdevice_tracker dev_tracker;\n\tstruct list_head rt_uncached;\n\tstruct uncached_list *rt_uncached_list;\n\tstruct lwtunnel_state *lwtstate;\n};\n\nstruct dst_metrics {\n\tu32 metrics[17];\n\trefcount_t refcnt;\n};\n\nstruct neighbour;\n\nstruct dst_ops {\n\tshort unsigned int family;\n\tunsigned int gc_thresh;\n\tvoid (*gc)(struct dst_ops *);\n\tstruct dst_entry * (*check)(struct dst_entry *, __u32);\n\tunsigned int (*default_advmss)(const struct dst_entry *);\n\tunsigned int (*mtu)(const struct dst_entry *);\n\tu32 * (*cow_metrics)(struct dst_entry *, long unsigned int);\n\tvoid (*destroy)(struct dst_entry *);\n\tvoid (*ifdown)(struct dst_entry *, struct net_device *);\n\tvoid (*negative_advice)(struct sock *, struct dst_entry *);\n\tvoid (*link_failure)(struct sk_buff *);\n\tvoid (*update_pmtu)(struct dst_entry *, struct sock *, struct sk_buff *, u32, bool);\n\tvoid (*redirect)(struct dst_entry *, struct sock *, struct sk_buff *);\n\tint (*local_out)(struct net *, struct sock *, struct sk_buff *);\n\tstruct neighbour * (*neigh_lookup)(const struct dst_entry *, struct sk_buff *, const void *);\n\tvoid (*confirm_neigh)(const struct dst_entry *, const void *);\n\tstruct kmem_cache *kmem_cachep;\n\tstruct percpu_counter pcpuc_entries;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct dw2_desc {\n\tu32 field;\n\tu32 addr;\n};\n\nstruct virt_dma_desc {\n\tstruct dma_async_tx_descriptor tx;\n\tstruct dmaengine_result tx_result;\n\tstruct list_head node;\n};\n\nstruct ldma_chan;\n\nstruct dw2_desc_sw {\n\tstruct virt_dma_desc vdesc;\n\tstruct ldma_chan *chan;\n\tdma_addr_t desc_phys;\n\tsize_t desc_cnt;\n\tsize_t size;\n\tstruct dw2_desc *desc_hw;\n};\n\nstruct uart_8250_port;\n\nstruct uart_8250_dma {\n\tint (*tx_dma)(struct uart_8250_port *);\n\tint (*rx_dma)(struct uart_8250_port *);\n\tvoid (*prepare_tx_dma)(struct uart_8250_port *);\n\tvoid (*prepare_rx_dma)(struct uart_8250_port *);\n\tdma_filter_fn fn;\n\tvoid *rx_param;\n\tvoid *tx_param;\n\tstruct dma_slave_config rxconf;\n\tstruct dma_slave_config txconf;\n\tstruct dma_chan *rxchan;\n\tstruct dma_chan *txchan;\n\tphys_addr_t rx_dma_addr;\n\tphys_addr_t tx_dma_addr;\n\tdma_addr_t rx_addr;\n\tdma_addr_t tx_addr;\n\tdma_cookie_t rx_cookie;\n\tdma_cookie_t tx_cookie;\n\tvoid *rx_buf;\n\tsize_t rx_size;\n\tsize_t tx_size;\n\tunsigned char tx_running;\n\tunsigned char tx_err;\n\tunsigned char rx_running;\n};\n\nstruct dw8250_port_data {\n\tint line;\n\tstruct uart_8250_dma dma;\n\tu32 cpr_value;\n\tu8 dlf_size;\n\tbool hw_rs485_support;\n};\n\nstruct dw_edma_region {\n\tu64 paddr;\n\tunion {\n\t\tvoid *mem;\n\t\tvoid *io;\n\t} vaddr;\n\tsize_t sz;\n};\n\nstruct dw_edma;\n\nstruct dw_edma_plat_ops;\n\nstruct dw_edma_chip {\n\tstruct device *dev;\n\tint nr_irqs;\n\tconst struct dw_edma_plat_ops *ops;\n\tu32 flags;\n\tvoid *reg_base;\n\tu16 ll_wr_cnt;\n\tu16 ll_rd_cnt;\n\tstruct dw_edma_region ll_region_wr[8];\n\tstruct dw_edma_region ll_region_rd[8];\n\tstruct dw_edma_region dt_region_wr[8];\n\tstruct dw_edma_region dt_region_rd[8];\n\tenum dw_edma_map_format mf;\n\tstruct dw_edma *dw;\n};\n\nstruct dw_edma_plat_ops {\n\tint (*irq_vector)(struct device *, unsigned int);\n\tu64 (*pci_address)(struct device *, phys_addr_t);\n};\n\nstruct rt_mutex_base {\n\traw_spinlock_t wait_lock;\n\tstruct rb_root_cached waiters;\n\tstruct task_struct *owner;\n};\n\nstruct rt_mutex {\n\tstruct rt_mutex_base rtmutex;\n};\n\nstruct i2c_algorithm;\n\nstruct i2c_lock_operations;\n\nstruct i2c_bus_recovery_info;\n\nstruct i2c_adapter_quirks;\n\nstruct i2c_adapter {\n\tstruct module *owner;\n\tunsigned int class;\n\tconst struct i2c_algorithm *algo;\n\tvoid *algo_data;\n\tconst struct i2c_lock_operations *lock_ops;\n\tstruct rt_mutex bus_lock;\n\tstruct rt_mutex mux_lock;\n\tint timeout;\n\tint retries;\n\tstruct device dev;\n\tlong unsigned int locked_flags;\n\tint nr;\n\tchar name[48];\n\tstruct completion dev_released;\n\tstruct mutex userspace_clients_lock;\n\tstruct list_head userspace_clients;\n\tstruct i2c_bus_recovery_info *bus_recovery_info;\n\tconst struct i2c_adapter_quirks *quirks;\n\tstruct irq_domain *host_notify_domain;\n\tstruct regulator *bus_regulator;\n\tstruct dentry *debugfs;\n\tlong unsigned int addrs_in_instantiation[2];\n};\n\nstruct i2c_timings {\n\tu32 bus_freq_hz;\n\tu32 scl_rise_ns;\n\tu32 scl_fall_ns;\n\tu32 scl_int_delay_ns;\n\tu32 sda_fall_ns;\n\tu32 sda_hold_ns;\n\tu32 digital_filter_width_ns;\n\tu32 analog_filter_cutoff_freq_hz;\n};\n\nstruct i2c_bus_recovery_info {\n\tint (*recover_bus)(struct i2c_adapter *);\n\tint (*get_scl)(struct i2c_adapter *);\n\tvoid (*set_scl)(struct i2c_adapter *, int);\n\tint (*get_sda)(struct i2c_adapter *);\n\tvoid (*set_sda)(struct i2c_adapter *, int);\n\tint (*get_bus_free)(struct i2c_adapter *);\n\tvoid (*prepare_recovery)(struct i2c_adapter *);\n\tvoid (*unprepare_recovery)(struct i2c_adapter *);\n\tstruct gpio_desc *scl_gpiod;\n\tstruct gpio_desc *sda_gpiod;\n\tstruct pinctrl *pinctrl;\n\tstruct pinctrl_state *pins_default;\n\tstruct pinctrl_state *pins_gpio;\n};\n\nstruct reset_control;\n\nstruct i2c_msg;\n\nstruct dw_i2c_dev {\n\tstruct device *dev;\n\tstruct regmap *map;\n\tstruct regmap *sysmap;\n\tvoid *base;\n\tvoid *ext;\n\tstruct completion cmd_complete;\n\tstruct clk *clk;\n\tstruct clk *pclk;\n\tstruct reset_control *rst;\n\tstruct i2c_client *slave;\n\tu32 (*get_clk_rate_khz)(struct dw_i2c_dev *);\n\tint cmd_err;\n\tstruct i2c_msg *msgs;\n\tint msgs_num;\n\tint msg_write_idx;\n\tu32 tx_buf_len;\n\tu8 *tx_buf;\n\tint msg_read_idx;\n\tu32 rx_buf_len;\n\tu8 *rx_buf;\n\tint msg_err;\n\tunsigned int status;\n\tunsigned int abort_source;\n\tunsigned int sw_mask;\n\tint irq;\n\tu32 flags;\n\tstruct i2c_adapter adapter;\n\tu32 functionality;\n\tu32 master_cfg;\n\tu32 slave_cfg;\n\tunsigned int tx_fifo_depth;\n\tunsigned int rx_fifo_depth;\n\tint rx_outstanding;\n\tstruct i2c_timings timings;\n\tu32 sda_hold_time;\n\tu16 ss_hcnt;\n\tu16 ss_lcnt;\n\tu16 fs_hcnt;\n\tu16 fs_lcnt;\n\tu16 fp_hcnt;\n\tu16 fp_lcnt;\n\tu16 hs_hcnt;\n\tu16 hs_lcnt;\n\tint (*acquire_lock)(void);\n\tvoid (*release_lock)(void);\n\tint semaphore_idx;\n\tbool shared_with_punit;\n\tvoid (*disable)(struct dw_i2c_dev *);\n\tint (*init)(struct dw_i2c_dev *);\n\tint (*set_sda_hold_time)(struct dw_i2c_dev *);\n\tint mode;\n\tstruct i2c_bus_recovery_info rinfo;\n};\n\nstruct dw_pcie_host_ops;\n\nstruct pci_host_bridge;\n\nstruct dw_pcie_rp {\n\tbool has_msi_ctrl: 1;\n\tbool cfg0_io_shared: 1;\n\tu64 cfg0_base;\n\tvoid *va_cfg0_base;\n\tu32 cfg0_size;\n\tresource_size_t io_base;\n\tphys_addr_t io_bus_addr;\n\tu32 io_size;\n\tint irq;\n\tconst struct dw_pcie_host_ops *ops;\n\tint msi_irq[8];\n\tstruct irq_domain *irq_domain;\n\tstruct irq_domain *msi_domain;\n\tdma_addr_t msi_data;\n\tstruct irq_chip *msi_irq_chip;\n\tu32 num_vectors;\n\tu32 irq_mask[8];\n\tstruct pci_host_bridge *bridge;\n\traw_spinlock_t lock;\n\tlong unsigned int msi_irq_in_use[4];\n\tbool use_atu_msg;\n\tint msg_atu_index;\n\tstruct resource *msg_res;\n};\n\nstruct pci_epc;\n\nstruct dw_pcie_ep_ops;\n\nstruct pci_epf_bar;\n\nstruct dw_pcie_ep {\n\tstruct pci_epc *epc;\n\tstruct list_head func_list;\n\tconst struct dw_pcie_ep_ops *ops;\n\tphys_addr_t phys_base;\n\tsize_t addr_size;\n\tsize_t page_size;\n\tu8 bar_to_atu[6];\n\tphys_addr_t *outbound_addr;\n\tlong unsigned int *ib_window_map;\n\tlong unsigned int *ob_window_map;\n\tvoid *msi_mem;\n\tphys_addr_t msi_mem_phys;\n\tstruct pci_epf_bar *epf_bar[6];\n};\n\nstruct reset_control_bulk_data {\n\tconst char *id;\n\tstruct reset_control *rstc;\n};\n\nstruct dw_pcie_ops;\n\nstruct dw_pcie {\n\tstruct device *dev;\n\tvoid *dbi_base;\n\tresource_size_t dbi_phys_addr;\n\tvoid *dbi_base2;\n\tvoid *atu_base;\n\tresource_size_t atu_phys_addr;\n\tsize_t atu_size;\n\tu32 num_ib_windows;\n\tu32 num_ob_windows;\n\tu32 region_align;\n\tu64 region_limit;\n\tstruct dw_pcie_rp pp;\n\tstruct dw_pcie_ep ep;\n\tconst struct dw_pcie_ops *ops;\n\tu32 version;\n\tu32 type;\n\tlong unsigned int caps;\n\tint num_lanes;\n\tint link_gen;\n\tu8 n_fts[2];\n\tstruct dw_edma_chip edma;\n\tstruct clk_bulk_data app_clks[3];\n\tstruct clk_bulk_data core_clks[4];\n\tstruct reset_control_bulk_data app_rsts[3];\n\tstruct reset_control_bulk_data core_rsts[7];\n\tstruct gpio_desc *pe_rst;\n\tbool suspended;\n};\n\nstruct dw_pcie_ep_func {\n\tstruct list_head list;\n\tu8 func_no;\n\tu8 msi_cap;\n\tu8 msix_cap;\n};\n\nstruct pci_epc_features;\n\nstruct dw_pcie_ep_ops {\n\tvoid (*pre_init)(struct dw_pcie_ep *);\n\tvoid (*init)(struct dw_pcie_ep *);\n\tint (*raise_irq)(struct dw_pcie_ep *, u8, unsigned int, u16);\n\tconst struct pci_epc_features * (*get_features)(struct dw_pcie_ep *);\n\tunsigned int (*get_dbi_offset)(struct dw_pcie_ep *, u8);\n\tunsigned int (*get_dbi2_offset)(struct dw_pcie_ep *, u8);\n};\n\nstruct dw_pcie_host_ops {\n\tint (*init)(struct dw_pcie_rp *);\n\tvoid (*deinit)(struct dw_pcie_rp *);\n\tvoid (*post_init)(struct dw_pcie_rp *);\n\tint (*msi_init)(struct dw_pcie_rp *);\n\tvoid (*pme_turn_off)(struct dw_pcie_rp *);\n};\n\nstruct dw_pcie_ob_atu_cfg {\n\tint index;\n\tint type;\n\tu8 func_no;\n\tu8 code;\n\tu8 routing;\n\tu64 cpu_addr;\n\tu64 pci_addr;\n\tu64 size;\n};\n\nstruct dw_pcie_ops {\n\tu64 (*cpu_addr_fixup)(struct dw_pcie *, u64);\n\tu32 (*read_dbi)(struct dw_pcie *, void *, u32, size_t);\n\tvoid (*write_dbi)(struct dw_pcie *, void *, u32, size_t, u32);\n\tvoid (*write_dbi2)(struct dw_pcie *, void *, u32, size_t, u32);\n\tint (*link_up)(struct dw_pcie *);\n\tenum dw_pcie_ltssm (*get_ltssm)(struct dw_pcie *);\n\tint (*start_link)(struct dw_pcie *);\n\tvoid (*stop_link)(struct dw_pcie *);\n};\n\nstruct dw_plat_pcie {\n\tstruct dw_pcie *pci;\n\tenum dw_pcie_device_mode mode;\n};\n\nstruct dw_plat_pcie_of_data {\n\tenum dw_pcie_device_mode mode;\n};\n\nstruct usb_otg_caps {\n\tu16 otg_rev;\n\tbool hnp_support;\n\tbool srp_support;\n\tbool adp_support;\n};\n\nstruct dwc2_core_params {\n\tstruct usb_otg_caps otg_caps;\n\tu8 phy_type;\n\tu8 speed;\n\tu8 phy_utmi_width;\n\tbool eusb2_disc;\n\tbool phy_ulpi_ddr;\n\tbool phy_ulpi_ext_vbus;\n\tbool enable_dynamic_fifo;\n\tbool en_multiple_tx_fifo;\n\tbool i2c_enable;\n\tbool acg_enable;\n\tbool ulpi_fs_ls;\n\tbool ts_dline;\n\tbool reload_ctl;\n\tbool uframe_sched;\n\tbool external_id_pin_ctl;\n\tint power_down;\n\tbool no_clock_gating;\n\tbool lpm;\n\tbool lpm_clock_gating;\n\tbool besl;\n\tbool hird_threshold_en;\n\tbool service_interval;\n\tu8 hird_threshold;\n\tbool activate_stm_fs_transceiver;\n\tbool activate_stm_id_vb_detection;\n\tbool activate_ingenic_overcurrent_detection;\n\tbool ipg_isoc_en;\n\tu16 max_packet_count;\n\tu32 max_transfer_size;\n\tu32 ahbcfg;\n\tu32 ref_clk_per;\n\tu16 sof_cnt_wkup_alert;\n\tbool host_dma;\n\tbool dma_desc_enable;\n\tbool dma_desc_fs_enable;\n\tbool host_support_fs_ls_low_power;\n\tbool host_ls_low_power_phy_clk;\n\tbool oc_disable;\n\tu8 host_channels;\n\tu16 host_rx_fifo_size;\n\tu16 host_nperio_tx_fifo_size;\n\tu16 host_perio_tx_fifo_size;\n\tbool g_dma;\n\tbool g_dma_desc;\n\tu32 g_rx_fifo_size;\n\tu32 g_np_tx_fifo_size;\n\tu32 g_tx_fifo_size[16];\n\tbool change_speed_quirk;\n};\n\nstruct dwc2_dma_desc {\n\tu32 status;\n\tu32 buf;\n};\n\nstruct dwc2_dregs_backup {\n\tu32 dcfg;\n\tu32 dctl;\n\tu32 daintmsk;\n\tu32 diepmsk;\n\tu32 doepmsk;\n\tu32 diepctl[16];\n\tu32 dieptsiz[16];\n\tu32 diepdma[16];\n\tu32 doepctl[16];\n\tu32 doeptsiz[16];\n\tu32 doepdma[16];\n\tu32 dtxfsiz[16];\n\tbool valid;\n};\n\nstruct dwc2_gregs_backup {\n\tu32 gotgctl;\n\tu32 gintmsk;\n\tu32 gahbcfg;\n\tu32 gusbcfg;\n\tu32 grxfsiz;\n\tu32 gnptxfsiz;\n\tu32 gi2cctl;\n\tu32 glpmcfg;\n\tu32 pcgcctl;\n\tu32 pcgcctl1;\n\tu32 gdfifocfg;\n\tu32 gpwrdn;\n\tbool valid;\n};\n\nunion dwc2_hcd_internal_flags {\n\tu32 d32;\n\tstruct {\n\t\tunsigned int port_connect_status_change: 1;\n\t\tunsigned int port_connect_status: 1;\n\t\tunsigned int port_reset_change: 1;\n\t\tunsigned int port_enable_change: 1;\n\t\tunsigned int port_suspend_change: 1;\n\t\tunsigned int port_over_current_change: 1;\n\t\tunsigned int port_l1_change: 1;\n\t\tunsigned int reserved: 25;\n\t} b;\n};\n\nstruct dwc2_hcd_iso_packet_desc {\n\tu32 offset;\n\tu32 length;\n\tu32 actual_length;\n\tu32 status;\n};\n\nstruct dwc2_hcd_pipe_info {\n\tu8 dev_addr;\n\tu8 ep_num;\n\tu8 pipe_type;\n\tu8 pipe_dir;\n\tu16 maxp;\n\tu16 maxp_mult;\n};\n\nstruct dwc2_qtd;\n\nstruct dwc2_hcd_urb {\n\tvoid *priv;\n\tstruct dwc2_qtd *qtd;\n\tvoid *buf;\n\tdma_addr_t dma;\n\tvoid *setup_packet;\n\tdma_addr_t setup_dma;\n\tu32 length;\n\tu32 actual_length;\n\tu32 status;\n\tu32 error_count;\n\tu32 packet_count;\n\tu32 flags;\n\tu16 interval;\n\tstruct dwc2_hcd_pipe_info pipe_info;\n\tstruct dwc2_hcd_iso_packet_desc iso_descs[0];\n};\n\nstruct dwc2_qh;\n\nstruct dwc2_host_chan {\n\tu8 hc_num;\n\tunsigned int dev_addr: 7;\n\tunsigned int ep_num: 4;\n\tunsigned int ep_is_in: 1;\n\tunsigned int speed: 4;\n\tunsigned int ep_type: 2;\n\tint: 6;\n\tunsigned int max_packet: 11;\n\tunsigned int data_pid_start: 2;\n\tunsigned int multi_count: 2;\n\tu8 *xfer_buf;\n\tdma_addr_t xfer_dma;\n\tdma_addr_t align_buf;\n\tu32 xfer_len;\n\tu32 xfer_count;\n\tu16 start_pkt_count;\n\tu8 xfer_started;\n\tu8 do_ping;\n\tu8 error_state;\n\tu8 halt_on_queue;\n\tu8 halt_pending;\n\tu8 do_split;\n\tu8 complete_split;\n\tu8 hub_addr;\n\tu8 hub_port;\n\tu8 xact_pos;\n\tu8 requests;\n\tu8 schinfo;\n\tu16 ntd;\n\tenum dwc2_halt_status halt_status;\n\tu32 hcint;\n\tstruct dwc2_qh *qh;\n\tstruct list_head hc_list_entry;\n\tdma_addr_t desc_list_addr;\n\tu32 desc_list_sz;\n\tstruct list_head split_order_list_entry;\n};\n\nstruct dwc2_hregs_backup {\n\tu32 hcfg;\n\tu32 hflbaddr;\n\tu32 haintmsk;\n\tu32 hcchar[16];\n\tu32 hcsplt[16];\n\tu32 hcintmsk[16];\n\tu32 hctsiz[16];\n\tu32 hcidma[16];\n\tu32 hcidmab[16];\n\tu32 hprt0;\n\tu32 hfir;\n\tu32 hptxfsiz;\n\tbool valid;\n};\n\nstruct dwc2_hs_transfer_time {\n\tu32 start_schedule_us;\n\tu16 duration_us;\n};\n\nstruct dwc2_hw_params {\n\tunsigned int op_mode: 3;\n\tunsigned int arch: 2;\n\tunsigned int dma_desc_enable: 1;\n\tunsigned int enable_dynamic_fifo: 1;\n\tunsigned int en_multiple_tx_fifo: 1;\n\tunsigned int rx_fifo_size: 16;\n\tint: 8;\n\tunsigned int host_nperio_tx_fifo_size: 16;\n\tunsigned int dev_nperio_tx_fifo_size: 16;\n\tunsigned int host_perio_tx_fifo_size: 16;\n\tunsigned int nperio_tx_q_depth: 3;\n\tunsigned int host_perio_tx_q_depth: 3;\n\tunsigned int dev_token_q_depth: 5;\n\tint: 5;\n\tunsigned int max_transfer_size: 26;\n\tlong: 6;\n\tunsigned int max_packet_count: 11;\n\tunsigned int host_channels: 5;\n\tunsigned int hs_phy_type: 2;\n\tunsigned int fs_phy_type: 2;\n\tunsigned int i2c_enable: 1;\n\tunsigned int acg_enable: 1;\n\tunsigned int num_dev_ep: 4;\n\tunsigned int num_dev_in_eps: 4;\n\tint: 2;\n\tunsigned int num_dev_perio_in_ep: 4;\n\tunsigned int total_fifo_size: 16;\n\tunsigned int power_optimized: 1;\n\tunsigned int hibernation: 1;\n\tunsigned int utmi_phy_data_width: 2;\n\tunsigned int lpm_mode: 1;\n\tunsigned int ipg_isoc_en: 1;\n\tunsigned int service_interval_mode: 1;\n\tu32 snpsid;\n\tu32 dev_ep_dirs;\n\tu32 g_tx_fifo_size[16];\n};\n\nstruct regulator_bulk_data {\n\tconst char *supply;\n\tstruct regulator *consumer;\n\tint init_load_uA;\n\tint ret;\n};\n\nstruct usb_role_switch;\n\nstruct phy;\n\nstruct usb_phy;\n\nstruct dwc2_hsotg_plat;\n\nstruct dwc2_hsotg {\n\tstruct device *dev;\n\tvoid *regs;\n\tstruct dwc2_hw_params hw_params;\n\tstruct dwc2_core_params params;\n\tenum usb_otg_state op_state;\n\tenum usb_dr_mode dr_mode;\n\tstruct usb_role_switch *role_sw;\n\tenum usb_dr_mode role_sw_default_mode;\n\tunsigned int hcd_enabled: 1;\n\tunsigned int gadget_enabled: 1;\n\tunsigned int ll_hw_enabled: 1;\n\tunsigned int hibernated: 1;\n\tunsigned int in_ppd: 1;\n\tbool bus_suspended;\n\tunsigned int reset_phy_on_wake: 1;\n\tunsigned int need_phy_for_wake: 1;\n\tunsigned int phy_off_for_suspend: 1;\n\tu16 frame_number;\n\tstruct phy *phy;\n\tstruct usb_phy *uphy;\n\tstruct dwc2_hsotg_plat *plat;\n\tstruct regulator_bulk_data supplies[2];\n\tstruct regulator *vbus_supply;\n\tstruct regulator *usb33d;\n\tspinlock_t lock;\n\tvoid *priv;\n\tint irq;\n\tstruct clk *clk;\n\tstruct clk *utmi_clk;\n\tstruct reset_control *reset;\n\tstruct reset_control *reset_ecc;\n\tunsigned int queuing_high_bandwidth: 1;\n\tunsigned int srp_success: 1;\n\tstruct workqueue_struct *wq_otg;\n\tstruct work_struct wf_otg;\n\tstruct timer_list wkp_timer;\n\tenum dwc2_lx_state lx_state;\n\tstruct dwc2_gregs_backup gr_backup;\n\tstruct dwc2_dregs_backup dr_backup;\n\tstruct dwc2_hregs_backup hr_backup;\n\tstruct dentry *debug_root;\n\tstruct debugfs_regset32 *regset;\n\tbool needs_byte_swap;\n\tunion dwc2_hcd_internal_flags flags;\n\tstruct list_head non_periodic_sched_inactive;\n\tstruct list_head non_periodic_sched_waiting;\n\tstruct list_head non_periodic_sched_active;\n\tstruct list_head *non_periodic_qh_ptr;\n\tstruct list_head periodic_sched_inactive;\n\tstruct list_head periodic_sched_ready;\n\tstruct list_head periodic_sched_assigned;\n\tstruct list_head periodic_sched_queued;\n\tstruct list_head split_order;\n\tu16 periodic_usecs;\n\tlong unsigned int hs_periodic_bitmap[13];\n\tu16 periodic_qh_count;\n\tbool new_connection;\n\tu16 last_frame_num;\n\tstruct list_head free_hc_list;\n\tint periodic_channels;\n\tint non_periodic_channels;\n\tint available_host_channels;\n\tstruct dwc2_host_chan *hc_ptr_array[16];\n\tu8 *status_buf;\n\tdma_addr_t status_buf_dma;\n\tstruct delayed_work start_work;\n\tstruct delayed_work reset_work;\n\tstruct work_struct phy_reset_work;\n\tu8 otg_port;\n\tu32 *frame_list;\n\tdma_addr_t frame_list_dma;\n\tu32 frame_list_sz;\n\tstruct kmem_cache *desc_gen_cache;\n\tstruct kmem_cache *desc_hsisoc_cache;\n\tstruct kmem_cache *unaligned_cache;\n};\n\nstruct dwc2_hsotg_plat {\n\tenum dwc2_hsotg_dmamode dma;\n\tunsigned int is_osc: 1;\n\tint phy_type;\n\tint (*phy_init)(struct platform_device *, int);\n\tint (*phy_exit)(struct platform_device *, int);\n};\n\nstruct dwc2_tt;\n\nstruct dwc2_qh {\n\tstruct dwc2_hsotg *hsotg;\n\tu8 ep_type;\n\tu8 ep_is_in;\n\tu16 maxp;\n\tu16 maxp_mult;\n\tu8 dev_speed;\n\tu8 data_toggle;\n\tu8 ping_state;\n\tu8 do_split;\n\tu8 td_first;\n\tu8 td_last;\n\tu16 host_us;\n\tu16 device_us;\n\tu16 host_interval;\n\tu16 device_interval;\n\tu16 next_active_frame;\n\tu16 start_active_frame;\n\ts16 num_hs_transfers;\n\tstruct dwc2_hs_transfer_time hs_transfers[8];\n\tu32 ls_start_schedule_slice;\n\tu16 ntd;\n\tu8 *dw_align_buf;\n\tdma_addr_t dw_align_buf_dma;\n\tstruct list_head qtd_list;\n\tstruct dwc2_host_chan *channel;\n\tstruct list_head qh_list_entry;\n\tstruct dwc2_dma_desc *desc_list;\n\tdma_addr_t desc_list_dma;\n\tu32 desc_list_sz;\n\tu32 *n_bytes;\n\tstruct timer_list unreserve_timer;\n\tstruct hrtimer wait_timer;\n\tstruct dwc2_tt *dwc_tt;\n\tint ttport;\n\tunsigned int tt_buffer_dirty: 1;\n\tunsigned int unreserve_pending: 1;\n\tunsigned int schedule_low_speed: 1;\n\tunsigned int want_wait: 1;\n\tunsigned int wait_timer_cancel: 1;\n};\n\nstruct dwc2_qtd {\n\tenum dwc2_control_phase control_phase;\n\tu8 in_process;\n\tu8 data_toggle;\n\tu8 complete_split;\n\tu8 isoc_split_pos;\n\tu16 isoc_frame_index;\n\tu16 isoc_split_offset;\n\tu16 isoc_td_last;\n\tu16 isoc_td_first;\n\tu32 ssplit_out_xfer_count;\n\tu8 error_count;\n\tu8 n_desc;\n\tu16 isoc_frame_index_last;\n\tu16 num_naks;\n\tstruct dwc2_hcd_urb *urb;\n\tstruct dwc2_qh *qh;\n\tstruct list_head qtd_list_entry;\n};\n\nstruct usb_tt;\n\nstruct dwc2_tt {\n\tint refcount;\n\tstruct usb_tt *usb_tt;\n\tlong unsigned int periodic_bitmaps[0];\n};\n\nstruct dx_countlimit {\n\t__le16 limit;\n\t__le16 count;\n};\n\nstruct dx_entry {\n\t__le32 hash;\n\t__le32 block;\n};\n\nstruct dx_frame {\n\tstruct buffer_head *bh;\n\tstruct dx_entry *entries;\n\tstruct dx_entry *at;\n};\n\nstruct dx_hash_info {\n\tu32 hash;\n\tu32 minor_hash;\n\tint hash_version;\n\tu32 *seed;\n};\n\nstruct dx_map_entry {\n\tu32 hash;\n\tu16 offs;\n\tu16 size;\n};\n\nstruct fake_dirent {\n\t__le32 inode;\n\t__le16 rec_len;\n\tu8 name_len;\n\tu8 file_type;\n};\n\nstruct dx_node {\n\tstruct fake_dirent fake;\n\tstruct dx_entry entries[0];\n};\n\nstruct dx_root_info {\n\t__le32 reserved_zero;\n\tu8 hash_version;\n\tu8 info_length;\n\tu8 indirect_levels;\n\tu8 unused_flags;\n};\n\nstruct dx_root {\n\tstruct fake_dirent dot;\n\tchar dot_name[4];\n\tstruct fake_dirent dotdot;\n\tchar dotdot_name[4];\n\tstruct dx_root_info info;\n\tstruct dx_entry entries[0];\n};\n\nstruct dx_tail {\n\tu32 dt_reserved;\n\t__le32 dt_checksum;\n};\n\nstruct dyn_arch_ftrace {};\n\nstruct dyn_event_operations;\n\nstruct dyn_event {\n\tstruct list_head list;\n\tstruct dyn_event_operations *ops;\n};\n\nstruct dyn_event_operations {\n\tstruct list_head list;\n\tint (*create)(const char *);\n\tint (*show)(struct seq_file *, struct dyn_event *);\n\tbool (*is_busy)(struct dyn_event *);\n\tint (*free)(struct dyn_event *);\n\tbool (*match)(const char *, const char *, int, const char **, struct dyn_event *);\n};\n\nstruct dyn_ftrace {\n\tlong unsigned int ip;\n\tlong unsigned int flags;\n\tstruct dyn_arch_ftrace arch;\n};\n\nstruct dynevent_arg {\n\tconst char *str;\n\tchar separator;\n};\n\nstruct dynevent_arg_pair {\n\tconst char *lhs;\n\tconst char *rhs;\n\tchar operator;\n\tchar separator;\n};\n\nstruct seq_buf {\n\tchar *buffer;\n\tsize_t size;\n\tsize_t len;\n};\n\nstruct dynevent_cmd;\n\ntypedef int (*dynevent_create_fn_t)(struct dynevent_cmd *);\n\nstruct dynevent_cmd {\n\tstruct seq_buf seq;\n\tconst char *event_name;\n\tunsigned int n_fields;\n\tenum dynevent_type type;\n\tdynevent_create_fn_t run_command;\n\tvoid *private_data;\n};\n\nstruct e820_entry {\n\tu64 addr;\n\tu64 size;\n\tenum e820_type type;\n} __attribute__((packed));\n\nstruct e820_table {\n\t__u32 nr_entries;\n\tstruct e820_entry entries[3200];\n};\n\nstruct usb_device;\n\nstruct each_dev_arg {\n\tvoid *data;\n\tint (*fn)(struct usb_device *, void *);\n};\n\nstruct early_load_data {\n\tu32 old_rev;\n\tu32 new_rev;\n};\n\nstruct uart_icount {\n\t__u32 cts;\n\t__u32 dsr;\n\t__u32 rng;\n\t__u32 dcd;\n\t__u32 rx;\n\t__u32 tx;\n\t__u32 frame;\n\t__u32 overrun;\n\t__u32 parity;\n\t__u32 brk;\n\t__u32 buf_overrun;\n};\n\nstruct serial_rs485 {\n\t__u32 flags;\n\t__u32 delay_rts_before_send;\n\t__u32 delay_rts_after_send;\n\tunion {\n\t\t__u32 padding[5];\n\t\tstruct {\n\t\t\t__u8 addr_recv;\n\t\t\t__u8 addr_dest;\n\t\t\t__u8 padding0[2];\n\t\t\t__u32 padding1[4];\n\t\t};\n\t};\n};\n\nstruct serial_iso7816 {\n\t__u32 flags;\n\t__u32 tg;\n\t__u32 sc_fi;\n\t__u32 sc_di;\n\t__u32 clk;\n\t__u32 reserved[5];\n};\n\nstruct ktermios;\n\nstruct uart_state;\n\nstruct uart_ops;\n\nstruct serial_port_device;\n\nstruct uart_port {\n\tspinlock_t lock;\n\tlong unsigned int iobase;\n\tunsigned char *membase;\n\tunsigned int (*serial_in)(struct uart_port *, int);\n\tvoid (*serial_out)(struct uart_port *, int, int);\n\tvoid (*set_termios)(struct uart_port *, struct ktermios *, const struct ktermios *);\n\tvoid (*set_ldisc)(struct uart_port *, struct ktermios *);\n\tunsigned int (*get_mctrl)(struct uart_port *);\n\tvoid (*set_mctrl)(struct uart_port *, unsigned int);\n\tunsigned int (*get_divisor)(struct uart_port *, unsigned int, unsigned int *);\n\tvoid (*set_divisor)(struct uart_port *, unsigned int, unsigned int, unsigned int);\n\tint (*startup)(struct uart_port *);\n\tvoid (*shutdown)(struct uart_port *);\n\tvoid (*throttle)(struct uart_port *);\n\tvoid (*unthrottle)(struct uart_port *);\n\tint (*handle_irq)(struct uart_port *);\n\tvoid (*pm)(struct uart_port *, unsigned int, unsigned int);\n\tvoid (*handle_break)(struct uart_port *);\n\tint (*rs485_config)(struct uart_port *, struct ktermios *, struct serial_rs485 *);\n\tint (*iso7816_config)(struct uart_port *, struct serial_iso7816 *);\n\tunsigned int ctrl_id;\n\tunsigned int port_id;\n\tunsigned int irq;\n\tlong unsigned int irqflags;\n\tunsigned int uartclk;\n\tunsigned int fifosize;\n\tunsigned char x_char;\n\tunsigned char regshift;\n\tunsigned char iotype;\n\tunsigned char quirks;\n\tunsigned int read_status_mask;\n\tunsigned int ignore_status_mask;\n\tstruct uart_state *state;\n\tstruct uart_icount icount;\n\tstruct console *cons;\n\tupf_t flags;\n\tupstat_t status;\n\tbool hw_stopped;\n\tunsigned int mctrl;\n\tunsigned int frame_time;\n\tunsigned int type;\n\tconst struct uart_ops *ops;\n\tunsigned int custom_divisor;\n\tunsigned int line;\n\tunsigned int minor;\n\tresource_size_t mapbase;\n\tresource_size_t mapsize;\n\tstruct device *dev;\n\tstruct serial_port_device *port_dev;\n\tlong unsigned int sysrq;\n\tu8 sysrq_ch;\n\tunsigned char has_sysrq;\n\tunsigned char sysrq_seq;\n\tunsigned char hub6;\n\tunsigned char suspended;\n\tunsigned char console_reinit;\n\tconst char *name;\n\tstruct attribute_group *attr_group;\n\tconst struct attribute_group **tty_groups;\n\tstruct serial_rs485 rs485;\n\tstruct serial_rs485 rs485_supported;\n\tstruct gpio_desc *rs485_term_gpio;\n\tstruct gpio_desc *rs485_rx_during_tx_gpio;\n\tstruct serial_iso7816 iso7816;\n\tvoid *private_data;\n};\n\nstruct earlycon_device {\n\tstruct console *con;\n\tstruct uart_port port;\n\tchar options[32];\n\tunsigned int baud;\n};\n\nstruct earlycon_id {\n\tchar name[15];\n\tchar name_term;\n\tchar compatible[128];\n\tint (*setup)(struct earlycon_device *, const char *);\n};\n\nstruct ebitmap_node {\n\tstruct ebitmap_node *next;\n\tlong unsigned int maps[6];\n\tu32 startbit;\n};\n\nstruct ec_host_request {\n\tuint8_t struct_version;\n\tuint8_t checksum;\n\tuint16_t command;\n\tuint8_t command_version;\n\tuint8_t reserved;\n\tuint16_t data_len;\n};\n\nstruct ec_motion_sense_activity {\n\tuint8_t sensor_num;\n\tuint8_t activity;\n\tuint8_t enable;\n\tuint8_t reserved;\n\tuint16_t parameters[3];\n};\n\nstruct ec_params_get_cmd_versions {\n\tuint8_t cmd;\n};\n\nstruct ec_params_get_cmd_versions_v1 {\n\tuint16_t cmd;\n};\n\nstruct ec_params_hello {\n\tuint32_t in_data;\n};\n\nstruct ec_params_motion_sense {\n\tuint8_t cmd;\n\tunion {\n\t\tstruct {\n\t\t\tuint8_t max_sensor_count;\n\t\t} dump;\n\t\tstruct {\n\t\t\tint16_t data;\n\t\t} kb_wake_angle;\n\t\tstruct {\n\t\t\tuint8_t sensor_num;\n\t\t} info;\n\t\tstruct {\n\t\t\tuint8_t sensor_num;\n\t\t} info_3;\n\t\tstruct {\n\t\t\tuint8_t sensor_num;\n\t\t} data;\n\t\tstruct {\n\t\t\tuint8_t sensor_num;\n\t\t} fifo_flush;\n\t\tstruct {\n\t\t\tuint8_t sensor_num;\n\t\t} perform_calib;\n\t\tstruct {\n\t\t\tuint8_t sensor_num;\n\t\t} list_activities;\n\t\tstruct {\n\t\t\tuint8_t sensor_num;\n\t\t\tuint8_t roundup;\n\t\t\tuint16_t reserved;\n\t\t\tint32_t data;\n\t\t} ec_rate;\n\t\tstruct {\n\t\t\tuint8_t sensor_num;\n\t\t\tuint8_t roundup;\n\t\t\tuint16_t reserved;\n\t\t\tint32_t data;\n\t\t} sensor_odr;\n\t\tstruct {\n\t\t\tuint8_t sensor_num;\n\t\t\tuint8_t roundup;\n\t\t\tuint16_t reserved;\n\t\t\tint32_t data;\n\t\t} sensor_range;\n\t\tstruct {\n\t\t\tuint8_t sensor_num;\n\t\t\tuint16_t flags;\n\t\t\tint16_t temp;\n\t\t\tint16_t offset[3];\n\t\t} __attribute__((packed)) sensor_offset;\n\t\tstruct {\n\t\t\tuint8_t sensor_num;\n\t\t\tuint16_t flags;\n\t\t\tint16_t temp;\n\t\t\tuint16_t scale[3];\n\t\t} __attribute__((packed)) sensor_scale;\n\t\tstruct {\n\t\t\tuint32_t max_data_vector;\n\t\t} fifo_read;\n\t\tstruct ec_motion_sense_activity set_activity;\n\t\tstruct {\n\t\t\tint8_t enable;\n\t\t} fifo_int_enable;\n\t\tstruct {\n\t\t\tuint8_t sensor_id;\n\t\t\tuint8_t spoof_enable;\n\t\t\tuint8_t reserved;\n\t\t\tint16_t components[3];\n\t\t} __attribute__((packed)) spoof;\n\t\tstruct {\n\t\t\tint16_t lid_angle;\n\t\t\tint16_t hys_degree;\n\t\t} tablet_mode_threshold;\n\t};\n} __attribute__((packed));\n\nstruct ec_params_read_memmap {\n\tuint8_t offset;\n\tuint8_t size;\n};\n\nstruct ec_response_get_cmd_versions {\n\tuint32_t version_mask;\n};\n\nstruct ec_response_get_comms_status {\n\tuint32_t flags;\n};\n\nstruct ec_response_get_protocol_info {\n\tuint32_t protocol_versions;\n\tuint16_t max_request_packet_size;\n\tuint16_t max_response_packet_size;\n\tuint32_t flags;\n};\n\nstruct ec_response_hello {\n\tuint32_t out_data;\n};\n\nstruct ec_response_host_event_mask {\n\tuint32_t mask;\n};\n\nstruct ec_response_motion_sensor_data {\n\tuint8_t flags;\n\tuint8_t sensor_num;\n\tunion {\n\t\tint16_t data[3];\n\t\tstruct {\n\t\t\tuint16_t reserved;\n\t\t\tuint32_t timestamp;\n\t\t} __attribute__((packed));\n\t\tstruct {\n\t\t\tuint8_t activity;\n\t\t\tuint8_t state;\n\t\t\tint16_t add_info[2];\n\t\t};\n\t};\n};\n\nstruct ec_response_motion_sense_fifo_data {\n\tuint32_t number_data;\n\tstruct ec_response_motion_sensor_data data[0];\n};\n\nstruct ec_response_motion_sense {\n\tunion {\n\t\tstruct {\n\t\t\tuint8_t module_flags;\n\t\t\tuint8_t sensor_count;\n\t\t\tstruct {\n\t\t\t\tstruct {} __empty_sensor;\n\t\t\t\tstruct ec_response_motion_sensor_data sensor[0];\n\t\t\t};\n\t\t} dump;\n\t\tstruct {\n\t\t\tuint8_t type;\n\t\t\tuint8_t location;\n\t\t\tuint8_t chip;\n\t\t} info;\n\t\tstruct {\n\t\t\tuint8_t type;\n\t\t\tuint8_t location;\n\t\t\tuint8_t chip;\n\t\t\tuint32_t min_frequency;\n\t\t\tuint32_t max_frequency;\n\t\t\tuint32_t fifo_max_event_count;\n\t\t} info_3;\n\t\tstruct ec_response_motion_sensor_data data;\n\t\tstruct {\n\t\t\tint32_t ret;\n\t\t} ec_rate;\n\t\tstruct {\n\t\t\tint32_t ret;\n\t\t} sensor_odr;\n\t\tstruct {\n\t\t\tint32_t ret;\n\t\t} sensor_range;\n\t\tstruct {\n\t\t\tint32_t ret;\n\t\t} kb_wake_angle;\n\t\tstruct {\n\t\t\tint32_t ret;\n\t\t} fifo_int_enable;\n\t\tstruct {\n\t\t\tint32_t ret;\n\t\t} spoof;\n\t\tstruct {\n\t\t\tint16_t temp;\n\t\t\tint16_t offset[3];\n\t\t} sensor_offset;\n\t\tstruct {\n\t\t\tint16_t temp;\n\t\t\tint16_t offset[3];\n\t\t} perform_calib;\n\t\tstruct {\n\t\t\tint16_t temp;\n\t\t\tuint16_t scale[3];\n\t\t} sensor_scale;\n\t\tstruct ec_response_motion_sense_fifo_info fifo_info;\n\t\tstruct ec_response_motion_sense_fifo_info fifo_flush;\n\t\tstruct ec_response_motion_sense_fifo_data fifo_read;\n\t\tstruct {\n\t\t\tuint16_t reserved;\n\t\t\tuint32_t enabled;\n\t\t\tuint32_t disabled;\n\t\t} __attribute__((packed)) list_activities;\n\t\tstruct {\n\t\t\tuint16_t value;\n\t\t} lid_angle;\n\t\tstruct {\n\t\t\tuint16_t lid_angle;\n\t\t\tuint16_t hys_degree;\n\t\t} tablet_mode_threshold;\n\t};\n};\n\nstruct ecc_point {\n\tu64 *x;\n\tu64 *y;\n\tu8 ndigits;\n};\n\nstruct ecc_curve {\n\tchar *name;\n\tu32 nbits;\n\tstruct ecc_point g;\n\tu64 *p;\n\tu64 *n;\n\tu64 *a;\n\tu64 *b;\n};\n\nstruct ecdh {\n\tchar *key;\n\tshort unsigned int key_size;\n};\n\nstruct ecdh_ctx {\n\tunsigned int curve_id;\n\tunsigned int ndigits;\n\tu64 private_key[9];\n};\n\nstruct ecryptfs_session_key {\n\tu32 flags;\n\tu32 encrypted_key_size;\n\tu32 decrypted_key_size;\n\tu8 encrypted_key[512];\n\tu8 decrypted_key[64];\n};\n\nstruct ecryptfs_password {\n\tu32 password_bytes;\n\ts32 hash_algo;\n\tu32 hash_iterations;\n\tu32 session_key_encryption_key_bytes;\n\tu32 flags;\n\tu8 session_key_encryption_key[64];\n\tu8 signature[17];\n\tu8 salt[8];\n};\n\nstruct ecryptfs_private_key {\n\tu32 key_size;\n\tu32 data_len;\n\tu8 signature[17];\n\tchar pki_type[17];\n\tu8 data[0];\n};\n\nstruct ecryptfs_auth_tok {\n\tu16 version;\n\tu16 token_type;\n\tu32 flags;\n\tstruct ecryptfs_session_key session_key;\n\tu8 reserved[32];\n\tunion {\n\t\tstruct ecryptfs_password password;\n\t\tstruct ecryptfs_private_key private_key;\n\t} token;\n};\n\nstruct ecryptfs_auth_tok_list_item {\n\tunsigned char encrypted_session_key[64];\n\tstruct list_head list;\n\tstruct ecryptfs_auth_tok auth_tok;\n};\n\nstruct ecryptfs_cache_info {\n\tstruct kmem_cache **cache;\n\tconst char *name;\n\tsize_t size;\n\tslab_flags_t flags;\n\tvoid (*ctor)(void *);\n};\n\nstruct ecryptfs_cipher_code_str_map_elem {\n\tchar cipher_str[16];\n\tu8 cipher_code;\n};\n\nstruct ecryptfs_mount_crypt_stat;\n\nstruct ecryptfs_crypt_stat {\n\tu32 flags;\n\tunsigned int file_version;\n\tsize_t iv_bytes;\n\tsize_t metadata_size;\n\tsize_t extent_size;\n\tsize_t key_size;\n\tsize_t extent_shift;\n\tunsigned int extent_mask;\n\tstruct ecryptfs_mount_crypt_stat *mount_crypt_stat;\n\tstruct crypto_skcipher *tfm;\n\tstruct crypto_shash *hash_tfm;\n\tunsigned char cipher[32];\n\tunsigned char key[64];\n\tunsigned char root_iv[16];\n\tstruct list_head keysig_list;\n\tstruct mutex keysig_list_mutex;\n\tstruct mutex cs_tfm_mutex;\n\tstruct mutex cs_mutex;\n};\n\nstruct ecryptfs_daemon {\n\tu32 flags;\n\tu32 num_queued_msg_ctx;\n\tstruct file *file;\n\tstruct mutex mux;\n\tstruct list_head msg_ctx_out_queue;\n\twait_queue_head_t wait;\n\tstruct hlist_node euid_chain;\n};\n\nstruct ecryptfs_dentry_info {\n\tstruct path lower_path;\n\tstruct callback_head rcu;\n};\n\nstruct ecryptfs_file_info {\n\tstruct file *wfi_file;\n\tstruct ecryptfs_crypt_stat *crypt_stat;\n};\n\nstruct ecryptfs_filename {\n\tstruct list_head crypt_stat_list;\n\tu32 flags;\n\tu32 seq_no;\n\tchar *filename;\n\tchar *encrypted_filename;\n\tsize_t filename_size;\n\tsize_t encrypted_filename_size;\n\tchar fnek_sig[16];\n\tchar dentry_name[57];\n};\n\nstruct ecryptfs_flag_map_elem {\n\tu32 file_flag;\n\tu32 local_flag;\n};\n\nstruct ecryptfs_getdents_callback {\n\tstruct dir_context ctx;\n\tstruct dir_context *caller;\n\tstruct super_block *sb;\n\tint filldir_called;\n\tint entries_written;\n};\n\nstruct ecryptfs_global_auth_tok {\n\tu32 flags;\n\tstruct list_head mount_crypt_stat_list;\n\tstruct key *global_auth_tok_key;\n\tunsigned char sig[17];\n};\n\nstruct ecryptfs_inode_info {\n\tstruct inode vfs_inode;\n\tstruct inode *wii_inode;\n\tstruct mutex lower_file_mutex;\n\tatomic_t lower_file_count;\n\tstruct file *lower_file;\n\tstruct ecryptfs_crypt_stat crypt_stat;\n};\n\nstruct ecryptfs_key_record {\n\tunsigned char type;\n\tsize_t enc_key_size;\n\tunsigned char sig[8];\n\tunsigned char enc_key[512];\n};\n\nstruct ecryptfs_key_sig {\n\tstruct list_head crypt_stat_list;\n\tchar keysig[17];\n};\n\nstruct ecryptfs_key_tfm {\n\tstruct crypto_skcipher *key_tfm;\n\tsize_t key_size;\n\tstruct mutex key_tfm_mutex;\n\tstruct list_head key_tfm_list;\n\tunsigned char cipher_name[32];\n};\n\nstruct ecryptfs_kthread_ctl {\n\tu32 flags;\n\tstruct mutex mux;\n\tstruct list_head req_list;\n\twait_queue_head_t wait;\n};\n\nstruct ecryptfs_message {\n\tu32 index;\n\tu32 data_len;\n\tu8 data[0];\n};\n\nstruct ecryptfs_mount_crypt_stat {\n\tu32 flags;\n\tstruct list_head global_auth_tok_list;\n\tstruct mutex global_auth_tok_list_mutex;\n\tsize_t global_default_cipher_key_size;\n\tsize_t global_default_fn_cipher_key_bytes;\n\tunsigned char global_default_cipher_name[32];\n\tunsigned char global_default_fn_cipher_name[32];\n\tchar global_default_fnek_sig[17];\n};\n\nstruct ecryptfs_msg_ctx {\n\tu8 state;\n\tu8 type;\n\tu32 index;\n\tu32 counter;\n\tsize_t msg_size;\n\tstruct ecryptfs_message *msg;\n\tstruct task_struct *task;\n\tstruct list_head node;\n\tstruct list_head daemon_out_list;\n\tstruct mutex mux;\n};\n\nstruct ecryptfs_open_req {\n\tstruct file **lower_file;\n\tstruct path path;\n\tstruct completion done;\n\tstruct list_head kthread_ctl_list;\n};\n\nstruct ecryptfs_parse_tag_70_packet_silly_stack {\n\tu8 cipher_code;\n\tsize_t max_packet_size;\n\tsize_t packet_size_len;\n\tsize_t parsed_tag_70_packet_size;\n\tsize_t block_aligned_filename_size;\n\tsize_t block_size;\n\tsize_t i;\n\tstruct mutex *tfm_mutex;\n\tchar *decrypted_filename;\n\tstruct ecryptfs_auth_tok *auth_tok;\n\tstruct scatterlist src_sg[2];\n\tstruct scatterlist dst_sg[2];\n\tstruct crypto_skcipher *skcipher_tfm;\n\tstruct skcipher_request *skcipher_req;\n\tchar fnek_sig_hex[17];\n\tchar iv[16];\n\tchar cipher_string[32];\n};\n\nstruct ecryptfs_sb_info {\n\tstruct super_block *wsi_sb;\n\tstruct ecryptfs_mount_crypt_stat mount_crypt_stat;\n};\n\nstruct shash_desc;\n\nstruct ecryptfs_write_tag_70_packet_silly_stack {\n\tu8 cipher_code;\n\tsize_t max_packet_size;\n\tsize_t packet_size_len;\n\tsize_t block_aligned_filename_size;\n\tsize_t block_size;\n\tsize_t i;\n\tsize_t j;\n\tsize_t num_rand_bytes;\n\tstruct mutex *tfm_mutex;\n\tchar *block_aligned_filename;\n\tstruct ecryptfs_auth_tok *auth_tok;\n\tstruct scatterlist src_sg[2];\n\tstruct scatterlist dst_sg[2];\n\tstruct crypto_skcipher *skcipher_tfm;\n\tstruct skcipher_request *skcipher_req;\n\tchar iv[16];\n\tchar hash[16];\n\tchar tmp_hash[16];\n\tstruct crypto_shash *hash_tfm;\n\tstruct shash_desc *hash_desc;\n};\n\nstruct td;\n\nstruct ed {\n\t__hc32 hwINFO;\n\t__hc32 hwTailP;\n\t__hc32 hwHeadP;\n\t__hc32 hwNextED;\n\tdma_addr_t dma;\n\tstruct td *dummy;\n\tstruct ed *ed_next;\n\tstruct ed *ed_prev;\n\tstruct list_head td_list;\n\tstruct list_head in_use_list;\n\tu8 state;\n\tu8 type;\n\tu8 branch;\n\tu16 interval;\n\tu16 load;\n\tu16 last_iso;\n\tu16 tick;\n\tunsigned int takeback_wdh_cnt;\n\tstruct td *pending_td;\n\tlong: 64;\n};\n\nstruct edac_dev_sysfs_attribute {\n\tstruct attribute attr;\n\tssize_t (*show)(struct edac_device_ctl_info *, char *);\n\tssize_t (*store)(struct edac_device_ctl_info *, const char *, size_t);\n};\n\nstruct edac_dev_sysfs_block_attribute {\n\tstruct attribute attr;\n\tssize_t (*show)(struct kobject *, struct attribute *, char *);\n};\n\nstruct edac_device_counter {\n\tu32 ue_count;\n\tu32 ce_count;\n};\n\nstruct edac_device_instance;\n\nstruct edac_device_block {\n\tstruct edac_device_instance *instance;\n\tchar name[32];\n\tstruct edac_device_counter counters;\n\tint nr_attribs;\n\tstruct edac_dev_sysfs_block_attribute *block_attributes;\n\tstruct kobject kobj;\n};\n\nstruct edac_device_ctl_info {\n\tstruct list_head link;\n\tstruct module *owner;\n\tint dev_idx;\n\tint log_ue;\n\tint log_ce;\n\tint panic_on_ue;\n\tunsigned int poll_msec;\n\tlong unsigned int delay;\n\tstruct edac_dev_sysfs_attribute *sysfs_attributes;\n\tconst struct bus_type *edac_subsys;\n\tint op_state;\n\tstruct delayed_work work;\n\tvoid (*edac_check)(struct edac_device_ctl_info *);\n\tstruct device *dev;\n\tconst char *mod_name;\n\tconst char *ctl_name;\n\tconst char *dev_name;\n\tvoid *pvt_info;\n\tlong unsigned int start_time;\n\tchar name[32];\n\tu32 nr_instances;\n\tstruct edac_device_instance *instances;\n\tstruct edac_device_block *blocks;\n\tstruct edac_device_counter counters;\n\tstruct kobject kobj;\n};\n\nstruct edac_device_instance {\n\tstruct edac_device_ctl_info *ctl;\n\tchar name[35];\n\tstruct edac_device_counter counters;\n\tu32 nr_blocks;\n\tstruct edac_device_block *blocks;\n\tstruct kobject kobj;\n};\n\nstruct edac_mc_layer {\n\tenum edac_mc_layer_type type;\n\tunsigned int size;\n\tbool is_virt_csrow;\n};\n\nstruct edac_pci_counter {\n\tatomic_t pe_count;\n\tatomic_t npe_count;\n};\n\nstruct edac_pci_ctl_info {\n\tstruct list_head link;\n\tint pci_idx;\n\tint op_state;\n\tstruct delayed_work work;\n\tvoid (*edac_check)(struct edac_pci_ctl_info *);\n\tstruct device *dev;\n\tconst char *mod_name;\n\tconst char *ctl_name;\n\tconst char *dev_name;\n\tvoid *pvt_info;\n\tlong unsigned int start_time;\n\tchar name[32];\n\tstruct edac_pci_counter counters;\n\tstruct kobject kobj;\n};\n\nstruct edac_pci_dev_attribute {\n\tstruct attribute attr;\n\tvoid *value;\n\tssize_t (*show)(void *, char *);\n\tssize_t (*store)(void *, const char *, size_t);\n};\n\nstruct edac_pci_gen_data {\n\tint edac_idx;\n};\n\nstruct edac_raw_error_desc {\n\tchar location[256];\n\tchar label[296];\n\tlong int grain;\n\tu16 error_count;\n\tenum hw_event_mc_err_type type;\n\tint top_layer;\n\tint mid_layer;\n\tint low_layer;\n\tlong unsigned int page_frame_number;\n\tlong unsigned int offset_in_page;\n\tlong unsigned int syndrome;\n\tconst char *msg;\n\tconst char *other_detail;\n};\n\nstruct edd {\n\tunsigned int mbr_signature[16];\n\tstruct edd_info edd_info[6];\n\tunsigned char mbr_signature_nr;\n\tunsigned char edd_info_nr;\n};\n\nstruct edd_device;\n\nstruct edd_attribute {\n\tstruct attribute attr;\n\tssize_t (*show)(struct edd_device *, char *);\n\tint (*test)(struct edd_device *);\n};\n\nstruct edd_device {\n\tunsigned int index;\n\tunsigned int mbr_signature;\n\tstruct edd_info *info;\n\tstruct kobject kobj;\n};\n\nstruct est_timings {\n\tu8 t1;\n\tu8 t2;\n\tu8 mfg_rsvd;\n};\n\nstruct edid {\n\tu8 header[8];\n\tunion {\n\t\tstruct drm_edid_product_id product_id;\n\t\tstruct {\n\t\t\tu8 mfg_id[2];\n\t\t\tu8 prod_code[2];\n\t\t\tu32 serial;\n\t\t\tu8 mfg_week;\n\t\t\tu8 mfg_year;\n\t\t} __attribute__((packed));\n\t};\n\tu8 version;\n\tu8 revision;\n\tu8 input;\n\tu8 width_cm;\n\tu8 height_cm;\n\tu8 gamma;\n\tu8 features;\n\tu8 red_green_lo;\n\tu8 blue_white_lo;\n\tu8 red_x;\n\tu8 red_y;\n\tu8 green_x;\n\tu8 green_y;\n\tu8 blue_x;\n\tu8 blue_y;\n\tu8 white_x;\n\tu8 white_y;\n\tstruct est_timings established_timings;\n\tstruct std_timing standard_timings[8];\n\tstruct detailed_timing detailed_timings[4];\n\tu8 extensions;\n\tu8 checksum;\n};\n\nstruct edid_quirk {\n\tconst struct drm_edid_ident ident;\n\tu32 quirks;\n};\n\nstruct eee_config {\n\tu32 tx_lpi_timer;\n\tbool tx_lpi_enabled;\n\tbool eee_enabled;\n};\n\nstruct ethtool_keee {\n\tlong unsigned int supported[2];\n\tlong unsigned int advertised[2];\n\tlong unsigned int lp_advertised[2];\n\tu32 tx_lpi_timer;\n\tbool tx_lpi_enabled;\n\tbool eee_active;\n\tbool eee_enabled;\n};\n\nstruct eee_reply_data {\n\tstruct ethnl_reply_data base;\n\tstruct ethtool_keee eee;\n};\n\nstruct eeprom_reply_data {\n\tstruct ethnl_reply_data base;\n\tu32 length;\n\tu8 *data;\n};\n\nstruct ethnl_req_info {\n\tstruct net_device *dev;\n\tnetdevice_tracker dev_tracker;\n\tu32 flags;\n};\n\nstruct eeprom_req_info {\n\tstruct ethnl_req_info base;\n\tu32 offset;\n\tu32 length;\n\tu8 page;\n\tu8 bank;\n\tu8 i2c_address;\n};\n\ntypedef efi_status_t efi_get_time_t(efi_time_t *, efi_time_cap_t *);\n\ntypedef efi_status_t efi_set_time_t(efi_time_t *);\n\ntypedef efi_status_t efi_get_wakeup_time_t(efi_bool_t *, efi_bool_t *, efi_time_t *);\n\ntypedef efi_status_t efi_set_wakeup_time_t(efi_bool_t, efi_time_t *);\n\ntypedef efi_status_t efi_get_variable_t(efi_char16_t *, efi_guid_t *, u32 *, long unsigned int *, void *);\n\ntypedef efi_status_t efi_get_next_variable_t(long unsigned int *, efi_char16_t *, efi_guid_t *);\n\ntypedef efi_status_t efi_set_variable_t(efi_char16_t *, efi_guid_t *, u32, long unsigned int, void *);\n\ntypedef efi_status_t efi_query_variable_info_t(u32, u64 *, u64 *, u64 *);\n\ntypedef efi_status_t efi_update_capsule_t(efi_capsule_header_t **, long unsigned int, long unsigned int);\n\ntypedef efi_status_t efi_query_capsule_caps_t(efi_capsule_header_t **, long unsigned int, u64 *, int *);\n\ntypedef efi_status_t efi_get_next_high_mono_count_t(u32 *);\n\ntypedef void efi_reset_system_t(int, efi_status_t, long unsigned int, efi_char16_t *);\n\nstruct efi_memory_map {\n\tphys_addr_t phys_map;\n\tvoid *map;\n\tvoid *map_end;\n\tint nr_map;\n\tlong unsigned int desc_version;\n\tlong unsigned int desc_size;\n\tlong unsigned int flags;\n};\n\nstruct efi {\n\tconst efi_runtime_services_t *runtime;\n\tunsigned int runtime_version;\n\tunsigned int runtime_supported_mask;\n\tlong unsigned int acpi;\n\tlong unsigned int acpi20;\n\tlong unsigned int smbios;\n\tlong unsigned int smbios3;\n\tlong unsigned int esrt;\n\tlong unsigned int tpm_log;\n\tlong unsigned int tpm_final_log;\n\tlong unsigned int mokvar_table;\n\tlong unsigned int coco_secret;\n\tlong unsigned int unaccepted;\n\tefi_get_time_t *get_time;\n\tefi_set_time_t *set_time;\n\tefi_get_wakeup_time_t *get_wakeup_time;\n\tefi_set_wakeup_time_t *set_wakeup_time;\n\tefi_get_variable_t *get_variable;\n\tefi_get_next_variable_t *get_next_variable;\n\tefi_set_variable_t *set_variable;\n\tefi_set_variable_t *set_variable_nonblocking;\n\tefi_query_variable_info_t *query_variable_info;\n\tefi_query_variable_info_t *query_variable_info_nonblocking;\n\tefi_update_capsule_t *update_capsule;\n\tefi_query_capsule_caps_t *query_capsule_caps;\n\tefi_get_next_high_mono_count_t *get_next_high_mono_count;\n\tefi_reset_system_t *reset_system;\n\tstruct efi_memory_map memmap;\n\tlong unsigned int flags;\n};\n\nstruct efi_embedded_fw {\n\tstruct list_head list;\n\tconst char *name;\n\tconst u8 *data;\n\tsize_t length;\n};\n\nstruct efi_embedded_fw_desc {\n\tconst char *name;\n\tu8 prefix[8];\n\tu32 length;\n\tu8 sha256[32];\n};\n\nstruct efi_error_code {\n\tefi_status_t status;\n\tint errno;\n\tconst char *description;\n};\n\nstruct efi_mem_range {\n\tstruct range range;\n\tu64 attribute;\n};\n\nstruct efi_memory_map_data {\n\tphys_addr_t phys_map;\n\tlong unsigned int size;\n\tlong unsigned int desc_version;\n\tlong unsigned int desc_size;\n\tlong unsigned int flags;\n};\n\nstruct efi_mokvar_sysfs_attr {\n\tstruct bin_attribute bin_attr;\n\tstruct list_head node;\n};\n\nstruct efi_mokvar_table_entry {\n\tchar name[256];\n\tu64 data_size;\n\tu8 data[0];\n};\n\nunion efi_rts_args {\n\tstruct {\n\t\tefi_time_t *time;\n\t\tefi_time_cap_t *capabilities;\n\t} GET_TIME;\n\tstruct {\n\t\tefi_time_t *time;\n\t} SET_TIME;\n\tstruct {\n\t\tefi_bool_t *enabled;\n\t\tefi_bool_t *pending;\n\t\tefi_time_t *time;\n\t} GET_WAKEUP_TIME;\n\tstruct {\n\t\tefi_bool_t enable;\n\t\tefi_time_t *time;\n\t} SET_WAKEUP_TIME;\n\tstruct {\n\t\tefi_char16_t *name;\n\t\tefi_guid_t *vendor;\n\t\tu32 *attr;\n\t\tlong unsigned int *data_size;\n\t\tvoid *data;\n\t} GET_VARIABLE;\n\tstruct {\n\t\tlong unsigned int *name_size;\n\t\tefi_char16_t *name;\n\t\tefi_guid_t *vendor;\n\t} GET_NEXT_VARIABLE;\n\tstruct {\n\t\tefi_char16_t *name;\n\t\tefi_guid_t *vendor;\n\t\tu32 attr;\n\t\tlong unsigned int data_size;\n\t\tvoid *data;\n\t} SET_VARIABLE;\n\tstruct {\n\t\tu32 attr;\n\t\tu64 *storage_space;\n\t\tu64 *remaining_space;\n\t\tu64 *max_variable_size;\n\t} QUERY_VARIABLE_INFO;\n\tstruct {\n\t\tu32 *high_count;\n\t} GET_NEXT_HIGH_MONO_COUNT;\n\tstruct {\n\t\tefi_capsule_header_t **capsules;\n\t\tlong unsigned int count;\n\t\tlong unsigned int sg_list;\n\t} UPDATE_CAPSULE;\n\tstruct {\n\t\tefi_capsule_header_t **capsules;\n\t\tlong unsigned int count;\n\t\tu64 *max_size;\n\t\tint *reset_type;\n\t} QUERY_CAPSULE_CAPS;\n\tstruct {\n\t\tefi_status_t (*acpi_prm_handler)(u64, void *);\n\t\tu64 param_buffer_addr;\n\t\tvoid *context;\n\t} ACPI_PRM_HANDLER;\n};\n\nstruct efi_runtime_map_entry {\n\tefi_memory_desc_t md;\n\tstruct kobject kobj;\n};\n\nstruct efi_runtime_work {\n\tunion efi_rts_args *args;\n\tefi_status_t status;\n\tstruct work_struct work;\n\tenum efi_rts_ids efi_rts_id;\n\tstruct completion efi_rts_comp;\n\tconst void *caller;\n};\n\nstruct efi_setup_data {\n\tu64 fw_vendor;\n\tu64 __unused;\n\tu64 tables;\n\tu64 smbios;\n\tu64 reserved[8];\n};\n\nstruct efi_system_resource_entry_v1 {\n\tefi_guid_t fw_class;\n\tu32 fw_type;\n\tu32 fw_version;\n\tu32 lowest_supported_fw_version;\n\tu32 capsule_flags;\n\tu32 last_attempt_version;\n\tu32 last_attempt_status;\n};\n\nstruct efi_system_resource_table {\n\tu32 fw_resource_count;\n\tu32 fw_resource_count_max;\n\tu64 fw_resource_version;\n\tu8 entries[0];\n};\n\nstruct efi_tcg2_final_events_table {\n\tu64 version;\n\tu64 nr_events;\n\tu8 events[0];\n};\n\nstruct efi_unaccepted_memory {\n\tu32 version;\n\tu32 unit_size;\n\tu64 phys_base;\n\tu64 size;\n\tlong unsigned int bitmap[0];\n};\n\nstruct efi_variable {\n\tefi_char16_t VariableName[512];\n\tefi_guid_t VendorGuid;\n\t__u32 Attributes;\n};\n\nstruct efifb_dmi_info {\n\tchar *optname;\n\tlong unsigned int base;\n\tint stride;\n\tint width;\n\tint height;\n\tint flags;\n};\n\nstruct efivar_entry {\n\tstruct efi_variable var;\n\tstruct list_head list;\n\tstruct kobject kobj;\n};\n\ntypedef efi_status_t efi_query_variable_store_t(u32, long unsigned int, bool);\n\nstruct efivar_operations {\n\tefi_get_variable_t *get_variable;\n\tefi_get_next_variable_t *get_next_variable;\n\tefi_set_variable_t *set_variable;\n\tefi_set_variable_t *set_variable_nonblocking;\n\tefi_query_variable_store_t *query_variable_store;\n\tefi_query_variable_info_t *query_variable_info;\n};\n\nstruct efivarfs_mount_opts {\n\tkuid_t uid;\n\tkgid_t gid;\n};\n\nstruct efivarfs_fs_info {\n\tstruct efivarfs_mount_opts mount_opts;\n\tstruct list_head efivarfs_list;\n\tstruct super_block *sb;\n\tstruct notifier_block nb;\n};\n\nstruct efivars {\n\tstruct kset *kset;\n\tconst struct efivar_operations *ops;\n};\n\nstruct ehci_caps {\n\tu32 hc_capbase;\n\tu32 hcs_params;\n\tu32 hcc_params;\n\tu8 portroute[8];\n};\n\nstruct ehci_dbg_port {\n\tu32 control;\n\tu32 pids;\n\tu32 data03;\n\tu32 data47;\n\tu32 address;\n};\n\nstruct ehci_dev {\n\tu32 bus;\n\tu32 slot;\n\tu32 func;\n};\n\nstruct usb_hcd;\n\nstruct ehci_driver_overrides {\n\tsize_t extra_priv_size;\n\tint (*reset)(struct usb_hcd *);\n\tint (*port_power)(struct usb_hcd *, int, bool);\n};\n\nstruct ehci_qh;\n\nstruct ehci_itd;\n\nstruct ehci_sitd;\n\nstruct ehci_fstn;\n\nunion ehci_shadow {\n\tstruct ehci_qh *qh;\n\tstruct ehci_itd *itd;\n\tstruct ehci_sitd *sitd;\n\tstruct ehci_fstn *fstn;\n\t__le32 *hw_next;\n\tvoid *ptr;\n};\n\nstruct ehci_fstn {\n\t__le32 hw_next;\n\t__le32 hw_prev;\n\tdma_addr_t fstn_dma;\n\tunion ehci_shadow fstn_next;\n\tlong: 64;\n};\n\nstruct ehci_stats {\n\tlong unsigned int normal;\n\tlong unsigned int error;\n\tlong unsigned int iaa;\n\tlong unsigned int lost_iaa;\n\tlong unsigned int complete;\n\tlong unsigned int unlink;\n};\n\nstruct ehci_regs;\n\nstruct ehci_hcd {\n\tenum ehci_hrtimer_event next_hrtimer_event;\n\tunsigned int enabled_hrtimer_events;\n\tktime_t hr_timeouts[12];\n\tstruct hrtimer hrtimer;\n\tint PSS_poll_count;\n\tint ASS_poll_count;\n\tint died_poll_count;\n\tstruct ehci_caps *caps;\n\tstruct ehci_regs *regs;\n\tstruct ehci_dbg_port *debug;\n\t__u32 hcs_params;\n\tspinlock_t lock;\n\tenum ehci_rh_state rh_state;\n\tbool scanning: 1;\n\tbool need_rescan: 1;\n\tbool intr_unlinking: 1;\n\tbool iaa_in_progress: 1;\n\tbool async_unlinking: 1;\n\tbool shutdown: 1;\n\tstruct ehci_qh *qh_scan_next;\n\tstruct ehci_qh *async;\n\tstruct ehci_qh *dummy;\n\tstruct list_head async_unlink;\n\tstruct list_head async_idle;\n\tunsigned int async_unlink_cycle;\n\tunsigned int async_count;\n\t__le32 old_current;\n\t__le32 old_token;\n\tunsigned int periodic_size;\n\t__le32 *periodic;\n\tdma_addr_t periodic_dma;\n\tstruct list_head intr_qh_list;\n\tunsigned int i_thresh;\n\tunion ehci_shadow *pshadow;\n\tstruct list_head intr_unlink_wait;\n\tstruct list_head intr_unlink;\n\tunsigned int intr_unlink_wait_cycle;\n\tunsigned int intr_unlink_cycle;\n\tunsigned int now_frame;\n\tunsigned int last_iso_frame;\n\tunsigned int intr_count;\n\tunsigned int isoc_count;\n\tunsigned int periodic_count;\n\tunsigned int uframe_periodic_max;\n\tstruct list_head cached_itd_list;\n\tstruct ehci_itd *last_itd_to_free;\n\tstruct list_head cached_sitd_list;\n\tstruct ehci_sitd *last_sitd_to_free;\n\tlong unsigned int reset_done[15];\n\tlong unsigned int bus_suspended;\n\tlong unsigned int companion_ports;\n\tlong unsigned int owned_ports;\n\tlong unsigned int port_c_suspend;\n\tlong unsigned int suspended_ports;\n\tlong unsigned int resuming_ports;\n\tstruct dma_pool *qh_pool;\n\tstruct dma_pool *qtd_pool;\n\tstruct dma_pool *itd_pool;\n\tstruct dma_pool *sitd_pool;\n\tunsigned int random_frame;\n\tlong unsigned int next_statechange;\n\tktime_t last_periodic_enable;\n\tu32 command;\n\tunsigned int no_selective_suspend: 1;\n\tunsigned int has_fsl_port_bug: 1;\n\tunsigned int has_fsl_hs_errata: 1;\n\tunsigned int has_fsl_susp_errata: 1;\n\tunsigned int has_ci_pec_bug: 1;\n\tunsigned int big_endian_mmio: 1;\n\tunsigned int big_endian_desc: 1;\n\tunsigned int big_endian_capbase: 1;\n\tunsigned int has_amcc_usb23: 1;\n\tunsigned int need_io_watchdog: 1;\n\tunsigned int amd_pll_fix: 1;\n\tunsigned int use_dummy_qh: 1;\n\tunsigned int has_synopsys_hc_bug: 1;\n\tunsigned int frame_index_bug: 1;\n\tunsigned int need_oc_pp_cycle: 1;\n\tunsigned int imx28_write_fix: 1;\n\tunsigned int spurious_oc: 1;\n\tunsigned int is_aspeed: 1;\n\tunsigned int zx_wakeup_clear_needed: 1;\n\t__le32 *ohci_hcctrl_reg;\n\tunsigned int has_hostpc: 1;\n\tunsigned int has_tdi_phy_lpm: 1;\n\tunsigned int has_ppcd: 1;\n\tu8 sbrn;\n\tstruct ehci_stats stats;\n\tstruct dentry *debug_dir;\n\tu8 bandwidth[64];\n\tu8 tt_budget[64];\n\tstruct list_head tt_list;\n\tlong unsigned int priv[0];\n};\n\nstruct ehci_iso_packet {\n\tu64 bufp;\n\t__le32 transaction;\n\tu8 cross;\n\tu32 buf1;\n};\n\nstruct ehci_iso_sched {\n\tstruct list_head td_list;\n\tunsigned int span;\n\tunsigned int first_packet;\n\tstruct ehci_iso_packet packet[0];\n};\n\nstruct usb_host_endpoint;\n\nstruct ehci_per_sched {\n\tstruct usb_device *udev;\n\tstruct usb_host_endpoint *ep;\n\tstruct list_head ps_list;\n\tu16 tt_usecs;\n\tu16 cs_mask;\n\tu16 period;\n\tu16 phase;\n\tu8 bw_phase;\n\tu8 phase_uf;\n\tu8 usecs;\n\tu8 c_usecs;\n\tu8 bw_uperiod;\n\tu8 bw_period;\n};\n\nstruct ehci_qh_hw;\n\nstruct ehci_iso_stream {\n\tstruct ehci_qh_hw *hw;\n\tu8 bEndpointAddress;\n\tu8 highspeed;\n\tstruct list_head td_list;\n\tstruct list_head free_list;\n\tstruct ehci_per_sched ps;\n\tunsigned int next_uframe;\n\t__le32 splits;\n\tu16 uperiod;\n\tu16 maxp;\n\tunsigned int bandwidth;\n\t__le32 buf0;\n\t__le32 buf1;\n\t__le32 buf2;\n\t__le32 address;\n};\n\nstruct ehci_itd {\n\t__le32 hw_next;\n\t__le32 hw_transaction[8];\n\t__le32 hw_bufp[7];\n\t__le32 hw_bufp_hi[7];\n\tdma_addr_t itd_dma;\n\tunion ehci_shadow itd_next;\n\tstruct urb *urb;\n\tstruct ehci_iso_stream *stream;\n\tstruct list_head itd_list;\n\tunsigned int frame;\n\tunsigned int pg;\n\tunsigned int index[8];\n\tlong: 64;\n};\n\nstruct ehci_platform_priv {\n\tstruct clk *clks[4];\n\tstruct reset_control *rsts;\n\tbool reset_on_resume;\n\tbool quirk_poll;\n\tstruct timer_list poll_timer;\n\tstruct delayed_work poll_work;\n};\n\nstruct ehci_qtd;\n\nstruct ehci_qh {\n\tstruct ehci_qh_hw *hw;\n\tdma_addr_t qh_dma;\n\tunion ehci_shadow qh_next;\n\tstruct list_head qtd_list;\n\tstruct list_head intr_node;\n\tstruct ehci_qtd *dummy;\n\tstruct list_head unlink_node;\n\tstruct ehci_per_sched ps;\n\tunsigned int unlink_cycle;\n\tu8 qh_state;\n\tu8 xacterrs;\n\tu8 unlink_reason;\n\tu8 gap_uf;\n\tunsigned int is_out: 1;\n\tunsigned int clearing_tt: 1;\n\tunsigned int dequeue_during_giveback: 1;\n\tunsigned int should_be_inactive: 1;\n};\n\nstruct ehci_qh_hw {\n\t__le32 hw_next;\n\t__le32 hw_info1;\n\t__le32 hw_info2;\n\t__le32 hw_current;\n\t__le32 hw_qtd_next;\n\t__le32 hw_alt_next;\n\t__le32 hw_token;\n\t__le32 hw_buf[5];\n\t__le32 hw_buf_hi[5];\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct ehci_qtd {\n\t__le32 hw_next;\n\t__le32 hw_alt_next;\n\t__le32 hw_token;\n\t__le32 hw_buf[5];\n\t__le32 hw_buf_hi[5];\n\tdma_addr_t qtd_dma;\n\tstruct list_head qtd_list;\n\tstruct urb *urb;\n\tsize_t length;\n};\n\nstruct ehci_regs {\n\tu32 command;\n\tu32 status;\n\tu32 intr_enable;\n\tu32 frame_index;\n\tu32 segment;\n\tu32 frame_list;\n\tu32 async_next;\n\tu32 reserved1[2];\n\tu32 txfill_tuning;\n\tu32 reserved2[6];\n\tu32 configured_flag;\n\tunion {\n\t\tu32 port_status[15];\n\t\tstruct {\n\t\t\tu32 reserved3[9];\n\t\t\tu32 usbmode;\n\t\t};\n\t};\n\tunion {\n\t\tstruct {\n\t\t\tu32 reserved4;\n\t\t\tu32 hostpc[15];\n\t\t};\n\t\tu32 brcm_insnreg[4];\n\t};\n\tu32 reserved5[2];\n\tu32 usbmode_ex;\n};\n\nstruct ehci_sitd {\n\t__le32 hw_next;\n\t__le32 hw_fullspeed_ep;\n\t__le32 hw_uframe;\n\t__le32 hw_results;\n\t__le32 hw_buf[2];\n\t__le32 hw_backpointer;\n\t__le32 hw_buf_hi[2];\n\tdma_addr_t sitd_dma;\n\tunion ehci_shadow sitd_next;\n\tstruct urb *urb;\n\tstruct ehci_iso_stream *stream;\n\tstruct list_head sitd_list;\n\tunsigned int frame;\n\tunsigned int index;\n};\n\nstruct ehci_tt {\n\tu16 bandwidth[8];\n\tstruct list_head tt_list;\n\tstruct list_head ps_list;\n\tstruct usb_tt *usb_tt;\n\tint tt_port;\n};\n\nstruct ei_entry {\n\tstruct list_head list;\n\tlong unsigned int start_addr;\n\tlong unsigned int end_addr;\n\tint etype;\n\tvoid *priv;\n};\n\nstruct eisa_device_id {\n\tchar sig[8];\n\tkernel_ulong_t driver_data;\n};\n\nstruct eisa_device {\n\tstruct eisa_device_id id;\n\tint slot;\n\tint state;\n\tlong unsigned int base_addr;\n\tstruct resource res[4];\n\tu64 dma_mask;\n\tstruct device dev;\n\tchar pretty_name[50];\n};\n\nstruct eisa_device_info {\n\tstruct eisa_device_id id;\n\tchar name[50];\n};\n\nstruct eisa_driver {\n\tconst struct eisa_device_id *id_table;\n\tstruct device_driver driver;\n};\n\nstruct eisa_root_device {\n\tstruct device *dev;\n\tstruct resource *res;\n\tlong unsigned int bus_base_addr;\n\tint slots;\n\tint force_probe;\n\tu64 dma_mask;\n\tint bus_nr;\n\tstruct resource eisa_root_res;\n};\n\nstruct touchscreen_properties {\n\tunsigned int max_x;\n\tunsigned int max_y;\n\tbool invert_x;\n\tbool invert_y;\n\tbool swap_x_y;\n};\n\nstruct elants_data {\n\tstruct i2c_client *client;\n\tstruct input_dev *input;\n\tstruct regulator *vcc33;\n\tstruct regulator *vccio;\n\tstruct gpio_desc *reset_gpio;\n\tu16 fw_version;\n\tu8 test_version;\n\tu8 solution_version;\n\tu8 bc_version;\n\tu8 iap_version;\n\tu16 hw_version;\n\tu8 major_res;\n\tunsigned int x_res;\n\tunsigned int y_res;\n\tunsigned int x_max;\n\tunsigned int y_max;\n\tunsigned int phy_x;\n\tunsigned int phy_y;\n\tstruct touchscreen_properties prop;\n\tenum elants_state state;\n\tenum elants_chip_id chip_id;\n\tenum elants_iap_mode iap_mode;\n\tstruct mutex sysfs_mutex;\n\tu8 cmd_resp[4];\n\tstruct completion cmd_done;\n\tbool keep_power_in_suspend;\n\tlong: 64;\n\tu8 buf[169];\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct elants_version_attribute {\n\tstruct device_attribute dattr;\n\tsize_t field_offset;\n\tsize_t field_size;\n};\n\nstruct elevator_queue;\n\nstruct io_cq;\n\nstruct elevator_mq_ops {\n\tint (*init_sched)(struct request_queue *, struct elevator_type *);\n\tvoid (*exit_sched)(struct elevator_queue *);\n\tint (*init_hctx)(struct blk_mq_hw_ctx *, unsigned int);\n\tvoid (*exit_hctx)(struct blk_mq_hw_ctx *, unsigned int);\n\tvoid (*depth_updated)(struct blk_mq_hw_ctx *);\n\tbool (*allow_merge)(struct request_queue *, struct request *, struct bio *);\n\tbool (*bio_merge)(struct request_queue *, struct bio *, unsigned int);\n\tint (*request_merge)(struct request_queue *, struct request **, struct bio *);\n\tvoid (*request_merged)(struct request_queue *, struct request *, enum elv_merge);\n\tvoid (*requests_merged)(struct request_queue *, struct request *, struct request *);\n\tvoid (*limit_depth)(blk_opf_t, struct blk_mq_alloc_data *);\n\tvoid (*prepare_request)(struct request *);\n\tvoid (*finish_request)(struct request *);\n\tvoid (*insert_requests)(struct blk_mq_hw_ctx *, struct list_head *, blk_insert_t);\n\tstruct request * (*dispatch_request)(struct blk_mq_hw_ctx *);\n\tbool (*has_work)(struct blk_mq_hw_ctx *);\n\tvoid (*completed_request)(struct request *, u64);\n\tvoid (*requeue_request)(struct request *);\n\tstruct request * (*former_request)(struct request_queue *, struct request *);\n\tstruct request * (*next_request)(struct request_queue *, struct request *);\n\tvoid (*init_icq)(struct io_cq *);\n\tvoid (*exit_icq)(struct io_cq *);\n};\n\nstruct elevator_queue {\n\tstruct elevator_type *type;\n\tvoid *elevator_data;\n\tstruct kobject kobj;\n\tstruct mutex sysfs_lock;\n\tlong unsigned int flags;\n\tstruct hlist_head hash[64];\n};\n\nstruct elv_fs_entry;\n\nstruct elevator_type {\n\tstruct kmem_cache *icq_cache;\n\tstruct elevator_mq_ops ops;\n\tsize_t icq_size;\n\tsize_t icq_align;\n\tstruct elv_fs_entry *elevator_attrs;\n\tconst char *elevator_name;\n\tconst char *elevator_alias;\n\tstruct module *elevator_owner;\n\tconst struct blk_mq_debugfs_attr *queue_debugfs_attrs;\n\tconst struct blk_mq_debugfs_attr *hctx_debugfs_attrs;\n\tchar icq_cache_name[22];\n\tstruct list_head list;\n};\n\nstruct elf32_hdr {\n\tunsigned char e_ident[16];\n\tElf32_Half e_type;\n\tElf32_Half e_machine;\n\tElf32_Word e_version;\n\tElf32_Addr e_entry;\n\tElf32_Off e_phoff;\n\tElf32_Off e_shoff;\n\tElf32_Word e_flags;\n\tElf32_Half e_ehsize;\n\tElf32_Half e_phentsize;\n\tElf32_Half e_phnum;\n\tElf32_Half e_shentsize;\n\tElf32_Half e_shnum;\n\tElf32_Half e_shstrndx;\n};\n\ntypedef struct elf32_hdr Elf32_Ehdr;\n\nstruct elf32_note {\n\tElf32_Word n_namesz;\n\tElf32_Word n_descsz;\n\tElf32_Word n_type;\n};\n\ntypedef struct elf32_note Elf32_Nhdr;\n\nstruct elf32_phdr {\n\tElf32_Word p_type;\n\tElf32_Off p_offset;\n\tElf32_Addr p_vaddr;\n\tElf32_Addr p_paddr;\n\tElf32_Word p_filesz;\n\tElf32_Word p_memsz;\n\tElf32_Word p_flags;\n\tElf32_Word p_align;\n};\n\ntypedef struct elf32_phdr Elf32_Phdr;\n\nstruct elf32_shdr {\n\tElf32_Word sh_name;\n\tElf32_Word sh_type;\n\tElf32_Word sh_flags;\n\tElf32_Addr sh_addr;\n\tElf32_Off sh_offset;\n\tElf32_Word sh_size;\n\tElf32_Word sh_link;\n\tElf32_Word sh_info;\n\tElf32_Word sh_addralign;\n\tElf32_Word sh_entsize;\n};\n\nstruct elf64_hdr {\n\tunsigned char e_ident[16];\n\tElf64_Half e_type;\n\tElf64_Half e_machine;\n\tElf64_Word e_version;\n\tElf64_Addr e_entry;\n\tElf64_Off e_phoff;\n\tElf64_Off e_shoff;\n\tElf64_Word e_flags;\n\tElf64_Half e_ehsize;\n\tElf64_Half e_phentsize;\n\tElf64_Half e_phnum;\n\tElf64_Half e_shentsize;\n\tElf64_Half e_shnum;\n\tElf64_Half e_shstrndx;\n};\n\ntypedef struct elf64_hdr Elf64_Ehdr;\n\nstruct elf64_note {\n\tElf64_Word n_namesz;\n\tElf64_Word n_descsz;\n\tElf64_Word n_type;\n};\n\ntypedef struct elf64_note Elf64_Nhdr;\n\nstruct elf64_phdr {\n\tElf64_Word p_type;\n\tElf64_Word p_flags;\n\tElf64_Off p_offset;\n\tElf64_Addr p_vaddr;\n\tElf64_Addr p_paddr;\n\tElf64_Xword p_filesz;\n\tElf64_Xword p_memsz;\n\tElf64_Xword p_align;\n};\n\ntypedef struct elf64_phdr Elf64_Phdr;\n\nstruct elf64_rela {\n\tElf64_Addr r_offset;\n\tElf64_Xword r_info;\n\tElf64_Sxword r_addend;\n};\n\ntypedef struct elf64_rela Elf64_Rela;\n\nstruct elf64_shdr {\n\tElf64_Word sh_name;\n\tElf64_Word sh_type;\n\tElf64_Xword sh_flags;\n\tElf64_Addr sh_addr;\n\tElf64_Off sh_offset;\n\tElf64_Xword sh_size;\n\tElf64_Word sh_link;\n\tElf64_Word sh_info;\n\tElf64_Xword sh_addralign;\n\tElf64_Xword sh_entsize;\n};\n\ntypedef struct elf64_shdr Elf64_Shdr;\n\nstruct elf64_sym {\n\tElf64_Word st_name;\n\tunsigned char st_info;\n\tunsigned char st_other;\n\tElf64_Half st_shndx;\n\tElf64_Addr st_value;\n\tElf64_Xword st_size;\n};\n\ntypedef struct elf64_sym Elf64_Sym;\n\nstruct memelfnote {\n\tconst char *name;\n\tint type;\n\tunsigned int datasz;\n\tvoid *data;\n};\n\nstruct siginfo {\n\tunion {\n\t\tstruct {\n\t\t\tint si_signo;\n\t\t\tint si_errno;\n\t\t\tint si_code;\n\t\t\tunion __sifields _sifields;\n\t\t};\n\t\tint _si_pad[32];\n\t};\n};\n\ntypedef struct siginfo siginfo_t;\n\nstruct elf_thread_core_info;\n\nstruct elf_note_info {\n\tstruct elf_thread_core_info *thread;\n\tstruct memelfnote psinfo;\n\tstruct memelfnote signote;\n\tstruct memelfnote auxv;\n\tstruct memelfnote files;\n\tsiginfo_t csigdata;\n\tsize_t size;\n\tint thread_notes;\n};\n\nstruct elf_thread_core_info___2;\n\nstruct elf_note_info___2 {\n\tstruct elf_thread_core_info___2 *thread;\n\tstruct memelfnote psinfo;\n\tstruct memelfnote signote;\n\tstruct memelfnote auxv;\n\tstruct memelfnote files;\n\tcompat_siginfo_t csigdata;\n\tsize_t size;\n\tint thread_notes;\n};\n\nstruct elf_prpsinfo {\n\tchar pr_state;\n\tchar pr_sname;\n\tchar pr_zomb;\n\tchar pr_nice;\n\tlong unsigned int pr_flag;\n\t__kernel_uid_t pr_uid;\n\t__kernel_gid_t pr_gid;\n\tpid_t pr_pid;\n\tpid_t pr_ppid;\n\tpid_t pr_pgrp;\n\tpid_t pr_sid;\n\tchar pr_fname[16];\n\tchar pr_psargs[80];\n};\n\nstruct elf_siginfo {\n\tint si_signo;\n\tint si_code;\n\tint si_errno;\n};\n\nstruct elf_prstatus_common {\n\tstruct elf_siginfo pr_info;\n\tshort int pr_cursig;\n\tlong unsigned int pr_sigpend;\n\tlong unsigned int pr_sighold;\n\tpid_t pr_pid;\n\tpid_t pr_ppid;\n\tpid_t pr_pgrp;\n\tpid_t pr_sid;\n\tstruct __kernel_old_timeval pr_utime;\n\tstruct __kernel_old_timeval pr_stime;\n\tstruct __kernel_old_timeval pr_cutime;\n\tstruct __kernel_old_timeval pr_cstime;\n};\n\nstruct elf_prstatus {\n\tstruct elf_prstatus_common common;\n\telf_gregset_t pr_reg;\n\tint pr_fpvalid;\n};\n\nstruct elf_thread_core_info {\n\tstruct elf_thread_core_info *next;\n\tstruct task_struct *task;\n\tstruct elf_prstatus prstatus;\n\tstruct memelfnote notes[0];\n};\n\nstruct elf_thread_core_info___2 {\n\tstruct elf_thread_core_info___2 *next;\n\tstruct task_struct *task;\n\tstruct compat_elf_prstatus prstatus;\n\tstruct memelfnote notes[0];\n};\n\nstruct elv_fs_entry {\n\tstruct attribute attr;\n\tssize_t (*show)(struct elevator_queue *, char *);\n\tssize_t (*store)(struct elevator_queue *, const char *, size_t);\n};\n\nstruct em_data_callback {\n\tint (*active_power)(struct device *, long unsigned int *, long unsigned int *);\n\tint (*get_cost)(struct device *, long unsigned int, long unsigned int *);\n};\n\nstruct em_dbg_info {\n\tstruct em_perf_domain *pd;\n\tint ps_id;\n};\n\nstruct em_perf_table;\n\nstruct em_perf_domain {\n\tstruct em_perf_table *em_table;\n\tint nr_perf_states;\n\tlong unsigned int flags;\n\tlong unsigned int cpus[0];\n};\n\nstruct em_perf_state {\n\tlong unsigned int performance;\n\tlong unsigned int frequency;\n\tlong unsigned int power;\n\tlong unsigned int cost;\n\tlong unsigned int flags;\n};\n\nstruct em_perf_table {\n\tstruct callback_head rcu;\n\tstruct kref kref;\n\tstruct em_perf_state state[0];\n};\n\nstruct trace_event_file;\n\nstruct enable_trigger_data {\n\tstruct trace_event_file *file;\n\tbool enable;\n\tbool hist;\n};\n\nstruct encrypted_key_payload {\n\tstruct callback_head rcu;\n\tchar *format;\n\tchar *master_desc;\n\tchar *datalen;\n\tu8 *iv;\n\tu8 *encrypted_data;\n\tshort unsigned int datablob_len;\n\tshort unsigned int decrypted_datalen;\n\tshort unsigned int payload_datalen;\n\tshort unsigned int encrypted_key_format;\n\tu8 *decrypted_data;\n\tu8 payload_data[0];\n};\n\nstruct energy_env {\n\tlong unsigned int task_busy_time;\n\tlong unsigned int pd_busy_time;\n\tlong unsigned int cpu_cap;\n\tlong unsigned int pd_cap;\n};\n\nstruct entropy_timer_state {\n\tlong unsigned int entropy;\n\tstruct timer_list timer;\n\tatomic_t samples;\n\tunsigned int samples_per_bit;\n};\n\nstruct usb_endpoint_descriptor;\n\nstruct ep_device {\n\tstruct usb_endpoint_descriptor *desc;\n\tstruct usb_device *udev;\n\tstruct device dev;\n};\n\ntypedef struct poll_table_struct poll_table;\n\nstruct epitem;\n\nstruct ep_pqueue {\n\tpoll_table pt;\n\tstruct epitem *epi;\n};\n\nstruct epoll_filefd {\n\tstruct file *file;\n\tint fd;\n} __attribute__((packed));\n\nstruct epoll_event {\n\t__poll_t events;\n\t__u64 data;\n} __attribute__((packed));\n\nstruct eppoll_entry;\n\nstruct eventpoll;\n\nstruct epitem {\n\tunion {\n\t\tstruct rb_node rbn;\n\t\tstruct callback_head rcu;\n\t};\n\tstruct list_head rdllink;\n\tstruct epitem *next;\n\tstruct epoll_filefd ffd;\n\tbool dying;\n\tstruct eppoll_entry *pwqlist;\n\tstruct eventpoll *ep;\n\tstruct hlist_node fllink;\n\tstruct wakeup_source *ws;\n\tstruct epoll_event event;\n};\n\nstruct epitems_head {\n\tstruct hlist_head epitems;\n\tstruct epitems_head *next;\n};\n\nstruct epoll_params {\n\t__u32 busy_poll_usecs;\n\t__u16 busy_poll_budget;\n\t__u8 prefer_busy_poll;\n\t__u8 __pad;\n};\n\nstruct eppoll_entry {\n\tstruct eppoll_entry *next;\n\tstruct epitem *base;\n\twait_queue_entry_t wait;\n\twait_queue_head_t *whead;\n};\n\nstruct trace_eprobe;\n\nstruct eprobe_data {\n\tstruct trace_event_file *file;\n\tstruct trace_eprobe *ep;\n};\n\nstruct eprobe_trace_entry_head {\n\tstruct trace_entry ent;\n};\n\nstruct equiv_cpu_entry {\n\tu32 installed_cpu;\n\tu32 fixed_errata_mask;\n\tu32 fixed_errata_compare;\n\tu16 equiv_cpu;\n\tu16 res;\n};\n\nstruct equiv_cpu_table {\n\tunsigned int num_entries;\n\tstruct equiv_cpu_entry *entry;\n};\n\nstruct er_account {\n\traw_spinlock_t lock;\n\tu64 config;\n\tu64 reg;\n\tatomic_t ref;\n};\n\nstruct err_info {\n\tconst char **errs;\n\tu8 type;\n\tu16 pos;\n\tu64 ts;\n};\n\nstruct error_info {\n\tshort unsigned int code12;\n\tshort unsigned int size;\n};\n\nstruct error_info2 {\n\tunsigned char code1;\n\tunsigned char code2_min;\n\tunsigned char code2_max;\n\tconst char *str;\n\tconst char *fmt;\n};\n\nstruct error_injection_entry {\n\tlong unsigned int addr;\n\tint etype;\n};\n\nstruct erspan_md2 {\n\t__be32 timestamp;\n\t__be16 sgt;\n\t__u8 hwid_upper: 2;\n\t__u8 ft: 5;\n\t__u8 p: 1;\n\t__u8 o: 1;\n\t__u8 gra: 2;\n\t__u8 dir: 1;\n\t__u8 hwid: 4;\n};\n\nstruct erspan_metadata {\n\tint version;\n\tunion {\n\t\t__be32 index;\n\t\tstruct erspan_md2 md2;\n\t} u;\n};\n\nstruct erst_erange {\n\tu64 base;\n\tu64 size;\n\tvoid *vaddr;\n\tu32 attr;\n\tu64 timings;\n};\n\nstruct erst_record_id_cache {\n\tstruct mutex lock;\n\tu64 *entries;\n\tint len;\n\tint size;\n\tint refcount;\n};\n\nstruct insn_field {\n\tunion {\n\t\tinsn_value_t value;\n\t\tinsn_byte_t bytes[4];\n\t};\n\tunsigned char got;\n\tunsigned char nbytes;\n};\n\nstruct insn {\n\tstruct insn_field prefixes;\n\tstruct insn_field rex_prefix;\n\tstruct insn_field vex_prefix;\n\tstruct insn_field opcode;\n\tstruct insn_field modrm;\n\tstruct insn_field sib;\n\tstruct insn_field displacement;\n\tunion {\n\t\tstruct insn_field immediate;\n\t\tstruct insn_field moffset1;\n\t\tstruct insn_field immediate1;\n\t};\n\tunion {\n\t\tstruct insn_field moffset2;\n\t\tstruct insn_field immediate2;\n\t};\n\tint emulate_prefix_size;\n\tinsn_attr_t attr;\n\tunsigned char opnd_bytes;\n\tunsigned char addr_bytes;\n\tunsigned char length;\n\tunsigned char x86_64;\n\tconst insn_byte_t *kaddr;\n\tconst insn_byte_t *end_kaddr;\n\tconst insn_byte_t *next_byte;\n};\n\nstruct es_fault_info {\n\tlong unsigned int vector;\n\tlong unsigned int error_code;\n\tlong unsigned int cr2;\n};\n\nstruct es_em_ctxt {\n\tstruct pt_regs *regs;\n\tstruct insn insn;\n\tstruct es_fault_info fi;\n};\n\nstruct strp_stats {\n\tlong long unsigned int msgs;\n\tlong long unsigned int bytes;\n\tunsigned int mem_fail;\n\tunsigned int need_more_hdr;\n\tunsigned int msg_too_big;\n\tunsigned int msg_timeouts;\n\tunsigned int bad_hdr_len;\n};\n\nstruct strparser;\n\nstruct strp_callbacks {\n\tint (*parse_msg)(struct strparser *, struct sk_buff *);\n\tvoid (*rcv_msg)(struct strparser *, struct sk_buff *);\n\tint (*read_sock_done)(struct strparser *, int);\n\tvoid (*abort_parser)(struct strparser *, int);\n\tvoid (*lock)(struct strparser *);\n\tvoid (*unlock)(struct strparser *);\n};\n\nstruct strparser {\n\tstruct sock *sk;\n\tu32 stopped: 1;\n\tu32 paused: 1;\n\tu32 aborted: 1;\n\tu32 interrupted: 1;\n\tu32 unrecov_intr: 1;\n\tstruct sk_buff **skb_nextp;\n\tstruct sk_buff *skb_head;\n\tunsigned int need_bytes;\n\tstruct delayed_work msg_timer_work;\n\tstruct work_struct work;\n\tstruct strp_stats stats;\n\tstruct strp_callbacks cb;\n};\n\nstruct espintcp_msg {\n\tstruct sk_buff *skb;\n\tstruct sk_msg skmsg;\n\tint offset;\n\tint len;\n};\n\nstruct espintcp_ctx {\n\tstruct strparser strp;\n\tstruct sk_buff_head ike_queue;\n\tstruct sk_buff_head out_queue;\n\tstruct espintcp_msg partial;\n\tvoid (*saved_data_ready)(struct sock *);\n\tvoid (*saved_write_space)(struct sock *);\n\tvoid (*saved_destruct)(struct sock *);\n\tstruct work_struct work;\n\tbool tx_running;\n};\n\nstruct esre_entry;\n\nstruct esre_attribute {\n\tstruct attribute attr;\n\tssize_t (*show)(struct esre_entry *, char *);\n\tssize_t (*store)(struct esre_entry *, const char *, size_t);\n};\n\nstruct esre_entry {\n\tunion {\n\t\tstruct efi_system_resource_entry_v1 *esre1;\n\t} esre;\n\tstruct kobject kobj;\n\tstruct list_head list;\n};\n\nstruct estack_pages {\n\tu32 offs;\n\tu16 size;\n\tu16 type;\n};\n\nstruct ethnl_request_ops;\n\nstruct ethnl_dump_ctx {\n\tconst struct ethnl_request_ops *ops;\n\tstruct ethnl_req_info *req_info;\n\tstruct ethnl_reply_data *reply_data;\n\tlong unsigned int pos_ifindex;\n};\n\nstruct ethnl_module_fw_flash_ntf_params {\n\tu32 portid;\n\tu32 seq;\n\tbool closed_sock;\n};\n\nstruct ethnl_request_ops {\n\tu8 request_cmd;\n\tu8 reply_cmd;\n\tu16 hdr_attr;\n\tunsigned int req_info_size;\n\tunsigned int reply_data_size;\n\tbool allow_nodev_do;\n\tu8 set_ntf_cmd;\n\tint (*parse_request)(struct ethnl_req_info *, struct nlattr **, struct netlink_ext_ack *);\n\tint (*prepare_data)(const struct ethnl_req_info *, struct ethnl_reply_data *, const struct genl_info *);\n\tint (*reply_size)(const struct ethnl_req_info *, const struct ethnl_reply_data *);\n\tint (*fill_reply)(struct sk_buff *, const struct ethnl_req_info *, const struct ethnl_reply_data *);\n\tvoid (*cleanup_data)(struct ethnl_reply_data *);\n\tint (*set_validate)(struct ethnl_req_info *, struct genl_info *);\n\tint (*set)(struct ethnl_req_info *, struct genl_info *);\n};\n\nstruct ethnl_sock_priv {\n\tstruct net_device *dev;\n\tu32 portid;\n\tenum ethnl_sock_type type;\n};\n\nstruct ethnl_tunnel_info_dump_ctx {\n\tstruct ethnl_req_info req_info;\n\tlong unsigned int ifindex;\n};\n\nstruct ethtool_c33_pse_ext_state_info {\n\tenum ethtool_c33_pse_ext_state c33_pse_ext_state;\n\tunion {\n\t\tenum ethtool_c33_pse_ext_substate_error_condition error_condition;\n\t\tenum ethtool_c33_pse_ext_substate_mr_pse_enable mr_pse_enable;\n\t\tenum ethtool_c33_pse_ext_substate_option_detect_ted option_detect_ted;\n\t\tenum ethtool_c33_pse_ext_substate_option_vport_lim option_vport_lim;\n\t\tenum ethtool_c33_pse_ext_substate_ovld_detected ovld_detected;\n\t\tenum ethtool_c33_pse_ext_substate_power_not_available power_not_available;\n\t\tenum ethtool_c33_pse_ext_substate_short_detected short_detected;\n\t\tu32 __c33_pse_ext_substate;\n\t};\n};\n\nstruct ethtool_c33_pse_pw_limit_range {\n\tu32 min;\n\tu32 max;\n};\n\nstruct ethtool_cmd {\n\t__u32 cmd;\n\t__u32 supported;\n\t__u32 advertising;\n\t__u16 speed;\n\t__u8 duplex;\n\t__u8 port;\n\t__u8 phy_address;\n\t__u8 transceiver;\n\t__u8 autoneg;\n\t__u8 mdio_support;\n\t__u32 maxtxpkt;\n\t__u32 maxrxpkt;\n\t__u16 speed_hi;\n\t__u8 eth_tp_mdix;\n\t__u8 eth_tp_mdix_ctrl;\n\t__u32 lp_advertising;\n\t__u32 reserved[2];\n};\n\nstruct ethtool_cmis_cdb {\n\tu8 cmis_rev;\n\tu8 read_write_len_ext;\n\tu16 max_completion_time;\n};\n\nstruct ethtool_cmis_cdb_request {\n\t__be16 id;\n\tunion {\n\t\tstruct {\n\t\t\t__be16 epl_len;\n\t\t\tu8 lpl_len;\n\t\t\tu8 chk_code;\n\t\t\tu8 resv1;\n\t\t\tu8 resv2;\n\t\t\tu8 payload[120];\n\t\t};\n\t\tstruct {\n\t\t\t__be16 epl_len;\n\t\t\tu8 lpl_len;\n\t\t\tu8 chk_code;\n\t\t\tu8 resv1;\n\t\t\tu8 resv2;\n\t\t\tu8 payload[120];\n\t\t} body;\n\t};\n};\n\nstruct ethtool_cmis_cdb_cmd_args {\n\tstruct ethtool_cmis_cdb_request req;\n\tu16 max_duration;\n\tu8 read_write_len_ext;\n\tu8 msleep_pre_rpl;\n\tu8 rpl_exp_len;\n\tu8 flags;\n\tchar *err_msg;\n};\n\nstruct ethtool_cmis_cdb_rpl_hdr {\n\tu8 rpl_len;\n\tu8 rpl_chk_code;\n};\n\nstruct ethtool_cmis_cdb_rpl {\n\tstruct ethtool_cmis_cdb_rpl_hdr hdr;\n\tu8 payload[120];\n};\n\nstruct ethtool_module_fw_flash_params {\n\t__be32 password;\n\tu8 password_valid: 1;\n};\n\nstruct ethtool_cmis_fw_update_params {\n\tstruct net_device *dev;\n\tstruct ethtool_module_fw_flash_params params;\n\tstruct ethnl_module_fw_flash_ntf_params ntf_params;\n\tconst struct firmware *fw;\n};\n\nstruct ethtool_flash {\n\t__u32 cmd;\n\t__u32 region;\n\tchar data[128];\n};\n\nstruct ethtool_drvinfo {\n\t__u32 cmd;\n\tchar driver[32];\n\tchar version[32];\n\tchar fw_version[32];\n\tchar bus_info[32];\n\tchar erom_version[32];\n\tchar reserved2[12];\n\t__u32 n_priv_flags;\n\t__u32 n_stats;\n\t__u32 testinfo_len;\n\t__u32 eedump_len;\n\t__u32 regdump_len;\n};\n\nstruct ethtool_devlink_compat {\n\tstruct devlink *devlink;\n\tunion {\n\t\tstruct ethtool_flash efl;\n\t\tstruct ethtool_drvinfo info;\n\t};\n};\n\nstruct ethtool_dump {\n\t__u32 cmd;\n\t__u32 version;\n\t__u32 flag;\n\t__u32 len;\n\t__u8 data[0];\n};\n\nstruct ethtool_eee {\n\t__u32 cmd;\n\t__u32 supported;\n\t__u32 advertised;\n\t__u32 lp_advertised;\n\t__u32 eee_active;\n\t__u32 eee_enabled;\n\t__u32 tx_lpi_enabled;\n\t__u32 tx_lpi_timer;\n\t__u32 reserved[2];\n};\n\nstruct ethtool_eeprom {\n\t__u32 cmd;\n\t__u32 magic;\n\t__u32 offset;\n\t__u32 len;\n\t__u8 data[0];\n};\n\nstruct ethtool_eth_ctrl_stats {\n\tenum ethtool_mac_stats_src src;\n\tunion {\n\t\tstruct {\n\t\t\tu64 MACControlFramesTransmitted;\n\t\t\tu64 MACControlFramesReceived;\n\t\t\tu64 UnsupportedOpcodesReceived;\n\t\t};\n\t\tstruct {\n\t\t\tu64 MACControlFramesTransmitted;\n\t\t\tu64 MACControlFramesReceived;\n\t\t\tu64 UnsupportedOpcodesReceived;\n\t\t} stats;\n\t};\n};\n\nstruct ethtool_eth_mac_stats {\n\tenum ethtool_mac_stats_src src;\n\tunion {\n\t\tstruct {\n\t\t\tu64 FramesTransmittedOK;\n\t\t\tu64 SingleCollisionFrames;\n\t\t\tu64 MultipleCollisionFrames;\n\t\t\tu64 FramesReceivedOK;\n\t\t\tu64 FrameCheckSequenceErrors;\n\t\t\tu64 AlignmentErrors;\n\t\t\tu64 OctetsTransmittedOK;\n\t\t\tu64 FramesWithDeferredXmissions;\n\t\t\tu64 LateCollisions;\n\t\t\tu64 FramesAbortedDueToXSColls;\n\t\t\tu64 FramesLostDueToIntMACXmitError;\n\t\t\tu64 CarrierSenseErrors;\n\t\t\tu64 OctetsReceivedOK;\n\t\t\tu64 FramesLostDueToIntMACRcvError;\n\t\t\tu64 MulticastFramesXmittedOK;\n\t\t\tu64 BroadcastFramesXmittedOK;\n\t\t\tu64 FramesWithExcessiveDeferral;\n\t\t\tu64 MulticastFramesReceivedOK;\n\t\t\tu64 BroadcastFramesReceivedOK;\n\t\t\tu64 InRangeLengthErrors;\n\t\t\tu64 OutOfRangeLengthField;\n\t\t\tu64 FrameTooLongErrors;\n\t\t};\n\t\tstruct {\n\t\t\tu64 FramesTransmittedOK;\n\t\t\tu64 SingleCollisionFrames;\n\t\t\tu64 MultipleCollisionFrames;\n\t\t\tu64 FramesReceivedOK;\n\t\t\tu64 FrameCheckSequenceErrors;\n\t\t\tu64 AlignmentErrors;\n\t\t\tu64 OctetsTransmittedOK;\n\t\t\tu64 FramesWithDeferredXmissions;\n\t\t\tu64 LateCollisions;\n\t\t\tu64 FramesAbortedDueToXSColls;\n\t\t\tu64 FramesLostDueToIntMACXmitError;\n\t\t\tu64 CarrierSenseErrors;\n\t\t\tu64 OctetsReceivedOK;\n\t\t\tu64 FramesLostDueToIntMACRcvError;\n\t\t\tu64 MulticastFramesXmittedOK;\n\t\t\tu64 BroadcastFramesXmittedOK;\n\t\t\tu64 FramesWithExcessiveDeferral;\n\t\t\tu64 MulticastFramesReceivedOK;\n\t\t\tu64 BroadcastFramesReceivedOK;\n\t\t\tu64 InRangeLengthErrors;\n\t\t\tu64 OutOfRangeLengthField;\n\t\t\tu64 FrameTooLongErrors;\n\t\t} stats;\n\t};\n};\n\nstruct ethtool_eth_phy_stats {\n\tenum ethtool_mac_stats_src src;\n\tunion {\n\t\tstruct {\n\t\t\tu64 SymbolErrorDuringCarrier;\n\t\t};\n\t\tstruct {\n\t\t\tu64 SymbolErrorDuringCarrier;\n\t\t} stats;\n\t};\n};\n\nstruct ethtool_fec_stat {\n\tu64 total;\n\tu64 lanes[8];\n};\n\nstruct ethtool_fec_stats {\n\tstruct ethtool_fec_stat corrected_blocks;\n\tstruct ethtool_fec_stat uncorrectable_blocks;\n\tstruct ethtool_fec_stat corrected_bits;\n};\n\nstruct ethtool_fecparam {\n\t__u32 cmd;\n\t__u32 active_fec;\n\t__u32 fec;\n\t__u32 reserved;\n};\n\nstruct ethtool_forced_speed_map {\n\tu32 speed;\n\tlong unsigned int caps[2];\n\tconst u32 *cap_arr;\n\tu32 arr_size;\n};\n\nstruct ethtool_get_features_block {\n\t__u32 available;\n\t__u32 requested;\n\t__u32 active;\n\t__u32 never_changed;\n};\n\nstruct ethtool_gfeatures {\n\t__u32 cmd;\n\t__u32 size;\n\tstruct ethtool_get_features_block features[0];\n};\n\nstruct ethtool_gstrings {\n\t__u32 cmd;\n\t__u32 string_set;\n\t__u32 len;\n\t__u8 data[0];\n};\n\nstruct ethtool_link_ext_state_info {\n\tenum ethtool_link_ext_state link_ext_state;\n\tunion {\n\t\tenum ethtool_link_ext_substate_autoneg autoneg;\n\t\tenum ethtool_link_ext_substate_link_training link_training;\n\t\tenum ethtool_link_ext_substate_link_logical_mismatch link_logical_mismatch;\n\t\tenum ethtool_link_ext_substate_bad_signal_integrity bad_signal_integrity;\n\t\tenum ethtool_link_ext_substate_cable_issue cable_issue;\n\t\tenum ethtool_link_ext_substate_module module;\n\t\tu32 __link_ext_substate;\n\t};\n};\n\nstruct ethtool_link_ext_stats {\n\tu64 link_down_events;\n};\n\nstruct ethtool_link_settings {\n\t__u32 cmd;\n\t__u32 speed;\n\t__u8 duplex;\n\t__u8 port;\n\t__u8 phy_address;\n\t__u8 autoneg;\n\t__u8 mdio_support;\n\t__u8 eth_tp_mdix;\n\t__u8 eth_tp_mdix_ctrl;\n\t__s8 link_mode_masks_nwords;\n\t__u8 transceiver;\n\t__u8 master_slave_cfg;\n\t__u8 master_slave_state;\n\t__u8 rate_matching;\n\t__u32 reserved[7];\n\t__u32 link_mode_masks[0];\n};\n\nstruct ethtool_link_ksettings {\n\tstruct ethtool_link_settings base;\n\tstruct {\n\t\tlong unsigned int supported[2];\n\t\tlong unsigned int advertising[2];\n\t\tlong unsigned int lp_advertising[2];\n\t} link_modes;\n\tu32 lanes;\n};\n\nstruct ethtool_link_usettings {\n\tstruct ethtool_link_settings base;\n\tstruct {\n\t\t__u32 supported[4];\n\t\t__u32 advertising[4];\n\t\t__u32 lp_advertising[4];\n\t} link_modes;\n};\n\nstruct ethtool_mm_cfg {\n\tu32 verify_time;\n\tbool verify_enabled;\n\tbool tx_enabled;\n\tbool pmac_enabled;\n\tu32 tx_min_frag_size;\n};\n\nstruct ethtool_mm_state {\n\tu32 verify_time;\n\tu32 max_verify_time;\n\tenum ethtool_mm_verify_status verify_status;\n\tbool tx_enabled;\n\tbool tx_active;\n\tbool pmac_enabled;\n\tbool verify_enabled;\n\tu32 tx_min_frag_size;\n\tu32 rx_min_frag_size;\n};\n\nstruct ethtool_mm_stats {\n\tu64 MACMergeFrameAssErrorCount;\n\tu64 MACMergeFrameSmdErrorCount;\n\tu64 MACMergeFrameAssOkCount;\n\tu64 MACMergeFragCountRx;\n\tu64 MACMergeFragCountTx;\n\tu64 MACMergeHoldCount;\n};\n\nstruct ethtool_modinfo {\n\t__u32 cmd;\n\t__u32 type;\n\t__u32 eeprom_len;\n\t__u32 reserved[8];\n};\n\nstruct ethtool_module_eeprom {\n\tu32 offset;\n\tu32 length;\n\tu8 page;\n\tu8 bank;\n\tu8 i2c_address;\n\tu8 *data;\n};\n\nstruct ethtool_module_fw_flash {\n\tstruct list_head list;\n\tnetdevice_tracker dev_tracker;\n\tstruct work_struct work;\n\tstruct ethtool_cmis_fw_update_params fw_update;\n};\n\nstruct ethtool_module_power_mode_params {\n\tenum ethtool_module_power_mode_policy policy;\n\tenum ethtool_module_power_mode mode;\n};\n\nstruct ethtool_netdev_state {\n\tstruct xarray rss_ctx;\n\tstruct mutex rss_lock;\n\tunsigned int wol_enabled: 1;\n\tunsigned int module_fw_flash_in_progress: 1;\n};\n\nstruct ethtool_ringparam;\n\nstruct kernel_ethtool_ringparam;\n\nstruct ethtool_pauseparam;\n\nstruct ethtool_stats;\n\nstruct ethtool_rxfh_param;\n\nstruct ethtool_rxfh_context;\n\nstruct ethtool_ts_stats;\n\nstruct ethtool_tunable;\n\nstruct ethtool_ops {\n\tu32 cap_link_lanes_supported: 1;\n\tu32 cap_rss_ctx_supported: 1;\n\tu32 cap_rss_sym_xor_supported: 1;\n\tu32 rxfh_indir_space;\n\tu16 rxfh_key_space;\n\tu16 rxfh_priv_size;\n\tu32 rxfh_max_num_contexts;\n\tu32 supported_coalesce_params;\n\tu32 supported_ring_params;\n\tvoid (*get_drvinfo)(struct net_device *, struct ethtool_drvinfo *);\n\tint (*get_regs_len)(struct net_device *);\n\tvoid (*get_regs)(struct net_device *, struct ethtool_regs *, void *);\n\tvoid (*get_wol)(struct net_device *, struct ethtool_wolinfo *);\n\tint (*set_wol)(struct net_device *, struct ethtool_wolinfo *);\n\tu32 (*get_msglevel)(struct net_device *);\n\tvoid (*set_msglevel)(struct net_device *, u32);\n\tint (*nway_reset)(struct net_device *);\n\tu32 (*get_link)(struct net_device *);\n\tint (*get_link_ext_state)(struct net_device *, struct ethtool_link_ext_state_info *);\n\tvoid (*get_link_ext_stats)(struct net_device *, struct ethtool_link_ext_stats *);\n\tint (*get_eeprom_len)(struct net_device *);\n\tint (*get_eeprom)(struct net_device *, struct ethtool_eeprom *, u8 *);\n\tint (*set_eeprom)(struct net_device *, struct ethtool_eeprom *, u8 *);\n\tint (*get_coalesce)(struct net_device *, struct ethtool_coalesce *, struct kernel_ethtool_coalesce *, struct netlink_ext_ack *);\n\tint (*set_coalesce)(struct net_device *, struct ethtool_coalesce *, struct kernel_ethtool_coalesce *, struct netlink_ext_ack *);\n\tvoid (*get_ringparam)(struct net_device *, struct ethtool_ringparam *, struct kernel_ethtool_ringparam *, struct netlink_ext_ack *);\n\tint (*set_ringparam)(struct net_device *, struct ethtool_ringparam *, struct kernel_ethtool_ringparam *, struct netlink_ext_ack *);\n\tvoid (*get_pause_stats)(struct net_device *, struct ethtool_pause_stats *);\n\tvoid (*get_pauseparam)(struct net_device *, struct ethtool_pauseparam *);\n\tint (*set_pauseparam)(struct net_device *, struct ethtool_pauseparam *);\n\tvoid (*self_test)(struct net_device *, struct ethtool_test *, u64 *);\n\tvoid (*get_strings)(struct net_device *, u32, u8 *);\n\tint (*set_phys_id)(struct net_device *, enum ethtool_phys_id_state);\n\tvoid (*get_ethtool_stats)(struct net_device *, struct ethtool_stats *, u64 *);\n\tint (*begin)(struct net_device *);\n\tvoid (*complete)(struct net_device *);\n\tu32 (*get_priv_flags)(struct net_device *);\n\tint (*set_priv_flags)(struct net_device *, u32);\n\tint (*get_sset_count)(struct net_device *, int);\n\tint (*get_rxnfc)(struct net_device *, struct ethtool_rxnfc *, u32 *);\n\tint (*set_rxnfc)(struct net_device *, struct ethtool_rxnfc *);\n\tint (*flash_device)(struct net_device *, struct ethtool_flash *);\n\tint (*reset)(struct net_device *, u32 *);\n\tu32 (*get_rxfh_key_size)(struct net_device *);\n\tu32 (*get_rxfh_indir_size)(struct net_device *);\n\tint (*get_rxfh)(struct net_device *, struct ethtool_rxfh_param *);\n\tint (*set_rxfh)(struct net_device *, struct ethtool_rxfh_param *, struct netlink_ext_ack *);\n\tint (*create_rxfh_context)(struct net_device *, struct ethtool_rxfh_context *, const struct ethtool_rxfh_param *, struct netlink_ext_ack *);\n\tint (*modify_rxfh_context)(struct net_device *, struct ethtool_rxfh_context *, const struct ethtool_rxfh_param *, struct netlink_ext_ack *);\n\tint (*remove_rxfh_context)(struct net_device *, struct ethtool_rxfh_context *, u32, struct netlink_ext_ack *);\n\tvoid (*get_channels)(struct net_device *, struct ethtool_channels *);\n\tint (*set_channels)(struct net_device *, struct ethtool_channels *);\n\tint (*get_dump_flag)(struct net_device *, struct ethtool_dump *);\n\tint (*get_dump_data)(struct net_device *, struct ethtool_dump *, void *);\n\tint (*set_dump)(struct net_device *, struct ethtool_dump *);\n\tint (*get_ts_info)(struct net_device *, struct kernel_ethtool_ts_info *);\n\tvoid (*get_ts_stats)(struct net_device *, struct ethtool_ts_stats *);\n\tint (*get_module_info)(struct net_device *, struct ethtool_modinfo *);\n\tint (*get_module_eeprom)(struct net_device *, struct ethtool_eeprom *, u8 *);\n\tint (*get_eee)(struct net_device *, struct ethtool_keee *);\n\tint (*set_eee)(struct net_device *, struct ethtool_keee *);\n\tint (*get_tunable)(struct net_device *, const struct ethtool_tunable *, void *);\n\tint (*set_tunable)(struct net_device *, const struct ethtool_tunable *, const void *);\n\tint (*get_per_queue_coalesce)(struct net_device *, u32, struct ethtool_coalesce *);\n\tint (*set_per_queue_coalesce)(struct net_device *, u32, struct ethtool_coalesce *);\n\tint (*get_link_ksettings)(struct net_device *, struct ethtool_link_ksettings *);\n\tint (*set_link_ksettings)(struct net_device *, const struct ethtool_link_ksettings *);\n\tvoid (*get_fec_stats)(struct net_device *, struct ethtool_fec_stats *);\n\tint (*get_fecparam)(struct net_device *, struct ethtool_fecparam *);\n\tint (*set_fecparam)(struct net_device *, struct ethtool_fecparam *);\n\tvoid (*get_ethtool_phy_stats)(struct net_device *, struct ethtool_stats *, u64 *);\n\tint (*get_phy_tunable)(struct net_device *, const struct ethtool_tunable *, void *);\n\tint (*set_phy_tunable)(struct net_device *, const struct ethtool_tunable *, const void *);\n\tint (*get_module_eeprom_by_page)(struct net_device *, const struct ethtool_module_eeprom *, struct netlink_ext_ack *);\n\tint (*set_module_eeprom_by_page)(struct net_device *, const struct ethtool_module_eeprom *, struct netlink_ext_ack *);\n\tvoid (*get_eth_phy_stats)(struct net_device *, struct ethtool_eth_phy_stats *);\n\tvoid (*get_eth_mac_stats)(struct net_device *, struct ethtool_eth_mac_stats *);\n\tvoid (*get_eth_ctrl_stats)(struct net_device *, struct ethtool_eth_ctrl_stats *);\n\tvoid (*get_rmon_stats)(struct net_device *, struct ethtool_rmon_stats *, const struct ethtool_rmon_hist_range **);\n\tint (*get_module_power_mode)(struct net_device *, struct ethtool_module_power_mode_params *, struct netlink_ext_ack *);\n\tint (*set_module_power_mode)(struct net_device *, const struct ethtool_module_power_mode_params *, struct netlink_ext_ack *);\n\tint (*get_mm)(struct net_device *, struct ethtool_mm_state *);\n\tint (*set_mm)(struct net_device *, struct ethtool_mm_cfg *, struct netlink_ext_ack *);\n\tvoid (*get_mm_stats)(struct net_device *, struct ethtool_mm_stats *);\n};\n\nstruct ethtool_pause_stats {\n\tenum ethtool_mac_stats_src src;\n\tunion {\n\t\tstruct {\n\t\t\tu64 tx_pause_frames;\n\t\t\tu64 rx_pause_frames;\n\t\t};\n\t\tstruct {\n\t\t\tu64 tx_pause_frames;\n\t\t\tu64 rx_pause_frames;\n\t\t} stats;\n\t};\n};\n\nstruct ethtool_pauseparam {\n\t__u32 cmd;\n\t__u32 autoneg;\n\t__u32 rx_pause;\n\t__u32 tx_pause;\n};\n\nstruct ethtool_per_queue_op {\n\t__u32 cmd;\n\t__u32 sub_command;\n\t__u32 queue_mask[128];\n\tchar data[0];\n};\n\nstruct ethtool_perm_addr {\n\t__u32 cmd;\n\t__u32 size;\n\t__u8 data[0];\n};\n\nstruct phy_plca_cfg;\n\nstruct phy_plca_status;\n\nstruct phy_tdr_config;\n\nstruct ethtool_phy_ops {\n\tint (*get_sset_count)(struct phy_device *);\n\tint (*get_strings)(struct phy_device *, u8 *);\n\tint (*get_stats)(struct phy_device *, struct ethtool_stats *, u64 *);\n\tint (*get_plca_cfg)(struct phy_device *, struct phy_plca_cfg *);\n\tint (*set_plca_cfg)(struct phy_device *, const struct phy_plca_cfg *, struct netlink_ext_ack *);\n\tint (*get_plca_status)(struct phy_device *, struct phy_plca_status *);\n\tint (*start_cable_test)(struct phy_device *, struct netlink_ext_ack *);\n\tint (*start_cable_test_tdr)(struct phy_device *, struct netlink_ext_ack *, const struct phy_tdr_config *);\n};\n\nstruct ethtool_regs {\n\t__u32 cmd;\n\t__u32 version;\n\t__u32 len;\n\t__u8 data[0];\n};\n\nstruct ethtool_ringparam {\n\t__u32 cmd;\n\t__u32 rx_max_pending;\n\t__u32 rx_mini_max_pending;\n\t__u32 rx_jumbo_max_pending;\n\t__u32 tx_max_pending;\n\t__u32 rx_pending;\n\t__u32 rx_mini_pending;\n\t__u32 rx_jumbo_pending;\n\t__u32 tx_pending;\n};\n\nstruct ethtool_rmon_hist_range {\n\tu16 low;\n\tu16 high;\n};\n\nstruct ethtool_rmon_stats {\n\tenum ethtool_mac_stats_src src;\n\tunion {\n\t\tstruct {\n\t\t\tu64 undersize_pkts;\n\t\t\tu64 oversize_pkts;\n\t\t\tu64 fragments;\n\t\t\tu64 jabbers;\n\t\t\tu64 hist[10];\n\t\t\tu64 hist_tx[10];\n\t\t};\n\t\tstruct {\n\t\t\tu64 undersize_pkts;\n\t\t\tu64 oversize_pkts;\n\t\t\tu64 fragments;\n\t\t\tu64 jabbers;\n\t\t\tu64 hist[10];\n\t\t\tu64 hist_tx[10];\n\t\t} stats;\n\t};\n};\n\nstruct flow_dissector_key_basic {\n\t__be16 n_proto;\n\tu8 ip_proto;\n\tu8 padding;\n};\n\nstruct flow_dissector_key_ipv4_addrs {\n\t__be32 src;\n\t__be32 dst;\n};\n\nstruct flow_dissector_key_ipv6_addrs {\n\tstruct in6_addr src;\n\tstruct in6_addr dst;\n};\n\nstruct flow_dissector_key_ports {\n\tunion {\n\t\t__be32 ports;\n\t\tstruct {\n\t\t\t__be16 src;\n\t\t\t__be16 dst;\n\t\t};\n\t};\n};\n\nstruct flow_dissector_key_ip {\n\t__u8 tos;\n\t__u8 ttl;\n};\n\nstruct flow_dissector_key_vlan {\n\tunion {\n\t\tstruct {\n\t\t\tu16 vlan_id: 12;\n\t\t\tu16 vlan_dei: 1;\n\t\t\tu16 vlan_priority: 3;\n\t\t};\n\t\t__be16 vlan_tci;\n\t};\n\t__be16 vlan_tpid;\n\t__be16 vlan_eth_type;\n\tu16 padding;\n};\n\nstruct flow_dissector_key_eth_addrs {\n\tunsigned char dst[6];\n\tunsigned char src[6];\n};\n\nstruct ethtool_rx_flow_key {\n\tstruct flow_dissector_key_basic basic;\n\tunion {\n\t\tstruct flow_dissector_key_ipv4_addrs ipv4;\n\t\tstruct flow_dissector_key_ipv6_addrs ipv6;\n\t};\n\tstruct flow_dissector_key_ports tp;\n\tstruct flow_dissector_key_ip ip;\n\tstruct flow_dissector_key_vlan vlan;\n\tstruct flow_dissector_key_eth_addrs eth_addrs;\n};\n\nstruct flow_dissector {\n\tlong long unsigned int used_keys;\n\tshort unsigned int offset[33];\n};\n\nstruct ethtool_rx_flow_match {\n\tstruct flow_dissector dissector;\n\tstruct ethtool_rx_flow_key key;\n\tstruct ethtool_rx_flow_key mask;\n};\n\nstruct flow_rule;\n\nstruct ethtool_rx_flow_rule {\n\tstruct flow_rule *rule;\n\tlong unsigned int priv[0];\n};\n\nstruct ethtool_rx_flow_spec {\n\t__u32 flow_type;\n\tunion ethtool_flow_union h_u;\n\tstruct ethtool_flow_ext h_ext;\n\tunion ethtool_flow_union m_u;\n\tstruct ethtool_flow_ext m_ext;\n\t__u64 ring_cookie;\n\t__u32 location;\n};\n\nstruct ethtool_rx_flow_spec_input {\n\tconst struct ethtool_rx_flow_spec *fs;\n\tu32 rss_ctx;\n};\n\nstruct ethtool_rxfh {\n\t__u32 cmd;\n\t__u32 rss_context;\n\t__u32 indir_size;\n\t__u32 key_size;\n\t__u8 hfunc;\n\t__u8 input_xfrm;\n\t__u8 rsvd8[2];\n\t__u32 rsvd32;\n\t__u32 rss_config[0];\n};\n\nstruct ethtool_rxfh_context {\n\tu32 indir_size;\n\tu32 key_size;\n\tu16 priv_size;\n\tu8 hfunc;\n\tu8 input_xfrm;\n\tu8 indir_configured: 1;\n\tu8 key_configured: 1;\n\tu32 key_off;\n\tlong: 0;\n\tu8 data[0];\n};\n\nstruct ethtool_rxfh_param {\n\tu8 hfunc;\n\tu32 indir_size;\n\tu32 *indir;\n\tu32 key_size;\n\tu8 *key;\n\tu32 rss_context;\n\tu8 rss_delete;\n\tu8 input_xfrm;\n};\n\nstruct ethtool_rxnfc {\n\t__u32 cmd;\n\t__u32 flow_type;\n\t__u64 data;\n\tstruct ethtool_rx_flow_spec fs;\n\tunion {\n\t\t__u32 rule_cnt;\n\t\t__u32 rss_context;\n\t};\n\t__u32 rule_locs[0];\n};\n\nstruct ethtool_set_features_block {\n\t__u32 valid;\n\t__u32 requested;\n};\n\nstruct ethtool_sfeatures {\n\t__u32 cmd;\n\t__u32 size;\n\tstruct ethtool_set_features_block features[0];\n};\n\nstruct ethtool_sset_info {\n\t__u32 cmd;\n\t__u32 reserved;\n\t__u64 sset_mask;\n\t__u32 data[0];\n};\n\nstruct ethtool_stats {\n\t__u32 cmd;\n\t__u32 n_stats;\n\t__u64 data[0];\n};\n\nstruct ethtool_test {\n\t__u32 cmd;\n\t__u32 flags;\n\t__u32 reserved;\n\t__u32 len;\n\t__u64 data[0];\n};\n\nstruct ethtool_ts_info {\n\t__u32 cmd;\n\t__u32 so_timestamping;\n\t__s32 phc_index;\n\t__u32 tx_types;\n\t__u32 tx_reserved[3];\n\t__u32 rx_filters;\n\t__u32 rx_reserved[3];\n};\n\nstruct ethtool_ts_stats {\n\tunion {\n\t\tstruct {\n\t\t\tu64 pkts;\n\t\t\tu64 lost;\n\t\t\tu64 err;\n\t\t};\n\t\tstruct {\n\t\t\tu64 pkts;\n\t\t\tu64 lost;\n\t\t\tu64 err;\n\t\t} tx_stats;\n\t};\n};\n\nstruct ethtool_tunable {\n\t__u32 cmd;\n\t__u32 id;\n\t__u32 type_id;\n\t__u32 len;\n\tvoid *data[0];\n};\n\nstruct ethtool_value {\n\t__u32 cmd;\n\t__u32 data;\n};\n\nstruct ethtool_wolinfo {\n\t__u32 cmd;\n\t__u32 supported;\n\t__u32 wolopts;\n\t__u8 sopass[6];\n};\n\nstruct input_handler;\n\nstruct input_value;\n\nstruct input_handle {\n\tvoid *private;\n\tint open;\n\tconst char *name;\n\tstruct input_dev *dev;\n\tstruct input_handler *handler;\n\tunsigned int (*handle_events)(struct input_handle *, struct input_value *, unsigned int);\n\tstruct list_head d_node;\n\tstruct list_head h_node;\n};\n\nstruct evdev_client;\n\nstruct evdev {\n\tint open;\n\tstruct input_handle handle;\n\tstruct evdev_client *grab;\n\tstruct list_head client_list;\n\tspinlock_t client_lock;\n\tstruct mutex mutex;\n\tstruct device dev;\n\tstruct cdev cdev;\n\tbool exist;\n};\n\nstruct input_event {\n\t__kernel_ulong_t __sec;\n\t__kernel_ulong_t __usec;\n\t__u16 type;\n\t__u16 code;\n\t__s32 value;\n};\n\nstruct fasync_struct;\n\nstruct evdev_client {\n\tunsigned int head;\n\tunsigned int tail;\n\tunsigned int packet_head;\n\tspinlock_t buffer_lock;\n\twait_queue_head_t wait;\n\tstruct fasync_struct *fasync;\n\tstruct evdev *evdev;\n\tstruct list_head node;\n\tenum input_clock_type clk_type;\n\tbool revoked;\n\tlong unsigned int *evmasks[32];\n\tunsigned int bufsize;\n\tstruct input_event buffer[0];\n};\n\nstruct event_trigger_data;\n\nstruct event_trigger_ops;\n\nstruct event_command {\n\tstruct list_head list;\n\tchar *name;\n\tenum event_trigger_type trigger_type;\n\tint flags;\n\tint (*parse)(struct event_command *, struct trace_event_file *, char *, char *, char *);\n\tint (*reg)(char *, struct event_trigger_data *, struct trace_event_file *);\n\tvoid (*unreg)(char *, struct event_trigger_data *, struct trace_event_file *);\n\tvoid (*unreg_all)(struct trace_event_file *);\n\tint (*set_filter)(char *, struct event_trigger_data *, struct trace_event_file *);\n\tstruct event_trigger_ops * (*get_trigger_ops)(char *, char *);\n};\n\nstruct event_counter {\n\tu32 count;\n\tu32 flags;\n};\n\nstruct event_file_link {\n\tstruct trace_event_file *file;\n\tstruct list_head list;\n};\n\nstruct prog_entry;\n\nstruct event_filter {\n\tstruct prog_entry *prog;\n\tchar *filter_string;\n};\n\nstruct perf_cpu_context;\n\nstruct perf_event_context;\n\ntypedef void (*event_f)(struct perf_event *, struct perf_cpu_context *, struct perf_event_context *, void *);\n\nstruct event_function_struct {\n\tstruct perf_event *event;\n\tevent_f func;\n\tvoid *data;\n};\n\nstruct event_header {\n\t__be16 data_len;\n\t__u8 notification_class: 3;\n\t__u8 reserved1: 4;\n\t__u8 nea: 1;\n\t__u8 supp_event_class;\n};\n\nstruct slot___3;\n\nstruct event_info {\n\tu32 event_type;\n\tstruct slot___3 *p_slot;\n\tstruct work_struct work;\n};\n\nstruct event_probe_data {\n\tstruct trace_event_file *file;\n\tlong unsigned int count;\n\tint ref;\n\tbool enable;\n};\n\nstruct event_subsystem {\n\tstruct list_head list;\n\tconst char *name;\n\tstruct event_filter *filter;\n\tint ref_count;\n};\n\nstruct event_trigger_data {\n\tlong unsigned int count;\n\tint ref;\n\tint flags;\n\tstruct event_trigger_ops *ops;\n\tstruct event_command *cmd_ops;\n\tstruct event_filter *filter;\n\tchar *filter_str;\n\tvoid *private_data;\n\tbool paused;\n\tbool paused_tmp;\n\tstruct list_head list;\n\tchar *name;\n\tstruct list_head named_list;\n\tstruct event_trigger_data *named_data;\n};\n\nstruct event_trigger_ops {\n\tvoid (*trigger)(struct event_trigger_data *, struct trace_buffer *, void *, struct ring_buffer_event *);\n\tint (*init)(struct event_trigger_data *);\n\tvoid (*free)(struct event_trigger_data *);\n\tint (*print)(struct seq_file *, struct event_trigger_data *);\n};\n\nstruct eventfd_ctx {\n\tstruct kref kref;\n\twait_queue_head_t wqh;\n\t__u64 count;\n\tunsigned int flags;\n\tint id;\n};\n\nstruct eventfs_attr {\n\tint mode;\n\tkuid_t uid;\n\tkgid_t gid;\n};\n\ntypedef int (*eventfs_callback)(const char *, umode_t *, void **, const struct file_operations **);\n\ntypedef void (*eventfs_release)(const char *, void *);\n\nstruct eventfs_entry {\n\tconst char *name;\n\teventfs_callback callback;\n\teventfs_release release;\n};\n\nstruct eventfs_inode {\n\tunion {\n\t\tstruct list_head list;\n\t\tstruct callback_head rcu;\n\t};\n\tstruct list_head children;\n\tconst struct eventfs_entry *entries;\n\tconst char *name;\n\tstruct eventfs_attr *entry_attrs;\n\tvoid *data;\n\tstruct eventfs_attr attr;\n\tstruct kref kref;\n\tunsigned int is_freed: 1;\n\tunsigned int is_events: 1;\n\tunsigned int nr_entries: 30;\n\tunsigned int ino;\n};\n\nstruct eventfs_root_inode {\n\tstruct eventfs_inode ei;\n\tstruct dentry *events_dir;\n};\n\nstruct eventpoll {\n\tstruct mutex mtx;\n\twait_queue_head_t wq;\n\twait_queue_head_t poll_wait;\n\tstruct list_head rdllist;\n\trwlock_t lock;\n\tstruct rb_root_cached rbr;\n\tstruct epitem *ovflist;\n\tstruct wakeup_source *ws;\n\tstruct user_struct *user;\n\tstruct file *file;\n\tu64 gen;\n\tstruct hlist_head refs;\n\trefcount_t refcount;\n\tunsigned int napi_id;\n\tu32 busy_poll_usecs;\n\tu16 busy_poll_budget;\n\tbool prefer_busy_poll;\n};\n\nstruct ima_digest_data_hdr {\n\tu8 algo;\n\tu8 length;\n\tunion {\n\t\tstruct {\n\t\t\tu8 unused;\n\t\t\tu8 type;\n\t\t} sha1;\n\t\tstruct {\n\t\t\tu8 type;\n\t\t\tu8 algo;\n\t\t} ng;\n\t\tu8 data[2];\n\t} xattr;\n};\n\nstruct evm_digest {\n\tstruct ima_digest_data_hdr hdr;\n\tchar digest[64];\n};\n\nstruct integrity_inode_attributes {\n\tu64 version;\n\tlong unsigned int ino;\n\tdev_t dev;\n};\n\nstruct evm_iint_cache {\n\tlong unsigned int flags;\n\tenum integrity_status evm_status: 4;\n\tstruct integrity_inode_attributes metadata_inode;\n};\n\nstruct evm_ima_xattr_data_hdr {\n\tu8 type;\n};\n\nstruct evm_ima_xattr_data {\n\tunion {\n\t\tstruct {\n\t\t\tu8 type;\n\t\t};\n\t\tstruct evm_ima_xattr_data_hdr hdr;\n\t};\n\tu8 data[0];\n};\n\nstruct evm_xattr {\n\tstruct evm_ima_xattr_data_hdr data;\n\tu8 digest[20];\n};\n\nstruct evtchn_alloc_unbound {\n\tdomid_t dom;\n\tdomid_t remote_dom;\n\tevtchn_port_t port;\n};\n\nstruct evtchn_bind_interdomain {\n\tdomid_t remote_dom;\n\tevtchn_port_t remote_port;\n\tevtchn_port_t local_port;\n};\n\nstruct evtchn_bind_ipi {\n\tuint32_t vcpu;\n\tevtchn_port_t port;\n};\n\nstruct evtchn_bind_pirq {\n\tuint32_t pirq;\n\tuint32_t flags;\n\tevtchn_port_t port;\n};\n\nstruct evtchn_bind_vcpu {\n\tevtchn_port_t port;\n\tuint32_t vcpu;\n};\n\nstruct evtchn_bind_virq {\n\tuint32_t virq;\n\tuint32_t vcpu;\n\tevtchn_port_t port;\n};\n\nstruct evtchn_close {\n\tevtchn_port_t port;\n};\n\nstruct evtchn_expand_array {\n\tuint64_t array_gfn;\n};\n\nstruct evtchn_fifo_control_block {\n\tuint32_t ready;\n\tuint32_t _rsvd;\n\tevent_word_t head[16];\n};\n\nstruct evtchn_fifo_queue {\n\tuint32_t head[16];\n};\n\nstruct evtchn_init_control {\n\tuint64_t control_gfn;\n\tuint32_t offset;\n\tuint32_t vcpu;\n\tuint8_t link_bits;\n\tuint8_t _pad[7];\n};\n\nstruct evtchn_loop_ctrl {\n\tktime_t timeout;\n\tunsigned int count;\n\tbool defer_eoi;\n};\n\nstruct evtchn_ops {\n\tunsigned int (*max_channels)(void);\n\tunsigned int (*nr_channels)(void);\n\tint (*setup)(evtchn_port_t);\n\tvoid (*remove)(evtchn_port_t, unsigned int);\n\tvoid (*bind_to_cpu)(evtchn_port_t, unsigned int, unsigned int);\n\tvoid (*clear_pending)(evtchn_port_t);\n\tvoid (*set_pending)(evtchn_port_t);\n\tbool (*is_pending)(evtchn_port_t);\n\tvoid (*mask)(evtchn_port_t);\n\tvoid (*unmask)(evtchn_port_t);\n\tvoid (*handle_events)(unsigned int, struct evtchn_loop_ctrl *);\n\tvoid (*resume)(void);\n\tint (*percpu_init)(unsigned int);\n\tint (*percpu_deinit)(unsigned int);\n};\n\nstruct evtchn_send {\n\tevtchn_port_t port;\n};\n\nstruct evtchn_set_priority {\n\tevtchn_port_t port;\n\tuint32_t priority;\n};\n\nstruct evtchn_status {\n\tdomid_t dom;\n\tevtchn_port_t port;\n\tuint32_t status;\n\tuint32_t vcpu;\n\tunion {\n\t\tstruct {\n\t\t\tdomid_t dom;\n\t\t} unbound;\n\t\tstruct {\n\t\t\tdomid_t dom;\n\t\t\tevtchn_port_t port;\n\t\t} interdomain;\n\t\tuint32_t pirq;\n\t\tuint32_t virq;\n\t} u;\n};\n\nstruct evtchn_unmask {\n\tevtchn_port_t port;\n};\n\nstruct ewma_pkt_len {\n\tlong unsigned int internal;\n};\n\nstruct exception_stacks {\n\tchar DF_stack_guard[0];\n\tchar DF_stack[8192];\n\tchar NMI_stack_guard[0];\n\tchar NMI_stack[8192];\n\tchar DB_stack_guard[0];\n\tchar DB_stack[8192];\n\tchar MCE_stack_guard[0];\n\tchar MCE_stack[8192];\n\tchar VC_stack_guard[0];\n\tchar VC_stack[8192];\n\tchar VC2_stack_guard[0];\n\tchar VC2_stack[8192];\n\tchar IST_top_guard[0];\n};\n\nstruct exception_table_entry {\n\tint insn;\n\tint fixup;\n\tint data;\n};\n\nstruct exceptional_entry_key {\n\tstruct xarray *xa;\n\tlong unsigned int entry_start;\n};\n\nstruct exec_proc_event {\n\t__kernel_pid_t process_pid;\n\t__kernel_pid_t process_tgid;\n};\n\nstruct execmem_range {\n\tlong unsigned int start;\n\tlong unsigned int end;\n\tlong unsigned int fallback_start;\n\tlong unsigned int fallback_end;\n\tpgprot_t pgprot;\n\tunsigned int alignment;\n\tenum execmem_range_flags flags;\n};\n\nstruct execmem_info {\n\tstruct execmem_range ranges[5];\n};\n\nstruct execute_work {\n\tstruct work_struct work;\n};\n\nstruct exit_proc_event {\n\t__kernel_pid_t process_pid;\n\t__kernel_pid_t process_tgid;\n\t__u32 exit_code;\n\t__u32 exit_signal;\n\t__kernel_pid_t parent_pid;\n\t__kernel_pid_t parent_tgid;\n};\n\nstruct fid;\n\nstruct iomap;\n\nstruct export_operations {\n\tint (*encode_fh)(struct inode *, __u32 *, int *, struct inode *);\n\tstruct dentry * (*fh_to_dentry)(struct super_block *, struct fid *, int, int);\n\tstruct dentry * (*fh_to_parent)(struct super_block *, struct fid *, int, int);\n\tint (*get_name)(struct dentry *, char *, struct dentry *);\n\tstruct dentry * (*get_parent)(struct dentry *);\n\tint (*commit_metadata)(struct inode *);\n\tint (*get_uuid)(struct super_block *, u8 *, u32 *, u64 *);\n\tint (*map_blocks)(struct inode *, loff_t, u64, struct iomap *, bool, u32 *);\n\tint (*commit_blocks)(struct inode *, struct iomap *, int, struct iattr *);\n\tlong unsigned int flags;\n};\n\nstruct expresswire_timing {\n\tlong unsigned int poweroff_us;\n\tlong unsigned int detect_delay_us;\n\tlong unsigned int detect_us;\n\tlong unsigned int data_start_us;\n\tlong unsigned int end_of_data_low_us;\n\tlong unsigned int end_of_data_high_us;\n\tlong unsigned int short_bitset_us;\n\tlong unsigned int long_bitset_us;\n};\n\nstruct expresswire_common_props {\n\tstruct gpio_desc *ctrl_gpio;\n\tstruct expresswire_timing timing;\n};\n\nstruct ext4_free_extent {\n\text4_lblk_t fe_logical;\n\text4_grpblk_t fe_start;\n\text4_group_t fe_group;\n\text4_grpblk_t fe_len;\n};\n\nstruct ext4_prealloc_space;\n\nstruct ext4_locality_group;\n\nstruct ext4_allocation_context {\n\tstruct inode *ac_inode;\n\tstruct super_block *ac_sb;\n\tstruct ext4_free_extent ac_o_ex;\n\tstruct ext4_free_extent ac_g_ex;\n\tstruct ext4_free_extent ac_b_ex;\n\tstruct ext4_free_extent ac_f_ex;\n\text4_grpblk_t ac_orig_goal_len;\n\t__u32 ac_flags;\n\t__u32 ac_groups_linear_remaining;\n\t__u16 ac_groups_scanned;\n\t__u16 ac_found;\n\t__u16 ac_cX_found[5];\n\t__u16 ac_tail;\n\t__u16 ac_buddy;\n\t__u8 ac_status;\n\t__u8 ac_criteria;\n\t__u8 ac_2order;\n\t__u8 ac_op;\n\tstruct folio *ac_bitmap_folio;\n\tstruct folio *ac_buddy_folio;\n\tstruct ext4_prealloc_space *ac_pa;\n\tstruct ext4_locality_group *ac_lg;\n};\n\nstruct ext4_allocation_request {\n\tstruct inode *inode;\n\tunsigned int len;\n\text4_lblk_t logical;\n\text4_lblk_t lleft;\n\text4_lblk_t lright;\n\text4_fsblk_t goal;\n\text4_fsblk_t pleft;\n\text4_fsblk_t pright;\n\tunsigned int flags;\n};\n\nstruct ext4_attr {\n\tstruct attribute attr;\n\tshort int attr_id;\n\tshort int attr_ptr;\n\tshort unsigned int attr_size;\n\tunion {\n\t\tint offset;\n\t\tvoid *explicit_ptr;\n\t} u;\n};\n\nstruct ext4_group_info;\n\nstruct ext4_buddy {\n\tstruct folio *bd_buddy_folio;\n\tvoid *bd_buddy;\n\tstruct folio *bd_bitmap_folio;\n\tvoid *bd_bitmap;\n\tstruct ext4_group_info *bd_info;\n\tstruct super_block *bd_sb;\n\t__u16 bd_blkbits;\n\text4_group_t bd_group;\n};\n\nstruct ext4_dir_entry {\n\t__le32 inode;\n\t__le16 rec_len;\n\t__le16 name_len;\n\tchar name[255];\n};\n\nstruct ext4_dir_entry_2 {\n\t__le32 inode;\n\t__le16 rec_len;\n\t__u8 name_len;\n\t__u8 file_type;\n\tchar name[255];\n};\n\nstruct ext4_dir_entry_hash {\n\t__le32 hash;\n\t__le32 minor_hash;\n};\n\nstruct ext4_dir_entry_tail {\n\t__le32 det_reserved_zero1;\n\t__le16 det_rec_len;\n\t__u8 det_reserved_zero2;\n\t__u8 det_reserved_ft;\n\t__le32 det_checksum;\n};\n\nstruct ext4_err_translation {\n\tint code;\n\tint errno;\n};\n\nstruct ext4_es_stats {\n\tlong unsigned int es_stats_shrunk;\n\tstruct percpu_counter es_stats_cache_hits;\n\tstruct percpu_counter es_stats_cache_misses;\n\tu64 es_stats_scan_time;\n\tu64 es_stats_max_scan_time;\n\tstruct percpu_counter es_stats_all_cnt;\n\tstruct percpu_counter es_stats_shk_cnt;\n};\n\nstruct extent_status;\n\nstruct ext4_es_tree {\n\tstruct rb_root root;\n\tstruct extent_status *cache_es;\n};\n\nstruct ext4_extent;\n\nstruct ext4_extent_idx;\n\nstruct ext4_extent_header;\n\nstruct ext4_ext_path {\n\text4_fsblk_t p_block;\n\t__u16 p_depth;\n\t__u16 p_maxdepth;\n\tstruct ext4_extent *p_ext;\n\tstruct ext4_extent_idx *p_idx;\n\tstruct ext4_extent_header *p_hdr;\n\tstruct buffer_head *p_bh;\n};\n\nstruct ext4_extent {\n\t__le32 ee_block;\n\t__le16 ee_len;\n\t__le16 ee_start_hi;\n\t__le32 ee_start_lo;\n};\n\nstruct ext4_extent_header {\n\t__le16 eh_magic;\n\t__le16 eh_entries;\n\t__le16 eh_max;\n\t__le16 eh_depth;\n\t__le32 eh_generation;\n};\n\nstruct ext4_extent_idx {\n\t__le32 ei_block;\n\t__le32 ei_leaf_lo;\n\t__le16 ei_leaf_hi;\n\t__u16 ei_unused;\n};\n\nstruct ext4_extent_tail {\n\t__le32 et_checksum;\n};\n\nstruct ext4_fc_add_range {\n\t__le32 fc_ino;\n\t__u8 fc_ex[12];\n};\n\nstruct ext4_fc_alloc_region {\n\text4_lblk_t lblk;\n\text4_fsblk_t pblk;\n\tint ino;\n\tint len;\n};\n\nstruct ext4_fc_del_range {\n\t__le32 fc_ino;\n\t__le32 fc_lblk;\n\t__le32 fc_len;\n};\n\nstruct ext4_fc_dentry_info {\n\t__le32 fc_parent_ino;\n\t__le32 fc_ino;\n\t__u8 fc_dname[0];\n};\n\nstruct ext4_fc_dentry_update {\n\tint fcd_op;\n\tint fcd_parent;\n\tint fcd_ino;\n\tstruct qstr fcd_name;\n\tunsigned char fcd_iname[40];\n\tstruct list_head fcd_list;\n\tstruct list_head fcd_dilist;\n};\n\nstruct ext4_fc_head {\n\t__le32 fc_features;\n\t__le32 fc_tid;\n};\n\nstruct ext4_fc_inode {\n\t__le32 fc_ino;\n\t__u8 fc_raw_inode[0];\n};\n\nstruct ext4_fc_replay_state {\n\tint fc_replay_num_tags;\n\tint fc_replay_expected_off;\n\tint fc_current_pass;\n\tint fc_cur_tag;\n\tint fc_crc;\n\tstruct ext4_fc_alloc_region *fc_regions;\n\tint fc_regions_size;\n\tint fc_regions_used;\n\tint fc_regions_valid;\n\tint *fc_modified_inodes;\n\tint fc_modified_inodes_used;\n\tint fc_modified_inodes_size;\n};\n\nstruct ext4_fc_stats {\n\tunsigned int fc_ineligible_reason_count[10];\n\tlong unsigned int fc_num_commits;\n\tlong unsigned int fc_ineligible_commits;\n\tlong unsigned int fc_failed_commits;\n\tlong unsigned int fc_skipped_commits;\n\tlong unsigned int fc_numblks;\n\tu64 s_fc_avg_commit_time;\n};\n\nstruct ext4_fc_tail {\n\t__le32 fc_tid;\n\t__le32 fc_crc;\n};\n\nstruct ext4_fc_tl {\n\t__le16 fc_tag;\n\t__le16 fc_len;\n};\n\nstruct ext4_fc_tl_mem {\n\tu16 fc_tag;\n\tu16 fc_len;\n};\n\nstruct fscrypt_str {\n\tunsigned char *name;\n\tu32 len;\n};\n\nstruct ext4_filename {\n\tconst struct qstr *usr_fname;\n\tstruct fscrypt_str disk_name;\n\tstruct dx_hash_info hinfo;\n\tstruct fscrypt_str crypto_buf;\n\tstruct qstr cf_name;\n};\n\nstruct ext4_free_data {\n\tstruct list_head efd_list;\n\tstruct rb_node efd_node;\n\text4_group_t efd_group;\n\text4_grpblk_t efd_start_cluster;\n\text4_grpblk_t efd_count;\n\ttid_t efd_tid;\n};\n\nunion fscrypt_policy;\n\nstruct fscrypt_dummy_policy {\n\tconst union fscrypt_policy *policy;\n};\n\nstruct ext4_fs_context {\n\tchar *s_qf_names[3];\n\tstruct fscrypt_dummy_policy dummy_enc_policy;\n\tint s_jquota_fmt;\n\tshort unsigned int qname_spec;\n\tlong unsigned int vals_s_flags;\n\tlong unsigned int mask_s_flags;\n\tlong unsigned int journal_devnum;\n\tlong unsigned int s_commit_interval;\n\tlong unsigned int s_stripe;\n\tunsigned int s_inode_readahead_blks;\n\tunsigned int s_want_extra_isize;\n\tunsigned int s_li_wait_mult;\n\tunsigned int s_max_dir_size_kb;\n\tunsigned int journal_ioprio;\n\tunsigned int vals_s_mount_opt;\n\tunsigned int mask_s_mount_opt;\n\tunsigned int vals_s_mount_opt2;\n\tunsigned int mask_s_mount_opt2;\n\tunsigned int opt_flags;\n\tunsigned int spec;\n\tu32 s_max_batch_time;\n\tu32 s_min_batch_time;\n\tkuid_t s_resuid;\n\tkgid_t s_resgid;\n\text4_fsblk_t s_sb_block;\n};\n\nstruct ext4_fsmap {\n\tstruct list_head fmr_list;\n\tdev_t fmr_device;\n\tuint32_t fmr_flags;\n\tuint64_t fmr_physical;\n\tuint64_t fmr_owner;\n\tuint64_t fmr_length;\n};\n\nstruct ext4_fsmap_head {\n\tuint32_t fmh_iflags;\n\tuint32_t fmh_oflags;\n\tunsigned int fmh_count;\n\tunsigned int fmh_entries;\n\tstruct ext4_fsmap fmh_keys[2];\n};\n\nstruct ext4_getfsmap_info;\n\nstruct ext4_getfsmap_dev {\n\tint (*gfd_fn)(struct super_block *, struct ext4_fsmap *, struct ext4_getfsmap_info *);\n\tu32 gfd_dev;\n};\n\ntypedef int (*ext4_fsmap_format_t)(struct ext4_fsmap *, void *);\n\nstruct ext4_getfsmap_info {\n\tstruct ext4_fsmap_head *gfi_head;\n\text4_fsmap_format_t gfi_formatter;\n\tvoid *gfi_format_arg;\n\text4_fsblk_t gfi_next_fsblk;\n\tu32 gfi_dev;\n\text4_group_t gfi_agno;\n\tstruct ext4_fsmap gfi_low;\n\tstruct ext4_fsmap gfi_high;\n\tstruct ext4_fsmap gfi_lastfree;\n\tstruct list_head gfi_meta_list;\n\tbool gfi_last;\n};\n\nstruct ext4_group_desc {\n\t__le32 bg_block_bitmap_lo;\n\t__le32 bg_inode_bitmap_lo;\n\t__le32 bg_inode_table_lo;\n\t__le16 bg_free_blocks_count_lo;\n\t__le16 bg_free_inodes_count_lo;\n\t__le16 bg_used_dirs_count_lo;\n\t__le16 bg_flags;\n\t__le32 bg_exclude_bitmap_lo;\n\t__le16 bg_block_bitmap_csum_lo;\n\t__le16 bg_inode_bitmap_csum_lo;\n\t__le16 bg_itable_unused_lo;\n\t__le16 bg_checksum;\n\t__le32 bg_block_bitmap_hi;\n\t__le32 bg_inode_bitmap_hi;\n\t__le32 bg_inode_table_hi;\n\t__le16 bg_free_blocks_count_hi;\n\t__le16 bg_free_inodes_count_hi;\n\t__le16 bg_used_dirs_count_hi;\n\t__le16 bg_itable_unused_hi;\n\t__le32 bg_exclude_bitmap_hi;\n\t__le16 bg_block_bitmap_csum_hi;\n\t__le16 bg_inode_bitmap_csum_hi;\n\t__u32 bg_reserved;\n};\n\nstruct ext4_group_info {\n\tlong unsigned int bb_state;\n\tstruct rb_root bb_free_root;\n\text4_grpblk_t bb_first_free;\n\text4_grpblk_t bb_free;\n\text4_grpblk_t bb_fragments;\n\tint bb_avg_fragment_size_order;\n\text4_grpblk_t bb_largest_free_order;\n\text4_group_t bb_group;\n\tstruct list_head bb_prealloc_list;\n\tstruct rw_semaphore alloc_sem;\n\tstruct list_head bb_avg_fragment_size_node;\n\tstruct list_head bb_largest_free_order_node;\n\text4_grpblk_t bb_counters[0];\n};\n\nstruct ext4_iloc {\n\tstruct buffer_head *bh;\n\tlong unsigned int offset;\n\text4_group_t block_group;\n};\n\nstruct ext4_inode {\n\t__le16 i_mode;\n\t__le16 i_uid;\n\t__le32 i_size_lo;\n\t__le32 i_atime;\n\t__le32 i_ctime;\n\t__le32 i_mtime;\n\t__le32 i_dtime;\n\t__le16 i_gid;\n\t__le16 i_links_count;\n\t__le32 i_blocks_lo;\n\t__le32 i_flags;\n\tunion {\n\t\tstruct {\n\t\t\t__le32 l_i_version;\n\t\t} linux1;\n\t\tstruct {\n\t\t\t__u32 h_i_translator;\n\t\t} hurd1;\n\t\tstruct {\n\t\t\t__u32 m_i_reserved1;\n\t\t} masix1;\n\t} osd1;\n\t__le32 i_block[15];\n\t__le32 i_generation;\n\t__le32 i_file_acl_lo;\n\t__le32 i_size_high;\n\t__le32 i_obso_faddr;\n\tunion {\n\t\tstruct {\n\t\t\t__le16 l_i_blocks_high;\n\t\t\t__le16 l_i_file_acl_high;\n\t\t\t__le16 l_i_uid_high;\n\t\t\t__le16 l_i_gid_high;\n\t\t\t__le16 l_i_checksum_lo;\n\t\t\t__le16 l_i_reserved;\n\t\t} linux2;\n\t\tstruct {\n\t\t\t__le16 h_i_reserved1;\n\t\t\t__u16 h_i_mode_high;\n\t\t\t__u16 h_i_uid_high;\n\t\t\t__u16 h_i_gid_high;\n\t\t\t__u32 h_i_author;\n\t\t} hurd2;\n\t\tstruct {\n\t\t\t__le16 h_i_reserved1;\n\t\t\t__le16 m_i_file_acl_high;\n\t\t\t__u32 m_i_reserved2[2];\n\t\t} masix2;\n\t} osd2;\n\t__le16 i_extra_isize;\n\t__le16 i_checksum_hi;\n\t__le32 i_ctime_extra;\n\t__le32 i_mtime_extra;\n\t__le32 i_atime_extra;\n\t__le32 i_crtime;\n\t__le32 i_crtime_extra;\n\t__le32 i_version_hi;\n\t__le32 i_projid;\n};\n\nstruct ext4_pending_tree {\n\tstruct rb_root root;\n};\n\nstruct jbd2_inode;\n\nstruct ext4_inode_info {\n\t__le32 i_data[15];\n\t__u32 i_dtime;\n\text4_fsblk_t i_file_acl;\n\text4_group_t i_block_group;\n\text4_lblk_t i_dir_start_lookup;\n\tlong unsigned int i_flags;\n\tstruct rw_semaphore xattr_sem;\n\tunion {\n\t\tstruct list_head i_orphan;\n\t\tunsigned int i_orphan_idx;\n\t};\n\tstruct list_head i_fc_dilist;\n\tstruct list_head i_fc_list;\n\text4_lblk_t i_fc_lblk_start;\n\text4_lblk_t i_fc_lblk_len;\n\tatomic_t i_fc_updates;\n\twait_queue_head_t i_fc_wait;\n\tstruct mutex i_fc_lock;\n\tloff_t i_disksize;\n\tstruct rw_semaphore i_data_sem;\n\tstruct inode vfs_inode;\n\tstruct jbd2_inode *jinode;\n\tspinlock_t i_raw_lock;\n\tstruct timespec64 i_crtime;\n\tatomic_t i_prealloc_active;\n\tstruct rb_root i_prealloc_node;\n\trwlock_t i_prealloc_lock;\n\tstruct ext4_es_tree i_es_tree;\n\trwlock_t i_es_lock;\n\tstruct list_head i_es_list;\n\tunsigned int i_es_all_nr;\n\tunsigned int i_es_shk_nr;\n\text4_lblk_t i_es_shrink_lblk;\n\text4_group_t i_last_alloc_group;\n\tunsigned int i_reserved_data_blocks;\n\tstruct ext4_pending_tree i_pending_tree;\n\t__u16 i_extra_isize;\n\tu16 i_inline_off;\n\tu16 i_inline_size;\n\tqsize_t i_reserved_quota;\n\tspinlock_t i_completed_io_lock;\n\tstruct list_head i_rsv_conversion_list;\n\tstruct work_struct i_rsv_conversion_work;\n\tatomic_t i_unwritten;\n\tspinlock_t i_block_reservation_lock;\n\ttid_t i_sync_tid;\n\ttid_t i_datasync_tid;\n\tstruct dquot *i_dquot[3];\n\t__u32 i_csum_seed;\n\tkprojid_t i_projid;\n};\n\nstruct jbd2_journal_handle;\n\ntypedef struct jbd2_journal_handle handle_t;\n\nstruct ext4_io_end {\n\tstruct list_head list;\n\thandle_t *handle;\n\tstruct inode *inode;\n\tstruct bio *bio;\n\tunsigned int flag;\n\trefcount_t count;\n\tstruct list_head list_vec;\n};\n\ntypedef struct ext4_io_end ext4_io_end_t;\n\nstruct ext4_io_end_vec {\n\tstruct list_head list;\n\tloff_t offset;\n\tssize_t size;\n};\n\nstruct ext4_io_submit {\n\tstruct writeback_control *io_wbc;\n\tstruct bio *io_bio;\n\text4_io_end_t *io_end;\n\tsector_t io_next_block;\n};\n\nstruct ext4_journal_cb_entry {\n\tstruct list_head jce_list;\n\tvoid (*jce_func)(struct super_block *, struct ext4_journal_cb_entry *, int);\n};\n\nstruct jbd2_buffer_trigger_type {\n\tvoid (*t_frozen)(struct jbd2_buffer_trigger_type *, struct buffer_head *, void *, size_t);\n\tvoid (*t_abort)(struct jbd2_buffer_trigger_type *, struct buffer_head *);\n};\n\nstruct ext4_journal_trigger {\n\tstruct jbd2_buffer_trigger_type tr_triggers;\n\tstruct super_block *sb;\n};\n\nstruct ext4_lazy_init {\n\tlong unsigned int li_state;\n\tstruct list_head li_request_list;\n\tstruct mutex li_list_mtx;\n};\n\nstruct ext4_li_request {\n\tstruct super_block *lr_super;\n\tenum ext4_li_mode lr_mode;\n\text4_group_t lr_first_not_zeroed;\n\text4_group_t lr_next_group;\n\tstruct list_head lr_request;\n\tlong unsigned int lr_next_sched;\n\tlong unsigned int lr_timeout;\n};\n\nstruct ext4_locality_group {\n\tstruct mutex lg_mutex;\n\tstruct list_head lg_prealloc_list[10];\n\tspinlock_t lg_prealloc_lock;\n};\n\nstruct ext4_map_blocks {\n\text4_fsblk_t m_pblk;\n\text4_lblk_t m_lblk;\n\tunsigned int m_len;\n\tunsigned int m_flags;\n};\n\nstruct ext4_mount_options {\n\tlong unsigned int s_mount_opt;\n\tlong unsigned int s_mount_opt2;\n\tkuid_t s_resuid;\n\tkgid_t s_resgid;\n\tlong unsigned int s_commit_interval;\n\tu32 s_min_batch_time;\n\tu32 s_max_batch_time;\n\tint s_jquota_fmt;\n\tchar *s_qf_names[3];\n};\n\nstruct ext4_new_group_data;\n\nstruct ext4_new_flex_group_data {\n\tstruct ext4_new_group_data *groups;\n\t__u16 *bg_flags;\n\text4_group_t resize_bg;\n\text4_group_t count;\n};\n\nstruct ext4_new_group_data {\n\t__u32 group;\n\t__u64 block_bitmap;\n\t__u64 inode_bitmap;\n\t__u64 inode_table;\n\t__u32 blocks_count;\n\t__u16 reserved_blocks;\n\t__u16 mdata_blocks;\n\t__u32 free_clusters_count;\n};\n\nstruct ext4_new_group_input {\n\t__u32 group;\n\t__u64 block_bitmap;\n\t__u64 inode_bitmap;\n\t__u64 inode_table;\n\t__u32 blocks_count;\n\t__u16 reserved_blocks;\n\t__u16 unused;\n};\n\nstruct ext4_orphan_block {\n\tatomic_t ob_free_entries;\n\tstruct buffer_head *ob_bh;\n};\n\nstruct ext4_orphan_block_tail {\n\t__le32 ob_magic;\n\t__le32 ob_checksum;\n};\n\nstruct ext4_orphan_info {\n\tint of_blocks;\n\t__u32 of_csum_seed;\n\tstruct ext4_orphan_block *of_binfo;\n};\n\nstruct ext4_prealloc_space {\n\tunion {\n\t\tstruct rb_node inode_node;\n\t\tstruct list_head lg_list;\n\t} pa_node;\n\tstruct list_head pa_group_list;\n\tunion {\n\t\tstruct list_head pa_tmp_list;\n\t\tstruct callback_head pa_rcu;\n\t} u;\n\tspinlock_t pa_lock;\n\tatomic_t pa_count;\n\tunsigned int pa_deleted;\n\text4_fsblk_t pa_pstart;\n\text4_lblk_t pa_lstart;\n\text4_grpblk_t pa_len;\n\text4_grpblk_t pa_free;\n\tshort unsigned int pa_type;\n\tunion {\n\t\trwlock_t *inode_lock;\n\t\tspinlock_t *lg_lock;\n\t} pa_node_lock;\n\tstruct inode *pa_inode;\n};\n\nstruct ext4_rcu_ptr {\n\tstruct callback_head rcu;\n\tvoid *ptr;\n};\n\nstruct ext4_renament {\n\tstruct inode *dir;\n\tstruct dentry *dentry;\n\tstruct inode *inode;\n\tbool is_dir;\n\tint dir_nlink_delta;\n\tstruct buffer_head *bh;\n\tstruct ext4_dir_entry_2 *de;\n\tint inlined;\n\tstruct buffer_head *dir_bh;\n\tstruct ext4_dir_entry_2 *parent_de;\n\tint dir_inlined;\n};\n\nstruct ext4_sb_encodings {\n\t__u16 magic;\n\tchar *name;\n\tunsigned int version;\n};\n\nstruct rcu_sync {\n\tint gp_state;\n\tint gp_count;\n\twait_queue_head_t gp_wait;\n\tstruct callback_head cb_head;\n};\n\nstruct percpu_rw_semaphore {\n\tstruct rcu_sync rss;\n\tunsigned int *read_count;\n\tstruct rcuwait writer;\n\twait_queue_head_t waiters;\n\tatomic_t block;\n};\n\nstruct ext4_super_block;\n\nstruct journal_s;\n\nstruct ext4_system_blocks;\n\nstruct flex_groups;\n\nstruct shrinker;\n\nstruct mb_cache;\n\nstruct ext4_sb_info {\n\tlong unsigned int s_desc_size;\n\tlong unsigned int s_inodes_per_block;\n\tlong unsigned int s_blocks_per_group;\n\tlong unsigned int s_clusters_per_group;\n\tlong unsigned int s_inodes_per_group;\n\tlong unsigned int s_itb_per_group;\n\tlong unsigned int s_gdb_count;\n\tlong unsigned int s_desc_per_block;\n\text4_group_t s_groups_count;\n\text4_group_t s_blockfile_groups;\n\tlong unsigned int s_overhead;\n\tunsigned int s_cluster_ratio;\n\tunsigned int s_cluster_bits;\n\tloff_t s_bitmap_maxbytes;\n\tstruct buffer_head *s_sbh;\n\tstruct ext4_super_block *s_es;\n\tstruct buffer_head **s_group_desc;\n\tunsigned int s_mount_opt;\n\tunsigned int s_mount_opt2;\n\tlong unsigned int s_mount_flags;\n\tunsigned int s_def_mount_opt;\n\tunsigned int s_def_mount_opt2;\n\text4_fsblk_t s_sb_block;\n\tatomic64_t s_resv_clusters;\n\tkuid_t s_resuid;\n\tkgid_t s_resgid;\n\tshort unsigned int s_mount_state;\n\tshort unsigned int s_pad;\n\tint s_addr_per_block_bits;\n\tint s_desc_per_block_bits;\n\tint s_inode_size;\n\tint s_first_ino;\n\tunsigned int s_inode_readahead_blks;\n\tunsigned int s_inode_goal;\n\tu32 s_hash_seed[4];\n\tint s_def_hash_version;\n\tint s_hash_unsigned;\n\tstruct percpu_counter s_freeclusters_counter;\n\tstruct percpu_counter s_freeinodes_counter;\n\tstruct percpu_counter s_dirs_counter;\n\tstruct percpu_counter s_dirtyclusters_counter;\n\tstruct percpu_counter s_sra_exceeded_retry_limit;\n\tstruct blockgroup_lock *s_blockgroup_lock;\n\tstruct proc_dir_entry *s_proc;\n\tstruct kobject s_kobj;\n\tstruct completion s_kobj_unregister;\n\tstruct super_block *s_sb;\n\tstruct buffer_head *s_mmp_bh;\n\tstruct journal_s *s_journal;\n\tlong unsigned int s_ext4_flags;\n\tstruct mutex s_orphan_lock;\n\tstruct list_head s_orphan;\n\tstruct ext4_orphan_info s_orphan_info;\n\tlong unsigned int s_commit_interval;\n\tu32 s_max_batch_time;\n\tu32 s_min_batch_time;\n\tstruct file *s_journal_bdev_file;\n\tchar *s_qf_names[3];\n\tint s_jquota_fmt;\n\tunsigned int s_want_extra_isize;\n\tstruct ext4_system_blocks *s_system_blks;\n\tstruct ext4_group_info ***s_group_info;\n\tstruct inode *s_buddy_cache;\n\tspinlock_t s_md_lock;\n\tshort unsigned int *s_mb_offsets;\n\tunsigned int *s_mb_maxs;\n\tunsigned int s_group_info_size;\n\tunsigned int s_mb_free_pending;\n\tstruct list_head s_freed_data_list[2];\n\tstruct list_head s_discard_list;\n\tstruct work_struct s_discard_work;\n\tatomic_t s_retry_alloc_pending;\n\tstruct list_head *s_mb_avg_fragment_size;\n\trwlock_t *s_mb_avg_fragment_size_locks;\n\tstruct list_head *s_mb_largest_free_orders;\n\trwlock_t *s_mb_largest_free_orders_locks;\n\tlong unsigned int s_stripe;\n\tunsigned int s_mb_max_linear_groups;\n\tunsigned int s_mb_stream_request;\n\tunsigned int s_mb_max_to_scan;\n\tunsigned int s_mb_min_to_scan;\n\tunsigned int s_mb_stats;\n\tunsigned int s_mb_order2_reqs;\n\tunsigned int s_mb_group_prealloc;\n\tunsigned int s_max_dir_size_kb;\n\tlong unsigned int s_mb_last_group;\n\tlong unsigned int s_mb_last_start;\n\tunsigned int s_mb_prefetch;\n\tunsigned int s_mb_prefetch_limit;\n\tunsigned int s_mb_best_avail_max_trim_order;\n\tatomic_t s_bal_reqs;\n\tatomic_t s_bal_success;\n\tatomic_t s_bal_allocated;\n\tatomic_t s_bal_ex_scanned;\n\tatomic_t s_bal_cX_ex_scanned[5];\n\tatomic_t s_bal_groups_scanned;\n\tatomic_t s_bal_goals;\n\tatomic_t s_bal_len_goals;\n\tatomic_t s_bal_breaks;\n\tatomic_t s_bal_2orders;\n\tatomic_t s_bal_p2_aligned_bad_suggestions;\n\tatomic_t s_bal_goal_fast_bad_suggestions;\n\tatomic_t s_bal_best_avail_bad_suggestions;\n\tatomic64_t s_bal_cX_groups_considered[5];\n\tatomic64_t s_bal_cX_hits[5];\n\tatomic64_t s_bal_cX_failed[5];\n\tatomic_t s_mb_buddies_generated;\n\tatomic64_t s_mb_generation_time;\n\tatomic_t s_mb_lost_chunks;\n\tatomic_t s_mb_preallocated;\n\tatomic_t s_mb_discarded;\n\tatomic_t s_lock_busy;\n\tstruct ext4_locality_group *s_locality_groups;\n\tlong unsigned int s_sectors_written_start;\n\tu64 s_kbytes_written;\n\tunsigned int s_extent_max_zeroout_kb;\n\tunsigned int s_log_groups_per_flex;\n\tstruct flex_groups **s_flex_groups;\n\text4_group_t s_flex_groups_allocated;\n\tstruct workqueue_struct *rsv_conversion_wq;\n\tstruct timer_list s_err_report;\n\tstruct ext4_li_request *s_li_request;\n\tunsigned int s_li_wait_mult;\n\tstruct task_struct *s_mmp_tsk;\n\tlong unsigned int s_last_trim_minblks;\n\tstruct crypto_shash *s_chksum_driver;\n\t__u32 s_csum_seed;\n\tstruct shrinker *s_es_shrinker;\n\tstruct list_head s_es_list;\n\tlong int s_es_nr_inode;\n\tstruct ext4_es_stats s_es_stats;\n\tstruct mb_cache *s_ea_block_cache;\n\tstruct mb_cache *s_ea_inode_cache;\n\tlong: 64;\n\tspinlock_t s_es_lock;\n\tstruct ext4_journal_trigger s_journal_triggers[1];\n\tstruct ratelimit_state s_err_ratelimit_state;\n\tstruct ratelimit_state s_warning_ratelimit_state;\n\tstruct ratelimit_state s_msg_ratelimit_state;\n\tatomic_t s_warning_count;\n\tatomic_t s_msg_count;\n\tstruct fscrypt_dummy_policy s_dummy_enc_policy;\n\tstruct percpu_rw_semaphore s_writepages_rwsem;\n\tstruct dax_device *s_daxdev;\n\tu64 s_dax_part_off;\n\terrseq_t s_bdev_wb_err;\n\tspinlock_t s_bdev_wb_lock;\n\tspinlock_t s_error_lock;\n\tint s_add_error_count;\n\tint s_first_error_code;\n\t__u32 s_first_error_line;\n\t__u32 s_first_error_ino;\n\t__u64 s_first_error_block;\n\tconst char *s_first_error_func;\n\ttime64_t s_first_error_time;\n\tint s_last_error_code;\n\t__u32 s_last_error_line;\n\t__u32 s_last_error_ino;\n\t__u64 s_last_error_block;\n\tconst char *s_last_error_func;\n\ttime64_t s_last_error_time;\n\tstruct work_struct s_sb_upd_work;\n\tatomic_t s_fc_subtid;\n\tstruct list_head s_fc_q[2];\n\tstruct list_head s_fc_dentry_q[2];\n\tunsigned int s_fc_bytes;\n\tspinlock_t s_fc_lock;\n\tstruct buffer_head *s_fc_bh;\n\tstruct ext4_fc_stats s_fc_stats;\n\ttid_t s_fc_ineligible_tid;\n\tstruct ext4_fc_replay_state s_fc_replay_state;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct ext4_super_block {\n\t__le32 s_inodes_count;\n\t__le32 s_blocks_count_lo;\n\t__le32 s_r_blocks_count_lo;\n\t__le32 s_free_blocks_count_lo;\n\t__le32 s_free_inodes_count;\n\t__le32 s_first_data_block;\n\t__le32 s_log_block_size;\n\t__le32 s_log_cluster_size;\n\t__le32 s_blocks_per_group;\n\t__le32 s_clusters_per_group;\n\t__le32 s_inodes_per_group;\n\t__le32 s_mtime;\n\t__le32 s_wtime;\n\t__le16 s_mnt_count;\n\t__le16 s_max_mnt_count;\n\t__le16 s_magic;\n\t__le16 s_state;\n\t__le16 s_errors;\n\t__le16 s_minor_rev_level;\n\t__le32 s_lastcheck;\n\t__le32 s_checkinterval;\n\t__le32 s_creator_os;\n\t__le32 s_rev_level;\n\t__le16 s_def_resuid;\n\t__le16 s_def_resgid;\n\t__le32 s_first_ino;\n\t__le16 s_inode_size;\n\t__le16 s_block_group_nr;\n\t__le32 s_feature_compat;\n\t__le32 s_feature_incompat;\n\t__le32 s_feature_ro_compat;\n\t__u8 s_uuid[16];\n\tchar s_volume_name[16];\n\tchar s_last_mounted[64];\n\t__le32 s_algorithm_usage_bitmap;\n\t__u8 s_prealloc_blocks;\n\t__u8 s_prealloc_dir_blocks;\n\t__le16 s_reserved_gdt_blocks;\n\t__u8 s_journal_uuid[16];\n\t__le32 s_journal_inum;\n\t__le32 s_journal_dev;\n\t__le32 s_last_orphan;\n\t__le32 s_hash_seed[4];\n\t__u8 s_def_hash_version;\n\t__u8 s_jnl_backup_type;\n\t__le16 s_desc_size;\n\t__le32 s_default_mount_opts;\n\t__le32 s_first_meta_bg;\n\t__le32 s_mkfs_time;\n\t__le32 s_jnl_blocks[17];\n\t__le32 s_blocks_count_hi;\n\t__le32 s_r_blocks_count_hi;\n\t__le32 s_free_blocks_count_hi;\n\t__le16 s_min_extra_isize;\n\t__le16 s_want_extra_isize;\n\t__le32 s_flags;\n\t__le16 s_raid_stride;\n\t__le16 s_mmp_update_interval;\n\t__le64 s_mmp_block;\n\t__le32 s_raid_stripe_width;\n\t__u8 s_log_groups_per_flex;\n\t__u8 s_checksum_type;\n\t__u8 s_encryption_level;\n\t__u8 s_reserved_pad;\n\t__le64 s_kbytes_written;\n\t__le32 s_snapshot_inum;\n\t__le32 s_snapshot_id;\n\t__le64 s_snapshot_r_blocks_count;\n\t__le32 s_snapshot_list;\n\t__le32 s_error_count;\n\t__le32 s_first_error_time;\n\t__le32 s_first_error_ino;\n\t__le64 s_first_error_block;\n\t__u8 s_first_error_func[32];\n\t__le32 s_first_error_line;\n\t__le32 s_last_error_time;\n\t__le32 s_last_error_ino;\n\t__le32 s_last_error_line;\n\t__le64 s_last_error_block;\n\t__u8 s_last_error_func[32];\n\t__u8 s_mount_opts[64];\n\t__le32 s_usr_quota_inum;\n\t__le32 s_grp_quota_inum;\n\t__le32 s_overhead_clusters;\n\t__le32 s_backup_bgs[2];\n\t__u8 s_encrypt_algos[4];\n\t__u8 s_encrypt_pw_salt[16];\n\t__le32 s_lpf_ino;\n\t__le32 s_prj_quota_inum;\n\t__le32 s_checksum_seed;\n\t__u8 s_wtime_hi;\n\t__u8 s_mtime_hi;\n\t__u8 s_mkfs_time_hi;\n\t__u8 s_lastcheck_hi;\n\t__u8 s_first_error_time_hi;\n\t__u8 s_last_error_time_hi;\n\t__u8 s_first_error_errcode;\n\t__u8 s_last_error_errcode;\n\t__le16 s_encoding;\n\t__le16 s_encoding_flags;\n\t__le32 s_orphan_file_inum;\n\t__le32 s_reserved[94];\n\t__le32 s_checksum;\n};\n\nstruct ext4_system_blocks {\n\tstruct rb_root root;\n\tstruct callback_head rcu;\n};\n\nstruct ext4_system_zone {\n\tstruct rb_node node;\n\text4_fsblk_t start_blk;\n\tunsigned int count;\n\tu32 ino;\n};\n\nstruct ext4_xattr_entry;\n\nstruct ext4_xattr_search {\n\tstruct ext4_xattr_entry *first;\n\tvoid *base;\n\tvoid *end;\n\tstruct ext4_xattr_entry *here;\n\tint not_found;\n};\n\nstruct ext4_xattr_block_find {\n\tstruct ext4_xattr_search s;\n\tstruct buffer_head *bh;\n};\n\nstruct ext4_xattr_entry {\n\t__u8 e_name_len;\n\t__u8 e_name_index;\n\t__le16 e_value_offs;\n\t__le32 e_value_inum;\n\t__le32 e_value_size;\n\t__le32 e_hash;\n\tchar e_name[0];\n};\n\nstruct ext4_xattr_header {\n\t__le32 h_magic;\n\t__le32 h_refcount;\n\t__le32 h_blocks;\n\t__le32 h_hash;\n\t__le32 h_checksum;\n\t__u32 h_reserved[3];\n};\n\nstruct ext4_xattr_ibody_find {\n\tstruct ext4_xattr_search s;\n\tstruct ext4_iloc iloc;\n};\n\nstruct ext4_xattr_ibody_header {\n\t__le32 h_magic;\n};\n\nstruct ext4_xattr_info {\n\tconst char *name;\n\tconst void *value;\n\tsize_t value_len;\n\tint name_index;\n\tint in_inode;\n};\n\nstruct ext4_xattr_inode_array {\n\tunsigned int count;\n\tstruct inode *inodes[0];\n};\n\nstruct msg_msg;\n\nstruct ext_wait_queue {\n\tstruct task_struct *task;\n\tstruct list_head list;\n\tstruct msg_msg *msg;\n\tint state;\n};\n\nunion extcon_property_value {\n\tint intval;\n};\n\nstruct extcon_cable {\n\tstruct extcon_dev *edev;\n\tint cable_index;\n\tstruct attribute_group attr_g;\n\tstruct device_attribute attr_name;\n\tstruct device_attribute attr_state;\n\tstruct attribute *attrs[3];\n\tunion extcon_property_value usb_propval[3];\n\tunion extcon_property_value chg_propval[1];\n\tunion extcon_property_value jack_propval[1];\n\tunion extcon_property_value disp_propval[2];\n\tlong unsigned int usb_bits[1];\n\tlong unsigned int chg_bits[1];\n\tlong unsigned int jack_bits[1];\n\tlong unsigned int disp_bits[1];\n};\n\nstruct extcon_dev {\n\tconst char *name;\n\tconst unsigned int *supported_cable;\n\tconst u32 *mutually_exclusive;\n\tstruct device dev;\n\tunsigned int id;\n\tstruct raw_notifier_head nh_all;\n\tstruct raw_notifier_head *nh;\n\tstruct list_head entry;\n\tint max_supported;\n\tspinlock_t lock;\n\tu32 state;\n\tstruct device_type extcon_dev_type;\n\tstruct extcon_cable *cables;\n\tstruct attribute_group attr_g_muex;\n\tstruct attribute **attrs_muex;\n\tstruct device_attribute *d_attrs_muex;\n};\n\nstruct extcon_dev_notifier_devres {\n\tstruct extcon_dev *edev;\n\tunsigned int id;\n\tstruct notifier_block *nb;\n};\n\nstruct extended_signature {\n\tunsigned int sig;\n\tunsigned int pf;\n\tunsigned int cksum;\n};\n\nstruct extended_sigtable {\n\tunsigned int count;\n\tunsigned int cksum;\n\tunsigned int reserved[3];\n\tstruct extended_signature sigs[0];\n};\n\nstruct extent_status {\n\tstruct rb_node rb_node;\n\text4_lblk_t es_lblk;\n\text4_lblk_t es_len;\n\text4_fsblk_t es_pblk;\n};\n\nstruct external_name {\n\tunion {\n\t\tatomic_t count;\n\t\tstruct callback_head head;\n\t} u;\n\tunsigned char name[0];\n};\n\nstruct extra_reg {\n\tunsigned int event;\n\tunsigned int msr;\n\tu64 config_mask;\n\tu64 valid_mask;\n\tint idx;\n\tbool extra_msr_access;\n};\n\nstruct f815xxa_data {\n\tspinlock_t lock;\n\tint idx;\n};\n\nstruct f_owner_ex {\n\tint type;\n\t__kernel_pid_t pid;\n};\n\nstruct failover_ops;\n\nstruct failover {\n\tstruct list_head list;\n\tstruct net_device *failover_dev;\n\tnetdevice_tracker dev_tracker;\n\tstruct failover_ops *ops;\n};\n\nstruct failover_ops {\n\tint (*slave_pre_register)(struct net_device *, struct net_device *);\n\tint (*slave_register)(struct net_device *, struct net_device *);\n\tint (*slave_pre_unregister)(struct net_device *, struct net_device *);\n\tint (*slave_unregister)(struct net_device *, struct net_device *);\n\tint (*slave_link_change)(struct net_device *, struct net_device *);\n\tint (*slave_name_change)(struct net_device *, struct net_device *);\n\trx_handler_result_t (*slave_handle_frame)(struct sk_buff **);\n};\n\nstruct fan_fsid {\n\tstruct super_block *sb;\n\t__kernel_fsid_t id;\n\tbool weak;\n};\n\nstruct fsnotify_event {\n\tstruct list_head list;\n};\n\nstruct fanotify_event {\n\tstruct fsnotify_event fse;\n\tstruct hlist_node merge_list;\n\tu32 mask;\n\tstruct {\n\t\tunsigned int type: 3;\n\t\tunsigned int hash: 29;\n\t};\n\tstruct pid *pid;\n};\n\nstruct fanotify_fh {\n\tu8 type;\n\tu8 len;\n\tu8 flags;\n\tu8 pad;\n\tunsigned char buf[0];\n};\n\nstruct fanotify_error_event {\n\tstruct fanotify_event fae;\n\ts32 error;\n\tu32 err_count;\n\t__kernel_fsid_t fsid;\n\tstruct {\n\t\tstruct fanotify_fh object_fh;\n\t\tunsigned char _inline_fh_buf[128];\n\t};\n};\n\nstruct fanotify_event_info_header {\n\t__u8 info_type;\n\t__u8 pad;\n\t__u16 len;\n};\n\nstruct fanotify_event_info_error {\n\tstruct fanotify_event_info_header hdr;\n\t__s32 error;\n\t__u32 error_count;\n};\n\nstruct fanotify_event_info_fid {\n\tstruct fanotify_event_info_header hdr;\n\t__kernel_fsid_t fsid;\n\tunsigned char handle[0];\n};\n\nstruct fanotify_event_info_pidfd {\n\tstruct fanotify_event_info_header hdr;\n\t__s32 pidfd;\n};\n\nstruct fanotify_event_metadata {\n\t__u32 event_len;\n\t__u8 vers;\n\t__u8 reserved;\n\t__u16 metadata_len;\n\t__u64 mask;\n\t__s32 fd;\n\t__s32 pid;\n};\n\nstruct fanotify_fid_event {\n\tstruct fanotify_event fae;\n\t__kernel_fsid_t fsid;\n\tstruct {\n\t\tstruct fanotify_fh object_fh;\n\t\tunsigned char _inline_fh_buf[12];\n\t};\n};\n\nstruct fanotify_group_private_data {\n\tstruct hlist_head *merge_hash;\n\tstruct list_head access_list;\n\twait_queue_head_t access_waitq;\n\tint flags;\n\tint f_flags;\n\tstruct ucounts *ucounts;\n\tmempool_t error_events_pool;\n};\n\nstruct fanotify_info {\n\tu8 dir_fh_totlen;\n\tu8 dir2_fh_totlen;\n\tu8 file_fh_totlen;\n\tu8 name_len;\n\tu8 name2_len;\n\tu8 pad[3];\n\tunsigned char buf[0];\n};\n\nstruct fanotify_mark {\n\tstruct fsnotify_mark fsn_mark;\n\t__kernel_fsid_t fsid;\n};\n\nstruct fanotify_name_event {\n\tstruct fanotify_event fae;\n\t__kernel_fsid_t fsid;\n\tstruct fanotify_info info;\n};\n\nstruct fanotify_path_event {\n\tstruct fanotify_event fae;\n\tstruct path path;\n};\n\nstruct fanotify_response_info_header {\n\t__u8 type;\n\t__u8 pad;\n\t__u16 len;\n};\n\nstruct fanotify_response_info_audit_rule {\n\tstruct fanotify_response_info_header hdr;\n\t__u32 rule_number;\n\t__u32 subj_trust;\n\t__u32 obj_trust;\n};\n\nstruct fanotify_perm_event {\n\tstruct fanotify_event fae;\n\tstruct path path;\n\tu32 response;\n\tshort unsigned int state;\n\tint fd;\n\tunion {\n\t\tstruct fanotify_response_info_header hdr;\n\t\tstruct fanotify_response_info_audit_rule audit_rule;\n\t};\n};\n\nstruct fanotify_response {\n\t__s32 fd;\n\t__u32 response;\n};\n\nstruct fanout_args {\n\t__u16 id;\n\t__u16 type_flags;\n\t__u32 max_num_members;\n};\n\nstruct fast_pool {\n\tlong unsigned int pool[4];\n\tlong unsigned int last;\n\tunsigned int count;\n\tstruct timer_list mix;\n};\n\nstruct request_sock;\n\nstruct tcp_fastopen_context;\n\nstruct fastopen_queue {\n\tstruct request_sock *rskq_rst_head;\n\tstruct request_sock *rskq_rst_tail;\n\tspinlock_t lock;\n\tint qlen;\n\tint max_qlen;\n\tstruct tcp_fastopen_context *ctx;\n};\n\nstruct fasync_struct {\n\trwlock_t fa_lock;\n\tint magic;\n\tint fa_fd;\n\tstruct fasync_struct *fa_next;\n\tstruct file *fa_file;\n\tstruct callback_head fa_rcu;\n};\n\nstruct fat_bios_param_block {\n\tu16 fat_sector_size;\n\tu8 fat_sec_per_clus;\n\tu16 fat_reserved;\n\tu8 fat_fats;\n\tu16 fat_dir_entries;\n\tu16 fat_sectors;\n\tu16 fat_fat_length;\n\tu32 fat_total_sect;\n\tu8 fat16_state;\n\tu32 fat16_vol_id;\n\tu32 fat32_length;\n\tu32 fat32_root_cluster;\n\tu16 fat32_info_sector;\n\tu8 fat32_state;\n\tu32 fat32_vol_id;\n};\n\nstruct fat_boot_fsinfo {\n\t__le32 signature1;\n\t__le32 reserved1[120];\n\t__le32 signature2;\n\t__le32 free_clusters;\n\t__le32 next_cluster;\n\t__le32 reserved2[4];\n};\n\nstruct fat_boot_sector {\n\t__u8 ignored[3];\n\t__u8 system_id[8];\n\t__u8 sector_size[2];\n\t__u8 sec_per_clus;\n\t__le16 reserved;\n\t__u8 fats;\n\t__u8 dir_entries[2];\n\t__u8 sectors[2];\n\t__u8 media;\n\t__le16 fat_length;\n\t__le16 secs_track;\n\t__le16 heads;\n\t__le32 hidden;\n\t__le32 total_sect;\n\tunion {\n\t\tstruct {\n\t\t\t__u8 drive_number;\n\t\t\t__u8 state;\n\t\t\t__u8 signature;\n\t\t\t__u8 vol_id[4];\n\t\t\t__u8 vol_label[11];\n\t\t\t__u8 fs_type[8];\n\t\t} fat16;\n\t\tstruct {\n\t\t\t__le32 length;\n\t\t\t__le16 flags;\n\t\t\t__u8 version[2];\n\t\t\t__le32 root_cluster;\n\t\t\t__le16 info_sector;\n\t\t\t__le16 backup_boot;\n\t\t\t__le16 reserved2[6];\n\t\t\t__u8 drive_number;\n\t\t\t__u8 state;\n\t\t\t__u8 signature;\n\t\t\t__u8 vol_id[4];\n\t\t\t__u8 vol_label[11];\n\t\t\t__u8 fs_type[8];\n\t\t} fat32;\n\t};\n};\n\nstruct fat_cache {\n\tstruct list_head cache_list;\n\tint nr_contig;\n\tint fcluster;\n\tint dcluster;\n};\n\nstruct fat_cache_id {\n\tunsigned int id;\n\tint nr_contig;\n\tint fcluster;\n\tint dcluster;\n};\n\nstruct fat_entry {\n\tint entry;\n\tunion {\n\t\tu8 *ent12_p[2];\n\t\t__le16 *ent16_p;\n\t\t__le32 *ent32_p;\n\t} u;\n\tint nr_bhs;\n\tstruct buffer_head *bhs[2];\n\tstruct inode *fat_inode;\n};\n\nstruct fat_fid {\n\tu32 i_gen;\n\tu32 i_pos_low;\n\tu16 i_pos_hi;\n\tu16 parent_i_pos_hi;\n\tu32 parent_i_pos_low;\n\tu32 parent_i_gen;\n};\n\nstruct fat_floppy_defaults {\n\tunsigned int nr_sectors;\n\tunsigned int sec_per_clus;\n\tunsigned int dir_entries;\n\tunsigned int media;\n\tunsigned int fat_length;\n};\n\nstruct fat_ioctl_filldir_callback {\n\tstruct dir_context ctx;\n\tvoid *dirent;\n\tint result;\n\tconst char *longname;\n\tint long_len;\n\tconst char *shortname;\n\tint short_len;\n};\n\nstruct fat_mount_options {\n\tkuid_t fs_uid;\n\tkgid_t fs_gid;\n\tshort unsigned int fs_fmask;\n\tshort unsigned int fs_dmask;\n\tshort unsigned int codepage;\n\tint time_offset;\n\tchar *iocharset;\n\tshort unsigned int shortname;\n\tunsigned char name_check;\n\tunsigned char errors;\n\tunsigned char nfs;\n\tshort unsigned int allow_utime;\n\tunsigned int quiet: 1;\n\tunsigned int showexec: 1;\n\tunsigned int sys_immutable: 1;\n\tunsigned int dotsOK: 1;\n\tunsigned int isvfat: 1;\n\tunsigned int utf8: 1;\n\tunsigned int unicode_xlate: 1;\n\tunsigned int numtail: 1;\n\tunsigned int flush: 1;\n\tunsigned int nocase: 1;\n\tunsigned int usefree: 1;\n\tunsigned int tz_set: 1;\n\tunsigned int rodir: 1;\n\tunsigned int discard: 1;\n\tunsigned int dos1xfloppy: 1;\n\tunsigned int debug: 1;\n};\n\nstruct msdos_dir_entry;\n\nstruct fat_slot_info {\n\tloff_t i_pos;\n\tloff_t slot_off;\n\tint nr_slots;\n\tstruct msdos_dir_entry *de;\n\tstruct buffer_head *bh;\n};\n\nstruct fatent_operations {\n\tvoid (*ent_blocknr)(struct super_block *, int, int *, sector_t *);\n\tvoid (*ent_set_ptr)(struct fat_entry *, int);\n\tint (*ent_bread)(struct super_block *, struct fat_entry *, int, sector_t);\n\tint (*ent_get)(struct fat_entry *);\n\tvoid (*ent_put)(struct fat_entry *, int);\n\tint (*ent_next)(struct fat_entry *);\n};\n\nstruct fatent_ra {\n\tsector_t cur;\n\tsector_t limit;\n\tunsigned int ra_blocks;\n\tsector_t ra_advance;\n\tsector_t ra_next;\n\tsector_t ra_limit;\n};\n\nstruct fb_bitfield {\n\t__u32 offset;\n\t__u32 length;\n\t__u32 msb_right;\n};\n\nstruct fb_blit_caps {\n\tlong unsigned int x[1];\n\tlong unsigned int y[2];\n\tu32 len;\n\tu32 flags;\n};\n\nstruct fb_chroma {\n\t__u32 redx;\n\t__u32 greenx;\n\t__u32 bluex;\n\t__u32 whitex;\n\t__u32 redy;\n\t__u32 greeny;\n\t__u32 bluey;\n\t__u32 whitey;\n};\n\nstruct fb_cmap {\n\t__u32 start;\n\t__u32 len;\n\t__u16 *red;\n\t__u16 *green;\n\t__u16 *blue;\n\t__u16 *transp;\n};\n\nstruct fb_cmap32 {\n\tu32 start;\n\tu32 len;\n\tcompat_caddr_t red;\n\tcompat_caddr_t green;\n\tcompat_caddr_t blue;\n\tcompat_caddr_t transp;\n};\n\nstruct fb_cmap_user {\n\t__u32 start;\n\t__u32 len;\n\t__u16 *red;\n\t__u16 *green;\n\t__u16 *blue;\n\t__u16 *transp;\n};\n\nstruct fb_con2fbmap {\n\t__u32 console;\n\t__u32 framebuffer;\n};\n\nstruct fb_copyarea {\n\t__u32 dx;\n\t__u32 dy;\n\t__u32 width;\n\t__u32 height;\n\t__u32 sx;\n\t__u32 sy;\n};\n\nstruct fbcurpos {\n\t__u16 x;\n\t__u16 y;\n};\n\nstruct fb_image {\n\t__u32 dx;\n\t__u32 dy;\n\t__u32 width;\n\t__u32 height;\n\t__u32 fg_color;\n\t__u32 bg_color;\n\t__u8 depth;\n\tconst char *data;\n\tstruct fb_cmap cmap;\n};\n\nstruct fb_cursor {\n\t__u16 set;\n\t__u16 enable;\n\t__u16 rop;\n\tconst char *mask;\n\tstruct fbcurpos hot;\n\tstruct fb_image image;\n};\n\nstruct fb_cvt_data {\n\tu32 xres;\n\tu32 yres;\n\tu32 refresh;\n\tu32 f_refresh;\n\tu32 pixclock;\n\tu32 hperiod;\n\tu32 hblank;\n\tu32 hfreq;\n\tu32 htotal;\n\tu32 vtotal;\n\tu32 vsync;\n\tu32 hsync;\n\tu32 h_front_porch;\n\tu32 h_back_porch;\n\tu32 v_front_porch;\n\tu32 v_back_porch;\n\tu32 h_margin;\n\tu32 v_margin;\n\tu32 interlace;\n\tu32 aspect_ratio;\n\tu32 active_pixels;\n\tu32 flags;\n\tu32 status;\n};\n\nstruct fb_deferred_io_pageref {\n\tstruct page *page;\n\tlong unsigned int offset;\n\tstruct list_head list;\n};\n\nstruct fb_event {\n\tstruct fb_info *info;\n\tvoid *data;\n};\n\nstruct fb_fillrect {\n\t__u32 dx;\n\t__u32 dy;\n\t__u32 width;\n\t__u32 height;\n\t__u32 color;\n\t__u32 rop;\n};\n\nstruct fb_fix_screeninfo {\n\tchar id[16];\n\tlong unsigned int smem_start;\n\t__u32 smem_len;\n\t__u32 type;\n\t__u32 type_aux;\n\t__u32 visual;\n\t__u16 xpanstep;\n\t__u16 ypanstep;\n\t__u16 ywrapstep;\n\t__u32 line_length;\n\tlong unsigned int mmio_start;\n\t__u32 mmio_len;\n\t__u32 accel;\n\t__u16 capabilities;\n\t__u16 reserved[2];\n};\n\nstruct fb_fix_screeninfo32 {\n\tchar id[16];\n\tcompat_caddr_t smem_start;\n\tu32 smem_len;\n\tu32 type;\n\tu32 type_aux;\n\tu32 visual;\n\tu16 xpanstep;\n\tu16 ypanstep;\n\tu16 ywrapstep;\n\tu32 line_length;\n\tcompat_caddr_t mmio_start;\n\tu32 mmio_len;\n\tu32 accel;\n\tu16 reserved[3];\n};\n\nstruct fb_var_screeninfo {\n\t__u32 xres;\n\t__u32 yres;\n\t__u32 xres_virtual;\n\t__u32 yres_virtual;\n\t__u32 xoffset;\n\t__u32 yoffset;\n\t__u32 bits_per_pixel;\n\t__u32 grayscale;\n\tstruct fb_bitfield red;\n\tstruct fb_bitfield green;\n\tstruct fb_bitfield blue;\n\tstruct fb_bitfield transp;\n\t__u32 nonstd;\n\t__u32 activate;\n\t__u32 height;\n\t__u32 width;\n\t__u32 accel_flags;\n\t__u32 pixclock;\n\t__u32 left_margin;\n\t__u32 right_margin;\n\t__u32 upper_margin;\n\t__u32 lower_margin;\n\t__u32 hsync_len;\n\t__u32 vsync_len;\n\t__u32 sync;\n\t__u32 vmode;\n\t__u32 rotate;\n\t__u32 colorspace;\n\t__u32 reserved[4];\n};\n\nstruct fb_monspecs {\n\tstruct fb_chroma chroma;\n\tstruct fb_videomode *modedb;\n\t__u8 manufacturer[4];\n\t__u8 monitor[14];\n\t__u8 serial_no[14];\n\t__u8 ascii[14];\n\t__u32 modedb_len;\n\t__u32 model;\n\t__u32 serial;\n\t__u32 year;\n\t__u32 week;\n\t__u32 hfmin;\n\t__u32 hfmax;\n\t__u32 dclkmin;\n\t__u32 dclkmax;\n\t__u16 input;\n\t__u16 dpms;\n\t__u16 signal;\n\t__u16 vfmin;\n\t__u16 vfmax;\n\t__u16 gamma;\n\t__u16 gtf: 1;\n\t__u16 misc;\n\t__u8 version;\n\t__u8 revision;\n\t__u8 max_x;\n\t__u8 max_y;\n};\n\nstruct fb_pixmap {\n\tu8 *addr;\n\tu32 size;\n\tu32 offset;\n\tu32 buf_align;\n\tu32 scan_align;\n\tu32 access_align;\n\tu32 flags;\n\tlong unsigned int blit_x[1];\n\tlong unsigned int blit_y[2];\n\tvoid (*writeio)(struct fb_info *, void *, void *, unsigned int);\n\tvoid (*readio)(struct fb_info *, void *, void *, unsigned int);\n};\n\nstruct fb_ops;\n\nstruct fb_tile_ops;\n\nstruct fb_info {\n\trefcount_t count;\n\tint node;\n\tint flags;\n\tint fbcon_rotate_hint;\n\tstruct mutex lock;\n\tstruct mutex mm_lock;\n\tstruct fb_var_screeninfo var;\n\tstruct fb_fix_screeninfo fix;\n\tstruct fb_monspecs monspecs;\n\tstruct fb_pixmap pixmap;\n\tstruct fb_pixmap sprite;\n\tstruct fb_cmap cmap;\n\tstruct list_head modelist;\n\tstruct fb_videomode *mode;\n\tstruct backlight_device *bl_dev;\n\tstruct mutex bl_curve_mutex;\n\tu8 bl_curve[128];\n\tstruct delayed_work deferred_work;\n\tlong unsigned int npagerefs;\n\tstruct fb_deferred_io_pageref *pagerefs;\n\tstruct fb_deferred_io *fbdefio;\n\tconst struct fb_ops *fbops;\n\tstruct device *device;\n\tstruct device *dev;\n\tint class_flag;\n\tstruct fb_tile_ops *tileops;\n\tunion {\n\t\tchar *screen_base;\n\t\tchar *screen_buffer;\n\t};\n\tlong unsigned int screen_size;\n\tvoid *pseudo_palette;\n\tu32 state;\n\tvoid *fbcon_par;\n\tvoid *par;\n\tbool skip_vt_switch;\n};\n\nstruct fb_videomode {\n\tconst char *name;\n\tu32 refresh;\n\tu32 xres;\n\tu32 yres;\n\tu32 pixclock;\n\tu32 left_margin;\n\tu32 right_margin;\n\tu32 upper_margin;\n\tu32 lower_margin;\n\tu32 hsync_len;\n\tu32 vsync_len;\n\tu32 sync;\n\tu32 vmode;\n\tu32 flag;\n};\n\nstruct fb_modelist {\n\tstruct list_head list;\n\tstruct fb_videomode mode;\n};\n\nstruct fb_ops {\n\tstruct module *owner;\n\tint (*fb_open)(struct fb_info *, int);\n\tint (*fb_release)(struct fb_info *, int);\n\tssize_t (*fb_read)(struct fb_info *, char *, size_t, loff_t *);\n\tssize_t (*fb_write)(struct fb_info *, const char *, size_t, loff_t *);\n\tint (*fb_check_var)(struct fb_var_screeninfo *, struct fb_info *);\n\tint (*fb_set_par)(struct fb_info *);\n\tint (*fb_setcolreg)(unsigned int, unsigned int, unsigned int, unsigned int, unsigned int, struct fb_info *);\n\tint (*fb_setcmap)(struct fb_cmap *, struct fb_info *);\n\tint (*fb_blank)(int, struct fb_info *);\n\tint (*fb_pan_display)(struct fb_var_screeninfo *, struct fb_info *);\n\tvoid (*fb_fillrect)(struct fb_info *, const struct fb_fillrect *);\n\tvoid (*fb_copyarea)(struct fb_info *, const struct fb_copyarea *);\n\tvoid (*fb_imageblit)(struct fb_info *, const struct fb_image *);\n\tint (*fb_cursor)(struct fb_info *, struct fb_cursor *);\n\tint (*fb_sync)(struct fb_info *);\n\tint (*fb_ioctl)(struct fb_info *, unsigned int, long unsigned int);\n\tint (*fb_compat_ioctl)(struct fb_info *, unsigned int, long unsigned int);\n\tint (*fb_mmap)(struct fb_info *, struct vm_area_struct *);\n\tvoid (*fb_get_caps)(struct fb_info *, struct fb_blit_caps *, struct fb_var_screeninfo *);\n\tvoid (*fb_destroy)(struct fb_info *);\n\tint (*fb_debug_enter)(struct fb_info *);\n\tint (*fb_debug_leave)(struct fb_info *);\n};\n\nstruct fb_tilemap;\n\nstruct fb_tilearea;\n\nstruct fb_tilerect;\n\nstruct fb_tileblit;\n\nstruct fb_tilecursor;\n\nstruct fb_tile_ops {\n\tvoid (*fb_settile)(struct fb_info *, struct fb_tilemap *);\n\tvoid (*fb_tilecopy)(struct fb_info *, struct fb_tilearea *);\n\tvoid (*fb_tilefill)(struct fb_info *, struct fb_tilerect *);\n\tvoid (*fb_tileblit)(struct fb_info *, struct fb_tileblit *);\n\tvoid (*fb_tilecursor)(struct fb_info *, struct fb_tilecursor *);\n\tint (*fb_get_tilemax)(struct fb_info *);\n};\n\nstruct fb_tilearea {\n\t__u32 sx;\n\t__u32 sy;\n\t__u32 dx;\n\t__u32 dy;\n\t__u32 width;\n\t__u32 height;\n};\n\nstruct fb_tileblit {\n\t__u32 sx;\n\t__u32 sy;\n\t__u32 width;\n\t__u32 height;\n\t__u32 fg;\n\t__u32 bg;\n\t__u32 length;\n\t__u32 *indices;\n};\n\nstruct fb_tilecursor {\n\t__u32 sx;\n\t__u32 sy;\n\t__u32 mode;\n\t__u32 shape;\n\t__u32 fg;\n\t__u32 bg;\n};\n\nstruct fb_tilemap {\n\t__u32 width;\n\t__u32 height;\n\t__u32 depth;\n\t__u32 length;\n\tconst __u8 *data;\n};\n\nstruct fb_tilerect {\n\t__u32 sx;\n\t__u32 sy;\n\t__u32 width;\n\t__u32 height;\n\t__u32 index;\n\t__u32 fg;\n\t__u32 bg;\n\t__u32 rop;\n};\n\nstruct fbcon_display {\n\tconst u_char *fontdata;\n\tint userfont;\n\tu_short inverse;\n\tshort int yscroll;\n\tint vrows;\n\tint cursor_shape;\n\tint con_rotate;\n\tu32 xres_virtual;\n\tu32 yres_virtual;\n\tu32 height;\n\tu32 width;\n\tu32 bits_per_pixel;\n\tu32 grayscale;\n\tu32 nonstd;\n\tu32 accel_flags;\n\tu32 rotate;\n\tstruct fb_bitfield red;\n\tstruct fb_bitfield green;\n\tstruct fb_bitfield blue;\n\tstruct fb_bitfield transp;\n\tconst struct fb_videomode *mode;\n};\n\nstruct fbcon_ops {\n\tvoid (*bmove)(struct vc_data *, struct fb_info *, int, int, int, int, int, int);\n\tvoid (*clear)(struct vc_data *, struct fb_info *, int, int, int, int);\n\tvoid (*putcs)(struct vc_data *, struct fb_info *, const short unsigned int *, int, int, int, int, int);\n\tvoid (*clear_margins)(struct vc_data *, struct fb_info *, int, int);\n\tvoid (*cursor)(struct vc_data *, struct fb_info *, bool, int, int);\n\tint (*update_start)(struct fb_info *);\n\tint (*rotate_font)(struct fb_info *, struct vc_data *);\n\tstruct fb_var_screeninfo var;\n\tstruct delayed_work cursor_work;\n\tstruct fb_cursor cursor_state;\n\tstruct fbcon_display *p;\n\tstruct fb_info *info;\n\tint currcon;\n\tint cur_blink_jiffies;\n\tint cursor_flash;\n\tint cursor_reset;\n\tint blank_state;\n\tint graphics;\n\tint save_graphics;\n\tbool initialized;\n\tint rotate;\n\tint cur_rotate;\n\tchar *cursor_data;\n\tu8 *fontbuffer;\n\tu8 *fontdata;\n\tu8 *cursor_src;\n\tu32 cursor_size;\n\tu32 fd_size;\n};\n\nstruct fc_log {\n\trefcount_t usage;\n\tu8 head;\n\tu8 tail;\n\tu8 need_free;\n\tstruct module *owner;\n\tchar *buffer[8];\n};\n\nstruct fch_clk_data {\n\tvoid *base;\n\tchar *name;\n};\n\nstruct fch_hdr {\n\t__u8 daddr[6];\n\t__u8 saddr[6];\n};\n\nstruct fcllc {\n\t__u8 dsap;\n\t__u8 ssap;\n\t__u8 llc;\n\t__u8 protid[3];\n\t__be16 ethertype;\n};\n\nstruct fd {\n\tstruct file *file;\n\tunsigned int flags;\n};\n\ntypedef struct fd class_fd_raw_t;\n\ntypedef struct fd class_fd_t;\n\nstruct fd_data {\n\tfmode_t mode;\n\tunsigned int fd;\n};\n\nstruct fd_range {\n\tunsigned int from;\n\tunsigned int to;\n};\n\nstruct fddi_8022_1_hdr {\n\t__u8 dsap;\n\t__u8 ssap;\n\t__u8 ctrl;\n};\n\nstruct fddi_8022_2_hdr {\n\t__u8 dsap;\n\t__u8 ssap;\n\t__u8 ctrl_1;\n\t__u8 ctrl_2;\n};\n\nstruct fddi_snap_hdr {\n\t__u8 dsap;\n\t__u8 ssap;\n\t__u8 ctrl;\n\t__u8 oui[3];\n\t__be16 ethertype;\n};\n\nstruct fddihdr {\n\t__u8 fc;\n\t__u8 daddr[6];\n\t__u8 saddr[6];\n\tunion {\n\t\tstruct fddi_8022_1_hdr llc_8022_1;\n\t\tstruct fddi_8022_2_hdr llc_8022_2;\n\t\tstruct fddi_snap_hdr llc_snap;\n\t} hdr;\n} __attribute__((packed));\n\nstruct fdtable {\n\tunsigned int max_fds;\n\tstruct file **fd;\n\tlong unsigned int *close_on_exec;\n\tlong unsigned int *open_fds;\n\tlong unsigned int *full_fds_bits;\n\tstruct callback_head rcu;\n};\n\nstruct features_reply_data {\n\tstruct ethnl_reply_data base;\n\tu32 hw[2];\n\tu32 wanted[2];\n\tu32 active[2];\n\tu32 nochange[2];\n\tu32 all[2];\n};\n\nstruct fec_stat_grp {\n\tu64 stats[9];\n\tu8 cnt;\n};\n\nstruct fec_reply_data {\n\tstruct ethnl_reply_data base;\n\tlong unsigned int fec_link_modes[2];\n\tu32 active_fec;\n\tu8 fec_auto;\n\tstruct fec_stat_grp corr;\n\tstruct fec_stat_grp uncorr;\n\tstruct fec_stat_grp corr_bits;\n};\n\nstruct fentry_trace_entry_head {\n\tstruct trace_entry ent;\n\tlong unsigned int ip;\n};\n\nstruct fetch_insn {\n\tenum fetch_op op;\n\tunion {\n\t\tunsigned int param;\n\t\tstruct {\n\t\t\tunsigned int size;\n\t\t\tint offset;\n\t\t};\n\t\tstruct {\n\t\t\tunsigned char basesize;\n\t\t\tunsigned char lshift;\n\t\t\tunsigned char rshift;\n\t\t};\n\t\tlong unsigned int immediate;\n\t\tvoid *data;\n\t};\n};\n\nstruct trace_seq;\n\ntypedef int (*print_type_func_t)(struct trace_seq *, void *, void *);\n\nstruct fetch_type {\n\tconst char *name;\n\tsize_t size;\n\tbool is_signed;\n\tbool is_string;\n\tprint_type_func_t print;\n\tconst char *fmt;\n\tconst char *fmttype;\n};\n\nstruct fexit_trace_entry_head {\n\tstruct trace_entry ent;\n\tlong unsigned int func;\n\tlong unsigned int ret_ip;\n};\n\nstruct ff_condition_effect {\n\t__u16 right_saturation;\n\t__u16 left_saturation;\n\t__s16 right_coeff;\n\t__s16 left_coeff;\n\t__u16 deadband;\n\t__s16 center;\n};\n\nstruct ff_envelope {\n\t__u16 attack_length;\n\t__u16 attack_level;\n\t__u16 fade_length;\n\t__u16 fade_level;\n};\n\nstruct ff_constant_effect {\n\t__s16 level;\n\tstruct ff_envelope envelope;\n};\n\nstruct ff_effect;\n\nstruct ff_device {\n\tint (*upload)(struct input_dev *, struct ff_effect *, struct ff_effect *);\n\tint (*erase)(struct input_dev *, int);\n\tint (*playback)(struct input_dev *, int, int);\n\tvoid (*set_gain)(struct input_dev *, u16);\n\tvoid (*set_autocenter)(struct input_dev *, u16);\n\tvoid (*destroy)(struct ff_device *);\n\tvoid *private;\n\tlong unsigned int ffbit[2];\n\tstruct mutex mutex;\n\tint max_effects;\n\tstruct ff_effect *effects;\n\tstruct file *effect_owners[0];\n};\n\nstruct ff_trigger {\n\t__u16 button;\n\t__u16 interval;\n};\n\nstruct ff_replay {\n\t__u16 length;\n\t__u16 delay;\n};\n\nstruct ff_ramp_effect {\n\t__s16 start_level;\n\t__s16 end_level;\n\tstruct ff_envelope envelope;\n};\n\nstruct ff_periodic_effect {\n\t__u16 waveform;\n\t__u16 period;\n\t__s16 magnitude;\n\t__s16 offset;\n\t__u16 phase;\n\tstruct ff_envelope envelope;\n\t__u32 custom_len;\n\t__s16 *custom_data;\n};\n\nstruct ff_rumble_effect {\n\t__u16 strong_magnitude;\n\t__u16 weak_magnitude;\n};\n\nstruct ff_effect {\n\t__u16 type;\n\t__s16 id;\n\t__u16 direction;\n\tstruct ff_trigger trigger;\n\tstruct ff_replay replay;\n\tunion {\n\t\tstruct ff_constant_effect constant;\n\t\tstruct ff_ramp_effect ramp;\n\t\tstruct ff_periodic_effect periodic;\n\t\tstruct ff_condition_effect condition[2];\n\t\tstruct ff_rumble_effect rumble;\n\t} u;\n};\n\nstruct ff_periodic_effect_compat {\n\t__u16 waveform;\n\t__u16 period;\n\t__s16 magnitude;\n\t__s16 offset;\n\t__u16 phase;\n\tstruct ff_envelope envelope;\n\t__u32 custom_len;\n\tcompat_uptr_t custom_data;\n};\n\nstruct ff_effect_compat {\n\t__u16 type;\n\t__s16 id;\n\t__u16 direction;\n\tstruct ff_trigger trigger;\n\tstruct ff_replay replay;\n\tunion {\n\t\tstruct ff_constant_effect constant;\n\t\tstruct ff_ramp_effect ramp;\n\t\tstruct ff_periodic_effect_compat periodic;\n\t\tstruct ff_condition_effect condition[2];\n\t\tstruct ff_rumble_effect rumble;\n\t} u;\n};\n\nstruct fgraph_cpu_data {\n\tpid_t last_pid;\n\tint depth;\n\tint depth_irq;\n\tint ignore;\n\tlong unsigned int enter_funcs[50];\n};\n\nstruct ftrace_graph_ent {\n\tlong unsigned int func;\n\tint depth;\n} __attribute__((packed));\n\nstruct ftrace_graph_ent_entry {\n\tstruct trace_entry ent;\n\tstruct ftrace_graph_ent graph_ent;\n};\n\nstruct ftrace_graph_ret {\n\tlong unsigned int func;\n\tlong unsigned int retval;\n\tint depth;\n\tunsigned int overrun;\n\tlong long unsigned int calltime;\n\tlong long unsigned int rettime;\n};\n\nstruct ftrace_graph_ret_entry {\n\tstruct trace_entry ent;\n\tstruct ftrace_graph_ret ret;\n};\n\nstruct fgraph_data {\n\tstruct fgraph_cpu_data *cpu_data;\n\tstruct ftrace_graph_ent_entry ent;\n\tstruct ftrace_graph_ret_entry ret;\n\tint failed;\n\tint cpu;\n\tlong: 0;\n} __attribute__((packed));\n\nstruct fgraph_ops;\n\ntypedef int (*trace_func_graph_ent_t)(struct ftrace_graph_ent *, struct fgraph_ops *);\n\ntypedef void (*trace_func_graph_ret_t)(struct ftrace_graph_ret *, struct fgraph_ops *);\n\nstruct fgraph_ops {\n\ttrace_func_graph_ent_t entryfunc;\n\ttrace_func_graph_ret_t retfunc;\n\tstruct ftrace_ops ops;\n\tvoid *private;\n\ttrace_func_graph_ent_t saved_func;\n\tint idx;\n};\n\nstruct fgraph_ret_regs {\n\tlong unsigned int ax;\n\tlong unsigned int dx;\n\tlong unsigned int bp;\n};\n\nstruct fib_kuid_range {\n\tkuid_t start;\n\tkuid_t end;\n};\n\nstruct fib_rule_port_range {\n\t__u16 start;\n\t__u16 end;\n};\n\nstruct fib_rule {\n\tstruct list_head list;\n\tint iifindex;\n\tint oifindex;\n\tu32 mark;\n\tu32 mark_mask;\n\tu32 flags;\n\tu32 table;\n\tu8 action;\n\tu8 l3mdev;\n\tu8 proto;\n\tu8 ip_proto;\n\tu32 target;\n\t__be64 tun_id;\n\tstruct fib_rule *ctarget;\n\tstruct net *fr_net;\n\trefcount_t refcnt;\n\tu32 pref;\n\tint suppress_ifgroup;\n\tint suppress_prefixlen;\n\tchar iifname[16];\n\tchar oifname[16];\n\tstruct fib_kuid_range uid_range;\n\tstruct fib_rule_port_range sport_range;\n\tstruct fib_rule_port_range dport_range;\n\tstruct callback_head rcu;\n};\n\nstruct fib4_rule {\n\tstruct fib_rule common;\n\tu8 dst_len;\n\tu8 src_len;\n\tdscp_t dscp;\n\t__be32 src;\n\t__be32 srcmask;\n\t__be32 dst;\n\t__be32 dstmask;\n\tu32 tclassid;\n};\n\nstruct fib6_node;\n\nstruct fib6_walker {\n\tstruct list_head lh;\n\tstruct fib6_node *root;\n\tstruct fib6_node *node;\n\tstruct fib6_info *leaf;\n\tenum fib6_walk_state state;\n\tunsigned int skip;\n\tunsigned int count;\n\tunsigned int skip_in_node;\n\tint (*func)(struct fib6_walker *);\n\tvoid *args;\n};\n\nstruct fib6_cleaner {\n\tstruct fib6_walker w;\n\tstruct net *net;\n\tint (*func)(struct fib6_info *, void *);\n\tint sernum;\n\tvoid *arg;\n\tbool skip_notify;\n};\n\nstruct nlmsghdr;\n\nstruct nl_info {\n\tstruct nlmsghdr *nlh;\n\tstruct net *nl_net;\n\tu32 portid;\n\tu8 skip_notify: 1;\n\tu8 skip_notify_kernel: 1;\n};\n\nstruct fib6_config {\n\tu32 fc_table;\n\tu32 fc_metric;\n\tint fc_dst_len;\n\tint fc_src_len;\n\tint fc_ifindex;\n\tu32 fc_flags;\n\tu32 fc_protocol;\n\tu16 fc_type;\n\tu16 fc_delete_all_nh: 1;\n\tu16 fc_ignore_dev_down: 1;\n\tu16 __unused: 14;\n\tu32 fc_nh_id;\n\tstruct in6_addr fc_dst;\n\tstruct in6_addr fc_src;\n\tstruct in6_addr fc_prefsrc;\n\tstruct in6_addr fc_gateway;\n\tlong unsigned int fc_expires;\n\tstruct nlattr *fc_mx;\n\tint fc_mx_len;\n\tint fc_mp_len;\n\tstruct nlattr *fc_mp;\n\tstruct nl_info fc_nlinfo;\n\tstruct nlattr *fc_encap;\n\tu16 fc_encap_type;\n\tbool fc_is_fdb;\n};\n\nstruct fib6_dump_arg {\n\tstruct net *net;\n\tstruct notifier_block *nb;\n\tstruct netlink_ext_ack *extack;\n};\n\nstruct fib_notifier_info {\n\tint family;\n\tstruct netlink_ext_ack *extack;\n};\n\nstruct fib6_entry_notifier_info {\n\tstruct fib_notifier_info info;\n\tstruct fib6_info *rt;\n\tunsigned int nsiblings;\n};\n\nstruct fib6_gc_args {\n\tint timeout;\n\tint more;\n};\n\nstruct rt6key {\n\tstruct in6_addr addr;\n\tint plen;\n};\n\nstruct rtable;\n\nstruct fnhe_hash_bucket;\n\nstruct fib_nh_common {\n\tstruct net_device *nhc_dev;\n\tnetdevice_tracker nhc_dev_tracker;\n\tint nhc_oif;\n\tunsigned char nhc_scope;\n\tu8 nhc_family;\n\tu8 nhc_gw_family;\n\tunsigned char nhc_flags;\n\tstruct lwtunnel_state *nhc_lwtstate;\n\tunion {\n\t\t__be32 ipv4;\n\t\tstruct in6_addr ipv6;\n\t} nhc_gw;\n\tint nhc_weight;\n\tatomic_t nhc_upper_bound;\n\tstruct rtable **nhc_pcpu_rth_output;\n\tstruct rtable *nhc_rth_input;\n\tstruct fnhe_hash_bucket *nhc_exceptions;\n};\n\nstruct rt6_info;\n\nstruct rt6_exception_bucket;\n\nstruct fib6_nh {\n\tstruct fib_nh_common nh_common;\n\tlong unsigned int last_probe;\n\tstruct rt6_info **rt6i_pcpu;\n\tstruct rt6_exception_bucket *rt6i_exception_bucket;\n};\n\nstruct fib6_table;\n\nstruct nexthop;\n\nstruct fib6_info {\n\tstruct fib6_table *fib6_table;\n\tstruct fib6_info *fib6_next;\n\tstruct fib6_node *fib6_node;\n\tunion {\n\t\tstruct list_head fib6_siblings;\n\t\tstruct list_head nh_list;\n\t};\n\tunsigned int fib6_nsiblings;\n\trefcount_t fib6_ref;\n\tlong unsigned int expires;\n\tstruct hlist_node gc_link;\n\tstruct dst_metrics *fib6_metrics;\n\tstruct rt6key fib6_dst;\n\tu32 fib6_flags;\n\tstruct rt6key fib6_src;\n\tstruct rt6key fib6_prefsrc;\n\tu32 fib6_metric;\n\tu8 fib6_protocol;\n\tu8 fib6_type;\n\tu8 offload;\n\tu8 trap;\n\tu8 offload_failed;\n\tu8 should_flush: 1;\n\tu8 dst_nocount: 1;\n\tu8 dst_nopolicy: 1;\n\tu8 fib6_destroying: 1;\n\tu8 unused: 4;\n\tstruct callback_head rcu;\n\tstruct nexthop *nh;\n\tstruct fib6_nh fib6_nh[0];\n};\n\nstruct fib6_nh_age_excptn_arg {\n\tstruct fib6_gc_args *gc_args;\n\tlong unsigned int now;\n};\n\nstruct fib6_nh_del_cached_rt_arg {\n\tstruct fib6_config *cfg;\n\tstruct fib6_info *f6i;\n};\n\nstruct fib6_nh_dm_arg {\n\tstruct net *net;\n\tconst struct in6_addr *saddr;\n\tint oif;\n\tint flags;\n\tstruct fib6_nh *nh;\n};\n\nstruct rt6_rtnl_dump_arg;\n\nstruct fib6_nh_exception_dump_walker {\n\tstruct rt6_rtnl_dump_arg *dump;\n\tstruct fib6_info *rt;\n\tunsigned int flags;\n\tunsigned int skip;\n\tunsigned int count;\n};\n\nstruct fib6_nh_excptn_arg {\n\tstruct rt6_info *rt;\n\tint plen;\n};\n\nstruct fib6_nh_frl_arg {\n\tu32 flags;\n\tint oif;\n\tint strict;\n\tint *mpri;\n\tbool *do_rr;\n\tstruct fib6_nh *nh;\n};\n\nstruct fib6_nh_match_arg {\n\tconst struct net_device *dev;\n\tconst struct in6_addr *gw;\n\tstruct fib6_nh *match;\n};\n\nstruct fib6_nh_pcpu_arg {\n\tstruct fib6_info *from;\n\tconst struct fib6_table *table;\n};\n\nstruct fib6_result;\n\nstruct flowi6;\n\nstruct fib6_nh_rd_arg {\n\tstruct fib6_result *res;\n\tstruct flowi6 *fl6;\n\tconst struct in6_addr *gw;\n\tstruct rt6_info **ret;\n};\n\nstruct fib6_node {\n\tstruct fib6_node *parent;\n\tstruct fib6_node *left;\n\tstruct fib6_node *right;\n\tstruct fib6_node *subtree;\n\tstruct fib6_info *leaf;\n\t__u16 fn_bit;\n\t__u16 fn_flags;\n\tint fn_sernum;\n\tstruct fib6_info *rr_ptr;\n\tstruct callback_head rcu;\n};\n\nstruct fib6_result {\n\tstruct fib6_nh *nh;\n\tstruct fib6_info *f6i;\n\tu32 fib6_flags;\n\tu8 fib6_type;\n\tstruct rt6_info *rt6;\n};\n\nstruct fib6_rule {\n\tstruct fib_rule common;\n\tstruct rt6key src;\n\tstruct rt6key dst;\n\tdscp_t dscp;\n};\n\nstruct inet_peer_base {\n\tstruct rb_root rb_root;\n\tseqlock_t lock;\n\tint total;\n};\n\nstruct fib6_table {\n\tstruct hlist_node tb6_hlist;\n\tu32 tb6_id;\n\tspinlock_t tb6_lock;\n\tstruct fib6_node tb6_root;\n\tstruct inet_peer_base tb6_peers;\n\tunsigned int flags;\n\tunsigned int fib_seq;\n\tstruct hlist_head tb6_gc_hlist;\n};\n\nstruct fib_info;\n\nstruct fib_alias {\n\tstruct hlist_node fa_list;\n\tstruct fib_info *fa_info;\n\tdscp_t fa_dscp;\n\tu8 fa_type;\n\tu8 fa_state;\n\tu8 fa_slen;\n\tu32 tb_id;\n\ts16 fa_default;\n\tu8 offload;\n\tu8 trap;\n\tu8 offload_failed;\n\tstruct callback_head rcu;\n};\n\nstruct rtnexthop;\n\nstruct fib_config {\n\tu8 fc_dst_len;\n\tdscp_t fc_dscp;\n\tu8 fc_protocol;\n\tu8 fc_scope;\n\tu8 fc_type;\n\tu8 fc_gw_family;\n\tu32 fc_table;\n\t__be32 fc_dst;\n\tunion {\n\t\t__be32 fc_gw4;\n\t\tstruct in6_addr fc_gw6;\n\t};\n\tint fc_oif;\n\tu32 fc_flags;\n\tu32 fc_priority;\n\t__be32 fc_prefsrc;\n\tu32 fc_nh_id;\n\tstruct nlattr *fc_mx;\n\tstruct rtnexthop *fc_mp;\n\tint fc_mx_len;\n\tint fc_mp_len;\n\tu32 fc_flow;\n\tu32 fc_nlflags;\n\tstruct nl_info fc_nlinfo;\n\tstruct nlattr *fc_encap;\n\tu16 fc_encap_type;\n};\n\nstruct fib_dump_filter {\n\tu32 table_id;\n\tbool filter_set;\n\tbool dump_routes;\n\tbool dump_exceptions;\n\tbool rtnl_held;\n\tunsigned char protocol;\n\tunsigned char rt_type;\n\tunsigned int flags;\n\tstruct net_device *dev;\n};\n\nstruct fib_entry_notifier_info {\n\tstruct fib_notifier_info info;\n\tu32 dst;\n\tint dst_len;\n\tstruct fib_info *fi;\n\tdscp_t dscp;\n\tu8 type;\n\tu32 tb_id;\n};\n\nstruct fib_nh {\n\tstruct fib_nh_common nh_common;\n\tstruct hlist_node nh_hash;\n\tstruct fib_info *nh_parent;\n\t__u32 nh_tclassid;\n\t__be32 nh_saddr;\n\tint nh_saddr_genid;\n};\n\nstruct fib_info {\n\tstruct hlist_node fib_hash;\n\tstruct hlist_node fib_lhash;\n\tstruct list_head nh_list;\n\tstruct net *fib_net;\n\trefcount_t fib_treeref;\n\trefcount_t fib_clntref;\n\tunsigned int fib_flags;\n\tunsigned char fib_dead;\n\tunsigned char fib_protocol;\n\tunsigned char fib_scope;\n\tunsigned char fib_type;\n\t__be32 fib_prefsrc;\n\tu32 fib_tb_id;\n\tu32 fib_priority;\n\tstruct dst_metrics *fib_metrics;\n\tint fib_nhs;\n\tbool fib_nh_is_v6;\n\tbool nh_updated;\n\tbool pfsrc_removed;\n\tstruct nexthop *nh;\n\tstruct callback_head rcu;\n\tstruct fib_nh fib_nh[0];\n};\n\nstruct fib_lookup_arg {\n\tvoid *lookup_ptr;\n\tconst void *lookup_data;\n\tvoid *result;\n\tstruct fib_rule *rule;\n\tu32 table;\n\tint flags;\n};\n\nstruct fib_nh_exception {\n\tstruct fib_nh_exception *fnhe_next;\n\tint fnhe_genid;\n\t__be32 fnhe_daddr;\n\tu32 fnhe_pmtu;\n\tbool fnhe_mtu_locked;\n\t__be32 fnhe_gw;\n\tlong unsigned int fnhe_expires;\n\tstruct rtable *fnhe_rth_input;\n\tstruct rtable *fnhe_rth_output;\n\tlong unsigned int fnhe_stamp;\n\tstruct callback_head rcu;\n};\n\nstruct fib_nh_notifier_info {\n\tstruct fib_notifier_info info;\n\tstruct fib_nh *fib_nh;\n};\n\nstruct fib_notifier_net {\n\tstruct list_head fib_notifier_ops;\n\tstruct atomic_notifier_head fib_chain;\n};\n\nstruct fib_notifier_ops {\n\tint family;\n\tstruct list_head list;\n\tunsigned int (*fib_seq_read)(struct net *);\n\tint (*fib_dump)(struct net *, struct notifier_block *, struct netlink_ext_ack *);\n\tstruct module *owner;\n\tstruct callback_head rcu;\n};\n\nstruct fib_prop {\n\tint error;\n\tu8 scope;\n};\n\nstruct fib_table;\n\nstruct fib_result {\n\t__be32 prefix;\n\tunsigned char prefixlen;\n\tunsigned char nh_sel;\n\tunsigned char type;\n\tunsigned char scope;\n\tu32 tclassid;\n\tdscp_t dscp;\n\tstruct fib_nh_common *nhc;\n\tstruct fib_info *fi;\n\tstruct fib_table *table;\n\tstruct hlist_head *fa_head;\n};\n\nstruct fib_result_nl {\n\t__be32 fl_addr;\n\tu32 fl_mark;\n\tunsigned char fl_tos;\n\tunsigned char fl_scope;\n\tunsigned char tb_id_in;\n\tunsigned char tb_id;\n\tunsigned char prefixlen;\n\tunsigned char nh_sel;\n\tunsigned char type;\n\tunsigned char scope;\n\tint err;\n};\n\nstruct key_vector;\n\nstruct fib_route_iter {\n\tstruct seq_net_private p;\n\tstruct fib_table *main_tb;\n\tstruct key_vector *tnode;\n\tloff_t pos;\n\tt_key key;\n};\n\nstruct fib_rt_info {\n\tstruct fib_info *fi;\n\tu32 tb_id;\n\t__be32 dst;\n\tint dst_len;\n\tdscp_t dscp;\n\tu8 type;\n\tu8 offload: 1;\n\tu8 trap: 1;\n\tu8 offload_failed: 1;\n\tu8 unused: 5;\n};\n\nstruct fib_rule_hdr {\n\t__u8 family;\n\t__u8 dst_len;\n\t__u8 src_len;\n\t__u8 tos;\n\t__u8 table;\n\t__u8 res1;\n\t__u8 res2;\n\t__u8 action;\n\t__u32 flags;\n};\n\nstruct fib_rule_notifier_info {\n\tstruct fib_notifier_info info;\n\tstruct fib_rule *rule;\n};\n\nstruct fib_rule_uid_range {\n\t__u32 start;\n\t__u32 end;\n};\n\nstruct flowi;\n\nstruct fib_rules_ops {\n\tint family;\n\tstruct list_head list;\n\tint rule_size;\n\tint addr_size;\n\tint unresolved_rules;\n\tint nr_goto_rules;\n\tunsigned int fib_rules_seq;\n\tint (*action)(struct fib_rule *, struct flowi *, int, struct fib_lookup_arg *);\n\tbool (*suppress)(struct fib_rule *, int, struct fib_lookup_arg *);\n\tint (*match)(struct fib_rule *, struct flowi *, int);\n\tint (*configure)(struct fib_rule *, struct sk_buff *, struct fib_rule_hdr *, struct nlattr **, struct netlink_ext_ack *);\n\tint (*delete)(struct fib_rule *);\n\tint (*compare)(struct fib_rule *, struct fib_rule_hdr *, struct nlattr **);\n\tint (*fill)(struct fib_rule *, struct sk_buff *, struct fib_rule_hdr *);\n\tsize_t (*nlmsg_payload)(struct fib_rule *);\n\tvoid (*flush_cache)(struct fib_rules_ops *);\n\tint nlgroup;\n\tstruct list_head rules_list;\n\tstruct module *owner;\n\tstruct net *fro_net;\n\tstruct callback_head rcu;\n};\n\nstruct fib_table {\n\tstruct hlist_node tb_hlist;\n\tu32 tb_id;\n\tint tb_num_default;\n\tstruct callback_head rcu;\n\tlong unsigned int *tb_data;\n\tlong unsigned int __data[0];\n};\n\nstruct fib_trie_iter {\n\tstruct seq_net_private p;\n\tstruct fib_table *tb;\n\tstruct key_vector *tnode;\n\tunsigned int index;\n\tunsigned int depth;\n};\n\nstruct fid {\n\tunion {\n\t\tstruct {\n\t\t\tu32 ino;\n\t\t\tu32 gen;\n\t\t\tu32 parent_ino;\n\t\t\tu32 parent_gen;\n\t\t} i32;\n\t\tstruct {\n\t\t\tu64 ino;\n\t\t\tu32 gen;\n\t\t} __attribute__((packed)) i64;\n\t\tstruct {\n\t\t\tu32 block;\n\t\t\tu16 partref;\n\t\t\tu16 parent_partref;\n\t\t\tu32 generation;\n\t\t\tu32 parent_block;\n\t\t\tu32 parent_generation;\n\t\t} udf;\n\t\tstruct {\n\t\t\tstruct {} __empty_raw;\n\t\t\t__u32 raw[0];\n\t\t};\n\t};\n};\n\nstruct mpi_ec_ctx;\n\nstruct field_table {\n\tconst char *p;\n\tvoid (*addm)(MPI, MPI, MPI, struct mpi_ec_ctx *);\n\tvoid (*subm)(MPI, MPI, MPI, struct mpi_ec_ctx *);\n\tvoid (*mulm)(MPI, MPI, MPI, struct mpi_ec_ctx *);\n\tvoid (*mul2)(MPI, MPI, struct mpi_ec_ctx *);\n\tvoid (*pow2)(MPI, const MPI, struct mpi_ec_ctx *);\n};\n\nstruct field_var {\n\tstruct hist_field *var;\n\tstruct hist_field *val;\n};\n\nstruct field_var_hist {\n\tstruct hist_trigger_data *hist_data;\n\tchar *cmd;\n};\n\nstruct fiemap_extent {\n\t__u64 fe_logical;\n\t__u64 fe_physical;\n\t__u64 fe_length;\n\t__u64 fe_reserved64[2];\n\t__u32 fe_flags;\n\t__u32 fe_reserved[3];\n};\n\nstruct fiemap {\n\t__u64 fm_start;\n\t__u64 fm_length;\n\t__u32 fm_flags;\n\t__u32 fm_mapped_extents;\n\t__u32 fm_extent_count;\n\t__u32 fm_reserved;\n\tstruct fiemap_extent fm_extents[0];\n};\n\nstruct fiemap_extent_info {\n\tunsigned int fi_flags;\n\tunsigned int fi_extents_mapped;\n\tunsigned int fi_extents_max;\n\tstruct fiemap_extent *fi_extents_start;\n};\n\nstruct file__safe_trusted {\n\tstruct inode *f_inode;\n};\n\nstruct file_clone_range {\n\t__s64 src_fd;\n\t__u64 src_offset;\n\t__u64 src_length;\n\t__u64 dest_offset;\n};\n\nstruct file_dedupe_range_info {\n\t__s64 dest_fd;\n\t__u64 dest_offset;\n\t__u64 bytes_deduped;\n\t__s32 status;\n\t__u32 reserved;\n};\n\nstruct file_dedupe_range {\n\t__u64 src_offset;\n\t__u64 src_length;\n\t__u16 dest_count;\n\t__u16 reserved1;\n\t__u32 reserved2;\n\tstruct file_dedupe_range_info info[0];\n};\n\nstruct file_handle {\n\t__u32 handle_bytes;\n\tint handle_type;\n\tunsigned char f_handle[0];\n};\n\nstruct file_lock_core {\n\tstruct file_lock_core *flc_blocker;\n\tstruct list_head flc_list;\n\tstruct hlist_node flc_link;\n\tstruct list_head flc_blocked_requests;\n\tstruct list_head flc_blocked_member;\n\tfl_owner_t flc_owner;\n\tunsigned int flc_flags;\n\tunsigned char flc_type;\n\tpid_t flc_pid;\n\tint flc_link_cpu;\n\twait_queue_head_t flc_wait;\n\tstruct file *flc_file;\n};\n\nstruct lease_manager_operations;\n\nstruct file_lease {\n\tstruct file_lock_core c;\n\tstruct fasync_struct *fl_fasync;\n\tlong unsigned int fl_break_time;\n\tlong unsigned int fl_downgrade_time;\n\tconst struct lease_manager_operations *fl_lmops;\n};\n\nstruct nlm_lockowner;\n\nstruct nfs_lock_info {\n\tu32 state;\n\tstruct nlm_lockowner *owner;\n\tstruct list_head list;\n};\n\nstruct nfs4_lock_state;\n\nstruct nfs4_lock_info {\n\tstruct nfs4_lock_state *owner;\n};\n\nstruct file_lock_operations;\n\nstruct lock_manager_operations;\n\nstruct file_lock {\n\tstruct file_lock_core c;\n\tloff_t fl_start;\n\tloff_t fl_end;\n\tconst struct file_lock_operations *fl_ops;\n\tconst struct lock_manager_operations *fl_lmops;\n\tunion {\n\t\tstruct nfs_lock_info nfs_fl;\n\t\tstruct nfs4_lock_info nfs4_fl;\n\t\tstruct {\n\t\t\tstruct list_head link;\n\t\t\tint state;\n\t\t\tunsigned int debug_id;\n\t\t} afs;\n\t\tstruct {\n\t\t\tstruct inode *inode;\n\t\t} ceph;\n\t} fl_u;\n};\n\nstruct file_lock_context {\n\tspinlock_t flc_lock;\n\tstruct list_head flc_flock;\n\tstruct list_head flc_posix;\n\tstruct list_head flc_lease;\n};\n\nstruct file_lock_list_struct {\n\tspinlock_t lock;\n\tstruct hlist_head hlist;\n};\n\nstruct file_lock_operations {\n\tvoid (*fl_copy_lock)(struct file_lock *, struct file_lock *);\n\tvoid (*fl_release_private)(struct file_lock *);\n};\n\nstruct io_uring_cmd;\n\nstruct file_operations {\n\tstruct module *owner;\n\tfop_flags_t fop_flags;\n\tloff_t (*llseek)(struct file *, loff_t, int);\n\tssize_t (*read)(struct file *, char *, size_t, loff_t *);\n\tssize_t (*write)(struct file *, const char *, size_t, loff_t *);\n\tssize_t (*read_iter)(struct kiocb *, struct iov_iter *);\n\tssize_t (*write_iter)(struct kiocb *, struct iov_iter *);\n\tint (*iopoll)(struct kiocb *, struct io_comp_batch *, unsigned int);\n\tint (*iterate_shared)(struct file *, struct dir_context *);\n\t__poll_t (*poll)(struct file *, struct poll_table_struct *);\n\tlong int (*unlocked_ioctl)(struct file *, unsigned int, long unsigned int);\n\tlong int (*compat_ioctl)(struct file *, unsigned int, long unsigned int);\n\tint (*mmap)(struct file *, struct vm_area_struct *);\n\tint (*open)(struct inode *, struct file *);\n\tint (*flush)(struct file *, fl_owner_t);\n\tint (*release)(struct inode *, struct file *);\n\tint (*fsync)(struct file *, loff_t, loff_t, int);\n\tint (*fasync)(int, struct file *, int);\n\tint (*lock)(struct file *, int, struct file_lock *);\n\tlong unsigned int (*get_unmapped_area)(struct file *, long unsigned int, long unsigned int, long unsigned int, long unsigned int);\n\tint (*check_flags)(int);\n\tint (*flock)(struct file *, int, struct file_lock *);\n\tssize_t (*splice_write)(struct pipe_inode_info *, struct file *, loff_t *, size_t, unsigned int);\n\tssize_t (*splice_read)(struct file *, loff_t *, struct pipe_inode_info *, size_t, unsigned int);\n\tvoid (*splice_eof)(struct file *);\n\tint (*setlease)(struct file *, int, struct file_lease **, void **);\n\tlong int (*fallocate)(struct file *, int, loff_t, loff_t);\n\tvoid (*show_fdinfo)(struct seq_file *, struct file *);\n\tssize_t (*copy_file_range)(struct file *, loff_t, struct file *, loff_t, size_t, unsigned int);\n\tloff_t (*remap_file_range)(struct file *, loff_t, struct file *, loff_t, loff_t, unsigned int);\n\tint (*fadvise)(struct file *, loff_t, loff_t, int);\n\tint (*uring_cmd)(struct io_uring_cmd *, unsigned int);\n\tint (*uring_cmd_iopoll)(struct io_uring_cmd *, struct io_comp_batch *, unsigned int);\n};\n\nstruct tpm_chip;\n\nstruct tpm_space;\n\nstruct file_priv {\n\tstruct tpm_chip *chip;\n\tstruct tpm_space *space;\n\tstruct mutex buffer_mutex;\n\tstruct timer_list user_read_timer;\n\tstruct work_struct timeout_work;\n\tstruct work_struct async_work;\n\twait_queue_head_t async_wait;\n\tssize_t response_length;\n\tbool response_read;\n\tbool command_enqueued;\n\tu8 data_buffer[4096];\n};\n\nstruct page_counter;\n\nstruct file_region {\n\tstruct list_head link;\n\tlong int from;\n\tlong int to;\n\tstruct page_counter *reservation_counter;\n\tstruct cgroup_subsys_state *css;\n};\n\nstruct file_security_struct {\n\tu32 sid;\n\tu32 fown_sid;\n\tu32 isid;\n\tu32 pseqno;\n};\n\nstruct fs_context;\n\nstruct fs_parameter_spec;\n\nstruct file_system_type {\n\tconst char *name;\n\tint fs_flags;\n\tint (*init_fs_context)(struct fs_context *);\n\tconst struct fs_parameter_spec *parameters;\n\tstruct dentry * (*mount)(struct file_system_type *, int, const char *, void *);\n\tvoid (*kill_sb)(struct super_block *);\n\tstruct module *owner;\n\tstruct file_system_type *next;\n\tstruct hlist_head fs_supers;\n\tstruct lock_class_key s_lock_key;\n\tstruct lock_class_key s_umount_key;\n\tstruct lock_class_key s_vfs_rename_key;\n\tstruct lock_class_key s_writers_key[3];\n\tstruct lock_class_key i_lock_key;\n\tstruct lock_class_key i_mutex_key;\n\tstruct lock_class_key invalidate_lock_key;\n\tstruct lock_class_key i_mutex_dir_key;\n};\n\nstruct fileattr {\n\tu32 flags;\n\tu32 fsx_xflags;\n\tu32 fsx_extsize;\n\tu32 fsx_nextents;\n\tu32 fsx_projid;\n\tu32 fsx_cowextsize;\n\tbool flags_valid: 1;\n\tbool fsx_valid: 1;\n};\n\nstruct filename {\n\tconst char *name;\n\tconst char *uptr;\n\tatomic_t refcnt;\n\tstruct audit_names *aname;\n\tconst char iname[0];\n};\n\nstruct filename_trans_datum {\n\tstruct ebitmap stypes;\n\tu32 otype;\n\tstruct filename_trans_datum *next;\n};\n\nstruct filename_trans_key {\n\tu32 ttype;\n\tu16 tclass;\n\tconst char *name;\n};\n\nstruct files_stat_struct {\n\tlong unsigned int nr_files;\n\tlong unsigned int nr_free_files;\n\tlong unsigned int max_files;\n};\n\nstruct files_struct {\n\tatomic_t count;\n\tbool resize_in_progress;\n\twait_queue_head_t resize_wait;\n\tstruct fdtable *fdt;\n\tstruct fdtable fdtab;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tspinlock_t file_lock;\n\tunsigned int next_fd;\n\tlong unsigned int close_on_exec_init[1];\n\tlong unsigned int open_fds_init[1];\n\tlong unsigned int full_fds_bits_init[1];\n\tstruct file *fd_array[64];\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct filter_list {\n\tstruct list_head list;\n\tstruct event_filter *filter;\n};\n\nstruct filter_parse_error {\n\tint lasterr;\n\tint lasterr_pos;\n};\n\nstruct regex;\n\nstruct ftrace_event_field;\n\nstruct filter_pred {\n\tstruct regex *regex;\n\tstruct cpumask *mask;\n\tshort unsigned int *ops;\n\tstruct ftrace_event_field *field;\n\tu64 val;\n\tu64 val2;\n\tenum filter_pred_fn fn_num;\n\tint offset;\n\tint not;\n\tint op;\n};\n\nstruct find_child_walk_data {\n\tstruct acpi_device *adev;\n\tu64 address;\n\tint score;\n\tbool check_sta;\n\tbool check_children;\n};\n\nstruct find_interface_arg {\n\tint minor;\n\tstruct device_driver *drv;\n};\n\nstruct kernel_symbol;\n\nstruct find_symbol_arg {\n\tconst char *name;\n\tbool gplok;\n\tbool warn;\n\tstruct module *owner;\n\tconst s32 *crc;\n\tconst struct kernel_symbol *sym;\n\tenum mod_license license;\n};\n\nstruct fintek_8250 {\n\tu16 pid;\n\tu16 base_port;\n\tu8 index;\n\tu8 key;\n};\n\nstruct firmware {\n\tsize_t size;\n\tconst u8 *data;\n\tvoid *priv;\n};\n\nstruct firmware_cache {\n\tspinlock_t lock;\n\tstruct list_head head;\n\tint state;\n\tspinlock_t name_lock;\n\tstruct list_head fw_names;\n\tstruct delayed_work work;\n\tstruct notifier_block pm_notify;\n};\n\nstruct firmware_fallback_config {\n\tunsigned int force_sysfs_fallback;\n\tunsigned int ignore_sysfs_fallback;\n\tint old_timeout;\n\tint loading_timeout;\n};\n\nstruct firmware_map_entry {\n\tu64 start;\n\tu64 end;\n\tconst char *type;\n\tstruct list_head list;\n\tstruct kobject kobj;\n};\n\nstruct firmware_work {\n\tstruct work_struct work;\n\tstruct module *module;\n\tconst char *name;\n\tstruct device *device;\n\tvoid *context;\n\tvoid (*cont)(const struct firmware *, void *);\n\tu32 opt_flags;\n};\n\nstruct fixed_mdio_bus {\n\tstruct mii_bus *mii_bus;\n\tstruct list_head phys;\n};\n\nstruct fixed_percpu_data {\n\tchar gs_base[40];\n\tlong unsigned int stack_canary;\n};\n\nstruct fixed_phy_status {\n\tint link;\n\tint speed;\n\tint duplex;\n\tint pause;\n\tint asym_pause;\n};\n\nstruct fixed_phy {\n\tint addr;\n\tstruct phy_device *phydev;\n\tstruct fixed_phy_status status;\n\tbool no_carrier;\n\tint (*link_update)(struct net_device *, struct fixed_phy_status *);\n\tstruct list_head node;\n\tstruct gpio_desc *link_gpiod;\n};\n\nstruct fixed_range_block {\n\tint base_msr;\n\tint ranges;\n};\n\nstruct fixed_voltage_config {\n\tconst char *supply_name;\n\tconst char *input_supply;\n\tint microvolts;\n\tunsigned int startup_delay;\n\tunsigned int off_on_delay;\n\tunsigned int enabled_at_boot: 1;\n\tstruct regulator_init_data *init_data;\n};\n\nstruct regulator_state {\n\tint uV;\n\tint min_uV;\n\tint max_uV;\n\tunsigned int mode;\n\tint enabled;\n\tbool changeable;\n};\n\nstruct notification_limit {\n\tint prot;\n\tint err;\n\tint warn;\n};\n\nstruct regulation_constraints {\n\tconst char *name;\n\tint min_uV;\n\tint max_uV;\n\tint uV_offset;\n\tint min_uA;\n\tint max_uA;\n\tint ilim_uA;\n\tint system_load;\n\tu32 *max_spread;\n\tint max_uV_step;\n\tunsigned int valid_modes_mask;\n\tunsigned int valid_ops_mask;\n\tint input_uV;\n\tstruct regulator_state state_disk;\n\tstruct regulator_state state_mem;\n\tstruct regulator_state state_standby;\n\tstruct notification_limit over_curr_limits;\n\tstruct notification_limit over_voltage_limits;\n\tstruct notification_limit under_voltage_limits;\n\tstruct notification_limit temp_limits;\n\tsuspend_state_t initial_state;\n\tunsigned int initial_mode;\n\tunsigned int ramp_delay;\n\tunsigned int settling_time;\n\tunsigned int settling_time_up;\n\tunsigned int settling_time_down;\n\tunsigned int enable_time;\n\tunsigned int uv_less_critical_window_ms;\n\tunsigned int active_discharge;\n\tunsigned int always_on: 1;\n\tunsigned int boot_on: 1;\n\tunsigned int apply_uV: 1;\n\tunsigned int ramp_disable: 1;\n\tunsigned int soft_start: 1;\n\tunsigned int pull_down: 1;\n\tunsigned int system_critical: 1;\n\tunsigned int over_current_protection: 1;\n\tunsigned int over_current_detection: 1;\n\tunsigned int over_voltage_detection: 1;\n\tunsigned int under_voltage_detection: 1;\n\tunsigned int over_temp_detection: 1;\n};\n\nstruct regulator_consumer_supply;\n\nstruct regulator_init_data {\n\tconst char *supply_regulator;\n\tstruct regulation_constraints constraints;\n\tint num_consumer_supplies;\n\tstruct regulator_consumer_supply *consumer_supplies;\n\tint (*regulator_init)(void *);\n\tvoid *driver_data;\n};\n\nstruct pdev_archdata {};\n\nstruct platform_device_id;\n\nstruct platform_device {\n\tconst char *name;\n\tint id;\n\tbool id_auto;\n\tstruct device dev;\n\tu64 platform_dma_mask;\n\tstruct device_dma_parameters dma_parms;\n\tu32 num_resources;\n\tstruct resource *resource;\n\tconst struct platform_device_id *id_entry;\n\tconst char *driver_override;\n\tstruct mfd_cell *mfd_cell;\n\tstruct pdev_archdata archdata;\n};\n\nstruct fixed_regulator_data {\n\tstruct fixed_voltage_config cfg;\n\tstruct regulator_init_data init_data;\n\tstruct platform_device pdev;\n};\n\nstruct flag_settings {\n\tunsigned int flags;\n\tunsigned int mask;\n};\n\nstruct flagsbuf {\n\tchar buf[8];\n};\n\nstruct flex_groups {\n\tatomic64_t free_clusters;\n\tatomic_t free_inodes;\n\tatomic_t used_dirs;\n};\n\nstruct flock {\n\tshort int l_type;\n\tshort int l_whence;\n\t__kernel_off_t l_start;\n\t__kernel_off_t l_len;\n\t__kernel_pid_t l_pid;\n};\n\nstruct flock64 {\n\tshort int l_type;\n\tshort int l_whence;\n\t__kernel_loff_t l_start;\n\t__kernel_loff_t l_len;\n\t__kernel_pid_t l_pid;\n};\n\ntypedef void (*action_destr)(void *);\n\nstruct nf_flowtable;\n\nstruct ip_tunnel_info;\n\nstruct psample_group;\n\nstruct flow_action_entry {\n\tenum flow_action_id id;\n\tu32 hw_index;\n\tlong unsigned int cookie;\n\tu64 miss_cookie;\n\tenum flow_action_hw_stats hw_stats;\n\taction_destr destructor;\n\tvoid *destructor_priv;\n\tunion {\n\t\tu32 chain_index;\n\t\tstruct net_device *dev;\n\t\tstruct {\n\t\t\tu16 vid;\n\t\t\t__be16 proto;\n\t\t\tu8 prio;\n\t\t} vlan;\n\t\tstruct {\n\t\t\tunsigned char dst[6];\n\t\t\tunsigned char src[6];\n\t\t} vlan_push_eth;\n\t\tstruct {\n\t\t\tenum flow_action_mangle_base htype;\n\t\t\tu32 offset;\n\t\t\tu32 mask;\n\t\t\tu32 val;\n\t\t} mangle;\n\t\tstruct ip_tunnel_info *tunnel;\n\t\tu32 csum_flags;\n\t\tu32 mark;\n\t\tu16 ptype;\n\t\tu16 rx_queue;\n\t\tu32 priority;\n\t\tstruct {\n\t\t\tu32 ctx;\n\t\t\tu32 index;\n\t\t\tu8 vf;\n\t\t} queue;\n\t\tstruct {\n\t\t\tstruct psample_group *psample_group;\n\t\t\tu32 rate;\n\t\t\tu32 trunc_size;\n\t\t\tbool truncate;\n\t\t} sample;\n\t\tstruct {\n\t\t\tu32 burst;\n\t\t\tu64 rate_bytes_ps;\n\t\t\tu64 peakrate_bytes_ps;\n\t\t\tu32 avrate;\n\t\t\tu16 overhead;\n\t\t\tu64 burst_pkt;\n\t\t\tu64 rate_pkt_ps;\n\t\t\tu32 mtu;\n\t\t\tstruct {\n\t\t\t\tenum flow_action_id act_id;\n\t\t\t\tu32 extval;\n\t\t\t} exceed;\n\t\t\tstruct {\n\t\t\t\tenum flow_action_id act_id;\n\t\t\t\tu32 extval;\n\t\t\t} notexceed;\n\t\t} police;\n\t\tstruct {\n\t\t\tint action;\n\t\t\tu16 zone;\n\t\t\tstruct nf_flowtable *flow_table;\n\t\t} ct;\n\t\tstruct {\n\t\t\tlong unsigned int cookie;\n\t\t\tu32 mark;\n\t\t\tu32 labels[4];\n\t\t\tbool orig_dir;\n\t\t} ct_metadata;\n\t\tstruct {\n\t\t\tu32 label;\n\t\t\t__be16 proto;\n\t\t\tu8 tc;\n\t\t\tu8 bos;\n\t\t\tu8 ttl;\n\t\t} mpls_push;\n\t\tstruct {\n\t\t\t__be16 proto;\n\t\t} mpls_pop;\n\t\tstruct {\n\t\t\tu32 label;\n\t\t\tu8 tc;\n\t\t\tu8 bos;\n\t\t\tu8 ttl;\n\t\t} mpls_mangle;\n\t\tstruct {\n\t\t\ts32 prio;\n\t\t\tu64 basetime;\n\t\t\tu64 cycletime;\n\t\t\tu64 cycletimeext;\n\t\t\tu32 num_entries;\n\t\t\tstruct action_gate_entry *entries;\n\t\t} gate;\n\t\tstruct {\n\t\t\tu16 sid;\n\t\t} pppoe;\n\t};\n\tstruct flow_action_cookie *user_cookie;\n};\n\nstruct flow_action {\n\tunsigned int num_entries;\n\tstruct flow_action_entry entries[0];\n};\n\nstruct flow_action_cookie {\n\tu32 cookie_len;\n\tu8 cookie[0];\n};\n\nstruct flow_block {\n\tstruct list_head cb_list;\n};\n\ntypedef int flow_setup_cb_t(enum tc_setup_type, void *, void *);\n\nstruct flow_block_cb;\n\nstruct flow_block_indr {\n\tstruct list_head list;\n\tstruct net_device *dev;\n\tstruct Qdisc *sch;\n\tenum flow_block_binder_type binder_type;\n\tvoid *data;\n\tvoid *cb_priv;\n\tvoid (*cleanup)(struct flow_block_cb *);\n};\n\nstruct flow_block_cb {\n\tstruct list_head driver_list;\n\tstruct list_head list;\n\tflow_setup_cb_t *cb;\n\tvoid *cb_ident;\n\tvoid *cb_priv;\n\tvoid (*release)(void *);\n\tstruct flow_block_indr indr;\n\tunsigned int refcnt;\n};\n\nstruct flow_block_offload {\n\tenum flow_block_command command;\n\tenum flow_block_binder_type binder_type;\n\tbool block_shared;\n\tbool unlocked_driver_cb;\n\tstruct net *net;\n\tstruct flow_block *block;\n\tstruct list_head cb_list;\n\tstruct list_head *driver_block_list;\n\tstruct netlink_ext_ack *extack;\n\tstruct Qdisc *sch;\n\tstruct list_head *cb_list_head;\n};\n\nstruct flow_cls_common_offload {\n\tu32 chain_index;\n\t__be16 protocol;\n\tu32 prio;\n\tstruct netlink_ext_ack *extack;\n};\n\nstruct flow_stats {\n\tu64 pkts;\n\tu64 bytes;\n\tu64 drops;\n\tu64 lastused;\n\tenum flow_action_hw_stats used_hw_stats;\n\tbool used_hw_stats_valid;\n};\n\nstruct flow_cls_offload {\n\tstruct flow_cls_common_offload common;\n\tenum flow_cls_command command;\n\tbool use_act_stats;\n\tlong unsigned int cookie;\n\tstruct flow_rule *rule;\n\tstruct flow_stats stats;\n\tu32 classid;\n};\n\nstruct flow_dissector_key {\n\tenum flow_dissector_key_id key_id;\n\tsize_t offset;\n};\n\nstruct flow_dissector_key_tipc {\n\t__be32 key;\n};\n\nstruct flow_dissector_key_addrs {\n\tunion {\n\t\tstruct flow_dissector_key_ipv4_addrs v4addrs;\n\t\tstruct flow_dissector_key_ipv6_addrs v6addrs;\n\t\tstruct flow_dissector_key_tipc tipckey;\n\t};\n};\n\nstruct flow_dissector_key_arp {\n\t__u32 sip;\n\t__u32 tip;\n\t__u8 op;\n\tunsigned char sha[6];\n\tunsigned char tha[6];\n};\n\nstruct flow_dissector_key_cfm {\n\tu8 mdl_ver;\n\tu8 opcode;\n};\n\nstruct flow_dissector_key_control {\n\tu16 thoff;\n\tu16 addr_type;\n\tu32 flags;\n};\n\nstruct flow_dissector_key_ct {\n\tu16 ct_state;\n\tu16 ct_zone;\n\tu32 ct_mark;\n\tu32 ct_labels[4];\n};\n\nstruct flow_dissector_key_enc_opts {\n\tu8 data[255];\n\tu8 len;\n\tu32 dst_opt_type;\n};\n\nstruct flow_dissector_key_hash {\n\tu32 hash;\n};\n\nstruct flow_dissector_key_icmp {\n\tstruct {\n\t\tu8 type;\n\t\tu8 code;\n\t};\n\tu16 id;\n};\n\nstruct flow_dissector_key_ipsec {\n\t__be32 spi;\n};\n\nstruct flow_dissector_key_keyid {\n\t__be32 keyid;\n};\n\nstruct flow_dissector_key_l2tpv3 {\n\t__be32 session_id;\n};\n\nstruct flow_dissector_key_meta {\n\tint ingress_ifindex;\n\tu16 ingress_iftype;\n\tu8 l2_miss;\n};\n\nstruct flow_dissector_mpls_lse {\n\tu32 mpls_ttl: 8;\n\tu32 mpls_bos: 1;\n\tu32 mpls_tc: 3;\n\tu32 mpls_label: 20;\n};\n\nstruct flow_dissector_key_mpls {\n\tstruct flow_dissector_mpls_lse ls[7];\n\tu8 used_lses;\n};\n\nstruct flow_dissector_key_num_of_vlans {\n\tu8 num_of_vlans;\n};\n\nstruct flow_dissector_key_ports_range {\n\tunion {\n\t\tstruct flow_dissector_key_ports tp;\n\t\tstruct {\n\t\t\tstruct flow_dissector_key_ports tp_min;\n\t\t\tstruct flow_dissector_key_ports tp_max;\n\t\t};\n\t};\n};\n\nstruct flow_dissector_key_pppoe {\n\t__be16 session_id;\n\t__be16 ppp_proto;\n\t__be16 type;\n};\n\nstruct flow_dissector_key_tags {\n\tu32 flow_label;\n};\n\nstruct flow_dissector_key_tcp {\n\t__be16 flags;\n};\n\nstruct flow_indir_dev_info {\n\tvoid *data;\n\tstruct net_device *dev;\n\tstruct Qdisc *sch;\n\tenum tc_setup_type type;\n\tvoid (*cleanup)(struct flow_block_cb *);\n\tstruct list_head list;\n\tenum flow_block_command command;\n\tenum flow_block_binder_type binder_type;\n\tstruct list_head *cb_list;\n};\n\ntypedef int flow_indr_block_bind_cb_t(struct net_device *, struct Qdisc *, void *, enum tc_setup_type, void *, void *, void (*)(struct flow_block_cb *));\n\nstruct flow_indr_dev {\n\tstruct list_head list;\n\tflow_indr_block_bind_cb_t *cb;\n\tvoid *cb_priv;\n\trefcount_t refcnt;\n};\n\nstruct flow_keys {\n\tstruct flow_dissector_key_control control;\n\tstruct flow_dissector_key_basic basic;\n\tstruct flow_dissector_key_tags tags;\n\tstruct flow_dissector_key_vlan vlan;\n\tstruct flow_dissector_key_vlan cvlan;\n\tstruct flow_dissector_key_keyid keyid;\n\tstruct flow_dissector_key_ports ports;\n\tstruct flow_dissector_key_icmp icmp;\n\tstruct flow_dissector_key_addrs addrs;\n\tlong: 0;\n};\n\nstruct flow_keys_basic {\n\tstruct flow_dissector_key_control control;\n\tstruct flow_dissector_key_basic basic;\n};\n\nstruct flow_keys_digest {\n\tu8 data[16];\n};\n\nstruct flow_match {\n\tstruct flow_dissector *dissector;\n\tvoid *mask;\n\tvoid *key;\n};\n\nstruct flow_match_arp {\n\tstruct flow_dissector_key_arp *key;\n\tstruct flow_dissector_key_arp *mask;\n};\n\nstruct flow_match_basic {\n\tstruct flow_dissector_key_basic *key;\n\tstruct flow_dissector_key_basic *mask;\n};\n\nstruct flow_match_control {\n\tstruct flow_dissector_key_control *key;\n\tstruct flow_dissector_key_control *mask;\n};\n\nstruct flow_match_ct {\n\tstruct flow_dissector_key_ct *key;\n\tstruct flow_dissector_key_ct *mask;\n};\n\nstruct flow_match_enc_keyid {\n\tstruct flow_dissector_key_keyid *key;\n\tstruct flow_dissector_key_keyid *mask;\n};\n\nstruct flow_match_enc_opts {\n\tstruct flow_dissector_key_enc_opts *key;\n\tstruct flow_dissector_key_enc_opts *mask;\n};\n\nstruct flow_match_eth_addrs {\n\tstruct flow_dissector_key_eth_addrs *key;\n\tstruct flow_dissector_key_eth_addrs *mask;\n};\n\nstruct flow_match_icmp {\n\tstruct flow_dissector_key_icmp *key;\n\tstruct flow_dissector_key_icmp *mask;\n};\n\nstruct flow_match_ip {\n\tstruct flow_dissector_key_ip *key;\n\tstruct flow_dissector_key_ip *mask;\n};\n\nstruct flow_match_ipsec {\n\tstruct flow_dissector_key_ipsec *key;\n\tstruct flow_dissector_key_ipsec *mask;\n};\n\nstruct flow_match_ipv4_addrs {\n\tstruct flow_dissector_key_ipv4_addrs *key;\n\tstruct flow_dissector_key_ipv4_addrs *mask;\n};\n\nstruct flow_match_ipv6_addrs {\n\tstruct flow_dissector_key_ipv6_addrs *key;\n\tstruct flow_dissector_key_ipv6_addrs *mask;\n};\n\nstruct flow_match_l2tpv3 {\n\tstruct flow_dissector_key_l2tpv3 *key;\n\tstruct flow_dissector_key_l2tpv3 *mask;\n};\n\nstruct flow_match_meta {\n\tstruct flow_dissector_key_meta *key;\n\tstruct flow_dissector_key_meta *mask;\n};\n\nstruct flow_match_mpls {\n\tstruct flow_dissector_key_mpls *key;\n\tstruct flow_dissector_key_mpls *mask;\n};\n\nstruct flow_match_ports {\n\tstruct flow_dissector_key_ports *key;\n\tstruct flow_dissector_key_ports *mask;\n};\n\nstruct flow_match_ports_range {\n\tstruct flow_dissector_key_ports_range *key;\n\tstruct flow_dissector_key_ports_range *mask;\n};\n\nstruct flow_match_pppoe {\n\tstruct flow_dissector_key_pppoe *key;\n\tstruct flow_dissector_key_pppoe *mask;\n};\n\nstruct flow_match_tcp {\n\tstruct flow_dissector_key_tcp *key;\n\tstruct flow_dissector_key_tcp *mask;\n};\n\nstruct flow_match_vlan {\n\tstruct flow_dissector_key_vlan *key;\n\tstruct flow_dissector_key_vlan *mask;\n};\n\nstruct flow_offload_action {\n\tstruct netlink_ext_ack *extack;\n\tenum offload_act_command command;\n\tenum flow_action_id id;\n\tu32 index;\n\tlong unsigned int cookie;\n\tstruct flow_stats stats;\n\tstruct flow_action action;\n};\n\nstruct flow_rule {\n\tstruct flow_match match;\n\tstruct flow_action action;\n};\n\nstruct flowi_tunnel {\n\t__be64 tun_id;\n};\n\nstruct flowi_common {\n\tint flowic_oif;\n\tint flowic_iif;\n\tint flowic_l3mdev;\n\t__u32 flowic_mark;\n\t__u8 flowic_tos;\n\t__u8 flowic_scope;\n\t__u8 flowic_proto;\n\t__u8 flowic_flags;\n\t__u32 flowic_secid;\n\tkuid_t flowic_uid;\n\t__u32 flowic_multipath_hash;\n\tstruct flowi_tunnel flowic_tun_key;\n};\n\nunion flowi_uli {\n\tstruct {\n\t\t__be16 dport;\n\t\t__be16 sport;\n\t} ports;\n\tstruct {\n\t\t__u8 type;\n\t\t__u8 code;\n\t} icmpt;\n\t__be32 gre_key;\n\tstruct {\n\t\t__u8 type;\n\t} mht;\n};\n\nstruct flowi4 {\n\tstruct flowi_common __fl_common;\n\t__be32 saddr;\n\t__be32 daddr;\n\tunion flowi_uli uli;\n};\n\nstruct flowi6 {\n\tstruct flowi_common __fl_common;\n\tstruct in6_addr daddr;\n\tstruct in6_addr saddr;\n\t__be32 flowlabel;\n\tunion flowi_uli uli;\n\t__u32 mp_hash;\n};\n\nstruct flowi {\n\tunion {\n\t\tstruct flowi_common __fl_common;\n\t\tstruct flowi4 ip4;\n\t\tstruct flowi6 ip6;\n\t} u;\n};\n\nstruct flush_busy_ctx_data {\n\tstruct blk_mq_hw_ctx *hctx;\n\tstruct list_head *list;\n};\n\nstruct flush_tlb_info {\n\tstruct mm_struct *mm;\n\tlong unsigned int start;\n\tlong unsigned int end;\n\tu64 new_tlb_gen;\n\tunsigned int initiating_cpu;\n\tu8 stride_shift;\n\tu8 freed_tables;\n};\n\nstruct fname {\n\t__u32 hash;\n\t__u32 minor_hash;\n\tstruct rb_node rb_hash;\n\tstruct fname *next;\n\t__u32 inode;\n\t__u8 name_len;\n\t__u8 file_type;\n\tchar name[0];\n};\n\nstruct fnhe_hash_bucket {\n\tstruct fib_nh_exception *chain;\n};\n\nstruct page_pool;\n\nstruct page {\n\tlong unsigned int flags;\n\tunion {\n\t\tstruct {\n\t\t\tunion {\n\t\t\t\tstruct list_head lru;\n\t\t\t\tstruct {\n\t\t\t\t\tvoid *__filler;\n\t\t\t\t\tunsigned int mlock_count;\n\t\t\t\t};\n\t\t\t\tstruct list_head buddy_list;\n\t\t\t\tstruct list_head pcp_list;\n\t\t\t};\n\t\t\tstruct address_space *mapping;\n\t\t\tunion {\n\t\t\t\tlong unsigned int index;\n\t\t\t\tlong unsigned int share;\n\t\t\t};\n\t\t\tlong unsigned int private;\n\t\t};\n\t\tstruct {\n\t\t\tlong unsigned int pp_magic;\n\t\t\tstruct page_pool *pp;\n\t\t\tlong unsigned int _pp_mapping_pad;\n\t\t\tlong unsigned int dma_addr;\n\t\t\tatomic_long_t pp_ref_count;\n\t\t};\n\t\tstruct {\n\t\t\tlong unsigned int compound_head;\n\t\t};\n\t\tstruct {\n\t\t\tstruct dev_pagemap *pgmap;\n\t\t\tvoid *zone_device_data;\n\t\t};\n\t\tstruct callback_head callback_head;\n\t};\n\tunion {\n\t\tunsigned int page_type;\n\t\tatomic_t _mapcount;\n\t};\n\tatomic_t _refcount;\n\tlong unsigned int memcg_data;\n};\n\nstruct folio {\n\tunion {\n\t\tstruct {\n\t\t\tlong unsigned int flags;\n\t\t\tunion {\n\t\t\t\tstruct list_head lru;\n\t\t\t\tstruct {\n\t\t\t\t\tvoid *__filler;\n\t\t\t\t\tunsigned int mlock_count;\n\t\t\t\t};\n\t\t\t};\n\t\t\tstruct address_space *mapping;\n\t\t\tlong unsigned int index;\n\t\t\tunion {\n\t\t\t\tvoid *private;\n\t\t\t\tswp_entry_t swap;\n\t\t\t};\n\t\t\tatomic_t _mapcount;\n\t\t\tatomic_t _refcount;\n\t\t\tlong unsigned int memcg_data;\n\t\t};\n\t\tstruct page page;\n\t};\n\tunion {\n\t\tstruct {\n\t\t\tlong unsigned int _flags_1;\n\t\t\tlong unsigned int _head_1;\n\t\t\tatomic_t _large_mapcount;\n\t\t\tatomic_t _entire_mapcount;\n\t\t\tatomic_t _nr_pages_mapped;\n\t\t\tatomic_t _pincount;\n\t\t\tunsigned int _folio_nr_pages;\n\t\t};\n\t\tstruct page __page_1;\n\t};\n\tunion {\n\t\tstruct {\n\t\t\tlong unsigned int _flags_2;\n\t\t\tlong unsigned int _head_2;\n\t\t\tvoid *_hugetlb_subpool;\n\t\t\tvoid *_hugetlb_cgroup;\n\t\t\tvoid *_hugetlb_cgroup_rsvd;\n\t\t\tvoid *_hugetlb_hwpoison;\n\t\t};\n\t\tstruct {\n\t\t\tlong unsigned int _flags_2a;\n\t\t\tlong unsigned int _head_2a;\n\t\t\tstruct list_head _deferred_list;\n\t\t};\n\t\tstruct page __page_2;\n\t};\n};\n\nstruct folio_iter {\n\tstruct folio *folio;\n\tsize_t offset;\n\tsize_t length;\n\tstruct folio *_next;\n\tsize_t _seg_count;\n\tint _i;\n};\n\nstruct folio_referenced_arg {\n\tint mapcount;\n\tint referenced;\n\tlong unsigned int vm_flags;\n\tstruct mem_cgroup *memcg;\n};\n\nstruct follow_page_context {\n\tstruct dev_pagemap *pgmap;\n\tunsigned int page_mask;\n};\n\nstruct font_data {\n\tunsigned int extra[4];\n\tconst unsigned char data[0];\n};\n\nstruct font_desc {\n\tint idx;\n\tconst char *name;\n\tunsigned int width;\n\tunsigned int height;\n\tunsigned int charcount;\n\tconst void *data;\n\tint pref;\n};\n\nstruct memory_block;\n\ntypedef int (*walk_memory_blocks_func_t)(struct memory_block *, void *);\n\nstruct for_each_memory_block_cb_data {\n\twalk_memory_blocks_func_t func;\n\tvoid *arg;\n};\n\nstruct inactive_task_frame {\n\tlong unsigned int r15;\n\tlong unsigned int r14;\n\tlong unsigned int r13;\n\tlong unsigned int r12;\n\tlong unsigned int bx;\n\tlong unsigned int bp;\n\tlong unsigned int ret_addr;\n};\n\nstruct fork_frame {\n\tstruct inactive_task_frame frame;\n\tstruct pt_regs regs;\n};\n\nstruct fork_proc_event {\n\t__kernel_pid_t parent_pid;\n\t__kernel_pid_t parent_tgid;\n\t__kernel_pid_t child_pid;\n\t__kernel_pid_t child_tgid;\n};\n\nstruct fpdt_subtable_entry {\n\tu16 type;\n\tu8 length;\n\tu8 revision;\n\tu32 reserved;\n\tu64 address;\n};\n\nstruct fpdt_subtable_header {\n\tu32 signature;\n\tu32 length;\n};\n\nstruct fregs_state {\n\tu32 cwd;\n\tu32 swd;\n\tu32 twd;\n\tu32 fip;\n\tu32 fcs;\n\tu32 foo;\n\tu32 fos;\n\tu32 st_space[20];\n\tu32 status;\n};\n\nstruct fxregs_state {\n\tu16 cwd;\n\tu16 swd;\n\tu16 twd;\n\tu16 fop;\n\tunion {\n\t\tstruct {\n\t\t\tu64 rip;\n\t\t\tu64 rdp;\n\t\t};\n\t\tstruct {\n\t\t\tu32 fip;\n\t\t\tu32 fcs;\n\t\t\tu32 foo;\n\t\t\tu32 fos;\n\t\t};\n\t};\n\tu32 mxcsr;\n\tu32 mxcsr_mask;\n\tu32 st_space[32];\n\tu32 xmm_space[64];\n\tu32 padding[12];\n\tunion {\n\t\tu32 padding1[12];\n\t\tu32 sw_reserved[12];\n\t};\n};\n\nstruct math_emu_info;\n\nstruct swregs_state {\n\tu32 cwd;\n\tu32 swd;\n\tu32 twd;\n\tu32 fip;\n\tu32 fcs;\n\tu32 foo;\n\tu32 fos;\n\tu32 st_space[20];\n\tu8 ftop;\n\tu8 changed;\n\tu8 lookahead;\n\tu8 no_update;\n\tu8 rm;\n\tu8 alimit;\n\tstruct math_emu_info *info;\n\tu32 entry_eip;\n};\n\nstruct xstate_header {\n\tu64 xfeatures;\n\tu64 xcomp_bv;\n\tu64 reserved[6];\n};\n\nstruct xregs_state {\n\tstruct fxregs_state i387;\n\tstruct xstate_header header;\n\tu8 extended_state_area[0];\n};\n\nunion fpregs_state {\n\tstruct fregs_state fsave;\n\tstruct fxregs_state fxsave;\n\tstruct swregs_state soft;\n\tstruct xregs_state xsave;\n\tu8 __padding[4096];\n};\n\nstruct rethook_node {\n\tstruct callback_head rcu;\n\tstruct llist_node llist;\n\tstruct rethook *rethook;\n\tlong unsigned int ret_addr;\n\tlong unsigned int frame;\n};\n\nstruct fprobe_rethook_node {\n\tstruct rethook_node node;\n\tlong unsigned int entry_ip;\n\tlong unsigned int entry_parent_ip;\n\tchar data[0];\n};\n\nstruct fprop_global {\n\tstruct percpu_counter events;\n\tunsigned int period;\n\tseqcount_t sequence;\n};\n\nstruct fpstate {\n\tunsigned int size;\n\tunsigned int user_size;\n\tu64 xfeatures;\n\tu64 user_xfeatures;\n\tu64 xfd;\n\tunsigned int is_valloc: 1;\n\tunsigned int is_guest: 1;\n\tunsigned int is_confidential: 1;\n\tunsigned int in_use: 1;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tunion fpregs_state regs;\n};\n\nstruct fpu_state_perm {\n\tu64 __state_perm;\n\tunsigned int __state_size;\n\tunsigned int __user_state_size;\n};\n\nstruct fpu {\n\tunsigned int last_cpu;\n\tlong unsigned int avx512_timestamp;\n\tstruct fpstate *fpstate;\n\tstruct fpstate *__task_fpstate;\n\tstruct fpu_state_perm perm;\n\tstruct fpu_state_perm guest_perm;\n\tstruct fpstate __fpstate;\n};\n\nstruct fpu_guest {\n\tu64 xfeatures;\n\tu64 perm;\n\tu64 xfd_err;\n\tunsigned int uabi_size;\n\tstruct fpstate *fpstate;\n};\n\nstruct fpu_state_config {\n\tunsigned int max_size;\n\tunsigned int default_size;\n\tu64 max_features;\n\tu64 default_features;\n\tu64 legacy_features;\n\tu64 independent_features;\n};\n\ntypedef u32 (*rht_hashfn_t)(const void *, u32, u32);\n\ntypedef u32 (*rht_obj_hashfn_t)(const void *, u32, u32);\n\nstruct rhashtable_compare_arg;\n\ntypedef int (*rht_obj_cmpfn_t)(struct rhashtable_compare_arg *, const void *);\n\nstruct rhashtable_params {\n\tu16 nelem_hint;\n\tu16 key_len;\n\tu16 key_offset;\n\tu16 head_offset;\n\tunsigned int max_size;\n\tu16 min_size;\n\tbool automatic_shrinking;\n\trht_hashfn_t hashfn;\n\trht_obj_hashfn_t obj_hashfn;\n\trht_obj_cmpfn_t obj_cmpfn;\n};\n\nstruct rhashtable {\n\tstruct bucket_table *tbl;\n\tunsigned int key_len;\n\tunsigned int max_elems;\n\tstruct rhashtable_params p;\n\tbool rhlist;\n\tstruct work_struct run_work;\n\tstruct mutex mutex;\n\tspinlock_t lock;\n\tatomic_t nelems;\n};\n\nstruct inet_frags;\n\nstruct fqdir {\n\tlong int high_thresh;\n\tlong int low_thresh;\n\tint timeout;\n\tint max_dist;\n\tstruct inet_frags *f;\n\tstruct net *net;\n\tbool dead;\n\tlong: 64;\n\tlong: 64;\n\tstruct rhashtable rhashtable;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tatomic_long_t mem;\n\tstruct work_struct destroy_work;\n\tstruct llist_node free_list;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct frag {\n\tstruct list_head list;\n\tu32 group;\n\tu8 num;\n\tu8 rec;\n\tu8 map;\n\tu8 data[0];\n};\n\nstruct frag_hdr {\n\t__u8 nexthdr;\n\t__u8 reserved;\n\t__be16 frag_off;\n\t__be32 identification;\n};\n\nstruct frag_v4_compare_key {\n\t__be32 saddr;\n\t__be32 daddr;\n\tu32 user;\n\tu32 vif;\n\t__be16 id;\n\tu16 protocol;\n};\n\nstruct frag_v6_compare_key {\n\tstruct in6_addr saddr;\n\tstruct in6_addr daddr;\n\tu32 user;\n\t__be32 id;\n\tu32 iif;\n};\n\nstruct inet_frag_queue {\n\tstruct rhash_head node;\n\tunion {\n\t\tstruct frag_v4_compare_key v4;\n\t\tstruct frag_v6_compare_key v6;\n\t} key;\n\tstruct timer_list timer;\n\tspinlock_t lock;\n\trefcount_t refcnt;\n\tstruct rb_root rb_fragments;\n\tstruct sk_buff *fragments_tail;\n\tstruct sk_buff *last_run_head;\n\tktime_t stamp;\n\tint len;\n\tint meat;\n\tu8 tstamp_type;\n\t__u8 flags;\n\tu16 max_size;\n\tstruct fqdir *fqdir;\n\tstruct callback_head rcu;\n};\n\nstruct frag_queue {\n\tstruct inet_frag_queue q;\n\tint iif;\n\t__u16 nhoffset;\n\tu8 ecn;\n};\n\nstruct fred_info {\n\tlong unsigned int edata;\n\tlong unsigned int resv;\n};\n\nstruct fred_frame {\n\tstruct pt_regs regs;\n\tstruct fred_info info;\n};\n\nstruct free_area {\n\tstruct list_head free_list[5];\n\tlong unsigned int nr_free;\n};\n\nstruct freerunning_counters {\n\tunsigned int counter_base;\n\tunsigned int counter_offset;\n\tunsigned int box_offset;\n\tunsigned int num_counters;\n\tunsigned int bits;\n\tunsigned int *box_offsets;\n};\n\nstruct freezer {\n\tstruct cgroup_subsys_state css;\n\tunsigned int state;\n};\n\nstruct freq_attr {\n\tstruct attribute attr;\n\tssize_t (*show)(struct cpufreq_policy *, char *);\n\tssize_t (*store)(struct cpufreq_policy *, const char *, size_t);\n};\n\nstruct muldiv {\n\tu32 multiplier;\n\tu32 divider;\n};\n\nstruct freq_desc {\n\tbool use_msr_plat;\n\tstruct muldiv muldiv[16];\n\tu32 freqs[16];\n\tu32 mask;\n};\n\nstruct p_log {\n\tconst char *prefix;\n\tstruct fc_log *log;\n};\n\nstruct fs_context_operations;\n\nstruct fs_context {\n\tconst struct fs_context_operations *ops;\n\tstruct mutex uapi_mutex;\n\tstruct file_system_type *fs_type;\n\tvoid *fs_private;\n\tvoid *sget_key;\n\tstruct dentry *root;\n\tstruct user_namespace *user_ns;\n\tstruct net *net_ns;\n\tconst struct cred *cred;\n\tstruct p_log log;\n\tconst char *source;\n\tvoid *security;\n\tvoid *s_fs_info;\n\tunsigned int sb_flags;\n\tunsigned int sb_flags_mask;\n\tunsigned int s_iflags;\n\tenum fs_context_purpose purpose: 8;\n\tenum fs_context_phase phase: 8;\n\tbool need_free: 1;\n\tbool global: 1;\n\tbool oldapi: 1;\n\tbool exclusive: 1;\n};\n\nstruct fs_parameter;\n\nstruct fs_context_operations {\n\tvoid (*free)(struct fs_context *);\n\tint (*dup)(struct fs_context *, struct fs_context *);\n\tint (*parse_param)(struct fs_context *, struct fs_parameter *);\n\tint (*parse_monolithic)(struct fs_context *, void *);\n\tint (*get_tree)(struct fs_context *);\n\tint (*reconfigure)(struct fs_context *);\n};\n\nstruct fs_disk_quota {\n\t__s8 d_version;\n\t__s8 d_flags;\n\t__u16 d_fieldmask;\n\t__u32 d_id;\n\t__u64 d_blk_hardlimit;\n\t__u64 d_blk_softlimit;\n\t__u64 d_ino_hardlimit;\n\t__u64 d_ino_softlimit;\n\t__u64 d_bcount;\n\t__u64 d_icount;\n\t__s32 d_itimer;\n\t__s32 d_btimer;\n\t__u16 d_iwarns;\n\t__u16 d_bwarns;\n\t__s8 d_itimer_hi;\n\t__s8 d_btimer_hi;\n\t__s8 d_rtbtimer_hi;\n\t__s8 d_padding2;\n\t__u64 d_rtb_hardlimit;\n\t__u64 d_rtb_softlimit;\n\t__u64 d_rtbcount;\n\t__s32 d_rtbtimer;\n\t__u16 d_rtbwarns;\n\t__s16 d_padding3;\n\tchar d_padding4[8];\n};\n\nstruct fs_error_report {\n\tint error;\n\tstruct inode *inode;\n\tstruct super_block *sb;\n};\n\nstruct fs_parameter {\n\tconst char *key;\n\tenum fs_value_type type: 8;\n\tunion {\n\t\tchar *string;\n\t\tvoid *blob;\n\t\tstruct filename *name;\n\t\tstruct file *file;\n\t};\n\tsize_t size;\n\tint dirfd;\n};\n\nstruct fs_parse_result;\n\ntypedef int fs_param_type(struct p_log *, const struct fs_parameter_spec *, struct fs_parameter *, struct fs_parse_result *);\n\nstruct fs_parameter_spec {\n\tconst char *name;\n\tfs_param_type *type;\n\tu8 opt;\n\tshort unsigned int flags;\n\tconst void *data;\n};\n\nstruct fs_parse_result {\n\tbool negated;\n\tunion {\n\t\tbool boolean;\n\t\tint int_32;\n\t\tunsigned int uint_32;\n\t\tu64 uint_64;\n\t\tkuid_t uid;\n\t\tkgid_t gid;\n\t};\n};\n\nstruct fs_qfilestat {\n\t__u64 qfs_ino;\n\t__u64 qfs_nblks;\n\t__u32 qfs_nextents;\n};\n\ntypedef struct fs_qfilestat fs_qfilestat_t;\n\nstruct fs_qfilestatv {\n\t__u64 qfs_ino;\n\t__u64 qfs_nblks;\n\t__u32 qfs_nextents;\n\t__u32 qfs_pad;\n};\n\nstruct fs_quota_stat {\n\t__s8 qs_version;\n\t__u16 qs_flags;\n\t__s8 qs_pad;\n\tfs_qfilestat_t qs_uquota;\n\tfs_qfilestat_t qs_gquota;\n\t__u32 qs_incoredqs;\n\t__s32 qs_btimelimit;\n\t__s32 qs_itimelimit;\n\t__s32 qs_rtbtimelimit;\n\t__u16 qs_bwarnlimit;\n\t__u16 qs_iwarnlimit;\n};\n\nstruct fs_quota_statv {\n\t__s8 qs_version;\n\t__u8 qs_pad1;\n\t__u16 qs_flags;\n\t__u32 qs_incoredqs;\n\tstruct fs_qfilestatv qs_uquota;\n\tstruct fs_qfilestatv qs_gquota;\n\tstruct fs_qfilestatv qs_pquota;\n\t__s32 qs_btimelimit;\n\t__s32 qs_itimelimit;\n\t__s32 qs_rtbtimelimit;\n\t__u16 qs_bwarnlimit;\n\t__u16 qs_iwarnlimit;\n\t__u16 qs_rtbwarnlimit;\n\t__u16 qs_pad3;\n\t__u32 qs_pad4;\n\t__u64 qs_pad2[7];\n};\n\nstruct fs_struct {\n\tint users;\n\tspinlock_t lock;\n\tseqcount_spinlock_t seq;\n\tint umask;\n\tint in_exec;\n\tstruct path root;\n\tstruct path pwd;\n};\n\nstruct fs_sysfs_path {\n\t__u8 len;\n\t__u8 name[128];\n};\n\nstruct fscrypt_key_specifier {\n\t__u32 type;\n\t__u32 __reserved;\n\tunion {\n\t\t__u8 __reserved[32];\n\t\t__u8 descriptor[8];\n\t\t__u8 identifier[16];\n\t} u;\n};\n\nstruct fscrypt_add_key_arg {\n\tstruct fscrypt_key_specifier key_spec;\n\t__u32 raw_size;\n\t__u32 key_id;\n\t__u32 __reserved[8];\n\t__u8 raw[0];\n};\n\nstruct fscrypt_context_v1 {\n\tu8 version;\n\tu8 contents_encryption_mode;\n\tu8 filenames_encryption_mode;\n\tu8 flags;\n\tu8 master_key_descriptor[8];\n\tu8 nonce[16];\n};\n\nstruct fscrypt_context_v2 {\n\tu8 version;\n\tu8 contents_encryption_mode;\n\tu8 filenames_encryption_mode;\n\tu8 flags;\n\tu8 log2_data_unit_size;\n\tu8 __reserved[3];\n\tu8 master_key_identifier[16];\n\tu8 nonce[16];\n};\n\nunion fscrypt_context {\n\tu8 version;\n\tstruct fscrypt_context_v1 v1;\n\tstruct fscrypt_context_v2 v2;\n};\n\nstruct fscrypt_prepared_key {\n\tstruct crypto_skcipher *tfm;\n\tstruct blk_crypto_key *blk_key;\n};\n\nstruct fscrypt_mode;\n\nstruct fscrypt_direct_key {\n\tstruct super_block *dk_sb;\n\tstruct hlist_node dk_node;\n\trefcount_t dk_refcount;\n\tconst struct fscrypt_mode *dk_mode;\n\tstruct fscrypt_prepared_key dk_key;\n\tu8 dk_descriptor[8];\n\tu8 dk_raw[64];\n};\n\nstruct fscrypt_get_key_status_arg {\n\tstruct fscrypt_key_specifier key_spec;\n\t__u32 __reserved[6];\n\t__u32 status;\n\t__u32 status_flags;\n\t__u32 user_count;\n\t__u32 __out_reserved[13];\n};\n\nstruct fscrypt_policy_v1 {\n\t__u8 version;\n\t__u8 contents_encryption_mode;\n\t__u8 filenames_encryption_mode;\n\t__u8 flags;\n\t__u8 master_key_descriptor[8];\n};\n\nstruct fscrypt_policy_v2 {\n\t__u8 version;\n\t__u8 contents_encryption_mode;\n\t__u8 filenames_encryption_mode;\n\t__u8 flags;\n\t__u8 log2_data_unit_size;\n\t__u8 __reserved[3];\n\t__u8 master_key_identifier[16];\n};\n\nstruct fscrypt_get_policy_ex_arg {\n\t__u64 policy_size;\n\tunion {\n\t\t__u8 version;\n\t\tstruct fscrypt_policy_v1 v1;\n\t\tstruct fscrypt_policy_v2 v2;\n\t} policy;\n};\n\nstruct fscrypt_hkdf {\n\tstruct crypto_shash *hmac_tfm;\n};\n\nunion fscrypt_policy {\n\tu8 version;\n\tstruct fscrypt_policy_v1 v1;\n\tstruct fscrypt_policy_v2 v2;\n};\n\nstruct fscrypt_master_key;\n\nstruct fscrypt_inode_info {\n\tstruct fscrypt_prepared_key ci_enc_key;\n\tu8 ci_owns_key: 1;\n\tu8 ci_inlinecrypt: 1;\n\tu8 ci_dirhash_key_initialized: 1;\n\tu8 ci_data_unit_bits;\n\tu8 ci_data_units_per_block_bits;\n\tu32 ci_hashed_ino;\n\tstruct fscrypt_mode *ci_mode;\n\tstruct inode *ci_inode;\n\tstruct fscrypt_master_key *ci_master_key;\n\tstruct list_head ci_master_key_link;\n\tstruct fscrypt_direct_key *ci_direct_key;\n\tsiphash_key_t ci_dirhash_key;\n\tunion fscrypt_policy ci_policy;\n\tu8 ci_nonce[16];\n};\n\nunion fscrypt_iv {\n\tstruct {\n\t\t__le64 index;\n\t\tu8 nonce[16];\n\t};\n\tu8 raw[32];\n\t__le64 dun[4];\n};\n\nstruct fscrypt_key {\n\t__u32 mode;\n\t__u8 raw[64];\n\t__u32 size;\n};\n\nstruct fscrypt_keyring {\n\tspinlock_t lock;\n\tstruct hlist_head key_hashtable[128];\n};\n\nstruct fscrypt_master_key_secret {\n\tstruct fscrypt_hkdf hkdf;\n\tu32 size;\n\tu8 raw[64];\n};\n\nstruct fscrypt_master_key {\n\tstruct hlist_node mk_node;\n\tstruct rw_semaphore mk_sem;\n\trefcount_t mk_active_refs;\n\trefcount_t mk_struct_refs;\n\tstruct callback_head mk_rcu_head;\n\tstruct fscrypt_master_key_secret mk_secret;\n\tstruct fscrypt_key_specifier mk_spec;\n\tstruct key *mk_users;\n\tstruct list_head mk_decrypted_inodes;\n\tspinlock_t mk_decrypted_inodes_lock;\n\tstruct fscrypt_prepared_key mk_direct_keys[11];\n\tstruct fscrypt_prepared_key mk_iv_ino_lblk_64_keys[11];\n\tstruct fscrypt_prepared_key mk_iv_ino_lblk_32_keys[11];\n\tsiphash_key_t mk_ino_hash_key;\n\tbool mk_ino_hash_key_initialized;\n\tbool mk_present;\n};\n\nstruct fscrypt_mode {\n\tconst char *friendly_name;\n\tconst char *cipher_str;\n\tint keysize;\n\tint security_strength;\n\tint ivsize;\n\tint logged_cryptoapi_impl;\n\tint logged_blk_crypto_native;\n\tint logged_blk_crypto_fallback;\n\tenum blk_crypto_mode_num blk_crypto_mode;\n};\n\nstruct fscrypt_name {\n\tconst struct qstr *usr_fname;\n\tstruct fscrypt_str disk_name;\n\tu32 hash;\n\tu32 minor_hash;\n\tstruct fscrypt_str crypto_buf;\n\tbool is_nokey_name;\n};\n\nstruct fscrypt_nokey_name {\n\tu32 dirhash[2];\n\tu8 bytes[149];\n\tu8 sha256[32];\n};\n\nstruct fscrypt_operations {\n\tunsigned int needs_bounce_pages: 1;\n\tunsigned int has_32bit_inodes: 1;\n\tunsigned int supports_subblock_data_units: 1;\n\tconst char *legacy_key_prefix;\n\tint (*get_context)(struct inode *, void *, size_t);\n\tint (*set_context)(struct inode *, const void *, size_t, void *);\n\tconst union fscrypt_policy * (*get_dummy_policy)(struct super_block *);\n\tbool (*empty_dir)(struct inode *);\n\tbool (*has_stable_inodes)(struct super_block *);\n\tstruct block_device ** (*get_devices)(struct super_block *, unsigned int *);\n};\n\nstruct fscrypt_provisioning_key_payload {\n\t__u32 type;\n\t__u32 __reserved;\n\t__u8 raw[0];\n};\n\nstruct fscrypt_remove_key_arg {\n\tstruct fscrypt_key_specifier key_spec;\n\t__u32 removal_status_flags;\n\t__u32 __reserved[5];\n};\n\nstruct fscrypt_symlink_data {\n\t__le16 len;\n\tchar encrypted_path[0];\n};\n\nstruct fsl_mc_obj_desc {\n\tchar type[16];\n\tint id;\n\tu16 vendor;\n\tu16 ver_major;\n\tu16 ver_minor;\n\tu8 irq_count;\n\tu8 region_count;\n\tu32 state;\n\tchar label[16];\n\tu16 flags;\n};\n\nstruct fsl_mc_io;\n\nstruct fsl_mc_device_irq;\n\nstruct fsl_mc_resource;\n\nstruct fsl_mc_device {\n\tstruct device dev;\n\tu64 dma_mask;\n\tu16 flags;\n\tu32 icid;\n\tu16 mc_handle;\n\tstruct fsl_mc_io *mc_io;\n\tstruct fsl_mc_obj_desc obj_desc;\n\tstruct resource *regions;\n\tstruct fsl_mc_device_irq **irqs;\n\tstruct fsl_mc_resource *resource;\n\tstruct device_link *consumer_link;\n\tconst char *driver_override;\n};\n\nstruct fsl_mc_resource_pool;\n\nstruct fsl_mc_resource {\n\tenum fsl_mc_pool_type type;\n\ts32 id;\n\tvoid *data;\n\tstruct fsl_mc_resource_pool *parent_pool;\n\tstruct list_head node;\n};\n\nstruct fsl_mc_device_irq {\n\tunsigned int virq;\n\tstruct fsl_mc_device *mc_dev;\n\tu8 dev_irq_index;\n\tstruct fsl_mc_resource resource;\n};\n\nstruct fsl_mc_io {\n\tstruct device *dev;\n\tu16 flags;\n\tu32 portal_size;\n\tphys_addr_t portal_phys_addr;\n\tvoid *portal_virt_addr;\n\tstruct fsl_mc_device *dpmcp_dev;\n\tunion {\n\t\tstruct mutex mutex;\n\t\traw_spinlock_t spinlock;\n\t};\n};\n\nstruct fsmap {\n\t__u32 fmr_device;\n\t__u32 fmr_flags;\n\t__u64 fmr_physical;\n\t__u64 fmr_owner;\n\t__u64 fmr_offset;\n\t__u64 fmr_length;\n\t__u64 fmr_reserved[3];\n};\n\nstruct fsmap_head {\n\t__u32 fmh_iflags;\n\t__u32 fmh_oflags;\n\t__u32 fmh_count;\n\t__u32 fmh_entries;\n\t__u64 fmh_reserved[6];\n\tstruct fsmap fmh_keys[2];\n\tstruct fsmap fmh_recs[0];\n};\n\nstruct inotify_group_private_data {\n\tspinlock_t idr_lock;\n\tstruct idr idr;\n\tstruct ucounts *ucounts;\n};\n\nstruct fsnotify_ops;\n\nstruct fsnotify_group {\n\tconst struct fsnotify_ops *ops;\n\trefcount_t refcnt;\n\tspinlock_t notification_lock;\n\tstruct list_head notification_list;\n\twait_queue_head_t notification_waitq;\n\tunsigned int q_len;\n\tunsigned int max_events;\n\tenum fsnotify_group_prio priority;\n\tbool shutdown;\n\tint flags;\n\tunsigned int owner_flags;\n\tstruct mutex mark_mutex;\n\tatomic_t user_waits;\n\tstruct list_head marks_list;\n\tstruct fasync_struct *fsn_fa;\n\tstruct fsnotify_event *overflow_event;\n\tstruct mem_cgroup *memcg;\n\tunion {\n\t\tvoid *private;\n\t\tstruct inotify_group_private_data inotify_data;\n\t\tstruct fanotify_group_private_data fanotify_data;\n\t};\n};\n\nstruct fsnotify_iter_info {\n\tstruct fsnotify_mark *marks[5];\n\tstruct fsnotify_group *current_group;\n\tunsigned int report_mask;\n\tint srcu_idx;\n};\n\ntypedef struct fsnotify_mark_connector *fsnotify_connp_t;\n\nstruct fsnotify_mark_connector {\n\tspinlock_t lock;\n\tunsigned char type;\n\tunsigned char prio;\n\tshort unsigned int flags;\n\tunion {\n\t\tvoid *obj;\n\t\tstruct fsnotify_mark_connector *destroy_next;\n\t};\n\tstruct hlist_head list;\n};\n\nstruct fsnotify_ops {\n\tint (*handle_event)(struct fsnotify_group *, u32, const void *, int, struct inode *, const struct qstr *, u32, struct fsnotify_iter_info *);\n\tint (*handle_inode_event)(struct fsnotify_mark *, u32, struct inode *, struct inode *, const struct qstr *, u32);\n\tvoid (*free_group_priv)(struct fsnotify_group *);\n\tvoid (*freeing_mark)(struct fsnotify_mark *, struct fsnotify_group *);\n\tvoid (*free_event)(struct fsnotify_group *, struct fsnotify_event *);\n\tvoid (*free_mark)(struct fsnotify_mark *);\n};\n\nstruct fsnotify_sb_info {\n\tstruct fsnotify_mark_connector *sb_marks;\n\tatomic_long_t watched_objects[3];\n};\n\nstruct fstrim_range {\n\t__u64 start;\n\t__u64 len;\n\t__u64 minlen;\n};\n\nstruct fsuuid {\n\t__u32 fsu_len;\n\t__u32 fsu_flags;\n\t__u8 fsu_uuid[0];\n};\n\nstruct fsuuid2 {\n\t__u8 len;\n\t__u8 uuid[16];\n};\n\nstruct fsverity_descriptor {\n\t__u8 version;\n\t__u8 hash_algorithm;\n\t__u8 log_blocksize;\n\t__u8 salt_size;\n\t__le32 sig_size;\n\t__le64 data_size;\n\t__u8 root_hash[64];\n\t__u8 salt[32];\n\t__u8 __reserved[144];\n\t__u8 signature[0];\n};\n\nstruct fsverity_digest {\n\t__u16 digest_algorithm;\n\t__u16 digest_size;\n\t__u8 digest[0];\n};\n\nstruct fsverity_enable_arg {\n\t__u32 version;\n\t__u32 hash_algorithm;\n\t__u32 block_size;\n\t__u32 salt_size;\n\t__u64 salt_ptr;\n\t__u32 sig_size;\n\t__u32 __reserved1;\n\t__u64 sig_ptr;\n\t__u64 __reserved2[11];\n};\n\nstruct fsverity_formatted_digest {\n\tchar magic[8];\n\t__le16 digest_algorithm;\n\t__le16 digest_size;\n\t__u8 digest[0];\n};\n\nstruct fsverity_hash_alg {\n\tstruct crypto_shash *tfm;\n\tconst char *name;\n\tunsigned int digest_size;\n\tunsigned int block_size;\n\tenum hash_algo algo_id;\n};\n\nstruct merkle_tree_params {\n\tconst struct fsverity_hash_alg *hash_alg;\n\tconst u8 *hashstate;\n\tunsigned int digest_size;\n\tunsigned int block_size;\n\tunsigned int hashes_per_block;\n\tunsigned int blocks_per_page;\n\tu8 log_digestsize;\n\tu8 log_blocksize;\n\tu8 log_arity;\n\tu8 log_blocks_per_page;\n\tunsigned int num_levels;\n\tu64 tree_size;\n\tlong unsigned int tree_pages;\n\tlong unsigned int level_start[8];\n};\n\nstruct fsverity_info {\n\tstruct merkle_tree_params tree_params;\n\tu8 root_hash[64];\n\tu8 file_digest[64];\n\tconst struct inode *inode;\n\tlong unsigned int *hash_block_verified;\n};\n\nstruct fsverity_operations {\n\tint (*begin_enable_verity)(struct file *);\n\tint (*end_enable_verity)(struct file *, const void *, size_t, u64);\n\tint (*get_verity_descriptor)(struct inode *, void *, size_t);\n\tstruct page * (*read_merkle_tree_page)(struct inode *, long unsigned int, long unsigned int);\n\tint (*write_merkle_tree_block)(struct inode *, const void *, u64, unsigned int);\n};\n\nstruct fsverity_read_metadata_arg {\n\t__u64 metadata_type;\n\t__u64 offset;\n\t__u64 length;\n\t__u64 buf_ptr;\n\t__u64 __reserved;\n};\n\nstruct fsxattr {\n\t__u32 fsx_xflags;\n\t__u32 fsx_extsize;\n\t__u32 fsx_nextents;\n\t__u32 fsx_projid;\n\t__u32 fsx_cowextsize;\n\tunsigned char fsx_pad[8];\n};\n\nstruct trace_seq {\n\tchar buffer[8156];\n\tstruct seq_buf seq;\n\tsize_t readpos;\n\tint full;\n};\n\nstruct tracer;\n\nstruct ring_buffer_iter;\n\nstruct trace_iterator {\n\tstruct trace_array *tr;\n\tstruct tracer *trace;\n\tstruct array_buffer *array_buffer;\n\tvoid *private;\n\tint cpu_file;\n\tstruct mutex mutex;\n\tstruct ring_buffer_iter **buffer_iter;\n\tlong unsigned int iter_flags;\n\tvoid *temp;\n\tunsigned int temp_size;\n\tchar *fmt;\n\tunsigned int fmt_size;\n\tatomic_t wait_index;\n\tstruct trace_seq tmp_seq;\n\tcpumask_var_t started;\n\tbool closed;\n\tbool snapshot;\n\tstruct trace_seq seq;\n\tstruct trace_entry *ent;\n\tlong unsigned int lost_events;\n\tint leftover;\n\tint ent_size;\n\tint cpu;\n\tu64 ts;\n\tloff_t pos;\n\tlong int idx;\n};\n\nstruct ftrace_buffer_info {\n\tstruct trace_iterator iter;\n\tvoid *spare;\n\tunsigned int spare_cpu;\n\tunsigned int spare_size;\n\tunsigned int read;\n};\n\nstruct ftrace_entry {\n\tstruct trace_entry ent;\n\tlong unsigned int ip;\n\tlong unsigned int parent_ip;\n};\n\nstruct ftrace_event_field {\n\tstruct list_head link;\n\tconst char *name;\n\tconst char *type;\n\tint filter_type;\n\tint offset;\n\tint size;\n\tunsigned int is_signed: 1;\n\tunsigned int needs_test: 1;\n\tint len;\n};\n\nstruct ftrace_func_command {\n\tstruct list_head list;\n\tchar *name;\n\tint (*func)(struct trace_array *, struct ftrace_hash *, char *, char *, char *, int);\n};\n\nstruct ftrace_func_entry {\n\tstruct hlist_node hlist;\n\tlong unsigned int ip;\n\tlong unsigned int direct;\n};\n\nstruct ftrace_func_map {\n\tstruct ftrace_func_entry entry;\n\tvoid *data;\n};\n\nstruct ftrace_hash {\n\tlong unsigned int size_bits;\n\tstruct hlist_head *buckets;\n\tlong unsigned int count;\n\tlong unsigned int flags;\n\tstruct callback_head rcu;\n};\n\nstruct ftrace_func_mapper {\n\tstruct ftrace_hash hash;\n};\n\nstruct ftrace_probe_ops;\n\nstruct ftrace_func_probe {\n\tstruct ftrace_probe_ops *probe_ops;\n\tstruct ftrace_ops ops;\n\tstruct trace_array *tr;\n\tstruct list_head list;\n\tvoid *data;\n\tint ref;\n};\n\nstruct ftrace_glob {\n\tchar *search;\n\tunsigned int len;\n\tint type;\n};\n\nstruct trace_parser {\n\tbool cont;\n\tchar *buffer;\n\tunsigned int idx;\n\tunsigned int size;\n};\n\nstruct ftrace_graph_data {\n\tstruct ftrace_hash *hash;\n\tstruct ftrace_func_entry *entry;\n\tint idx;\n\tenum graph_filter_type type;\n\tstruct ftrace_hash *new_hash;\n\tconst struct seq_operations *seq_ops;\n\tstruct trace_parser parser;\n};\n\nstruct ftrace_init_func {\n\tstruct list_head list;\n\tlong unsigned int ip;\n};\n\nstruct ftrace_page;\n\nstruct ftrace_iterator {\n\tloff_t pos;\n\tloff_t func_pos;\n\tloff_t mod_pos;\n\tstruct ftrace_page *pg;\n\tstruct dyn_ftrace *func;\n\tstruct ftrace_func_probe *probe;\n\tstruct ftrace_func_entry *probe_entry;\n\tstruct trace_parser parser;\n\tstruct ftrace_hash *hash;\n\tstruct ftrace_ops *ops;\n\tstruct trace_array *tr;\n\tstruct list_head *mod_list;\n\tint pidx;\n\tint idx;\n\tunsigned int flags;\n};\n\nstruct ftrace_mod_func {\n\tstruct list_head list;\n\tchar *name;\n\tlong unsigned int ip;\n\tunsigned int size;\n};\n\nstruct ftrace_mod_load {\n\tstruct list_head list;\n\tchar *func;\n\tchar *module;\n\tint enable;\n};\n\nstruct ftrace_mod_map {\n\tstruct callback_head rcu;\n\tstruct list_head list;\n\tstruct module *mod;\n\tlong unsigned int start_addr;\n\tlong unsigned int end_addr;\n\tstruct list_head funcs;\n\tunsigned int num_funcs;\n};\n\nunion ftrace_op_code_union {\n\tchar code[7];\n\tstruct {\n\t\tchar op[3];\n\t\tint offset;\n\t} __attribute__((packed));\n};\n\nstruct ftrace_page {\n\tstruct ftrace_page *next;\n\tstruct dyn_ftrace *records;\n\tint index;\n\tint order;\n};\n\nstruct ftrace_probe_ops {\n\tvoid (*func)(long unsigned int, long unsigned int, struct trace_array *, struct ftrace_probe_ops *, void *);\n\tint (*init)(struct ftrace_probe_ops *, struct trace_array *, long unsigned int, void *, void **);\n\tvoid (*free)(struct ftrace_probe_ops *, struct trace_array *, long unsigned int, void *);\n\tint (*print)(struct seq_file *, long unsigned int, struct ftrace_probe_ops *, void *);\n};\n\nstruct ftrace_profile {\n\tstruct hlist_node node;\n\tlong unsigned int ip;\n\tlong unsigned int counter;\n\tlong long unsigned int time;\n\tlong long unsigned int time_squared;\n};\n\nstruct ftrace_profile_page {\n\tstruct ftrace_profile_page *next;\n\tlong unsigned int index;\n\tstruct ftrace_profile records[0];\n};\n\ntypedef int (*cmp_func_t)(const void *, const void *);\n\nstruct tracer_stat {\n\tconst char *name;\n\tvoid * (*stat_start)(struct tracer_stat *);\n\tvoid * (*stat_next)(void *, int);\n\tcmp_func_t stat_cmp;\n\tint (*stat_show)(struct seq_file *, void *);\n\tvoid (*stat_release)(void *);\n\tint (*stat_headers)(struct seq_file *);\n};\n\nstruct ftrace_profile_stat {\n\tatomic_t disabled;\n\tstruct hlist_head *hash;\n\tstruct ftrace_profile_page *pages;\n\tstruct ftrace_profile_page *start;\n\tstruct tracer_stat stat;\n};\n\nstruct ftrace_rec_iter {\n\tstruct ftrace_page *pg;\n\tint index;\n};\n\nstruct ftrace_regs {\n\tstruct pt_regs regs;\n};\n\nstruct ftrace_ret_stack {\n\tlong unsigned int ret;\n\tlong unsigned int func;\n\tlong long unsigned int calltime;\n\tlong long unsigned int subtime;\n\tlong unsigned int *retp;\n};\n\nstruct ftrace_stack {\n\tlong unsigned int calls[1024];\n};\n\nstruct ftrace_stacks {\n\tstruct ftrace_stack stacks[4];\n};\n\nstruct func_repeats_entry {\n\tstruct trace_entry ent;\n\tlong unsigned int ip;\n\tlong unsigned int parent_ip;\n\tu16 count;\n\tu16 top_delta_ts;\n\tu32 bottom_delta_ts;\n};\n\nstruct function_filter_data {\n\tstruct ftrace_ops *ops;\n\tint first_filter;\n\tint first_notrace;\n};\n\nstruct fuse_access_in {\n\tuint32_t mask;\n\tuint32_t padding;\n};\n\nstruct fuse_arg {\n\tunsigned int size;\n\tvoid *value;\n};\n\nstruct fuse_in_arg {\n\tunsigned int size;\n\tconst void *value;\n};\n\nstruct fuse_mount;\n\nstruct fuse_args {\n\tuint64_t nodeid;\n\tuint32_t opcode;\n\tuint8_t in_numargs;\n\tuint8_t out_numargs;\n\tuint8_t ext_idx;\n\tbool force: 1;\n\tbool noreply: 1;\n\tbool nocreds: 1;\n\tbool in_pages: 1;\n\tbool out_pages: 1;\n\tbool user_pages: 1;\n\tbool out_argvar: 1;\n\tbool page_zeroing: 1;\n\tbool page_replace: 1;\n\tbool may_block: 1;\n\tbool is_ext: 1;\n\tbool is_pinned: 1;\n\tbool invalidate_vmap: 1;\n\tstruct fuse_in_arg in_args[3];\n\tstruct fuse_arg out_args[2];\n\tvoid (*end)(struct fuse_mount *, struct fuse_args *, int);\n\tvoid *vmap_base;\n};\n\nstruct fuse_page_desc;\n\nstruct fuse_args_pages {\n\tstruct fuse_args args;\n\tstruct page **pages;\n\tstruct fuse_page_desc *descs;\n\tunsigned int num_pages;\n};\n\nstruct fuse_attr {\n\tuint64_t ino;\n\tuint64_t size;\n\tuint64_t blocks;\n\tuint64_t atime;\n\tuint64_t mtime;\n\tuint64_t ctime;\n\tuint32_t atimensec;\n\tuint32_t mtimensec;\n\tuint32_t ctimensec;\n\tuint32_t mode;\n\tuint32_t nlink;\n\tuint32_t uid;\n\tuint32_t gid;\n\tuint32_t rdev;\n\tuint32_t blksize;\n\tuint32_t flags;\n};\n\nstruct fuse_attr_out {\n\tuint64_t attr_valid;\n\tuint32_t attr_valid_nsec;\n\tuint32_t dummy;\n\tstruct fuse_attr attr;\n};\n\nstruct fuse_backing {\n\tstruct file *file;\n\tstruct cred *cred;\n\trefcount_t count;\n\tstruct callback_head rcu;\n};\n\nstruct fuse_backing_map {\n\tint32_t fd;\n\tuint32_t flags;\n\tuint64_t padding;\n};\n\nstruct fuse_batch_forget_in {\n\tuint32_t count;\n\tuint32_t dummy;\n};\n\nstruct fuse_bmap_in {\n\tuint64_t block;\n\tuint32_t blocksize;\n\tuint32_t padding;\n};\n\nstruct fuse_bmap_out {\n\tuint64_t block;\n};\n\nstruct fuse_forget_one {\n\tuint64_t nodeid;\n\tuint64_t nlookup;\n};\n\nstruct fuse_forget_link {\n\tstruct fuse_forget_one forget_one;\n\tstruct fuse_forget_link *next;\n};\n\nstruct fuse_iqueue_ops;\n\nstruct fuse_iqueue {\n\tunsigned int connected;\n\tspinlock_t lock;\n\twait_queue_head_t waitq;\n\tu64 reqctr;\n\tstruct list_head pending;\n\tstruct list_head interrupts;\n\tstruct fuse_forget_link forget_list_head;\n\tstruct fuse_forget_link *forget_list_tail;\n\tint forget_batch;\n\tstruct fasync_struct *fasync;\n\tconst struct fuse_iqueue_ops *ops;\n\tvoid *priv;\n};\n\nstruct fuse_conn_dax;\n\nstruct fuse_sync_bucket;\n\nstruct fuse_conn {\n\tspinlock_t lock;\n\trefcount_t count;\n\tatomic_t dev_count;\n\tstruct callback_head rcu;\n\tkuid_t user_id;\n\tkgid_t group_id;\n\tstruct pid_namespace *pid_ns;\n\tstruct user_namespace *user_ns;\n\tunsigned int max_read;\n\tunsigned int max_write;\n\tunsigned int max_pages;\n\tunsigned int max_pages_limit;\n\tstruct fuse_iqueue iq;\n\tatomic64_t khctr;\n\tstruct rb_root polled_files;\n\tunsigned int max_background;\n\tunsigned int congestion_threshold;\n\tunsigned int num_background;\n\tunsigned int active_background;\n\tstruct list_head bg_queue;\n\tspinlock_t bg_lock;\n\tint initialized;\n\tint blocked;\n\twait_queue_head_t blocked_waitq;\n\tunsigned int connected;\n\tbool aborted;\n\tunsigned int conn_error: 1;\n\tunsigned int conn_init: 1;\n\tunsigned int async_read: 1;\n\tunsigned int abort_err: 1;\n\tunsigned int atomic_o_trunc: 1;\n\tunsigned int export_support: 1;\n\tunsigned int writeback_cache: 1;\n\tunsigned int parallel_dirops: 1;\n\tunsigned int handle_killpriv: 1;\n\tunsigned int cache_symlinks: 1;\n\tunsigned int legacy_opts_show: 1;\n\tunsigned int handle_killpriv_v2: 1;\n\tunsigned int no_open: 1;\n\tunsigned int no_opendir: 1;\n\tunsigned int no_fsync: 1;\n\tunsigned int no_fsyncdir: 1;\n\tunsigned int no_flush: 1;\n\tunsigned int no_setxattr: 1;\n\tunsigned int setxattr_ext: 1;\n\tunsigned int no_getxattr: 1;\n\tunsigned int no_listxattr: 1;\n\tunsigned int no_removexattr: 1;\n\tunsigned int no_lock: 1;\n\tunsigned int no_access: 1;\n\tunsigned int no_create: 1;\n\tunsigned int no_interrupt: 1;\n\tunsigned int no_bmap: 1;\n\tunsigned int no_poll: 1;\n\tunsigned int big_writes: 1;\n\tunsigned int dont_mask: 1;\n\tunsigned int no_flock: 1;\n\tunsigned int no_fallocate: 1;\n\tunsigned int no_rename2: 1;\n\tunsigned int auto_inval_data: 1;\n\tunsigned int explicit_inval_data: 1;\n\tunsigned int do_readdirplus: 1;\n\tunsigned int readdirplus_auto: 1;\n\tunsigned int async_dio: 1;\n\tunsigned int no_lseek: 1;\n\tunsigned int posix_acl: 1;\n\tunsigned int default_permissions: 1;\n\tunsigned int allow_other: 1;\n\tunsigned int no_copy_file_range: 1;\n\tunsigned int destroy: 1;\n\tunsigned int delete_stale: 1;\n\tunsigned int no_control: 1;\n\tunsigned int no_force_umount: 1;\n\tunsigned int auto_submounts: 1;\n\tunsigned int sync_fs: 1;\n\tunsigned int init_security: 1;\n\tunsigned int create_supp_group: 1;\n\tunsigned int inode_dax: 1;\n\tunsigned int no_tmpfile: 1;\n\tunsigned int direct_io_allow_mmap: 1;\n\tunsigned int no_statx: 1;\n\tunsigned int passthrough: 1;\n\tunsigned int use_pages_for_kvec_io: 1;\n\tint max_stack_depth;\n\tatomic_t num_waiting;\n\tunsigned int minor;\n\tstruct list_head entry;\n\tdev_t dev;\n\tstruct dentry *ctl_dentry[5];\n\tint ctl_ndents;\n\tu32 scramble_key[4];\n\tatomic64_t attr_version;\n\tvoid (*release)(struct fuse_conn *);\n\tstruct rw_semaphore killsb;\n\tstruct list_head devices;\n\tenum fuse_dax_mode dax_mode;\n\tstruct fuse_conn_dax *dax;\n\tstruct list_head mounts;\n\tstruct fuse_sync_bucket *curr_bucket;\n\tstruct idr backing_files_map;\n};\n\nstruct fuse_conn_dax {\n\tstruct dax_device *dev;\n\tspinlock_t lock;\n\tlong unsigned int nr_busy_ranges;\n\tstruct list_head busy_ranges;\n\tstruct delayed_work free_work;\n\twait_queue_head_t range_waitq;\n\tlong int nr_free_ranges;\n\tstruct list_head free_ranges;\n\tlong unsigned int nr_ranges;\n};\n\nstruct fuse_copy_file_range_in {\n\tuint64_t fh_in;\n\tuint64_t off_in;\n\tuint64_t nodeid_out;\n\tuint64_t fh_out;\n\tuint64_t off_out;\n\tuint64_t len;\n\tuint64_t flags;\n};\n\nstruct fuse_req;\n\nstruct pipe_buffer;\n\nstruct fuse_copy_state {\n\tint write;\n\tstruct fuse_req *req;\n\tstruct iov_iter *iter;\n\tstruct pipe_buffer *pipebufs;\n\tstruct pipe_buffer *currbuf;\n\tstruct pipe_inode_info *pipe;\n\tlong unsigned int nr_segs;\n\tstruct page *pg;\n\tunsigned int len;\n\tunsigned int offset;\n\tunsigned int move_pages: 1;\n};\n\nstruct fuse_create_in {\n\tuint32_t flags;\n\tuint32_t mode;\n\tuint32_t umask;\n\tuint32_t open_flags;\n};\n\nstruct interval_tree_node {\n\tstruct rb_node rb;\n\tlong unsigned int start;\n\tlong unsigned int last;\n\tlong unsigned int __subtree_last;\n};\n\nstruct fuse_dax_mapping {\n\tstruct inode *inode;\n\tstruct list_head list;\n\tstruct interval_tree_node itn;\n\tstruct list_head busy_list;\n\tu64 window_offset;\n\tloff_t length;\n\tbool writable;\n\trefcount_t refcnt;\n};\n\nstruct fuse_pqueue {\n\tunsigned int connected;\n\tspinlock_t lock;\n\tstruct list_head *processing;\n\tstruct list_head io;\n};\n\nstruct fuse_dev {\n\tstruct fuse_conn *fc;\n\tstruct fuse_pqueue pq;\n\tstruct list_head entry;\n};\n\nstruct fuse_dirent {\n\tuint64_t ino;\n\tuint64_t off;\n\tuint32_t namelen;\n\tuint32_t type;\n\tchar name[0];\n};\n\nstruct fuse_entry_out {\n\tuint64_t nodeid;\n\tuint64_t generation;\n\tuint64_t entry_valid;\n\tuint64_t attr_valid;\n\tuint32_t entry_valid_nsec;\n\tuint32_t attr_valid_nsec;\n\tstruct fuse_attr attr;\n};\n\nstruct fuse_direntplus {\n\tstruct fuse_entry_out entry_out;\n\tstruct fuse_dirent dirent;\n};\n\nstruct fuse_ext_header {\n\tuint32_t size;\n\tuint32_t type;\n};\n\nstruct fuse_fallocate_in {\n\tuint64_t fh;\n\tuint64_t offset;\n\tuint64_t length;\n\tuint32_t mode;\n\tuint32_t padding;\n};\n\nunion fuse_file_args;\n\nstruct fuse_file {\n\tstruct fuse_mount *fm;\n\tunion fuse_file_args *args;\n\tu64 kh;\n\tu64 fh;\n\tu64 nodeid;\n\trefcount_t count;\n\tu32 open_flags;\n\tstruct list_head write_entry;\n\tstruct {\n\t\tloff_t pos;\n\t\tloff_t cache_off;\n\t\tu64 version;\n\t} readdir;\n\tstruct rb_node polled_node;\n\twait_queue_head_t poll_wait;\n\tenum {\n\t\tIOM_NONE = 0,\n\t\tIOM_CACHED = 1,\n\t\tIOM_UNCACHED = 2,\n\t} iomode;\n\tstruct file *passthrough;\n\tconst struct cred *cred;\n\tbool flock: 1;\n};\n\nstruct fuse_open_out {\n\tuint64_t fh;\n\tuint32_t open_flags;\n\tint32_t backing_id;\n};\n\nstruct fuse_release_in {\n\tuint64_t fh;\n\tuint32_t flags;\n\tuint32_t release_flags;\n\tuint64_t lock_owner;\n};\n\nstruct fuse_release_args {\n\tstruct fuse_args args;\n\tstruct fuse_release_in inarg;\n\tstruct inode *inode;\n};\n\nunion fuse_file_args {\n\tstruct fuse_open_out open_outarg;\n\tstruct fuse_release_args release_args;\n};\n\nstruct fuse_file_lock {\n\tuint64_t start;\n\tuint64_t end;\n\tuint32_t type;\n\tuint32_t pid;\n};\n\nstruct fuse_writepage_args;\n\nstruct fuse_fill_wb_data {\n\tstruct fuse_writepage_args *wpa;\n\tstruct fuse_file *ff;\n\tstruct inode *inode;\n\tstruct page **orig_pages;\n\tunsigned int max_pages;\n};\n\nstruct fuse_flush_in {\n\tuint64_t fh;\n\tuint32_t unused;\n\tuint32_t padding;\n\tuint64_t lock_owner;\n};\n\nstruct fuse_forget_in {\n\tuint64_t nlookup;\n};\n\nstruct fuse_fs_context {\n\tint fd;\n\tstruct file *file;\n\tunsigned int rootmode;\n\tkuid_t user_id;\n\tkgid_t group_id;\n\tbool is_bdev: 1;\n\tbool fd_present: 1;\n\tbool rootmode_present: 1;\n\tbool user_id_present: 1;\n\tbool group_id_present: 1;\n\tbool default_permissions: 1;\n\tbool allow_other: 1;\n\tbool destroy: 1;\n\tbool no_control: 1;\n\tbool no_force_umount: 1;\n\tbool legacy_opts_show: 1;\n\tenum fuse_dax_mode dax_mode;\n\tunsigned int max_read;\n\tunsigned int blksize;\n\tconst char *subtype;\n\tstruct dax_device *dax_dev;\n\tvoid **fudptr;\n};\n\nstruct fuse_fsync_in {\n\tuint64_t fh;\n\tuint32_t fsync_flags;\n\tuint32_t padding;\n};\n\nstruct fuse_getattr_in {\n\tuint32_t getattr_flags;\n\tuint32_t dummy;\n\tuint64_t fh;\n};\n\nstruct fuse_getxattr_in {\n\tuint32_t size;\n\tuint32_t padding;\n};\n\nstruct fuse_getxattr_out {\n\tuint32_t size;\n\tuint32_t padding;\n};\n\nstruct fuse_in_header {\n\tuint32_t len;\n\tuint32_t opcode;\n\tuint64_t unique;\n\tuint64_t nodeid;\n\tuint32_t uid;\n\tuint32_t gid;\n\tuint32_t pid;\n\tuint16_t total_extlen;\n\tuint16_t padding;\n};\n\nstruct fuse_init_in {\n\tuint32_t major;\n\tuint32_t minor;\n\tuint32_t max_readahead;\n\tuint32_t flags;\n\tuint32_t flags2;\n\tuint32_t unused[11];\n};\n\nstruct fuse_init_out {\n\tuint32_t major;\n\tuint32_t minor;\n\tuint32_t max_readahead;\n\tuint32_t flags;\n\tuint16_t max_background;\n\tuint16_t congestion_threshold;\n\tuint32_t max_write;\n\tuint32_t time_gran;\n\tuint16_t max_pages;\n\tuint16_t map_alignment;\n\tuint32_t flags2;\n\tuint32_t max_stack_depth;\n\tuint32_t unused[6];\n};\n\nstruct fuse_init_args {\n\tstruct fuse_args args;\n\tstruct fuse_init_in in;\n\tstruct fuse_init_out out;\n};\n\nstruct fuse_inode_dax;\n\nstruct fuse_submount_lookup;\n\nstruct fuse_inode {\n\tstruct inode inode;\n\tu64 nodeid;\n\tu64 nlookup;\n\tstruct fuse_forget_link *forget;\n\tu64 i_time;\n\tu32 inval_mask;\n\tumode_t orig_i_mode;\n\tstruct timespec64 i_btime;\n\tu64 orig_ino;\n\tu64 attr_version;\n\tunion {\n\t\tstruct {\n\t\t\tstruct list_head write_files;\n\t\t\tstruct list_head queued_writes;\n\t\t\tint writectr;\n\t\t\tint iocachectr;\n\t\t\twait_queue_head_t page_waitq;\n\t\t\twait_queue_head_t direct_io_waitq;\n\t\t\tstruct rb_root writepages;\n\t\t};\n\t\tstruct {\n\t\t\tbool cached;\n\t\t\tloff_t size;\n\t\t\tloff_t pos;\n\t\t\tu64 version;\n\t\t\tstruct timespec64 mtime;\n\t\t\tu64 iversion;\n\t\t\tspinlock_t lock;\n\t\t} rdc;\n\t};\n\tlong unsigned int state;\n\tstruct mutex mutex;\n\tspinlock_t lock;\n\tstruct fuse_inode_dax *dax;\n\tstruct fuse_submount_lookup *submount_lookup;\n\tstruct fuse_backing *fb;\n};\n\nstruct fuse_inode_dax {\n\tstruct rw_semaphore sem;\n\tstruct rb_root_cached tree;\n\tlong unsigned int nr;\n};\n\nstruct fuse_inode_handle {\n\tu64 nodeid;\n\tu32 generation;\n};\n\nstruct fuse_interrupt_in {\n\tuint64_t unique;\n};\n\nstruct fuse_read_in {\n\tuint64_t fh;\n\tuint64_t offset;\n\tuint32_t size;\n\tuint32_t read_flags;\n\tuint64_t lock_owner;\n\tuint32_t flags;\n\tuint32_t padding;\n};\n\nstruct fuse_write_in {\n\tuint64_t fh;\n\tuint64_t offset;\n\tuint32_t size;\n\tuint32_t write_flags;\n\tuint64_t lock_owner;\n\tuint32_t flags;\n\tuint32_t padding;\n};\n\nstruct fuse_write_out {\n\tuint32_t size;\n\tuint32_t padding;\n};\n\nstruct fuse_io_priv;\n\nstruct fuse_io_args {\n\tunion {\n\t\tstruct {\n\t\t\tstruct fuse_read_in in;\n\t\t\tu64 attr_ver;\n\t\t} read;\n\t\tstruct {\n\t\t\tstruct fuse_write_in in;\n\t\t\tstruct fuse_write_out out;\n\t\t\tbool page_locked;\n\t\t} write;\n\t};\n\tstruct fuse_args_pages ap;\n\tstruct fuse_io_priv *io;\n\tstruct fuse_file *ff;\n};\n\nstruct fuse_io_priv {\n\tstruct kref refcnt;\n\tint async;\n\tspinlock_t lock;\n\tunsigned int reqs;\n\tssize_t bytes;\n\tsize_t size;\n\t__u64 offset;\n\tbool write;\n\tbool should_dirty;\n\tint err;\n\tstruct kiocb *iocb;\n\tstruct completion *done;\n\tbool blocking;\n};\n\nstruct fuse_ioctl_in {\n\tuint64_t fh;\n\tuint32_t flags;\n\tuint32_t cmd;\n\tuint64_t arg;\n\tuint32_t in_size;\n\tuint32_t out_size;\n};\n\nstruct fuse_ioctl_iovec {\n\tuint64_t base;\n\tuint64_t len;\n};\n\nstruct fuse_ioctl_out {\n\tint32_t result;\n\tuint32_t flags;\n\tuint32_t in_iovs;\n\tuint32_t out_iovs;\n};\n\nstruct fuse_iqueue_ops {\n\tvoid (*wake_forget_and_unlock)(struct fuse_iqueue *);\n\tvoid (*wake_interrupt_and_unlock)(struct fuse_iqueue *);\n\tvoid (*wake_pending_and_unlock)(struct fuse_iqueue *);\n\tvoid (*release)(struct fuse_iqueue *);\n};\n\nstruct fuse_kstatfs {\n\tuint64_t blocks;\n\tuint64_t bfree;\n\tuint64_t bavail;\n\tuint64_t files;\n\tuint64_t ffree;\n\tuint32_t bsize;\n\tuint32_t namelen;\n\tuint32_t frsize;\n\tuint32_t padding;\n\tuint32_t spare[6];\n};\n\nstruct fuse_link_in {\n\tuint64_t oldnodeid;\n};\n\nstruct fuse_lk_in {\n\tuint64_t fh;\n\tuint64_t owner;\n\tstruct fuse_file_lock lk;\n\tuint32_t lk_flags;\n\tuint32_t padding;\n};\n\nstruct fuse_lk_out {\n\tstruct fuse_file_lock lk;\n};\n\nstruct fuse_lseek_in {\n\tuint64_t fh;\n\tuint64_t offset;\n\tuint32_t whence;\n\tuint32_t padding;\n};\n\nstruct fuse_lseek_out {\n\tuint64_t offset;\n};\n\nstruct fuse_mkdir_in {\n\tuint32_t mode;\n\tuint32_t umask;\n};\n\nstruct fuse_mknod_in {\n\tuint32_t mode;\n\tuint32_t rdev;\n\tuint32_t umask;\n\tuint32_t padding;\n};\n\nstruct fuse_mount {\n\tstruct fuse_conn *fc;\n\tstruct super_block *sb;\n\tstruct list_head fc_entry;\n\tstruct callback_head rcu;\n};\n\nstruct fuse_notify_delete_out {\n\tuint64_t parent;\n\tuint64_t child;\n\tuint32_t namelen;\n\tuint32_t padding;\n};\n\nstruct fuse_notify_inval_entry_out {\n\tuint64_t parent;\n\tuint32_t namelen;\n\tuint32_t flags;\n};\n\nstruct fuse_notify_inval_inode_out {\n\tuint64_t ino;\n\tint64_t off;\n\tint64_t len;\n};\n\nstruct fuse_notify_poll_wakeup_out {\n\tuint64_t kh;\n};\n\nstruct fuse_notify_retrieve_in {\n\tuint64_t dummy1;\n\tuint64_t offset;\n\tuint32_t size;\n\tuint32_t dummy2;\n\tuint64_t dummy3;\n\tuint64_t dummy4;\n};\n\nstruct fuse_notify_retrieve_out {\n\tuint64_t notify_unique;\n\tuint64_t nodeid;\n\tuint64_t offset;\n\tuint32_t size;\n\tuint32_t padding;\n};\n\nstruct fuse_notify_store_out {\n\tuint64_t nodeid;\n\tuint64_t offset;\n\tuint32_t size;\n\tuint32_t padding;\n};\n\nstruct fuse_open_in {\n\tuint32_t flags;\n\tuint32_t open_flags;\n};\n\nstruct fuse_out_header {\n\tuint32_t len;\n\tint32_t error;\n\tuint64_t unique;\n};\n\nstruct fuse_page_desc {\n\tunsigned int length;\n\tunsigned int offset;\n};\n\nstruct fuse_poll_in {\n\tuint64_t fh;\n\tuint64_t kh;\n\tuint32_t flags;\n\tuint32_t events;\n};\n\nstruct fuse_poll_out {\n\tuint32_t revents;\n\tuint32_t padding;\n};\n\nstruct fuse_removemapping_in {\n\tuint32_t count;\n};\n\nstruct fuse_removemapping_one {\n\tuint64_t moffset;\n\tuint64_t len;\n};\n\nstruct fuse_rename2_in {\n\tuint64_t newdir;\n\tuint32_t flags;\n\tuint32_t padding;\n};\n\nstruct fuse_req {\n\tstruct list_head list;\n\tstruct list_head intr_entry;\n\tstruct fuse_args *args;\n\trefcount_t count;\n\tlong unsigned int flags;\n\tstruct {\n\t\tstruct fuse_in_header h;\n\t} in;\n\tstruct {\n\t\tstruct fuse_out_header h;\n\t} out;\n\twait_queue_head_t waitq;\n\tvoid *argbuf;\n\tstruct fuse_mount *fm;\n};\n\nstruct fuse_retrieve_args {\n\tstruct fuse_args_pages ap;\n\tstruct fuse_notify_retrieve_in inarg;\n};\n\nstruct fuse_secctx {\n\tuint32_t size;\n\tuint32_t padding;\n};\n\nstruct fuse_secctx_header {\n\tuint32_t size;\n\tuint32_t nr_secctx;\n};\n\nstruct fuse_setattr_in {\n\tuint32_t valid;\n\tuint32_t padding;\n\tuint64_t fh;\n\tuint64_t size;\n\tuint64_t lock_owner;\n\tuint64_t atime;\n\tuint64_t mtime;\n\tuint64_t ctime;\n\tuint32_t atimensec;\n\tuint32_t mtimensec;\n\tuint32_t ctimensec;\n\tuint32_t mode;\n\tuint32_t unused4;\n\tuint32_t uid;\n\tuint32_t gid;\n\tuint32_t unused5;\n};\n\nstruct fuse_setupmapping_in {\n\tuint64_t fh;\n\tuint64_t foffset;\n\tuint64_t len;\n\tuint64_t flags;\n\tuint64_t moffset;\n};\n\nstruct fuse_setxattr_in {\n\tuint32_t size;\n\tuint32_t flags;\n\tuint32_t setxattr_flags;\n\tuint32_t padding;\n};\n\nstruct fuse_statfs_out {\n\tstruct fuse_kstatfs st;\n};\n\nstruct fuse_sx_time {\n\tint64_t tv_sec;\n\tuint32_t tv_nsec;\n\tint32_t __reserved;\n};\n\nstruct fuse_statx {\n\tuint32_t mask;\n\tuint32_t blksize;\n\tuint64_t attributes;\n\tuint32_t nlink;\n\tuint32_t uid;\n\tuint32_t gid;\n\tuint16_t mode;\n\tuint16_t __spare0[1];\n\tuint64_t ino;\n\tuint64_t size;\n\tuint64_t blocks;\n\tuint64_t attributes_mask;\n\tstruct fuse_sx_time atime;\n\tstruct fuse_sx_time btime;\n\tstruct fuse_sx_time ctime;\n\tstruct fuse_sx_time mtime;\n\tuint32_t rdev_major;\n\tuint32_t rdev_minor;\n\tuint32_t dev_major;\n\tuint32_t dev_minor;\n\tuint64_t __spare2[14];\n};\n\nstruct fuse_statx_in {\n\tuint32_t getattr_flags;\n\tuint32_t reserved;\n\tuint64_t fh;\n\tuint32_t sx_flags;\n\tuint32_t sx_mask;\n};\n\nstruct fuse_statx_out {\n\tuint64_t attr_valid;\n\tuint32_t attr_valid_nsec;\n\tuint32_t flags;\n\tuint64_t spare[2];\n\tstruct fuse_statx stat;\n};\n\nstruct fuse_submount_lookup {\n\trefcount_t count;\n\tu64 nodeid;\n\tstruct fuse_forget_link *forget;\n};\n\nstruct fuse_supp_groups {\n\tuint32_t nr_groups;\n\tuint32_t groups[0];\n};\n\nstruct fuse_sync_bucket {\n\tatomic_t count;\n\twait_queue_head_t waitq;\n\tstruct callback_head rcu;\n};\n\nstruct fuse_syncfs_in {\n\tuint64_t padding;\n};\n\nstruct fuse_writepage_args {\n\tstruct fuse_io_args ia;\n\tstruct rb_node writepages_entry;\n\tstruct list_head queue_entry;\n\tstruct fuse_writepage_args *next;\n\tstruct inode *inode;\n\tstruct fuse_sync_bucket *bucket;\n};\n\nstruct futex_hash_bucket {\n\tatomic_t waiters;\n\tspinlock_t lock;\n\tstruct plist_head chain;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n};\n\nunion futex_key {\n\tstruct {\n\t\tu64 i_seq;\n\t\tlong unsigned int pgoff;\n\t\tunsigned int offset;\n\t} shared;\n\tstruct {\n\t\tunion {\n\t\t\tstruct mm_struct *mm;\n\t\t\tu64 __tmp;\n\t\t};\n\t\tlong unsigned int address;\n\t\tunsigned int offset;\n\t} private;\n\tstruct {\n\t\tu64 ptr;\n\t\tlong unsigned int word;\n\t\tunsigned int offset;\n\t} both;\n};\n\nstruct futex_pi_state {\n\tstruct list_head list;\n\tstruct rt_mutex_base pi_mutex;\n\tstruct task_struct *owner;\n\trefcount_t refcount;\n\tunion futex_key key;\n};\n\nstruct wake_q_head;\n\nstruct futex_q;\n\ntypedef void futex_wake_fn(struct wake_q_head *, struct futex_q *);\n\nstruct rt_mutex_waiter;\n\nstruct futex_q {\n\tstruct plist_node list;\n\tstruct task_struct *task;\n\tspinlock_t *lock_ptr;\n\tfutex_wake_fn *wake;\n\tvoid *wake_data;\n\tunion futex_key key;\n\tstruct futex_pi_state *pi_state;\n\tstruct rt_mutex_waiter *rt_waiter;\n\tunion futex_key *requeue_pi_key;\n\tu32 bitset;\n\tatomic_t requeue_state;\n};\n\nstruct futex_waitv {\n\t__u64 val;\n\t__u64 uaddr;\n\t__u32 flags;\n\t__u32 __reserved;\n};\n\nstruct futex_vector {\n\tstruct futex_waitv w;\n\tstruct futex_q q;\n};\n\nstruct fw_cache_entry {\n\tstruct list_head list;\n\tconst char *name;\n};\n\nstruct fw_name_devm {\n\tlong unsigned int magic;\n\tconst char *name;\n};\n\nstruct fw_state {\n\tstruct completion completion;\n\tenum fw_status status;\n};\n\nstruct fw_priv {\n\tstruct kref ref;\n\tstruct list_head list;\n\tstruct firmware_cache *fwc;\n\tstruct fw_state fw_st;\n\tvoid *data;\n\tsize_t size;\n\tsize_t allocated_size;\n\tsize_t offset;\n\tu32 opt_flags;\n\tbool is_paged_buf;\n\tstruct page **pages;\n\tint nr_pages;\n\tint page_array_size;\n\tbool need_uevent;\n\tstruct list_head pending_list;\n\tconst char *fw_name;\n};\n\nstruct fw_rsc_carveout {\n\tu32 da;\n\tu32 pa;\n\tu32 len;\n\tu32 flags;\n\tu32 reserved;\n\tu8 name[32];\n};\n\nstruct fw_rsc_devmem {\n\tu32 da;\n\tu32 pa;\n\tu32 len;\n\tu32 flags;\n\tu32 reserved;\n\tu8 name[32];\n};\n\nstruct fw_rsc_hdr {\n\tu32 type;\n\tu8 data[0];\n};\n\nstruct fw_rsc_trace {\n\tu32 da;\n\tu32 len;\n\tu32 reserved;\n\tu8 name[32];\n};\n\nstruct fw_rsc_vdev_vring {\n\tu32 da;\n\tu32 align;\n\tu32 num;\n\tu32 notifyid;\n\tu32 pa;\n};\n\nstruct fw_rsc_vdev {\n\tu32 id;\n\tu32 notifyid;\n\tu32 dfeatures;\n\tu32 gfeatures;\n\tu32 config_len;\n\tu8 status;\n\tu8 num_of_vrings;\n\tu8 reserved[2];\n\tstruct fw_rsc_vdev_vring vring[0];\n};\n\nstruct fw_sysfs {\n\tbool nowait;\n\tstruct device dev;\n\tstruct fw_priv *fw_priv;\n\tstruct firmware *fw;\n\tvoid *fw_upload_priv;\n};\n\nunion fw_table_header {\n\tstruct acpi_table_header acpi;\n\tstruct acpi_table_cdat cdat;\n};\n\nstruct fw_upload {\n\tvoid *dd_handle;\n\tvoid *priv;\n};\n\nstruct fw_upload_ops {\n\tenum fw_upload_err (*prepare)(struct fw_upload *, const u8 *, u32);\n\tenum fw_upload_err (*write)(struct fw_upload *, const u8 *, u32, u32, u32 *);\n\tenum fw_upload_err (*poll_complete)(struct fw_upload *);\n\tvoid (*cancel)(struct fw_upload *);\n\tvoid (*cleanup)(struct fw_upload *);\n};\n\nstruct fw_upload_priv {\n\tstruct fw_upload *fw_upload;\n\tstruct module *module;\n\tconst char *name;\n\tconst struct fw_upload_ops *ops;\n\tstruct mutex lock;\n\tstruct work_struct work;\n\tconst u8 *data;\n\tu32 remaining_size;\n\tenum fw_upload_prog progress;\n\tenum fw_upload_prog err_progress;\n\tenum fw_upload_err err_code;\n};\n\nunion fwnet_hwaddr {\n\tu8 u[16];\n\tstruct {\n\t\t__be64 uniq_id;\n\t\tu8 max_rec;\n\t\tu8 sspd;\n\t\tu8 fifo[6];\n\t} uc;\n};\n\nstruct fwnode_endpoint {\n\tunsigned int port;\n\tunsigned int id;\n\tconst struct fwnode_handle *local_fwnode;\n};\n\nstruct fwnode_link {\n\tstruct fwnode_handle *supplier;\n\tstruct list_head s_hook;\n\tstruct fwnode_handle *consumer;\n\tstruct list_head c_hook;\n\tu8 flags;\n};\n\nstruct fwnode_reference_args;\n\nstruct fwnode_operations {\n\tstruct fwnode_handle * (*get)(struct fwnode_handle *);\n\tvoid (*put)(struct fwnode_handle *);\n\tbool (*device_is_available)(const struct fwnode_handle *);\n\tconst void * (*device_get_match_data)(const struct fwnode_handle *, const struct device *);\n\tbool (*device_dma_supported)(const struct fwnode_handle *);\n\tenum dev_dma_attr (*device_get_dma_attr)(const struct fwnode_handle *);\n\tbool (*property_present)(const struct fwnode_handle *, const char *);\n\tint (*property_read_int_array)(const struct fwnode_handle *, const char *, unsigned int, void *, size_t);\n\tint (*property_read_string_array)(const struct fwnode_handle *, const char *, const char **, size_t);\n\tconst char * (*get_name)(const struct fwnode_handle *);\n\tconst char * (*get_name_prefix)(const struct fwnode_handle *);\n\tstruct fwnode_handle * (*get_parent)(const struct fwnode_handle *);\n\tstruct fwnode_handle * (*get_next_child_node)(const struct fwnode_handle *, struct fwnode_handle *);\n\tstruct fwnode_handle * (*get_named_child_node)(const struct fwnode_handle *, const char *);\n\tint (*get_reference_args)(const struct fwnode_handle *, const char *, const char *, unsigned int, unsigned int, struct fwnode_reference_args *);\n\tstruct fwnode_handle * (*graph_get_next_endpoint)(const struct fwnode_handle *, struct fwnode_handle *);\n\tstruct fwnode_handle * (*graph_get_remote_endpoint)(const struct fwnode_handle *);\n\tstruct fwnode_handle * (*graph_get_port_parent)(struct fwnode_handle *);\n\tint (*graph_parse_endpoint)(const struct fwnode_handle *, struct fwnode_endpoint *);\n\tvoid * (*iomap)(struct fwnode_handle *, int);\n\tint (*irq_get)(const struct fwnode_handle *, unsigned int);\n\tint (*add_links)(struct fwnode_handle *);\n};\n\nstruct fwnode_reference_args {\n\tstruct fwnode_handle *fwnode;\n\tunsigned int nargs;\n\tu64 args[8];\n};\n\nstruct idt_bits {\n\tu16 ist: 3;\n\tu16 zero: 5;\n\tu16 type: 5;\n\tu16 dpl: 2;\n\tu16 p: 1;\n};\n\nstruct gate_struct {\n\tu16 offset_low;\n\tu16 segment;\n\tstruct idt_bits bits;\n\tu16 offset_middle;\n\tu32 offset_high;\n\tu32 reserved;\n};\n\ntypedef struct gate_struct gate_desc;\n\nstruct gatt_mask {\n\tlong unsigned int mask;\n\tu32 type;\n};\n\nstruct gcm_instance_ctx {\n\tstruct crypto_skcipher_spawn ctr;\n\tstruct crypto_ahash_spawn ghash;\n};\n\nstruct gcr3_tbl_info {\n\tu64 *gcr3_tbl;\n\tint glx;\n\tu32 pasid_cnt;\n\tu16 domid;\n};\n\nstruct gcry_mpi {\n\tint alloced;\n\tint nlimbs;\n\tint nbits;\n\tint sign;\n\tunsigned int flags;\n\tmpi_limb_t *d;\n};\n\nstruct gcry_mpi_point;\n\ntypedef struct gcry_mpi_point *MPI_POINT;\n\nstruct gcry_mpi_point {\n\tMPI x;\n\tMPI y;\n\tMPI z;\n};\n\nstruct gdt_page {\n\tstruct desc_struct gdt[16];\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct pcpu_gen_cookie;\n\nstruct gen_cookie {\n\tstruct pcpu_gen_cookie *local;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tatomic64_t forward_last;\n\tatomic64_t reverse_last;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct gen_pool;\n\ntypedef long unsigned int (*genpool_algo_t)(long unsigned int *, long unsigned int, long unsigned int, unsigned int, void *, struct gen_pool *, long unsigned int);\n\nstruct gen_pool {\n\tspinlock_t lock;\n\tstruct list_head chunks;\n\tint min_alloc_order;\n\tgenpool_algo_t algo;\n\tvoid *data;\n\tconst char *name;\n};\n\nstruct gen_pool_chunk {\n\tstruct list_head next_chunk;\n\tatomic_long_t avail;\n\tphys_addr_t phys_addr;\n\tvoid *owner;\n\tlong unsigned int start_addr;\n\tlong unsigned int end_addr;\n\tlong unsigned int bits[0];\n};\n\nstruct timer_rand_state;\n\nstruct gendisk {\n\tint major;\n\tint first_minor;\n\tint minors;\n\tchar disk_name[32];\n\tshort unsigned int events;\n\tshort unsigned int event_flags;\n\tstruct xarray part_tbl;\n\tstruct block_device *part0;\n\tconst struct block_device_operations *fops;\n\tstruct request_queue *queue;\n\tvoid *private_data;\n\tstruct bio_set bio_split;\n\tint flags;\n\tlong unsigned int state;\n\tstruct mutex open_mutex;\n\tunsigned int open_partitions;\n\tstruct backing_dev_info *bdi;\n\tstruct kobject queue_kobj;\n\tstruct kobject *slave_dir;\n\tstruct list_head slave_bdevs;\n\tstruct timer_rand_state *random;\n\tatomic_t sync_io;\n\tstruct disk_events *ev;\n\tunsigned int nr_zones;\n\tunsigned int zone_capacity;\n\tunsigned int last_zone_capacity;\n\tlong unsigned int *conv_zones_bitmap;\n\tunsigned int zone_wplugs_hash_bits;\n\tspinlock_t zone_wplugs_lock;\n\tstruct mempool_s *zone_wplugs_pool;\n\tstruct hlist_head *zone_wplugs_hash;\n\tstruct workqueue_struct *zone_wplugs_wq;\n\tstruct cdrom_device_info *cdi;\n\tint node_id;\n\tstruct badblocks *bb;\n\tstruct lockdep_map lockdep_map;\n\tu64 diskseq;\n\tblk_mode_t open_mode;\n\tstruct blk_independent_access_ranges *ia_ranges;\n};\n\nstruct gpd_dev_ops {\n\tint (*start)(struct device *);\n\tint (*stop)(struct device *);\n};\n\nstruct genpd_governor_data;\n\nstruct genpd_power_state;\n\nstruct genpd_lock_ops;\n\nstruct generic_pm_domain {\n\tstruct device dev;\n\tstruct dev_pm_domain domain;\n\tstruct list_head gpd_list_node;\n\tstruct list_head parent_links;\n\tstruct list_head child_links;\n\tstruct list_head dev_list;\n\tstruct dev_power_governor *gov;\n\tstruct genpd_governor_data *gd;\n\tstruct work_struct power_off_work;\n\tstruct fwnode_handle *provider;\n\tbool has_provider;\n\tconst char *name;\n\tatomic_t sd_count;\n\tenum gpd_status status;\n\tunsigned int device_count;\n\tunsigned int device_id;\n\tunsigned int suspended_count;\n\tunsigned int prepared_count;\n\tunsigned int performance_state;\n\tcpumask_var_t cpus;\n\tbool synced_poweroff;\n\tint (*power_off)(struct generic_pm_domain *);\n\tint (*power_on)(struct generic_pm_domain *);\n\tstruct raw_notifier_head power_notifiers;\n\tstruct opp_table *opp_table;\n\tint (*set_performance_state)(struct generic_pm_domain *, unsigned int);\n\tstruct gpd_dev_ops dev_ops;\n\tint (*set_hwmode_dev)(struct generic_pm_domain *, struct device *, bool);\n\tbool (*get_hwmode_dev)(struct generic_pm_domain *, struct device *);\n\tint (*attach_dev)(struct generic_pm_domain *, struct device *);\n\tvoid (*detach_dev)(struct generic_pm_domain *, struct device *);\n\tunsigned int flags;\n\tstruct genpd_power_state *states;\n\tvoid (*free_states)(struct genpd_power_state *, unsigned int);\n\tunsigned int state_count;\n\tunsigned int state_idx;\n\tu64 on_time;\n\tu64 accounting_time;\n\tconst struct genpd_lock_ops *lock_ops;\n\tunion {\n\t\tstruct mutex mlock;\n\t\tstruct {\n\t\t\tspinlock_t slock;\n\t\t\tlong unsigned int lock_flags;\n\t\t};\n\t};\n};\n\nstruct pm_domain_data {\n\tstruct list_head list_node;\n\tstruct device *dev;\n};\n\nstruct gpd_timing_data;\n\nstruct generic_pm_domain_data {\n\tstruct pm_domain_data base;\n\tstruct gpd_timing_data *td;\n\tstruct notifier_block nb;\n\tstruct notifier_block *power_nb;\n\tint cpu;\n\tunsigned int performance_state;\n\tunsigned int default_pstate;\n\tunsigned int rpm_pstate;\n\tbool hw_mode;\n\tvoid *data;\n};\n\nstruct geneve_opt {\n\t__be16 opt_class;\n\tu8 type;\n\tu8 length: 5;\n\tu8 r3: 1;\n\tu8 r2: 1;\n\tu8 r1: 1;\n\tu8 opt_data[0];\n};\n\nstruct ocontext;\n\nstruct genfs {\n\tchar *fstype;\n\tstruct ocontext *head;\n\tstruct genfs *next;\n};\n\nstruct netlink_callback;\n\nstruct nla_policy;\n\nstruct genl_split_ops {\n\tunion {\n\t\tstruct {\n\t\t\tint (*pre_doit)(const struct genl_split_ops *, struct sk_buff *, struct genl_info *);\n\t\t\tint (*doit)(struct sk_buff *, struct genl_info *);\n\t\t\tvoid (*post_doit)(const struct genl_split_ops *, struct sk_buff *, struct genl_info *);\n\t\t};\n\t\tstruct {\n\t\t\tint (*start)(struct netlink_callback *);\n\t\t\tint (*dumpit)(struct sk_buff *, struct netlink_callback *);\n\t\t\tint (*done)(struct netlink_callback *);\n\t\t};\n\t};\n\tconst struct nla_policy *policy;\n\tunsigned int maxattr;\n\tu8 cmd;\n\tu8 internal_flags;\n\tu8 flags;\n\tu8 validate;\n};\n\nstruct genlmsghdr;\n\nstruct genl_info {\n\tu32 snd_seq;\n\tu32 snd_portid;\n\tconst struct genl_family *family;\n\tconst struct nlmsghdr *nlhdr;\n\tstruct genlmsghdr *genlhdr;\n\tstruct nlattr **attrs;\n\tpossible_net_t _net;\n\tvoid *user_ptr[2];\n\tstruct netlink_ext_ack *extack;\n};\n\nstruct genl_dumpit_info {\n\tstruct genl_split_ops op;\n\tstruct genl_info info;\n};\n\nstruct genl_ops;\n\nstruct genl_small_ops;\n\nstruct genl_multicast_group;\n\nstruct genl_family {\n\tunsigned int hdrsize;\n\tchar name[16];\n\tunsigned int version;\n\tunsigned int maxattr;\n\tu8 netnsok: 1;\n\tu8 parallel_ops: 1;\n\tu8 n_ops;\n\tu8 n_small_ops;\n\tu8 n_split_ops;\n\tu8 n_mcgrps;\n\tu8 resv_start_op;\n\tconst struct nla_policy *policy;\n\tint (*pre_doit)(const struct genl_split_ops *, struct sk_buff *, struct genl_info *);\n\tvoid (*post_doit)(const struct genl_split_ops *, struct sk_buff *, struct genl_info *);\n\tint (*bind)(int);\n\tvoid (*unbind)(int);\n\tconst struct genl_ops *ops;\n\tconst struct genl_small_ops *small_ops;\n\tconst struct genl_split_ops *split_ops;\n\tconst struct genl_multicast_group *mcgrps;\n\tstruct module *module;\n\tsize_t sock_priv_size;\n\tvoid (*sock_priv_init)(void *);\n\tvoid (*sock_priv_destroy)(void *);\n\tint id;\n\tunsigned int mcgrp_offset;\n\tstruct xarray *sock_privs;\n};\n\nstruct genl_multicast_group {\n\tchar name[16];\n\tu8 flags;\n};\n\nstruct genl_op_iter {\n\tconst struct genl_family *family;\n\tstruct genl_split_ops doit;\n\tstruct genl_split_ops dumpit;\n\tint cmd_idx;\n\tint entry_idx;\n\tu32 cmd;\n\tu8 flags;\n};\n\nstruct genl_ops {\n\tint (*doit)(struct sk_buff *, struct genl_info *);\n\tint (*start)(struct netlink_callback *);\n\tint (*dumpit)(struct sk_buff *, struct netlink_callback *);\n\tint (*done)(struct netlink_callback *);\n\tconst struct nla_policy *policy;\n\tunsigned int maxattr;\n\tu8 cmd;\n\tu8 internal_flags;\n\tu8 flags;\n\tu8 validate;\n};\n\nstruct genl_small_ops {\n\tint (*doit)(struct sk_buff *, struct genl_info *);\n\tint (*dumpit)(struct sk_buff *, struct netlink_callback *);\n\tu8 cmd;\n\tu8 internal_flags;\n\tu8 flags;\n\tu8 validate;\n};\n\nstruct genl_start_context {\n\tconst struct genl_family *family;\n\tstruct nlmsghdr *nlh;\n\tstruct netlink_ext_ack *extack;\n\tconst struct genl_split_ops *ops;\n\tint hdrlen;\n};\n\nstruct genlmsghdr {\n\t__u8 cmd;\n\t__u8 version;\n\t__u16 reserved;\n};\n\nstruct genpd_governor_data {\n\ts64 max_off_time_ns;\n\tbool max_off_time_changed;\n\tktime_t next_wakeup;\n\tktime_t next_hrtimer;\n\tbool cached_power_down_ok;\n\tbool cached_power_down_state_idx;\n};\n\nstruct genpd_lock_ops {\n\tvoid (*lock)(struct generic_pm_domain *);\n\tvoid (*lock_nested)(struct generic_pm_domain *, int);\n\tint (*lock_interruptible)(struct generic_pm_domain *);\n\tvoid (*unlock)(struct generic_pm_domain *);\n};\n\nstruct genpd_power_state {\n\ts64 power_off_latency_ns;\n\ts64 power_on_latency_ns;\n\ts64 residency_ns;\n\tu64 usage;\n\tu64 rejected;\n\tstruct fwnode_handle *fwnode;\n\tu64 idle_time;\n\tvoid *data;\n};\n\nstruct genpool_data_align {\n\tint align;\n};\n\nstruct genpool_data_fixed {\n\tlong unsigned int offset;\n};\n\nstruct genradix_iter {\n\tsize_t offset;\n\tsize_t pos;\n};\n\nstruct genradix_node {\n\tunion {\n\t\tstruct genradix_node *children[64];\n\t\tu8 data[512];\n\t};\n};\n\nstruct getcpu_cache {\n\tlong unsigned int blob[16];\n};\n\nstruct linux_dirent;\n\nstruct getdents_callback {\n\tstruct dir_context ctx;\n\tstruct linux_dirent *current_dir;\n\tint prev_reclen;\n\tint count;\n\tint error;\n};\n\nstruct getdents_callback___2 {\n\tstruct dir_context ctx;\n\tchar *name;\n\tu64 ino;\n\tint found;\n\tint sequence;\n};\n\nstruct linux_dirent64;\n\nstruct getdents_callback64 {\n\tstruct dir_context ctx;\n\tstruct linux_dirent64 *current_dir;\n\tint prev_reclen;\n\tint count;\n\tint error;\n};\n\nstruct getfsmap_info {\n\tstruct super_block *gi_sb;\n\tstruct fsmap_head *gi_data;\n\tunsigned int gi_idx;\n\t__u32 gi_last_flags;\n};\n\nstruct input_keymap_entry {\n\t__u8 flags;\n\t__u8 len;\n\t__u16 index;\n\t__u32 keycode;\n\t__u8 scancode[32];\n};\n\nstruct getset_keycode_data {\n\tstruct input_keymap_entry ke;\n\tint error;\n};\n\nstruct gf128mul_4k {\n\tbe128 t[256];\n};\n\nstruct gf128mul_64k {\n\tstruct gf128mul_4k *t[16];\n};\n\nstruct kvm_memory_slot;\n\nstruct gfn_to_hva_cache {\n\tu64 generation;\n\tgpa_t gpa;\n\tlong unsigned int hva;\n\tlong unsigned int len;\n\tstruct kvm_memory_slot *memslot;\n};\n\nstruct kvm;\n\nstruct gfn_to_pfn_cache {\n\tu64 generation;\n\tgpa_t gpa;\n\tlong unsigned int uhva;\n\tstruct kvm_memory_slot *memslot;\n\tstruct kvm *kvm;\n\tstruct list_head list;\n\trwlock_t lock;\n\tstruct mutex refresh_lock;\n\tvoid *khva;\n\tkvm_pfn_t pfn;\n\tbool active;\n\tbool valid;\n};\n\nstruct ghash_ctx {\n\tstruct gf128mul_4k *gf128;\n};\n\nstruct ghash_desc_ctx {\n\tu8 buffer[16];\n\tu32 bytes;\n};\n\nstruct ghcb_save_area {\n\tu8 reserved_0x0[203];\n\tu8 cpl;\n\tu8 reserved_0xcc[116];\n\tu64 xss;\n\tu8 reserved_0x148[24];\n\tu64 dr7;\n\tu8 reserved_0x168[16];\n\tu64 rip;\n\tu8 reserved_0x180[88];\n\tu64 rsp;\n\tu8 reserved_0x1e0[24];\n\tu64 rax;\n\tu8 reserved_0x200[264];\n\tu64 rcx;\n\tu64 rdx;\n\tu64 rbx;\n\tu8 reserved_0x320[8];\n\tu64 rbp;\n\tu64 rsi;\n\tu64 rdi;\n\tu64 r8;\n\tu64 r9;\n\tu64 r10;\n\tu64 r11;\n\tu64 r12;\n\tu64 r13;\n\tu64 r14;\n\tu64 r15;\n\tu8 reserved_0x380[16];\n\tu64 sw_exit_code;\n\tu64 sw_exit_info_1;\n\tu64 sw_exit_info_2;\n\tu64 sw_scratch;\n\tu8 reserved_0x3b0[56];\n\tu64 xcr0;\n\tu8 valid_bitmap[16];\n\tu64 x87_state_gpa;\n};\n\nstruct ghcb {\n\tstruct ghcb_save_area save;\n\tu8 reserved_save[1016];\n\tu8 shared_buffer[2032];\n\tu8 reserved_0xff0[10];\n\tu16 protocol_version;\n\tu32 ghcb_usage;\n};\n\nstruct ghcb_state {\n\tstruct ghcb *ghcb;\n};\n\nstruct ghes {\n\tunion {\n\t\tstruct acpi_hest_generic *generic;\n\t\tstruct acpi_hest_generic_v2 *generic_v2;\n\t};\n\tstruct acpi_hest_generic_status *estatus;\n\tlong unsigned int flags;\n\tunion {\n\t\tstruct list_head list;\n\t\tstruct timer_list timer;\n\t\tunsigned int irq;\n\t};\n\tstruct device *dev;\n\tstruct list_head elist;\n};\n\nstruct ghes_arr {\n\tstruct platform_device **ghes_devs;\n\tunsigned int count;\n};\n\nstruct ghes_estatus_cache {\n\tu32 estatus_len;\n\tatomic_t count;\n\tstruct acpi_hest_generic *generic;\n\tlong long unsigned int time_in;\n\tstruct callback_head rcu;\n};\n\nstruct ghes_estatus_node {\n\tstruct llist_node llnode;\n\tstruct acpi_hest_generic *generic;\n\tstruct ghes *ghes;\n\tint task_work_cpu;\n\tstruct callback_head task_work;\n};\n\nstruct ghes_hw_desc {\n\tint num_dimms;\n\tstruct dimm_info *dimms;\n};\n\nstruct ghes_pvt {\n\tstruct mem_ctl_info *mci;\n\tchar other_detail[400];\n\tchar msg[80];\n};\n\nstruct ghes_vendor_record_entry {\n\tstruct work_struct work;\n\tint error_severity;\n\tchar vendor_record[0];\n};\n\nstruct giveback_urb_bh {\n\tbool running;\n\tbool high_prio;\n\tspinlock_t lock;\n\tstruct list_head head;\n\tstruct work_struct bh;\n\tstruct usb_host_endpoint *completing_ep;\n};\n\nstruct global_params {\n\tbool no_turbo;\n\tbool turbo_disabled;\n\tint max_perf_pct;\n\tint min_perf_pct;\n};\n\nstruct tc_stats {\n\t__u64 bytes;\n\t__u32 packets;\n\t__u32 drops;\n\t__u32 overlimits;\n\t__u32 bps;\n\t__u32 pps;\n\t__u32 qlen;\n\t__u32 backlog;\n};\n\nstruct gnet_dump {\n\tspinlock_t *lock;\n\tstruct sk_buff *skb;\n\tstruct nlattr *tail;\n\tint compat_tc_stats;\n\tint compat_xstats;\n\tint padattr;\n\tvoid *xstats;\n\tint xstats_len;\n\tstruct tc_stats tc_stats;\n};\n\nstruct gnet_estimator {\n\tsigned char interval;\n\tunsigned char ewma_log;\n};\n\nstruct gnet_stats_basic {\n\t__u64 bytes;\n\t__u32 packets;\n};\n\nstruct gnet_stats_rate_est {\n\t__u32 bps;\n\t__u32 pps;\n};\n\nstruct gnet_stats_rate_est64 {\n\t__u64 bps;\n\t__u64 pps;\n};\n\nstruct gntab_unmap_queue_data;\n\ntypedef void (*gnttab_unmap_refs_done)(int, struct gntab_unmap_queue_data *);\n\nstruct gnttab_unmap_grant_ref;\n\nstruct gntab_unmap_queue_data {\n\tstruct delayed_work gnttab_work;\n\tvoid *data;\n\tgnttab_unmap_refs_done done;\n\tstruct gnttab_unmap_grant_ref *unmap_ops;\n\tstruct gnttab_unmap_grant_ref *kunmap_ops;\n\tstruct page **pages;\n\tunsigned int count;\n\tunsigned int age;\n};\n\nstruct gnttab_copy_ptr {\n\tunion {\n\t\tgrant_ref_t ref;\n\t\txen_pfn_t gmfn;\n\t} u;\n\tdomid_t domid;\n\tuint16_t offset;\n};\n\nstruct gnttab_copy {\n\tstruct gnttab_copy_ptr source;\n\tstruct gnttab_copy_ptr dest;\n\tuint16_t len;\n\tuint16_t flags;\n\tint16_t status;\n};\n\nstruct gnttab_dma_alloc_args {\n\tstruct device *dev;\n\tbool coherent;\n\tint nr_pages;\n\tstruct page **pages;\n\txen_pfn_t *frames;\n\tvoid *vaddr;\n\tdma_addr_t dev_bus_addr;\n};\n\nstruct gnttab_get_status_frames {\n\tuint32_t nr_frames;\n\tdomid_t dom;\n\tint16_t status;\n\t__guest_handle_uint64_t frame_list;\n};\n\nstruct gnttab_map_grant_ref {\n\tuint64_t host_addr;\n\tuint32_t flags;\n\tgrant_ref_t ref;\n\tdomid_t dom;\n\tint16_t status;\n\tgrant_handle_t handle;\n\tuint64_t dev_bus_addr;\n};\n\nstruct gnttab_ops {\n\tunsigned int version;\n\tunsigned int grefs_per_grant_frame;\n\tint (*map_frames)(xen_pfn_t *, unsigned int);\n\tvoid (*unmap_frames)(void);\n\tvoid (*update_entry)(grant_ref_t, domid_t, long unsigned int, unsigned int);\n\tint (*end_foreign_access_ref)(grant_ref_t);\n\tlong unsigned int (*read_frame)(grant_ref_t);\n};\n\nstruct gnttab_page_cache {\n\tspinlock_t lock;\n\tstruct page *pages;\n\tunsigned int num_pages;\n};\n\nstruct gnttab_query_size {\n\tdomid_t dom;\n\tuint32_t nr_frames;\n\tuint32_t max_nr_frames;\n\tint16_t status;\n};\n\nstruct gnttab_set_version {\n\tuint32_t version;\n};\n\nstruct gnttab_setup_table {\n\tdomid_t dom;\n\tuint32_t nr_frames;\n\tint16_t status;\n\t__guest_handle_xen_pfn_t frame_list;\n};\n\nstruct gnttab_unmap_grant_ref {\n\tuint64_t host_addr;\n\tuint64_t dev_bus_addr;\n\tgrant_handle_t handle;\n\tint16_t status;\n};\n\nstruct gnttab_vm_area {\n\tstruct vm_struct *area;\n\tpte_t **ptes;\n\tint idx;\n};\n\nstruct governor_attr {\n\tstruct attribute attr;\n\tssize_t (*show)(struct gov_attr_set *, char *);\n\tssize_t (*store)(struct gov_attr_set *, const char *, size_t);\n};\n\nstruct watchdog_governor;\n\nstruct governor_priv {\n\tstruct watchdog_governor *gov;\n\tstruct list_head entry;\n};\n\nstruct gpd_link {\n\tstruct generic_pm_domain *parent;\n\tstruct list_head parent_node;\n\tstruct generic_pm_domain *child;\n\tstruct list_head child_node;\n\tunsigned int performance_state;\n\tunsigned int prev_performance_state;\n};\n\nstruct gpd_timing_data {\n\ts64 suspend_latency_ns;\n\ts64 resume_latency_ns;\n\ts64 effective_constraint_ns;\n\tktime_t next_wakeup;\n\tbool constraint_changed;\n\tbool cached_suspend_ok;\n};\n\nstruct gpio_array {\n\tstruct gpio_desc **desc;\n\tunsigned int size;\n\tstruct gpio_chip *chip;\n\tlong unsigned int *get_mask;\n\tlong unsigned int *set_mask;\n\tlong unsigned int invert_mask[0];\n};\n\nstruct gpio_v2_line_attribute {\n\t__u32 id;\n\t__u32 padding;\n\tunion {\n\t\t__u64 flags;\n\t\t__u64 values;\n\t\t__u32 debounce_period_us;\n\t};\n};\n\nstruct gpio_v2_line_info {\n\tchar name[32];\n\tchar consumer[32];\n\t__u32 offset;\n\t__u32 num_attrs;\n\t__u64 flags;\n\tstruct gpio_v2_line_attribute attrs[10];\n\t__u32 padding[4];\n};\n\nstruct gpio_v2_line_info_changed {\n\tstruct gpio_v2_line_info info;\n\t__u64 timestamp_ns;\n\t__u32 event_type;\n\t__u32 padding[5];\n};\n\nstruct gpio_chardev_data {\n\tstruct gpio_device *gdev;\n\twait_queue_head_t wait;\n\tstruct {\n\t\tunion {\n\t\t\tstruct __kfifo kfifo;\n\t\t\tstruct gpio_v2_line_info_changed *type;\n\t\t\tconst struct gpio_v2_line_info_changed *const_type;\n\t\t\tchar (*rectype)[0];\n\t\t\tstruct gpio_v2_line_info_changed *ptr;\n\t\t\tconst struct gpio_v2_line_info_changed *ptr_const;\n\t\t};\n\t\tstruct gpio_v2_line_info_changed buf[32];\n\t} events;\n\tstruct notifier_block lineinfo_changed_nb;\n\tstruct notifier_block device_unregistered_nb;\n\tlong unsigned int *watched_lines;\n\tatomic_t watch_abi_version;\n};\n\nstruct gpio_chip_guard {\n\tstruct gpio_device *gdev;\n\tstruct gpio_chip *gc;\n\tint idx;\n};\n\ntypedef struct gpio_chip_guard class_gpio_chip_guard_t;\n\nstruct gpio_desc_label;\n\nstruct gpio_desc {\n\tstruct gpio_device *gdev;\n\tlong unsigned int flags;\n\tstruct gpio_desc_label *label;\n\tconst char *name;\n};\n\nstruct gpio_desc_label {\n\tstruct callback_head rh;\n\tchar str[0];\n};\n\nstruct gpio_descs {\n\tstruct gpio_array *info;\n\tunsigned int ndescs;\n\tstruct gpio_desc *desc[0];\n};\n\nstruct gpio_device {\n\tstruct device dev;\n\tstruct cdev chrdev;\n\tint id;\n\tstruct device *mockdev;\n\tstruct module *owner;\n\tstruct gpio_chip *chip;\n\tstruct gpio_desc *descs;\n\tstruct srcu_struct desc_srcu;\n\tunsigned int base;\n\tu16 ngpio;\n\tbool can_sleep;\n\tconst char *label;\n\tvoid *data;\n\tstruct list_head list;\n\tstruct blocking_notifier_head line_state_notifier;\n\tstruct blocking_notifier_head device_notifier;\n\tstruct srcu_struct srcu;\n\tstruct list_head pin_ranges;\n};\n\nstruct irq_fwspec {\n\tstruct fwnode_handle *fwnode;\n\tint param_count;\n\tu32 param[16];\n};\n\nstruct ioapic_alloc_info {\n\tint pin;\n\tint node;\n\tu32 is_level: 1;\n\tu32 active_low: 1;\n\tu32 valid: 1;\n};\n\nstruct uv_alloc_info {\n\tint limit;\n\tint blade;\n\tlong unsigned int offset;\n\tchar *name;\n};\n\nstruct msi_desc;\n\nstruct irq_alloc_info {\n\tenum irq_alloc_type type;\n\tu32 flags;\n\tu32 devid;\n\tirq_hw_number_t hwirq;\n\tconst struct cpumask *mask;\n\tstruct msi_desc *desc;\n\tvoid *data;\n\tunion {\n\t\tstruct ioapic_alloc_info ioapic;\n\t\tstruct uv_alloc_info uv;\n\t};\n};\n\ntypedef struct irq_alloc_info msi_alloc_info_t;\n\nunion gpio_irq_fwspec {\n\tstruct irq_fwspec fwspec;\n\tmsi_alloc_info_t msiinfo;\n};\n\nstruct pinctrl_gpio_range {\n\tstruct list_head node;\n\tconst char *name;\n\tunsigned int id;\n\tunsigned int base;\n\tunsigned int pin_base;\n\tunsigned int npins;\n\tconst unsigned int *pins;\n\tstruct gpio_chip *gc;\n};\n\nstruct gpio_pin_range {\n\tstruct list_head node;\n\tstruct pinctrl_dev *pctldev;\n\tstruct pinctrl_gpio_range range;\n};\n\nstruct gpio_v2_line_config_attribute {\n\tstruct gpio_v2_line_attribute attr;\n\t__u64 mask;\n};\n\nstruct gpio_v2_line_config {\n\t__u64 flags;\n\t__u32 num_attrs;\n\t__u32 padding[5];\n\tstruct gpio_v2_line_config_attribute attrs[10];\n};\n\nstruct gpio_v2_line_event {\n\t__u64 timestamp_ns;\n\t__u32 id;\n\t__u32 offset;\n\t__u32 seqno;\n\t__u32 line_seqno;\n\t__u32 padding[6];\n};\n\nstruct gpio_v2_line_request {\n\t__u32 offsets[64];\n\tchar consumer[32];\n\tstruct gpio_v2_line_config config;\n\t__u32 num_lines;\n\t__u32 event_buffer_size;\n\t__u32 padding[5];\n\t__s32 fd;\n};\n\nstruct gpio_v2_line_values {\n\t__u64 bits;\n\t__u64 mask;\n};\n\nstruct gpiochip_info {\n\tchar name[32];\n\tchar label[32];\n\t__u32 lines;\n};\n\nstruct gpiod_data {\n\tstruct gpio_desc *desc;\n\tstruct mutex mutex;\n\tstruct kernfs_node *value_kn;\n\tint irq;\n\tunsigned char irq_flags;\n\tbool direction_can_change;\n};\n\nstruct gpiod_hog {\n\tstruct list_head list;\n\tconst char *chip_label;\n\tu16 chip_hwnum;\n\tconst char *line_name;\n\tlong unsigned int lflags;\n\tint dflags;\n};\n\nstruct gpiod_lookup {\n\tconst char *key;\n\tu16 chip_hwnum;\n\tconst char *con_id;\n\tunsigned int idx;\n\tlong unsigned int flags;\n};\n\nstruct gpiod_lookup_table {\n\tstruct list_head list;\n\tconst char *dev_id;\n\tstruct gpiod_lookup table[0];\n};\n\nstruct gpioevent_data {\n\t__u64 timestamp;\n\t__u32 id;\n};\n\nstruct gpioevent_request {\n\t__u32 lineoffset;\n\t__u32 handleflags;\n\t__u32 eventflags;\n\tchar consumer_label[32];\n\tint fd;\n};\n\nstruct gpiohandle_config {\n\t__u32 flags;\n\t__u8 default_values[64];\n\t__u32 padding[4];\n};\n\nstruct gpiohandle_data {\n\t__u8 values[64];\n};\n\nstruct gpiohandle_request {\n\t__u32 lineoffsets[64];\n\t__u32 flags;\n\t__u8 default_values[64];\n\tchar consumer_label[32];\n\t__u32 lines;\n\tint fd;\n};\n\nstruct gpiolib_seq_priv {\n\tbool newline;\n\tint idx;\n};\n\nstruct gpioline_info {\n\t__u32 line_offset;\n\t__u32 flags;\n\tchar name[32];\n\tchar consumer[32];\n};\n\nstruct gpioline_info_changed {\n\tstruct gpioline_info info;\n\t__u64 timestamp;\n\t__u32 event_type;\n\t__u32 padding[5];\n};\n\nstruct grant {\n\tgrant_ref_t gref;\n\tstruct page *page;\n\tstruct list_head node;\n};\n\nstruct grant_entry_header {\n\tuint16_t flags;\n\tdomid_t domid;\n};\n\nstruct grant_entry_v1 {\n\tuint16_t flags;\n\tdomid_t domid;\n\tuint32_t frame;\n};\n\nunion grant_entry_v2 {\n\tstruct grant_entry_header hdr;\n\tstruct {\n\t\tstruct grant_entry_header hdr;\n\t\tuint32_t pad0;\n\t\tuint64_t frame;\n\t} full_page;\n\tstruct {\n\t\tstruct grant_entry_header hdr;\n\t\tuint16_t page_off;\n\t\tuint16_t length;\n\t\tuint64_t frame;\n\t} sub_page;\n\tstruct {\n\t\tstruct grant_entry_header hdr;\n\t\tdomid_t trans_domid;\n\t\tuint16_t pad0;\n\t\tgrant_ref_t gref;\n\t} transitive;\n\tuint32_t __spacer[4];\n};\n\nstruct grant_frames {\n\txen_pfn_t *pfn;\n\tunsigned int count;\n\tvoid *vaddr;\n};\n\nstruct gre_base_hdr {\n\t__be16 flags;\n\t__be16 protocol;\n};\n\nstruct gre_full_hdr {\n\tstruct gre_base_hdr fixed_header;\n\t__be16 csum;\n\t__be16 reserved1;\n\t__be32 key;\n\t__be32 seq;\n};\n\nstruct gro_list {\n\tstruct list_head list;\n\tint count;\n};\n\nstruct napi_struct {\n\tstruct list_head poll_list;\n\tlong unsigned int state;\n\tint weight;\n\tu32 defer_hard_irqs_count;\n\tlong unsigned int gro_bitmask;\n\tint (*poll)(struct napi_struct *, int);\n\tint poll_owner;\n\tint list_owner;\n\tstruct net_device *dev;\n\tstruct gro_list gro_hash[8];\n\tstruct sk_buff *skb;\n\tstruct list_head rx_list;\n\tint rx_count;\n\tunsigned int napi_id;\n\tstruct hrtimer timer;\n\tstruct task_struct *thread;\n\tstruct list_head dev_list;\n\tstruct hlist_node napi_hash_node;\n\tint irq;\n};\n\nstruct gro_cell {\n\tstruct sk_buff_head napi_skbs;\n\tstruct napi_struct napi;\n};\n\nstruct gro_cells {\n\tstruct gro_cell *cells;\n};\n\nstruct group_device {\n\tstruct list_head list;\n\tstruct device *dev;\n\tchar *name;\n};\n\nstruct group_filter {\n\tunion {\n\t\tstruct {\n\t\t\t__u32 gf_interface_aux;\n\t\t\tstruct __kernel_sockaddr_storage gf_group_aux;\n\t\t\t__u32 gf_fmode_aux;\n\t\t\t__u32 gf_numsrc_aux;\n\t\t\tstruct __kernel_sockaddr_storage gf_slist[1];\n\t\t};\n\t\tstruct {\n\t\t\t__u32 gf_interface;\n\t\t\tstruct __kernel_sockaddr_storage gf_group;\n\t\t\t__u32 gf_fmode;\n\t\t\t__u32 gf_numsrc;\n\t\t\tstruct __kernel_sockaddr_storage gf_slist_flex[0];\n\t\t};\n\t};\n};\n\nstruct group_for_pci_data {\n\tstruct pci_dev *pdev;\n\tstruct iommu_group *group;\n};\n\nstruct group_info {\n\trefcount_t usage;\n\tint ngroups;\n\tkgid_t gid[0];\n};\n\nstruct group_req {\n\t__u32 gr_interface;\n\tstruct __kernel_sockaddr_storage gr_group;\n};\n\nstruct group_source_req {\n\t__u32 gsr_interface;\n\tstruct __kernel_sockaddr_storage gsr_group;\n\tstruct __kernel_sockaddr_storage gsr_source;\n};\n\nstruct gsb_buffer {\n\tu8 status;\n\tu8 len;\n\tunion {\n\t\tu16 wdata;\n\t\tu8 bdata;\n\t\tstruct {\n\t\t\tstruct {} __empty_data;\n\t\t\tu8 data[0];\n\t\t};\n\t};\n};\n\nstruct rpcsec_gss_oid {\n\tunsigned int len;\n\tu8 data[32];\n};\n\nstruct gss_api_ops;\n\nstruct pf_desc;\n\nstruct gss_api_mech {\n\tstruct list_head gm_list;\n\tstruct module *gm_owner;\n\tstruct rpcsec_gss_oid gm_oid;\n\tchar *gm_name;\n\tconst struct gss_api_ops *gm_ops;\n\tint gm_pf_num;\n\tstruct pf_desc *gm_pfs;\n\tconst char *gm_upcall_enctypes;\n};\n\nstruct gss_ctx;\n\nstruct xdr_buf;\n\nstruct xdr_netobj;\n\nstruct gss_api_ops {\n\tint (*gss_import_sec_context)(const void *, size_t, struct gss_ctx *, time64_t *, gfp_t);\n\tu32 (*gss_get_mic)(struct gss_ctx *, struct xdr_buf *, struct xdr_netobj *);\n\tu32 (*gss_verify_mic)(struct gss_ctx *, struct xdr_buf *, struct xdr_netobj *);\n\tu32 (*gss_wrap)(struct gss_ctx *, int, struct xdr_buf *, struct page **);\n\tu32 (*gss_unwrap)(struct gss_ctx *, int, int, struct xdr_buf *);\n\tvoid (*gss_delete_sec_context)(void *);\n};\n\nstruct gss_ctx {\n\tstruct gss_api_mech *mech_type;\n\tvoid *internal_ctx_id;\n\tunsigned int slack;\n\tunsigned int align;\n};\n\nstruct h_misc {\n\tlong unsigned int ino;\n\t__u32 generation;\n\tuid_t uid;\n\tgid_t gid;\n\tumode_t mode;\n};\n\nunion handle_parts {\n\tdepot_stack_handle_t handle;\n\tstruct {\n\t\tu32 pool_index_plus_1: 17;\n\t\tu32 offset: 10;\n\t\tu32 extra: 5;\n\t};\n};\n\nstruct handle_to_path_ctx {\n\tstruct path root;\n\tenum handle_to_path_flags flags;\n\tunsigned int fh_flags;\n};\n\nstruct handshake_net {\n\tspinlock_t hn_lock;\n\tint hn_pending;\n\tint hn_pending_max;\n\tstruct list_head hn_requests;\n\tlong unsigned int hn_flags;\n};\n\nstruct handshake_req;\n\nstruct handshake_proto {\n\tint hp_handler_class;\n\tsize_t hp_privsize;\n\tlong unsigned int hp_flags;\n\tint (*hp_accept)(struct handshake_req *, struct genl_info *, int);\n\tvoid (*hp_done)(struct handshake_req *, unsigned int, struct genl_info *);\n\tvoid (*hp_destroy)(struct handshake_req *);\n};\n\nstruct handshake_req {\n\tstruct list_head hr_list;\n\tstruct rhash_head hr_rhash;\n\tlong unsigned int hr_flags;\n\tconst struct handshake_proto *hr_proto;\n\tstruct sock *hr_sk;\n\tvoid (*hr_odestruct)(struct sock *);\n\tchar hr_priv[0];\n};\n\nstruct hash {\n\tint ino;\n\tint minor;\n\tint major;\n\tumode_t mode;\n\tstruct hash *next;\n\tchar name[4098];\n};\n\nstruct hash_cell {\n\tstruct rb_node name_node;\n\tstruct rb_node uuid_node;\n\tbool name_set;\n\tbool uuid_set;\n\tchar *name;\n\tchar *uuid;\n\tstruct mapped_device *md;\n\tstruct dm_table *new_map;\n};\n\nstruct hashtab_key_params {\n\tu32 (*hash)(const void *);\n\tint (*cmp)(const void *, const void *);\n};\n\nstruct hashtab_node {\n\tvoid *key;\n\tvoid *datum;\n\tstruct hashtab_node *next;\n};\n\nstruct hc_driver {\n\tconst char *description;\n\tconst char *product_desc;\n\tsize_t hcd_priv_size;\n\tirqreturn_t (*irq)(struct usb_hcd *);\n\tint flags;\n\tint (*reset)(struct usb_hcd *);\n\tint (*start)(struct usb_hcd *);\n\tint (*pci_suspend)(struct usb_hcd *, bool);\n\tint (*pci_resume)(struct usb_hcd *, pm_message_t);\n\tint (*pci_poweroff_late)(struct usb_hcd *, bool);\n\tvoid (*stop)(struct usb_hcd *);\n\tvoid (*shutdown)(struct usb_hcd *);\n\tint (*get_frame_number)(struct usb_hcd *);\n\tint (*urb_enqueue)(struct usb_hcd *, struct urb *, gfp_t);\n\tint (*urb_dequeue)(struct usb_hcd *, struct urb *, int);\n\tint (*map_urb_for_dma)(struct usb_hcd *, struct urb *, gfp_t);\n\tvoid (*unmap_urb_for_dma)(struct usb_hcd *, struct urb *);\n\tvoid (*endpoint_disable)(struct usb_hcd *, struct usb_host_endpoint *);\n\tvoid (*endpoint_reset)(struct usb_hcd *, struct usb_host_endpoint *);\n\tint (*hub_status_data)(struct usb_hcd *, char *);\n\tint (*hub_control)(struct usb_hcd *, u16, u16, u16, char *, u16);\n\tint (*bus_suspend)(struct usb_hcd *);\n\tint (*bus_resume)(struct usb_hcd *);\n\tint (*start_port_reset)(struct usb_hcd *, unsigned int);\n\tlong unsigned int (*get_resuming_ports)(struct usb_hcd *);\n\tvoid (*relinquish_port)(struct usb_hcd *, int);\n\tint (*port_handed_over)(struct usb_hcd *, int);\n\tvoid (*clear_tt_buffer_complete)(struct usb_hcd *, struct usb_host_endpoint *);\n\tint (*alloc_dev)(struct usb_hcd *, struct usb_device *);\n\tvoid (*free_dev)(struct usb_hcd *, struct usb_device *);\n\tint (*alloc_streams)(struct usb_hcd *, struct usb_device *, struct usb_host_endpoint **, unsigned int, unsigned int, gfp_t);\n\tint (*free_streams)(struct usb_hcd *, struct usb_device *, struct usb_host_endpoint **, unsigned int, gfp_t);\n\tint (*add_endpoint)(struct usb_hcd *, struct usb_device *, struct usb_host_endpoint *);\n\tint (*drop_endpoint)(struct usb_hcd *, struct usb_device *, struct usb_host_endpoint *);\n\tint (*check_bandwidth)(struct usb_hcd *, struct usb_device *);\n\tvoid (*reset_bandwidth)(struct usb_hcd *, struct usb_device *);\n\tint (*address_device)(struct usb_hcd *, struct usb_device *, unsigned int);\n\tint (*enable_device)(struct usb_hcd *, struct usb_device *);\n\tint (*update_hub_device)(struct usb_hcd *, struct usb_device *, struct usb_tt *, gfp_t);\n\tint (*reset_device)(struct usb_hcd *, struct usb_device *);\n\tint (*update_device)(struct usb_hcd *, struct usb_device *);\n\tint (*set_usb2_hw_lpm)(struct usb_hcd *, struct usb_device *, int);\n\tint (*enable_usb3_lpm_timeout)(struct usb_hcd *, struct usb_device *, enum usb3_link_state);\n\tint (*disable_usb3_lpm_timeout)(struct usb_hcd *, struct usb_device *, enum usb3_link_state);\n\tint (*find_raw_port_number)(struct usb_hcd *, int);\n\tint (*port_power)(struct usb_hcd *, int, bool);\n\tint (*submit_single_step_set_feature)(struct usb_hcd *, struct urb *, int);\n};\n\nstruct hd_geometry {\n\tunsigned char heads;\n\tunsigned char sectors;\n\tshort unsigned int cylinders;\n\tlong unsigned int start;\n};\n\nstruct header_iter {\n\tstruct pci_dev *dev;\n};\n\nstruct hh_cache;\n\nstruct header_ops {\n\tint (*create)(struct sk_buff *, struct net_device *, short unsigned int, const void *, const void *, unsigned int);\n\tint (*parse)(const struct sk_buff *, unsigned char *);\n\tint (*cache)(const struct neighbour *, struct hh_cache *, __be16);\n\tvoid (*cache_update)(struct hh_cache *, const struct net_device *, const unsigned char *);\n\tbool (*validate)(const char *, unsigned int);\n\t__be16 (*parse_protocol)(const struct sk_buff *);\n};\n\nstruct hfi_cpu_data {\n\tu8 perf_cap;\n\tu8 ee_cap;\n};\n\nstruct hfi_instance;\n\nstruct hfi_cpu_info {\n\ts16 index;\n\tstruct hfi_instance *hfi_instance;\n};\n\nstruct hfi_features {\n\tsize_t nr_table_pages;\n\tunsigned int cpu_stride;\n\tunsigned int hdr_size;\n};\n\nstruct hfi_instance {\n\tunion {\n\t\tvoid *local_table;\n\t\tu64 *timestamp;\n\t};\n\tvoid *hdr;\n\tvoid *data;\n\tcpumask_var_t cpus;\n\tvoid *hw_table;\n\tstruct delayed_work update_work;\n\traw_spinlock_t table_lock;\n\traw_spinlock_t event_lock;\n};\n\nstruct hh_cache {\n\tunsigned int hh_len;\n\tseqlock_t hh_lock;\n\tlong unsigned int hh_data[16];\n};\n\nstruct hib_bio_batch {\n\tatomic_t count;\n\twait_queue_head_t wait;\n\tblk_status_t error;\n\tstruct blk_plug plug;\n};\n\nstruct hid_bpf {\n\tu8 *device_data;\n\tu32 allocated_data;\n\tbool destroyed;\n\tstruct hid_bpf_ops *rdesc_ops;\n\tstruct list_head prog_list;\n\tstruct mutex prog_list_lock;\n\tstruct srcu_struct srcu;\n};\n\nstruct hid_bpf_ctx {\n\tstruct hid_device *hid;\n\t__u32 allocated_size;\n\tunion {\n\t\t__s32 retval;\n\t\t__s32 size;\n\t};\n};\n\nstruct hid_bpf_ctx_kern {\n\tstruct hid_bpf_ctx ctx;\n\tu8 *data;\n\tbool from_bpf;\n};\n\nstruct hid_bpf_offset_write_range {\n\tconst char *struct_name;\n\tu32 struct_length;\n\tu32 start;\n\tu32 end;\n};\n\nstruct hid_collection {\n\tint parent_idx;\n\tunsigned int type;\n\tunsigned int usage;\n\tunsigned int level;\n};\n\nstruct hid_report;\n\nstruct hid_report_enum {\n\tunsigned int numbered;\n\tstruct list_head report_list;\n\tstruct hid_report *report_id_hash[256];\n};\n\nstruct semaphore {\n\traw_spinlock_t lock;\n\tunsigned int count;\n\tstruct list_head wait_list;\n};\n\nstruct hid_driver;\n\nstruct hid_ll_driver;\n\nstruct hid_field;\n\nstruct hid_usage;\n\nstruct hid_device {\n\t__u8 *dev_rdesc;\n\tunsigned int dev_rsize;\n\t__u8 *rdesc;\n\tunsigned int rsize;\n\tstruct hid_collection *collection;\n\tunsigned int collection_size;\n\tunsigned int maxcollection;\n\tunsigned int maxapplication;\n\t__u16 bus;\n\t__u16 group;\n\t__u32 vendor;\n\t__u32 product;\n\t__u32 version;\n\tenum hid_type type;\n\tunsigned int country;\n\tstruct hid_report_enum report_enum[3];\n\tstruct work_struct led_work;\n\tstruct semaphore driver_input_lock;\n\tstruct device dev;\n\tstruct hid_driver *driver;\n\tvoid *devres_group_id;\n\tconst struct hid_ll_driver *ll_driver;\n\tstruct mutex ll_open_lock;\n\tunsigned int ll_open_count;\n\tstruct power_supply *battery;\n\t__s32 battery_capacity;\n\t__s32 battery_min;\n\t__s32 battery_max;\n\t__s32 battery_report_type;\n\t__s32 battery_report_id;\n\t__s32 battery_charge_status;\n\tenum hid_battery_status battery_status;\n\tbool battery_avoid_query;\n\tktime_t battery_ratelimit_time;\n\tlong unsigned int status;\n\tunsigned int claimed;\n\tunsigned int quirks;\n\tunsigned int initial_quirks;\n\tbool io_started;\n\tstruct list_head inputs;\n\tvoid *hiddev;\n\tvoid *hidraw;\n\tchar name[128];\n\tchar phys[64];\n\tchar uniq[64];\n\tvoid *driver_data;\n\tint (*ff_init)(struct hid_device *);\n\tint (*hiddev_connect)(struct hid_device *, unsigned int);\n\tvoid (*hiddev_disconnect)(struct hid_device *);\n\tvoid (*hiddev_hid_event)(struct hid_device *, struct hid_field *, struct hid_usage *, __s32);\n\tvoid (*hiddev_report_event)(struct hid_device *, struct hid_report *);\n\tshort unsigned int debug;\n\tstruct dentry *debug_dir;\n\tstruct dentry *debug_rdesc;\n\tstruct dentry *debug_events;\n\tstruct list_head debug_list;\n\tspinlock_t debug_list_lock;\n\twait_queue_head_t debug_wait;\n\tstruct kref ref;\n\tunsigned int id;\n\tstruct hid_bpf bpf;\n};\n\nstruct hid_device_id {\n\t__u16 bus;\n\t__u16 group;\n\t__u32 vendor;\n\t__u32 product;\n\tkernel_ulong_t driver_data;\n};\n\nstruct hid_report_id;\n\nstruct hid_usage_id;\n\nstruct hid_input;\n\nstruct hid_driver {\n\tchar *name;\n\tconst struct hid_device_id *id_table;\n\tstruct list_head dyn_list;\n\tspinlock_t dyn_lock;\n\tbool (*match)(struct hid_device *, bool);\n\tint (*probe)(struct hid_device *, const struct hid_device_id *);\n\tvoid (*remove)(struct hid_device *);\n\tconst struct hid_report_id *report_table;\n\tint (*raw_event)(struct hid_device *, struct hid_report *, u8 *, int);\n\tconst struct hid_usage_id *usage_table;\n\tint (*event)(struct hid_device *, struct hid_field *, struct hid_usage *, __s32);\n\tvoid (*report)(struct hid_device *, struct hid_report *);\n\t__u8 * (*report_fixup)(struct hid_device *, __u8 *, unsigned int *);\n\tint (*input_mapping)(struct hid_device *, struct hid_input *, struct hid_field *, struct hid_usage *, long unsigned int **, int *);\n\tint (*input_mapped)(struct hid_device *, struct hid_input *, struct hid_field *, struct hid_usage *, long unsigned int **, int *);\n\tint (*input_configured)(struct hid_device *, struct hid_input *);\n\tvoid (*feature_mapping)(struct hid_device *, struct hid_field *, struct hid_usage *);\n\tint (*suspend)(struct hid_device *, pm_message_t);\n\tint (*resume)(struct hid_device *);\n\tint (*reset_resume)(struct hid_device *);\n\tstruct device_driver driver;\n};\n\nstruct hid_field {\n\tunsigned int physical;\n\tunsigned int logical;\n\tunsigned int application;\n\tstruct hid_usage *usage;\n\tunsigned int maxusage;\n\tunsigned int flags;\n\tunsigned int report_offset;\n\tunsigned int report_size;\n\tunsigned int report_count;\n\tunsigned int report_type;\n\t__s32 *value;\n\t__s32 *new_value;\n\t__s32 *usages_priorities;\n\t__s32 logical_minimum;\n\t__s32 logical_maximum;\n\t__s32 physical_minimum;\n\t__s32 physical_maximum;\n\t__s32 unit_exponent;\n\tunsigned int unit;\n\tbool ignored;\n\tstruct hid_report *report;\n\tunsigned int index;\n\tstruct hid_input *hidinput;\n\t__u16 dpad;\n\tunsigned int slot_idx;\n};\n\nstruct hid_field_entry {\n\tstruct list_head list;\n\tstruct hid_field *field;\n\tunsigned int index;\n\t__s32 priority;\n};\n\nstruct hid_input {\n\tstruct list_head list;\n\tstruct hid_report *report;\n\tstruct input_dev *input;\n\tconst char *name;\n\tstruct list_head reports;\n\tunsigned int application;\n\tbool registered;\n};\n\nstruct hid_ll_driver {\n\tint (*start)(struct hid_device *);\n\tvoid (*stop)(struct hid_device *);\n\tint (*open)(struct hid_device *);\n\tvoid (*close)(struct hid_device *);\n\tint (*power)(struct hid_device *, int);\n\tint (*parse)(struct hid_device *);\n\tvoid (*request)(struct hid_device *, struct hid_report *, int);\n\tint (*wait)(struct hid_device *);\n\tint (*raw_request)(struct hid_device *, unsigned char, __u8 *, size_t, unsigned char, int);\n\tint (*output_report)(struct hid_device *, __u8 *, size_t);\n\tint (*idle)(struct hid_device *, int, int, int);\n\tbool (*may_wakeup)(struct hid_device *);\n\tunsigned int max_buffer_size;\n};\n\nstruct hid_ops {\n\tstruct hid_report * (*hid_get_report)(struct hid_report_enum *, const u8 *);\n\tint (*hid_hw_raw_request)(struct hid_device *, unsigned char, __u8 *, size_t, enum hid_report_type, enum hid_class_request, u64, bool);\n\tint (*hid_hw_output_report)(struct hid_device *, __u8 *, size_t, u64, bool);\n\tint (*hid_input_report)(struct hid_device *, enum hid_report_type, u8 *, u32, int, u64, bool, bool);\n\tstruct module *owner;\n\tconst struct bus_type *bus_type;\n};\n\nstruct hid_report {\n\tstruct list_head list;\n\tstruct list_head hidinput_list;\n\tstruct list_head field_entry_list;\n\tunsigned int id;\n\tenum hid_report_type type;\n\tunsigned int application;\n\tstruct hid_field *field[256];\n\tstruct hid_field_entry *field_entries;\n\tunsigned int maxfield;\n\tunsigned int size;\n\tstruct hid_device *device;\n\tbool tool_active;\n\tunsigned int tool;\n};\n\nstruct hid_report_id {\n\t__u32 report_type;\n};\n\nstruct hid_uid {\n\tconst char *hid;\n\tconst char *uid;\n};\n\nstruct hid_usage {\n\tunsigned int hid;\n\tunsigned int collection_index;\n\tunsigned int usage_index;\n\t__s8 resolution_multiplier;\n\t__s8 wheel_factor;\n\t__u16 code;\n\t__u8 type;\n\t__s16 hat_min;\n\t__s16 hat_max;\n\t__s16 hat_dir;\n\t__s16 wheel_accumulated;\n};\n\nstruct hid_usage_id {\n\t__u32 usage_hid;\n\t__u32 usage_type;\n\t__u32 usage_code;\n};\n\nstruct hist_elt_data {\n\tchar *comm;\n\tu64 *var_ref_vals;\n\tchar **field_var_str;\n\tint n_field_var_str;\n};\n\nstruct hist_var {\n\tchar *name;\n\tstruct hist_trigger_data *hist_data;\n\tunsigned int idx;\n};\n\nstruct hist_field {\n\tstruct ftrace_event_field *field;\n\tlong unsigned int flags;\n\tlong unsigned int buckets;\n\tconst char *type;\n\tstruct hist_field *operands[2];\n\tstruct hist_trigger_data *hist_data;\n\tenum hist_field_fn fn_num;\n\tunsigned int ref;\n\tunsigned int size;\n\tunsigned int offset;\n\tunsigned int is_signed;\n\tstruct hist_var var;\n\tenum field_op_id operator;\n\tchar *system;\n\tchar *event_name;\n\tchar *name;\n\tunsigned int var_ref_idx;\n\tbool read_once;\n\tunsigned int var_str_idx;\n\tu64 constant;\n\tu64 div_multiplier;\n};\n\nstruct var_defs {\n\tunsigned int n_vars;\n\tchar *name[16];\n\tchar *expr[16];\n};\n\nstruct hist_trigger_attrs {\n\tchar *keys_str;\n\tchar *vals_str;\n\tchar *sort_key_str;\n\tchar *name;\n\tchar *clock;\n\tbool pause;\n\tbool cont;\n\tbool clear;\n\tbool ts_in_usecs;\n\tbool no_hitcount;\n\tunsigned int map_bits;\n\tchar *assignment_str[16];\n\tunsigned int n_assignments;\n\tchar *action_str[8];\n\tunsigned int n_actions;\n\tstruct var_defs var_defs;\n};\n\nstruct tracing_map_sort_key {\n\tunsigned int field_idx;\n\tbool descending;\n};\n\nstruct tracing_map;\n\nstruct hist_trigger_data {\n\tstruct hist_field *fields[22];\n\tunsigned int n_vals;\n\tunsigned int n_keys;\n\tunsigned int n_fields;\n\tunsigned int n_vars;\n\tunsigned int n_var_str;\n\tunsigned int key_size;\n\tstruct tracing_map_sort_key sort_keys[2];\n\tunsigned int n_sort_keys;\n\tstruct trace_event_file *event_file;\n\tstruct hist_trigger_attrs *attrs;\n\tstruct tracing_map *map;\n\tbool enable_timestamps;\n\tbool remove;\n\tstruct hist_field *var_refs[16];\n\tunsigned int n_var_refs;\n\tstruct action_data *actions[8];\n\tunsigned int n_actions;\n\tstruct field_var *field_vars[64];\n\tunsigned int n_field_vars;\n\tunsigned int n_field_var_str;\n\tstruct field_var_hist *field_var_hists[64];\n\tunsigned int n_field_var_hists;\n\tstruct field_var *save_vars[64];\n\tunsigned int n_save_vars;\n\tunsigned int n_save_var_str;\n};\n\nstruct hist_val_stat {\n\tu64 max;\n\tu64 total;\n};\n\nstruct hist_var_data {\n\tstruct list_head list;\n\tstruct hist_trigger_data *hist_data;\n};\n\nstruct history_info {\n\tchar *command;\n\tu32 cmd_num;\n};\n\ntypedef struct history_info HISTORY_INFO;\n\nstruct hlist_bl_head {\n\tstruct hlist_bl_node *first;\n};\n\nstruct hmac_ctx {\n\tstruct crypto_shash *hash;\n\tu8 pads[0];\n};\n\nstruct mmu_interval_notifier;\n\nstruct hmm_range {\n\tstruct mmu_interval_notifier *notifier;\n\tlong unsigned int notifier_seq;\n\tlong unsigned int start;\n\tlong unsigned int end;\n\tlong unsigned int *hmm_pfns;\n\tlong unsigned int default_flags;\n\tlong unsigned int pfn_flags_mask;\n\tvoid *dev_private_owner;\n};\n\nstruct hmm_vma_walk {\n\tstruct hmm_range *range;\n\tlong unsigned int last;\n};\n\nstruct hop_jumbo_hdr {\n\tu8 nexthdr;\n\tu8 hdrlen;\n\tu8 tlv_type;\n\tu8 tlv_len;\n\t__be32 jumbo_payload_len;\n};\n\nstruct hotplug_slot_ops {\n\tint (*enable_slot)(struct hotplug_slot *);\n\tint (*disable_slot)(struct hotplug_slot *);\n\tint (*set_attention_status)(struct hotplug_slot *, u8);\n\tint (*hardware_test)(struct hotplug_slot *, u32);\n\tint (*get_power_status)(struct hotplug_slot *, u8 *);\n\tint (*get_attention_status)(struct hotplug_slot *, u8 *);\n\tint (*get_latch_status)(struct hotplug_slot *, u8 *);\n\tint (*get_adapter_status)(struct hotplug_slot *, u8 *);\n\tint (*reset_slot)(struct hotplug_slot *, bool);\n};\n\nstruct housekeeping {\n\tcpumask_var_t cpumasks[9];\n\tlong unsigned int flags;\n};\n\nstruct hpc_ops {\n\tint (*power_on_slot)(struct slot___3 *);\n\tint (*slot_enable)(struct slot___3 *);\n\tint (*slot_disable)(struct slot___3 *);\n\tint (*set_bus_speed_mode)(struct slot___3 *, enum pci_bus_speed);\n\tint (*get_power_status)(struct slot___3 *, u8 *);\n\tint (*get_attention_status)(struct slot___3 *, u8 *);\n\tint (*set_attention_status)(struct slot___3 *, u8);\n\tint (*get_latch_status)(struct slot___3 *, u8 *);\n\tint (*get_adapter_status)(struct slot___3 *, u8 *);\n\tint (*get_adapter_speed)(struct slot___3 *, enum pci_bus_speed *);\n\tint (*get_prog_int)(struct slot___3 *, u8 *);\n\tint (*query_power_fault)(struct slot___3 *);\n\tvoid (*green_led_on)(struct slot___3 *);\n\tvoid (*green_led_off)(struct slot___3 *);\n\tvoid (*green_led_blink)(struct slot___3 *);\n\tvoid (*release_ctlr)(struct controller___2 *);\n\tint (*check_cmd_status)(struct controller___2 *);\n};\n\nstruct hpet_timer {\n\tu64 hpet_config;\n\tunion {\n\t\tu64 _hpet_hc64;\n\t\tu32 _hpet_hc32;\n\t\tlong unsigned int _hpet_compare;\n\t} _u1;\n\tu64 hpet_fsb[2];\n};\n\nstruct hpet {\n\tu64 hpet_cap;\n\tu64 res0;\n\tu64 hpet_config;\n\tu64 res1;\n\tu64 hpet_isr;\n\tu64 res2[25];\n\tunion {\n\t\tu64 _hpet_mc64;\n\t\tu32 _hpet_mc32;\n\t\tlong unsigned int _hpet_mc;\n\t} _u0;\n\tu64 res3;\n\tstruct hpet_timer hpet_timers[0];\n};\n\nstruct hpet_channel;\n\nstruct hpet_base {\n\tunsigned int nr_channels;\n\tunsigned int nr_clockevents;\n\tunsigned int boot_cfg;\n\tstruct hpet_channel *channels;\n};\n\nstruct hpet_channel {\n\tstruct clock_event_device evt;\n\tunsigned int num;\n\tunsigned int cpu;\n\tunsigned int irq;\n\tunsigned int in_use;\n\tenum hpet_mode mode;\n\tunsigned int boot_cfg;\n\tchar name[10];\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct hpet_data {\n\tlong unsigned int hd_phys_address;\n\tvoid *hd_address;\n\tshort unsigned int hd_nirqs;\n\tunsigned int hd_state;\n\tunsigned int hd_irq[32];\n};\n\nstruct hpets;\n\nstruct hpet_dev {\n\tstruct hpets *hd_hpets;\n\tstruct hpet *hd_hpet;\n\tstruct hpet_timer *hd_timer;\n\tlong unsigned int hd_ireqfreq;\n\tlong unsigned int hd_irqdata;\n\twait_queue_head_t hd_waitqueue;\n\tstruct fasync_struct *hd_async_queue;\n\tunsigned int hd_flags;\n\tunsigned int hd_irq;\n\tunsigned int hd_hdwirq;\n\tchar hd_name[7];\n};\n\nstruct hpet_info {\n\tlong unsigned int hi_ireqfreq;\n\tlong unsigned int hi_flags;\n\tshort unsigned int hi_hpet;\n\tshort unsigned int hi_timer;\n};\n\nunion hpet_lock {\n\tstruct {\n\t\tarch_spinlock_t lock;\n\t\tu32 value;\n\t};\n\tu64 lockval;\n};\n\nstruct hpet_scope {\n\tstruct intel_iommu *iommu;\n\tu8 id;\n\tunsigned int bus;\n\tunsigned int devfn;\n};\n\nstruct hpets {\n\tstruct hpets *hp_next;\n\tstruct hpet *hp_hpet;\n\tlong unsigned int hp_hpet_phys;\n\tlong long unsigned int hp_tick_freq;\n\tlong unsigned int hp_delta;\n\tunsigned int hp_ntimer;\n\tunsigned int hp_which;\n\tstruct hpet_dev hp_dev[0];\n};\n\nstruct hpx_type0 {\n\tu32 revision;\n\tu8 cache_line_size;\n\tu8 latency_timer;\n\tu8 enable_serr;\n\tu8 enable_perr;\n};\n\nstruct hpx_type1 {\n\tu32 revision;\n\tu8 max_mem_read;\n\tu8 avg_max_split;\n\tu16 tot_max_split;\n};\n\nstruct hpx_type2 {\n\tu32 revision;\n\tu32 unc_err_mask_and;\n\tu32 unc_err_mask_or;\n\tu32 unc_err_sever_and;\n\tu32 unc_err_sever_or;\n\tu32 cor_err_mask_and;\n\tu32 cor_err_mask_or;\n\tu32 adv_err_cap_and;\n\tu32 adv_err_cap_or;\n\tu16 pci_exp_devctl_and;\n\tu16 pci_exp_devctl_or;\n\tu16 pci_exp_lnkctl_and;\n\tu16 pci_exp_lnkctl_or;\n\tu32 sec_unc_err_sever_and;\n\tu32 sec_unc_err_sever_or;\n\tu32 sec_unc_err_mask_and;\n\tu32 sec_unc_err_mask_or;\n};\n\nstruct hpx_type3 {\n\tu16 device_type;\n\tu16 function_type;\n\tu16 config_space_location;\n\tu16 pci_exp_cap_id;\n\tu16 pci_exp_cap_ver;\n\tu16 pci_exp_vendor_id;\n\tu16 dvsec_id;\n\tu16 dvsec_rev;\n\tu16 match_offset;\n\tu32 match_mask_and;\n\tu32 match_value;\n\tu16 reg_offset;\n\tu32 reg_mask_and;\n\tu32 reg_mask_or;\n};\n\nstruct seqcount_raw_spinlock {\n\tseqcount_t seqcount;\n};\n\ntypedef struct seqcount_raw_spinlock seqcount_raw_spinlock_t;\n\nstruct hrtimer_cpu_base;\n\nstruct hrtimer_clock_base {\n\tstruct hrtimer_cpu_base *cpu_base;\n\tunsigned int index;\n\tclockid_t clockid;\n\tseqcount_raw_spinlock_t seq;\n\tstruct hrtimer *running;\n\tstruct timerqueue_head active;\n\tktime_t (*get_time)(void);\n\tktime_t offset;\n};\n\nstruct hrtimer_cpu_base {\n\traw_spinlock_t lock;\n\tunsigned int cpu;\n\tunsigned int active_bases;\n\tunsigned int clock_was_set_seq;\n\tunsigned int hres_active: 1;\n\tunsigned int in_hrtirq: 1;\n\tunsigned int hang_detected: 1;\n\tunsigned int softirq_activated: 1;\n\tunsigned int online: 1;\n\tunsigned int nr_events;\n\tshort unsigned int nr_retries;\n\tshort unsigned int nr_hangs;\n\tunsigned int max_hang_time;\n\tktime_t expires_next;\n\tstruct hrtimer *next_timer;\n\tktime_t softirq_expires_next;\n\tstruct hrtimer *softirq_next_timer;\n\tstruct hrtimer_clock_base clock_base[8];\n};\n\nstruct hrtimer_sleeper {\n\tstruct hrtimer timer;\n\tstruct task_struct *task;\n};\n\nstruct hsr_tag {\n\t__be16 path_and_LSDU_size;\n\t__be16 sequence_nr;\n\t__be16 encap_proto;\n};\n\nstruct hstate {\n\tstruct mutex resize_lock;\n\tstruct lock_class_key resize_key;\n\tint next_nid_to_alloc;\n\tint next_nid_to_free;\n\tunsigned int order;\n\tunsigned int demote_order;\n\tlong unsigned int mask;\n\tlong unsigned int max_huge_pages;\n\tlong unsigned int nr_huge_pages;\n\tlong unsigned int free_huge_pages;\n\tlong unsigned int resv_huge_pages;\n\tlong unsigned int surplus_huge_pages;\n\tlong unsigned int nr_overcommit_huge_pages;\n\tstruct list_head hugepage_activelist;\n\tstruct list_head hugepage_freelists[1024];\n\tunsigned int max_huge_pages_node[1024];\n\tunsigned int nr_huge_pages_node[1024];\n\tunsigned int free_huge_pages_node[1024];\n\tunsigned int surplus_huge_pages_node[1024];\n\tchar name[32];\n};\n\nstruct hsu_dma_chan;\n\nstruct hsu_dma {\n\tstruct dma_device dma;\n\tstruct hsu_dma_chan *chan;\n\tshort unsigned int nr_channels;\n};\n\nstruct virt_dma_chan {\n\tstruct dma_chan chan;\n\tstruct tasklet_struct task;\n\tvoid (*desc_free)(struct virt_dma_desc *);\n\tspinlock_t lock;\n\tstruct list_head desc_allocated;\n\tstruct list_head desc_submitted;\n\tstruct list_head desc_issued;\n\tstruct list_head desc_completed;\n\tstruct list_head desc_terminated;\n\tstruct virt_dma_desc *cyclic;\n};\n\nstruct hsu_dma_desc;\n\nstruct hsu_dma_chan {\n\tstruct virt_dma_chan vchan;\n\tvoid *reg;\n\tenum dma_transfer_direction direction;\n\tstruct dma_slave_config config;\n\tstruct hsu_dma_desc *desc;\n};\n\nstruct hsu_dma_chip {\n\tstruct device *dev;\n\tint irq;\n\tvoid *regs;\n\tunsigned int length;\n\tunsigned int offset;\n\tstruct hsu_dma *hsu;\n};\n\nstruct hsu_dma_sg;\n\nstruct hsu_dma_desc {\n\tstruct virt_dma_desc vdesc;\n\tenum dma_transfer_direction direction;\n\tstruct hsu_dma_sg *sg;\n\tunsigned int nents;\n\tsize_t length;\n\tunsigned int active;\n\tenum dma_status status;\n};\n\nstruct hsu_dma_sg {\n\tdma_addr_t addr;\n\tunsigned int len;\n};\n\nstruct hsu_dma_slave {\n\tstruct device *dma_dev;\n\tint chan_id;\n};\n\nunion hsw_tsx_tuning {\n\tstruct {\n\t\tu32 cycles_last_block: 32;\n\t\tu32 hle_abort: 1;\n\t\tu32 rtm_abort: 1;\n\t\tu32 instruction_abort: 1;\n\t\tu32 non_instruction_abort: 1;\n\t\tu32 retry: 1;\n\t\tu32 data_conflict: 1;\n\t\tu32 capacity_writes: 1;\n\t\tu32 capacity_reads: 1;\n\t};\n\tu64 value;\n};\n\nstruct pcpu_freelist_node {\n\tstruct pcpu_freelist_node *next;\n};\n\nstruct htab_elem {\n\tunion {\n\t\tstruct hlist_nulls_node hash_node;\n\t\tstruct {\n\t\t\tvoid *padding;\n\t\t\tunion {\n\t\t\t\tstruct pcpu_freelist_node fnode;\n\t\t\t\tstruct htab_elem *batch_flink;\n\t\t\t};\n\t\t};\n\t};\n\tunion {\n\t\tvoid *ptr_to_pptr;\n\t\tstruct bpf_lru_node lru_node;\n\t};\n\tu32 hash;\n\tlong: 0;\n\tchar key[0];\n};\n\nstruct hte_ops;\n\nstruct of_phandle_args;\n\nstruct hte_ts_desc;\n\nstruct hte_device;\n\nstruct hte_chip {\n\tconst char *name;\n\tstruct device *dev;\n\tconst struct hte_ops *ops;\n\tu32 nlines;\n\tint (*xlate_of)(struct hte_chip *, const struct of_phandle_args *, struct hte_ts_desc *, u32 *);\n\tint (*xlate_plat)(struct hte_chip *, struct hte_ts_desc *, u32 *);\n\tbool (*match_from_linedata)(const struct hte_chip *, const struct hte_ts_desc *);\n\tu8 of_hte_n_cells;\n\tstruct hte_device *gdev;\n\tvoid *data;\n};\n\nstruct hte_clk_info {\n\tu64 hz;\n\tclockid_t type;\n};\n\nstruct hte_ts_data;\n\ntypedef enum hte_return (*hte_ts_cb_t)(struct hte_ts_data *, void *);\n\ntypedef enum hte_return (*hte_ts_sec_cb_t)(void *);\n\nstruct hte_ts_info {\n\tu32 xlated_id;\n\tlong unsigned int flags;\n\tlong unsigned int hte_cb_flags;\n\tu64 seq;\n\tchar *line_name;\n\tbool free_attr_name;\n\thte_ts_cb_t cb;\n\thte_ts_sec_cb_t tcb;\n\tatomic_t dropped_ts;\n\tspinlock_t slock;\n\tstruct work_struct cb_work;\n\tstruct mutex req_mlock;\n\tstruct dentry *ts_dbg_root;\n\tstruct hte_device *gdev;\n\tvoid *cl_data;\n};\n\nstruct hte_device {\n\tu32 nlines;\n\tatomic_t ts_req;\n\tstruct device *sdev;\n\tstruct dentry *dbg_root;\n\tstruct list_head list;\n\tstruct hte_chip *chip;\n\tstruct module *owner;\n\tstruct hte_ts_info ei[0];\n};\n\nstruct hte_line_attr {\n\tu32 line_id;\n\tvoid *line_data;\n\tlong unsigned int edge_flags;\n\tconst char *name;\n};\n\nstruct hte_ops {\n\tint (*request)(struct hte_chip *, struct hte_ts_desc *, u32);\n\tint (*release)(struct hte_chip *, struct hte_ts_desc *, u32);\n\tint (*enable)(struct hte_chip *, u32);\n\tint (*disable)(struct hte_chip *, u32);\n\tint (*get_clk_src_info)(struct hte_chip *, struct hte_clk_info *);\n};\n\nstruct hte_ts_data {\n\tu64 tsc;\n\tu64 seq;\n\tint raw_level;\n};\n\nstruct hte_ts_desc {\n\tstruct hte_line_attr attr;\n\tvoid *hte_data;\n};\n\nstruct huge_bootmem_page {\n\tstruct list_head list;\n\tstruct hstate *hstate;\n};\n\nstruct hugepage_subpool {\n\tspinlock_t lock;\n\tlong int count;\n\tlong int max_hpages;\n\tlong int used_hpages;\n\tstruct hstate *hstate;\n\tlong int min_hpages;\n\tlong int rsv_hpages;\n};\n\nstruct page_counter {\n\tatomic_long_t usage;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tstruct cacheline_padding _pad1_;\n\tlong unsigned int emin;\n\tatomic_long_t min_usage;\n\tatomic_long_t children_min_usage;\n\tlong unsigned int elow;\n\tatomic_long_t low_usage;\n\tatomic_long_t children_low_usage;\n\tlong unsigned int watermark;\n\tlong unsigned int failcnt;\n\tstruct cacheline_padding _pad2_;\n\tlong unsigned int min;\n\tlong unsigned int low;\n\tlong unsigned int high;\n\tlong unsigned int max;\n\tstruct page_counter *parent;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct hugetlb_cgroup_per_node;\n\nstruct hugetlb_cgroup {\n\tstruct cgroup_subsys_state css;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tstruct page_counter hugepage[2];\n\tstruct page_counter rsvd_hugepage[2];\n\tatomic_long_t events[2];\n\tatomic_long_t events_local[2];\n\tstruct cgroup_file events_file[2];\n\tstruct cgroup_file events_local_file[2];\n\tstruct hugetlb_cgroup_per_node *nodeinfo[0];\n};\n\nstruct hugetlb_cgroup_per_node {\n\tlong unsigned int usage[2];\n};\n\nstruct hugetlb_vma_lock {\n\tstruct kref refs;\n\tstruct rw_semaphore rw_sema;\n\tstruct vm_area_struct *vma;\n};\n\nstruct hugetlbfs_fs_context {\n\tstruct hstate *hstate;\n\tlong long unsigned int max_size_opt;\n\tlong long unsigned int min_size_opt;\n\tlong int max_hpages;\n\tlong int nr_inodes;\n\tlong int min_hpages;\n\tenum hugetlbfs_size_type max_val_type;\n\tenum hugetlbfs_size_type min_val_type;\n\tkuid_t uid;\n\tkgid_t gid;\n\tumode_t mode;\n};\n\nstruct hugetlbfs_inode_info {\n\tstruct inode vfs_inode;\n\tunsigned int seals;\n};\n\nstruct hugetlbfs_sb_info {\n\tlong int max_inodes;\n\tlong int free_inodes;\n\tspinlock_t stat_lock;\n\tstruct hstate *hstate;\n\tstruct hugepage_subpool *spool;\n\tkuid_t uid;\n\tkgid_t gid;\n\tumode_t mode;\n};\n\nstruct hv_proximity_domain_flags {\n\tu32 proximity_preferred: 1;\n\tu32 reserved: 30;\n\tu32 proximity_info_valid: 1;\n};\n\nstruct hv_proximity_domain_info {\n\tu32 domain_id;\n\tstruct hv_proximity_domain_flags flags;\n};\n\nstruct hv_create_vp {\n\tu64 partition_id;\n\tu32 vp_index;\n\tu8 padding[3];\n\tu8 subnode_type;\n\tu64 subnode_id;\n\tstruct hv_proximity_domain_info proximity_domain_info;\n\tu64 flags;\n};\n\nstruct hv_deposit_memory {\n\tu64 partition_id;\n\tu64 gpa_page_list[0];\n};\n\nunion hv_pci_bdf {\n\tu16 as_uint16;\n\tstruct {\n\t\tu8 function: 3;\n\t\tu8 device: 5;\n\t\tu8 bus;\n\t};\n};\n\nunion hv_pci_bus_range {\n\tu16 as_uint16;\n\tstruct {\n\t\tu8 subordinate_bus;\n\t\tu8 secondary_bus;\n\t};\n};\n\nunion hv_device_id {\n\tu64 as_uint64;\n\tstruct {\n\t\tu64 reserved0: 62;\n\t\tu64 device_type: 2;\n\t};\n\tstruct {\n\t\tu64 id: 62;\n\t\tu64 device_type: 2;\n\t} logical;\n\tstruct {\n\t\tunion {\n\t\t\thv_pci_rid rid;\n\t\t\tunion hv_pci_bdf bdf;\n\t\t};\n\t\thv_pci_segment segment;\n\t\tunion hv_pci_bus_range shadow_bus_range;\n\t\tu16 phantom_function_bits: 2;\n\t\tu16 source_shadow: 1;\n\t\tu16 rsvdz0: 11;\n\t\tu16 device_type: 2;\n\t} pci;\n\tstruct {\n\t\tu8 ioapic_id;\n\t\tu8 rsvdz0;\n\t\tu16 rsvdz1;\n\t\tu16 rsvdz2;\n\t\tu16 rsvdz3: 14;\n\t\tu16 device_type: 2;\n\t} ioapic;\n\tstruct {\n\t\tu32 input_mapping_base;\n\t\tu32 input_mapping_count: 30;\n\t\tu32 device_type: 2;\n\t} acpi;\n};\n\nstruct hv_vpset {\n\tu64 format;\n\tu64 valid_bank_mask;\n\tu64 bank_contents[0];\n};\n\nstruct hv_device_interrupt_target {\n\tu32 vector;\n\tu32 flags;\n\tunion {\n\t\tu64 vp_mask;\n\t\tstruct hv_vpset vp_set;\n\t};\n};\n\nstruct hv_device_interrupt_descriptor {\n\tu32 interrupt_type;\n\tu32 trigger_mode;\n\tu32 vector_count;\n\tu32 reserved;\n\tstruct hv_device_interrupt_target target;\n};\n\nunion hv_input_vtl {\n\tu8 as_uint8;\n\tstruct {\n\t\tu8 target_vtl: 4;\n\t\tu8 use_target_vtl: 1;\n\t\tu8 reserved_z: 3;\n\t};\n};\n\nstruct hv_x64_segment_register {\n\tu64 base;\n\tu32 limit;\n\tu16 selector;\n\tunion {\n\t\tstruct {\n\t\t\tu16 segment_type: 4;\n\t\t\tu16 non_system_segment: 1;\n\t\t\tu16 descriptor_privilege_level: 2;\n\t\t\tu16 present: 1;\n\t\t\tu16 reserved: 4;\n\t\t\tu16 available: 1;\n\t\t\tu16 _long: 1;\n\t\t\tu16 _default: 1;\n\t\t\tu16 granularity: 1;\n\t\t};\n\t\tu16 attributes;\n\t};\n};\n\nstruct hv_x64_table_register {\n\tu16 pad[3];\n\tu16 limit;\n\tu64 base;\n};\n\nstruct hv_init_vp_context {\n\tu64 rip;\n\tu64 rsp;\n\tu64 rflags;\n\tstruct hv_x64_segment_register cs;\n\tstruct hv_x64_segment_register ds;\n\tstruct hv_x64_segment_register es;\n\tstruct hv_x64_segment_register fs;\n\tstruct hv_x64_segment_register gs;\n\tstruct hv_x64_segment_register ss;\n\tstruct hv_x64_segment_register tr;\n\tstruct hv_x64_segment_register ldtr;\n\tstruct hv_x64_table_register idtr;\n\tstruct hv_x64_table_register gdtr;\n\tu64 efer;\n\tu64 cr0;\n\tu64 cr3;\n\tu64 cr4;\n\tu64 msr_cr_pat;\n};\n\nstruct hv_enable_vp_vtl {\n\tu64 partition_id;\n\tu32 vp_index;\n\tunion hv_input_vtl target_vtl;\n\tu8 mbz0;\n\tu16 mbz1;\n\tstruct hv_init_vp_context vp_context;\n};\n\nstruct hv_get_partition_id {\n\tu64 partition_id;\n};\n\nunion hv_ghcb {\n\tstruct ghcb ghcb;\n\tstruct {\n\t\tu64 hypercalldata[509];\n\t\tu64 outputgpa;\n\t\tunion {\n\t\t\tunion {\n\t\t\t\tstruct {\n\t\t\t\t\tu32 callcode: 16;\n\t\t\t\t\tu32 isfast: 1;\n\t\t\t\t\tu32 reserved1: 14;\n\t\t\t\t\tu32 isnested: 1;\n\t\t\t\t\tu32 countofelements: 12;\n\t\t\t\t\tu32 reserved2: 4;\n\t\t\t\t\tu32 repstartindex: 12;\n\t\t\t\t\tu32 reserved3: 4;\n\t\t\t\t};\n\t\t\t\tu64 asuint64;\n\t\t\t} hypercallinput;\n\t\t\tunion {\n\t\t\t\tstruct {\n\t\t\t\t\tu16 callstatus;\n\t\t\t\t\tu16 reserved1;\n\t\t\t\t\tu32 elementsprocessed: 12;\n\t\t\t\t\tu32 reserved2: 20;\n\t\t\t\t};\n\t\t\t\tu64 asunit64;\n\t\t\t} hypercalloutput;\n\t\t};\n\t\tu64 reserved2;\n\t} hypercall;\n};\n\nunion hv_gpa_page_range {\n\tu64 address_space;\n\tstruct {\n\t\tu64 additional_pages: 11;\n\t\tu64 largepage: 1;\n\t\tu64 basepfn: 52;\n\t} page;\n\tstruct {\n\t\tu64 reserved: 12;\n\t\tu64 page_size: 1;\n\t\tu64 reserved1: 8;\n\t\tu64 base_large_pfn: 43;\n\t};\n};\n\nstruct hv_gpa_range_for_visibility {\n\tu64 partition_id;\n\tu32 host_visibility: 2;\n\tu32 reserved0: 30;\n\tu32 reserved1;\n\tu64 gpa_page_list[510];\n};\n\nstruct hv_guest_mapping_flush {\n\tu64 address_space;\n\tu64 flags;\n};\n\nstruct hv_guest_mapping_flush_list {\n\tu64 address_space;\n\tu64 flags;\n\tunion hv_gpa_page_range gpa_list[510];\n};\n\nunion hv_hypervisor_version_info {\n\tstruct {\n\t\tu32 build_number;\n\t\tu32 minor_version: 16;\n\t\tu32 major_version: 16;\n\t\tu32 service_pack;\n\t\tu32 service_number: 24;\n\t\tu32 service_branch: 8;\n\t};\n\tstruct {\n\t\tu32 eax;\n\t\tu32 ebx;\n\t\tu32 ecx;\n\t\tu32 edx;\n\t};\n};\n\nstruct hv_input_add_logical_processor {\n\tu32 lp_index;\n\tu32 apic_id;\n\tstruct hv_proximity_domain_info proximity_domain_info;\n};\n\nunion hv_msi_address_register {\n\tu32 as_uint32;\n\tstruct {\n\t\tu32 reserved1: 2;\n\t\tu32 destination_mode: 1;\n\t\tu32 redirection_hint: 1;\n\t\tu32 reserved2: 8;\n\t\tu32 destination_id: 8;\n\t\tu32 msi_base: 12;\n\t};\n};\n\nunion hv_msi_data_register {\n\tu32 as_uint32;\n\tstruct {\n\t\tu32 vector: 8;\n\t\tu32 delivery_mode: 3;\n\t\tu32 reserved1: 3;\n\t\tu32 level_assert: 1;\n\t\tu32 trigger_mode: 1;\n\t\tu32 reserved2: 16;\n\t};\n};\n\nunion hv_msi_entry {\n\tu64 as_uint64;\n\tstruct {\n\t\tunion hv_msi_address_register address;\n\t\tunion hv_msi_data_register data;\n\t};\n};\n\nunion hv_ioapic_rte {\n\tu64 as_uint64;\n\tstruct {\n\t\tu32 vector: 8;\n\t\tu32 delivery_mode: 3;\n\t\tu32 destination_mode: 1;\n\t\tu32 delivery_status: 1;\n\t\tu32 interrupt_polarity: 1;\n\t\tu32 remote_irr: 1;\n\t\tu32 trigger_mode: 1;\n\t\tu32 interrupt_mask: 1;\n\t\tu32 reserved1: 15;\n\t\tu32 reserved2: 24;\n\t\tu32 destination_id: 8;\n\t};\n\tstruct {\n\t\tu32 low_uint32;\n\t\tu32 high_uint32;\n\t};\n};\n\nstruct hv_interrupt_entry {\n\tu32 source;\n\tu32 reserved1;\n\tunion {\n\t\tunion hv_msi_entry msi_entry;\n\t\tunion hv_ioapic_rte ioapic_rte;\n\t};\n};\n\nstruct hv_input_map_device_interrupt {\n\tu64 partition_id;\n\tu64 device_id;\n\tu64 flags;\n\tstruct hv_interrupt_entry logical_interrupt_entry;\n\tstruct hv_device_interrupt_descriptor interrupt_descriptor;\n};\n\nstruct hv_input_unmap_device_interrupt {\n\tu64 partition_id;\n\tu64 device_id;\n\tstruct hv_interrupt_entry interrupt_entry;\n};\n\nstruct hv_lp_startup_status {\n\tu64 hv_status;\n\tu64 substatus1;\n\tu64 substatus2;\n\tu64 substatus3;\n\tu64 substatus4;\n\tu64 substatus5;\n\tu64 substatus6;\n};\n\nunion hv_message_flags {\n\t__u8 asu8;\n\tstruct {\n\t\t__u8 msg_pending: 1;\n\t\t__u8 reserved: 7;\n\t};\n};\n\nunion hv_port_id {\n\t__u32 asu32;\n\tstruct {\n\t\t__u32 id: 24;\n\t\t__u32 reserved: 8;\n\t} u;\n};\n\nstruct hv_message_header {\n\t__u32 message_type;\n\t__u8 payload_size;\n\tunion hv_message_flags message_flags;\n\t__u8 reserved[2];\n\tunion {\n\t\t__u64 sender;\n\t\tunion hv_port_id port;\n\t};\n};\n\nstruct hv_message {\n\tstruct hv_message_header header;\n\tunion {\n\t\t__u64 payload[30];\n\t} u;\n};\n\nstruct hv_nested_enlightenments_control {\n\tstruct {\n\t\t__u32 directhypercall: 1;\n\t\t__u32 reserved: 31;\n\t} features;\n\tstruct {\n\t\t__u32 inter_partition_comm: 1;\n\t\t__u32 reserved: 31;\n\t} hypercallControls;\n};\n\nstruct hv_ops {\n\tssize_t (*get_chars)(uint32_t, u8 *, size_t);\n\tssize_t (*put_chars)(uint32_t, const u8 *, size_t);\n\tint (*flush)(uint32_t, bool);\n\tint (*notifier_add)(struct hvc_struct *, int);\n\tvoid (*notifier_del)(struct hvc_struct *, int);\n\tvoid (*notifier_hangup)(struct hvc_struct *, int);\n\tint (*tiocmget)(struct hvc_struct *);\n\tint (*tiocmset)(struct hvc_struct *, unsigned int, unsigned int);\n\tvoid (*dtr_rts)(struct hvc_struct *, bool);\n};\n\nstruct hv_output_add_logical_processor {\n\tstruct hv_lp_startup_status startup_status;\n};\n\nstruct hv_output_map_device_interrupt {\n\tstruct hv_interrupt_entry interrupt_entry;\n};\n\nstruct hv_partition_assist_pg {\n\tu32 tlb_lock_count;\n};\n\nstruct hv_reenlightenment_control {\n\t__u64 vector: 8;\n\t__u64 reserved1: 8;\n\t__u64 enabled: 1;\n\t__u64 reserved2: 15;\n\t__u64 target_vp: 32;\n};\n\nunion hv_reference_tsc_msr {\n\tu64 as_uint64;\n\tstruct {\n\t\tu64 enable: 1;\n\t\tu64 reserved: 11;\n\t\tu64 pfn: 52;\n\t};\n};\n\nstruct hv_send_ipi {\n\tu32 vector;\n\tu32 reserved;\n\tu64 cpu_mask;\n};\n\nstruct hv_send_ipi_ex {\n\tu32 vector;\n\tu32 reserved;\n\tstruct hv_vpset vp_set;\n};\n\nunion hv_stimer_config {\n\tu64 as_uint64;\n\tstruct {\n\t\tu64 enable: 1;\n\t\tu64 periodic: 1;\n\t\tu64 lazy: 1;\n\t\tu64 auto_enable: 1;\n\t\tu64 apic_vector: 8;\n\t\tu64 direct_mode: 1;\n\t\tu64 reserved_z0: 3;\n\t\tu64 sintx: 4;\n\t\tu64 reserved_z1: 44;\n\t};\n};\n\nstruct hv_tlb_flush {\n\tu64 address_space;\n\tu64 flags;\n\tu64 processor_mask;\n\tu64 gva_list[0];\n};\n\nstruct hv_tlb_flush_ex {\n\tu64 address_space;\n\tu64 flags;\n\tstruct hv_vpset hv_vp_set;\n\tu64 gva_list[0];\n};\n\nstruct hv_tsc_emulation_control {\n\t__u64 enabled: 1;\n\t__u64 reserved: 63;\n};\n\nstruct hv_tsc_emulation_status {\n\t__u64 inprogress: 1;\n\t__u64 reserved: 63;\n};\n\nunion hv_vp_assist_msr_contents {\n\tu64 as_uint64;\n\tstruct {\n\t\tu64 enable: 1;\n\t\tu64 reserved: 11;\n\t\tu64 pfn: 52;\n\t};\n};\n\nstruct hv_vp_assist_page {\n\t__u32 apic_assist;\n\t__u32 reserved1;\n\t__u32 vtl_entry_reason;\n\t__u32 vtl_reserved;\n\t__u64 vtl_ret_x64rax;\n\t__u64 vtl_ret_x64rcx;\n\tstruct hv_nested_enlightenments_control nested_control;\n\t__u8 enlighten_vmentry;\n\t__u8 reserved2[7];\n\t__u64 current_nested_vmcs;\n\t__u8 synthetic_time_unhalted_timer_expired;\n\t__u8 reserved3[7];\n\t__u8 virtualization_fault_information[40];\n\t__u8 reserved4[8];\n\t__u8 intercept_message[256];\n\t__u8 vtl_ret_actions[256];\n};\n\nunion hv_x64_msr_hypercall_contents {\n\tu64 as_uint64;\n\tstruct {\n\t\tu64 enable: 1;\n\t\tu64 reserved: 11;\n\t\tu64 guest_physical_address: 52;\n\t};\n};\n\nstruct hvc_struct {\n\tstruct tty_port port;\n\tspinlock_t lock;\n\tint index;\n\tint do_wakeup;\n\tint outbuf_size;\n\tint n_outbuf;\n\tuint32_t vtermno;\n\tconst struct hv_ops *ops;\n\tint irq_requested;\n\tint data;\n\tstruct winsize ws;\n\tstruct work_struct tty_resize;\n\tstruct list_head next;\n\tlong unsigned int flags;\n\tu8 outbuf[0];\n};\n\nstruct hvm_memmap_table_entry {\n\tuint64_t addr;\n\tuint64_t size;\n\tuint32_t type;\n\tuint32_t reserved;\n};\n\nstruct hvm_modlist_entry {\n\tuint64_t paddr;\n\tuint64_t size;\n\tuint64_t cmdline_paddr;\n\tuint64_t reserved;\n};\n\nstruct hvm_start_info {\n\tuint32_t magic;\n\tuint32_t version;\n\tuint32_t flags;\n\tuint32_t nr_modules;\n\tuint64_t modlist_paddr;\n\tuint64_t cmdline_paddr;\n\tuint64_t rsdp_paddr;\n\tuint64_t memmap_paddr;\n\tuint32_t memmap_entries;\n\tuint32_t reserved;\n};\n\nstruct hw_breakpoint {\n\tunsigned int enabled;\n\tlong unsigned int addr;\n\tint len;\n\tint type;\n\tstruct perf_event **pev;\n};\n\nstruct hw_perf_event_extra {\n\tu64 config;\n\tunsigned int reg;\n\tint alloc;\n\tint idx;\n};\n\nstruct rhlist_head {\n\tstruct rhash_head rhead;\n\tstruct rhlist_head *next;\n};\n\nstruct hw_perf_event {\n\tunion {\n\t\tstruct {\n\t\t\tu64 config;\n\t\t\tu64 last_tag;\n\t\t\tlong unsigned int config_base;\n\t\t\tlong unsigned int event_base;\n\t\t\tint event_base_rdpmc;\n\t\t\tint idx;\n\t\t\tint last_cpu;\n\t\t\tint flags;\n\t\t\tstruct hw_perf_event_extra extra_reg;\n\t\t\tstruct hw_perf_event_extra branch_reg;\n\t\t};\n\t\tstruct {\n\t\t\tstruct hrtimer hrtimer;\n\t\t};\n\t\tstruct {\n\t\t\tstruct list_head tp_list;\n\t\t};\n\t\tstruct {\n\t\t\tu64 pwr_acc;\n\t\t\tu64 ptsc;\n\t\t};\n\t\tstruct {\n\t\t\tstruct arch_hw_breakpoint info;\n\t\t\tstruct rhlist_head bp_list;\n\t\t};\n\t\tstruct {\n\t\t\tu8 iommu_bank;\n\t\t\tu8 iommu_cntr;\n\t\t\tu16 padding;\n\t\t\tu64 conf;\n\t\t\tu64 conf1;\n\t\t};\n\t};\n\tstruct task_struct *target;\n\tvoid *addr_filters;\n\tlong unsigned int addr_filters_gen;\n\tint state;\n\tlocal64_t prev_count;\n\tu64 sample_period;\n\tunion {\n\t\tstruct {\n\t\t\tu64 last_period;\n\t\t\tlocal64_t period_left;\n\t\t};\n\t\tstruct {\n\t\t\tu64 saved_metric;\n\t\t\tu64 saved_slots;\n\t\t};\n\t};\n\tu64 interrupts_seq;\n\tu64 interrupts;\n\tu64 freq_time_stamp;\n\tu64 freq_count_stamp;\n};\n\nstruct hw_port_info {\n\tstruct net_device *lower_dev;\n\tu32 port_id;\n};\n\nstruct hwlat_data {\n\tstruct mutex lock;\n\tu64 count;\n\tu64 sample_window;\n\tu64 sample_width;\n\tint thread_mode;\n};\n\nstruct hwlat_entry {\n\tstruct trace_entry ent;\n\tu64 duration;\n\tu64 outer_duration;\n\tu64 nmi_total_ts;\n\tstruct timespec64 timestamp;\n\tunsigned int nmi_count;\n\tunsigned int seqnum;\n\tunsigned int count;\n};\n\nstruct hwlat_kthread_data {\n\tstruct task_struct *kthread;\n\tu64 nmi_ts_start;\n\tu64 nmi_total_ts;\n\tint nmi_count;\n\tint nmi_cpu;\n};\n\nstruct hwlat_sample {\n\tu64 seqnum;\n\tu64 duration;\n\tu64 outer_duration;\n\tu64 nmi_total_ts;\n\tstruct timespec64 timestamp;\n\tint nmi_count;\n\tint count;\n};\n\nstruct hwmon_channel_info {\n\tenum hwmon_sensor_types type;\n\tconst u32 *config;\n};\n\nstruct hwmon_ops;\n\nstruct hwmon_chip_info {\n\tconst struct hwmon_ops *ops;\n\tconst struct hwmon_channel_info * const *info;\n};\n\nstruct hwmon_device {\n\tconst char *name;\n\tconst char *label;\n\tstruct device dev;\n\tconst struct hwmon_chip_info *chip;\n\tstruct list_head tzdata;\n\tstruct attribute_group group;\n\tconst struct attribute_group **groups;\n};\n\nstruct hwmon_device_attribute {\n\tstruct device_attribute dev_attr;\n\tconst struct hwmon_ops *ops;\n\tenum hwmon_sensor_types type;\n\tu32 attr;\n\tint index;\n\tchar name[32];\n};\n\nstruct hwmon_ops {\n\tumode_t (*is_visible)(const void *, enum hwmon_sensor_types, u32, int);\n\tint (*read)(struct device *, enum hwmon_sensor_types, u32, int, long int *);\n\tint (*read_string)(struct device *, enum hwmon_sensor_types, u32, int, const char **);\n\tint (*write)(struct device *, enum hwmon_sensor_types, u32, int, long int);\n};\n\nstruct hwmon_type_attr_list {\n\tconst u32 *attrs;\n\tsize_t n_attrs;\n};\n\nstruct to_kill {\n\tstruct list_head nd;\n\tstruct task_struct *tsk;\n\tlong unsigned int addr;\n\tshort int size_shift;\n};\n\nstruct hwpoison_walk {\n\tstruct to_kill tk;\n\tlong unsigned int pfn;\n\tint flags;\n};\n\nstruct hwrng {\n\tconst char *name;\n\tint (*init)(struct hwrng *);\n\tvoid (*cleanup)(struct hwrng *);\n\tint (*data_present)(struct hwrng *, int);\n\tint (*data_read)(struct hwrng *, u32 *);\n\tint (*read)(struct hwrng *, void *, size_t, bool);\n\tlong unsigned int priv;\n\tshort unsigned int quality;\n\tstruct list_head list;\n\tstruct kref ref;\n\tstruct completion cleanup_done;\n\tstruct completion dying;\n};\n\nstruct hwspinlock_device;\n\nstruct hwspinlock {\n\tstruct hwspinlock_device *bank;\n\tspinlock_t lock;\n\tvoid *priv;\n};\n\nstruct hwspinlock_ops;\n\nstruct hwspinlock_device {\n\tstruct device *dev;\n\tconst struct hwspinlock_ops *ops;\n\tint base_id;\n\tint num_locks;\n\tstruct hwspinlock lock[0];\n};\n\nstruct hwspinlock_ops {\n\tint (*trylock)(struct hwspinlock *);\n\tvoid (*unlock)(struct hwspinlock *);\n\tint (*bust)(struct hwspinlock *, unsigned int);\n\tvoid (*relax)(struct hwspinlock *);\n};\n\nstruct hwtstamp_config {\n\tint flags;\n\tint tx_type;\n\tint rx_filter;\n};\n\nstruct hyp_sysfs_attr {\n\tstruct attribute attr;\n\tssize_t (*show)(struct hyp_sysfs_attr *, char *);\n\tssize_t (*store)(struct hyp_sysfs_attr *, const char *, size_t);\n\tunion {\n\t\tvoid *hyp_attr_data;\n\t\tlong unsigned int hyp_attr_value;\n\t};\n};\n\nstruct hyperv_root_ir_data {\n\tu8 ioapic_id;\n\tbool is_level;\n\tstruct hv_interrupt_entry entry;\n} __attribute__((packed));\n\nstruct x86_hyper_init {\n\tvoid (*init_platform)(void);\n\tvoid (*guest_late_init)(void);\n\tbool (*x2apic_available)(void);\n\tbool (*msi_ext_dest_id)(void);\n\tvoid (*init_mem_mapping)(void);\n\tvoid (*init_after_bootmem)(void);\n};\n\nstruct x86_hyper_runtime {\n\tvoid (*pin_vcpu)(int);\n\tvoid (*sev_es_hcall_prepare)(struct ghcb *, struct pt_regs *);\n\tbool (*sev_es_hcall_finish)(struct ghcb *, struct pt_regs *);\n\tbool (*is_private_mmio)(u64);\n};\n\nstruct hypervisor_x86 {\n\tconst char *name;\n\tuint32_t (*detect)(void);\n\tenum x86_hypervisor_type type;\n\tstruct x86_hyper_init init;\n\tstruct x86_hyper_runtime runtime;\n\tbool ignore_nopv;\n};\n\nstruct i2c_acpi_handler_data {\n\tstruct acpi_connection_info info;\n\tstruct i2c_adapter *adapter;\n};\n\nstruct i2c_acpi_irq_context {\n\tint irq;\n\tbool wake_capable;\n};\n\nstruct i2c_acpi_lookup {\n\tstruct i2c_board_info *info;\n\tacpi_handle adapter_handle;\n\tacpi_handle device_handle;\n\tacpi_handle search_handle;\n\tint n;\n\tint index;\n\tu32 speed;\n\tu32 min_speed;\n\tu32 force_speed;\n};\n\nstruct i2c_adapter_quirks {\n\tu64 flags;\n\tint max_num_msgs;\n\tu16 max_write_len;\n\tu16 max_read_len;\n\tu16 max_comb_1st_msg_len;\n\tu16 max_comb_2nd_msg_len;\n};\n\nunion i2c_smbus_data;\n\nstruct i2c_algorithm {\n\tunion {\n\t\tint (*xfer)(struct i2c_adapter *, struct i2c_msg *, int);\n\t\tint (*master_xfer)(struct i2c_adapter *, struct i2c_msg *, int);\n\t};\n\tunion {\n\t\tint (*xfer_atomic)(struct i2c_adapter *, struct i2c_msg *, int);\n\t\tint (*master_xfer_atomic)(struct i2c_adapter *, struct i2c_msg *, int);\n\t};\n\tint (*smbus_xfer)(struct i2c_adapter *, u16, short unsigned int, char, u8, int, union i2c_smbus_data *);\n\tint (*smbus_xfer_atomic)(struct i2c_adapter *, u16, short unsigned int, char, u8, int, union i2c_smbus_data *);\n\tu32 (*functionality)(struct i2c_adapter *);\n};\n\nstruct i2c_board_info {\n\tchar type[20];\n\tshort unsigned int flags;\n\tshort unsigned int addr;\n\tconst char *dev_name;\n\tvoid *platform_data;\n\tstruct device_node *of_node;\n\tstruct fwnode_handle *fwnode;\n\tconst struct software_node *swnode;\n\tconst struct resource *resources;\n\tunsigned int num_resources;\n\tint irq;\n};\n\nstruct i2c_client {\n\tshort unsigned int flags;\n\tshort unsigned int addr;\n\tchar name[20];\n\tstruct i2c_adapter *adapter;\n\tstruct device dev;\n\tint init_irq;\n\tint irq;\n\tstruct list_head detected;\n\tvoid *devres_group_id;\n};\n\nstruct i2c_cmd_arg {\n\tunsigned int cmd;\n\tvoid *arg;\n};\n\nstruct i2c_dev {\n\tstruct list_head list;\n\tstruct i2c_adapter *adap;\n\tstruct device dev;\n\tstruct cdev cdev;\n};\n\nstruct i2c_device_id {\n\tchar name[20];\n\tkernel_ulong_t driver_data;\n};\n\nstruct i2c_device_identity {\n\tu16 manufacturer_id;\n\tu16 part_id;\n\tu8 die_revision;\n};\n\nstruct i2c_devinfo {\n\tstruct list_head list;\n\tint busnum;\n\tstruct i2c_board_info board_info;\n};\n\nstruct i2c_dw_semaphore_callbacks {\n\tint (*probe)(struct dw_i2c_dev *);\n\tvoid (*remove)(struct dw_i2c_dev *);\n};\n\nstruct i2c_lock_operations {\n\tvoid (*lock_bus)(struct i2c_adapter *, unsigned int);\n\tint (*trylock_bus)(struct i2c_adapter *, unsigned int);\n\tvoid (*unlock_bus)(struct i2c_adapter *, unsigned int);\n};\n\nstruct i2c_msg {\n\t__u16 addr;\n\t__u16 flags;\n\t__u16 len;\n\t__u8 *buf;\n};\n\nstruct i2c_msg32 {\n\tu16 addr;\n\tu16 flags;\n\tu16 len;\n\tcompat_caddr_t buf;\n};\n\nstruct i2c_rdwr_ioctl_data {\n\tstruct i2c_msg *msgs;\n\t__u32 nmsgs;\n};\n\nstruct i2c_rdwr_ioctl_data32 {\n\tcompat_caddr_t msgs;\n\tu32 nmsgs;\n};\n\nstruct i2c_smbus_alert_setup {\n\tint irq;\n};\n\nunion i2c_smbus_data {\n\t__u8 byte;\n\t__u16 word;\n\t__u8 block[34];\n};\n\nstruct i2c_smbus_ioctl_data {\n\t__u8 read_write;\n\t__u8 command;\n\t__u32 size;\n\tunion i2c_smbus_data *data;\n};\n\nstruct i2c_smbus_ioctl_data32 {\n\tu8 read_write;\n\tu8 command;\n\tu32 size;\n\tcompat_caddr_t data;\n};\n\nstruct user_regs_struct32 {\n\t__u32 ebx;\n\t__u32 ecx;\n\t__u32 edx;\n\t__u32 esi;\n\t__u32 edi;\n\t__u32 ebp;\n\t__u32 eax;\n\tshort unsigned int ds;\n\tshort unsigned int __ds;\n\tshort unsigned int es;\n\tshort unsigned int __es;\n\tshort unsigned int fs;\n\tshort unsigned int __fs;\n\tshort unsigned int gs;\n\tshort unsigned int __gs;\n\t__u32 orig_eax;\n\t__u32 eip;\n\tshort unsigned int cs;\n\tshort unsigned int __cs;\n\t__u32 eflags;\n\t__u32 esp;\n\tshort unsigned int ss;\n\tshort unsigned int __ss;\n};\n\nstruct i386_elf_prstatus {\n\tstruct compat_elf_prstatus_common common;\n\tstruct user_regs_struct32 pr_reg;\n\tcompat_int_t pr_fpvalid;\n};\n\nstruct i8042_port {\n\tstruct serio *serio;\n\tint irq;\n\tbool exists;\n\tbool driver_bound;\n\tsigned char mux;\n};\n\nstruct iattr {\n\tunsigned int ia_valid;\n\tumode_t ia_mode;\n\tunion {\n\t\tkuid_t ia_uid;\n\t\tvfsuid_t ia_vfsuid;\n\t};\n\tunion {\n\t\tkgid_t ia_gid;\n\t\tvfsgid_t ia_vfsgid;\n\t};\n\tloff_t ia_size;\n\tstruct timespec64 ia_atime;\n\tstruct timespec64 ia_mtime;\n\tstruct timespec64 ia_ctime;\n\tstruct file *ia_file;\n};\n\nstruct ib_pd;\n\nstruct ib_uobject;\n\nstruct ib_gid_attr;\n\nstruct ib_ah {\n\tstruct ib_device *device;\n\tstruct ib_pd *pd;\n\tstruct ib_uobject *uobject;\n\tconst struct ib_gid_attr *sgid_attr;\n\tenum rdma_ah_attr_type type;\n};\n\nstruct ib_ah_attr {\n\tu16 dlid;\n\tu8 src_path_bits;\n};\n\nstruct ib_core_device {\n\tstruct device dev;\n\tpossible_net_t rdma_net;\n\tstruct kobject *ports_kobj;\n\tstruct list_head port_list;\n\tstruct ib_device *owner;\n};\n\nstruct ib_counters {\n\tstruct ib_device *device;\n\tstruct ib_uobject *uobject;\n\tatomic_t usecnt;\n};\n\nstruct ib_counters_read_attr {\n\tu64 *counters_buff;\n\tu32 ncounters;\n\tu32 flags;\n};\n\nstruct ib_ucq_object;\n\nstruct ib_cq;\n\ntypedef void (*ib_comp_handler)(struct ib_cq *, void *);\n\nstruct irq_poll;\n\ntypedef int irq_poll_fn(struct irq_poll *, int);\n\nstruct irq_poll {\n\tstruct list_head list;\n\tlong unsigned int state;\n\tint weight;\n\tirq_poll_fn *poll;\n};\n\nstruct rdma_restrack_entry {\n\tbool valid;\n\tu8 no_track: 1;\n\tstruct kref kref;\n\tstruct completion comp;\n\tstruct task_struct *task;\n\tconst char *kern_name;\n\tenum rdma_restrack_type type;\n\tbool user;\n\tu32 id;\n};\n\nstruct ib_event;\n\nstruct ib_wc;\n\nstruct ib_cq {\n\tstruct ib_device *device;\n\tstruct ib_ucq_object *uobject;\n\tib_comp_handler comp_handler;\n\tvoid (*event_handler)(struct ib_event *, void *);\n\tvoid *cq_context;\n\tint cqe;\n\tunsigned int cqe_used;\n\tatomic_t usecnt;\n\tenum ib_poll_context poll_ctx;\n\tstruct ib_wc *wc;\n\tstruct list_head pool_entry;\n\tunion {\n\t\tstruct irq_poll iop;\n\t\tstruct work_struct work;\n\t};\n\tstruct workqueue_struct *comp_wq;\n\tstruct dim *dim;\n\tktime_t timestamp;\n\tu8 interrupt: 1;\n\tu8 shared: 1;\n\tunsigned int comp_vector;\n\tstruct rdma_restrack_entry res;\n};\n\nstruct ib_cq_caps {\n\tu16 max_cq_moderation_count;\n\tu16 max_cq_moderation_period;\n};\n\nstruct ib_cq_init_attr {\n\tunsigned int cqe;\n\tu32 comp_vector;\n\tu32 flags;\n};\n\nstruct ib_cqe {\n\tvoid (*done)(struct ib_cq *, struct ib_wc *);\n};\n\nstruct ib_mad;\n\nstruct uverbs_attr_bundle;\n\nstruct rdma_cm_id;\n\nstruct iw_cm_id;\n\nstruct iw_cm_conn_param;\n\nstruct ib_qp;\n\nstruct ib_send_wr;\n\nstruct ib_recv_wr;\n\nstruct ib_srq;\n\nstruct ib_grh;\n\nstruct ib_device_attr;\n\nstruct ib_udata;\n\nstruct ib_device_modify;\n\nstruct ib_port_attr;\n\nstruct ib_port_modify;\n\nstruct ib_port_immutable;\n\nstruct rdma_netdev_alloc_params;\n\nunion ib_gid;\n\nstruct ib_ucontext;\n\nstruct rdma_user_mmap_entry;\n\nstruct rdma_ah_init_attr;\n\nstruct rdma_ah_attr;\n\nstruct ib_srq_init_attr;\n\nstruct ib_srq_attr;\n\nstruct ib_qp_init_attr;\n\nstruct ib_qp_attr;\n\nstruct ib_mr;\n\nstruct ib_sge;\n\nstruct ib_mr_status;\n\nstruct ib_mw;\n\nstruct ib_xrcd;\n\nstruct ib_flow;\n\nstruct ib_flow_attr;\n\nstruct ib_flow_action;\n\nstruct ifla_vf_info;\n\nstruct ifla_vf_stats;\n\nstruct ifla_vf_guid;\n\nstruct ib_wq;\n\nstruct ib_wq_init_attr;\n\nstruct ib_wq_attr;\n\nstruct ib_rwq_ind_table;\n\nstruct ib_rwq_ind_table_init_attr;\n\nstruct ib_dm;\n\nstruct ib_dm_alloc_attr;\n\nstruct ib_dm_mr_attr;\n\nstruct rdma_hw_stats;\n\nstruct rdma_counter;\n\nstruct ib_device_ops {\n\tstruct module *owner;\n\tenum rdma_driver_id driver_id;\n\tu32 uverbs_abi_ver;\n\tunsigned int uverbs_no_driver_id_binding: 1;\n\tconst struct attribute_group *device_group;\n\tconst struct attribute_group **port_groups;\n\tint (*post_send)(struct ib_qp *, const struct ib_send_wr *, const struct ib_send_wr **);\n\tint (*post_recv)(struct ib_qp *, const struct ib_recv_wr *, const struct ib_recv_wr **);\n\tvoid (*drain_rq)(struct ib_qp *);\n\tvoid (*drain_sq)(struct ib_qp *);\n\tint (*poll_cq)(struct ib_cq *, int, struct ib_wc *);\n\tint (*peek_cq)(struct ib_cq *, int);\n\tint (*req_notify_cq)(struct ib_cq *, enum ib_cq_notify_flags);\n\tint (*post_srq_recv)(struct ib_srq *, const struct ib_recv_wr *, const struct ib_recv_wr **);\n\tint (*process_mad)(struct ib_device *, int, u32, const struct ib_wc *, const struct ib_grh *, const struct ib_mad *, struct ib_mad *, size_t *, u16 *);\n\tint (*query_device)(struct ib_device *, struct ib_device_attr *, struct ib_udata *);\n\tint (*modify_device)(struct ib_device *, int, struct ib_device_modify *);\n\tvoid (*get_dev_fw_str)(struct ib_device *, char *);\n\tconst struct cpumask * (*get_vector_affinity)(struct ib_device *, int);\n\tint (*query_port)(struct ib_device *, u32, struct ib_port_attr *);\n\tint (*modify_port)(struct ib_device *, u32, int, struct ib_port_modify *);\n\tint (*get_port_immutable)(struct ib_device *, u32, struct ib_port_immutable *);\n\tenum rdma_link_layer (*get_link_layer)(struct ib_device *, u32);\n\tstruct net_device * (*get_netdev)(struct ib_device *, u32);\n\tstruct net_device * (*alloc_rdma_netdev)(struct ib_device *, u32, enum rdma_netdev_t, const char *, unsigned char, void (*)(struct net_device *));\n\tint (*rdma_netdev_get_params)(struct ib_device *, u32, enum rdma_netdev_t, struct rdma_netdev_alloc_params *);\n\tint (*query_gid)(struct ib_device *, u32, int, union ib_gid *);\n\tint (*add_gid)(const struct ib_gid_attr *, void **);\n\tint (*del_gid)(const struct ib_gid_attr *, void **);\n\tint (*query_pkey)(struct ib_device *, u32, u16, u16 *);\n\tint (*alloc_ucontext)(struct ib_ucontext *, struct ib_udata *);\n\tvoid (*dealloc_ucontext)(struct ib_ucontext *);\n\tint (*mmap)(struct ib_ucontext *, struct vm_area_struct *);\n\tvoid (*mmap_free)(struct rdma_user_mmap_entry *);\n\tvoid (*disassociate_ucontext)(struct ib_ucontext *);\n\tint (*alloc_pd)(struct ib_pd *, struct ib_udata *);\n\tint (*dealloc_pd)(struct ib_pd *, struct ib_udata *);\n\tint (*create_ah)(struct ib_ah *, struct rdma_ah_init_attr *, struct ib_udata *);\n\tint (*create_user_ah)(struct ib_ah *, struct rdma_ah_init_attr *, struct ib_udata *);\n\tint (*modify_ah)(struct ib_ah *, struct rdma_ah_attr *);\n\tint (*query_ah)(struct ib_ah *, struct rdma_ah_attr *);\n\tint (*destroy_ah)(struct ib_ah *, u32);\n\tint (*create_srq)(struct ib_srq *, struct ib_srq_init_attr *, struct ib_udata *);\n\tint (*modify_srq)(struct ib_srq *, struct ib_srq_attr *, enum ib_srq_attr_mask, struct ib_udata *);\n\tint (*query_srq)(struct ib_srq *, struct ib_srq_attr *);\n\tint (*destroy_srq)(struct ib_srq *, struct ib_udata *);\n\tint (*create_qp)(struct ib_qp *, struct ib_qp_init_attr *, struct ib_udata *);\n\tint (*modify_qp)(struct ib_qp *, struct ib_qp_attr *, int, struct ib_udata *);\n\tint (*query_qp)(struct ib_qp *, struct ib_qp_attr *, int, struct ib_qp_init_attr *);\n\tint (*destroy_qp)(struct ib_qp *, struct ib_udata *);\n\tint (*create_cq)(struct ib_cq *, const struct ib_cq_init_attr *, struct uverbs_attr_bundle *);\n\tint (*modify_cq)(struct ib_cq *, u16, u16);\n\tint (*destroy_cq)(struct ib_cq *, struct ib_udata *);\n\tint (*resize_cq)(struct ib_cq *, int, struct ib_udata *);\n\tstruct ib_mr * (*get_dma_mr)(struct ib_pd *, int);\n\tstruct ib_mr * (*reg_user_mr)(struct ib_pd *, u64, u64, u64, int, struct ib_udata *);\n\tstruct ib_mr * (*reg_user_mr_dmabuf)(struct ib_pd *, u64, u64, u64, int, int, struct ib_udata *);\n\tstruct ib_mr * (*rereg_user_mr)(struct ib_mr *, int, u64, u64, u64, int, struct ib_pd *, struct ib_udata *);\n\tint (*dereg_mr)(struct ib_mr *, struct ib_udata *);\n\tstruct ib_mr * (*alloc_mr)(struct ib_pd *, enum ib_mr_type, u32);\n\tstruct ib_mr * (*alloc_mr_integrity)(struct ib_pd *, u32, u32);\n\tint (*advise_mr)(struct ib_pd *, enum ib_uverbs_advise_mr_advice, u32, struct ib_sge *, u32, struct uverbs_attr_bundle *);\n\tint (*map_mr_sg)(struct ib_mr *, struct scatterlist *, int, unsigned int *);\n\tint (*check_mr_status)(struct ib_mr *, u32, struct ib_mr_status *);\n\tint (*alloc_mw)(struct ib_mw *, struct ib_udata *);\n\tint (*dealloc_mw)(struct ib_mw *);\n\tint (*attach_mcast)(struct ib_qp *, union ib_gid *, u16);\n\tint (*detach_mcast)(struct ib_qp *, union ib_gid *, u16);\n\tint (*alloc_xrcd)(struct ib_xrcd *, struct ib_udata *);\n\tint (*dealloc_xrcd)(struct ib_xrcd *, struct ib_udata *);\n\tstruct ib_flow * (*create_flow)(struct ib_qp *, struct ib_flow_attr *, struct ib_udata *);\n\tint (*destroy_flow)(struct ib_flow *);\n\tint (*destroy_flow_action)(struct ib_flow_action *);\n\tint (*set_vf_link_state)(struct ib_device *, int, u32, int);\n\tint (*get_vf_config)(struct ib_device *, int, u32, struct ifla_vf_info *);\n\tint (*get_vf_stats)(struct ib_device *, int, u32, struct ifla_vf_stats *);\n\tint (*get_vf_guid)(struct ib_device *, int, u32, struct ifla_vf_guid *, struct ifla_vf_guid *);\n\tint (*set_vf_guid)(struct ib_device *, int, u32, u64, int);\n\tstruct ib_wq * (*create_wq)(struct ib_pd *, struct ib_wq_init_attr *, struct ib_udata *);\n\tint (*destroy_wq)(struct ib_wq *, struct ib_udata *);\n\tint (*modify_wq)(struct ib_wq *, struct ib_wq_attr *, u32, struct ib_udata *);\n\tint (*create_rwq_ind_table)(struct ib_rwq_ind_table *, struct ib_rwq_ind_table_init_attr *, struct ib_udata *);\n\tint (*destroy_rwq_ind_table)(struct ib_rwq_ind_table *);\n\tstruct ib_dm * (*alloc_dm)(struct ib_device *, struct ib_ucontext *, struct ib_dm_alloc_attr *, struct uverbs_attr_bundle *);\n\tint (*dealloc_dm)(struct ib_dm *, struct uverbs_attr_bundle *);\n\tstruct ib_mr * (*reg_dm_mr)(struct ib_pd *, struct ib_dm *, struct ib_dm_mr_attr *, struct uverbs_attr_bundle *);\n\tint (*create_counters)(struct ib_counters *, struct uverbs_attr_bundle *);\n\tint (*destroy_counters)(struct ib_counters *);\n\tint (*read_counters)(struct ib_counters *, struct ib_counters_read_attr *, struct uverbs_attr_bundle *);\n\tint (*map_mr_sg_pi)(struct ib_mr *, struct scatterlist *, int, unsigned int *, struct scatterlist *, int, unsigned int *);\n\tstruct rdma_hw_stats * (*alloc_hw_device_stats)(struct ib_device *);\n\tstruct rdma_hw_stats * (*alloc_hw_port_stats)(struct ib_device *, u32);\n\tint (*get_hw_stats)(struct ib_device *, struct rdma_hw_stats *, u32, int);\n\tint (*modify_hw_stat)(struct ib_device *, u32, unsigned int, bool);\n\tint (*fill_res_mr_entry)(struct sk_buff *, struct ib_mr *);\n\tint (*fill_res_mr_entry_raw)(struct sk_buff *, struct ib_mr *);\n\tint (*fill_res_cq_entry)(struct sk_buff *, struct ib_cq *);\n\tint (*fill_res_cq_entry_raw)(struct sk_buff *, struct ib_cq *);\n\tint (*fill_res_qp_entry)(struct sk_buff *, struct ib_qp *);\n\tint (*fill_res_qp_entry_raw)(struct sk_buff *, struct ib_qp *);\n\tint (*fill_res_cm_id_entry)(struct sk_buff *, struct rdma_cm_id *);\n\tint (*fill_res_srq_entry)(struct sk_buff *, struct ib_srq *);\n\tint (*fill_res_srq_entry_raw)(struct sk_buff *, struct ib_srq *);\n\tint (*enable_driver)(struct ib_device *);\n\tvoid (*dealloc_driver)(struct ib_device *);\n\tvoid (*iw_add_ref)(struct ib_qp *);\n\tvoid (*iw_rem_ref)(struct ib_qp *);\n\tstruct ib_qp * (*iw_get_qp)(struct ib_device *, int);\n\tint (*iw_connect)(struct iw_cm_id *, struct iw_cm_conn_param *);\n\tint (*iw_accept)(struct iw_cm_id *, struct iw_cm_conn_param *);\n\tint (*iw_reject)(struct iw_cm_id *, const void *, u8);\n\tint (*iw_create_listen)(struct iw_cm_id *, int);\n\tint (*iw_destroy_listen)(struct iw_cm_id *);\n\tint (*counter_bind_qp)(struct rdma_counter *, struct ib_qp *);\n\tint (*counter_unbind_qp)(struct ib_qp *);\n\tint (*counter_dealloc)(struct rdma_counter *);\n\tstruct rdma_hw_stats * (*counter_alloc_stats)(struct rdma_counter *);\n\tint (*counter_update_stats)(struct rdma_counter *);\n\tint (*fill_stat_mr_entry)(struct sk_buff *, struct ib_mr *);\n\tint (*query_ucontext)(struct ib_ucontext *, struct uverbs_attr_bundle *);\n\tint (*get_numa_node)(struct ib_device *);\n\tstruct ib_device * (*add_sub_dev)(struct ib_device *, enum rdma_nl_dev_type, const char *);\n\tvoid (*del_sub_dev)(struct ib_device *);\n\tsize_t size_ib_ah;\n\tsize_t size_ib_counters;\n\tsize_t size_ib_cq;\n\tsize_t size_ib_mw;\n\tsize_t size_ib_pd;\n\tsize_t size_ib_qp;\n\tsize_t size_ib_rwq_ind_table;\n\tsize_t size_ib_srq;\n\tsize_t size_ib_ucontext;\n\tsize_t size_ib_xrcd;\n};\n\nstruct ib_odp_caps {\n\tuint64_t general_caps;\n\tstruct {\n\t\tuint32_t rc_odp_caps;\n\t\tuint32_t uc_odp_caps;\n\t\tuint32_t ud_odp_caps;\n\t\tuint32_t xrc_odp_caps;\n\t} per_transport_caps;\n};\n\nstruct ib_rss_caps {\n\tu32 supported_qpts;\n\tu32 max_rwq_indirection_tables;\n\tu32 max_rwq_indirection_table_size;\n};\n\nstruct ib_tm_caps {\n\tu32 max_rndv_hdr_size;\n\tu32 max_num_tags;\n\tu32 flags;\n\tu32 max_ops;\n\tu32 max_sge;\n};\n\nstruct ib_device_attr {\n\tu64 fw_ver;\n\t__be64 sys_image_guid;\n\tu64 max_mr_size;\n\tu64 page_size_cap;\n\tu32 vendor_id;\n\tu32 vendor_part_id;\n\tu32 hw_ver;\n\tint max_qp;\n\tint max_qp_wr;\n\tu64 device_cap_flags;\n\tu64 kernel_cap_flags;\n\tint max_send_sge;\n\tint max_recv_sge;\n\tint max_sge_rd;\n\tint max_cq;\n\tint max_cqe;\n\tint max_mr;\n\tint max_pd;\n\tint max_qp_rd_atom;\n\tint max_ee_rd_atom;\n\tint max_res_rd_atom;\n\tint max_qp_init_rd_atom;\n\tint max_ee_init_rd_atom;\n\tenum ib_atomic_cap atomic_cap;\n\tenum ib_atomic_cap masked_atomic_cap;\n\tint max_ee;\n\tint max_rdd;\n\tint max_mw;\n\tint max_raw_ipv6_qp;\n\tint max_raw_ethy_qp;\n\tint max_mcast_grp;\n\tint max_mcast_qp_attach;\n\tint max_total_mcast_qp_attach;\n\tint max_ah;\n\tint max_srq;\n\tint max_srq_wr;\n\tint max_srq_sge;\n\tunsigned int max_fast_reg_page_list_len;\n\tunsigned int max_pi_fast_reg_page_list_len;\n\tu16 max_pkeys;\n\tu8 local_ca_ack_delay;\n\tint sig_prot_cap;\n\tint sig_guard_cap;\n\tstruct ib_odp_caps odp_caps;\n\tuint64_t timestamp_mask;\n\tuint64_t hca_core_clock;\n\tstruct ib_rss_caps rss_caps;\n\tu32 max_wq_type_rq;\n\tu32 raw_packet_caps;\n\tstruct ib_tm_caps tm_caps;\n\tstruct ib_cq_caps cq_caps;\n\tu64 max_dm_size;\n\tu32 max_sgl_rd;\n};\n\nstruct hw_stats_device_data;\n\nstruct rdmacg_device {\n\tstruct list_head dev_node;\n\tstruct list_head rpools;\n\tchar *name;\n};\n\nstruct rdma_restrack_root;\n\nstruct uapi_definition;\n\nstruct ib_port_data;\n\nstruct rdma_link_ops;\n\nstruct ib_device {\n\tstruct device *dma_device;\n\tstruct ib_device_ops ops;\n\tchar name[64];\n\tstruct callback_head callback_head;\n\tstruct list_head event_handler_list;\n\tstruct rw_semaphore event_handler_rwsem;\n\tspinlock_t qp_open_list_lock;\n\tstruct rw_semaphore client_data_rwsem;\n\tstruct xarray client_data;\n\tstruct mutex unregistration_lock;\n\trwlock_t cache_lock;\n\tstruct ib_port_data *port_data;\n\tint num_comp_vectors;\n\tunion {\n\t\tstruct device dev;\n\t\tstruct ib_core_device coredev;\n\t};\n\tconst struct attribute_group *groups[4];\n\tu64 uverbs_cmd_mask;\n\tchar node_desc[64];\n\t__be64 node_guid;\n\tu32 local_dma_lkey;\n\tu16 is_switch: 1;\n\tu16 kverbs_provider: 1;\n\tu16 use_cq_dim: 1;\n\tu8 node_type;\n\tu32 phys_port_cnt;\n\tstruct ib_device_attr attrs;\n\tstruct hw_stats_device_data *hw_stats_data;\n\tstruct rdmacg_device cg_device;\n\tu32 index;\n\tspinlock_t cq_pools_lock;\n\tstruct list_head cq_pools[3];\n\tstruct rdma_restrack_root *res;\n\tconst struct uapi_definition *driver_def;\n\trefcount_t refcount;\n\tstruct completion unreg_completion;\n\tstruct work_struct unregistration_work;\n\tconst struct rdma_link_ops *link_ops;\n\tstruct mutex compat_devs_mutex;\n\tstruct xarray compat_devs;\n\tchar iw_ifname[16];\n\tu32 iw_driver_flags;\n\tu32 lag_flags;\n\tstruct mutex subdev_lock;\n\tstruct list_head subdev_list_head;\n\tenum rdma_nl_dev_type type;\n\tstruct ib_device *parent;\n\tstruct list_head subdev_list;\n\tenum rdma_nl_name_assign_type name_assign_type;\n};\n\nstruct ib_device_modify {\n\tu64 sys_image_guid;\n\tchar node_desc[64];\n};\n\nstruct ib_dm {\n\tstruct ib_device *device;\n\tu32 length;\n\tu32 flags;\n\tstruct ib_uobject *uobject;\n\tatomic_t usecnt;\n};\n\nstruct ib_dm_alloc_attr {\n\tu64 length;\n\tu32 alignment;\n\tu32 flags;\n};\n\nstruct ib_dm_mr_attr {\n\tu64 length;\n\tu64 offset;\n\tu32 access_flags;\n};\n\nstruct ib_event {\n\tstruct ib_device *device;\n\tunion {\n\t\tstruct ib_cq *cq;\n\t\tstruct ib_qp *qp;\n\t\tstruct ib_srq *srq;\n\t\tstruct ib_wq *wq;\n\t\tu32 port_num;\n\t} element;\n\tenum ib_event_type event;\n};\n\nstruct ib_flow {\n\tstruct ib_qp *qp;\n\tstruct ib_device *device;\n\tstruct ib_uobject *uobject;\n};\n\nstruct ib_flow_action {\n\tstruct ib_device *device;\n\tstruct ib_uobject *uobject;\n\tenum ib_flow_action_type type;\n\tatomic_t usecnt;\n};\n\nstruct ib_flow_eth_filter {\n\tu8 dst_mac[6];\n\tu8 src_mac[6];\n\t__be16 ether_type;\n\t__be16 vlan_tag;\n};\n\nstruct ib_flow_spec_eth {\n\tu32 type;\n\tu16 size;\n\tstruct ib_flow_eth_filter val;\n\tstruct ib_flow_eth_filter mask;\n};\n\nstruct ib_flow_ib_filter {\n\t__be16 dlid;\n\t__u8 sl;\n};\n\nstruct ib_flow_spec_ib {\n\tu32 type;\n\tu16 size;\n\tstruct ib_flow_ib_filter val;\n\tstruct ib_flow_ib_filter mask;\n};\n\nstruct ib_flow_ipv4_filter {\n\t__be32 src_ip;\n\t__be32 dst_ip;\n\tu8 proto;\n\tu8 tos;\n\tu8 ttl;\n\tu8 flags;\n};\n\nstruct ib_flow_spec_ipv4 {\n\tu32 type;\n\tu16 size;\n\tstruct ib_flow_ipv4_filter val;\n\tstruct ib_flow_ipv4_filter mask;\n};\n\nstruct ib_flow_tcp_udp_filter {\n\t__be16 dst_port;\n\t__be16 src_port;\n};\n\nstruct ib_flow_spec_tcp_udp {\n\tu32 type;\n\tu16 size;\n\tstruct ib_flow_tcp_udp_filter val;\n\tstruct ib_flow_tcp_udp_filter mask;\n};\n\nstruct ib_flow_ipv6_filter {\n\tu8 src_ip[16];\n\tu8 dst_ip[16];\n\t__be32 flow_label;\n\tu8 next_hdr;\n\tu8 traffic_class;\n\tu8 hop_limit;\n} __attribute__((packed));\n\nstruct ib_flow_spec_ipv6 {\n\tu32 type;\n\tu16 size;\n\tstruct ib_flow_ipv6_filter val;\n\tstruct ib_flow_ipv6_filter mask;\n};\n\nstruct ib_flow_tunnel_filter {\n\t__be32 tunnel_id;\n};\n\nstruct ib_flow_spec_tunnel {\n\tu32 type;\n\tu16 size;\n\tstruct ib_flow_tunnel_filter val;\n\tstruct ib_flow_tunnel_filter mask;\n};\n\nstruct ib_flow_esp_filter {\n\t__be32 spi;\n\t__be32 seq;\n};\n\nstruct ib_flow_spec_esp {\n\tu32 type;\n\tu16 size;\n\tstruct ib_flow_esp_filter val;\n\tstruct ib_flow_esp_filter mask;\n};\n\nstruct ib_flow_gre_filter {\n\t__be16 c_ks_res0_ver;\n\t__be16 protocol;\n\t__be32 key;\n};\n\nstruct ib_flow_spec_gre {\n\tu32 type;\n\tu16 size;\n\tstruct ib_flow_gre_filter val;\n\tstruct ib_flow_gre_filter mask;\n};\n\nstruct ib_flow_mpls_filter {\n\t__be32 tag;\n};\n\nstruct ib_flow_spec_mpls {\n\tu32 type;\n\tu16 size;\n\tstruct ib_flow_mpls_filter val;\n\tstruct ib_flow_mpls_filter mask;\n};\n\nstruct ib_flow_spec_action_tag {\n\tenum ib_flow_spec_type type;\n\tu16 size;\n\tu32 tag_id;\n};\n\nstruct ib_flow_spec_action_drop {\n\tenum ib_flow_spec_type type;\n\tu16 size;\n};\n\nstruct ib_flow_spec_action_handle {\n\tenum ib_flow_spec_type type;\n\tu16 size;\n\tstruct ib_flow_action *act;\n};\n\nstruct ib_flow_spec_action_count {\n\tenum ib_flow_spec_type type;\n\tu16 size;\n\tstruct ib_counters *counters;\n};\n\nunion ib_flow_spec {\n\tstruct {\n\t\tu32 type;\n\t\tu16 size;\n\t};\n\tstruct ib_flow_spec_eth eth;\n\tstruct ib_flow_spec_ib ib;\n\tstruct ib_flow_spec_ipv4 ipv4;\n\tstruct ib_flow_spec_tcp_udp tcp_udp;\n\tstruct ib_flow_spec_ipv6 ipv6;\n\tstruct ib_flow_spec_tunnel tunnel;\n\tstruct ib_flow_spec_esp esp;\n\tstruct ib_flow_spec_gre gre;\n\tstruct ib_flow_spec_mpls mpls;\n\tstruct ib_flow_spec_action_tag flow_tag;\n\tstruct ib_flow_spec_action_drop drop;\n\tstruct ib_flow_spec_action_handle action;\n\tstruct ib_flow_spec_action_count flow_count;\n};\n\nstruct ib_flow_attr {\n\tenum ib_flow_attr_type type;\n\tu16 size;\n\tu16 priority;\n\tu32 flags;\n\tu8 num_of_specs;\n\tu32 port;\n\tunion ib_flow_spec flows[0];\n};\n\nunion ib_gid {\n\tu8 raw[16];\n\tstruct {\n\t\t__be64 subnet_prefix;\n\t\t__be64 interface_id;\n\t} global;\n};\n\nstruct ib_gid_attr {\n\tstruct net_device *ndev;\n\tstruct ib_device *device;\n\tunion ib_gid gid;\n\tenum ib_gid_type gid_type;\n\tu16 index;\n\tu32 port_num;\n};\n\nstruct ib_global_route {\n\tconst struct ib_gid_attr *sgid_attr;\n\tunion ib_gid dgid;\n\tu32 flow_label;\n\tu8 sgid_index;\n\tu8 hop_limit;\n\tu8 traffic_class;\n};\n\nstruct ib_grh {\n\t__be32 version_tclass_flow;\n\t__be16 paylen;\n\tu8 next_hdr;\n\tu8 hop_limit;\n\tunion ib_gid sgid;\n\tunion ib_gid dgid;\n};\n\nstruct ib_sig_attrs;\n\nstruct ib_mr {\n\tstruct ib_device *device;\n\tstruct ib_pd *pd;\n\tu32 lkey;\n\tu32 rkey;\n\tu64 iova;\n\tu64 length;\n\tunsigned int page_size;\n\tenum ib_mr_type type;\n\tbool need_inval;\n\tunion {\n\t\tstruct ib_uobject *uobject;\n\t\tstruct list_head qp_entry;\n\t};\n\tstruct ib_dm *dm;\n\tstruct ib_sig_attrs *sig_attrs;\n\tstruct rdma_restrack_entry res;\n};\n\nstruct ib_sig_err {\n\tenum ib_sig_err_type err_type;\n\tu32 expected;\n\tu32 actual;\n\tu64 sig_err_offset;\n\tu32 key;\n};\n\nstruct ib_mr_status {\n\tu32 fail_status;\n\tstruct ib_sig_err sig_err;\n};\n\nstruct ib_mw {\n\tstruct ib_device *device;\n\tstruct ib_pd *pd;\n\tstruct ib_uobject *uobject;\n\tu32 rkey;\n\tenum ib_mw_type type;\n};\n\nstruct ib_pd {\n\tu32 local_dma_lkey;\n\tu32 flags;\n\tstruct ib_device *device;\n\tstruct ib_uobject *uobject;\n\tatomic_t usecnt;\n\tu32 unsafe_global_rkey;\n\tstruct ib_mr *__internal_mr;\n\tstruct rdma_restrack_entry res;\n};\n\nstruct ib_port_attr {\n\tu64 subnet_prefix;\n\tenum ib_port_state state;\n\tenum ib_mtu max_mtu;\n\tenum ib_mtu active_mtu;\n\tu32 phys_mtu;\n\tint gid_tbl_len;\n\tunsigned int ip_gids: 1;\n\tu32 port_cap_flags;\n\tu32 max_msg_sz;\n\tu32 bad_pkey_cntr;\n\tu32 qkey_viol_cntr;\n\tu16 pkey_tbl_len;\n\tu32 sm_lid;\n\tu32 lid;\n\tu8 lmc;\n\tu8 max_vl_num;\n\tu8 sm_sl;\n\tu8 subnet_timeout;\n\tu8 init_type_reply;\n\tu8 active_width;\n\tu16 active_speed;\n\tu8 phys_state;\n\tu16 port_cap_flags2;\n};\n\nstruct ib_pkey_cache;\n\nstruct ib_gid_table;\n\nstruct ib_port_cache {\n\tu64 subnet_prefix;\n\tstruct ib_pkey_cache *pkey;\n\tstruct ib_gid_table *gid;\n\tu8 lmc;\n\tenum ib_port_state port_state;\n};\n\nstruct ib_port_immutable {\n\tint pkey_tbl_len;\n\tint gid_tbl_len;\n\tu32 core_cap_flags;\n\tu32 max_mad_size;\n};\n\nstruct rdma_counter_mode {\n\tenum rdma_nl_counter_mode mode;\n\tenum rdma_nl_counter_mask mask;\n\tstruct auto_mode_param param;\n};\n\nstruct rdma_port_counter {\n\tstruct rdma_counter_mode mode;\n\tstruct rdma_hw_stats *hstats;\n\tunsigned int num_counters;\n\tstruct mutex lock;\n};\n\nstruct ib_port;\n\nstruct ib_port_data {\n\tstruct ib_device *ib_dev;\n\tstruct ib_port_immutable immutable;\n\tspinlock_t pkey_list_lock;\n\tspinlock_t netdev_lock;\n\tstruct list_head pkey_list;\n\tstruct ib_port_cache cache;\n\tstruct net_device *netdev;\n\tnetdevice_tracker netdev_tracker;\n\tstruct hlist_node ndev_hash_link;\n\tstruct rdma_port_counter port_counter;\n\tstruct ib_port *sysfs;\n};\n\nstruct ib_port_modify {\n\tu32 set_port_cap_mask;\n\tu32 clr_port_cap_mask;\n\tu8 init_type;\n};\n\nstruct ib_qp_security;\n\nstruct ib_port_pkey {\n\tenum port_pkey_state state;\n\tu16 pkey_index;\n\tu32 port_num;\n\tstruct list_head qp_list;\n\tstruct list_head to_error_list;\n\tstruct ib_qp_security *sec;\n};\n\nstruct ib_ports_pkeys {\n\tstruct ib_port_pkey main;\n\tstruct ib_port_pkey alt;\n};\n\nstruct ib_uqp_object;\n\nstruct ib_qp {\n\tstruct ib_device *device;\n\tstruct ib_pd *pd;\n\tstruct ib_cq *send_cq;\n\tstruct ib_cq *recv_cq;\n\tspinlock_t mr_lock;\n\tint mrs_used;\n\tstruct list_head rdma_mrs;\n\tstruct list_head sig_mrs;\n\tstruct ib_srq *srq;\n\tstruct completion srq_completion;\n\tstruct ib_xrcd *xrcd;\n\tstruct list_head xrcd_list;\n\tatomic_t usecnt;\n\tstruct list_head open_list;\n\tstruct ib_qp *real_qp;\n\tstruct ib_uqp_object *uobject;\n\tvoid (*event_handler)(struct ib_event *, void *);\n\tvoid (*registered_event_handler)(struct ib_event *, void *);\n\tvoid *qp_context;\n\tconst struct ib_gid_attr *av_sgid_attr;\n\tconst struct ib_gid_attr *alt_path_sgid_attr;\n\tu32 qp_num;\n\tu32 max_write_sge;\n\tu32 max_read_sge;\n\tenum ib_qp_type qp_type;\n\tstruct ib_rwq_ind_table *rwq_ind_tbl;\n\tstruct ib_qp_security *qp_sec;\n\tu32 port;\n\tbool integrity_en;\n\tstruct rdma_restrack_entry res;\n\tstruct rdma_counter *counter;\n};\n\nstruct ib_qp_cap {\n\tu32 max_send_wr;\n\tu32 max_recv_wr;\n\tu32 max_send_sge;\n\tu32 max_recv_sge;\n\tu32 max_inline_data;\n\tu32 max_rdma_ctxs;\n};\n\nstruct roce_ah_attr {\n\tu8 dmac[6];\n};\n\nstruct opa_ah_attr {\n\tu32 dlid;\n\tu8 src_path_bits;\n\tbool make_grd;\n};\n\nstruct rdma_ah_attr {\n\tstruct ib_global_route grh;\n\tu8 sl;\n\tu8 static_rate;\n\tu32 port_num;\n\tu8 ah_flags;\n\tenum rdma_ah_attr_type type;\n\tunion {\n\t\tstruct ib_ah_attr ib;\n\t\tstruct roce_ah_attr roce;\n\t\tstruct opa_ah_attr opa;\n\t};\n};\n\nstruct ib_qp_attr {\n\tenum ib_qp_state qp_state;\n\tenum ib_qp_state cur_qp_state;\n\tenum ib_mtu path_mtu;\n\tenum ib_mig_state path_mig_state;\n\tu32 qkey;\n\tu32 rq_psn;\n\tu32 sq_psn;\n\tu32 dest_qp_num;\n\tint qp_access_flags;\n\tstruct ib_qp_cap cap;\n\tstruct rdma_ah_attr ah_attr;\n\tstruct rdma_ah_attr alt_ah_attr;\n\tu16 pkey_index;\n\tu16 alt_pkey_index;\n\tu8 en_sqd_async_notify;\n\tu8 sq_draining;\n\tu8 max_rd_atomic;\n\tu8 max_dest_rd_atomic;\n\tu8 min_rnr_timer;\n\tu32 port_num;\n\tu8 timeout;\n\tu8 retry_cnt;\n\tu8 rnr_retry;\n\tu32 alt_port_num;\n\tu8 alt_timeout;\n\tu32 rate_limit;\n\tstruct net_device *xmit_slave;\n};\n\nstruct ib_qp_init_attr {\n\tvoid (*event_handler)(struct ib_event *, void *);\n\tvoid *qp_context;\n\tstruct ib_cq *send_cq;\n\tstruct ib_cq *recv_cq;\n\tstruct ib_srq *srq;\n\tstruct ib_xrcd *xrcd;\n\tstruct ib_qp_cap cap;\n\tenum ib_sig_type sq_sig_type;\n\tenum ib_qp_type qp_type;\n\tu32 create_flags;\n\tu32 port_num;\n\tstruct ib_rwq_ind_table *rwq_ind_tbl;\n\tu32 source_qpn;\n};\n\nstruct ib_qp_security {\n\tstruct ib_qp *qp;\n\tstruct ib_device *dev;\n\tstruct mutex mutex;\n\tstruct ib_ports_pkeys *ports_pkeys;\n\tstruct list_head shared_qp_list;\n\tvoid *security;\n\tbool destroying;\n\tatomic_t error_list_count;\n\tstruct completion error_complete;\n\tint error_comps_pending;\n};\n\nstruct rdma_cgroup;\n\nstruct ib_rdmacg_object {\n\tstruct rdma_cgroup *cg;\n};\n\nstruct ib_recv_wr {\n\tstruct ib_recv_wr *next;\n\tunion {\n\t\tu64 wr_id;\n\t\tstruct ib_cqe *wr_cqe;\n\t};\n\tstruct ib_sge *sg_list;\n\tint num_sge;\n};\n\nstruct ib_rwq_ind_table {\n\tstruct ib_device *device;\n\tstruct ib_uobject *uobject;\n\tatomic_t usecnt;\n\tu32 ind_tbl_num;\n\tu32 log_ind_tbl_size;\n\tstruct ib_wq **ind_tbl;\n};\n\nstruct ib_rwq_ind_table_init_attr {\n\tu32 log_ind_tbl_size;\n\tstruct ib_wq **ind_tbl;\n};\n\nstruct ib_security_struct {\n\tu32 sid;\n};\n\nstruct ib_send_wr {\n\tstruct ib_send_wr *next;\n\tunion {\n\t\tu64 wr_id;\n\t\tstruct ib_cqe *wr_cqe;\n\t};\n\tstruct ib_sge *sg_list;\n\tint num_sge;\n\tenum ib_wr_opcode opcode;\n\tint send_flags;\n\tunion {\n\t\t__be32 imm_data;\n\t\tu32 invalidate_rkey;\n\t} ex;\n};\n\nstruct ib_sge {\n\tu64 addr;\n\tu32 length;\n\tu32 lkey;\n};\n\nstruct ib_t10_dif_domain {\n\tenum ib_t10_dif_bg_type bg_type;\n\tu16 pi_interval;\n\tu16 bg;\n\tu16 app_tag;\n\tu32 ref_tag;\n\tbool ref_remap;\n\tbool app_escape;\n\tbool ref_escape;\n\tu16 apptag_check_mask;\n};\n\nstruct ib_sig_domain {\n\tenum ib_signature_type sig_type;\n\tunion {\n\t\tstruct ib_t10_dif_domain dif;\n\t} sig;\n};\n\nstruct ib_sig_attrs {\n\tu8 check_mask;\n\tstruct ib_sig_domain mem;\n\tstruct ib_sig_domain wire;\n\tint meta_length;\n};\n\nstruct ib_usrq_object;\n\nstruct ib_srq {\n\tstruct ib_device *device;\n\tstruct ib_pd *pd;\n\tstruct ib_usrq_object *uobject;\n\tvoid (*event_handler)(struct ib_event *, void *);\n\tvoid *srq_context;\n\tenum ib_srq_type srq_type;\n\tatomic_t usecnt;\n\tstruct {\n\t\tstruct ib_cq *cq;\n\t\tunion {\n\t\t\tstruct {\n\t\t\t\tstruct ib_xrcd *xrcd;\n\t\t\t\tu32 srq_num;\n\t\t\t} xrc;\n\t\t};\n\t} ext;\n\tstruct rdma_restrack_entry res;\n};\n\nstruct ib_srq_attr {\n\tu32 max_wr;\n\tu32 max_sge;\n\tu32 srq_limit;\n};\n\nstruct ib_srq_init_attr {\n\tvoid (*event_handler)(struct ib_event *, void *);\n\tvoid *srq_context;\n\tstruct ib_srq_attr attr;\n\tenum ib_srq_type srq_type;\n\tstruct {\n\t\tstruct ib_cq *cq;\n\t\tunion {\n\t\t\tstruct {\n\t\t\t\tstruct ib_xrcd *xrcd;\n\t\t\t} xrc;\n\t\t\tstruct {\n\t\t\t\tu32 max_num_tags;\n\t\t\t} tag_matching;\n\t\t};\n\t} ext;\n};\n\nstruct ib_uverbs_file;\n\nstruct ib_ucontext {\n\tstruct ib_device *device;\n\tstruct ib_uverbs_file *ufile;\n\tstruct ib_rdmacg_object cg_obj;\n\tstruct rdma_restrack_entry res;\n\tstruct xarray mmap_xa;\n};\n\nstruct ib_udata {\n\tconst void *inbuf;\n\tvoid *outbuf;\n\tsize_t inlen;\n\tsize_t outlen;\n};\n\nstruct uverbs_api_object;\n\nstruct ib_uobject {\n\tu64 user_handle;\n\tstruct ib_uverbs_file *ufile;\n\tstruct ib_ucontext *context;\n\tvoid *object;\n\tstruct list_head list;\n\tstruct ib_rdmacg_object cg_obj;\n\tint id;\n\tstruct kref ref;\n\tatomic_t usecnt;\n\tstruct callback_head rcu;\n\tconst struct uverbs_api_object *uapi_object;\n};\n\nstruct ib_wc {\n\tunion {\n\t\tu64 wr_id;\n\t\tstruct ib_cqe *wr_cqe;\n\t};\n\tenum ib_wc_status status;\n\tenum ib_wc_opcode opcode;\n\tu32 vendor_err;\n\tu32 byte_len;\n\tstruct ib_qp *qp;\n\tunion {\n\t\t__be32 imm_data;\n\t\tu32 invalidate_rkey;\n\t} ex;\n\tu32 src_qp;\n\tu32 slid;\n\tint wc_flags;\n\tu16 pkey_index;\n\tu8 sl;\n\tu8 dlid_path_bits;\n\tu32 port_num;\n\tu8 smac[6];\n\tu16 vlan_id;\n\tu8 network_hdr_type;\n};\n\nstruct ib_uwq_object;\n\nstruct ib_wq {\n\tstruct ib_device *device;\n\tstruct ib_uwq_object *uobject;\n\tvoid *wq_context;\n\tvoid (*event_handler)(struct ib_event *, void *);\n\tstruct ib_pd *pd;\n\tstruct ib_cq *cq;\n\tu32 wq_num;\n\tenum ib_wq_state state;\n\tenum ib_wq_type wq_type;\n\tatomic_t usecnt;\n};\n\nstruct ib_wq_attr {\n\tenum ib_wq_state wq_state;\n\tenum ib_wq_state curr_wq_state;\n\tu32 flags;\n\tu32 flags_mask;\n};\n\nstruct ib_wq_init_attr {\n\tvoid *wq_context;\n\tenum ib_wq_type wq_type;\n\tu32 max_wr;\n\tu32 max_sge;\n\tstruct ib_cq *cq;\n\tvoid (*event_handler)(struct ib_event *, void *);\n\tu32 create_flags;\n};\n\nstruct ib_xrcd {\n\tstruct ib_device *device;\n\tatomic_t usecnt;\n\tstruct inode *inode;\n\tstruct rw_semaphore tgt_qps_rwsem;\n\tstruct xarray tgt_qps;\n};\n\nunion ibs_fetch_ctl {\n\t__u64 val;\n\tstruct {\n\t\t__u64 fetch_maxcnt: 16;\n\t\t__u64 fetch_cnt: 16;\n\t\t__u64 fetch_lat: 16;\n\t\t__u64 fetch_en: 1;\n\t\t__u64 fetch_val: 1;\n\t\t__u64 fetch_comp: 1;\n\t\t__u64 ic_miss: 1;\n\t\t__u64 phy_addr_valid: 1;\n\t\t__u64 l1tlb_pgsz: 2;\n\t\t__u64 l1tlb_miss: 1;\n\t\t__u64 l2tlb_miss: 1;\n\t\t__u64 rand_en: 1;\n\t\t__u64 fetch_l2_miss: 1;\n\t\t__u64 l3_miss_only: 1;\n\t\t__u64 fetch_oc_miss: 1;\n\t\t__u64 fetch_l3_miss: 1;\n\t\t__u64 reserved: 2;\n\t};\n};\n\nunion ibs_op_ctl {\n\t__u64 val;\n\tstruct {\n\t\t__u64 opmaxcnt: 16;\n\t\t__u64 l3_miss_only: 1;\n\t\t__u64 op_en: 1;\n\t\t__u64 op_val: 1;\n\t\t__u64 cnt_ctl: 1;\n\t\t__u64 opmaxcnt_ext: 7;\n\t\t__u64 reserved0: 5;\n\t\t__u64 opcurcnt: 27;\n\t\t__u64 reserved1: 5;\n\t};\n};\n\nunion ibs_op_data {\n\t__u64 val;\n\tstruct {\n\t\t__u64 comp_to_ret_ctr: 16;\n\t\t__u64 tag_to_ret_ctr: 16;\n\t\t__u64 reserved1: 2;\n\t\t__u64 op_return: 1;\n\t\t__u64 op_brn_taken: 1;\n\t\t__u64 op_brn_misp: 1;\n\t\t__u64 op_brn_ret: 1;\n\t\t__u64 op_rip_invalid: 1;\n\t\t__u64 op_brn_fuse: 1;\n\t\t__u64 op_microcode: 1;\n\t\t__u64 reserved2: 23;\n\t};\n};\n\nunion ibs_op_data2 {\n\t__u64 val;\n\tstruct {\n\t\t__u64 data_src_lo: 3;\n\t\t__u64 reserved0: 1;\n\t\t__u64 rmt_node: 1;\n\t\t__u64 cache_hit_st: 1;\n\t\t__u64 data_src_hi: 2;\n\t\t__u64 reserved1: 56;\n\t};\n};\n\nunion ibs_op_data3 {\n\t__u64 val;\n\tstruct {\n\t\t__u64 ld_op: 1;\n\t\t__u64 st_op: 1;\n\t\t__u64 dc_l1tlb_miss: 1;\n\t\t__u64 dc_l2tlb_miss: 1;\n\t\t__u64 dc_l1tlb_hit_2m: 1;\n\t\t__u64 dc_l1tlb_hit_1g: 1;\n\t\t__u64 dc_l2tlb_hit_2m: 1;\n\t\t__u64 dc_miss: 1;\n\t\t__u64 dc_mis_acc: 1;\n\t\t__u64 reserved: 4;\n\t\t__u64 dc_wc_mem_acc: 1;\n\t\t__u64 dc_uc_mem_acc: 1;\n\t\t__u64 dc_locked_op: 1;\n\t\t__u64 dc_miss_no_mab_alloc: 1;\n\t\t__u64 dc_lin_addr_valid: 1;\n\t\t__u64 dc_phy_addr_valid: 1;\n\t\t__u64 dc_l2_tlb_hit_1g: 1;\n\t\t__u64 l2_miss: 1;\n\t\t__u64 sw_pf: 1;\n\t\t__u64 op_mem_width: 4;\n\t\t__u64 op_dc_miss_open_mem_reqs: 6;\n\t\t__u64 dc_miss_lat: 16;\n\t\t__u64 tlb_refill_lat: 16;\n\t};\n};\n\nstruct icc_path;\n\nstruct icc_bulk_data {\n\tstruct icc_path *path;\n\tconst char *name;\n\tu32 avg_bw;\n\tu32 peak_bw;\n};\n\nstruct icc_bulk_devres {\n\tstruct icc_bulk_data *paths;\n\tint num_paths;\n};\n\nstruct icc_provider;\n\nstruct icc_node {\n\tint id;\n\tconst char *name;\n\tstruct icc_node **links;\n\tsize_t num_links;\n\tstruct icc_provider *provider;\n\tstruct list_head node_list;\n\tstruct list_head search_list;\n\tstruct icc_node *reverse;\n\tu8 is_traversed: 1;\n\tstruct hlist_head req_list;\n\tu32 avg_bw;\n\tu32 peak_bw;\n\tu32 init_avg;\n\tu32 init_peak;\n\tvoid *data;\n};\n\nstruct icc_node_data {\n\tstruct icc_node *node;\n\tu32 tag;\n};\n\nstruct icc_onecell_data {\n\tunsigned int num_nodes;\n\tstruct icc_node *nodes[0];\n};\n\nstruct icc_req {\n\tstruct hlist_node req_node;\n\tstruct icc_node *node;\n\tstruct device *dev;\n\tbool enabled;\n\tu32 tag;\n\tu32 avg_bw;\n\tu32 peak_bw;\n};\n\nstruct icc_path {\n\tconst char *name;\n\tsize_t num_nodes;\n\tstruct icc_req reqs[0];\n};\n\nstruct icc_provider {\n\tstruct list_head provider_list;\n\tstruct list_head nodes;\n\tint (*set)(struct icc_node *, struct icc_node *);\n\tint (*aggregate)(struct icc_node *, u32, u32, u32, u32 *, u32 *);\n\tvoid (*pre_aggregate)(struct icc_node *);\n\tint (*get_bw)(struct icc_node *, u32 *, u32 *);\n\tstruct icc_node * (*xlate)(const struct of_phandle_args *, void *);\n\tstruct icc_node_data * (*xlate_extended)(const struct of_phandle_args *, void *);\n\tstruct device *dev;\n\tint users;\n\tbool inter_set;\n\tvoid *data;\n};\n\nstruct ich_laptop {\n\tu16 device;\n\tu16 subvendor;\n\tu16 subdevice;\n};\n\nstruct icmp6_err {\n\tint err;\n\tint fatal;\n};\n\nstruct icmp6_filter {\n\t__u32 data[8];\n};\n\nstruct icmpv6_echo {\n\t__be16 identifier;\n\t__be16 sequence;\n};\n\nstruct icmpv6_nd_advt {\n\t__u32 reserved: 5;\n\t__u32 override: 1;\n\t__u32 solicited: 1;\n\t__u32 router: 1;\n\t__u32 reserved2: 24;\n};\n\nstruct icmpv6_nd_ra {\n\t__u8 hop_limit;\n\t__u8 reserved: 3;\n\t__u8 router_pref: 2;\n\t__u8 home_agent: 1;\n\t__u8 other: 1;\n\t__u8 managed: 1;\n\t__be16 rt_lifetime;\n};\n\nstruct icmp6hdr {\n\t__u8 icmp6_type;\n\t__u8 icmp6_code;\n\t__sum16 icmp6_cksum;\n\tunion {\n\t\t__be32 un_data32[1];\n\t\t__be16 un_data16[2];\n\t\t__u8 un_data8[4];\n\t\tstruct icmpv6_echo u_echo;\n\t\tstruct icmpv6_nd_advt u_nd_advt;\n\t\tstruct icmpv6_nd_ra u_nd_ra;\n\t} icmp6_dataun;\n};\n\nstruct icmphdr {\n\t__u8 type;\n\t__u8 code;\n\t__sum16 checksum;\n\tunion {\n\t\tstruct {\n\t\t\t__be16 id;\n\t\t\t__be16 sequence;\n\t\t} echo;\n\t\t__be32 gateway;\n\t\tstruct {\n\t\t\t__be16 __unused;\n\t\t\t__be16 mtu;\n\t\t} frag;\n\t\t__u8 reserved[4];\n\t} un;\n};\n\nstruct ip_options {\n\t__be32 faddr;\n\t__be32 nexthop;\n\tunsigned char optlen;\n\tunsigned char srr;\n\tunsigned char rr;\n\tunsigned char ts;\n\tunsigned char is_strictroute: 1;\n\tunsigned char srr_is_hit: 1;\n\tunsigned char is_changed: 1;\n\tunsigned char rr_needaddr: 1;\n\tunsigned char ts_needtime: 1;\n\tunsigned char ts_needaddr: 1;\n\tunsigned char router_alert;\n\tunsigned char cipso;\n\tunsigned char __pad2;\n\tunsigned char __data[0];\n};\n\nstruct ip_options_rcu {\n\tstruct callback_head rcu;\n\tstruct ip_options opt;\n};\n\nstruct ip_options_data {\n\tstruct ip_options_rcu opt;\n\tchar data[40];\n};\n\nstruct icmp_bxm {\n\tstruct sk_buff *skb;\n\tint offset;\n\tint data_len;\n\tstruct {\n\t\tstruct icmphdr icmph;\n\t\t__be32 times[3];\n\t} data;\n\tint head_len;\n\tstruct ip_options_data replyopts;\n};\n\nstruct icmp_control {\n\tenum skb_drop_reason (*handler)(struct sk_buff *);\n\tshort int error;\n};\n\nstruct icmp_err {\n\tint errno;\n\tunsigned int fatal: 1;\n};\n\nstruct icmp_ext_echo_ctype3_hdr {\n\t__be16 afi;\n\t__u8 addrlen;\n\t__u8 reserved;\n};\n\nstruct icmp_extobj_hdr {\n\t__be16 length;\n\t__u8 class_num;\n\t__u8 class_type;\n};\n\nstruct icmp_ext_echo_iio {\n\tstruct icmp_extobj_hdr extobj_hdr;\n\tunion {\n\t\tchar name[16];\n\t\t__be32 ifindex;\n\t\tstruct {\n\t\t\tstruct icmp_ext_echo_ctype3_hdr ctype3_hdr;\n\t\t\tunion {\n\t\t\t\t__be32 ipv4_addr;\n\t\t\t\tstruct in6_addr ipv6_addr;\n\t\t\t} ip_addr;\n\t\t} addr;\n\t} ident;\n};\n\nstruct icmp_ext_hdr {\n\t__u8 reserved1: 4;\n\t__u8 version: 4;\n\t__u8 reserved2;\n\t__sum16 checksum;\n};\n\nstruct icmp_filter {\n\t__u32 data;\n};\n\nstruct icmp_mib {\n\tlong unsigned int mibs[30];\n};\n\nstruct icmpmsg_mib {\n\tatomic_long_t mibs[512];\n};\n\nstruct icmpv6_mib {\n\tlong unsigned int mibs[7];\n};\n\nstruct icmpv6_mib_device {\n\tatomic_long_t mibs[7];\n};\n\nstruct icmpv6_msg {\n\tstruct sk_buff *skb;\n\tint offset;\n\tuint8_t type;\n};\n\nstruct icmpv6msg_mib {\n\tatomic_long_t mibs[512];\n};\n\nstruct icmpv6msg_mib_device {\n\tatomic_long_t mibs[512];\n};\n\nstruct id_bitmap {\n\tlong unsigned int map[4];\n};\n\nstruct id_proc_event {\n\t__kernel_pid_t process_pid;\n\t__kernel_pid_t process_tgid;\n\tunion {\n\t\t__u32 ruid;\n\t\t__u32 rgid;\n\t} r;\n\tunion {\n\t\t__u32 euid;\n\t\t__u32 egid;\n\t} e;\n};\n\nstruct ida_bitmap {\n\tlong unsigned int bitmap[16];\n};\n\nstruct idempotent {\n\tconst void *cookie;\n\tstruct hlist_node entry;\n\tstruct completion complete;\n\tint ret;\n};\n\nstruct idle_cpu {\n\tstruct cpuidle_state *state_table;\n\tlong unsigned int auto_demotion_disable_flags;\n\tbool byt_auto_demotion_disable_flag;\n\tbool disable_promotion_to_c1e;\n\tbool use_acpi;\n};\n\nstruct idle_inject_device {\n\tstruct hrtimer timer;\n\tunsigned int idle_duration_us;\n\tunsigned int run_duration_us;\n\tunsigned int latency_us;\n\tbool (*update)(void);\n\tlong unsigned int cpumask[0];\n};\n\nstruct idle_inject_thread {\n\tstruct task_struct *tsk;\n\tint should_run;\n};\n\nstruct idle_timer {\n\tstruct hrtimer timer;\n\tint done;\n};\n\nstruct idmap_key {\n\tbool map_up;\n\tu32 id;\n\tu32 count;\n};\n\nstruct idt_data {\n\tunsigned int vector;\n\tunsigned int segment;\n\tstruct idt_bits bits;\n\tconst void *addr;\n};\n\nstruct ieee80211_channel {\n\tenum nl80211_band band;\n\tu32 center_freq;\n\tu16 freq_offset;\n\tu16 hw_value;\n\tu32 flags;\n\tint max_antenna_gain;\n\tint max_power;\n\tint max_reg_power;\n\tbool beacon_found;\n\tu32 orig_flags;\n\tint orig_mag;\n\tint orig_mpwr;\n\tenum nl80211_dfs_state dfs_state;\n\tlong unsigned int dfs_state_entered;\n\tunsigned int dfs_cac_ms;\n\ts8 psd;\n};\n\nstruct ieee80211_eht_cap_elem_fixed {\n\tu8 mac_cap_info[2];\n\tu8 phy_cap_info[9];\n};\n\nstruct ieee80211_eht_mcs_nss_supp_20mhz_only {\n\tunion {\n\t\tstruct {\n\t\t\tu8 rx_tx_mcs7_max_nss;\n\t\t\tu8 rx_tx_mcs9_max_nss;\n\t\t\tu8 rx_tx_mcs11_max_nss;\n\t\t\tu8 rx_tx_mcs13_max_nss;\n\t\t};\n\t\tu8 rx_tx_max_nss[4];\n\t};\n};\n\nstruct ieee80211_eht_mcs_nss_supp_bw {\n\tunion {\n\t\tstruct {\n\t\t\tu8 rx_tx_mcs9_max_nss;\n\t\t\tu8 rx_tx_mcs11_max_nss;\n\t\t\tu8 rx_tx_mcs13_max_nss;\n\t\t};\n\t\tu8 rx_tx_max_nss[3];\n\t};\n};\n\nstruct ieee80211_eht_mcs_nss_supp {\n\tunion {\n\t\tstruct ieee80211_eht_mcs_nss_supp_20mhz_only only_20mhz;\n\t\tstruct {\n\t\t\tstruct ieee80211_eht_mcs_nss_supp_bw _80;\n\t\t\tstruct ieee80211_eht_mcs_nss_supp_bw _160;\n\t\t\tstruct ieee80211_eht_mcs_nss_supp_bw _320;\n\t\t} bw;\n\t};\n};\n\nstruct ieee80211_freq_range {\n\tu32 start_freq_khz;\n\tu32 end_freq_khz;\n\tu32 max_bandwidth_khz;\n};\n\nstruct ieee80211_he_6ghz_capa {\n\t__le16 capa;\n};\n\nstruct ieee80211_he_cap_elem {\n\tu8 mac_cap_info[6];\n\tu8 phy_cap_info[11];\n};\n\nstruct ieee80211_he_mcs_nss_supp {\n\t__le16 rx_mcs_80;\n\t__le16 tx_mcs_80;\n\t__le16 rx_mcs_160;\n\t__le16 tx_mcs_160;\n\t__le16 rx_mcs_80p80;\n\t__le16 tx_mcs_80p80;\n};\n\nstruct ieee80211_iface_limit;\n\nstruct ieee80211_iface_combination {\n\tconst struct ieee80211_iface_limit *limits;\n\tu32 num_different_channels;\n\tu16 max_interfaces;\n\tu8 n_limits;\n\tbool beacon_int_infra_match;\n\tu8 radar_detect_widths;\n\tu8 radar_detect_regions;\n\tu32 beacon_int_min_gcd;\n};\n\nstruct ieee80211_iface_limit {\n\tu16 max;\n\tu16 types;\n};\n\nstruct ieee80211_power_rule {\n\tu32 max_antenna_gain;\n\tu32 max_eirp;\n};\n\nstruct ieee80211_rate {\n\tu32 flags;\n\tu16 bitrate;\n\tu16 hw_value;\n\tu16 hw_value_short;\n};\n\nstruct ieee80211_wmm_ac {\n\tu16 cw_min;\n\tu16 cw_max;\n\tu16 cot;\n\tu8 aifsn;\n};\n\nstruct ieee80211_wmm_rule {\n\tstruct ieee80211_wmm_ac client[4];\n\tstruct ieee80211_wmm_ac ap[4];\n};\n\nstruct ieee80211_reg_rule {\n\tstruct ieee80211_freq_range freq_range;\n\tstruct ieee80211_power_rule power_rule;\n\tstruct ieee80211_wmm_rule wmm_rule;\n\tu32 flags;\n\tu32 dfs_cac_ms;\n\tbool has_wmm;\n\ts8 psd;\n};\n\nstruct ieee80211_regdomain {\n\tstruct callback_head callback_head;\n\tu32 n_reg_rules;\n\tchar alpha2[3];\n\tenum nl80211_dfs_regions dfs_region;\n\tstruct ieee80211_reg_rule reg_rules[0];\n};\n\nstruct ieee80211_sta_he_cap {\n\tbool has_he;\n\tstruct ieee80211_he_cap_elem he_cap_elem;\n\tstruct ieee80211_he_mcs_nss_supp he_mcs_nss_supp;\n\tu8 ppe_thres[25];\n} __attribute__((packed));\n\nstruct ieee80211_sta_eht_cap {\n\tbool has_eht;\n\tstruct ieee80211_eht_cap_elem_fixed eht_cap_elem;\n\tstruct ieee80211_eht_mcs_nss_supp eht_mcs_nss_supp;\n\tu8 eht_ppe_thres[32];\n};\n\nstruct ieee80211_sband_iftype_data {\n\tu16 types_mask;\n\tstruct ieee80211_sta_he_cap he_cap;\n\tstruct ieee80211_he_6ghz_capa he_6ghz_capa;\n\tstruct ieee80211_sta_eht_cap eht_cap;\n\tstruct {\n\t\tconst u8 *data;\n\t\tunsigned int len;\n\t} vendor_elems;\n} __attribute__((packed));\n\nstruct ieee80211_sta_ht_cap {\n\tu16 cap;\n\tbool ht_supported;\n\tu8 ampdu_factor;\n\tu8 ampdu_density;\n\tstruct ieee80211_mcs_info mcs;\n\tshort: 0;\n} __attribute__((packed));\n\nstruct ieee80211_sta_s1g_cap {\n\tbool s1g;\n\tu8 cap[10];\n\tu8 nss_mcs[5];\n};\n\nstruct ieee80211_sta_vht_cap {\n\tbool vht_supported;\n\tu32 cap;\n\tstruct ieee80211_vht_mcs_info vht_mcs;\n};\n\nstruct ieee80211_supported_band {\n\tstruct ieee80211_channel *channels;\n\tstruct ieee80211_rate *bitrates;\n\tenum nl80211_band band;\n\tint n_channels;\n\tint n_bitrates;\n\tstruct ieee80211_sta_ht_cap ht_cap;\n\tstruct ieee80211_sta_vht_cap vht_cap;\n\tstruct ieee80211_sta_s1g_cap s1g_cap;\n\tstruct ieee80211_edmg edmg_cap;\n\tu16 n_iftype_data;\n\tconst struct ieee80211_sband_iftype_data *iftype_data;\n};\n\nstruct ieee80211_txrx_stypes {\n\tu16 tx;\n\tu16 rx;\n};\n\nstruct ieee802154_addr {\n\tu8 mode;\n\t__le16 pan_id;\n\tunion {\n\t\t__le16 short_addr;\n\t\t__le64 extended_addr;\n\t};\n};\n\nstruct ieee802154_pan_device {\n\t__le16 pan_id;\n\tu8 mode;\n\t__le16 short_addr;\n\t__le64 extended_addr;\n\tstruct list_head node;\n};\n\nstruct ieee_ets {\n\t__u8 willing;\n\t__u8 ets_cap;\n\t__u8 cbs;\n\t__u8 tc_tx_bw[8];\n\t__u8 tc_rx_bw[8];\n\t__u8 tc_tsa[8];\n\t__u8 prio_tc[8];\n\t__u8 tc_reco_bw[8];\n\t__u8 tc_reco_tsa[8];\n\t__u8 reco_prio_tc[8];\n};\n\nstruct ieee_maxrate {\n\t__u64 tc_maxrate[8];\n};\n\nstruct ieee_pfc {\n\t__u8 pfc_cap;\n\t__u8 pfc_en;\n\t__u8 mbc;\n\t__u16 delay;\n\t__u64 requests[8];\n\t__u64 indications[8];\n};\n\nstruct ieee_qcn {\n\t__u8 rpg_enable[8];\n\t__u32 rppp_max_rps[8];\n\t__u32 rpg_time_reset[8];\n\t__u32 rpg_byte_reset[8];\n\t__u32 rpg_threshold[8];\n\t__u32 rpg_max_rate[8];\n\t__u32 rpg_ai_rate[8];\n\t__u32 rpg_hai_rate[8];\n\t__u32 rpg_gd[8];\n\t__u32 rpg_min_dec_fac[8];\n\t__u32 rpg_min_rate[8];\n\t__u32 cndd_state_machine[8];\n};\n\nstruct ieee_qcn_stats {\n\t__u64 rppp_rp_centiseconds[8];\n\t__u32 rppp_created_rps[8];\n};\n\nstruct if6_iter_state {\n\tstruct seq_net_private p;\n\tint bucket;\n\tint offset;\n};\n\nstruct if_dqblk {\n\t__u64 dqb_bhardlimit;\n\t__u64 dqb_bsoftlimit;\n\t__u64 dqb_curspace;\n\t__u64 dqb_ihardlimit;\n\t__u64 dqb_isoftlimit;\n\t__u64 dqb_curinodes;\n\t__u64 dqb_btime;\n\t__u64 dqb_itime;\n\t__u32 dqb_valid;\n};\n\nstruct if_dqinfo {\n\t__u64 dqi_bgrace;\n\t__u64 dqi_igrace;\n\t__u32 dqi_flags;\n\t__u32 dqi_valid;\n};\n\nstruct if_nextdqblk {\n\t__u64 dqb_bhardlimit;\n\t__u64 dqb_bsoftlimit;\n\t__u64 dqb_curspace;\n\t__u64 dqb_ihardlimit;\n\t__u64 dqb_isoftlimit;\n\t__u64 dqb_curinodes;\n\t__u64 dqb_btime;\n\t__u64 dqb_itime;\n\t__u32 dqb_valid;\n\t__u32 dqb_id;\n};\n\nstruct if_set {\n\tif_mask ifs_bits[8];\n};\n\nstruct if_settings {\n\tunsigned int type;\n\tunsigned int size;\n\tunion {\n\t\traw_hdlc_proto *raw_hdlc;\n\t\tcisco_proto *cisco;\n\t\tfr_proto *fr;\n\t\tfr_proto_pvc *fr_pvc;\n\t\tfr_proto_pvc_info *fr_pvc_info;\n\t\tx25_hdlc_proto *x25;\n\t\tsync_serial_settings *sync;\n\t\tte1_settings *te1;\n\t} ifs_ifsu;\n};\n\nstruct if_stats_msg {\n\t__u8 family;\n\t__u8 pad1;\n\t__u16 pad2;\n\t__u32 ifindex;\n\t__u32 filter_mask;\n};\n\nstruct ifa6_config {\n\tconst struct in6_addr *pfx;\n\tunsigned int plen;\n\tu8 ifa_proto;\n\tconst struct in6_addr *peer_pfx;\n\tu32 rt_priority;\n\tu32 ifa_flags;\n\tu32 preferred_lft;\n\tu32 valid_lft;\n\tu16 scope;\n};\n\nstruct ifa_cacheinfo {\n\t__u32 ifa_prefered;\n\t__u32 ifa_valid;\n\t__u32 cstamp;\n\t__u32 tstamp;\n};\n\nstruct ifacaddr6 {\n\tstruct in6_addr aca_addr;\n\tstruct fib6_info *aca_rt;\n\tstruct ifacaddr6 *aca_next;\n\tstruct hlist_node aca_addr_lst;\n\tint aca_users;\n\trefcount_t aca_refcnt;\n\tlong unsigned int aca_cstamp;\n\tlong unsigned int aca_tstamp;\n\tstruct callback_head rcu;\n};\n\nstruct ifaddrlblmsg {\n\t__u8 ifal_family;\n\t__u8 __ifal_reserved;\n\t__u8 ifal_prefixlen;\n\t__u8 ifal_flags;\n\t__u32 ifal_index;\n\t__u32 ifal_seq;\n};\n\nstruct ifaddrmsg {\n\t__u8 ifa_family;\n\t__u8 ifa_prefixlen;\n\t__u8 ifa_flags;\n\t__u8 ifa_scope;\n\t__u32 ifa_index;\n};\n\nstruct ifbond {\n\t__s32 bond_mode;\n\t__s32 num_slaves;\n\t__s32 miimon;\n};\n\ntypedef struct ifbond ifbond;\n\nstruct ifconf {\n\tint ifc_len;\n\tunion {\n\t\tchar *ifcu_buf;\n\t\tstruct ifreq *ifcu_req;\n\t} ifc_ifcu;\n};\n\nstruct ifinfomsg {\n\tunsigned char ifi_family;\n\tunsigned char __ifi_pad;\n\tshort unsigned int ifi_type;\n\tint ifi_index;\n\tunsigned int ifi_flags;\n\tunsigned int ifi_change;\n};\n\nstruct ifla_cacheinfo {\n\t__u32 max_reasm_len;\n\t__u32 tstamp;\n\t__u32 reachable_time;\n\t__u32 retrans_time;\n};\n\nstruct ifla_vf_broadcast {\n\t__u8 broadcast[32];\n};\n\nstruct ifla_vf_guid {\n\t__u32 vf;\n\t__u64 guid;\n};\n\nstruct ifla_vf_info {\n\t__u32 vf;\n\t__u8 mac[32];\n\t__u32 vlan;\n\t__u32 qos;\n\t__u32 spoofchk;\n\t__u32 linkstate;\n\t__u32 min_tx_rate;\n\t__u32 max_tx_rate;\n\t__u32 rss_query_en;\n\t__u32 trusted;\n\t__be16 vlan_proto;\n};\n\nstruct ifla_vf_link_state {\n\t__u32 vf;\n\t__u32 link_state;\n};\n\nstruct ifla_vf_mac {\n\t__u32 vf;\n\t__u8 mac[32];\n};\n\nstruct ifla_vf_rate {\n\t__u32 vf;\n\t__u32 min_tx_rate;\n\t__u32 max_tx_rate;\n};\n\nstruct ifla_vf_rss_query_en {\n\t__u32 vf;\n\t__u32 setting;\n};\n\nstruct ifla_vf_spoofchk {\n\t__u32 vf;\n\t__u32 setting;\n};\n\nstruct ifla_vf_stats {\n\t__u64 rx_packets;\n\t__u64 tx_packets;\n\t__u64 rx_bytes;\n\t__u64 tx_bytes;\n\t__u64 broadcast;\n\t__u64 multicast;\n\t__u64 rx_dropped;\n\t__u64 tx_dropped;\n};\n\nstruct ifla_vf_trust {\n\t__u32 vf;\n\t__u32 setting;\n};\n\nstruct ifla_vf_tx_rate {\n\t__u32 vf;\n\t__u32 rate;\n};\n\nstruct ifla_vf_vlan {\n\t__u32 vf;\n\t__u32 vlan;\n\t__u32 qos;\n};\n\nstruct ifla_vf_vlan_info {\n\t__u32 vf;\n\t__u32 vlan;\n\t__u32 qos;\n\t__be16 vlan_proto;\n};\n\nstruct ifmap {\n\tlong unsigned int mem_start;\n\tlong unsigned int mem_end;\n\tshort unsigned int base_addr;\n\tunsigned char irq;\n\tunsigned char dma;\n\tunsigned char port;\n};\n\nstruct inet6_dev;\n\nstruct ip6_sf_list;\n\nstruct ifmcaddr6 {\n\tstruct in6_addr mca_addr;\n\tstruct inet6_dev *idev;\n\tstruct ifmcaddr6 *next;\n\tstruct ip6_sf_list *mca_sources;\n\tstruct ip6_sf_list *mca_tomb;\n\tunsigned int mca_sfmode;\n\tunsigned char mca_crcount;\n\tlong unsigned int mca_sfcount[2];\n\tstruct delayed_work mca_work;\n\tunsigned int mca_flags;\n\tint mca_users;\n\trefcount_t mca_refcnt;\n\tlong unsigned int mca_cstamp;\n\tlong unsigned int mca_tstamp;\n\tstruct callback_head rcu;\n};\n\nstruct ifreq {\n\tunion {\n\t\tchar ifrn_name[16];\n\t} ifr_ifrn;\n\tunion {\n\t\tstruct sockaddr ifru_addr;\n\t\tstruct sockaddr ifru_dstaddr;\n\t\tstruct sockaddr ifru_broadaddr;\n\t\tstruct sockaddr ifru_netmask;\n\t\tstruct sockaddr ifru_hwaddr;\n\t\tshort int ifru_flags;\n\t\tint ifru_ivalue;\n\t\tint ifru_mtu;\n\t\tstruct ifmap ifru_map;\n\t\tchar ifru_slave[16];\n\t\tchar ifru_newname[16];\n\t\tvoid *ifru_data;\n\t\tstruct if_settings ifru_settings;\n\t} ifr_ifru;\n};\n\nstruct ifslave {\n\t__s32 slave_id;\n\tchar slave_name[16];\n\t__s8 link;\n\t__s8 state;\n\t__u32 link_failure_count;\n};\n\ntypedef struct ifslave ifslave;\n\nstruct igmp6_mc_iter_state {\n\tstruct seq_net_private p;\n\tstruct net_device *dev;\n\tstruct inet6_dev *idev;\n};\n\nstruct igmp6_mcf_iter_state {\n\tstruct seq_net_private p;\n\tstruct net_device *dev;\n\tstruct inet6_dev *idev;\n\tstruct ifmcaddr6 *im;\n};\n\nstruct in_device;\n\nstruct igmp_mc_iter_state {\n\tstruct seq_net_private p;\n\tstruct net_device *dev;\n\tstruct in_device *in_dev;\n};\n\nstruct ip_mc_list;\n\nstruct igmp_mcf_iter_state {\n\tstruct seq_net_private p;\n\tstruct net_device *dev;\n\tstruct in_device *idev;\n\tstruct ip_mc_list *im;\n};\n\nstruct igmphdr {\n\t__u8 type;\n\t__u8 code;\n\t__sum16 csum;\n\t__be32 group;\n};\n\nstruct igmpmsg {\n\t__u32 unused1;\n\t__u32 unused2;\n\tunsigned char im_msgtype;\n\tunsigned char im_mbz;\n\tunsigned char im_vif;\n\tunsigned char im_vif_hi;\n\tstruct in_addr im_src;\n\tstruct in_addr im_dst;\n};\n\nstruct igmpv3_grec {\n\t__u8 grec_type;\n\t__u8 grec_auxwords;\n\t__be16 grec_nsrcs;\n\t__be32 grec_mca;\n\t__be32 grec_src[0];\n};\n\nstruct igmpv3_query {\n\t__u8 type;\n\t__u8 code;\n\t__sum16 csum;\n\t__be32 group;\n\t__u8 qrv: 3;\n\t__u8 suppress: 1;\n\t__u8 resv: 4;\n\t__u8 qqic;\n\t__be16 nsrcs;\n\t__be32 srcs[0];\n};\n\nstruct igmpv3_report {\n\t__u8 type;\n\t__u8 resv1;\n\t__sum16 csum;\n\t__be16 resv2;\n\t__be16 ngrec;\n\tstruct igmpv3_grec grec[0];\n};\n\nstruct ignore_section {\n\tguid_t guid;\n\tconst char *name;\n};\n\nstruct ima_algo_desc {\n\tstruct crypto_shash *tfm;\n\tenum hash_algo algo;\n};\n\nstruct ima_digest_data {\n\tunion {\n\t\tstruct {\n\t\t\tu8 algo;\n\t\t\tu8 length;\n\t\t\tunion {\n\t\t\t\tstruct {\n\t\t\t\t\tu8 unused;\n\t\t\t\t\tu8 type;\n\t\t\t\t} sha1;\n\t\t\t\tstruct {\n\t\t\t\t\tu8 type;\n\t\t\t\t\tu8 algo;\n\t\t\t\t} ng;\n\t\t\t\tu8 data[2];\n\t\t\t} xattr;\n\t\t};\n\t\tstruct ima_digest_data_hdr hdr;\n\t};\n\tu8 digest[0];\n};\n\nstruct ima_iint_cache;\n\nstruct modsig;\n\nstruct ima_event_data {\n\tstruct ima_iint_cache *iint;\n\tstruct file *file;\n\tconst unsigned char *filename;\n\tstruct evm_ima_xattr_data *xattr_value;\n\tint xattr_len;\n\tconst struct modsig *modsig;\n\tconst char *violation;\n\tconst void *buf;\n\tint buf_len;\n};\n\nstruct ima_field_data {\n\tu8 *data;\n\tu32 len;\n};\n\nstruct ima_file_id {\n\t__u8 hash_type;\n\t__u8 hash_algorithm;\n\t__u8 hash[64];\n};\n\nstruct ima_h_table {\n\tatomic_long_t len;\n\tatomic_long_t violations;\n\tstruct hlist_head queue[1024];\n};\n\nstruct ima_iint_cache {\n\tstruct mutex mutex;\n\tstruct integrity_inode_attributes real_inode;\n\tlong unsigned int flags;\n\tlong unsigned int measured_pcrs;\n\tlong unsigned int atomic_flags;\n\tenum integrity_status ima_file_status: 4;\n\tenum integrity_status ima_mmap_status: 4;\n\tenum integrity_status ima_bprm_status: 4;\n\tenum integrity_status ima_read_status: 4;\n\tenum integrity_status ima_creds_status: 4;\n\tstruct ima_digest_data *ima_hash;\n};\n\nstruct ima_kexec_hdr {\n\tu16 version;\n\tu16 _reserved0;\n\tu32 _reserved1;\n\tu64 buffer_size;\n\tu64 count;\n};\n\nstruct ima_key_entry {\n\tstruct list_head list;\n\tvoid *payload;\n\tsize_t payload_len;\n\tchar *keyring_name;\n};\n\nstruct ima_max_digest_data {\n\tstruct ima_digest_data_hdr hdr;\n\tu8 digest[64];\n};\n\nstruct ima_template_entry;\n\nstruct ima_queue_entry {\n\tstruct hlist_node hnext;\n\tstruct list_head later;\n\tstruct ima_template_entry *entry;\n};\n\nstruct ima_rule_opt_list;\n\nstruct ima_template_desc;\n\nstruct ima_rule_entry {\n\tstruct list_head list;\n\tint action;\n\tunsigned int flags;\n\tenum ima_hooks func;\n\tint mask;\n\tlong unsigned int fsmagic;\n\tuuid_t fsuuid;\n\tkuid_t uid;\n\tkgid_t gid;\n\tkuid_t fowner;\n\tkgid_t fgroup;\n\tbool (*uid_op)(kuid_t, kuid_t);\n\tbool (*gid_op)(kgid_t, kgid_t);\n\tbool (*fowner_op)(vfsuid_t, kuid_t);\n\tbool (*fgroup_op)(vfsgid_t, kgid_t);\n\tint pcr;\n\tunsigned int allowed_algos;\n\tstruct {\n\t\tvoid *rule;\n\t\tchar *args_p;\n\t\tint type;\n\t} lsm[6];\n\tchar *fsname;\n\tstruct ima_rule_opt_list *keyrings;\n\tstruct ima_rule_opt_list *label;\n\tstruct ima_template_desc *template;\n};\n\nstruct ima_rule_opt_list {\n\tsize_t count;\n\tchar *items[0];\n};\n\nstruct ima_setup_data {\n\t__u64 addr;\n\t__u64 size;\n};\n\nstruct ima_template_field;\n\nstruct ima_template_desc {\n\tstruct list_head list;\n\tchar *name;\n\tchar *fmt;\n\tint num_fields;\n\tconst struct ima_template_field **fields;\n};\n\nstruct tpm_digest;\n\nstruct ima_template_entry {\n\tint pcr;\n\tstruct tpm_digest *digests;\n\tstruct ima_template_desc *template_desc;\n\tu32 template_data_len;\n\tstruct ima_field_data template_data[0];\n};\n\nstruct ima_template_field {\n\tconst char field_id[16];\n\tint (*field_init)(struct ima_event_data *, struct ima_field_data *);\n\tvoid (*field_show)(struct seq_file *, enum ima_show_type, struct ima_field_data *);\n};\n\nstruct imc_uncore_pci_dev {\n\t__u32 pci_id;\n\tstruct pci_driver *driver;\n};\n\nstruct imstt_regvals {\n\t__u32 pitch;\n\t__u16 hes;\n\t__u16 heb;\n\t__u16 hsb;\n\t__u16 ht;\n\t__u16 ves;\n\t__u16 veb;\n\t__u16 vsb;\n\t__u16 vt;\n\t__u16 vil;\n\t__u8 pclk_m;\n\t__u8 pclk_n;\n\t__u8 pclk_p;\n\t__u8 mlc[3];\n\t__u8 lckl_p[3];\n};\n\nstruct imstt_par {\n\tstruct imstt_regvals init;\n\t__u32 *dc_regs;\n\tlong unsigned int cmap_regs_phys;\n\t__u8 *cmap_regs;\n\t__u32 ramdac;\n\t__u32 palette[16];\n};\n\nstruct in6_flowlabel_req {\n\tstruct in6_addr flr_dst;\n\t__be32 flr_label;\n\t__u8 flr_action;\n\t__u8 flr_share;\n\t__u16 flr_flags;\n\t__u16 flr_expires;\n\t__u16 flr_linger;\n\t__u32 __flr_pad;\n};\n\nstruct in6_ifreq {\n\tstruct in6_addr ifr6_addr;\n\t__u32 ifr6_prefixlen;\n\tint ifr6_ifindex;\n};\n\nstruct in6_pktinfo {\n\tstruct in6_addr ipi6_addr;\n\tint ipi6_ifindex;\n};\n\nstruct in6_rtmsg {\n\tstruct in6_addr rtmsg_dst;\n\tstruct in6_addr rtmsg_src;\n\tstruct in6_addr rtmsg_gateway;\n\t__u32 rtmsg_type;\n\t__u16 rtmsg_dst_len;\n\t__u16 rtmsg_src_len;\n\t__u32 rtmsg_metric;\n\tlong unsigned int rtmsg_info;\n\t__u32 rtmsg_flags;\n\tint rtmsg_ifindex;\n};\n\nstruct in6_validator_info {\n\tstruct in6_addr i6vi_addr;\n\tstruct inet6_dev *i6vi_dev;\n\tstruct netlink_ext_ack *extack;\n};\n\nstruct ipv4_devconf {\n\tvoid *sysctl;\n\tint data[33];\n\tlong unsigned int state[1];\n};\n\nstruct in_ifaddr;\n\nstruct neigh_parms;\n\nstruct in_device {\n\tstruct net_device *dev;\n\tnetdevice_tracker dev_tracker;\n\trefcount_t refcnt;\n\tint dead;\n\tstruct in_ifaddr *ifa_list;\n\tstruct ip_mc_list *mc_list;\n\tstruct ip_mc_list **mc_hash;\n\tint mc_count;\n\tspinlock_t mc_tomb_lock;\n\tstruct ip_mc_list *mc_tomb;\n\tlong unsigned int mr_v1_seen;\n\tlong unsigned int mr_v2_seen;\n\tlong unsigned int mr_maxdelay;\n\tlong unsigned int mr_qi;\n\tlong unsigned int mr_qri;\n\tunsigned char mr_qrv;\n\tunsigned char mr_gq_running;\n\tu32 mr_ifc_count;\n\tstruct timer_list mr_gq_timer;\n\tstruct timer_list mr_ifc_timer;\n\tstruct neigh_parms *arp_parms;\n\tstruct ipv4_devconf cnf;\n\tstruct callback_head callback_head;\n};\n\nstruct in_ifaddr {\n\tstruct hlist_node hash;\n\tstruct in_ifaddr *ifa_next;\n\tstruct in_device *ifa_dev;\n\tstruct callback_head callback_head;\n\t__be32 ifa_local;\n\t__be32 ifa_address;\n\t__be32 ifa_mask;\n\t__u32 ifa_rt_priority;\n\t__be32 ifa_broadcast;\n\tunsigned char ifa_scope;\n\tunsigned char ifa_prefixlen;\n\tunsigned char ifa_proto;\n\t__u32 ifa_flags;\n\tchar ifa_label[16];\n\t__u32 ifa_valid_lft;\n\t__u32 ifa_preferred_lft;\n\tlong unsigned int ifa_cstamp;\n\tlong unsigned int ifa_tstamp;\n};\n\nstruct in_pktinfo {\n\tint ipi_ifindex;\n\tstruct in_addr ipi_spec_dst;\n\tstruct in_addr ipi_addr;\n};\n\nstruct in_validator_info {\n\t__be32 ivi_addr;\n\tstruct in_device *ivi_dev;\n\tstruct netlink_ext_ack *extack;\n};\n\nstruct ipv6_txoptions;\n\nstruct inet6_cork {\n\tstruct ipv6_txoptions *opt;\n\tu8 hop_limit;\n\tu8 tclass;\n};\n\nstruct ipv6_stable_secret {\n\tbool initialized;\n\tstruct in6_addr secret;\n};\n\nstruct ipv6_devconf {\n\t__u8 __cacheline_group_begin__ipv6_devconf_read_txrx[0];\n\t__s32 disable_ipv6;\n\t__s32 hop_limit;\n\t__s32 mtu6;\n\t__s32 forwarding;\n\t__s32 disable_policy;\n\t__s32 proxy_ndp;\n\t__u8 __cacheline_group_end__ipv6_devconf_read_txrx[0];\n\t__s32 accept_ra;\n\t__s32 accept_redirects;\n\t__s32 autoconf;\n\t__s32 dad_transmits;\n\t__s32 rtr_solicits;\n\t__s32 rtr_solicit_interval;\n\t__s32 rtr_solicit_max_interval;\n\t__s32 rtr_solicit_delay;\n\t__s32 force_mld_version;\n\t__s32 mldv1_unsolicited_report_interval;\n\t__s32 mldv2_unsolicited_report_interval;\n\t__s32 use_tempaddr;\n\t__s32 temp_valid_lft;\n\t__s32 temp_prefered_lft;\n\t__s32 regen_min_advance;\n\t__s32 regen_max_retry;\n\t__s32 max_desync_factor;\n\t__s32 max_addresses;\n\t__s32 accept_ra_defrtr;\n\t__u32 ra_defrtr_metric;\n\t__s32 accept_ra_min_hop_limit;\n\t__s32 accept_ra_min_lft;\n\t__s32 accept_ra_pinfo;\n\t__s32 ignore_routes_with_linkdown;\n\t__s32 accept_ra_rtr_pref;\n\t__s32 rtr_probe_interval;\n\t__s32 accept_ra_rt_info_min_plen;\n\t__s32 accept_ra_rt_info_max_plen;\n\t__s32 accept_source_route;\n\t__s32 accept_ra_from_local;\n\tatomic_t mc_forwarding;\n\t__s32 drop_unicast_in_l2_multicast;\n\t__s32 accept_dad;\n\t__s32 force_tllao;\n\t__s32 ndisc_notify;\n\t__s32 suppress_frag_ndisc;\n\t__s32 accept_ra_mtu;\n\t__s32 drop_unsolicited_na;\n\t__s32 accept_untracked_na;\n\tstruct ipv6_stable_secret stable_secret;\n\t__s32 use_oif_addrs_only;\n\t__s32 keep_addr_on_down;\n\t__s32 seg6_enabled;\n\t__s32 seg6_require_hmac;\n\t__u32 enhanced_dad;\n\t__u32 addr_gen_mode;\n\t__s32 ndisc_tclass;\n\t__s32 rpl_seg_enabled;\n\t__u32 ioam6_id;\n\t__u32 ioam6_id_wide;\n\t__u8 ioam6_enabled;\n\t__u8 ndisc_evict_nocarrier;\n\t__u8 ra_honor_pio_life;\n\tstruct ctl_table_header *sysctl_header;\n};\n\nstruct ipstats_mib;\n\nstruct ipv6_devstat {\n\tstruct proc_dir_entry *proc_dir_entry;\n\tstruct ipstats_mib *ipv6;\n\tstruct icmpv6_mib_device *icmpv6dev;\n\tstruct icmpv6msg_mib_device *icmpv6msgdev;\n};\n\nstruct inet6_dev {\n\tstruct net_device *dev;\n\tnetdevice_tracker dev_tracker;\n\tstruct list_head addr_list;\n\tstruct ifmcaddr6 *mc_list;\n\tstruct ifmcaddr6 *mc_tomb;\n\tunsigned char mc_qrv;\n\tunsigned char mc_gq_running;\n\tunsigned char mc_ifc_count;\n\tunsigned char mc_dad_count;\n\tlong unsigned int mc_v1_seen;\n\tlong unsigned int mc_qi;\n\tlong unsigned int mc_qri;\n\tlong unsigned int mc_maxdelay;\n\tstruct delayed_work mc_gq_work;\n\tstruct delayed_work mc_ifc_work;\n\tstruct delayed_work mc_dad_work;\n\tstruct delayed_work mc_query_work;\n\tstruct delayed_work mc_report_work;\n\tstruct sk_buff_head mc_query_queue;\n\tstruct sk_buff_head mc_report_queue;\n\tspinlock_t mc_query_lock;\n\tspinlock_t mc_report_lock;\n\tstruct mutex mc_lock;\n\tstruct ifacaddr6 *ac_list;\n\trwlock_t lock;\n\trefcount_t refcnt;\n\t__u32 if_flags;\n\tint dead;\n\tu32 desync_factor;\n\tstruct list_head tempaddr_list;\n\tstruct in6_addr token;\n\tstruct neigh_parms *nd_parms;\n\tstruct ipv6_devconf cnf;\n\tstruct ipv6_devstat stats;\n\tstruct timer_list rs_timer;\n\t__s32 rs_interval;\n\t__u8 rs_probes;\n\tlong unsigned int tstamp;\n\tstruct callback_head rcu;\n\tunsigned int ra_mtu;\n};\n\nstruct inet6_fill_args {\n\tu32 portid;\n\tu32 seq;\n\tint event;\n\tunsigned int flags;\n\tint netnsid;\n\tint ifindex;\n\tenum addr_type_t type;\n};\n\nstruct inet6_ifaddr {\n\tstruct in6_addr addr;\n\t__u32 prefix_len;\n\t__u32 rt_priority;\n\t__u32 valid_lft;\n\t__u32 prefered_lft;\n\trefcount_t refcnt;\n\tspinlock_t lock;\n\tint state;\n\t__u32 flags;\n\t__u8 dad_probes;\n\t__u8 stable_privacy_retry;\n\t__u16 scope;\n\t__u64 dad_nonce;\n\tlong unsigned int cstamp;\n\tlong unsigned int tstamp;\n\tstruct delayed_work dad_work;\n\tstruct inet6_dev *idev;\n\tstruct fib6_info *rt;\n\tstruct hlist_node addr_lst;\n\tstruct list_head if_list;\n\tstruct list_head if_list_aux;\n\tstruct list_head tmp_list;\n\tstruct inet6_ifaddr *ifpub;\n\tint regen_count;\n\tbool tokenized;\n\tu8 ifa_proto;\n\tstruct callback_head rcu;\n\tstruct in6_addr peer_addr;\n};\n\nstruct inet6_skb_parm;\n\nstruct inet6_protocol {\n\tint (*handler)(struct sk_buff *);\n\tint (*err_handler)(struct sk_buff *, struct inet6_skb_parm *, u8, u8, int, __be32);\n\tunsigned int flags;\n\tu32 secret;\n};\n\nstruct inet6_skb_parm {\n\tint iif;\n\t__be16 ra;\n\t__u16 dst0;\n\t__u16 srcrt;\n\t__u16 dst1;\n\t__u16 lastopt;\n\t__u16 nhoff;\n\t__u16 flags;\n\t__u16 dsthao;\n\t__u16 frag_max_size;\n\t__u16 srhoff;\n};\n\nunion inet_addr {\n\t__u32 all[4];\n\t__be32 ip;\n\t__be32 ip6[4];\n\tstruct in_addr in;\n\tstruct in6_addr in6;\n};\n\nstruct inet_bind2_bucket {\n\tpossible_net_t ib_net;\n\tint l3mdev;\n\tshort unsigned int port;\n\tshort unsigned int addr_type;\n\tstruct in6_addr v6_rcv_saddr;\n\tstruct hlist_node node;\n\tstruct hlist_node bhash_node;\n\tstruct hlist_head owners;\n};\n\nstruct inet_bind_bucket {\n\tpossible_net_t ib_net;\n\tint l3mdev;\n\tshort unsigned int port;\n\tsigned char fastreuse;\n\tsigned char fastreuseport;\n\tkuid_t fastuid;\n\tstruct in6_addr fast_v6_rcv_saddr;\n\t__be32 fast_rcv_saddr;\n\tshort unsigned int fast_sk_family;\n\tbool fast_ipv6_only;\n\tstruct hlist_node node;\n\tstruct hlist_head bhash2;\n};\n\nstruct inet_bind_hashbucket {\n\tspinlock_t lock;\n\tstruct hlist_head chain;\n};\n\nstruct inet_cork {\n\tunsigned int flags;\n\t__be32 addr;\n\tstruct ip_options *opt;\n\tunsigned int fragsize;\n\tint length;\n\tstruct dst_entry *dst;\n\tu8 tx_flags;\n\t__u8 ttl;\n\t__s16 tos;\n\tchar priority;\n\t__u16 gso_size;\n\tu64 transmit_time;\n\tu32 mark;\n};\n\nstruct inet_cork_full {\n\tstruct inet_cork base;\n\tstruct flowi fl;\n};\n\nstruct ipv6_pinfo;\n\nstruct ip_mc_socklist;\n\nstruct inet_sock {\n\tstruct sock sk;\n\tstruct ipv6_pinfo *pinet6;\n\tlong unsigned int inet_flags;\n\t__be32 inet_saddr;\n\t__s16 uc_ttl;\n\t__be16 inet_sport;\n\tstruct ip_options_rcu *inet_opt;\n\tatomic_t inet_id;\n\t__u8 tos;\n\t__u8 min_ttl;\n\t__u8 mc_ttl;\n\t__u8 pmtudisc;\n\t__u8 rcv_tos;\n\t__u8 convert_csum;\n\tint uc_index;\n\tint mc_index;\n\t__be32 mc_addr;\n\tu32 local_port_range;\n\tstruct ip_mc_socklist *mc_list;\n\tstruct inet_cork_full cork;\n};\n\nstruct request_sock_queue {\n\tspinlock_t rskq_lock;\n\tu8 rskq_defer_accept;\n\tu32 synflood_warned;\n\tatomic_t qlen;\n\tatomic_t young;\n\tstruct request_sock *rskq_accept_head;\n\tstruct request_sock *rskq_accept_tail;\n\tstruct fastopen_queue fastopenq;\n};\n\nstruct inet_connection_sock_af_ops;\n\nstruct tcp_ulp_ops;\n\nstruct inet_connection_sock {\n\tstruct inet_sock icsk_inet;\n\tstruct request_sock_queue icsk_accept_queue;\n\tstruct inet_bind_bucket *icsk_bind_hash;\n\tstruct inet_bind2_bucket *icsk_bind2_hash;\n\tlong unsigned int icsk_timeout;\n\tstruct timer_list icsk_retransmit_timer;\n\tstruct timer_list icsk_delack_timer;\n\t__u32 icsk_rto;\n\t__u32 icsk_rto_min;\n\t__u32 icsk_delack_max;\n\t__u32 icsk_pmtu_cookie;\n\tconst struct tcp_congestion_ops *icsk_ca_ops;\n\tconst struct inet_connection_sock_af_ops *icsk_af_ops;\n\tconst struct tcp_ulp_ops *icsk_ulp_ops;\n\tvoid *icsk_ulp_data;\n\tvoid (*icsk_clean_acked)(struct sock *, u32);\n\tunsigned int (*icsk_sync_mss)(struct sock *, u32);\n\t__u8 icsk_ca_state: 5;\n\t__u8 icsk_ca_initialized: 1;\n\t__u8 icsk_ca_setsockopt: 1;\n\t__u8 icsk_ca_dst_locked: 1;\n\t__u8 icsk_retransmits;\n\t__u8 icsk_pending;\n\t__u8 icsk_backoff;\n\t__u8 icsk_syn_retries;\n\t__u8 icsk_probes_out;\n\t__u16 icsk_ext_hdr_len;\n\tstruct {\n\t\t__u8 pending;\n\t\t__u8 quick;\n\t\t__u8 pingpong;\n\t\t__u8 retry;\n\t\t__u32 ato: 8;\n\t\t__u32 lrcv_flowlabel: 20;\n\t\t__u32 unused: 4;\n\t\tlong unsigned int timeout;\n\t\t__u32 lrcvtime;\n\t\t__u16 last_seg_size;\n\t\t__u16 rcv_mss;\n\t} icsk_ack;\n\tstruct {\n\t\tint search_high;\n\t\tint search_low;\n\t\tu32 probe_size: 31;\n\t\tu32 enabled: 1;\n\t\tu32 probe_timestamp;\n\t} icsk_mtup;\n\tu32 icsk_probes_tstamp;\n\tu32 icsk_user_timeout;\n\tu64 icsk_ca_priv[13];\n};\n\nstruct inet_connection_sock_af_ops {\n\tint (*queue_xmit)(struct sock *, struct sk_buff *, struct flowi *);\n\tvoid (*send_check)(struct sock *, struct sk_buff *);\n\tint (*rebuild_header)(struct sock *);\n\tvoid (*sk_rx_dst_set)(struct sock *, const struct sk_buff *);\n\tint (*conn_request)(struct sock *, struct sk_buff *);\n\tstruct sock * (*syn_recv_sock)(const struct sock *, struct sk_buff *, struct request_sock *, struct dst_entry *, struct request_sock *, bool *);\n\tu16 net_header_len;\n\tu16 sockaddr_len;\n\tint (*setsockopt)(struct sock *, int, int, sockptr_t, unsigned int);\n\tint (*getsockopt)(struct sock *, int, int, char *, int *);\n\tvoid (*addr2sockaddr)(struct sock *, struct sockaddr *);\n\tvoid (*mtu_reduced)(struct sock *);\n};\n\nstruct inet_ehash_bucket {\n\tstruct hlist_nulls_head chain;\n};\n\nstruct inet_fill_args {\n\tu32 portid;\n\tu32 seq;\n\tint event;\n\tunsigned int flags;\n\tint netnsid;\n\tint ifindex;\n};\n\nstruct inet_frags {\n\tunsigned int qsize;\n\tvoid (*constructor)(struct inet_frag_queue *, const void *);\n\tvoid (*destructor)(struct inet_frag_queue *);\n\tvoid (*frag_expire)(struct timer_list *);\n\tstruct kmem_cache *frags_cachep;\n\tconst char *frags_cache_name;\n\tstruct rhashtable_params rhash_params;\n\trefcount_t refcnt;\n\tstruct completion completion;\n};\n\nstruct inet_listen_hashbucket;\n\nstruct inet_hashinfo {\n\tstruct inet_ehash_bucket *ehash;\n\tspinlock_t *ehash_locks;\n\tunsigned int ehash_mask;\n\tunsigned int ehash_locks_mask;\n\tstruct kmem_cache *bind_bucket_cachep;\n\tstruct inet_bind_hashbucket *bhash;\n\tstruct kmem_cache *bind2_bucket_cachep;\n\tstruct inet_bind_hashbucket *bhash2;\n\tunsigned int bhash_size;\n\tunsigned int lhash2_mask;\n\tstruct inet_listen_hashbucket *lhash2;\n\tbool pernet;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct inet_listen_hashbucket {\n\tspinlock_t lock;\n\tstruct hlist_nulls_head nulls_head;\n};\n\nstruct ipv4_addr_key {\n\t__be32 addr;\n\tint vif;\n};\n\nstruct inetpeer_addr {\n\tunion {\n\t\tstruct ipv4_addr_key a4;\n\t\tstruct in6_addr a6;\n\t\tu32 key[4];\n\t};\n\t__u16 family;\n};\n\nstruct inet_peer {\n\tstruct rb_node rb_node;\n\tstruct inetpeer_addr daddr;\n\tu32 metrics[17];\n\tu32 rate_tokens;\n\tu32 n_redirects;\n\tlong unsigned int rate_last;\n\tunion {\n\t\tstruct {\n\t\t\tatomic_t rid;\n\t\t};\n\t\tstruct callback_head rcu;\n\t};\n\t__u32 dtime;\n\trefcount_t refcnt;\n};\n\nstruct proto_ops;\n\nstruct inet_protosw {\n\tstruct list_head list;\n\tshort unsigned int type;\n\tshort unsigned int protocol;\n\tstruct proto *prot;\n\tconst struct proto_ops *ops;\n\tunsigned char flags;\n};\n\nstruct request_sock_ops;\n\nstruct saved_syn;\n\nstruct request_sock {\n\tstruct sock_common __req_common;\n\tstruct request_sock *dl_next;\n\tu16 mss;\n\tu8 num_retrans;\n\tu8 syncookie: 1;\n\tu8 num_timeout: 7;\n\tu32 ts_recent;\n\tstruct timer_list rsk_timer;\n\tconst struct request_sock_ops *rsk_ops;\n\tstruct sock *sk;\n\tstruct saved_syn *saved_syn;\n\tu32 secid;\n\tu32 peer_secid;\n\tu32 timeout;\n};\n\nstruct inet_request_sock {\n\tstruct request_sock req;\n\tu16 snd_wscale: 4;\n\tu16 rcv_wscale: 4;\n\tu16 tstamp_ok: 1;\n\tu16 sack_ok: 1;\n\tu16 wscale_ok: 1;\n\tu16 ecn_ok: 1;\n\tu16 acked: 1;\n\tu16 no_srccheck: 1;\n\tu16 smc_ok: 1;\n\tu32 ir_mark;\n\tunion {\n\t\tstruct ip_options_rcu *ireq_opt;\n\t\tstruct {\n\t\t\tstruct ipv6_txoptions *ipv6_opt;\n\t\t\tstruct sk_buff *pktopts;\n\t\t};\n\t};\n};\n\nstruct inet_skb_parm {\n\tint iif;\n\tstruct ip_options opt;\n\tu16 flags;\n\tu16 frag_max_size;\n};\n\nstruct inet_timewait_death_row {\n\trefcount_t tw_refcount;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tstruct inet_hashinfo *hashinfo;\n\tint sysctl_max_tw_buckets;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct inet_timewait_sock {\n\tstruct sock_common __tw_common;\n\t__u32 tw_mark;\n\tvolatile unsigned char tw_substate;\n\tunsigned char tw_rcv_wscale;\n\t__be16 tw_sport;\n\tunsigned int tw_transparent: 1;\n\tunsigned int tw_flowlabel: 20;\n\tunsigned int tw_usec_ts: 1;\n\tunsigned int tw_pad: 2;\n\tunsigned int tw_tos: 8;\n\tu32 tw_txhash;\n\tu32 tw_priority;\n\tstruct timer_list tw_timer;\n\tstruct inet_bind_bucket *tw_tb;\n\tstruct inet_bind2_bucket *tw_tb2;\n};\n\nstruct inflate_state {\n\tinflate_mode mode;\n\tint last;\n\tint wrap;\n\tint havedict;\n\tint flags;\n\tunsigned int dmax;\n\tlong unsigned int check;\n\tlong unsigned int total;\n\tunsigned int wbits;\n\tunsigned int wsize;\n\tunsigned int whave;\n\tunsigned int write;\n\tunsigned char *window;\n\tlong unsigned int hold;\n\tunsigned int bits;\n\tunsigned int length;\n\tunsigned int offset;\n\tunsigned int extra;\n\tconst code *lencode;\n\tconst code *distcode;\n\tunsigned int lenbits;\n\tunsigned int distbits;\n\tunsigned int ncode;\n\tunsigned int nlen;\n\tunsigned int ndist;\n\tunsigned int have;\n\tcode *next;\n\tshort unsigned int lens[320];\n\tshort unsigned int work[288];\n\tcode codes[2048];\n};\n\nstruct inflate_workspace {\n\tstruct inflate_state inflate_state;\n\tunsigned char working_window[32768];\n};\n\nstruct init_nmi {\n\tunsigned int offset;\n\tunsigned int mask;\n\tunsigned int data;\n};\n\nstruct powernow_k8_data;\n\nstruct init_on_cpu {\n\tstruct powernow_k8_data *data;\n\tint rc;\n};\n\nstruct x86_mapping_info;\n\nstruct init_pgtable_data {\n\tstruct x86_mapping_info *info;\n\tpgd_t *level4p;\n};\n\nstruct initvalues {\n\t__u8 addr;\n\t__u8 value;\n};\n\nstruct mnt_idmap;\n\nstruct kstat;\n\nstruct offset_ctx;\n\nstruct inode_operations {\n\tstruct dentry * (*lookup)(struct inode *, struct dentry *, unsigned int);\n\tconst char * (*get_link)(struct dentry *, struct inode *, struct delayed_call *);\n\tint (*permission)(struct mnt_idmap *, struct inode *, int);\n\tstruct posix_acl * (*get_inode_acl)(struct inode *, int, bool);\n\tint (*readlink)(struct dentry *, char *, int);\n\tint (*create)(struct mnt_idmap *, struct inode *, struct dentry *, umode_t, bool);\n\tint (*link)(struct dentry *, struct inode *, struct dentry *);\n\tint (*unlink)(struct inode *, struct dentry *);\n\tint (*symlink)(struct mnt_idmap *, struct inode *, struct dentry *, const char *);\n\tint (*mkdir)(struct mnt_idmap *, struct inode *, struct dentry *, umode_t);\n\tint (*rmdir)(struct inode *, struct dentry *);\n\tint (*mknod)(struct mnt_idmap *, struct inode *, struct dentry *, umode_t, dev_t);\n\tint (*rename)(struct mnt_idmap *, struct inode *, struct dentry *, struct inode *, struct dentry *, unsigned int);\n\tint (*setattr)(struct mnt_idmap *, struct dentry *, struct iattr *);\n\tint (*getattr)(struct mnt_idmap *, const struct path *, struct kstat *, u32, unsigned int);\n\tssize_t (*listxattr)(struct dentry *, char *, size_t);\n\tint (*fiemap)(struct inode *, struct fiemap_extent_info *, u64, u64);\n\tint (*update_time)(struct inode *, int);\n\tint (*atomic_open)(struct inode *, struct dentry *, struct file *, unsigned int, umode_t);\n\tint (*tmpfile)(struct mnt_idmap *, struct inode *, struct file *, umode_t);\n\tstruct posix_acl * (*get_acl)(struct mnt_idmap *, struct dentry *, int);\n\tint (*set_acl)(struct mnt_idmap *, struct dentry *, struct posix_acl *, int);\n\tint (*fileattr_set)(struct mnt_idmap *, struct dentry *, struct fileattr *);\n\tint (*fileattr_get)(struct dentry *, struct fileattr *);\n\tstruct offset_ctx * (*get_offset_ctx)(struct inode *);\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct inode_security_struct {\n\tstruct inode *inode;\n\tstruct list_head list;\n\tu32 task_sid;\n\tu32 sid;\n\tu16 sclass;\n\tunsigned char initialized;\n\tspinlock_t lock;\n};\n\nstruct inode_smack {\n\tstruct smack_known *smk_inode;\n\tstruct smack_known *smk_task;\n\tstruct smack_known *smk_mmap;\n\tint smk_flags;\n};\n\nstruct inode_switch_wbs_context {\n\tstruct rcu_work work;\n\tstruct bdi_writeback *new_wb;\n\tstruct inode *inodes[0];\n};\n\nstruct inodes_stat_t {\n\tlong int nr_inodes;\n\tlong int nr_unused;\n\tlong int dummy[5];\n};\n\nstruct inotify_event {\n\t__s32 wd;\n\t__u32 mask;\n\t__u32 cookie;\n\t__u32 len;\n\tchar name[0];\n};\n\nstruct inotify_event_info {\n\tstruct fsnotify_event fse;\n\tu32 mask;\n\tint wd;\n\tu32 sync_cookie;\n\tint name_len;\n\tchar name[0];\n};\n\nstruct inotify_inode_mark {\n\tstruct fsnotify_mark fsn_mark;\n\tint wd;\n};\n\nstruct input_absinfo {\n\t__s32 value;\n\t__s32 minimum;\n\t__s32 maximum;\n\t__s32 fuzz;\n\t__s32 flat;\n\t__s32 resolution;\n};\n\nstruct input_id {\n\t__u16 bustype;\n\t__u16 vendor;\n\t__u16 product;\n\t__u16 version;\n};\n\nstruct input_dev_poller;\n\nstruct input_mt;\n\nstruct input_dev {\n\tconst char *name;\n\tconst char *phys;\n\tconst char *uniq;\n\tstruct input_id id;\n\tlong unsigned int propbit[1];\n\tlong unsigned int evbit[1];\n\tlong unsigned int keybit[12];\n\tlong unsigned int relbit[1];\n\tlong unsigned int absbit[1];\n\tlong unsigned int mscbit[1];\n\tlong unsigned int ledbit[1];\n\tlong unsigned int sndbit[1];\n\tlong unsigned int ffbit[2];\n\tlong unsigned int swbit[1];\n\tunsigned int hint_events_per_packet;\n\tunsigned int keycodemax;\n\tunsigned int keycodesize;\n\tvoid *keycode;\n\tint (*setkeycode)(struct input_dev *, const struct input_keymap_entry *, unsigned int *);\n\tint (*getkeycode)(struct input_dev *, struct input_keymap_entry *);\n\tstruct ff_device *ff;\n\tstruct input_dev_poller *poller;\n\tunsigned int repeat_key;\n\tstruct timer_list timer;\n\tint rep[2];\n\tstruct input_mt *mt;\n\tstruct input_absinfo *absinfo;\n\tlong unsigned int key[12];\n\tlong unsigned int led[1];\n\tlong unsigned int snd[1];\n\tlong unsigned int sw[1];\n\tint (*open)(struct input_dev *);\n\tvoid (*close)(struct input_dev *);\n\tint (*flush)(struct input_dev *, struct file *);\n\tint (*event)(struct input_dev *, unsigned int, unsigned int, int);\n\tstruct input_handle *grab;\n\tspinlock_t event_lock;\n\tstruct mutex mutex;\n\tunsigned int users;\n\tbool going_away;\n\tstruct device dev;\n\tstruct list_head h_list;\n\tstruct list_head node;\n\tunsigned int num_vals;\n\tunsigned int max_vals;\n\tstruct input_value *vals;\n\tbool devres_managed;\n\tktime_t timestamp[3];\n\tbool inhibited;\n};\n\nstruct input_dev_poller {\n\tvoid (*poll)(struct input_dev *);\n\tunsigned int poll_interval;\n\tunsigned int poll_interval_max;\n\tunsigned int poll_interval_min;\n\tstruct input_dev *input;\n\tstruct delayed_work work;\n};\n\nstruct input_device_id {\n\tkernel_ulong_t flags;\n\t__u16 bustype;\n\t__u16 vendor;\n\t__u16 product;\n\t__u16 version;\n\tkernel_ulong_t evbit[1];\n\tkernel_ulong_t keybit[12];\n\tkernel_ulong_t relbit[1];\n\tkernel_ulong_t absbit[1];\n\tkernel_ulong_t mscbit[1];\n\tkernel_ulong_t ledbit[1];\n\tkernel_ulong_t sndbit[1];\n\tkernel_ulong_t ffbit[2];\n\tkernel_ulong_t swbit[1];\n\tkernel_ulong_t propbit[1];\n\tkernel_ulong_t driver_info;\n};\n\nstruct input_devres {\n\tstruct input_dev *input;\n};\n\nstruct input_event_compat {\n\tcompat_ulong_t sec;\n\tcompat_ulong_t usec;\n\t__u16 type;\n\t__u16 code;\n\t__s32 value;\n};\n\nstruct input_handler {\n\tvoid *private;\n\tvoid (*event)(struct input_handle *, unsigned int, unsigned int, int);\n\tunsigned int (*events)(struct input_handle *, struct input_value *, unsigned int);\n\tbool (*filter)(struct input_handle *, unsigned int, unsigned int, int);\n\tbool (*match)(struct input_handler *, struct input_dev *);\n\tint (*connect)(struct input_handler *, struct input_dev *, const struct input_device_id *);\n\tvoid (*disconnect)(struct input_handle *);\n\tvoid (*start)(struct input_handle *);\n\tbool legacy_minors;\n\tint minor;\n\tconst char *name;\n\tconst struct input_device_id *id_table;\n\tstruct list_head h_list;\n\tstruct list_head node;\n};\n\nstruct input_mask {\n\t__u32 type;\n\t__u32 codes_size;\n\t__u64 codes_ptr;\n};\n\nstruct input_mt_slot {\n\tint abs[14];\n\tunsigned int frame;\n\tunsigned int key;\n};\n\nstruct input_mt {\n\tint trkid;\n\tint num_slots;\n\tint slot;\n\tunsigned int flags;\n\tunsigned int frame;\n\tint *red;\n\tstruct input_mt_slot slots[0];\n};\n\nstruct input_mt_pos {\n\ts16 x;\n\ts16 y;\n};\n\nunion input_seq_state {\n\tstruct {\n\t\tshort unsigned int pos;\n\t\tbool mutex_acquired;\n\t};\n\tvoid *p;\n};\n\nstruct input_value {\n\t__u16 type;\n\t__u16 code;\n\t__s32 value;\n};\n\nstruct instance_attribute {\n\tstruct attribute attr;\n\tssize_t (*show)(struct edac_device_instance *, char *);\n\tssize_t (*store)(struct edac_device_instance *, const char *, size_t);\n};\n\nstruct instance_attribute___2 {\n\tstruct attribute attr;\n\tssize_t (*show)(struct edac_pci_ctl_info *, char *);\n\tssize_t (*store)(struct edac_pci_ctl_info *, const char *, size_t);\n};\n\nunion intcapxt {\n\tu64 capxt;\n\tstruct {\n\t\tu64 reserved_0: 2;\n\t\tu64 dest_mode_logical: 1;\n\t\tu64 reserved_1: 5;\n\t\tu64 destid_0_23: 24;\n\t\tu64 vector: 8;\n\t\tu64 reserved_2: 16;\n\t\tu64 destid_24_31: 8;\n\t};\n};\n\nstruct intel_agp_driver_description {\n\tunsigned int chip_id;\n\tchar *name;\n\tconst struct agp_bridge_driver *driver;\n};\n\nstruct intel_padgroup;\n\nstruct intel_community {\n\tunsigned int barno;\n\tunsigned int padown_offset;\n\tunsigned int padcfglock_offset;\n\tunsigned int hostown_offset;\n\tunsigned int is_offset;\n\tunsigned int ie_offset;\n\tunsigned int features;\n\tunsigned int pin_base;\n\tsize_t npins;\n\tunsigned int gpp_size;\n\tunsigned int gpp_num_padown_regs;\n\tconst struct intel_padgroup *gpps;\n\tsize_t ngpps;\n\tconst unsigned int *pad_map;\n\tshort unsigned int nirqs;\n\tshort unsigned int acpi_space_id;\n\tvoid *regs;\n\tvoid *pad_regs;\n};\n\nstruct intel_community_context {\n\tunsigned int intr_lines[16];\n\tu32 saved_intmask;\n};\n\nstruct intel_community_context___2 {\n\tu32 *intmask;\n\tu32 *hostown;\n};\n\nstruct intel_early_ops {\n\tresource_size_t (*stolen_size)(int, int, int);\n\tresource_size_t (*stolen_base)(int, int, int, resource_size_t);\n};\n\nstruct intel_excl_states {\n\tenum intel_excl_state_type state[64];\n\tbool sched_started;\n};\n\nstruct intel_excl_cntrs {\n\traw_spinlock_t lock;\n\tstruct intel_excl_states states[2];\n\tunion {\n\t\tu16 has_exclusive[2];\n\t\tu32 exclusive_present;\n\t};\n\tint refcnt;\n\tunsigned int core_id;\n};\n\nstruct pinfunction {\n\tconst char *name;\n\tconst char * const *groups;\n\tsize_t ngroups;\n};\n\nstruct intel_function {\n\tstruct pinfunction func;\n};\n\nstruct intel_gtt_driver {\n\tunsigned int gen: 8;\n\tunsigned int is_g33: 1;\n\tunsigned int is_pineview: 1;\n\tunsigned int is_ironlake: 1;\n\tunsigned int has_pgtbl_enable: 1;\n\tunsigned int dma_mask_size: 8;\n\tint (*setup)(void);\n\tvoid (*cleanup)(void);\n\tvoid (*write_entry)(dma_addr_t, unsigned int, unsigned int);\n\tbool (*check_flags)(unsigned int);\n\tvoid (*chipset_flush)(void);\n};\n\nstruct intel_gtt_driver_description {\n\tunsigned int gmch_chip_id;\n\tchar *name;\n\tconst struct intel_gtt_driver *gtt_driver;\n};\n\nstruct iommu_flush {\n\tvoid (*flush_context)(struct intel_iommu *, u16, u16, u8, u64);\n\tvoid (*flush_iotlb)(struct intel_iommu *, u16, u64, unsigned int, u64);\n};\n\nstruct root_entry;\n\nstruct page_req_dsc;\n\nstruct q_inval;\n\nstruct ir_table;\n\nstruct iommu_pmu;\n\nstruct intel_iommu {\n\tvoid *reg;\n\tu64 reg_phys;\n\tu64 reg_size;\n\tu64 cap;\n\tu64 ecap;\n\tu64 vccap;\n\tu64 ecmdcap[4];\n\tu32 gcmd;\n\traw_spinlock_t register_lock;\n\tint seq_id;\n\tint agaw;\n\tint msagaw;\n\tunsigned int irq;\n\tunsigned int pr_irq;\n\tunsigned int perf_irq;\n\tu16 segment;\n\tunsigned char name[13];\n\tlong unsigned int *domain_ids;\n\tlong unsigned int *copied_tables;\n\tspinlock_t lock;\n\tstruct root_entry *root_entry;\n\tstruct iommu_flush flush;\n\tstruct page_req_dsc *prq;\n\tunsigned char prq_name[16];\n\tlong unsigned int prq_seq_number;\n\tstruct completion prq_complete;\n\tstruct iopf_queue *iopf_queue;\n\tunsigned char iopfq_name[16];\n\tstruct mutex iopf_lock;\n\tstruct q_inval *qi;\n\tu32 iommu_state[4];\n\tstruct rb_root device_rbtree;\n\tspinlock_t device_rbtree_lock;\n\tstruct ir_table *ir_table;\n\tstruct irq_domain *ir_domain;\n\tstruct iommu_device iommu;\n\tint node;\n\tu32 flags;\n\tstruct dmar_drhd_unit *drhd;\n\tvoid *perf_statistic;\n\tstruct iommu_pmu *pmu;\n};\n\nstruct irq_2_iommu {\n\tstruct intel_iommu *iommu;\n\tu16 irte_index;\n\tu16 sub_handle;\n\tu8 irte_mask;\n\tenum irq_mode mode;\n\tbool posted_msi;\n};\n\nstruct irte {\n\tunion {\n\t\tstruct {\n\t\t\tunion {\n\t\t\t\tstruct {\n\t\t\t\t\t__u64 present: 1;\n\t\t\t\t\t__u64 fpd: 1;\n\t\t\t\t\t__u64 __res0: 6;\n\t\t\t\t\t__u64 avail: 4;\n\t\t\t\t\t__u64 __res1: 3;\n\t\t\t\t\t__u64 pst: 1;\n\t\t\t\t\t__u64 vector: 8;\n\t\t\t\t\t__u64 __res2: 40;\n\t\t\t\t};\n\t\t\t\tstruct {\n\t\t\t\t\t__u64 r_present: 1;\n\t\t\t\t\t__u64 r_fpd: 1;\n\t\t\t\t\t__u64 dst_mode: 1;\n\t\t\t\t\t__u64 redir_hint: 1;\n\t\t\t\t\t__u64 trigger_mode: 1;\n\t\t\t\t\t__u64 dlvry_mode: 3;\n\t\t\t\t\t__u64 r_avail: 4;\n\t\t\t\t\t__u64 r_res0: 4;\n\t\t\t\t\t__u64 r_vector: 8;\n\t\t\t\t\t__u64 r_res1: 8;\n\t\t\t\t\t__u64 dest_id: 32;\n\t\t\t\t};\n\t\t\t\tstruct {\n\t\t\t\t\t__u64 p_present: 1;\n\t\t\t\t\t__u64 p_fpd: 1;\n\t\t\t\t\t__u64 p_res0: 6;\n\t\t\t\t\t__u64 p_avail: 4;\n\t\t\t\t\t__u64 p_res1: 2;\n\t\t\t\t\t__u64 p_urgent: 1;\n\t\t\t\t\t__u64 p_pst: 1;\n\t\t\t\t\t__u64 p_vector: 8;\n\t\t\t\t\t__u64 p_res2: 14;\n\t\t\t\t\t__u64 pda_l: 26;\n\t\t\t\t};\n\t\t\t\t__u64 low;\n\t\t\t};\n\t\t\tunion {\n\t\t\t\tstruct {\n\t\t\t\t\t__u64 sid: 16;\n\t\t\t\t\t__u64 sq: 2;\n\t\t\t\t\t__u64 svt: 2;\n\t\t\t\t\t__u64 __res3: 44;\n\t\t\t\t};\n\t\t\t\tstruct {\n\t\t\t\t\t__u64 p_sid: 16;\n\t\t\t\t\t__u64 p_sq: 2;\n\t\t\t\t\t__u64 p_svt: 2;\n\t\t\t\t\t__u64 p_res3: 12;\n\t\t\t\t\t__u64 pda_h: 32;\n\t\t\t\t};\n\t\t\t\t__u64 high;\n\t\t\t};\n\t\t};\n\t\t__u128 irte;\n\t};\n};\n\nstruct intel_ir_data {\n\tstruct irq_2_iommu irq_2_iommu;\n\tlong: 64;\n\tstruct irte irte_entry;\n\tunion {\n\t\tstruct msi_msg msi_entry;\n\t};\n};\n\nstruct intel_pad_context {\n\tu32 padctrl0;\n\tu32 padctrl1;\n};\n\nstruct intel_pad_context___2 {\n\tu32 conf0;\n\tu32 val;\n};\n\nstruct intel_pad_context___3 {\n\tu32 padcfg0;\n\tu32 padcfg1;\n\tu32 padcfg2;\n};\n\nstruct intel_padgroup {\n\tunsigned int reg_num;\n\tunsigned int base;\n\tunsigned int size;\n\tint gpio_base;\n\tunsigned int padown_num;\n};\n\nstruct pinctrl_pin_desc;\n\nstruct pinctrl_ops;\n\nstruct pinmux_ops;\n\nstruct pinconf_ops;\n\nstruct pinconf_generic_params;\n\nstruct pin_config_item;\n\nstruct pinctrl_desc {\n\tconst char *name;\n\tconst struct pinctrl_pin_desc *pins;\n\tunsigned int npins;\n\tconst struct pinctrl_ops *pctlops;\n\tconst struct pinmux_ops *pmxops;\n\tconst struct pinconf_ops *confops;\n\tstruct module *owner;\n\tunsigned int num_custom_params;\n\tconst struct pinconf_generic_params *custom_params;\n\tconst struct pin_config_item *custom_conf_items;\n\tbool link_consumers;\n};\n\nstruct intel_pinctrl_context {\n\tstruct intel_pad_context *pads;\n\tstruct intel_community_context *communities;\n};\n\nstruct intel_pinctrl_soc_data;\n\nstruct intel_pinctrl {\n\tstruct device *dev;\n\traw_spinlock_t lock;\n\tstruct pinctrl_desc pctldesc;\n\tstruct pinctrl_dev *pctldev;\n\tstruct gpio_chip chip;\n\tconst struct intel_pinctrl_soc_data *soc;\n\tstruct intel_community *communities;\n\tsize_t ncommunities;\n\tstruct intel_pinctrl_context context;\n\tint irq;\n};\n\nstruct intel_community_context;\n\nstruct intel_pinctrl_context___2 {\n\tstruct intel_pad_context___2 *pads;\n\tstruct intel_community_context *communities;\n};\n\nstruct intel_pinctrl___2 {\n\tstruct device *dev;\n\traw_spinlock_t lock;\n\tstruct pinctrl_desc pctldesc;\n\tstruct pinctrl_dev *pctldev;\n\tstruct gpio_chip chip;\n\tconst struct intel_pinctrl_soc_data *soc;\n\tstruct intel_community *communities;\n\tsize_t ncommunities;\n\tstruct intel_pinctrl_context___2 context;\n\tint irq;\n};\n\nstruct intel_pinctrl_context___3 {\n\tstruct intel_pad_context___3 *pads;\n\tstruct intel_community_context___2 *communities;\n};\n\nstruct intel_pinctrl___3 {\n\tstruct device *dev;\n\traw_spinlock_t lock;\n\tstruct pinctrl_desc pctldesc;\n\tstruct pinctrl_dev *pctldev;\n\tstruct gpio_chip chip;\n\tconst struct intel_pinctrl_soc_data *soc;\n\tstruct intel_community *communities;\n\tsize_t ncommunities;\n\tstruct intel_pinctrl_context___3 context;\n\tint irq;\n};\n\nstruct intel_pingroup;\n\nstruct intel_pinctrl_soc_data {\n\tconst char *uid;\n\tconst struct pinctrl_pin_desc *pins;\n\tsize_t npins;\n\tconst struct intel_pingroup *groups;\n\tsize_t ngroups;\n\tconst struct intel_function *functions;\n\tsize_t nfunctions;\n\tconst struct intel_community *communities;\n\tsize_t ncommunities;\n};\n\nstruct pingroup {\n\tconst char *name;\n\tconst unsigned int *pins;\n\tsize_t npins;\n};\n\nstruct intel_pingroup {\n\tstruct pingroup grp;\n\tshort unsigned int mode;\n\tconst unsigned int *modes;\n};\n\nstruct intel_pmic_regs_handler_ctx {\n\tunsigned int val;\n\tu16 addr;\n};\n\nstruct intel_pmic_opregion_data;\n\nstruct intel_pmic_opregion {\n\tstruct mutex lock;\n\tstruct acpi_lpat_conversion_table *lpat_table;\n\tstruct regmap *regmap;\n\tconst struct intel_pmic_opregion_data *data;\n\tstruct intel_pmic_regs_handler_ctx ctx;\n};\n\nstruct pmic_table;\n\nstruct intel_pmic_opregion_data {\n\tint (*get_power)(struct regmap *, int, int, u64 *);\n\tint (*update_power)(struct regmap *, int, int, bool);\n\tint (*get_raw_temp)(struct regmap *, int);\n\tint (*update_aux)(struct regmap *, int, int);\n\tint (*get_policy)(struct regmap *, int, int, u64 *);\n\tint (*update_policy)(struct regmap *, int, int, int);\n\tint (*exec_mipi_pmic_seq_element)(struct regmap *, u16, u32, u32, u32);\n\tint (*lpat_raw_to_temp)(struct acpi_lpat_conversion_table *, int);\n\tconst struct pmic_table *power_table;\n\tint power_table_count;\n\tconst struct pmic_table *thermal_table;\n\tint thermal_table_count;\n\tint pmic_i2c_address;\n};\n\nstruct intel_scu_ipc_data {\n\tstruct resource mem;\n\tint irq;\n};\n\nstruct intel_scu_ipc_dev {\n\tstruct device dev;\n\tstruct resource mem;\n\tstruct module *owner;\n\tint irq;\n\tvoid *ipc_base;\n\tstruct completion cmd_complete;\n};\n\nstruct intel_scu_ipc_devres {\n\tstruct intel_scu_ipc_dev *scu;\n};\n\nstruct intel_shared_regs {\n\tstruct er_account regs[7];\n\tint refcnt;\n\tunsigned int core_id;\n};\n\nstruct intel_soc_pmic {\n\tint irq;\n\tstruct regmap *regmap;\n\tstruct regmap_irq_chip_data *irq_chip_data;\n\tstruct regmap_irq_chip_data *irq_chip_data_pwrbtn;\n\tstruct regmap_irq_chip_data *irq_chip_data_tmu;\n\tstruct regmap_irq_chip_data *irq_chip_data_bcu;\n\tstruct regmap_irq_chip_data *irq_chip_data_adc;\n\tstruct regmap_irq_chip_data *irq_chip_data_chgr;\n\tstruct regmap_irq_chip_data *irq_chip_data_crit;\n\tstruct device *dev;\n\tstruct intel_scu_ipc_dev *scu;\n\tenum intel_cht_wc_models cht_wc_model;\n};\n\nstruct intel_uncore_extra_reg {\n\traw_spinlock_t lock;\n\tu64 config;\n\tu64 config1;\n\tu64 config2;\n\tatomic_t ref;\n};\n\nstruct intel_uncore_pmu;\n\nstruct intel_uncore_box {\n\tint dieid;\n\tint n_active;\n\tint n_events;\n\tint cpu;\n\tlong unsigned int flags;\n\tatomic_t refcnt;\n\tstruct perf_event *events[10];\n\tstruct perf_event *event_list[10];\n\tstruct event_constraint *event_constraint[10];\n\tlong unsigned int active_mask[1];\n\tu64 tags[10];\n\tstruct pci_dev *pci_dev;\n\tstruct intel_uncore_pmu *pmu;\n\tu64 hrtimer_duration;\n\tstruct hrtimer hrtimer;\n\tstruct list_head list;\n\tstruct list_head active_list;\n\tvoid *io_addr;\n\tstruct intel_uncore_extra_reg shared_regs[0];\n};\n\nstruct intel_uncore_discovery_type {\n\tstruct rb_node node;\n\tenum uncore_access_type access_type;\n\tstruct rb_root units;\n\tu16 type;\n\tu8 num_counters;\n\tu8 counter_width;\n\tu8 ctl_offset;\n\tu8 ctr_offset;\n\tu16 num_units;\n};\n\nstruct intel_uncore_discovery_unit {\n\tstruct rb_node node;\n\tunsigned int pmu_idx;\n\tunsigned int id;\n\tunsigned int die;\n\tu64 addr;\n};\n\nstruct intel_uncore_init_fun {\n\tvoid (*cpu_init)(void);\n\tint (*pci_init)(void);\n\tvoid (*mmio_init)(void);\n\tbool use_discovery;\n\tint *uncore_units_ignore;\n};\n\nstruct intel_uncore_ops {\n\tvoid (*init_box)(struct intel_uncore_box *);\n\tvoid (*exit_box)(struct intel_uncore_box *);\n\tvoid (*disable_box)(struct intel_uncore_box *);\n\tvoid (*enable_box)(struct intel_uncore_box *);\n\tvoid (*disable_event)(struct intel_uncore_box *, struct perf_event *);\n\tvoid (*enable_event)(struct intel_uncore_box *, struct perf_event *);\n\tu64 (*read_counter)(struct intel_uncore_box *, struct perf_event *);\n\tint (*hw_config)(struct intel_uncore_box *, struct perf_event *);\n\tstruct event_constraint * (*get_constraint)(struct intel_uncore_box *, struct perf_event *);\n\tvoid (*put_constraint)(struct intel_uncore_box *, struct perf_event *);\n};\n\nstruct perf_cpu_pmu_context;\n\nstruct perf_event_pmu_context;\n\nstruct pmu {\n\tstruct list_head entry;\n\tstruct module *module;\n\tstruct device *dev;\n\tstruct device *parent;\n\tconst struct attribute_group **attr_groups;\n\tconst struct attribute_group **attr_update;\n\tconst char *name;\n\tint type;\n\tint capabilities;\n\tint *pmu_disable_count;\n\tstruct perf_cpu_pmu_context *cpu_pmu_context;\n\tatomic_t exclusive_cnt;\n\tint task_ctx_nr;\n\tint hrtimer_interval_ms;\n\tunsigned int nr_addr_filters;\n\tvoid (*pmu_enable)(struct pmu *);\n\tvoid (*pmu_disable)(struct pmu *);\n\tint (*event_init)(struct perf_event *);\n\tvoid (*event_mapped)(struct perf_event *, struct mm_struct *);\n\tvoid (*event_unmapped)(struct perf_event *, struct mm_struct *);\n\tint (*add)(struct perf_event *, int);\n\tvoid (*del)(struct perf_event *, int);\n\tvoid (*start)(struct perf_event *, int);\n\tvoid (*stop)(struct perf_event *, int);\n\tvoid (*read)(struct perf_event *);\n\tvoid (*start_txn)(struct pmu *, unsigned int);\n\tint (*commit_txn)(struct pmu *);\n\tvoid (*cancel_txn)(struct pmu *);\n\tint (*event_idx)(struct perf_event *);\n\tvoid (*sched_task)(struct perf_event_pmu_context *, bool);\n\tstruct kmem_cache *task_ctx_cache;\n\tvoid (*swap_task_ctx)(struct perf_event_pmu_context *, struct perf_event_pmu_context *);\n\tvoid * (*setup_aux)(struct perf_event *, void **, int, bool);\n\tvoid (*free_aux)(void *);\n\tlong int (*snapshot_aux)(struct perf_event *, struct perf_output_handle *, long unsigned int);\n\tint (*addr_filters_validate)(struct list_head *);\n\tvoid (*addr_filters_sync)(struct perf_event *);\n\tint (*aux_output_match)(struct perf_event *);\n\tbool (*filter)(struct pmu *, int);\n\tint (*check_period)(struct perf_event *, u64);\n};\n\nstruct intel_uncore_type;\n\nstruct intel_uncore_pmu {\n\tstruct pmu pmu;\n\tchar name[32];\n\tint pmu_idx;\n\tint func_id;\n\tbool registered;\n\tatomic_t activeboxes;\n\tcpumask_t cpu_mask;\n\tstruct intel_uncore_type *type;\n\tstruct intel_uncore_box **boxes;\n};\n\nstruct uncore_iio_topology;\n\nstruct uncore_upi_topology;\n\nstruct intel_uncore_topology {\n\tint pmu_idx;\n\tunion {\n\t\tvoid *untyped;\n\t\tstruct uncore_iio_topology *iio;\n\t\tstruct uncore_upi_topology *upi;\n\t};\n};\n\nstruct uncore_event_desc;\n\nstruct intel_uncore_type {\n\tconst char *name;\n\tint num_counters;\n\tint num_boxes;\n\tint perf_ctr_bits;\n\tint fixed_ctr_bits;\n\tint num_freerunning_types;\n\tint type_id;\n\tunsigned int perf_ctr;\n\tunsigned int event_ctl;\n\tunsigned int event_mask;\n\tunsigned int event_mask_ext;\n\tunsigned int fixed_ctr;\n\tunsigned int fixed_ctl;\n\tunsigned int box_ctl;\n\tunion {\n\t\tunsigned int msr_offset;\n\t\tunsigned int mmio_offset;\n\t};\n\tunsigned int mmio_map_size;\n\tunsigned int num_shared_regs: 8;\n\tunsigned int single_fixed: 1;\n\tunsigned int pair_ctr_ctl: 1;\n\tunion {\n\t\tu64 *msr_offsets;\n\t\tu64 *pci_offsets;\n\t\tu64 *mmio_offsets;\n\t};\n\tstruct event_constraint unconstrainted;\n\tstruct event_constraint *constraints;\n\tstruct intel_uncore_pmu *pmus;\n\tstruct intel_uncore_ops *ops;\n\tstruct uncore_event_desc *event_descs;\n\tstruct freerunning_counters *freerunning;\n\tconst struct attribute_group *attr_groups[4];\n\tconst struct attribute_group **attr_update;\n\tstruct pmu *pmu;\n\tstruct rb_root *boxes;\n\tstruct intel_uncore_topology **topology;\n\tint (*get_topology)(struct intel_uncore_type *);\n\tvoid (*set_mapping)(struct intel_uncore_type *);\n\tvoid (*cleanup_mapping)(struct intel_uncore_type *);\n\tvoid (*cleanup_extra_boxes)(struct intel_uncore_type *);\n};\n\nunion intel_x86_pebs_dse {\n\tu64 val;\n\tstruct {\n\t\tunsigned int ld_dse: 4;\n\t\tunsigned int ld_stlb_miss: 1;\n\t\tunsigned int ld_locked: 1;\n\t\tunsigned int ld_data_blk: 1;\n\t\tunsigned int ld_addr_blk: 1;\n\t\tunsigned int ld_reserved: 24;\n\t};\n\tstruct {\n\t\tunsigned int st_l1d_hit: 1;\n\t\tunsigned int st_reserved1: 3;\n\t\tunsigned int st_stlb_miss: 1;\n\t\tunsigned int st_locked: 1;\n\t\tunsigned int st_reserved2: 26;\n\t};\n\tstruct {\n\t\tunsigned int st_lat_dse: 4;\n\t\tunsigned int st_lat_stlb_miss: 1;\n\t\tunsigned int st_lat_locked: 1;\n\t\tunsigned int ld_reserved3: 26;\n\t};\n\tstruct {\n\t\tunsigned int mtl_dse: 5;\n\t\tunsigned int mtl_locked: 1;\n\t\tunsigned int mtl_stlb_miss: 1;\n\t\tunsigned int mtl_fwd_blk: 1;\n\t\tunsigned int ld_reserved4: 24;\n\t};\n\tstruct {\n\t\tunsigned int lnc_dse: 8;\n\t\tunsigned int ld_reserved5: 2;\n\t\tunsigned int lnc_stlb_miss: 1;\n\t\tunsigned int lnc_locked: 1;\n\t\tunsigned int lnc_data_blk: 1;\n\t\tunsigned int lnc_addr_blk: 1;\n\t\tunsigned int ld_reserved6: 18;\n\t};\n};\n\nstruct internal_container {\n\tstruct klist_node node;\n\tstruct attribute_container *cont;\n\tstruct device classdev;\n};\n\nstruct internal_state {\n\tint dummy;\n};\n\nstruct interval {\n\tuint32_t first;\n\tuint32_t last;\n};\n\nstruct interval_tree_span_iter {\n\tstruct interval_tree_node *nodes[2];\n\tlong unsigned int first_index;\n\tlong unsigned int last_index;\n\tunion {\n\t\tlong unsigned int start_hole;\n\t\tlong unsigned int start_used;\n\t};\n\tunion {\n\t\tlong unsigned int last_hole;\n\t\tlong unsigned int last_used;\n\t};\n\tint is_hole;\n};\n\nstruct invalid_value_data {\n\tstruct source_location location;\n\tstruct type_descriptor *type;\n};\n\nstruct io {\n\tlong unsigned int error_bits;\n\tatomic_t count;\n\tstruct dm_io_client *client;\n\tio_notify_fn callback;\n\tvoid *context;\n\tvoid *vma_invalidate_address;\n\tlong unsigned int vma_invalidate_size;\n\tlong: 64;\n};\n\nstruct io_accept {\n\tstruct file *file;\n\tstruct sockaddr *addr;\n\tint *addr_len;\n\tint flags;\n\tint iou_flags;\n\tu32 file_slot;\n\tlong unsigned int nofile;\n};\n\nstruct io_alloc_cache {\n\tvoid **entries;\n\tunsigned int nr_cached;\n\tunsigned int max_cached;\n\tsize_t elem_size;\n};\n\nstruct io_apic {\n\tunsigned int index;\n\tunsigned int unused[3];\n\tunsigned int data;\n\tunsigned int unused2[11];\n\tunsigned int eoi;\n};\n\nstruct ubuf_info;\n\nstruct msghdr {\n\tvoid *msg_name;\n\tint msg_namelen;\n\tint msg_inq;\n\tstruct iov_iter msg_iter;\n\tunion {\n\t\tvoid *msg_control;\n\t\tvoid *msg_control_user;\n\t};\n\tbool msg_control_is_user: 1;\n\tbool msg_get_inq: 1;\n\tunsigned int msg_flags;\n\t__kernel_size_t msg_controllen;\n\tstruct kiocb *msg_iocb;\n\tstruct ubuf_info *msg_ubuf;\n\tint (*sg_from_iter)(struct sk_buff *, struct iov_iter *, size_t);\n};\n\nstruct io_async_msghdr {\n\tstruct iovec fast_iov;\n\tstruct iovec *free_iov;\n\tint free_iov_nr;\n\tint namelen;\n\t__kernel_size_t controllen;\n\t__kernel_size_t payloadlen;\n\tstruct sockaddr *uaddr;\n\tstruct msghdr msg;\n\tstruct __kernel_sockaddr_storage addr;\n};\n\nstruct iov_iter_state {\n\tsize_t iov_offset;\n\tsize_t count;\n\tlong unsigned int nr_segs;\n};\n\nstruct wait_page_queue {\n\tstruct folio *folio;\n\tint bit_nr;\n\twait_queue_entry_t wait;\n};\n\nstruct io_async_rw {\n\tsize_t bytes_done;\n\tstruct iov_iter iter;\n\tstruct iov_iter_state iter_state;\n\tstruct iovec fast_iov;\n\tstruct iovec *free_iovec;\n\tint free_iov_nr;\n\tstruct wait_page_queue wpq;\n};\n\nstruct io_bind {\n\tstruct file *file;\n\tint addr_len;\n};\n\nstruct io_bitmap {\n\tu64 sequence;\n\trefcount_t refcnt;\n\tunsigned int max;\n\tlong unsigned int bitmap[1024];\n};\n\nstruct io_buffer {\n\tstruct list_head list;\n\t__u64 addr;\n\t__u32 len;\n\t__u16 bid;\n\t__u16 bgid;\n};\n\nstruct io_uring_buf_ring;\n\nstruct io_buffer_list {\n\tunion {\n\t\tstruct list_head buf_list;\n\t\tstruct {\n\t\t\tstruct page **buf_pages;\n\t\t\tstruct io_uring_buf_ring *buf_ring;\n\t\t};\n\t\tstruct callback_head rcu;\n\t};\n\t__u16 bgid;\n\t__u16 buf_nr_pages;\n\t__u16 nr_entries;\n\t__u16 head;\n\t__u16 mask;\n\tatomic_t refs;\n\t__u8 is_buf_ring;\n\t__u8 is_mmap;\n};\n\nstruct io_cancel {\n\tstruct file *file;\n\tu64 addr;\n\tu32 flags;\n\ts32 fd;\n\tu8 opcode;\n};\n\nstruct io_ring_ctx;\n\nstruct io_cancel_data {\n\tstruct io_ring_ctx *ctx;\n\tunion {\n\t\tu64 data;\n\t\tstruct file *file;\n\t};\n\tu8 opcode;\n\tu32 flags;\n\tint seq;\n};\n\nstruct io_wq_work;\n\ntypedef bool work_cancel_fn(struct io_wq_work *, void *);\n\nstruct io_cb_cancel_data {\n\twork_cancel_fn *fn;\n\tvoid *data;\n\tint nr_running;\n\tint nr_pending;\n\tbool cancel_all;\n};\n\nstruct io_close {\n\tstruct file *file;\n\tint fd;\n\tu32 file_slot;\n};\n\nstruct io_cmd_data {\n\tstruct file *file;\n\t__u8 data[56];\n};\n\nstruct io_kiocb;\n\nstruct io_cold_def {\n\tconst char *name;\n\tvoid (*cleanup)(struct io_kiocb *);\n\tvoid (*fail)(struct io_kiocb *);\n};\n\nstruct io_comp_batch {\n\tstruct request *req_list;\n\tbool need_ts;\n\tvoid (*complete)(struct io_comp_batch *);\n};\n\nstruct io_connect {\n\tstruct file *file;\n\tstruct sockaddr *addr;\n\tint addr_len;\n\tbool in_progress;\n\tbool seen_econnaborted;\n};\n\nstruct io_context {\n\tatomic_long_t refcount;\n\tatomic_t active_ref;\n\tshort unsigned int ioprio;\n\tspinlock_t lock;\n\tstruct xarray icq_tree;\n\tstruct io_cq *icq_hint;\n\tstruct hlist_head icq_list;\n\tstruct work_struct release_work;\n};\n\nstruct io_cq {\n\tstruct request_queue *q;\n\tstruct io_context *ioc;\n\tunion {\n\t\tstruct list_head q_node;\n\t\tstruct kmem_cache *__rcu_icq_cache;\n\t};\n\tunion {\n\t\tstruct hlist_node ioc_node;\n\t\tstruct callback_head __rcu_head;\n\t};\n\tunsigned int flags;\n};\n\nstruct io_cqe {\n\t__u64 user_data;\n\t__s32 res;\n\tunion {\n\t\t__u32 flags;\n\t\tint fd;\n\t};\n};\n\nstruct io_cqring_offsets {\n\t__u32 head;\n\t__u32 tail;\n\t__u32 ring_mask;\n\t__u32 ring_entries;\n\t__u32 overflow;\n\t__u32 cqes;\n\t__u32 flags;\n\t__u32 resv1;\n\t__u64 user_addr;\n};\n\nstruct io_defer_entry {\n\tstruct list_head list;\n\tstruct io_kiocb *req;\n\tu32 seq;\n};\n\nstruct io_epoll {\n\tstruct file *file;\n\tint epfd;\n\tint op;\n\tint fd;\n\tstruct epoll_event event;\n};\n\nstruct io_err_c {\n\tstruct dm_dev *dev;\n\tsector_t start;\n};\n\nstruct io_ev_fd {\n\tstruct eventfd_ctx *cq_ev_fd;\n\tunsigned int eventfd_async: 1;\n\tstruct callback_head rcu;\n\tatomic_t refs;\n\tatomic_t ops;\n};\n\nstruct io_fadvise {\n\tstruct file *file;\n\tu64 offset;\n\tu64 len;\n\tu32 advice;\n};\n\nstruct io_fixed_file;\n\nstruct io_file_table {\n\tstruct io_fixed_file *files;\n\tlong unsigned int *bitmap;\n\tunsigned int alloc_hint;\n};\n\nstruct io_fixed_file {\n\tlong unsigned int file_ptr;\n};\n\nstruct io_fixed_install {\n\tstruct file *file;\n\tunsigned int o_flags;\n};\n\nstruct io_ftrunc {\n\tstruct file *file;\n\tloff_t len;\n};\n\nstruct io_futex {\n\tstruct file *file;\n\tunion {\n\t\tu32 *uaddr;\n\t\tstruct futex_waitv *uwaitv;\n\t};\n\tlong unsigned int futex_val;\n\tlong unsigned int futex_mask;\n\tlong unsigned int futexv_owned;\n\tu32 futex_flags;\n\tunsigned int futex_nr;\n\tbool futexv_unqueued;\n};\n\nstruct io_futex_data {\n\tstruct futex_q q;\n\tstruct io_kiocb *req;\n};\n\nstruct io_hash_bucket {\n\tspinlock_t lock;\n\tstruct hlist_head list;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct io_hash_table {\n\tstruct io_hash_bucket *hbs;\n\tunsigned int hash_bits;\n};\n\nstruct io_uring_sqe;\n\nstruct io_issue_def {\n\tunsigned int needs_file: 1;\n\tunsigned int plug: 1;\n\tunsigned int hash_reg_file: 1;\n\tunsigned int unbound_nonreg_file: 1;\n\tunsigned int pollin: 1;\n\tunsigned int pollout: 1;\n\tunsigned int poll_exclusive: 1;\n\tunsigned int buffer_select: 1;\n\tunsigned int audit_skip: 1;\n\tunsigned int ioprio: 1;\n\tunsigned int iopoll: 1;\n\tunsigned int iopoll_queue: 1;\n\tunsigned int vectored: 1;\n\tshort unsigned int async_size;\n\tint (*issue)(struct io_kiocb *, unsigned int);\n\tint (*prep)(struct io_kiocb *, const struct io_uring_sqe *);\n};\n\nstruct io_wq_work_node {\n\tstruct io_wq_work_node *next;\n};\n\nstruct io_tw_state;\n\ntypedef void (*io_req_tw_func_t)(struct io_kiocb *, struct io_tw_state *);\n\nstruct io_task_work {\n\tstruct llist_node node;\n\tio_req_tw_func_t func;\n};\n\nstruct io_wq_work {\n\tstruct io_wq_work_node list;\n\tatomic_t flags;\n\tint cancel_seq;\n};\n\nstruct io_mapped_ubuf;\n\nstruct io_rsrc_node;\n\nstruct io_kiocb {\n\tunion {\n\t\tstruct file *file;\n\t\tstruct io_cmd_data cmd;\n\t};\n\tu8 opcode;\n\tu8 iopoll_completed;\n\tu16 buf_index;\n\tunsigned int nr_tw;\n\tio_req_flags_t flags;\n\tstruct io_cqe cqe;\n\tstruct io_ring_ctx *ctx;\n\tstruct task_struct *task;\n\tunion {\n\t\tstruct io_mapped_ubuf *imu;\n\t\tstruct io_buffer *kbuf;\n\t\tstruct io_buffer_list *buf_list;\n\t};\n\tunion {\n\t\tstruct io_wq_work_node comp_list;\n\t\t__poll_t apoll_events;\n\t};\n\tstruct io_rsrc_node *rsrc_node;\n\tatomic_t refs;\n\tbool cancel_seq_set;\n\tstruct io_task_work io_task_work;\n\tstruct hlist_node hash_node;\n\tstruct async_poll *apoll;\n\tvoid *async_data;\n\tatomic_t poll_refs;\n\tstruct io_kiocb *link;\n\tconst struct cred *creds;\n\tstruct io_wq_work work;\n\tstruct {\n\t\tu64 extra1;\n\t\tu64 extra2;\n\t} big_cqe;\n};\n\nstruct io_link {\n\tstruct file *file;\n\tint old_dfd;\n\tint new_dfd;\n\tstruct filename *oldpath;\n\tstruct filename *newpath;\n\tint flags;\n};\n\nstruct io_listen {\n\tstruct file *file;\n\tint backlog;\n};\n\nstruct io_madvise {\n\tstruct file *file;\n\tu64 addr;\n\tu64 len;\n\tu32 advice;\n};\n\nstruct io_mapped_ubuf {\n\tu64 ubuf;\n\tu64 ubuf_end;\n\tunsigned int nr_bvecs;\n\tlong unsigned int acct_pages;\n\tstruct bio_vec bvec[0];\n};\n\nstruct io_mkdir {\n\tstruct file *file;\n\tint dfd;\n\tumode_t mode;\n\tstruct filename *filename;\n};\n\nstruct io_msg {\n\tstruct file *file;\n\tstruct file *src_file;\n\tstruct callback_head tw;\n\tu64 user_data;\n\tu32 len;\n\tu32 cmd;\n\tu32 src_fd;\n\tunion {\n\t\tu32 dst_fd;\n\t\tu32 cqe_flags;\n\t};\n\tu32 flags;\n};\n\nstruct io_napi_entry {\n\tunsigned int napi_id;\n\tstruct list_head list;\n\tlong unsigned int timeout;\n\tstruct hlist_node node;\n\tstruct callback_head rcu;\n};\n\nstruct io_nop {\n\tstruct file *file;\n\tint result;\n};\n\nstruct ubuf_info_ops;\n\nstruct ubuf_info {\n\tconst struct ubuf_info_ops *ops;\n\trefcount_t refcnt;\n\tu8 flags;\n};\n\nstruct io_notif_data {\n\tstruct file *file;\n\tstruct ubuf_info uarg;\n\tstruct io_notif_data *next;\n\tstruct io_notif_data *head;\n\tunsigned int account_pages;\n\tbool zc_report;\n\tbool zc_used;\n\tbool zc_copied;\n};\n\nstruct io_open {\n\tstruct file *file;\n\tint dfd;\n\tu32 file_slot;\n\tstruct filename *filename;\n\tstruct open_how how;\n\tlong unsigned int nofile;\n};\n\nstruct io_uring_cqe {\n\t__u64 user_data;\n\t__s32 res;\n\t__u32 flags;\n\t__u64 big_cqe[0];\n};\n\nstruct io_overflow_cqe {\n\tstruct list_head list;\n\tstruct io_uring_cqe cqe;\n};\n\nstruct io_pgtable_init_fns {\n\tstruct io_pgtable * (*alloc)(struct io_pgtable_cfg *, void *);\n\tvoid (*free)(struct io_pgtable *);\n\tu32 caps;\n};\n\nstruct io_poll_table {\n\tstruct poll_table_struct pt;\n\tstruct io_kiocb *req;\n\tint nr_entries;\n\tint error;\n\tbool owning;\n\t__poll_t result_mask;\n};\n\nstruct io_poll_update {\n\tstruct file *file;\n\tu64 old_user_data;\n\tu64 new_user_data;\n\t__poll_t events;\n\tbool update_events;\n\tbool update_user_data;\n};\n\nstruct io_provide_buf {\n\tstruct file *file;\n\t__u64 addr;\n\t__u32 len;\n\t__u32 bgid;\n\t__u32 nbufs;\n\t__u16 bid;\n};\n\nstruct io_uring_recvmsg_out {\n\t__u32 namelen;\n\t__u32 controllen;\n\t__u32 payloadlen;\n\t__u32 flags;\n};\n\nstruct io_recvmsg_multishot_hdr {\n\tstruct io_uring_recvmsg_out msg;\n\tstruct __kernel_sockaddr_storage addr;\n};\n\nstruct io_rename {\n\tstruct file *file;\n\tint old_dfd;\n\tint new_dfd;\n\tstruct filename *oldpath;\n\tstruct filename *newpath;\n\tint flags;\n};\n\nstruct io_restriction {\n\tlong unsigned int register_op[1];\n\tlong unsigned int sqe_op[1];\n\tu8 sqe_flags_allowed;\n\tu8 sqe_flags_required;\n\tbool registered;\n};\n\nstruct io_wq_work_list {\n\tstruct io_wq_work_node *first;\n\tstruct io_wq_work_node *last;\n};\n\nstruct io_submit_link {\n\tstruct io_kiocb *head;\n\tstruct io_kiocb *last;\n};\n\nstruct io_submit_state {\n\tstruct io_wq_work_node free_list;\n\tstruct io_wq_work_list compl_reqs;\n\tstruct io_submit_link link;\n\tbool plug_started;\n\tbool need_plug;\n\tbool cq_flush;\n\tshort unsigned int submit_nr;\n\tstruct blk_plug plug;\n};\n\nstruct io_rings;\n\nstruct io_sq_data;\n\nstruct io_rsrc_data;\n\nstruct io_wq_hash;\n\nstruct io_ring_ctx {\n\tstruct {\n\t\tunsigned int flags;\n\t\tunsigned int drain_next: 1;\n\t\tunsigned int restricted: 1;\n\t\tunsigned int off_timeout_used: 1;\n\t\tunsigned int drain_active: 1;\n\t\tunsigned int has_evfd: 1;\n\t\tunsigned int task_complete: 1;\n\t\tunsigned int lockless_cq: 1;\n\t\tunsigned int syscall_iopoll: 1;\n\t\tunsigned int poll_activated: 1;\n\t\tunsigned int drain_disabled: 1;\n\t\tunsigned int compat: 1;\n\t\tunsigned int iowq_limits_set: 1;\n\t\tstruct task_struct *submitter_task;\n\t\tstruct io_rings *rings;\n\t\tstruct percpu_ref refs;\n\t\tenum task_work_notify_mode notify_method;\n\t\tunsigned int sq_thread_idle;\n\t\tlong: 64;\n\t\tlong: 64;\n\t};\n\tstruct {\n\t\tstruct mutex uring_lock;\n\t\tu32 *sq_array;\n\t\tstruct io_uring_sqe *sq_sqes;\n\t\tunsigned int cached_sq_head;\n\t\tunsigned int sq_entries;\n\t\tstruct io_rsrc_node *rsrc_node;\n\t\tatomic_t cancel_seq;\n\t\tbool poll_multi_queue;\n\t\tstruct io_wq_work_list iopoll_list;\n\t\tstruct io_file_table file_table;\n\t\tstruct io_mapped_ubuf **user_bufs;\n\t\tunsigned int nr_user_files;\n\t\tunsigned int nr_user_bufs;\n\t\tstruct io_submit_state submit_state;\n\t\tstruct xarray io_bl_xa;\n\t\tstruct io_hash_table cancel_table_locked;\n\t\tstruct io_alloc_cache apoll_cache;\n\t\tstruct io_alloc_cache netmsg_cache;\n\t\tstruct io_alloc_cache rw_cache;\n\t\tstruct io_alloc_cache uring_cache;\n\t\tstruct hlist_head cancelable_uring_cmd;\n\t\tlong: 64;\n\t\tlong: 64;\n\t\tlong: 64;\n\t};\n\tstruct {\n\t\tstruct io_uring_cqe *cqe_cached;\n\t\tstruct io_uring_cqe *cqe_sentinel;\n\t\tunsigned int cached_cq_tail;\n\t\tunsigned int cq_entries;\n\t\tstruct io_ev_fd *io_ev_fd;\n\t\tunsigned int cq_extra;\n\t\tlong: 64;\n\t\tlong: 64;\n\t\tlong: 64;\n\t};\n\tstruct {\n\t\tstruct llist_head work_llist;\n\t\tlong unsigned int check_cq;\n\t\tatomic_t cq_wait_nr;\n\t\tatomic_t cq_timeouts;\n\t\tstruct wait_queue_head cq_wait;\n\t\tlong: 64;\n\t\tlong: 64;\n\t};\n\tstruct {\n\t\tspinlock_t timeout_lock;\n\t\tstruct list_head timeout_list;\n\t\tstruct list_head ltimeout_list;\n\t\tunsigned int cq_last_tm_flush;\n\t\tlong: 64;\n\t\tlong: 64;\n\t};\n\tspinlock_t completion_lock;\n\tstruct list_head io_buffers_comp;\n\tstruct list_head cq_overflow_list;\n\tstruct io_hash_table cancel_table;\n\tstruct hlist_head waitid_list;\n\tstruct hlist_head futex_list;\n\tstruct io_alloc_cache futex_cache;\n\tconst struct cred *sq_creds;\n\tstruct io_sq_data *sq_data;\n\tstruct wait_queue_head sqo_sq_wait;\n\tstruct list_head sqd_list;\n\tunsigned int file_alloc_start;\n\tunsigned int file_alloc_end;\n\tstruct list_head io_buffers_cache;\n\tstruct wait_queue_head poll_wq;\n\tstruct io_restriction restrictions;\n\tstruct io_rsrc_data *file_data;\n\tstruct io_rsrc_data *buf_data;\n\tstruct list_head rsrc_ref_list;\n\tstruct io_alloc_cache rsrc_node_cache;\n\tstruct wait_queue_head rsrc_quiesce_wq;\n\tunsigned int rsrc_quiesce;\n\tu32 pers_next;\n\tstruct xarray personalities;\n\tstruct io_wq_hash *hash_map;\n\tstruct user_struct *user;\n\tstruct mm_struct *mm_account;\n\tstruct llist_head fallback_llist;\n\tstruct delayed_work fallback_work;\n\tstruct work_struct exit_work;\n\tstruct list_head tctx_list;\n\tstruct completion ref_comp;\n\tu32 iowq_limits[2];\n\tstruct callback_head poll_wq_task_work;\n\tstruct list_head defer_list;\n\tstruct io_alloc_cache msg_cache;\n\tspinlock_t msg_lock;\n\tstruct list_head napi_list;\n\tspinlock_t napi_lock;\n\tktime_t napi_busy_poll_dt;\n\tbool napi_prefer_busy_poll;\n\tbool napi_enabled;\n\tstruct hlist_head napi_ht[16];\n\tunsigned int evfd_last_cq_tail;\n\tshort unsigned int n_ring_pages;\n\tshort unsigned int n_sqe_pages;\n\tstruct page **ring_pages;\n\tstruct page **sqe_pages;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct io_uring {\n\tu32 head;\n\tu32 tail;\n};\n\nstruct io_rings {\n\tstruct io_uring sq;\n\tstruct io_uring cq;\n\tu32 sq_ring_mask;\n\tu32 cq_ring_mask;\n\tu32 sq_ring_entries;\n\tu32 cq_ring_entries;\n\tu32 sq_dropped;\n\tatomic_t sq_flags;\n\tu32 cq_flags;\n\tu32 cq_overflow;\n\tlong: 64;\n\tlong: 64;\n\tstruct io_uring_cqe cqes[0];\n};\n\nstruct io_rsrc_data {\n\tstruct io_ring_ctx *ctx;\n\tu64 **tags;\n\tunsigned int nr;\n\tu16 rsrc_type;\n\tbool quiesce;\n};\n\nstruct io_rsrc_put {\n\tu64 tag;\n\tunion {\n\t\tvoid *rsrc;\n\t\tstruct file *file;\n\t\tstruct io_mapped_ubuf *buf;\n\t};\n};\n\nstruct io_rsrc_node {\n\tstruct io_ring_ctx *ctx;\n\tint refs;\n\tbool empty;\n\tu16 type;\n\tstruct list_head node;\n\tstruct io_rsrc_put item;\n};\n\nstruct io_rsrc_update {\n\tstruct file *file;\n\tu64 arg;\n\tu32 nr_args;\n\tu32 offset;\n};\n\nstruct io_rw {\n\tstruct kiocb kiocb;\n\tu64 addr;\n\tu32 len;\n\trwf_t flags;\n};\n\nstruct io_shutdown {\n\tstruct file *file;\n\tint how;\n};\n\nstruct io_socket {\n\tstruct file *file;\n\tint domain;\n\tint type;\n\tint protocol;\n\tint flags;\n\tu32 file_slot;\n\tlong unsigned int nofile;\n};\n\nstruct io_splice {\n\tstruct file *file_out;\n\tloff_t off_out;\n\tloff_t off_in;\n\tu64 len;\n\tint splice_fd_in;\n\tunsigned int flags;\n};\n\nstruct io_sq_data {\n\trefcount_t refs;\n\tatomic_t park_pending;\n\tstruct mutex lock;\n\tstruct list_head ctx_list;\n\tstruct task_struct *thread;\n\tstruct wait_queue_head wait;\n\tunsigned int sq_thread_idle;\n\tint sq_cpu;\n\tpid_t task_pid;\n\tpid_t task_tgid;\n\tu64 work_time;\n\tlong unsigned int state;\n\tstruct completion exited;\n};\n\nstruct io_sqring_offsets {\n\t__u32 head;\n\t__u32 tail;\n\t__u32 ring_mask;\n\t__u32 ring_entries;\n\t__u32 flags;\n\t__u32 dropped;\n\t__u32 array;\n\t__u32 resv1;\n\t__u64 user_addr;\n};\n\nstruct user_msghdr;\n\nstruct io_sr_msg {\n\tstruct file *file;\n\tunion {\n\t\tstruct compat_msghdr *umsg_compat;\n\t\tstruct user_msghdr *umsg;\n\t\tvoid *buf;\n\t};\n\tint len;\n\tunsigned int done_io;\n\tunsigned int msg_flags;\n\tunsigned int nr_multishot_loops;\n\tu16 flags;\n\tu16 addr_len;\n\tu16 buf_group;\n\tvoid *addr;\n\tvoid *msg_control;\n\tstruct io_kiocb *notif;\n};\n\nstruct statx;\n\nstruct io_statx {\n\tstruct file *file;\n\tint dfd;\n\tunsigned int mask;\n\tunsigned int flags;\n\tstruct filename *filename;\n\tstruct statx *buffer;\n};\n\nstruct io_sync {\n\tstruct file *file;\n\tloff_t len;\n\tloff_t off;\n\tint flags;\n\tint mode;\n};\n\nstruct io_task_cancel {\n\tstruct task_struct *task;\n\tbool all;\n};\n\nstruct io_tctx_exit {\n\tstruct callback_head task_work;\n\tstruct completion completion;\n\tstruct io_ring_ctx *ctx;\n};\n\nstruct io_tctx_node {\n\tstruct list_head ctx_node;\n\tstruct task_struct *task;\n\tstruct io_ring_ctx *ctx;\n};\n\nstruct io_timeout {\n\tstruct file *file;\n\tu32 off;\n\tu32 target_seq;\n\tu32 repeats;\n\tstruct list_head list;\n\tstruct io_kiocb *head;\n\tstruct io_kiocb *prev;\n};\n\nstruct io_timeout_data {\n\tstruct io_kiocb *req;\n\tstruct hrtimer timer;\n\tstruct timespec64 ts;\n\tenum hrtimer_mode mode;\n\tu32 flags;\n};\n\nstruct io_timeout_rem {\n\tstruct file *file;\n\tu64 addr;\n\tstruct timespec64 ts;\n\tu32 flags;\n\tbool ltimeout;\n};\n\nstruct io_tlb_area {\n\tlong unsigned int used;\n\tunsigned int index;\n\tspinlock_t lock;\n};\n\nstruct io_tlb_slot;\n\nstruct io_tlb_pool {\n\tphys_addr_t start;\n\tphys_addr_t end;\n\tvoid *vaddr;\n\tlong unsigned int nslabs;\n\tbool late_alloc;\n\tunsigned int nareas;\n\tunsigned int area_nslabs;\n\tstruct io_tlb_area *areas;\n\tstruct io_tlb_slot *slots;\n\tstruct list_head node;\n\tstruct callback_head rcu;\n\tbool transient;\n};\n\nstruct io_tlb_mem {\n\tstruct io_tlb_pool defpool;\n\tlong unsigned int nslabs;\n\tstruct dentry *debugfs;\n\tbool force_bounce;\n\tbool for_alloc;\n\tbool can_grow;\n\tu64 phys_limit;\n\tspinlock_t lock;\n\tstruct list_head pools;\n\tstruct work_struct dyn_alloc;\n\tatomic_long_t total_used;\n\tatomic_long_t used_hiwater;\n\tatomic_long_t transient_nslabs;\n};\n\nstruct io_tlb_slot {\n\tphys_addr_t orig_addr;\n\tsize_t alloc_size;\n\tshort unsigned int list;\n\tshort unsigned int pad_slots;\n};\n\nstruct io_tw_state {};\n\nstruct io_unlink {\n\tstruct file *file;\n\tint dfd;\n\tint flags;\n\tstruct filename *filename;\n};\n\nstruct io_uring_buf {\n\t__u64 addr;\n\t__u32 len;\n\t__u16 bid;\n\t__u16 resv;\n};\n\nstruct io_uring_buf_reg {\n\t__u64 ring_addr;\n\t__u32 ring_entries;\n\t__u16 bgid;\n\t__u16 flags;\n\t__u64 resv[3];\n};\n\nstruct io_uring_buf_ring {\n\tunion {\n\t\tstruct {\n\t\t\t__u64 resv1;\n\t\t\t__u32 resv2;\n\t\t\t__u16 resv3;\n\t\t\t__u16 tail;\n\t\t};\n\t\tstruct {\n\t\t\tstruct {} __empty_bufs;\n\t\t\tstruct io_uring_buf bufs[0];\n\t\t};\n\t};\n};\n\nstruct io_uring_buf_status {\n\t__u32 buf_group;\n\t__u32 head;\n\t__u32 resv[8];\n};\n\nstruct io_uring_cmd {\n\tstruct file *file;\n\tconst struct io_uring_sqe *sqe;\n\tvoid (*task_work_cb)(struct io_uring_cmd *, unsigned int);\n\tu32 cmd_op;\n\tu32 flags;\n\tu8 pdu[32];\n};\n\nstruct io_uring_file_index_range {\n\t__u32 off;\n\t__u32 len;\n\t__u64 resv;\n};\n\nstruct io_uring_getevents_arg {\n\t__u64 sigmask;\n\t__u32 sigmask_sz;\n\t__u32 pad;\n\t__u64 ts;\n};\n\nstruct io_uring_napi {\n\t__u32 busy_poll_to;\n\t__u8 prefer_busy_poll;\n\t__u8 pad[3];\n\t__u64 resv;\n};\n\nstruct io_uring_params {\n\t__u32 sq_entries;\n\t__u32 cq_entries;\n\t__u32 flags;\n\t__u32 sq_thread_cpu;\n\t__u32 sq_thread_idle;\n\t__u32 features;\n\t__u32 wq_fd;\n\t__u32 resv[3];\n\tstruct io_sqring_offsets sq_off;\n\tstruct io_cqring_offsets cq_off;\n};\n\nstruct io_uring_probe_op {\n\t__u8 op;\n\t__u8 resv;\n\t__u16 flags;\n\t__u32 resv2;\n};\n\nstruct io_uring_probe {\n\t__u8 last_op;\n\t__u8 ops_len;\n\t__u16 resv;\n\t__u32 resv2[3];\n\tstruct io_uring_probe_op ops[0];\n};\n\nstruct io_uring_restriction {\n\t__u16 opcode;\n\tunion {\n\t\t__u8 register_op;\n\t\t__u8 sqe_op;\n\t\t__u8 sqe_flags;\n\t};\n\t__u8 resv;\n\t__u32 resv2[3];\n};\n\nstruct io_uring_rsrc_register {\n\t__u32 nr;\n\t__u32 flags;\n\t__u64 resv2;\n\t__u64 data;\n\t__u64 tags;\n};\n\nstruct io_uring_rsrc_update {\n\t__u32 offset;\n\t__u32 resv;\n\t__u64 data;\n};\n\nstruct io_uring_rsrc_update2 {\n\t__u32 offset;\n\t__u32 resv;\n\t__u64 data;\n\t__u64 tags;\n\t__u32 nr;\n\t__u32 resv2;\n};\n\nstruct io_uring_sqe {\n\t__u8 opcode;\n\t__u8 flags;\n\t__u16 ioprio;\n\t__s32 fd;\n\tunion {\n\t\t__u64 off;\n\t\t__u64 addr2;\n\t\tstruct {\n\t\t\t__u32 cmd_op;\n\t\t\t__u32 __pad1;\n\t\t};\n\t};\n\tunion {\n\t\t__u64 addr;\n\t\t__u64 splice_off_in;\n\t\tstruct {\n\t\t\t__u32 level;\n\t\t\t__u32 optname;\n\t\t};\n\t};\n\t__u32 len;\n\tunion {\n\t\t__kernel_rwf_t rw_flags;\n\t\t__u32 fsync_flags;\n\t\t__u16 poll_events;\n\t\t__u32 poll32_events;\n\t\t__u32 sync_range_flags;\n\t\t__u32 msg_flags;\n\t\t__u32 timeout_flags;\n\t\t__u32 accept_flags;\n\t\t__u32 cancel_flags;\n\t\t__u32 open_flags;\n\t\t__u32 statx_flags;\n\t\t__u32 fadvise_advice;\n\t\t__u32 splice_flags;\n\t\t__u32 rename_flags;\n\t\t__u32 unlink_flags;\n\t\t__u32 hardlink_flags;\n\t\t__u32 xattr_flags;\n\t\t__u32 msg_ring_flags;\n\t\t__u32 uring_cmd_flags;\n\t\t__u32 waitid_flags;\n\t\t__u32 futex_flags;\n\t\t__u32 install_fd_flags;\n\t\t__u32 nop_flags;\n\t};\n\t__u64 user_data;\n\tunion {\n\t\t__u16 buf_index;\n\t\t__u16 buf_group;\n\t};\n\t__u16 personality;\n\tunion {\n\t\t__s32 splice_fd_in;\n\t\t__u32 file_index;\n\t\t__u32 optlen;\n\t\tstruct {\n\t\t\t__u16 addr_len;\n\t\t\t__u16 __pad3[1];\n\t\t};\n\t};\n\tunion {\n\t\tstruct {\n\t\t\t__u64 addr3;\n\t\t\t__u64 __pad2[1];\n\t\t};\n\t\t__u64 optval;\n\t\t__u8 cmd[0];\n\t};\n};\n\nstruct io_uring_sync_cancel_reg {\n\t__u64 addr;\n\t__s32 fd;\n\t__u32 flags;\n\tstruct __kernel_timespec timeout;\n\t__u8 opcode;\n\t__u8 pad[7];\n\t__u64 pad2[3];\n};\n\nstruct io_wq;\n\nstruct io_uring_task {\n\tint cached_refs;\n\tconst struct io_ring_ctx *last;\n\tstruct io_wq *io_wq;\n\tstruct file *registered_rings[16];\n\tstruct xarray xa;\n\tstruct wait_queue_head wait;\n\tatomic_t in_cancel;\n\tatomic_t inflight_tracked;\n\tstruct percpu_counter inflight;\n\tlong: 64;\n\tlong: 64;\n\tstruct {\n\t\tstruct llist_head task_list;\n\t\tstruct callback_head task_work;\n\t\tlong: 64;\n\t\tlong: 64;\n\t\tlong: 64;\n\t\tlong: 64;\n\t\tlong: 64;\n\t};\n};\n\nstruct io_wait_queue {\n\tstruct wait_queue_entry wq;\n\tstruct io_ring_ctx *ctx;\n\tunsigned int cq_tail;\n\tunsigned int nr_timeouts;\n\tktime_t timeout;\n\tktime_t napi_busy_poll_dt;\n\tbool napi_prefer_busy_poll;\n};\n\nstruct waitid_info {\n\tpid_t pid;\n\tuid_t uid;\n\tint status;\n\tint cause;\n};\n\nstruct io_waitid {\n\tstruct file *file;\n\tint which;\n\tpid_t upid;\n\tint options;\n\tatomic_t refs;\n\tstruct wait_queue_head *head;\n\tstruct siginfo *infop;\n\tstruct waitid_info info;\n};\n\nstruct rusage;\n\nstruct wait_opts {\n\tenum pid_type wo_type;\n\tint wo_flags;\n\tstruct pid *wo_pid;\n\tstruct waitid_info *wo_info;\n\tint wo_stat;\n\tstruct rusage *wo_rusage;\n\twait_queue_entry_t child_wait;\n\tint notask_error;\n};\n\nstruct io_waitid_async {\n\tstruct io_kiocb *req;\n\tstruct wait_opts wo;\n};\n\nstruct io_worker {\n\trefcount_t ref;\n\tint create_index;\n\tlong unsigned int flags;\n\tstruct hlist_nulls_node nulls_node;\n\tstruct list_head all_list;\n\tstruct task_struct *task;\n\tstruct io_wq *wq;\n\tstruct io_wq_work *cur_work;\n\traw_spinlock_t lock;\n\tstruct completion ref_done;\n\tlong unsigned int create_state;\n\tstruct callback_head create_work;\n\tint init_retries;\n\tunion {\n\t\tstruct callback_head rcu;\n\t\tstruct work_struct work;\n\t};\n};\n\ntypedef struct io_wq_work *free_work_fn(struct io_wq_work *);\n\ntypedef void io_wq_work_fn(struct io_wq_work *);\n\nstruct io_wq_acct {\n\tunsigned int nr_workers;\n\tunsigned int max_workers;\n\tint index;\n\tatomic_t nr_running;\n\traw_spinlock_t lock;\n\tstruct io_wq_work_list work_list;\n\tlong unsigned int flags;\n};\n\nstruct io_wq {\n\tlong unsigned int state;\n\tfree_work_fn *free_work;\n\tio_wq_work_fn *do_work;\n\tstruct io_wq_hash *hash;\n\tatomic_t worker_refs;\n\tstruct completion worker_done;\n\tstruct hlist_node cpuhp_node;\n\tstruct task_struct *task;\n\tstruct io_wq_acct acct[2];\n\traw_spinlock_t lock;\n\tstruct hlist_nulls_head free_list;\n\tstruct list_head all_list;\n\tstruct wait_queue_entry wait;\n\tstruct io_wq_work *hash_tail[64];\n\tcpumask_var_t cpu_mask;\n};\n\nstruct io_wq_data {\n\tstruct io_wq_hash *hash;\n\tstruct task_struct *task;\n\tio_wq_work_fn *do_work;\n\tfree_work_fn *free_work;\n};\n\nstruct io_wq_hash {\n\trefcount_t refs;\n\tlong unsigned int map;\n\tstruct wait_queue_head wait;\n};\n\nstruct xattr_name;\n\nstruct xattr_ctx {\n\tunion {\n\t\tconst void *cvalue;\n\t\tvoid *value;\n\t};\n\tvoid *kvalue;\n\tsize_t size;\n\tstruct xattr_name *kname;\n\tunsigned int flags;\n};\n\nstruct io_xattr {\n\tstruct file *file;\n\tstruct xattr_ctx ctx;\n\tstruct filename *filename;\n};\n\nstruct ioam6_hdr {\n\t__u8 opt_type;\n\t__u8 opt_len;\n\tchar: 8;\n\t__u8 type;\n};\n\nstruct ioam6_lwt_freq {\n\tu32 k;\n\tu32 n;\n};\n\nstruct ipv6_opt_hdr {\n\t__u8 nexthdr;\n\t__u8 hdrlen;\n};\n\nstruct ioam6_trace_hdr {\n\t__be16 namespace_id;\n\tchar: 2;\n\t__u8 overflow: 1;\n\t__u8 nodelen: 5;\n\t__u8 remlen: 7;\n\tunion {\n\t\t__be32 type_be32;\n\t\tstruct {\n\t\t\t__u32 bit7: 1;\n\t\t\t__u32 bit6: 1;\n\t\t\t__u32 bit5: 1;\n\t\t\t__u32 bit4: 1;\n\t\t\t__u32 bit3: 1;\n\t\t\t__u32 bit2: 1;\n\t\t\t__u32 bit1: 1;\n\t\t\t__u32 bit0: 1;\n\t\t\t__u32 bit15: 1;\n\t\t\t__u32 bit14: 1;\n\t\t\t__u32 bit13: 1;\n\t\t\t__u32 bit12: 1;\n\t\t\t__u32 bit11: 1;\n\t\t\t__u32 bit10: 1;\n\t\t\t__u32 bit9: 1;\n\t\t\t__u32 bit8: 1;\n\t\t\t__u32 bit23: 1;\n\t\t\t__u32 bit22: 1;\n\t\t\t__u32 bit21: 1;\n\t\t\t__u32 bit20: 1;\n\t\t\t__u32 bit19: 1;\n\t\t\t__u32 bit18: 1;\n\t\t\t__u32 bit17: 1;\n\t\t\t__u32 bit16: 1;\n\t\t} type;\n\t};\n\t__u8 data[0];\n};\n\nstruct ioam6_lwt_encap {\n\tstruct ipv6_opt_hdr eh;\n\tu8 pad[2];\n\tstruct ioam6_hdr ioamh;\n\tstruct ioam6_trace_hdr traceh;\n};\n\nstruct ioam6_lwt {\n\tstruct dst_cache cache;\n\tstruct ioam6_lwt_freq freq;\n\tatomic_t pkt_cnt;\n\tu8 mode;\n\tstruct in6_addr tundst;\n\tstruct ioam6_lwt_encap tuninfo;\n};\n\nstruct ioam6_schema;\n\nstruct ioam6_namespace {\n\tstruct rhash_head head;\n\tstruct callback_head rcu;\n\tstruct ioam6_schema *schema;\n\t__be16 id;\n\t__be32 data;\n\t__be64 data_wide;\n};\n\nstruct ioam6_pernet_data {\n\tstruct mutex lock;\n\tstruct rhashtable namespaces;\n\tstruct rhashtable schemas;\n};\n\nstruct ioam6_schema {\n\tstruct rhash_head head;\n\tstruct callback_head rcu;\n\tstruct ioam6_namespace *ns;\n\tu32 id;\n\tint len;\n\t__be32 hdr;\n\tu8 data[0];\n};\n\nstruct mpc_ioapic {\n\tunsigned char type;\n\tunsigned char apicid;\n\tunsigned char apicver;\n\tunsigned char flags;\n\tunsigned int apicaddr;\n};\n\nstruct mp_ioapic_gsi {\n\tu32 gsi_base;\n\tu32 gsi_end;\n};\n\nstruct ioapic_domain_cfg {\n\tenum ioapic_domain_type type;\n\tconst struct irq_domain_ops *ops;\n\tstruct device_node *dev;\n};\n\nstruct ioapic {\n\tint nr_registers;\n\tstruct IO_APIC_route_entry *saved_registers;\n\tstruct mpc_ioapic mp_config;\n\tstruct mp_ioapic_gsi gsi_config;\n\tstruct ioapic_domain_cfg irqdomain_cfg;\n\tstruct irq_domain *irqdomain;\n\tstruct resource *iomem_res;\n};\n\nstruct ioapic_scope {\n\tstruct intel_iommu *iommu;\n\tunsigned int id;\n\tunsigned int bus;\n\tunsigned int devfn;\n};\n\nstruct rq_qos_ops;\n\nstruct rq_qos {\n\tconst struct rq_qos_ops *ops;\n\tstruct gendisk *disk;\n\tenum rq_qos_id id;\n\tstruct rq_qos *next;\n\tstruct dentry *debugfs_dir;\n};\n\nstruct ioc_params {\n\tu32 qos[6];\n\tu64 i_lcoefs[6];\n\tu64 lcoefs[6];\n\tu32 too_fast_vrate_pct;\n\tu32 too_slow_vrate_pct;\n};\n\nstruct ioc_margins {\n\ts64 min;\n\ts64 low;\n\ts64 target;\n};\n\nstruct ioc_pcpu_stat;\n\nstruct ioc {\n\tstruct rq_qos rqos;\n\tbool enabled;\n\tstruct ioc_params params;\n\tstruct ioc_margins margins;\n\tu32 period_us;\n\tu32 timer_slack_ns;\n\tu64 vrate_min;\n\tu64 vrate_max;\n\tspinlock_t lock;\n\tstruct timer_list timer;\n\tstruct list_head active_iocgs;\n\tstruct ioc_pcpu_stat *pcpu_stat;\n\tenum ioc_running running;\n\tatomic64_t vtime_rate;\n\tu64 vtime_base_rate;\n\ts64 vtime_err;\n\tseqcount_spinlock_t period_seqcount;\n\tu64 period_at;\n\tu64 period_at_vtime;\n\tatomic64_t cur_period;\n\tint busy_level;\n\tbool weights_updated;\n\tatomic_t hweight_gen;\n\tu64 dfgv_period_at;\n\tu64 dfgv_period_rem;\n\tu64 dfgv_usage_us_sum;\n\tu64 autop_too_fast_at;\n\tu64 autop_too_slow_at;\n\tint autop_idx;\n\tbool user_qos_params: 1;\n\tbool user_cost_model: 1;\n};\n\nstruct ioc_cgrp {\n\tstruct blkcg_policy_data cpd;\n\tunsigned int dfl_weight;\n};\n\nstruct iocg_stat {\n\tu64 usage_us;\n\tu64 wait_us;\n\tu64 indebt_us;\n\tu64 indelay_us;\n};\n\nstruct iocg_pcpu_stat;\n\nstruct ioc_gq {\n\tstruct blkg_policy_data pd;\n\tstruct ioc *ioc;\n\tu32 cfg_weight;\n\tu32 weight;\n\tu32 active;\n\tu32 inuse;\n\tu32 last_inuse;\n\ts64 saved_margin;\n\tsector_t cursor;\n\tatomic64_t vtime;\n\tatomic64_t done_vtime;\n\tu64 abs_vdebt;\n\tu64 delay;\n\tu64 delay_at;\n\tatomic64_t active_period;\n\tstruct list_head active_list;\n\tu64 child_active_sum;\n\tu64 child_inuse_sum;\n\tu64 child_adjusted_sum;\n\tint hweight_gen;\n\tu32 hweight_active;\n\tu32 hweight_inuse;\n\tu32 hweight_donating;\n\tu32 hweight_after_donation;\n\tstruct list_head walk_list;\n\tstruct list_head surplus_list;\n\tstruct wait_queue_head waitq;\n\tstruct hrtimer waitq_timer;\n\tu64 activated_at;\n\tstruct iocg_pcpu_stat *pcpu_stat;\n\tstruct iocg_stat stat;\n\tstruct iocg_stat last_stat;\n\tu64 last_stat_abs_vusage;\n\tu64 usage_delta_us;\n\tu64 wait_since;\n\tu64 indebt_since;\n\tu64 indelay_since;\n\tint level;\n\tstruct ioc_gq *ancestors[0];\n};\n\nstruct ioc_missed {\n\tlocal_t nr_met;\n\tlocal_t nr_missed;\n\tu32 last_met;\n\tu32 last_missed;\n};\n\nstruct ioc_now {\n\tu64 now_ns;\n\tu64 now;\n\tu64 vnow;\n};\n\nstruct ioc_pcpu_stat {\n\tstruct ioc_missed missed[2];\n\tlocal64_t rq_wait_ns;\n\tu64 last_rq_wait_ns;\n};\n\nstruct iocb {\n\t__u64 aio_data;\n\t__u32 aio_key;\n\t__kernel_rwf_t aio_rw_flags;\n\t__u16 aio_lio_opcode;\n\t__s16 aio_reqprio;\n\t__u32 aio_fildes;\n\t__u64 aio_buf;\n\t__u64 aio_nbytes;\n\t__s64 aio_offset;\n\t__u64 aio_reserved2;\n\t__u32 aio_flags;\n\t__u32 aio_resfd;\n};\n\nstruct iocg_pcpu_stat {\n\tlocal64_t abs_vusage;\n};\n\nstruct iocg_wait {\n\tstruct wait_queue_entry wait;\n\tstruct bio *bio;\n\tu64 abs_cost;\n\tbool committed;\n};\n\nstruct iocg_wake_ctx {\n\tstruct ioc_gq *iocg;\n\tu32 hw_inuse;\n\ts64 vbudget;\n};\n\nstruct iomap_folio_ops;\n\nstruct iomap {\n\tu64 addr;\n\tloff_t offset;\n\tu64 length;\n\tu16 type;\n\tu16 flags;\n\tstruct block_device *bdev;\n\tstruct dax_device *dax_dev;\n\tvoid *inline_data;\n\tvoid *private;\n\tconst struct iomap_folio_ops *folio_ops;\n\tu64 validity_cookie;\n};\n\nstruct iomap_dio_ops;\n\nstruct iomap_dio {\n\tstruct kiocb *iocb;\n\tconst struct iomap_dio_ops *dops;\n\tloff_t i_size;\n\tloff_t size;\n\tatomic_t ref;\n\tunsigned int flags;\n\tint error;\n\tsize_t done_before;\n\tbool wait_for_completion;\n\tunion {\n\t\tstruct {\n\t\t\tstruct iov_iter *iter;\n\t\t\tstruct task_struct *waiter;\n\t\t} submit;\n\t\tstruct {\n\t\t\tstruct work_struct work;\n\t\t} aio;\n\t};\n};\n\nstruct iomap_iter;\n\nstruct iomap_dio_ops {\n\tint (*end_io)(struct kiocb *, ssize_t, int, unsigned int);\n\tvoid (*submit_io)(const struct iomap_iter *, struct bio *, loff_t);\n\tstruct bio_set *bio_set;\n};\n\nstruct iomap_folio_ops {\n\tstruct folio * (*get_folio)(struct iomap_iter *, loff_t, unsigned int);\n\tvoid (*put_folio)(struct inode *, loff_t, unsigned int, struct folio *);\n\tbool (*iomap_valid)(struct inode *, const struct iomap *);\n};\n\nstruct iomap_folio_state {\n\tspinlock_t state_lock;\n\tunsigned int read_bytes_pending;\n\tatomic_t write_bytes_pending;\n\tlong unsigned int state[0];\n};\n\nstruct iomap_ioend {\n\tstruct list_head io_list;\n\tu16 io_type;\n\tu16 io_flags;\n\tstruct inode *io_inode;\n\tsize_t io_size;\n\tloff_t io_offset;\n\tsector_t io_sector;\n\tstruct bio io_bio;\n};\n\nstruct iomap_iter {\n\tstruct inode *inode;\n\tloff_t pos;\n\tu64 len;\n\ts64 processed;\n\tunsigned int flags;\n\tstruct iomap iomap;\n\tstruct iomap srcmap;\n\tvoid *private;\n};\n\nstruct iomap_ops {\n\tint (*iomap_begin)(struct inode *, loff_t, loff_t, unsigned int, struct iomap *, struct iomap *);\n\tint (*iomap_end)(struct inode *, loff_t, loff_t, ssize_t, unsigned int, struct iomap *);\n};\n\nstruct iomap_readpage_ctx {\n\tstruct folio *cur_folio;\n\tbool cur_folio_in_bio;\n\tstruct bio *bio;\n\tstruct readahead_control *rac;\n};\n\nstruct iomap_swapfile_info {\n\tstruct iomap iomap;\n\tstruct swap_info_struct *sis;\n\tuint64_t lowest_ppage;\n\tuint64_t highest_ppage;\n\tlong unsigned int nr_pages;\n\tint nr_extents;\n\tstruct file *file;\n};\n\nstruct iomap_writepage_ctx;\n\nstruct iomap_writeback_ops {\n\tint (*map_blocks)(struct iomap_writepage_ctx *, struct inode *, loff_t, unsigned int);\n\tint (*prepare_ioend)(struct iomap_ioend *, int);\n\tvoid (*discard_folio)(struct folio *, loff_t);\n};\n\nstruct iomap_writepage_ctx {\n\tstruct iomap iomap;\n\tstruct iomap_ioend *ioend;\n\tconst struct iomap_writeback_ops *ops;\n\tu32 nr_folios;\n};\n\nstruct iommu_attach_handle {\n\tstruct iommu_domain *domain;\n};\n\nstruct iommu_cmd {\n\tu32 data[4];\n};\n\nstruct protection_domain;\n\nstruct iommu_dev_data {\n\tspinlock_t lock;\n\tstruct list_head list;\n\tstruct llist_node dev_data_list;\n\tstruct protection_domain *domain;\n\tstruct gcr3_tbl_info gcr3_info;\n\tstruct device *dev;\n\tu16 devid;\n\tu32 max_pasids;\n\tu32 flags;\n\tint ats_qdep;\n\tu8 ats_enabled: 1;\n\tu8 pri_enabled: 1;\n\tu8 pasid_enabled: 1;\n\tu8 pri_tlp: 1;\n\tu8 ppr: 1;\n\tbool use_vapic;\n\tbool defer_attach;\n\tstruct ratelimit_state rs;\n};\n\nstruct iova_bitmap;\n\nstruct iommu_dirty_bitmap {\n\tstruct iova_bitmap *bitmap;\n\tstruct iommu_iotlb_gather *gather;\n};\n\nstruct iommu_dirty_ops {\n\tint (*set_dirty_tracking)(struct iommu_domain *, bool);\n\tint (*read_and_clear_dirty)(struct iommu_domain *, long unsigned int, size_t, long unsigned int, struct iommu_dirty_bitmap *);\n};\n\nstruct iova {\n\tstruct rb_node node;\n\tlong unsigned int pfn_hi;\n\tlong unsigned int pfn_lo;\n};\n\nstruct iova_rcache;\n\nstruct iova_domain {\n\tspinlock_t iova_rbtree_lock;\n\tstruct rb_root rbroot;\n\tstruct rb_node *cached_node;\n\tstruct rb_node *cached32_node;\n\tlong unsigned int granule;\n\tlong unsigned int start_pfn;\n\tlong unsigned int dma_32bit_pfn;\n\tlong unsigned int max32_alloc_size;\n\tstruct iova anchor;\n\tstruct iova_rcache *rcaches;\n\tstruct hlist_node cpuhp_dead;\n};\n\nstruct iommu_dma_options {\n\tenum iommu_dma_queue_type qt;\n\tsize_t fq_size;\n\tunsigned int fq_timeout;\n};\n\nstruct iova_fq;\n\nstruct iommu_dma_cookie {\n\tenum iommu_dma_cookie_type type;\n\tunion {\n\t\tstruct {\n\t\t\tstruct iova_domain iovad;\n\t\t\tunion {\n\t\t\t\tstruct iova_fq *single_fq;\n\t\t\t\tstruct iova_fq *percpu_fq;\n\t\t\t};\n\t\t\tatomic64_t fq_flush_start_cnt;\n\t\t\tatomic64_t fq_flush_finish_cnt;\n\t\t\tstruct timer_list fq_timer;\n\t\t\tatomic_t fq_timer_on;\n\t\t};\n\t\tdma_addr_t msi_iova;\n\t};\n\tstruct list_head msi_page_list;\n\tstruct iommu_domain *fq_domain;\n\tstruct iommu_dma_options options;\n\tstruct mutex mutex;\n};\n\nstruct iommu_dma_msi_page {\n\tstruct list_head list;\n\tdma_addr_t iova;\n\tphys_addr_t phys;\n};\n\nstruct iommu_domain_info {\n\tstruct intel_iommu *iommu;\n\tunsigned int refcnt;\n\tu16 did;\n};\n\nstruct iommu_user_data_array;\n\nstruct iommu_domain_ops {\n\tint (*attach_dev)(struct iommu_domain *, struct device *);\n\tint (*set_dev_pasid)(struct iommu_domain *, struct device *, ioasid_t);\n\tint (*map_pages)(struct iommu_domain *, long unsigned int, phys_addr_t, size_t, size_t, int, gfp_t, size_t *);\n\tsize_t (*unmap_pages)(struct iommu_domain *, long unsigned int, size_t, size_t, struct iommu_iotlb_gather *);\n\tvoid (*flush_iotlb_all)(struct iommu_domain *);\n\tint (*iotlb_sync_map)(struct iommu_domain *, long unsigned int, size_t);\n\tvoid (*iotlb_sync)(struct iommu_domain *, struct iommu_iotlb_gather *);\n\tint (*cache_invalidate_user)(struct iommu_domain *, struct iommu_user_data_array *);\n\tphys_addr_t (*iova_to_phys)(struct iommu_domain *, dma_addr_t);\n\tbool (*enforce_cache_coherency)(struct iommu_domain *);\n\tint (*enable_nesting)(struct iommu_domain *);\n\tint (*set_pgtable_quirks)(struct iommu_domain *, long unsigned int);\n\tvoid (*free)(struct iommu_domain *);\n};\n\nstruct iommu_fault_page_request {\n\tu32 flags;\n\tu32 pasid;\n\tu32 grpid;\n\tu32 perm;\n\tu64 addr;\n\tu64 private_data[2];\n};\n\nstruct iommu_fault {\n\tu32 type;\n\tstruct iommu_fault_page_request prm;\n};\n\nstruct iommu_fault_param {\n\tstruct mutex lock;\n\trefcount_t users;\n\tstruct callback_head rcu;\n\tstruct device *dev;\n\tstruct iopf_queue *queue;\n\tstruct list_head queue_list;\n\tstruct list_head partial;\n\tstruct list_head faults;\n};\n\nstruct iommu_flush_ops {\n\tvoid (*tlb_flush_all)(void *);\n\tvoid (*tlb_flush_walk)(long unsigned int, size_t, size_t, void *);\n\tvoid (*tlb_add_page)(struct iommu_iotlb_gather *, long unsigned int, size_t, void *);\n};\n\nstruct iommu_fwspec {\n\tstruct fwnode_handle *iommu_fwnode;\n\tu32 flags;\n\tunsigned int num_ids;\n\tu32 ids[0];\n};\n\nstruct iommu_group {\n\tstruct kobject kobj;\n\tstruct kobject *devices_kobj;\n\tstruct list_head devices;\n\tstruct xarray pasid_array;\n\tstruct mutex mutex;\n\tvoid *iommu_data;\n\tvoid (*iommu_data_release)(void *);\n\tchar *name;\n\tint id;\n\tstruct iommu_domain *default_domain;\n\tstruct iommu_domain *blocking_domain;\n\tstruct iommu_domain *domain;\n\tstruct list_head entry;\n\tunsigned int owner_cnt;\n\tvoid *owner;\n};\n\nstruct iommu_group_attribute {\n\tstruct attribute attr;\n\tssize_t (*show)(struct iommu_group *, char *);\n\tssize_t (*store)(struct iommu_group *, const char *, size_t);\n};\n\nstruct iommu_hw_info_vtd {\n\t__u32 flags;\n\t__u32 __reserved;\n\t__u64 cap_reg;\n\t__u64 ecap_reg;\n};\n\nstruct iommu_hwpt_vtd_s1_invalidate {\n\t__u64 addr;\n\t__u64 npages;\n\t__u32 flags;\n\t__u32 __reserved;\n};\n\nstruct iommu_iotlb_gather {\n\tlong unsigned int start;\n\tlong unsigned int end;\n\tsize_t pgsize;\n\tstruct list_head freelist;\n\tbool queued;\n};\n\nstruct iommu_mm_data {\n\tu32 pasid;\n\tstruct list_head sva_domains;\n};\n\nstruct iommu_user_data;\n\nstruct iopf_fault;\n\nstruct iommu_page_response;\n\nstruct iommu_ops {\n\tbool (*capable)(struct device *, enum iommu_cap);\n\tvoid * (*hw_info)(struct device *, u32 *, u32 *);\n\tstruct iommu_domain * (*domain_alloc)(unsigned int);\n\tstruct iommu_domain * (*domain_alloc_user)(struct device *, u32, struct iommu_domain *, const struct iommu_user_data *);\n\tstruct iommu_domain * (*domain_alloc_paging)(struct device *);\n\tstruct iommu_domain * (*domain_alloc_sva)(struct device *, struct mm_struct *);\n\tstruct iommu_device * (*probe_device)(struct device *);\n\tvoid (*release_device)(struct device *);\n\tvoid (*probe_finalize)(struct device *);\n\tstruct iommu_group * (*device_group)(struct device *);\n\tvoid (*get_resv_regions)(struct device *, struct list_head *);\n\tint (*of_xlate)(struct device *, const struct of_phandle_args *);\n\tbool (*is_attach_deferred)(struct device *);\n\tint (*dev_enable_feat)(struct device *, enum iommu_dev_features);\n\tint (*dev_disable_feat)(struct device *, enum iommu_dev_features);\n\tvoid (*page_response)(struct device *, struct iopf_fault *, struct iommu_page_response *);\n\tint (*def_domain_type)(struct device *);\n\tvoid (*remove_dev_pasid)(struct device *, ioasid_t, struct iommu_domain *);\n\tconst struct iommu_domain_ops *default_domain_ops;\n\tlong unsigned int pgsize_bitmap;\n\tstruct module *owner;\n\tstruct iommu_domain *identity_domain;\n\tstruct iommu_domain *blocked_domain;\n\tstruct iommu_domain *release_domain;\n\tstruct iommu_domain *default_domain;\n\tu8 user_pasid_table: 1;\n};\n\nstruct iommu_page_response {\n\tu32 pasid;\n\tu32 grpid;\n\tu32 code;\n};\n\nstruct iommu_pmu {\n\tstruct intel_iommu *iommu;\n\tu32 num_cntr;\n\tu32 num_eg;\n\tu32 cntr_width;\n\tu32 cntr_stride;\n\tu32 filter;\n\tvoid *base;\n\tvoid *cfg_reg;\n\tvoid *cntr_reg;\n\tvoid *overflow;\n\tu64 *evcap;\n\tu32 **cntr_evcap;\n\tstruct pmu pmu;\n\tlong unsigned int used_mask[1];\n\tstruct perf_event *event_list[64];\n\tunsigned char irq_name[16];\n\tstruct hlist_node cpuhp_node;\n\tint cpu;\n};\n\nstruct iommu_resv_region {\n\tstruct list_head list;\n\tphys_addr_t start;\n\tsize_t length;\n\tint prot;\n\tenum iommu_resv_type type;\n\tvoid (*free)(struct device *, struct iommu_resv_region *);\n};\n\nstruct iommu_sva {\n\tstruct iommu_attach_handle handle;\n\tstruct device *dev;\n\trefcount_t users;\n};\n\nstruct iommu_user_data {\n\tunsigned int type;\n\tvoid *uptr;\n\tsize_t len;\n};\n\nstruct iommu_user_data_array {\n\tunsigned int type;\n\tvoid *uptr;\n\tsize_t entry_len;\n\tu32 entry_num;\n};\n\nstruct iopf_fault {\n\tstruct iommu_fault fault;\n\tstruct list_head list;\n};\n\nstruct iopf_group {\n\tstruct iopf_fault last_fault;\n\tstruct list_head faults;\n\tsize_t fault_count;\n\tstruct list_head pending_node;\n\tstruct work_struct work;\n\tstruct iommu_attach_handle *attach_handle;\n\tstruct iommu_fault_param *fault_param;\n\tstruct list_head node;\n\tu32 cookie;\n};\n\nstruct iopf_queue {\n\tstruct workqueue_struct *wq;\n\tstruct list_head devices;\n\tstruct mutex lock;\n};\n\nstruct ioprio_blkcg {\n\tstruct blkcg_policy_data cpd;\n\tenum prio_policy prio_policy;\n};\n\nstruct ioprio_blkg {\n\tstruct blkg_policy_data pd;\n};\n\nstruct ioremap_desc {\n\tunsigned int flags;\n};\n\nstruct iova_bitmap_map {\n\tlong unsigned int iova;\n\tlong unsigned int length;\n\tlong unsigned int pgshift;\n\tlong unsigned int pgoff;\n\tlong unsigned int npages;\n\tstruct page **pages;\n};\n\nstruct iova_bitmap {\n\tstruct iova_bitmap_map mapped;\n\tu8 *bitmap;\n\tlong unsigned int mapped_base_index;\n\tlong unsigned int mapped_total_index;\n\tlong unsigned int iova;\n\tsize_t length;\n};\n\nstruct iova_magazine;\n\nstruct iova_cpu_rcache {\n\tspinlock_t lock;\n\tstruct iova_magazine *loaded;\n\tstruct iova_magazine *prev;\n};\n\nstruct iova_fq_entry {\n\tlong unsigned int iova_pfn;\n\tlong unsigned int pages;\n\tstruct list_head freelist;\n\tu64 counter;\n};\n\nstruct iova_fq {\n\tspinlock_t lock;\n\tunsigned int head;\n\tunsigned int tail;\n\tunsigned int mod_mask;\n\tstruct iova_fq_entry entries[0];\n};\n\nstruct iova_magazine {\n\tunion {\n\t\tlong unsigned int size;\n\t\tstruct iova_magazine *next;\n\t};\n\tlong unsigned int pfns[127];\n};\n\nstruct iova_rcache {\n\tspinlock_t lock;\n\tunsigned int depot_size;\n\tstruct iova_magazine *depot;\n\tstruct iova_cpu_rcache *cpu_rcaches;\n\tstruct iova_domain *iovad;\n\tstruct delayed_work work;\n};\n\nstruct ip6_flowlabel {\n\tstruct ip6_flowlabel *next;\n\t__be32 label;\n\tatomic_t users;\n\tstruct in6_addr dst;\n\tstruct ipv6_txoptions *opt;\n\tlong unsigned int linger;\n\tstruct callback_head rcu;\n\tu8 share;\n\tunion {\n\t\tstruct pid *pid;\n\t\tkuid_t uid;\n\t} owner;\n\tlong unsigned int lastuse;\n\tlong unsigned int expires;\n\tstruct net *fl_net;\n};\n\nstruct ip6_frag_state {\n\tu8 *prevhdr;\n\tunsigned int hlen;\n\tunsigned int mtu;\n\tunsigned int left;\n\tint offset;\n\tint ptr;\n\tint hroom;\n\tint troom;\n\t__be32 frag_id;\n\tu8 nexthdr;\n};\n\nstruct ipv6hdr;\n\nstruct ip6_fraglist_iter {\n\tstruct ipv6hdr *tmp_hdr;\n\tstruct sk_buff *frag;\n\tint offset;\n\tunsigned int hlen;\n\t__be32 frag_id;\n\tu8 nexthdr;\n};\n\nstruct ip6_mtuinfo {\n\tstruct sockaddr_in6 ip6m_addr;\n\t__u32 ip6m_mtu;\n};\n\nstruct ip6_ra_chain {\n\tstruct ip6_ra_chain *next;\n\tstruct sock *sk;\n\tint sel;\n\tvoid (*destructor)(struct sock *);\n};\n\nstruct ip6_rt_info {\n\tstruct in6_addr daddr;\n\tstruct in6_addr saddr;\n\tu_int32_t mark;\n};\n\nstruct ip6_sf_list {\n\tstruct ip6_sf_list *sf_next;\n\tstruct in6_addr sf_addr;\n\tlong unsigned int sf_count[2];\n\tunsigned char sf_gsresp;\n\tunsigned char sf_oldin;\n\tunsigned char sf_crcount;\n\tstruct callback_head rcu;\n};\n\nstruct ip6_sf_socklist {\n\tunsigned int sl_max;\n\tunsigned int sl_count;\n\tstruct callback_head rcu;\n\tstruct in6_addr sl_addr[0];\n};\n\nstruct ip_tunnel_encap {\n\tu16 type;\n\tu16 flags;\n\t__be16 sport;\n\t__be16 dport;\n};\n\nstruct ip6_tnl {\n\tstruct ip6_tnl *next;\n\tstruct net_device *dev;\n\tnetdevice_tracker dev_tracker;\n\tstruct net *net;\n\tstruct __ip6_tnl_parm parms;\n\tstruct flowi fl;\n\tstruct dst_cache dst_cache;\n\tstruct gro_cells gro_cells;\n\tint err_count;\n\tlong unsigned int err_time;\n\t__u32 i_seqno;\n\tatomic_t o_seqno;\n\tint hlen;\n\tint tun_hlen;\n\tint encap_hlen;\n\tstruct ip_tunnel_encap encap;\n\tint mlink;\n};\n\nstruct ip6_tnl_encap_ops {\n\tsize_t (*encap_hlen)(struct ip_tunnel_encap *);\n\tint (*build_header)(struct sk_buff *, struct ip_tunnel_encap *, u8 *, struct flowi6 *);\n\tint (*err_handler)(struct sk_buff *, struct inet6_skb_parm *, u8, u8, int, __be32);\n};\n\nstruct ip6addrlbl_entry {\n\tstruct in6_addr prefix;\n\tint prefixlen;\n\tint ifindex;\n\tint addrtype;\n\tu32 label;\n\tstruct hlist_node list;\n\tstruct callback_head rcu;\n};\n\nstruct ip6addrlbl_init_table {\n\tconst struct in6_addr *prefix;\n\tint prefixlen;\n\tu32 label;\n};\n\nstruct ip6fl_iter_state {\n\tstruct seq_net_private p;\n\tstruct pid_namespace *pid_ns;\n\tint bucket;\n};\n\nstruct mr_table;\n\nstruct ip6mr_result {\n\tstruct mr_table *mrt;\n};\n\nstruct ip6rd_flowi {\n\tstruct flowi6 fl6;\n\tstruct in6_addr gateway;\n};\n\nstruct ip_auth_hdr {\n\t__u8 nexthdr;\n\t__u8 hdrlen;\n\t__be16 reserved;\n\t__be32 spi;\n\t__be32 seq_no;\n\t__u8 auth_data[0];\n};\n\nstruct ip_beet_phdr {\n\t__u8 nexthdr;\n\t__u8 hdrlen;\n\t__u8 padlen;\n\t__u8 reserved;\n};\n\nstruct ip_conntrack_stat {\n\tunsigned int found;\n\tunsigned int invalid;\n\tunsigned int insert;\n\tunsigned int insert_failed;\n\tunsigned int clash_resolve;\n\tunsigned int drop;\n\tunsigned int early_drop;\n\tunsigned int error;\n\tunsigned int expect_new;\n\tunsigned int expect_create;\n\tunsigned int expect_delete;\n\tunsigned int search_restart;\n\tunsigned int chaintoolong;\n};\n\nstruct ip_ct_sctp {\n\tenum sctp_conntrack state;\n\t__be32 vtag[2];\n\tu8 init[2];\n\tu8 last_dir;\n\tu8 flags;\n};\n\nstruct ip_ct_tcp_state {\n\tu_int32_t td_end;\n\tu_int32_t td_maxend;\n\tu_int32_t td_maxwin;\n\tu_int32_t td_maxack;\n\tu_int8_t td_scale;\n\tu_int8_t flags;\n};\n\nstruct ip_ct_tcp {\n\tstruct ip_ct_tcp_state seen[2];\n\tu_int8_t state;\n\tu_int8_t last_dir;\n\tu_int8_t retrans;\n\tu_int8_t last_index;\n\tu_int32_t last_seq;\n\tu_int32_t last_ack;\n\tu_int32_t last_end;\n\tu_int16_t last_win;\n\tu_int8_t last_wscale;\n\tu_int8_t last_flags;\n};\n\nstruct ip_esp_hdr {\n\t__be32 spi;\n\t__be32 seq_no;\n\t__u8 enc_data[0];\n};\n\nstruct ip_frag_state {\n\tbool DF;\n\tunsigned int hlen;\n\tunsigned int ll_rs;\n\tunsigned int mtu;\n\tunsigned int left;\n\tint offset;\n\tint ptr;\n\t__be16 not_last_frag;\n};\n\nstruct ip_fraglist_iter {\n\tstruct sk_buff *frag;\n\tstruct iphdr *iph;\n\tint offset;\n\tunsigned int hlen;\n};\n\nstruct ip_sf_list;\n\nstruct ip_mc_list {\n\tstruct in_device *interface;\n\t__be32 multiaddr;\n\tunsigned int sfmode;\n\tstruct ip_sf_list *sources;\n\tstruct ip_sf_list *tomb;\n\tlong unsigned int sfcount[2];\n\tunion {\n\t\tstruct ip_mc_list *next;\n\t\tstruct ip_mc_list *next_rcu;\n\t};\n\tstruct ip_mc_list *next_hash;\n\tstruct timer_list timer;\n\tint users;\n\trefcount_t refcnt;\n\tspinlock_t lock;\n\tchar tm_running;\n\tchar reporter;\n\tchar unsolicit_count;\n\tchar loaded;\n\tunsigned char gsquery;\n\tunsigned char crcount;\n\tstruct callback_head rcu;\n};\n\nstruct ip_mreqn {\n\tstruct in_addr imr_multiaddr;\n\tstruct in_addr imr_address;\n\tint imr_ifindex;\n};\n\nstruct ip_sf_socklist;\n\nstruct ip_mc_socklist {\n\tstruct ip_mc_socklist *next_rcu;\n\tstruct ip_mreqn multi;\n\tunsigned int sfmode;\n\tstruct ip_sf_socklist *sflist;\n\tstruct callback_head rcu;\n};\n\nstruct ip_mreq_source {\n\t__be32 imr_multiaddr;\n\t__be32 imr_interface;\n\t__be32 imr_sourceaddr;\n};\n\nstruct ip_msfilter {\n\t__be32 imsf_multiaddr;\n\t__be32 imsf_interface;\n\t__u32 imsf_fmode;\n\t__u32 imsf_numsrc;\n\tunion {\n\t\t__be32 imsf_slist[1];\n\t\tstruct {\n\t\t\tstruct {} __empty_imsf_slist_flex;\n\t\t\t__be32 imsf_slist_flex[0];\n\t\t};\n\t};\n};\n\nstruct ip_ra_chain {\n\tstruct ip_ra_chain *next;\n\tstruct sock *sk;\n\tunion {\n\t\tvoid (*destructor)(struct sock *);\n\t\tstruct sock *saved_sk;\n\t};\n\tstruct callback_head rcu;\n};\n\nstruct kvec {\n\tvoid *iov_base;\n\tsize_t iov_len;\n};\n\nstruct ip_reply_arg {\n\tstruct kvec iov[1];\n\tint flags;\n\t__wsum csum;\n\tint csumoffset;\n\tint bound_dev_if;\n\tu8 tos;\n\tkuid_t uid;\n};\n\nstruct ip_rt_acct {\n\t__u32 o_bytes;\n\t__u32 o_packets;\n\t__u32 i_bytes;\n\t__u32 i_packets;\n};\n\nstruct ip_rt_info {\n\t__be32 daddr;\n\t__be32 saddr;\n\tu_int8_t tos;\n\tu_int32_t mark;\n};\n\nstruct ip_sf_list {\n\tstruct ip_sf_list *sf_next;\n\tlong unsigned int sf_count[2];\n\t__be32 sf_inaddr;\n\tunsigned char sf_gsresp;\n\tunsigned char sf_oldin;\n\tunsigned char sf_crcount;\n};\n\nstruct ip_sf_socklist {\n\tunsigned int sl_max;\n\tunsigned int sl_count;\n\tstruct callback_head rcu;\n\t__be32 sl_addr[0];\n};\n\nstruct ip_tunnel_parm_kern {\n\tchar name[16];\n\tlong unsigned int i_flags[1];\n\tlong unsigned int o_flags[1];\n\t__be32 i_key;\n\t__be32 o_key;\n\tint link;\n\tstruct iphdr iph;\n};\n\nstruct ip_tunnel_6rd_parm {\n\tstruct in6_addr prefix;\n\t__be32 relay_prefix;\n\tu16 prefixlen;\n\tu16 relay_prefixlen;\n};\n\nstruct ip_tunnel_fan {\n\tstruct list_head fan_maps;\n};\n\nstruct ip_tunnel_prl_entry;\n\nstruct ip_tunnel {\n\tstruct ip_tunnel *next;\n\tstruct hlist_node hash_node;\n\tstruct net_device *dev;\n\tnetdevice_tracker dev_tracker;\n\tstruct net *net;\n\tlong unsigned int err_time;\n\tint err_count;\n\tu32 i_seqno;\n\tatomic_t o_seqno;\n\tint tun_hlen;\n\tu32 index;\n\tu8 erspan_ver;\n\tu8 dir;\n\tu16 hwid;\n\tstruct dst_cache dst_cache;\n\tstruct ip_tunnel_parm_kern parms;\n\tint mlink;\n\tint encap_hlen;\n\tint hlen;\n\tstruct ip_tunnel_encap encap;\n\tstruct ip_tunnel_6rd_parm ip6rd;\n\tstruct ip_tunnel_prl_entry *prl;\n\tunsigned int prl_count;\n\tstruct ip_tunnel_fan fan;\n\tunsigned int ip_tnl_net_id;\n\tstruct gro_cells gro_cells;\n\t__u32 fwmark;\n\tbool collect_md;\n\tbool ignore_df;\n};\n\nstruct ip_tunnel_encap_ops {\n\tsize_t (*encap_hlen)(struct ip_tunnel_encap *);\n\tint (*build_header)(struct sk_buff *, struct ip_tunnel_encap *, u8 *, struct flowi4 *);\n\tint (*err_handler)(struct sk_buff *, u32);\n};\n\nstruct ip_tunnel_key {\n\t__be64 tun_id;\n\tunion {\n\t\tstruct {\n\t\t\t__be32 src;\n\t\t\t__be32 dst;\n\t\t} ipv4;\n\t\tstruct {\n\t\t\tstruct in6_addr src;\n\t\t\tstruct in6_addr dst;\n\t\t} ipv6;\n\t} u;\n\tlong unsigned int tun_flags[1];\n\t__be32 label;\n\tu32 nhid;\n\tu8 tos;\n\tu8 ttl;\n\t__be16 tp_src;\n\t__be16 tp_dst;\n\t__u8 flow_flags;\n};\n\nstruct ip_tunnel_info {\n\tstruct ip_tunnel_key key;\n\tstruct ip_tunnel_encap encap;\n\tstruct dst_cache dst_cache;\n\tu8 options_len;\n\tu8 mode;\n};\n\nstruct ip_tunnel_prl_entry {\n\tstruct ip_tunnel_prl_entry *next;\n\t__be32 addr;\n\tu16 flags;\n\tstruct callback_head callback_head;\n};\n\nstruct ipc64_perm {\n\t__kernel_key_t key;\n\t__kernel_uid32_t uid;\n\t__kernel_gid32_t gid;\n\t__kernel_uid32_t cuid;\n\t__kernel_gid32_t cgid;\n\t__kernel_mode_t mode;\n\tunsigned char __pad1[0];\n\tshort unsigned int seq;\n\tshort unsigned int __pad2;\n\t__kernel_ulong_t __unused1;\n\t__kernel_ulong_t __unused2;\n};\n\nstruct ipc_ids {\n\tint in_use;\n\tshort unsigned int seq;\n\tstruct rw_semaphore rwsem;\n\tstruct idr ipcs_idr;\n\tint max_idx;\n\tint last_idx;\n\tint next_id;\n\tstruct rhashtable key_ht;\n};\n\nstruct ipc_namespace {\n\tstruct ipc_ids ids[3];\n\tint sem_ctls[4];\n\tint used_sems;\n\tunsigned int msg_ctlmax;\n\tunsigned int msg_ctlmnb;\n\tunsigned int msg_ctlmni;\n\tstruct percpu_counter percpu_msg_bytes;\n\tstruct percpu_counter percpu_msg_hdrs;\n\tsize_t shm_ctlmax;\n\tsize_t shm_ctlall;\n\tlong unsigned int shm_tot;\n\tint shm_ctlmni;\n\tint shm_rmid_forced;\n\tstruct notifier_block ipcns_nb;\n\tstruct vfsmount *mq_mnt;\n\tunsigned int mq_queues_count;\n\tunsigned int mq_queues_max;\n\tunsigned int mq_msg_max;\n\tunsigned int mq_msgsize_max;\n\tunsigned int mq_msg_default;\n\tunsigned int mq_msgsize_default;\n\tstruct ctl_table_set mq_set;\n\tstruct ctl_table_header *mq_sysctls;\n\tstruct ctl_table_set ipc_set;\n\tstruct ctl_table_header *ipc_sysctls;\n\tstruct user_namespace *user_ns;\n\tstruct ucounts *ucounts;\n\tstruct llist_node mnt_llist;\n\tstruct ns_common ns;\n};\n\nstruct ipc_params;\n\nstruct kern_ipc_perm;\n\nstruct ipc_ops {\n\tint (*getnew)(struct ipc_namespace *, struct ipc_params *);\n\tint (*associate)(struct kern_ipc_perm *, int);\n\tint (*more_checks)(struct kern_ipc_perm *, struct ipc_params *);\n};\n\nstruct ipc_params {\n\tkey_t key;\n\tint flg;\n\tunion {\n\t\tsize_t size;\n\t\tint nsems;\n\t} u;\n};\n\nstruct ipc_perm {\n\t__kernel_key_t key;\n\t__kernel_uid_t uid;\n\t__kernel_gid_t gid;\n\t__kernel_uid_t cuid;\n\t__kernel_gid_t cgid;\n\t__kernel_mode_t mode;\n\tshort unsigned int seq;\n};\n\nstruct ipc_proc_iface {\n\tconst char *path;\n\tconst char *header;\n\tint ids;\n\tint (*show)(struct seq_file *, void *);\n};\n\nstruct ipc_proc_iter {\n\tstruct ipc_namespace *ns;\n\tstruct pid_namespace *pid_ns;\n\tstruct ipc_proc_iface *iface;\n};\n\nstruct ipc_security_struct {\n\tu16 sclass;\n\tu32 sid;\n};\n\nstruct sockcm_cookie {\n\tu64 transmit_time;\n\tu32 mark;\n\tu32 tsflags;\n};\n\nstruct ipcm6_cookie {\n\tstruct sockcm_cookie sockc;\n\t__s16 hlimit;\n\t__s16 tclass;\n\t__u16 gso_size;\n\t__s8 dontfrag;\n\tstruct ipv6_txoptions *opt;\n};\n\nstruct ipcm_cookie {\n\tstruct sockcm_cookie sockc;\n\t__be32 addr;\n\tint oif;\n\tstruct ip_options_rcu *opt;\n\t__u8 protocol;\n\t__u8 ttl;\n\t__s16 tos;\n\tchar priority;\n\t__u16 gso_size;\n};\n\nstruct ipfrag_skb_cb {\n\tunion {\n\t\tstruct inet_skb_parm h4;\n\t\tstruct inet6_skb_parm h6;\n\t};\n\tstruct sk_buff *next_frag;\n\tint frag_run_len;\n\tint ip_defrag_offset;\n};\n\nstruct ipmi_dmi_info {\n\tenum si_type si_type;\n\tunsigned int space;\n\tlong unsigned int addr;\n\tu8 slave_addr;\n\tstruct ipmi_dmi_info *next;\n};\n\nstruct ipmi_plat_data {\n\tenum ipmi_plat_interface_type iftype;\n\tunsigned int type;\n\tunsigned int space;\n\tlong unsigned int addr;\n\tunsigned int regspacing;\n\tunsigned int regsize;\n\tunsigned int regshift;\n\tunsigned int irq;\n\tunsigned int slave_addr;\n\tenum ipmi_addr_src addr_source;\n};\n\nstruct ipmr_result {\n\tstruct mr_table *mrt;\n};\n\nstruct ipq {\n\tstruct inet_frag_queue q;\n\tu8 ecn;\n\tu16 max_df_size;\n\tint iif;\n\tunsigned int rid;\n\tstruct inet_peer *peer;\n};\n\nstruct ipstats_mib {\n\tu64 mibs[38];\n\tstruct u64_stats_sync syncp;\n};\n\nstruct ipv6_ac_socklist {\n\tstruct in6_addr acl_addr;\n\tint acl_ifindex;\n\tstruct ipv6_ac_socklist *acl_next;\n};\n\nstruct udp_table;\n\nstruct ipv6_bpf_stub {\n\tint (*inet6_bind)(struct sock *, struct sockaddr *, int, u32);\n\tstruct sock * (*udp6_lib_lookup)(struct net *, const struct in6_addr *, __be16, const struct in6_addr *, __be16, int, int, struct udp_table *, struct sk_buff *);\n\tint (*ipv6_setsockopt)(struct sock *, int, int, sockptr_t, unsigned int);\n\tint (*ipv6_getsockopt)(struct sock *, int, int, sockptr_t, sockptr_t);\n\tint (*ipv6_dev_get_saddr)(struct net *, const struct net_device *, const struct in6_addr *, unsigned int, struct in6_addr *);\n};\n\nstruct ipv6_destopt_hao {\n\t__u8 type;\n\t__u8 length;\n\tstruct in6_addr addr;\n} __attribute__((packed));\n\nstruct ipv6_fl_socklist {\n\tstruct ipv6_fl_socklist *next;\n\tstruct ip6_flowlabel *fl;\n\tstruct callback_head rcu;\n};\n\nstruct ipv6_mc_socklist {\n\tstruct in6_addr addr;\n\tint ifindex;\n\tunsigned int sfmode;\n\tstruct ipv6_mc_socklist *next;\n\tstruct ip6_sf_socklist *sflist;\n\tstruct callback_head rcu;\n};\n\nstruct ipv6_mreq {\n\tstruct in6_addr ipv6mr_multiaddr;\n\tint ipv6mr_ifindex;\n};\n\nstruct ipv6_params {\n\t__s32 disable_ipv6;\n\t__s32 autoconf;\n};\n\nstruct ipv6_pinfo {\n\tstruct in6_addr saddr;\n\tstruct in6_pktinfo sticky_pktinfo;\n\tconst struct in6_addr *daddr_cache;\n\tconst struct in6_addr *saddr_cache;\n\t__be32 flow_label;\n\t__u32 frag_size;\n\ts16 hop_limit;\n\tu8 mcast_hops;\n\tint ucast_oif;\n\tint mcast_oif;\n\tunion {\n\t\tstruct {\n\t\t\t__u16 srcrt: 1;\n\t\t\t__u16 osrcrt: 1;\n\t\t\t__u16 rxinfo: 1;\n\t\t\t__u16 rxoinfo: 1;\n\t\t\t__u16 rxhlim: 1;\n\t\t\t__u16 rxohlim: 1;\n\t\t\t__u16 hopopts: 1;\n\t\t\t__u16 ohopopts: 1;\n\t\t\t__u16 dstopts: 1;\n\t\t\t__u16 odstopts: 1;\n\t\t\t__u16 rxflow: 1;\n\t\t\t__u16 rxtclass: 1;\n\t\t\t__u16 rxpmtu: 1;\n\t\t\t__u16 rxorigdstaddr: 1;\n\t\t\t__u16 recvfragsize: 1;\n\t\t} bits;\n\t\t__u16 all;\n\t} rxopt;\n\t__u8 srcprefs;\n\t__u8 pmtudisc;\n\t__u8 min_hopcount;\n\t__u8 tclass;\n\t__be32 rcv_flowinfo;\n\t__u32 dst_cookie;\n\tstruct ipv6_mc_socklist *ipv6_mc_list;\n\tstruct ipv6_ac_socklist *ipv6_ac_list;\n\tstruct ipv6_fl_socklist *ipv6_fl_list;\n\tstruct ipv6_txoptions *opt;\n\tstruct sk_buff *pktoptions;\n\tstruct sk_buff *rxpmtu;\n\tstruct inet6_cork cork;\n};\n\nstruct ipv6_route_iter {\n\tstruct seq_net_private p;\n\tstruct fib6_walker w;\n\tloff_t skip;\n\tstruct fib6_table *tbl;\n\tint sernum;\n};\n\nstruct ipv6_rpl_sr_hdr {\n\t__u8 nexthdr;\n\t__u8 hdrlen;\n\t__u8 type;\n\t__u8 segments_left;\n\t__u32 cmpre: 4;\n\t__u32 cmpri: 4;\n\t__u32 reserved: 4;\n\t__u32 pad: 4;\n\t__u32 reserved1: 16;\n\tunion {\n\t\tstruct {\n\t\t\tstruct {} __empty_addr;\n\t\t\tstruct in6_addr addr[0];\n\t\t};\n\t\tstruct {\n\t\t\tstruct {} __empty_data;\n\t\t\t__u8 data[0];\n\t\t};\n\t} segments;\n};\n\nstruct ipv6_rt_hdr {\n\t__u8 nexthdr;\n\t__u8 hdrlen;\n\t__u8 type;\n\t__u8 segments_left;\n};\n\nstruct ipv6_saddr_dst {\n\tconst struct in6_addr *addr;\n\tint ifindex;\n\tint scope;\n\tint label;\n\tunsigned int prefs;\n};\n\nstruct ipv6_saddr_score {\n\tint rule;\n\tint addr_type;\n\tstruct inet6_ifaddr *ifa;\n\tlong unsigned int scorebits[1];\n\tint scopedist;\n\tint matchlen;\n};\n\nstruct ipv6_sr_hdr {\n\t__u8 nexthdr;\n\t__u8 hdrlen;\n\t__u8 type;\n\t__u8 segments_left;\n\t__u8 first_segment;\n\t__u8 flags;\n\t__u16 tag;\n\tstruct in6_addr segments[0];\n};\n\nstruct neigh_table;\n\nstruct ipv6_stub {\n\tint (*ipv6_sock_mc_join)(struct sock *, int, const struct in6_addr *);\n\tint (*ipv6_sock_mc_drop)(struct sock *, int, const struct in6_addr *);\n\tstruct dst_entry * (*ipv6_dst_lookup_flow)(struct net *, const struct sock *, struct flowi6 *, const struct in6_addr *);\n\tint (*ipv6_route_input)(struct sk_buff *);\n\tstruct fib6_table * (*fib6_get_table)(struct net *, u32);\n\tint (*fib6_lookup)(struct net *, int, struct flowi6 *, struct fib6_result *, int);\n\tint (*fib6_table_lookup)(struct net *, struct fib6_table *, int, struct flowi6 *, struct fib6_result *, int);\n\tvoid (*fib6_select_path)(const struct net *, struct fib6_result *, struct flowi6 *, int, bool, const struct sk_buff *, int);\n\tu32 (*ip6_mtu_from_fib6)(const struct fib6_result *, const struct in6_addr *, const struct in6_addr *);\n\tint (*fib6_nh_init)(struct net *, struct fib6_nh *, struct fib6_config *, gfp_t, struct netlink_ext_ack *);\n\tvoid (*fib6_nh_release)(struct fib6_nh *);\n\tvoid (*fib6_nh_release_dsts)(struct fib6_nh *);\n\tvoid (*fib6_update_sernum)(struct net *, struct fib6_info *);\n\tint (*ip6_del_rt)(struct net *, struct fib6_info *, bool);\n\tvoid (*fib6_rt_update)(struct net *, struct fib6_info *, struct nl_info *);\n\tvoid (*udpv6_encap_enable)(void);\n\tvoid (*ndisc_send_na)(struct net_device *, const struct in6_addr *, const struct in6_addr *, bool, bool, bool, bool);\n\tvoid (*xfrm6_local_rxpmtu)(struct sk_buff *, u32);\n\tint (*xfrm6_udp_encap_rcv)(struct sock *, struct sk_buff *);\n\tstruct sk_buff * (*xfrm6_gro_udp_encap_rcv)(struct sock *, struct list_head *, struct sk_buff *);\n\tint (*xfrm6_rcv_encap)(struct sk_buff *, int, __be32, int);\n\tstruct neigh_table *nd_tbl;\n\tint (*ipv6_fragment)(struct net *, struct sock *, struct sk_buff *, int (*)(struct net *, struct sock *, struct sk_buff *));\n\tstruct net_device * (*ipv6_dev_find)(struct net *, const struct in6_addr *, struct net_device *);\n\tint (*ip6_xmit)(const struct sock *, struct sk_buff *, struct flowi6 *, __u32, struct ipv6_txoptions *, int, u32);\n};\n\nstruct ipv6_txoptions {\n\trefcount_t refcnt;\n\tint tot_len;\n\t__u16 opt_flen;\n\t__u16 opt_nflen;\n\tstruct ipv6_opt_hdr *hopopt;\n\tstruct ipv6_opt_hdr *dst0opt;\n\tstruct ipv6_rt_hdr *srcrt;\n\tstruct ipv6_opt_hdr *dst1opt;\n\tstruct callback_head rcu;\n};\n\nstruct ipv6hdr {\n\t__u8 priority: 4;\n\t__u8 version: 4;\n\t__u8 flow_lbl[3];\n\t__be16 payload_len;\n\t__u8 nexthdr;\n\t__u8 hop_limit;\n\tunion {\n\t\tstruct {\n\t\t\tstruct in6_addr saddr;\n\t\t\tstruct in6_addr daddr;\n\t\t};\n\t\tstruct {\n\t\t\tstruct in6_addr saddr;\n\t\t\tstruct in6_addr daddr;\n\t\t} addrs;\n\t};\n};\n\nstruct ir_table {\n\tstruct irte *base;\n\tlong unsigned int *bitmap;\n};\n\nstruct irq_affinity {\n\tunsigned int pre_vectors;\n\tunsigned int post_vectors;\n\tunsigned int nr_sets;\n\tunsigned int set_size[4];\n\tvoid (*calc_sets)(struct irq_affinity *, unsigned int);\n\tvoid *priv;\n};\n\nstruct irq_affinity_desc {\n\tstruct cpumask mask;\n\tunsigned int is_managed: 1;\n};\n\nstruct irq_affinity_devres {\n\tunsigned int count;\n\tunsigned int irq[0];\n};\n\nstruct irq_affinity_notify {\n\tunsigned int irq;\n\tstruct kref kref;\n\tstruct work_struct work;\n\tvoid (*notify)(struct irq_affinity_notify *, const cpumask_t *);\n\tvoid (*release)(struct kref *);\n};\n\nstruct irq_bypass_producer;\n\nstruct irq_bypass_consumer {\n\tstruct list_head node;\n\tvoid *token;\n\tint (*add_producer)(struct irq_bypass_consumer *, struct irq_bypass_producer *);\n\tvoid (*del_producer)(struct irq_bypass_consumer *, struct irq_bypass_producer *);\n\tvoid (*stop)(struct irq_bypass_consumer *);\n\tvoid (*start)(struct irq_bypass_consumer *);\n};\n\nstruct irq_bypass_producer {\n\tstruct list_head node;\n\tvoid *token;\n\tint irq;\n\tint (*add_consumer)(struct irq_bypass_producer *, struct irq_bypass_consumer *);\n\tvoid (*del_consumer)(struct irq_bypass_producer *, struct irq_bypass_consumer *);\n\tvoid (*stop)(struct irq_bypass_producer *);\n\tvoid (*start)(struct irq_bypass_producer *);\n};\n\nstruct irq_chip {\n\tconst char *name;\n\tunsigned int (*irq_startup)(struct irq_data *);\n\tvoid (*irq_shutdown)(struct irq_data *);\n\tvoid (*irq_enable)(struct irq_data *);\n\tvoid (*irq_disable)(struct irq_data *);\n\tvoid (*irq_ack)(struct irq_data *);\n\tvoid (*irq_mask)(struct irq_data *);\n\tvoid (*irq_mask_ack)(struct irq_data *);\n\tvoid (*irq_unmask)(struct irq_data *);\n\tvoid (*irq_eoi)(struct irq_data *);\n\tint (*irq_set_affinity)(struct irq_data *, const struct cpumask *, bool);\n\tint (*irq_retrigger)(struct irq_data *);\n\tint (*irq_set_type)(struct irq_data *, unsigned int);\n\tint (*irq_set_wake)(struct irq_data *, unsigned int);\n\tvoid (*irq_bus_lock)(struct irq_data *);\n\tvoid (*irq_bus_sync_unlock)(struct irq_data *);\n\tvoid (*irq_suspend)(struct irq_data *);\n\tvoid (*irq_resume)(struct irq_data *);\n\tvoid (*irq_pm_shutdown)(struct irq_data *);\n\tvoid (*irq_calc_mask)(struct irq_data *);\n\tvoid (*irq_print_chip)(struct irq_data *, struct seq_file *);\n\tint (*irq_request_resources)(struct irq_data *);\n\tvoid (*irq_release_resources)(struct irq_data *);\n\tvoid (*irq_compose_msi_msg)(struct irq_data *, struct msi_msg *);\n\tvoid (*irq_write_msi_msg)(struct irq_data *, struct msi_msg *);\n\tint (*irq_get_irqchip_state)(struct irq_data *, enum irqchip_irq_state, bool *);\n\tint (*irq_set_irqchip_state)(struct irq_data *, enum irqchip_irq_state, bool);\n\tint (*irq_set_vcpu_affinity)(struct irq_data *, void *);\n\tvoid (*ipi_send_single)(struct irq_data *, unsigned int);\n\tvoid (*ipi_send_mask)(struct irq_data *, const struct cpumask *);\n\tint (*irq_nmi_setup)(struct irq_data *);\n\tvoid (*irq_nmi_teardown)(struct irq_data *);\n\tlong unsigned int flags;\n};\n\nstruct irq_chip_regs {\n\tlong unsigned int enable;\n\tlong unsigned int disable;\n\tlong unsigned int mask;\n\tlong unsigned int ack;\n\tlong unsigned int eoi;\n\tlong unsigned int type;\n\tlong unsigned int polarity;\n};\n\nstruct irq_chip_type {\n\tstruct irq_chip chip;\n\tstruct irq_chip_regs regs;\n\tirq_flow_handler_t handler;\n\tu32 type;\n\tu32 mask_cache_priv;\n\tu32 *mask_cache;\n};\n\nstruct irq_chip_generic {\n\traw_spinlock_t lock;\n\tvoid *reg_base;\n\tu32 (*reg_readl)(void *);\n\tvoid (*reg_writel)(u32, void *);\n\tvoid (*suspend)(struct irq_chip_generic *);\n\tvoid (*resume)(struct irq_chip_generic *);\n\tunsigned int irq_base;\n\tunsigned int irq_cnt;\n\tu32 mask_cache;\n\tu32 type_cache;\n\tu32 polarity_cache;\n\tu32 wake_enabled;\n\tu32 wake_active;\n\tunsigned int num_ct;\n\tvoid *private;\n\tlong unsigned int installed;\n\tlong unsigned int unused;\n\tstruct irq_domain *domain;\n\tstruct list_head list;\n\tstruct irq_chip_type chip_types[0];\n};\n\nstruct irq_common_data {\n\tunsigned int state_use_accessors;\n\tunsigned int node;\n\tvoid *handler_data;\n\tstruct msi_desc *msi_desc;\n\tcpumask_var_t affinity;\n\tcpumask_var_t effective_affinity;\n};\n\nstruct irq_data {\n\tu32 mask;\n\tunsigned int irq;\n\tirq_hw_number_t hwirq;\n\tstruct irq_common_data *common;\n\tstruct irq_chip *chip;\n\tstruct irq_domain *domain;\n\tstruct irq_data *parent_data;\n\tvoid *chip_data;\n};\n\nstruct irqstat;\n\nstruct irqaction;\n\nstruct irq_desc {\n\tstruct irq_common_data irq_common_data;\n\tstruct irq_data irq_data;\n\tstruct irqstat *kstat_irqs;\n\tirq_flow_handler_t handle_irq;\n\tstruct irqaction *action;\n\tunsigned int status_use_accessors;\n\tunsigned int core_internal_state__do_not_mess_with_it;\n\tunsigned int depth;\n\tunsigned int wake_depth;\n\tunsigned int tot_count;\n\tunsigned int irq_count;\n\tlong unsigned int last_unhandled;\n\tunsigned int irqs_unhandled;\n\tatomic_t threads_handled;\n\tint threads_handled_last;\n\traw_spinlock_t lock;\n\tstruct cpumask *percpu_enabled;\n\tconst struct cpumask *percpu_affinity;\n\tconst struct cpumask *affinity_hint;\n\tstruct irq_affinity_notify *affinity_notify;\n\tcpumask_var_t pending_mask;\n\tlong unsigned int threads_oneshot;\n\tatomic_t threads_active;\n\twait_queue_head_t wait_for_threads;\n\tunsigned int nr_actions;\n\tunsigned int no_suspend_depth;\n\tunsigned int cond_suspend_depth;\n\tunsigned int force_resume_depth;\n\tstruct proc_dir_entry *dir;\n\tstruct callback_head rcu;\n\tstruct kobject kobj;\n\tstruct mutex request_mutex;\n\tint parent_irq;\n\tstruct module *owner;\n\tconst char *name;\n\tstruct hlist_node resend_node;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n};\n\ntypedef struct irq_desc *vector_irq_t[256];\n\nstruct irq_desc_devres {\n\tunsigned int from;\n\tunsigned int cnt;\n};\n\nstruct irq_devres {\n\tunsigned int irq;\n\tvoid *dev_id;\n};\n\nstruct irq_domain_chip_generic;\n\nstruct msi_parent_ops;\n\nstruct irq_domain {\n\tstruct list_head link;\n\tconst char *name;\n\tconst struct irq_domain_ops *ops;\n\tvoid *host_data;\n\tunsigned int flags;\n\tunsigned int mapcount;\n\tstruct mutex mutex;\n\tstruct irq_domain *root;\n\tstruct fwnode_handle *fwnode;\n\tenum irq_domain_bus_token bus_token;\n\tstruct irq_domain_chip_generic *gc;\n\tstruct device *dev;\n\tstruct device *pm_dev;\n\tstruct irq_domain *parent;\n\tconst struct msi_parent_ops *msi_parent_ops;\n\tvoid (*exit)(struct irq_domain *);\n\tirq_hw_number_t hwirq_max;\n\tunsigned int revmap_size;\n\tstruct xarray revmap_tree;\n\tstruct irq_data *revmap[0];\n};\n\nstruct irq_domain_chip_generic {\n\tunsigned int irqs_per_chip;\n\tunsigned int num_chips;\n\tunsigned int irq_flags_to_clear;\n\tunsigned int irq_flags_to_set;\n\tenum irq_gc_flags gc_flags;\n\tvoid (*exit)(struct irq_chip_generic *);\n\tstruct irq_chip_generic *gc[0];\n};\n\nstruct irq_domain_chip_generic_info {\n\tconst char *name;\n\tirq_flow_handler_t handler;\n\tunsigned int irqs_per_chip;\n\tunsigned int num_ct;\n\tunsigned int irq_flags_to_clear;\n\tunsigned int irq_flags_to_set;\n\tenum irq_gc_flags gc_flags;\n\tint (*init)(struct irq_chip_generic *);\n\tvoid (*exit)(struct irq_chip_generic *);\n};\n\nstruct irq_domain_info {\n\tstruct fwnode_handle *fwnode;\n\tunsigned int domain_flags;\n\tunsigned int size;\n\tirq_hw_number_t hwirq_max;\n\tint direct_max;\n\tunsigned int hwirq_base;\n\tunsigned int virq_base;\n\tenum irq_domain_bus_token bus_token;\n\tconst char *name_suffix;\n\tconst struct irq_domain_ops *ops;\n\tvoid *host_data;\n\tstruct irq_domain *parent;\n\tstruct irq_domain_chip_generic_info *dgc_info;\n\tint (*init)(struct irq_domain *);\n\tvoid (*exit)(struct irq_domain *);\n};\n\nstruct irq_generic_chip_devres {\n\tstruct irq_chip_generic *gc;\n\tu32 msk;\n\tunsigned int clr;\n\tunsigned int set;\n};\n\nstruct irq_glue {\n\tstruct irq_affinity_notify notify;\n\tstruct cpu_rmap *rmap;\n\tu16 index;\n};\n\nstruct irq_info {\n\tstruct list_head list;\n\tstruct list_head eoi_list;\n\tstruct rcu_work rwork;\n\tshort int refcnt;\n\tu8 spurious_cnt;\n\tu8 is_accounted;\n\tshort int type;\n\tu8 mask_reason;\n\tu8 is_active;\n\tunsigned int irq;\n\tevtchn_port_t evtchn;\n\tshort unsigned int cpu;\n\tshort unsigned int eoi_cpu;\n\tunsigned int irq_epoch;\n\tu64 eoi_time;\n\traw_spinlock_t lock;\n\tbool is_static;\n\tunion {\n\t\tshort unsigned int virq;\n\t\tenum ipi_vector ipi;\n\t\tstruct {\n\t\t\tshort unsigned int pirq;\n\t\t\tshort unsigned int gsi;\n\t\t\tunsigned char vector;\n\t\t\tunsigned char flags;\n\t\t\tuint16_t domid;\n\t\t} pirq;\n\t\tstruct xenbus_device *interdomain;\n\t} u;\n};\n\nstruct irq_info___2 {\n\tu8 bus;\n\tu8 devfn;\n\tstruct {\n\t\tu8 link;\n\t\tu16 bitmap;\n\t} __attribute__((packed)) irq[4];\n\tu8 slot;\n\tu8 rfu;\n};\n\nstruct irq_info___3 {\n\tstruct hlist_node node;\n\tint irq;\n\tspinlock_t lock;\n\tstruct list_head *head;\n};\n\nstruct irq_matrix {\n\tunsigned int matrix_bits;\n\tunsigned int alloc_start;\n\tunsigned int alloc_end;\n\tunsigned int alloc_size;\n\tunsigned int global_available;\n\tunsigned int global_reserved;\n\tunsigned int systembits_inalloc;\n\tunsigned int total_allocated;\n\tunsigned int online_maps;\n\tstruct cpumap *maps;\n\tlong unsigned int *system_map;\n\tlong unsigned int scratch_map[0];\n};\n\nstruct irq_override_cmp {\n\tconst struct dmi_system_id *system;\n\tunsigned char irq;\n\tunsigned char triggering;\n\tunsigned char polarity;\n\tunsigned char shareable;\n\tbool override;\n};\n\nstruct irq_pin_list {\n\tstruct list_head list;\n\tint apic;\n\tint pin;\n};\n\nstruct irq_remap_ops {\n\tint capability;\n\tint (*prepare)(void);\n\tint (*enable)(void);\n\tvoid (*disable)(void);\n\tint (*reenable)(int);\n\tint (*enable_faulting)(unsigned int);\n};\n\nstruct irq_remap_table {\n\traw_spinlock_t lock;\n\tunsigned int min_index;\n\tu32 *table;\n};\n\nstruct irq_router {\n\tchar *name;\n\tu16 vendor;\n\tu16 device;\n\tint (*get)(struct pci_dev *, struct pci_dev *, int);\n\tint (*set)(struct pci_dev *, struct pci_dev *, int, int);\n\tint (*lvl)(struct pci_dev *, struct pci_dev *, int, int);\n};\n\nstruct irq_router_handler {\n\tu16 vendor;\n\tint (*probe)(struct irq_router *, struct pci_dev *, u16);\n};\n\nstruct irq_routing_table {\n\tu32 signature;\n\tu16 version;\n\tu16 size;\n\tu8 rtr_bus;\n\tu8 rtr_devfn;\n\tu16 exclusive_irqs;\n\tu16 rtr_vendor;\n\tu16 rtr_device;\n\tu32 miniport_data;\n\tu8 rfu[11];\n\tu8 checksum;\n\tstruct irq_info___2 slots[0];\n};\n\nstruct irq_sim_work_ctx;\n\nstruct irq_sim_irq_ctx {\n\tbool enabled;\n\tstruct irq_sim_work_ctx *work_ctx;\n};\n\nstruct irq_sim_ops {\n\tint (*irq_sim_irq_requested)(struct irq_domain *, irq_hw_number_t, void *);\n\tvoid (*irq_sim_irq_released)(struct irq_domain *, irq_hw_number_t, void *);\n};\n\nstruct irq_sim_work_ctx {\n\tstruct irq_work work;\n\tint irq_base;\n\tunsigned int irq_count;\n\tlong unsigned int *pending;\n\tstruct irq_domain *domain;\n\tstruct irq_sim_ops ops;\n\tvoid *user_data;\n};\n\nstruct irq_stack {\n\tchar stack[16384];\n};\n\nstruct irqaction {\n\tirq_handler_t handler;\n\tvoid *dev_id;\n\tvoid *percpu_dev_id;\n\tstruct irqaction *next;\n\tirq_handler_t thread_fn;\n\tstruct task_struct *thread;\n\tstruct irqaction *secondary;\n\tunsigned int irq;\n\tunsigned int flags;\n\tlong unsigned int thread_flags;\n\tlong unsigned int thread_mask;\n\tconst char *name;\n\tstruct proc_dir_entry *dir;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct irqchip_fwid {\n\tstruct fwnode_handle fwnode;\n\tunsigned int type;\n\tchar *name;\n\tphys_addr_t *pa;\n};\n\nstruct irqentry_state {\n\tunion {\n\t\tbool exit_rcu;\n\t\tbool lockdep;\n\t};\n};\n\ntypedef struct irqentry_state irqentry_state_t;\n\nstruct irqstat {\n\tunsigned int cnt;\n};\n\nstruct irt_routing_table {\n\tu32 signature;\n\tu8 size;\n\tu8 used;\n\tu16 exclusive_irqs;\n\tstruct irq_info___2 slots[0];\n};\n\nunion irte___2 {\n\tu32 val;\n\tstruct {\n\t\tu32 valid: 1;\n\t\tu32 no_fault: 1;\n\t\tu32 int_type: 3;\n\t\tu32 rq_eoi: 1;\n\t\tu32 dm: 1;\n\t\tu32 rsvd_1: 1;\n\t\tu32 destination: 8;\n\t\tu32 vector: 8;\n\t\tu32 rsvd_2: 8;\n\t} fields;\n};\n\nunion irte_ga_lo {\n\tu64 val;\n\tstruct {\n\t\tu64 valid: 1;\n\t\tu64 no_fault: 1;\n\t\tu64 int_type: 3;\n\t\tu64 rq_eoi: 1;\n\t\tu64 dm: 1;\n\t\tu64 guest_mode: 1;\n\t\tu64 destination: 24;\n\t\tu64 ga_tag: 32;\n\t} fields_remap;\n\tstruct {\n\t\tu64 valid: 1;\n\t\tu64 no_fault: 1;\n\t\tu64 ga_log_intr: 1;\n\t\tu64 rsvd1: 3;\n\t\tu64 is_run: 1;\n\t\tu64 guest_mode: 1;\n\t\tu64 destination: 24;\n\t\tu64 ga_tag: 32;\n\t} fields_vapic;\n};\n\nunion irte_ga_hi {\n\tu64 val;\n\tstruct {\n\t\tu64 vector: 8;\n\t\tu64 rsvd_1: 4;\n\t\tu64 ga_root_ptr: 40;\n\t\tu64 rsvd_2: 4;\n\t\tu64 destination: 8;\n\t} fields;\n};\n\nstruct irte_ga {\n\tunion {\n\t\tstruct {\n\t\t\tunion irte_ga_lo lo;\n\t\t\tunion irte_ga_hi hi;\n\t\t};\n\t\tu128 irte;\n\t};\n};\n\nstruct isa_dev {\n\tstruct device dev;\n\tstruct device *next;\n\tunsigned int id;\n};\n\nstruct isa_driver {\n\tint (*match)(struct device *, unsigned int);\n\tint (*probe)(struct device *, unsigned int);\n\tvoid (*remove)(struct device *, unsigned int);\n\tvoid (*shutdown)(struct device *, unsigned int);\n\tint (*suspend)(struct device *, unsigned int, pm_message_t);\n\tint (*resume)(struct device *, unsigned int);\n\tstruct device_driver driver;\n\tstruct device *devices;\n};\n\nstruct isoch_data {\n\tu32 maxbw;\n\tu32 n;\n\tu32 y;\n\tu32 l;\n\tu32 rq;\n\tstruct agp_3_5_dev *dev;\n};\n\nstruct itimerspec64 {\n\tstruct timespec64 it_interval;\n\tstruct timespec64 it_value;\n};\n\nstruct ivhd_entry {\n\tu8 type;\n\tu16 devid;\n\tu8 flags;\n\tunion {\n\t\tstruct {\n\t\t\tu32 ext;\n\t\t\tu32 hidh;\n\t\t};\n\t\tstruct {\n\t\t\tu32 ext;\n\t\t\tu32 hidh;\n\t\t} ext_hid;\n\t};\n\tu64 cid;\n\tu8 uidf;\n\tu8 uidl;\n\tu8 uid;\n} __attribute__((packed));\n\nstruct ivhd_header {\n\tu8 type;\n\tu8 flags;\n\tu16 length;\n\tu16 devid;\n\tu16 cap_ptr;\n\tu64 mmio_phys;\n\tu16 pci_seg;\n\tu16 info;\n\tu32 efr_attr;\n\tu64 efr_reg;\n\tu64 efr_reg2;\n};\n\nstruct ivmd_header {\n\tu8 type;\n\tu8 flags;\n\tu16 length;\n\tu16 devid;\n\tu16 aux;\n\tu16 pci_seg;\n\tu8 resv[6];\n\tu64 range_start;\n\tu64 range_length;\n};\n\nstruct ivrs_quirk_entry {\n\tu8 id;\n\tu32 devid;\n};\n\nstruct iw_discarded {\n\t__u32 nwid;\n\t__u32 code;\n\t__u32 fragment;\n\t__u32 retries;\n\t__u32 misc;\n};\n\nstruct iw_encode_ext {\n\t__u32 ext_flags;\n\t__u8 tx_seq[8];\n\t__u8 rx_seq[8];\n\tstruct sockaddr addr;\n\t__u16 alg;\n\t__u16 key_len;\n\t__u8 key[0];\n};\n\nstruct iw_point {\n\tvoid *pointer;\n\t__u16 length;\n\t__u16 flags;\n};\n\nstruct iw_param {\n\t__s32 value;\n\t__u8 fixed;\n\t__u8 disabled;\n\t__u16 flags;\n};\n\nstruct iw_freq {\n\t__s32 m;\n\t__s16 e;\n\t__u8 i;\n\t__u8 flags;\n};\n\nstruct iw_quality {\n\t__u8 qual;\n\t__u8 level;\n\t__u8 noise;\n\t__u8 updated;\n};\n\nunion iwreq_data {\n\tchar name[16];\n\tstruct iw_point essid;\n\tstruct iw_param nwid;\n\tstruct iw_freq freq;\n\tstruct iw_param sens;\n\tstruct iw_param bitrate;\n\tstruct iw_param txpower;\n\tstruct iw_param rts;\n\tstruct iw_param frag;\n\t__u32 mode;\n\tstruct iw_param retry;\n\tstruct iw_point encoding;\n\tstruct iw_param power;\n\tstruct iw_quality qual;\n\tstruct sockaddr ap_addr;\n\tstruct sockaddr addr;\n\tstruct iw_param param;\n\tstruct iw_point data;\n};\n\nstruct iw_event {\n\t__u16 len;\n\t__u16 cmd;\n\tunion iwreq_data u;\n};\n\nstruct iw_request_info;\n\ntypedef int (*iw_handler)(struct net_device *, struct iw_request_info *, union iwreq_data *, char *);\n\nstruct iw_priv_args;\n\nstruct iw_statistics;\n\nstruct iw_handler_def {\n\tconst iw_handler *standard;\n\t__u16 num_standard;\n\t__u16 num_private;\n\t__u16 num_private_args;\n\tconst iw_handler *private;\n\tconst struct iw_priv_args *private_args;\n\tstruct iw_statistics * (*get_wireless_stats)(struct net_device *);\n};\n\nstruct iw_ioctl_description {\n\t__u8 header_type;\n\t__u8 token_type;\n\t__u16 token_size;\n\t__u16 min_tokens;\n\t__u16 max_tokens;\n\t__u32 flags;\n};\n\nstruct iw_missed {\n\t__u32 beacon;\n};\n\nstruct kobj_attribute {\n\tstruct attribute attr;\n\tssize_t (*show)(struct kobject *, struct kobj_attribute *, char *);\n\tssize_t (*store)(struct kobject *, struct kobj_attribute *, const char *, size_t);\n};\n\nstruct iw_node_attr {\n\tstruct kobj_attribute kobj_attr;\n\tint nid;\n};\n\nstruct iw_priv_args {\n\t__u32 cmd;\n\t__u16 set_args;\n\t__u16 get_args;\n\tchar name[16];\n};\n\nstruct libipw_device;\n\nstruct iw_spy_data;\n\nstruct iw_public_data {\n\tstruct iw_spy_data *spy_data;\n\tstruct libipw_device *libipw;\n};\n\nstruct iw_request_info {\n\t__u16 cmd;\n\t__u16 flags;\n};\n\nstruct iw_spy_data {\n\tint spy_number;\n\tu_char spy_address[48];\n\tstruct iw_quality spy_stat[8];\n\tstruct iw_quality spy_thr_low;\n\tstruct iw_quality spy_thr_high;\n\tu_char spy_thr_under[8];\n};\n\nstruct iw_statistics {\n\t__u16 status;\n\tstruct iw_quality qual;\n\tstruct iw_discarded discard;\n\tstruct iw_missed miss;\n};\n\nstruct iw_thrspy {\n\tstruct sockaddr addr;\n\tstruct iw_quality qual;\n\tstruct iw_quality low;\n\tstruct iw_quality high;\n};\n\nstruct iwreq {\n\tunion {\n\t\tchar ifrn_name[16];\n\t} ifr_ifrn;\n\tunion iwreq_data u;\n};\n\nstruct jailhouse_setup_data {\n\tstruct {\n\t\t__u16 version;\n\t\t__u16 compatible_version;\n\t} hdr;\n\tstruct {\n\t\t__u16 pm_timer_address;\n\t\t__u16 num_cpus;\n\t\t__u64 pci_mmconfig_base;\n\t\t__u32 tsc_khz;\n\t\t__u32 apic_khz;\n\t\t__u8 standard_ioapic;\n\t\t__u8 cpu_ids[255];\n\t} __attribute__((packed)) v1;\n\tstruct {\n\t\t__u32 flags;\n\t} v2;\n};\n\nstruct transaction_s;\n\ntypedef struct transaction_s transaction_t;\n\nstruct jbd2_inode {\n\ttransaction_t *i_transaction;\n\ttransaction_t *i_next_transaction;\n\tstruct list_head i_list;\n\tstruct inode *i_vfs_inode;\n\tlong unsigned int i_flags;\n\tloff_t i_dirty_start;\n\tloff_t i_dirty_end;\n};\n\nstruct jbd2_journal_block_tail {\n\t__be32 t_checksum;\n};\n\ntypedef struct journal_s journal_t;\n\nstruct jbd2_journal_handle {\n\tunion {\n\t\ttransaction_t *h_transaction;\n\t\tjournal_t *h_journal;\n\t};\n\thandle_t *h_rsv_handle;\n\tint h_total_credits;\n\tint h_revoke_credits;\n\tint h_revoke_credits_requested;\n\tint h_ref;\n\tint h_err;\n\tunsigned int h_sync: 1;\n\tunsigned int h_jdata: 1;\n\tunsigned int h_reserved: 1;\n\tunsigned int h_aborted: 1;\n\tunsigned int h_type: 8;\n\tunsigned int h_line_no: 16;\n\tlong unsigned int h_start_jiffies;\n\tunsigned int h_requested_credits;\n\tunsigned int saved_alloc_context;\n};\n\nstruct journal_header_s {\n\t__be32 h_magic;\n\t__be32 h_blocktype;\n\t__be32 h_sequence;\n};\n\ntypedef struct journal_header_s journal_header_t;\n\nstruct jbd2_journal_revoke_header_s {\n\tjournal_header_t r_header;\n\t__be32 r_count;\n};\n\ntypedef struct jbd2_journal_revoke_header_s jbd2_journal_revoke_header_t;\n\nstruct jbd2_revoke_record_s {\n\tstruct list_head hash;\n\ttid_t sequence;\n\tlong long unsigned int blocknr;\n};\n\nstruct jbd2_revoke_table_s {\n\tint hash_size;\n\tint hash_shift;\n\tstruct list_head *hash_table;\n};\n\nstruct transaction_stats_s;\n\nstruct jbd2_stats_proc_session {\n\tjournal_t *journal;\n\tstruct transaction_stats_s *stats;\n\tint start;\n\tint max;\n};\n\nstruct jit_context {\n\tint cleanup_addr;\n\tint tail_call_direct_label;\n\tint tail_call_indirect_label;\n};\n\nstruct rand_data;\n\nstruct jitterentropy {\n\tspinlock_t jent_lock;\n\tstruct rand_data *entropy_collector;\n\tstruct crypto_shash *tfm;\n\tstruct shash_desc *sdesc;\n};\n\nstruct join_entry {\n\tu32 token;\n\tu32 remote_nonce;\n\tu32 local_nonce;\n\tu8 join_id;\n\tu8 local_id;\n\tu8 backup;\n\tu8 valid;\n};\n\nstruct journal_block_tag3_s {\n\t__be32 t_blocknr;\n\t__be32 t_flags;\n\t__be32 t_blocknr_high;\n\t__be32 t_checksum;\n};\n\ntypedef struct journal_block_tag3_s journal_block_tag3_t;\n\nstruct journal_block_tag_s {\n\t__be32 t_blocknr;\n\t__be16 t_checksum;\n\t__be16 t_flags;\n\t__be32 t_blocknr_high;\n};\n\ntypedef struct journal_block_tag_s journal_block_tag_t;\n\nstruct journal_head {\n\tstruct buffer_head *b_bh;\n\tspinlock_t b_state_lock;\n\tint b_jcount;\n\tunsigned int b_jlist;\n\tunsigned int b_modified;\n\tchar *b_frozen_data;\n\tchar *b_committed_data;\n\ttransaction_t *b_transaction;\n\ttransaction_t *b_next_transaction;\n\tstruct journal_head *b_tnext;\n\tstruct journal_head *b_tprev;\n\ttransaction_t *b_cp_transaction;\n\tstruct journal_head *b_cpnext;\n\tstruct journal_head *b_cpprev;\n\tstruct jbd2_buffer_trigger_type *b_triggers;\n\tstruct jbd2_buffer_trigger_type *b_frozen_triggers;\n};\n\nstruct transaction_run_stats_s {\n\tlong unsigned int rs_wait;\n\tlong unsigned int rs_request_delay;\n\tlong unsigned int rs_running;\n\tlong unsigned int rs_locked;\n\tlong unsigned int rs_flushing;\n\tlong unsigned int rs_logging;\n\t__u32 rs_handle_count;\n\t__u32 rs_blocks;\n\t__u32 rs_blocks_logged;\n};\n\nstruct transaction_stats_s {\n\tlong unsigned int ts_tid;\n\tlong unsigned int ts_requested;\n\tstruct transaction_run_stats_s run;\n};\n\nstruct journal_superblock_s;\n\ntypedef struct journal_superblock_s journal_superblock_t;\n\nstruct journal_s {\n\tlong unsigned int j_flags;\n\tint j_errno;\n\tstruct mutex j_abort_mutex;\n\tstruct buffer_head *j_sb_buffer;\n\tjournal_superblock_t *j_superblock;\n\trwlock_t j_state_lock;\n\tint j_barrier_count;\n\tstruct mutex j_barrier;\n\ttransaction_t *j_running_transaction;\n\ttransaction_t *j_committing_transaction;\n\ttransaction_t *j_checkpoint_transactions;\n\twait_queue_head_t j_wait_transaction_locked;\n\twait_queue_head_t j_wait_done_commit;\n\twait_queue_head_t j_wait_commit;\n\twait_queue_head_t j_wait_updates;\n\twait_queue_head_t j_wait_reserved;\n\twait_queue_head_t j_fc_wait;\n\tstruct mutex j_checkpoint_mutex;\n\tstruct buffer_head *j_chkpt_bhs[64];\n\tstruct shrinker *j_shrinker;\n\tstruct percpu_counter j_checkpoint_jh_count;\n\ttransaction_t *j_shrink_transaction;\n\tlong unsigned int j_head;\n\tlong unsigned int j_tail;\n\tlong unsigned int j_free;\n\tlong unsigned int j_first;\n\tlong unsigned int j_last;\n\tlong unsigned int j_fc_first;\n\tlong unsigned int j_fc_off;\n\tlong unsigned int j_fc_last;\n\tstruct block_device *j_dev;\n\tint j_blocksize;\n\tlong long unsigned int j_blk_offset;\n\tchar j_devname[56];\n\tstruct block_device *j_fs_dev;\n\terrseq_t j_fs_dev_wb_err;\n\tunsigned int j_total_len;\n\tatomic_t j_reserved_credits;\n\tspinlock_t j_list_lock;\n\tstruct inode *j_inode;\n\ttid_t j_tail_sequence;\n\ttid_t j_transaction_sequence;\n\ttid_t j_commit_sequence;\n\ttid_t j_commit_request;\n\t__u8 j_uuid[16];\n\tstruct task_struct *j_task;\n\tint j_max_transaction_buffers;\n\tint j_revoke_records_per_block;\n\tint j_transaction_overhead_buffers;\n\tlong unsigned int j_commit_interval;\n\tstruct timer_list j_commit_timer;\n\tspinlock_t j_revoke_lock;\n\tstruct jbd2_revoke_table_s *j_revoke;\n\tstruct jbd2_revoke_table_s *j_revoke_table[2];\n\tstruct buffer_head **j_wbuf;\n\tstruct buffer_head **j_fc_wbuf;\n\tint j_wbufsize;\n\tint j_fc_wbufsize;\n\tpid_t j_last_sync_writer;\n\tu64 j_average_commit_time;\n\tu32 j_min_batch_time;\n\tu32 j_max_batch_time;\n\tvoid (*j_commit_callback)(journal_t *, transaction_t *);\n\tint (*j_submit_inode_data_buffers)(struct jbd2_inode *);\n\tint (*j_finish_inode_data_buffers)(struct jbd2_inode *);\n\tspinlock_t j_history_lock;\n\tstruct proc_dir_entry *j_proc_entry;\n\tstruct transaction_stats_s j_stats;\n\tunsigned int j_failed_commit;\n\tvoid *j_private;\n\tstruct crypto_shash *j_chksum_driver;\n\t__u32 j_csum_seed;\n\tvoid (*j_fc_cleanup_callback)(struct journal_s *, int, tid_t);\n\tint (*j_fc_replay_callback)(struct journal_s *, struct buffer_head *, enum passtype, int, tid_t);\n\tint (*j_bmap)(struct journal_s *, sector_t *);\n};\n\nstruct journal_superblock_s {\n\tjournal_header_t s_header;\n\t__be32 s_blocksize;\n\t__be32 s_maxlen;\n\t__be32 s_first;\n\t__be32 s_sequence;\n\t__be32 s_start;\n\t__be32 s_errno;\n\t__be32 s_feature_compat;\n\t__be32 s_feature_incompat;\n\t__be32 s_feature_ro_compat;\n\t__u8 s_uuid[16];\n\t__be32 s_nr_users;\n\t__be32 s_dynsuper;\n\t__be32 s_max_transaction;\n\t__be32 s_max_trans_data;\n\t__u8 s_checksum_type;\n\t__u8 s_padding2[3];\n\t__be32 s_num_fc_blks;\n\t__be32 s_head;\n\t__u32 s_padding[40];\n\t__be32 s_checksum;\n\t__u8 s_users[768];\n};\n\nstruct jump_entry {\n\ts32 code;\n\ts32 target;\n\tlong int key;\n};\n\nstruct jump_label_patch {\n\tconst void *code;\n\tint size;\n};\n\nstruct k_itimer;\n\nstruct k_clock {\n\tint (*clock_getres)(const clockid_t, struct timespec64 *);\n\tint (*clock_set)(const clockid_t, const struct timespec64 *);\n\tint (*clock_get_timespec)(const clockid_t, struct timespec64 *);\n\tktime_t (*clock_get_ktime)(const clockid_t);\n\tint (*clock_adj)(const clockid_t, struct __kernel_timex *);\n\tint (*timer_create)(struct k_itimer *);\n\tint (*nsleep)(const clockid_t, int, const struct timespec64 *);\n\tint (*timer_set)(struct k_itimer *, int, struct itimerspec64 *, struct itimerspec64 *);\n\tint (*timer_del)(struct k_itimer *);\n\tvoid (*timer_get)(struct k_itimer *, struct itimerspec64 *);\n\tvoid (*timer_rearm)(struct k_itimer *);\n\ts64 (*timer_forward)(struct k_itimer *, ktime_t);\n\tktime_t (*timer_remaining)(struct k_itimer *, ktime_t);\n\tint (*timer_try_to_cancel)(struct k_itimer *);\n\tvoid (*timer_arm)(struct k_itimer *, ktime_t, bool, bool);\n\tvoid (*timer_wait_running)(struct k_itimer *);\n};\n\nstruct signal_struct;\n\nstruct sigqueue;\n\nstruct k_itimer {\n\tstruct list_head list;\n\tstruct hlist_node t_hash;\n\tspinlock_t it_lock;\n\tconst struct k_clock *kclock;\n\tclockid_t it_clock;\n\ttimer_t it_id;\n\tint it_active;\n\ts64 it_overrun;\n\ts64 it_overrun_last;\n\tint it_requeue_pending;\n\tint it_sigev_notify;\n\tktime_t it_interval;\n\tstruct signal_struct *it_signal;\n\tunion {\n\t\tstruct pid *it_pid;\n\t\tstruct task_struct *it_process;\n\t};\n\tstruct sigqueue *sigq;\n\tunion {\n\t\tstruct {\n\t\t\tstruct hrtimer timer;\n\t\t} real;\n\t\tstruct cpu_timer cpu;\n\t\tstruct {\n\t\t\tstruct alarm alarmtimer;\n\t\t} alarm;\n\t} it;\n\tstruct callback_head rcu;\n};\n\ntypedef void __signalfn_t(int);\n\ntypedef __signalfn_t *__sighandler_t;\n\ntypedef void __restorefn_t(void);\n\ntypedef __restorefn_t *__sigrestore_t;\n\nstruct sigaction {\n\t__sighandler_t sa_handler;\n\tlong unsigned int sa_flags;\n\t__sigrestore_t sa_restorer;\n\tsigset_t sa_mask;\n};\n\nstruct k_sigaction {\n\tstruct sigaction sa;\n};\n\nstruct kallsym_iter {\n\tloff_t pos;\n\tloff_t pos_mod_end;\n\tloff_t pos_ftrace_mod_end;\n\tloff_t pos_bpf_end;\n\tlong unsigned int value;\n\tunsigned int nameoff;\n\tchar type;\n\tchar name[512];\n\tchar module_name[56];\n\tint exported;\n\tint show_value;\n};\n\nstruct kallsyms_data {\n\tlong unsigned int *addrs;\n\tconst char **syms;\n\tsize_t cnt;\n\tsize_t found;\n};\n\nstruct karatsuba_ctx {\n\tstruct karatsuba_ctx *next;\n\tmpi_ptr_t tspace;\n\tmpi_size_t tspace_size;\n\tmpi_ptr_t tp;\n\tmpi_size_t tp_size;\n};\n\nstruct kaslr_memory_region {\n\tlong unsigned int *base;\n\tlong unsigned int *end;\n\tlong unsigned int size_tb;\n};\n\nstruct led_classdev;\n\nstruct led_hw_trigger_type;\n\nstruct led_trigger {\n\tconst char *name;\n\tint (*activate)(struct led_classdev *);\n\tvoid (*deactivate)(struct led_classdev *);\n\tenum led_brightness brightness;\n\tstruct led_hw_trigger_type *trigger_type;\n\tspinlock_t leddev_list_lock;\n\tstruct list_head led_cdevs;\n\tstruct list_head next_trig;\n\tconst struct attribute_group **groups;\n};\n\nstruct kbd_led_trigger {\n\tstruct led_trigger trigger;\n\tunsigned int mask;\n};\n\nstruct kbd_repeat {\n\tint delay;\n\tint period;\n};\n\nstruct kbd_struct {\n\tunsigned char lockstate;\n\tunsigned char slockstate;\n\tunsigned char ledmode: 1;\n\tunsigned char ledflagstate: 4;\n\tchar: 3;\n\tunsigned char default_ledflagstate: 4;\n\tunsigned char kbdmode: 3;\n\tint: 1;\n\tunsigned char modeflags: 5;\n};\n\nstruct kbdiacr {\n\tunsigned char diacr;\n\tunsigned char base;\n\tunsigned char result;\n};\n\nstruct kbdiacrs {\n\tunsigned int kb_cnt;\n\tstruct kbdiacr kbdiacr[256];\n};\n\nstruct kbdiacruc {\n\tunsigned int diacr;\n\tunsigned int base;\n\tunsigned int result;\n};\n\nstruct kbdiacrsuc {\n\tunsigned int kb_cnt;\n\tstruct kbdiacruc kbdiacruc[256];\n};\n\nstruct kbentry {\n\tunsigned char kb_table;\n\tunsigned char kb_index;\n\tshort unsigned int kb_value;\n};\n\nstruct kbkeycode {\n\tunsigned int scancode;\n\tunsigned int keycode;\n};\n\nstruct kbsentry {\n\tunsigned char kb_func;\n\tunsigned char kb_string[512];\n};\n\nstruct kcmp_epoll_slot {\n\t__u32 efd;\n\t__u32 tfd;\n\t__u32 toff;\n};\n\ntypedef void (*dm_kcopyd_notify_fn)(int, long unsigned int, void *);\n\nstruct kcopyd_job {\n\tstruct dm_kcopyd_client *kc;\n\tstruct list_head list;\n\tunsigned int flags;\n\tint read_err;\n\tlong unsigned int write_err;\n\tenum req_op op;\n\tstruct dm_io_region source;\n\tunsigned int num_dests;\n\tstruct dm_io_region dests[8];\n\tstruct page_list *pages;\n\tdm_kcopyd_notify_fn fn;\n\tvoid *context;\n\tstruct mutex lock;\n\tatomic_t sub_jobs;\n\tsector_t progress;\n\tsector_t write_offset;\n\tstruct kcopyd_job *master_job;\n};\n\nstruct kcore_list {\n\tstruct list_head list;\n\tlong unsigned int addr;\n\tsize_t size;\n\tint type;\n};\n\nstruct kcsan_scoped_access {};\n\nstruct kdb_macro {\n\tkdbtab_t cmd;\n\tstruct list_head statements;\n};\n\nstruct kdb_macro_statement {\n\tchar *statement;\n\tstruct list_head list_node;\n};\n\nstruct tcp4_ao_context {\n\t__be32 saddr;\n\t__be32 daddr;\n\t__be16 sport;\n\t__be16 dport;\n\t__be32 sisn;\n\t__be32 disn;\n};\n\nstruct kdf_input_block {\n\tu8 counter;\n\tu8 label[6];\n\tstruct tcp4_ao_context ctx;\n\t__be16 outlen;\n} __attribute__((packed));\n\nstruct tcp6_ao_context {\n\tstruct in6_addr saddr;\n\tstruct in6_addr daddr;\n\t__be16 sport;\n\t__be16 dport;\n\t__be32 sisn;\n\t__be32 disn;\n};\n\nstruct kdf_input_block___2 {\n\tu8 counter;\n\tu8 label[6];\n\tstruct tcp6_ao_context ctx;\n\t__be16 outlen;\n} __attribute__((packed));\n\nstruct kdf_testvec {\n\tunsigned char *key;\n\tsize_t keylen;\n\tunsigned char *ikm;\n\tsize_t ikmlen;\n\tstruct kvec info;\n\tunsigned char *expected;\n\tsize_t expectedlen;\n};\n\nstruct kern_ipc_perm {\n\tspinlock_t lock;\n\tbool deleted;\n\tint id;\n\tkey_t key;\n\tkuid_t uid;\n\tkgid_t gid;\n\tkuid_t cuid;\n\tkgid_t cgid;\n\tumode_t mode;\n\tlong unsigned int seq;\n\tvoid *security;\n\tstruct rhash_head khtnode;\n\tstruct callback_head rcu;\n\trefcount_t refcount;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct kernel_clone_args {\n\tu64 flags;\n\tint *pidfd;\n\tint *child_tid;\n\tint *parent_tid;\n\tconst char *name;\n\tint exit_signal;\n\tu32 kthread: 1;\n\tu32 io_thread: 1;\n\tu32 user_worker: 1;\n\tu32 no_files: 1;\n\tlong unsigned int stack;\n\tlong unsigned int stack_size;\n\tlong unsigned int tls;\n\tpid_t *set_tid;\n\tsize_t set_tid_size;\n\tint cgroup;\n\tint idle;\n\tint (*fn)(void *);\n\tvoid *fn_arg;\n\tstruct cgroup *cgrp;\n\tstruct css_set *cset;\n};\n\nstruct kernel_cpustat {\n\tu64 cpustat[11];\n};\n\nstruct kernel_ethtool_ringparam {\n\tu32 rx_buf_len;\n\tu8 tcp_data_split;\n\tu8 tx_push;\n\tu8 rx_push;\n\tu32 cqe_size;\n\tu32 tx_push_buf_len;\n\tu32 tx_push_buf_max_len;\n};\n\nstruct kernel_ethtool_ts_info {\n\tu32 cmd;\n\tu32 so_timestamping;\n\tint phc_index;\n\tenum hwtstamp_tx_types tx_types;\n\tenum hwtstamp_rx_filters rx_filters;\n};\n\nstruct kernel_hwtstamp_config {\n\tint flags;\n\tint tx_type;\n\tint rx_filter;\n\tstruct ifreq *ifr;\n\tbool copied_to_user;\n\tenum hwtstamp_source source;\n};\n\nstruct kernel_param_ops;\n\nstruct kparam_string;\n\nstruct kparam_array;\n\nstruct kernel_param {\n\tconst char *name;\n\tstruct module *mod;\n\tconst struct kernel_param_ops *ops;\n\tconst u16 perm;\n\ts8 level;\n\tu8 flags;\n\tunion {\n\t\tvoid *arg;\n\t\tconst struct kparam_string *str;\n\t\tconst struct kparam_array *arr;\n\t};\n};\n\nstruct kernel_param_ops {\n\tunsigned int flags;\n\tint (*set)(const char *, const struct kernel_param *);\n\tint (*get)(char *, const struct kernel_param *);\n\tvoid (*free)(void *);\n};\n\nstruct kernel_pkey_params {\n\tstruct key *key;\n\tconst char *encoding;\n\tconst char *hash_algo;\n\tchar *info;\n\t__u32 in_len;\n\tunion {\n\t\t__u32 out_len;\n\t\t__u32 in2_len;\n\t};\n\tenum kernel_pkey_operation op: 8;\n};\n\nstruct kernel_pkey_query {\n\t__u32 supported_ops;\n\t__u32 key_size;\n\t__u16 max_data_size;\n\t__u16 max_sig_size;\n\t__u16 max_enc_size;\n\t__u16 max_dec_size;\n};\n\nstruct kernel_siginfo {\n\tstruct {\n\t\tint si_signo;\n\t\tint si_errno;\n\t\tint si_code;\n\t\tunion __sifields _sifields;\n\t};\n};\n\nstruct kernel_stat {\n\tlong unsigned int irqs_sum;\n\tunsigned int softirqs[10];\n};\n\nstruct kernel_symbol {\n\tint value_offset;\n\tint name_offset;\n\tint namespace_offset;\n};\n\nstruct kernel_vm86_regs {\n\tstruct pt_regs pt;\n\tshort unsigned int es;\n\tshort unsigned int __esh;\n\tshort unsigned int ds;\n\tshort unsigned int __dsh;\n\tshort unsigned int fs;\n\tshort unsigned int __fsh;\n\tshort unsigned int gs;\n\tshort unsigned int __gsh;\n};\n\nstruct kernfs_open_node;\n\nstruct kernfs_elem_attr {\n\tconst struct kernfs_ops *ops;\n\tstruct kernfs_open_node *open;\n\tloff_t size;\n\tstruct kernfs_node *notify_next;\n};\n\nstruct kernfs_elem_dir {\n\tlong unsigned int subdirs;\n\tstruct rb_root children;\n\tstruct kernfs_root *root;\n\tlong unsigned int rev;\n};\n\nstruct kernfs_elem_symlink {\n\tstruct kernfs_node *target_kn;\n};\n\nstruct kernfs_global_locks {\n\tstruct mutex open_file_mutex[1024];\n};\n\nstruct simple_xattrs {\n\tstruct rb_root rb_root;\n\trwlock_t lock;\n};\n\nstruct kernfs_iattrs {\n\tkuid_t ia_uid;\n\tkgid_t ia_gid;\n\tstruct timespec64 ia_atime;\n\tstruct timespec64 ia_mtime;\n\tstruct timespec64 ia_ctime;\n\tstruct simple_xattrs xattrs;\n\tatomic_t nr_user_xattrs;\n\tatomic_t user_xattr_size;\n};\n\nstruct kernfs_node {\n\tatomic_t count;\n\tatomic_t active;\n\tstruct kernfs_node *parent;\n\tconst char *name;\n\tstruct rb_node rb;\n\tconst void *ns;\n\tunsigned int hash;\n\tshort unsigned int flags;\n\tumode_t mode;\n\tunion {\n\t\tstruct kernfs_elem_dir dir;\n\t\tstruct kernfs_elem_symlink symlink;\n\t\tstruct kernfs_elem_attr attr;\n\t};\n\tu64 id;\n\tvoid *priv;\n\tstruct kernfs_iattrs *iattr;\n\tstruct callback_head rcu;\n};\n\nstruct kernfs_open_file {\n\tstruct kernfs_node *kn;\n\tstruct file *file;\n\tstruct seq_file *seq_file;\n\tvoid *priv;\n\tstruct mutex mutex;\n\tstruct mutex prealloc_mutex;\n\tint event;\n\tstruct list_head list;\n\tchar *prealloc_buf;\n\tsize_t atomic_write_len;\n\tbool mmapped: 1;\n\tbool released: 1;\n\tconst struct vm_operations_struct *vm_ops;\n};\n\nstruct kernfs_open_node {\n\tstruct callback_head callback_head;\n\tatomic_t event;\n\twait_queue_head_t poll;\n\tstruct list_head files;\n\tunsigned int nr_mmapped;\n\tunsigned int nr_to_release;\n};\n\nstruct kernfs_ops {\n\tint (*open)(struct kernfs_open_file *);\n\tvoid (*release)(struct kernfs_open_file *);\n\tint (*seq_show)(struct seq_file *, void *);\n\tvoid * (*seq_start)(struct seq_file *, loff_t *);\n\tvoid * (*seq_next)(struct seq_file *, void *, loff_t *);\n\tvoid (*seq_stop)(struct seq_file *, void *);\n\tssize_t (*read)(struct kernfs_open_file *, char *, size_t, loff_t);\n\tsize_t atomic_write_len;\n\tbool prealloc;\n\tssize_t (*write)(struct kernfs_open_file *, char *, size_t, loff_t);\n\t__poll_t (*poll)(struct kernfs_open_file *, struct poll_table_struct *);\n\tint (*mmap)(struct kernfs_open_file *, struct vm_area_struct *);\n\tloff_t (*llseek)(struct kernfs_open_file *, loff_t, int);\n};\n\nstruct kernfs_syscall_ops;\n\nstruct kernfs_root {\n\tstruct kernfs_node *kn;\n\tunsigned int flags;\n\tstruct idr ino_idr;\n\tu32 last_id_lowbits;\n\tu32 id_highbits;\n\tstruct kernfs_syscall_ops *syscall_ops;\n\tstruct list_head supers;\n\twait_queue_head_t deactivate_waitq;\n\tstruct rw_semaphore kernfs_rwsem;\n\tstruct rw_semaphore kernfs_iattr_rwsem;\n\tstruct rw_semaphore kernfs_supers_rwsem;\n\tstruct callback_head rcu;\n};\n\nstruct kernfs_super_info {\n\tstruct super_block *sb;\n\tstruct kernfs_root *root;\n\tconst void *ns;\n\tstruct list_head node;\n};\n\nstruct kernfs_syscall_ops {\n\tint (*show_options)(struct seq_file *, struct kernfs_root *);\n\tint (*mkdir)(struct kernfs_node *, const char *, umode_t);\n\tint (*rmdir)(struct kernfs_node *);\n\tint (*rename)(struct kernfs_node *, struct kernfs_node *, const char *);\n\tint (*show_path)(struct seq_file *, struct kernfs_node *, struct kernfs_root *);\n};\n\nstruct kimage;\n\nstruct kexec_buf {\n\tstruct kimage *image;\n\tvoid *buffer;\n\tlong unsigned int bufsz;\n\tlong unsigned int mem;\n\tlong unsigned int memsz;\n\tlong unsigned int buf_align;\n\tlong unsigned int buf_min;\n\tlong unsigned int buf_max;\n\tbool top_down;\n};\n\nstruct kexec_entry64_regs {\n\tuint64_t rax;\n\tuint64_t rcx;\n\tuint64_t rdx;\n\tuint64_t rbx;\n\tuint64_t rsp;\n\tuint64_t rbp;\n\tuint64_t rsi;\n\tuint64_t rdi;\n\tuint64_t r8;\n\tuint64_t r9;\n\tuint64_t r10;\n\tuint64_t r11;\n\tuint64_t r12;\n\tuint64_t r13;\n\tuint64_t r14;\n\tuint64_t r15;\n\tuint64_t rip;\n};\n\ntypedef int kexec_probe_t(const char *, long unsigned int);\n\ntypedef void *kexec_load_t(struct kimage *, char *, long unsigned int, char *, long unsigned int, char *, long unsigned int);\n\ntypedef int kexec_cleanup_t(void *);\n\ntypedef int kexec_verify_sig_t(const char *, long unsigned int);\n\nstruct kexec_file_ops {\n\tkexec_probe_t *probe;\n\tkexec_load_t *load;\n\tkexec_cleanup_t *cleanup;\n\tkexec_verify_sig_t *verify_sig;\n};\n\nstruct kexec_load_limit {\n\tstruct mutex mutex;\n\tint limit;\n};\n\nstruct kexec_segment {\n\tunion {\n\t\tvoid *buf;\n\t\tvoid *kbuf;\n\t};\n\tsize_t bufsz;\n\tlong unsigned int mem;\n\tsize_t memsz;\n};\n\nstruct kexec_sha_region {\n\tlong unsigned int start;\n\tlong unsigned int len;\n};\n\nstruct key_type;\n\nstruct key_tag;\n\nstruct keyring_index_key {\n\tlong unsigned int hash;\n\tunion {\n\t\tstruct {\n\t\t\tu16 desc_len;\n\t\t\tchar desc[6];\n\t\t};\n\t\tlong unsigned int x;\n\t};\n\tstruct key_type *type;\n\tstruct key_tag *domain_tag;\n\tconst char *description;\n};\n\nunion key_payload {\n\tvoid *rcu_data0;\n\tvoid *data[4];\n};\n\nstruct watch_list;\n\nstruct key_user;\n\nstruct key_restriction;\n\nstruct key {\n\trefcount_t usage;\n\tkey_serial_t serial;\n\tunion {\n\t\tstruct list_head graveyard_link;\n\t\tstruct rb_node serial_node;\n\t};\n\tstruct watch_list *watchers;\n\tstruct rw_semaphore sem;\n\tstruct key_user *user;\n\tvoid *security;\n\tunion {\n\t\ttime64_t expiry;\n\t\ttime64_t revoked_at;\n\t};\n\ttime64_t last_used_at;\n\tkuid_t uid;\n\tkgid_t gid;\n\tkey_perm_t perm;\n\tshort unsigned int quotalen;\n\tshort unsigned int datalen;\n\tshort int state;\n\tlong unsigned int flags;\n\tunion {\n\t\tstruct keyring_index_key index_key;\n\t\tstruct {\n\t\t\tlong unsigned int hash;\n\t\t\tlong unsigned int len_desc;\n\t\t\tstruct key_type *type;\n\t\t\tstruct key_tag *domain_tag;\n\t\t\tchar *description;\n\t\t};\n\t};\n\tunion {\n\t\tunion key_payload payload;\n\t\tstruct {\n\t\t\tstruct list_head name_link;\n\t\t\tstruct assoc_array keys;\n\t\t};\n\t};\n\tstruct key_restriction *restrict_link;\n};\n\nstruct key_match_data {\n\tbool (*cmp)(const struct key *, const struct key_match_data *);\n\tconst void *raw_data;\n\tvoid *preparsed;\n\tunsigned int lookup_type;\n};\n\nstruct watch_notification {\n\t__u32 type: 24;\n\t__u32 subtype: 8;\n\t__u32 info;\n};\n\nstruct key_notification {\n\tstruct watch_notification watch;\n\t__u32 key_id;\n\t__u32 aux;\n};\n\nstruct key_params {\n\tconst u8 *key;\n\tconst u8 *seq;\n\tint key_len;\n\tint seq_len;\n\tu16 vlan_id;\n\tu32 cipher;\n\tenum nl80211_key_mode mode;\n};\n\nstruct key_preparsed_payload {\n\tconst char *orig_description;\n\tchar *description;\n\tunion key_payload payload;\n\tconst void *data;\n\tsize_t datalen;\n\tsize_t quotalen;\n\ttime64_t expiry;\n};\n\ntypedef int (*key_restrict_link_func_t)(struct key *, const struct key_type *, const union key_payload *, struct key *);\n\nstruct key_restriction {\n\tkey_restrict_link_func_t check;\n\tstruct key *key;\n\tstruct key_type *keytype;\n};\n\nstruct key_security_struct {\n\tu32 sid;\n};\n\nstruct key_tag {\n\tstruct callback_head rcu;\n\trefcount_t usage;\n\tbool removed;\n};\n\ntypedef int (*request_key_actor_t)(struct key *, void *);\n\nstruct key_type {\n\tconst char *name;\n\tsize_t def_datalen;\n\tunsigned int flags;\n\tint (*vet_description)(const char *);\n\tint (*preparse)(struct key_preparsed_payload *);\n\tvoid (*free_preparse)(struct key_preparsed_payload *);\n\tint (*instantiate)(struct key *, struct key_preparsed_payload *);\n\tint (*update)(struct key *, struct key_preparsed_payload *);\n\tint (*match_preparse)(struct key_match_data *);\n\tvoid (*match_free)(struct key_match_data *);\n\tvoid (*revoke)(struct key *);\n\tvoid (*destroy)(struct key *);\n\tvoid (*describe)(const struct key *, struct seq_file *);\n\tlong int (*read)(const struct key *, char *, size_t);\n\trequest_key_actor_t request_key;\n\tstruct key_restriction * (*lookup_restriction)(const char *);\n\tint (*asym_query)(const struct kernel_pkey_params *, struct kernel_pkey_query *);\n\tint (*asym_eds_op)(struct kernel_pkey_params *, const void *, void *);\n\tint (*asym_verify_signature)(struct kernel_pkey_params *, const void *, const void *);\n\tstruct list_head link;\n\tstruct lock_class_key lock_class;\n};\n\nstruct key_user {\n\tstruct rb_node node;\n\tstruct mutex cons_lock;\n\tspinlock_t lock;\n\trefcount_t usage;\n\tatomic_t nkeys;\n\tatomic_t nikeys;\n\tkuid_t uid;\n\tint qnkeys;\n\tint qnbytes;\n};\n\nstruct key_vector {\n\tt_key key;\n\tunsigned char pos;\n\tunsigned char bits;\n\tunsigned char slen;\n\tunion {\n\t\tstruct hlist_head leaf;\n\t\tstruct {\n\t\t\tstruct {} __empty_tnode;\n\t\t\tstruct key_vector *tnode[0];\n\t\t};\n\t};\n};\n\nstruct keyboard_notifier_param {\n\tstruct vc_data *vc;\n\tint down;\n\tint shift;\n\tint ledstate;\n\tunsigned int value;\n};\n\nstruct keyctl_dh_params {\n\tunion {\n\t\t__s32 private;\n\t\t__s32 priv;\n\t};\n\t__s32 prime;\n\t__s32 base;\n};\n\nstruct keyctl_kdf_params {\n\tchar *hashname;\n\tchar *otherinfo;\n\t__u32 otherinfolen;\n\t__u32 __spare[8];\n};\n\nstruct keyctl_pkey_params {\n\t__s32 key_id;\n\t__u32 in_len;\n\tunion {\n\t\t__u32 out_len;\n\t\t__u32 in2_len;\n\t};\n\t__u32 __spare[7];\n};\n\nstruct keyctl_pkey_query {\n\t__u32 supported_ops;\n\t__u32 key_size;\n\t__u16 max_data_size;\n\t__u16 max_sig_size;\n\t__u16 max_enc_size;\n\t__u16 max_dec_size;\n\t__u32 __spare[10];\n};\n\nstruct keyring_read_iterator_context {\n\tsize_t buflen;\n\tsize_t count;\n\tkey_serial_t *buffer;\n};\n\nstruct __key_reference_with_attributes;\n\ntypedef struct __key_reference_with_attributes *key_ref_t;\n\nstruct keyring_search_context {\n\tstruct keyring_index_key index_key;\n\tconst struct cred *cred;\n\tstruct key_match_data match_data;\n\tunsigned int flags;\n\tint (*iterator)(const void *, void *);\n\tint skipped_ret;\n\tbool possessed;\n\tkey_ref_t result;\n\ttime64_t now;\n};\n\nstruct kfence_track {\n\tpid_t pid;\n\tint cpu;\n\tu64 ts_nsec;\n\tint num_stack_entries;\n\tlong unsigned int stack_entries[64];\n};\n\nstruct slabobj_ext {\n\tstruct obj_cgroup *objcg;\n};\n\nstruct kfence_metadata {\n\tstruct list_head list;\n\tstruct callback_head callback_head;\n\traw_spinlock_t lock;\n\tenum kfence_object_state state;\n\tlong unsigned int addr;\n\tsize_t size;\n\tstruct kmem_cache *cache;\n\tlong unsigned int unprotected_page;\n\tstruct kfence_track alloc_track;\n\tstruct kfence_track free_track;\n\tu32 alloc_stack_hash;\n\tstruct slabobj_ext obj_exts;\n};\n\nstruct rcu_gp_oldstate {\n\tlong unsigned int rgos_norm;\n\tlong unsigned int rgos_exp;\n};\n\nstruct kfree_rcu_cpu;\n\nstruct kfree_rcu_cpu_work {\n\tstruct rcu_work rcu_work;\n\tstruct callback_head *head_free;\n\tstruct rcu_gp_oldstate head_free_gp_snap;\n\tstruct list_head bulk_head_free[2];\n\tstruct kfree_rcu_cpu *krcp;\n};\n\nstruct kfree_rcu_cpu {\n\tstruct callback_head *head;\n\tlong unsigned int head_gp_snap;\n\tatomic_t head_count;\n\tstruct list_head bulk_head[2];\n\tatomic_t bulk_count[2];\n\tstruct kfree_rcu_cpu_work krw_arr[2];\n\traw_spinlock_t lock;\n\tstruct delayed_work monitor_work;\n\tbool initialized;\n\tstruct delayed_work page_cache_work;\n\tatomic_t backoff_page_cache_fill;\n\tatomic_t work_in_progress;\n\tstruct hrtimer hrtimer;\n\tstruct llist_head bkvcache;\n\tint nr_bkv_objs;\n};\n\nstruct kgdb_arch {\n\tunsigned char gdb_bpt_instr[1];\n\tlong unsigned int flags;\n\tint (*set_breakpoint)(long unsigned int, char *);\n\tint (*remove_breakpoint)(long unsigned int, char *);\n\tint (*set_hw_breakpoint)(long unsigned int, int, enum kgdb_bptype);\n\tint (*remove_hw_breakpoint)(long unsigned int, int, enum kgdb_bptype);\n\tvoid (*disable_hw_break)(struct pt_regs *);\n\tvoid (*remove_all_hw_break)(void);\n\tvoid (*correct_hw_break)(void);\n\tvoid (*enable_nmi)(bool);\n};\n\nstruct kgdb_bkpt {\n\tlong unsigned int bpt_addr;\n\tunsigned char saved_instr[1];\n\tenum kgdb_bptype type;\n\tenum kgdb_bpstate state;\n};\n\nstruct kgdb_io {\n\tconst char *name;\n\tint (*read_char)(void);\n\tvoid (*write_char)(u8);\n\tvoid (*flush)(void);\n\tint (*init)(void);\n\tvoid (*deinit)(void);\n\tvoid (*pre_exception)(void);\n\tvoid (*post_exception)(void);\n\tstruct console *cons;\n};\n\nstruct kgdb_nmi_tty_priv {\n\tstruct tty_port port;\n\tstruct timer_list timer;\n\tstruct {\n\t\tunion {\n\t\t\tstruct __kfifo kfifo;\n\t\t\tchar *type;\n\t\t\tconst char *const_type;\n\t\t\tchar (*rectype)[0];\n\t\t\tchar *ptr;\n\t\t\tconst char *ptr_const;\n\t\t};\n\t\tchar buf[16];\n\t} fifo;\n};\n\nstruct kgdb_state {\n\tint ex_vector;\n\tint signo;\n\tint err_code;\n\tint cpu;\n\tint pass_exception;\n\tlong unsigned int thr_query;\n\tlong unsigned int threadid;\n\tlong int kgdb_usethreadid;\n\tstruct pt_regs *linux_regs;\n\tatomic_t *send_ready;\n};\n\nstruct mm_slot {\n\tstruct hlist_node hash;\n\tstruct list_head mm_node;\n\tstruct mm_struct *mm;\n};\n\nstruct khugepaged_mm_slot {\n\tstruct mm_slot slot;\n};\n\nstruct khugepaged_scan {\n\tstruct list_head mm_head;\n\tstruct khugepaged_mm_slot *mm_slot;\n\tlong unsigned int address;\n};\n\nstruct kimage_arch {\n\tp4d_t *p4d;\n\tpud_t *pud;\n\tpmd_t *pmd;\n\tpte_t *pte;\n};\n\nstruct purgatory_info {\n\tconst Elf64_Ehdr *ehdr;\n\tElf64_Shdr *sechdrs;\n\tvoid *purgatory_buf;\n};\n\nstruct kimage {\n\tkimage_entry_t head;\n\tkimage_entry_t *entry;\n\tkimage_entry_t *last_entry;\n\tlong unsigned int start;\n\tstruct page *control_code_page;\n\tstruct page *swap_page;\n\tvoid *vmcoreinfo_data_copy;\n\tlong unsigned int nr_segments;\n\tstruct kexec_segment segment[16];\n\tstruct list_head control_pages;\n\tstruct list_head dest_pages;\n\tstruct list_head unusable_pages;\n\tlong unsigned int control_page;\n\tunsigned int type: 1;\n\tunsigned int preserve_context: 1;\n\tunsigned int file_mode: 1;\n\tunsigned int hotplug_support: 1;\n\tstruct kimage_arch arch;\n\tvoid *kernel_buf;\n\tlong unsigned int kernel_buf_len;\n\tvoid *initrd_buf;\n\tlong unsigned int initrd_buf_len;\n\tchar *cmdline_buf;\n\tlong unsigned int cmdline_buf_len;\n\tconst struct kexec_file_ops *fops;\n\tvoid *image_loader_data;\n\tstruct purgatory_info purgatory_info;\n\tint hp_action;\n\tint elfcorehdr_index;\n\tbool elfcorehdr_updated;\n\tvoid *ima_buffer;\n\tphys_addr_t ima_buffer_addr;\n\tsize_t ima_buffer_size;\n\tvoid *elf_headers;\n\tlong unsigned int elf_headers_sz;\n\tlong unsigned int elf_load_addr;\n};\n\nstruct kioctx_cpu;\n\nstruct kioctx {\n\tstruct percpu_ref users;\n\tatomic_t dead;\n\tstruct percpu_ref reqs;\n\tlong unsigned int user_id;\n\tstruct kioctx_cpu *cpu;\n\tunsigned int req_batch;\n\tunsigned int max_reqs;\n\tunsigned int nr_events;\n\tlong unsigned int mmap_base;\n\tlong unsigned int mmap_size;\n\tstruct folio **ring_folios;\n\tlong int nr_pages;\n\tstruct rcu_work free_rwork;\n\tstruct ctx_rq_wait *rq_wait;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tstruct {\n\t\tatomic_t reqs_available;\n\t\tlong: 64;\n\t\tlong: 64;\n\t\tlong: 64;\n\t\tlong: 64;\n\t\tlong: 64;\n\t\tlong: 64;\n\t\tlong: 64;\n\t};\n\tstruct {\n\t\tspinlock_t ctx_lock;\n\t\tstruct list_head active_reqs;\n\t\tlong: 64;\n\t\tlong: 64;\n\t\tlong: 64;\n\t\tlong: 64;\n\t\tlong: 64;\n\t};\n\tstruct {\n\t\tstruct mutex ring_lock;\n\t\twait_queue_head_t wait;\n\t\tlong: 64;\n\t};\n\tstruct {\n\t\tunsigned int tail;\n\t\tunsigned int completed_events;\n\t\tspinlock_t completion_lock;\n\t\tlong: 64;\n\t\tlong: 64;\n\t\tlong: 64;\n\t\tlong: 64;\n\t\tlong: 64;\n\t\tlong: 64;\n\t};\n\tstruct folio *internal_folios[8];\n\tstruct file *aio_ring_file;\n\tunsigned int id;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct kioctx_cpu {\n\tunsigned int reqs_available;\n};\n\nstruct kioctx_table {\n\tstruct callback_head rcu;\n\tunsigned int nr;\n\tstruct kioctx *table[0];\n};\n\nstruct klist_waiter {\n\tstruct list_head list;\n\tstruct klist_node *node;\n\tstruct task_struct *process;\n\tint woken;\n};\n\nstruct klp_object;\n\nstruct klp_callbacks {\n\tint (*pre_patch)(struct klp_object *);\n\tvoid (*post_patch)(struct klp_object *);\n\tvoid (*pre_unpatch)(struct klp_object *);\n\tvoid (*post_unpatch)(struct klp_object *);\n\tbool post_unpatch_enabled;\n};\n\nstruct klp_find_arg {\n\tconst char *name;\n\tlong unsigned int addr;\n\tlong unsigned int count;\n\tlong unsigned int pos;\n};\n\nstruct klp_func {\n\tconst char *old_name;\n\tvoid *new_func;\n\tlong unsigned int old_sympos;\n\tvoid *old_func;\n\tstruct kobject kobj;\n\tstruct list_head node;\n\tstruct list_head stack_node;\n\tlong unsigned int old_size;\n\tlong unsigned int new_size;\n\tbool nop;\n\tbool patched;\n\tbool transition;\n};\n\nstruct klp_modinfo {\n\tElf64_Ehdr hdr;\n\tElf64_Shdr *sechdrs;\n\tchar *secstrings;\n\tunsigned int symndx;\n};\n\nstruct klp_object {\n\tconst char *name;\n\tstruct klp_func *funcs;\n\tstruct klp_callbacks callbacks;\n\tstruct kobject kobj;\n\tstruct list_head func_list;\n\tstruct list_head node;\n\tstruct module *mod;\n\tbool dynamic;\n\tbool patched;\n};\n\nstruct klp_ops {\n\tstruct list_head node;\n\tstruct list_head func_stack;\n\tstruct ftrace_ops fops;\n};\n\nstruct klp_state;\n\nstruct klp_patch {\n\tstruct module *mod;\n\tstruct klp_object *objs;\n\tstruct klp_state *states;\n\tbool replace;\n\tstruct list_head list;\n\tstruct kobject kobj;\n\tstruct list_head obj_list;\n\tbool enabled;\n\tbool forced;\n\tstruct work_struct free_work;\n\tstruct completion finish;\n};\n\nstruct klp_shadow {\n\tstruct hlist_node node;\n\tstruct callback_head callback_head;\n\tvoid *obj;\n\tlong unsigned int id;\n\tchar data[0];\n};\n\nstruct klp_state {\n\tlong unsigned int id;\n\tunsigned int version;\n\tvoid *data;\n};\n\nstruct km_event {\n\tunion {\n\t\tu32 hard;\n\t\tu32 proto;\n\t\tu32 byid;\n\t\tu32 aevent;\n\t\tu32 type;\n\t} data;\n\tu32 seq;\n\tu32 portid;\n\tu32 event;\n\tstruct net *net;\n};\n\nstruct kmalloc_info_struct {\n\tconst char *name[19];\n\tunsigned int size;\n};\n\nstruct kmalloced_param {\n\tstruct list_head list;\n\tchar val[0];\n};\n\nstruct kmap_ctrl {};\n\ntypedef struct kmem_cache *kmem_buckets[14];\n\nstruct reciprocal_value {\n\tu32 m;\n\tu8 sh1;\n\tu8 sh2;\n};\n\nstruct kmem_cache_order_objects {\n\tunsigned int x;\n};\n\nstruct kmem_cache_cpu;\n\nstruct kmem_cache_node;\n\nstruct kmem_cache {\n\tstruct kmem_cache_cpu *cpu_slab;\n\tslab_flags_t flags;\n\tlong unsigned int min_partial;\n\tunsigned int size;\n\tunsigned int object_size;\n\tstruct reciprocal_value reciprocal_size;\n\tunsigned int offset;\n\tunsigned int cpu_partial;\n\tunsigned int cpu_partial_slabs;\n\tstruct kmem_cache_order_objects oo;\n\tstruct kmem_cache_order_objects min;\n\tgfp_t allocflags;\n\tint refcount;\n\tvoid (*ctor)(void *);\n\tunsigned int inuse;\n\tunsigned int align;\n\tunsigned int red_left_pad;\n\tconst char *name;\n\tstruct list_head list;\n\tstruct kobject kobj;\n\tlong unsigned int random;\n\tunsigned int remote_node_defrag_ratio;\n\tunsigned int *random_seq;\n\tunsigned int useroffset;\n\tunsigned int usersize;\n\tstruct kmem_cache_node *node[1024];\n};\n\nstruct kmem_cache_cpu {\n\tunion {\n\t\tstruct {\n\t\t\tvoid **freelist;\n\t\t\tlong unsigned int tid;\n\t\t};\n\t\tfreelist_aba_t freelist_tid;\n\t};\n\tstruct slab *slab;\n\tstruct slab *partial;\n\tlocal_lock_t lock;\n};\n\nstruct kmem_cache_node {\n\tspinlock_t list_lock;\n\tlong unsigned int nr_partial;\n\tstruct list_head partial;\n\tatomic_long_t nr_slabs;\n\tatomic_long_t total_objects;\n\tstruct list_head full;\n};\n\nstruct kmem_obj_info {\n\tvoid *kp_ptr;\n\tstruct slab *kp_slab;\n\tvoid *kp_objp;\n\tlong unsigned int kp_data_offset;\n\tstruct kmem_cache *kp_slab_cache;\n\tvoid *kp_ret;\n\tvoid *kp_stack[16];\n\tvoid *kp_free_stack[16];\n};\n\nstruct kmmio_fault_page;\n\nstruct kmmio_probe;\n\nstruct kmmio_context {\n\tstruct kmmio_fault_page *fpage;\n\tstruct kmmio_probe *probe;\n\tlong unsigned int saved_flags;\n\tlong unsigned int addr;\n\tint active;\n};\n\nstruct kmmio_delayed_release {\n\tstruct callback_head rcu;\n\tstruct kmmio_fault_page *release_list;\n};\n\nstruct kmmio_fault_page {\n\tstruct list_head list;\n\tstruct kmmio_fault_page *release_next;\n\tlong unsigned int addr;\n\tpteval_t old_presence;\n\tbool armed;\n\tint count;\n\tbool scheduled_for_release;\n};\n\ntypedef void (*kmmio_pre_handler_t)(struct kmmio_probe *, struct pt_regs *, long unsigned int);\n\ntypedef void (*kmmio_post_handler_t)(struct kmmio_probe *, long unsigned int, struct pt_regs *);\n\nstruct kmmio_probe {\n\tstruct list_head list;\n\tlong unsigned int addr;\n\tlong unsigned int len;\n\tkmmio_pre_handler_t pre_handler;\n\tkmmio_post_handler_t post_handler;\n\tvoid *private;\n};\n\nstruct kmsg_dump_iter {\n\tu64 cur_seq;\n\tu64 next_seq;\n};\n\nstruct probe;\n\nstruct kobj_map {\n\tstruct probe *probes[255];\n\tstruct mutex *lock;\n};\n\nstruct kobj_ns_type_operations {\n\tenum kobj_ns_type type;\n\tbool (*current_may_mount)(void);\n\tvoid * (*grab_current_ns)(void);\n\tconst void * (*netlink_ns)(struct sock *);\n\tconst void * (*initial_ns)(void);\n\tvoid (*drop_ns)(void *);\n};\n\nstruct kparam_array {\n\tunsigned int max;\n\tunsigned int elemsize;\n\tunsigned int *num;\n\tconst struct kernel_param_ops *ops;\n\tvoid *elem;\n};\n\nstruct kparam_string {\n\tunsigned int maxlen;\n\tchar *string;\n};\n\nstruct kpp_request;\n\nstruct kpp_alg {\n\tint (*set_secret)(struct crypto_kpp *, const void *, unsigned int);\n\tint (*generate_public_key)(struct kpp_request *);\n\tint (*compute_shared_secret)(struct kpp_request *);\n\tunsigned int (*max_size)(struct crypto_kpp *);\n\tint (*init)(struct crypto_kpp *);\n\tvoid (*exit)(struct crypto_kpp *);\n\tstruct crypto_alg base;\n};\n\nstruct kpp_instance {\n\tvoid (*free)(struct kpp_instance *);\n\tunion {\n\t\tstruct {\n\t\t\tchar head[48];\n\t\t\tstruct crypto_instance base;\n\t\t} s;\n\t\tstruct kpp_alg alg;\n\t};\n};\n\nstruct kpp_request {\n\tstruct crypto_async_request base;\n\tstruct scatterlist *src;\n\tstruct scatterlist *dst;\n\tunsigned int src_len;\n\tunsigned int dst_len;\n\tvoid *__ctx[0];\n};\n\nstruct kpp_secret {\n\tshort unsigned int type;\n\tshort unsigned int len;\n};\n\ntypedef int (*kprobe_pre_handler_t)(struct kprobe *, struct pt_regs *);\n\ntypedef void (*kprobe_post_handler_t)(struct kprobe *, struct pt_regs *, long unsigned int);\n\nstruct kprobe {\n\tstruct hlist_node hlist;\n\tstruct list_head list;\n\tlong unsigned int nmissed;\n\tkprobe_opcode_t *addr;\n\tconst char *symbol_name;\n\tunsigned int offset;\n\tkprobe_pre_handler_t pre_handler;\n\tkprobe_post_handler_t post_handler;\n\tkprobe_opcode_t opcode;\n\tstruct arch_specific_insn ainsn;\n\tu32 flags;\n};\n\nstruct kprobe_blacklist_entry {\n\tstruct list_head list;\n\tlong unsigned int start_addr;\n\tlong unsigned int end_addr;\n};\n\nstruct prev_kprobe {\n\tstruct kprobe *kp;\n\tlong unsigned int status;\n\tlong unsigned int old_flags;\n\tlong unsigned int saved_flags;\n};\n\nstruct kprobe_ctlblk {\n\tlong unsigned int kprobe_status;\n\tlong unsigned int kprobe_old_flags;\n\tlong unsigned int kprobe_saved_flags;\n\tstruct prev_kprobe prev_kprobe;\n};\n\nstruct kprobe_insn_cache {\n\tstruct mutex mutex;\n\tvoid * (*alloc)(void);\n\tvoid (*free)(void *);\n\tconst char *sym;\n\tstruct list_head pages;\n\tsize_t insn_size;\n\tint nr_garbage;\n};\n\nstruct kprobe_insn_page {\n\tstruct list_head list;\n\tkprobe_opcode_t *insns;\n\tstruct kprobe_insn_cache *cache;\n\tint nused;\n\tint ngarbage;\n\tchar slot_used[0];\n};\n\nstruct kprobe_trace_entry_head {\n\tstruct trace_entry ent;\n\tlong unsigned int ip;\n};\n\nstruct kretprobe_instance;\n\ntypedef int (*kretprobe_handler_t)(struct kretprobe_instance *, struct pt_regs *);\n\nstruct kretprobe {\n\tstruct kprobe kp;\n\tkretprobe_handler_t handler;\n\tkretprobe_handler_t entry_handler;\n\tint maxactive;\n\tint nmissed;\n\tsize_t data_size;\n\tstruct rethook *rh;\n};\n\nstruct kretprobe_blackpoint {\n\tconst char *name;\n\tvoid *addr;\n};\n\nstruct kretprobe_instance {\n\tstruct rethook_node node;\n\tchar data[0];\n};\n\nstruct kretprobe_trace_entry_head {\n\tstruct trace_entry ent;\n\tlong unsigned int func;\n\tlong unsigned int ret_ip;\n};\n\nstruct kset_uevent_ops;\n\nstruct kset {\n\tstruct list_head list;\n\tspinlock_t list_lock;\n\tstruct kobject kobj;\n\tconst struct kset_uevent_ops *uevent_ops;\n};\n\nstruct kset_uevent_ops {\n\tint (* const filter)(const struct kobject *);\n\tconst char * (* const name)(const struct kobject *);\n\tint (* const uevent)(const struct kobject *, struct kobj_uevent_env *);\n};\n\nstruct ksignal {\n\tstruct k_sigaction ka;\n\tkernel_siginfo_t info;\n\tint sig;\n};\n\nstruct ksm_rmap_item;\n\nstruct ksm_mm_slot {\n\tstruct mm_slot slot;\n\tstruct ksm_rmap_item *rmap_list;\n};\n\nstruct ksm_stable_node;\n\nstruct ksm_rmap_item {\n\tstruct ksm_rmap_item *rmap_list;\n\tunion {\n\t\tstruct anon_vma *anon_vma;\n\t\tint nid;\n\t};\n\tstruct mm_struct *mm;\n\tlong unsigned int address;\n\tunsigned int oldchecksum;\n\trmap_age_t age;\n\trmap_age_t remaining_skips;\n\tunion {\n\t\tstruct rb_node node;\n\t\tstruct {\n\t\t\tstruct ksm_stable_node *head;\n\t\t\tstruct hlist_node hlist;\n\t\t};\n\t};\n};\n\nstruct ksm_scan {\n\tstruct ksm_mm_slot *mm_slot;\n\tlong unsigned int address;\n\tstruct ksm_rmap_item **rmap_list;\n\tlong unsigned int seqnr;\n};\n\nstruct ksm_stable_node {\n\tunion {\n\t\tstruct rb_node node;\n\t\tstruct {\n\t\t\tstruct list_head *head;\n\t\t\tstruct {\n\t\t\t\tstruct hlist_node hlist_dup;\n\t\t\t\tstruct list_head list;\n\t\t\t};\n\t\t};\n\t};\n\tstruct hlist_head hlist;\n\tunion {\n\t\tlong unsigned int kpfn;\n\t\tlong unsigned int chain_prune_time;\n\t};\n\tint rmap_hlist_len;\n\tint nid;\n};\n\nstruct kstat {\n\tu32 result_mask;\n\tumode_t mode;\n\tunsigned int nlink;\n\tuint32_t blksize;\n\tu64 attributes;\n\tu64 attributes_mask;\n\tu64 ino;\n\tdev_t dev;\n\tdev_t rdev;\n\tkuid_t uid;\n\tkgid_t gid;\n\tloff_t size;\n\tstruct timespec64 atime;\n\tstruct timespec64 mtime;\n\tstruct timespec64 ctime;\n\tstruct timespec64 btime;\n\tu64 blocks;\n\tu64 mnt_id;\n\tu32 dio_mem_align;\n\tu32 dio_offset_align;\n\tu64 change_cookie;\n\tu64 subvol;\n\tu32 atomic_write_unit_min;\n\tu32 atomic_write_unit_max;\n\tu32 atomic_write_segments_max;\n};\n\nstruct kstatfs {\n\tlong int f_type;\n\tlong int f_bsize;\n\tu64 f_blocks;\n\tu64 f_bfree;\n\tu64 f_bavail;\n\tu64 f_files;\n\tu64 f_ffree;\n\t__kernel_fsid_t f_fsid;\n\tlong int f_namelen;\n\tlong int f_frsize;\n\tlong int f_flags;\n\tlong int f_spare[4];\n};\n\nstruct statmount {\n\t__u32 size;\n\t__u32 mnt_opts;\n\t__u64 mask;\n\t__u32 sb_dev_major;\n\t__u32 sb_dev_minor;\n\t__u64 sb_magic;\n\t__u32 sb_flags;\n\t__u32 fs_type;\n\t__u64 mnt_id;\n\t__u64 mnt_parent_id;\n\t__u32 mnt_id_old;\n\t__u32 mnt_parent_id_old;\n\t__u64 mnt_attr;\n\t__u64 mnt_propagation;\n\t__u64 mnt_peer_group;\n\t__u64 mnt_master;\n\t__u64 propagate_from;\n\t__u32 mnt_root;\n\t__u32 mnt_point;\n\t__u64 mnt_ns_id;\n\t__u64 __spare2[49];\n\tchar str[0];\n};\n\nstruct seq_file {\n\tchar *buf;\n\tsize_t size;\n\tsize_t from;\n\tsize_t count;\n\tsize_t pad_until;\n\tloff_t index;\n\tloff_t read_pos;\n\tstruct mutex lock;\n\tconst struct seq_operations *op;\n\tint poll_event;\n\tconst struct file *file;\n\tvoid *private;\n};\n\nstruct kstatmount {\n\tstruct statmount *buf;\n\tsize_t bufsize;\n\tstruct vfsmount *mnt;\n\tu64 mask;\n\tstruct path root;\n\tstruct statmount sm;\n\tstruct seq_file seq;\n};\n\nstruct ktermios {\n\ttcflag_t c_iflag;\n\ttcflag_t c_oflag;\n\ttcflag_t c_cflag;\n\ttcflag_t c_lflag;\n\tcc_t c_line;\n\tcc_t c_cc[19];\n\tspeed_t c_ispeed;\n\tspeed_t c_ospeed;\n};\n\nstruct kthread {\n\tlong unsigned int flags;\n\tunsigned int cpu;\n\tint result;\n\tint (*threadfn)(void *);\n\tvoid *data;\n\tstruct completion parked;\n\tstruct completion exited;\n\tstruct cgroup_subsys_state *blkcg_css;\n\tchar *full_name;\n};\n\nstruct kthread_create_info {\n\tchar *full_name;\n\tint (*threadfn)(void *);\n\tvoid *data;\n\tint node;\n\tstruct task_struct *result;\n\tstruct completion *done;\n\tstruct list_head list;\n};\n\nstruct kthread_delayed_work {\n\tstruct kthread_work work;\n\tstruct timer_list timer;\n};\n\nstruct kthread_flush_work {\n\tstruct kthread_work work;\n\tstruct completion done;\n};\n\nstruct kthread_worker {\n\tunsigned int flags;\n\traw_spinlock_t lock;\n\tstruct list_head work_list;\n\tstruct list_head delayed_work_list;\n\tstruct task_struct *task;\n\tstruct kthread_work *current_work;\n};\n\nstruct ktime_timestamps {\n\tu64 mono;\n\tu64 boot;\n\tu64 real;\n};\n\nstruct kvfree_rcu_bulk_data {\n\tstruct list_head list;\n\tstruct rcu_gp_oldstate gp_snap;\n\tlong unsigned int nr_records;\n\tvoid *records[0];\n};\n\nstruct kvm_memslots {\n\tu64 generation;\n\tatomic_long_t last_used_slot;\n\tstruct rb_root_cached hva_tree;\n\tstruct rb_root gfn_tree;\n\tstruct hlist_head id_hash[128];\n\tint node_idx;\n};\n\nstruct kvm_vm_stat_generic {\n\tu64 remote_tlb_flush;\n\tu64 remote_tlb_flush_requests;\n};\n\nstruct kvm_vm_stat {\n\tstruct kvm_vm_stat_generic generic;\n\tu64 mmu_shadow_zapped;\n\tu64 mmu_pte_write;\n\tu64 mmu_pde_zapped;\n\tu64 mmu_flooded;\n\tu64 mmu_recycled;\n\tu64 mmu_cache_miss;\n\tu64 mmu_unsync;\n\tunion {\n\t\tstruct {\n\t\t\tatomic64_t pages_4k;\n\t\t\tatomic64_t pages_2m;\n\t\t\tatomic64_t pages_1g;\n\t\t};\n\t\tatomic64_t pages[3];\n\t};\n\tu64 nx_lpage_splits;\n\tu64 max_mmu_page_hash_collisions;\n\tu64 max_mmu_rmap_size;\n};\n\nstruct kvm_page_track_notifier_head {\n\tstruct srcu_struct track_srcu;\n\tstruct hlist_head track_notifier_list;\n};\n\nstruct kvm_pic;\n\nstruct kvm_ioapic;\n\nstruct kvm_pit;\n\nstruct kvm_xen_hvm_config {\n\t__u32 flags;\n\t__u32 msr;\n\t__u64 blob_addr_32;\n\t__u64 blob_addr_64;\n\t__u8 blob_size_32;\n\t__u8 blob_size_64;\n\t__u8 pad2[30];\n};\n\nstruct ms_hyperv_tsc_page {\n\tvolatile u32 tsc_sequence;\n\tu32 reserved1;\n\tvolatile u64 tsc_scale;\n\tvolatile s64 tsc_offset;\n};\n\nstruct kvm_hv_syndbg {\n\tstruct {\n\t\tu64 control;\n\t\tu64 status;\n\t\tu64 send_page;\n\t\tu64 recv_page;\n\t\tu64 pending_page;\n\t} control;\n\tu64 options;\n};\n\nstruct kvm_hv {\n\tstruct mutex hv_lock;\n\tu64 hv_guest_os_id;\n\tu64 hv_hypercall;\n\tu64 hv_tsc_page;\n\tenum hv_tsc_page_status hv_tsc_page_status;\n\tu64 hv_crash_param[5];\n\tu64 hv_crash_ctl;\n\tstruct ms_hyperv_tsc_page tsc_ref;\n\tstruct idr conn_to_evt;\n\tu64 hv_reenlightenment_control;\n\tu64 hv_tsc_emulation_control;\n\tu64 hv_tsc_emulation_status;\n\tu64 hv_invtsc_control;\n\tatomic_t num_mismatched_vp_indexes;\n\tunsigned int synic_auto_eoi_used;\n\tstruct kvm_hv_syndbg hv_syndbg;\n\tbool xsaves_xsavec_checked;\n};\n\nstruct kvm_xen {\n\tstruct mutex xen_lock;\n\tu32 xen_version;\n\tbool long_mode;\n\tbool runstate_update_flag;\n\tu8 upcall_vector;\n\tstruct gfn_to_pfn_cache shinfo_cache;\n\tstruct idr evtchn_ports;\n\tlong unsigned int poll_mask[64];\n};\n\nstruct kvm_mmu_memory_cache {\n\tgfp_t gfp_zero;\n\tgfp_t gfp_custom;\n\tu64 init_value;\n\tstruct kmem_cache *kmem_cache;\n\tint capacity;\n\tint nobjs;\n\tvoid **objects;\n};\n\nstruct kvm_apic_map;\n\nstruct kvm_x86_msr_filter;\n\nstruct kvm_x86_pmu_event_filter;\n\nstruct vhost_task;\n\nstruct kvm_arch {\n\tlong unsigned int n_used_mmu_pages;\n\tlong unsigned int n_requested_mmu_pages;\n\tlong unsigned int n_max_mmu_pages;\n\tunsigned int indirect_shadow_pages;\n\tu8 mmu_valid_gen;\n\tu8 vm_type;\n\tbool has_private_mem;\n\tbool has_protected_state;\n\tbool pre_fault_allowed;\n\tstruct hlist_head mmu_page_hash[4096];\n\tstruct list_head active_mmu_pages;\n\tstruct list_head zapped_obsolete_pages;\n\tstruct list_head possible_nx_huge_pages;\n\tstruct kvm_page_track_notifier_head track_notifier_head;\n\tspinlock_t mmu_unsync_pages_lock;\n\tu64 shadow_mmio_value;\n\tstruct iommu_domain *iommu_domain;\n\tbool iommu_noncoherent;\n\tatomic_t noncoherent_dma_count;\n\tatomic_t assigned_device_count;\n\tstruct kvm_pic *vpic;\n\tstruct kvm_ioapic *vioapic;\n\tstruct kvm_pit *vpit;\n\tatomic_t vapics_in_nmi_mode;\n\tstruct mutex apic_map_lock;\n\tstruct kvm_apic_map *apic_map;\n\tatomic_t apic_map_dirty;\n\tbool apic_access_memslot_enabled;\n\tbool apic_access_memslot_inhibited;\n\tstruct rw_semaphore apicv_update_lock;\n\tlong unsigned int apicv_inhibit_reasons;\n\tgpa_t wall_clock;\n\tbool mwait_in_guest;\n\tbool hlt_in_guest;\n\tbool pause_in_guest;\n\tbool cstate_in_guest;\n\tlong unsigned int irq_sources_bitmap;\n\ts64 kvmclock_offset;\n\traw_spinlock_t tsc_write_lock;\n\tu64 last_tsc_nsec;\n\tu64 last_tsc_write;\n\tu32 last_tsc_khz;\n\tu64 last_tsc_offset;\n\tu64 cur_tsc_nsec;\n\tu64 cur_tsc_write;\n\tu64 cur_tsc_offset;\n\tu64 cur_tsc_generation;\n\tint nr_vcpus_matched_tsc;\n\tu32 default_tsc_khz;\n\tbool user_set_tsc;\n\tu64 apic_bus_cycle_ns;\n\tseqcount_raw_spinlock_t pvclock_sc;\n\tbool use_master_clock;\n\tu64 master_kernel_ns;\n\tu64 master_cycle_now;\n\tstruct delayed_work kvmclock_update_work;\n\tstruct delayed_work kvmclock_sync_work;\n\tstruct kvm_xen_hvm_config xen_hvm_config;\n\tstruct hlist_head mask_notifier_list;\n\tstruct kvm_hv hyperv;\n\tstruct kvm_xen xen;\n\tbool backwards_tsc_observed;\n\tbool boot_vcpu_runs_old_kvmclock;\n\tu32 bsp_vcpu_id;\n\tu64 disabled_quirks;\n\tenum kvm_irqchip_mode irqchip_mode;\n\tu8 nr_reserved_ioapic_pins;\n\tbool disabled_lapic_found;\n\tbool x2apic_format;\n\tbool x2apic_broadcast_quirk_disabled;\n\tbool guest_can_read_msr_platform_info;\n\tbool exception_payload_enabled;\n\tbool triple_fault_event;\n\tbool bus_lock_detection_enabled;\n\tbool enable_pmu;\n\tu32 notify_window;\n\tu32 notify_vmexit_flags;\n\tbool exit_on_emulation_error;\n\tu32 user_space_msr_mask;\n\tstruct kvm_x86_msr_filter *msr_filter;\n\tu32 hypercall_exit_enabled;\n\tbool sgx_provisioning_allowed;\n\tstruct kvm_x86_pmu_event_filter *pmu_event_filter;\n\tstruct vhost_task *nx_huge_page_recovery_thread;\n\tu64 nx_huge_page_last;\n\tatomic64_t tdp_mmu_pages;\n\tstruct list_head tdp_mmu_roots;\n\tspinlock_t tdp_mmu_pages_lock;\n\tbool shadow_root_allocated;\n\tbool external_write_tracking_enabled;\n\thpa_t hv_root_tdp;\n\tspinlock_t hv_root_tdp_lock;\n\tstruct hv_partition_assist_pg *hv_pa_pg;\n\tu32 max_vcpu_ids;\n\tbool disable_nx_huge_pages;\n\tstruct kvm_mmu_memory_cache split_shadow_page_cache;\n\tstruct kvm_mmu_memory_cache split_page_header_cache;\n\tstruct kvm_mmu_memory_cache split_desc_cache;\n};\n\nstruct kvm_io_bus;\n\nstruct kvm_coalesced_mmio_ring;\n\nstruct kvm_irq_routing_table;\n\nstruct kvm_stat_data;\n\nstruct kvm {\n\trwlock_t mmu_lock;\n\tstruct mutex slots_lock;\n\tstruct mutex slots_arch_lock;\n\tstruct mm_struct *mm;\n\tlong unsigned int nr_memslot_pages;\n\tstruct kvm_memslots __memslots[4];\n\tstruct kvm_memslots *memslots[2];\n\tstruct xarray vcpu_array;\n\tatomic_t nr_memslots_dirty_logging;\n\tspinlock_t mn_invalidate_lock;\n\tlong unsigned int mn_active_invalidate_count;\n\tstruct rcuwait mn_memslots_update_rcuwait;\n\tspinlock_t gpc_lock;\n\tstruct list_head gpc_list;\n\tatomic_t online_vcpus;\n\tint max_vcpus;\n\tint created_vcpus;\n\tint last_boosted_vcpu;\n\tstruct list_head vm_list;\n\tstruct mutex lock;\n\tstruct kvm_io_bus *buses[4];\n\tstruct {\n\t\tspinlock_t lock;\n\t\tstruct list_head items;\n\t\tstruct list_head resampler_list;\n\t\tstruct mutex resampler_lock;\n\t} irqfds;\n\tstruct list_head ioeventfds;\n\tstruct kvm_vm_stat stat;\n\tstruct kvm_arch arch;\n\trefcount_t users_count;\n\tstruct kvm_coalesced_mmio_ring *coalesced_mmio_ring;\n\tspinlock_t ring_lock;\n\tstruct list_head coalesced_zones;\n\tstruct mutex irq_lock;\n\tstruct kvm_irq_routing_table *irq_routing;\n\tstruct hlist_head irq_ack_notifier_list;\n\tstruct mmu_notifier mmu_notifier;\n\tlong unsigned int mmu_invalidate_seq;\n\tlong int mmu_invalidate_in_progress;\n\tgfn_t mmu_invalidate_range_start;\n\tgfn_t mmu_invalidate_range_end;\n\tstruct list_head devices;\n\tu64 manual_dirty_log_protect;\n\tstruct dentry *debugfs_dentry;\n\tstruct kvm_stat_data **debugfs_stat_data;\n\tstruct srcu_struct srcu;\n\tstruct srcu_struct irq_srcu;\n\tpid_t userspace_pid;\n\tbool override_halt_poll_ns;\n\tunsigned int max_halt_poll_ns;\n\tu32 dirty_ring_size;\n\tbool dirty_ring_with_bitmap;\n\tbool vm_bugged;\n\tbool vm_dead;\n\tstruct notifier_block pm_notifier;\n\tstruct xarray mem_attr_array;\n\tchar stats_id[48];\n};\n\nstruct kvm_lapic;\n\nstruct kvm_apic_map {\n\tstruct callback_head rcu;\n\tenum kvm_apic_logical_mode logical_mode;\n\tu32 max_apic_id;\n\tunion {\n\t\tstruct kvm_lapic *xapic_flat_map[8];\n\t\tstruct kvm_lapic *xapic_cluster_map[64];\n\t};\n\tstruct kvm_lapic *phys_map[0];\n};\n\nstruct kvm_rmap_head;\n\nstruct kvm_lpage_info;\n\nstruct kvm_arch_memory_slot {\n\tstruct kvm_rmap_head *rmap[3];\n\tstruct kvm_lpage_info *lpage_info[2];\n\tshort unsigned int *gfn_write_track;\n};\n\nstruct kvm_coalesced_mmio {\n\t__u64 phys_addr;\n\t__u32 len;\n\tunion {\n\t\t__u32 pad;\n\t\t__u32 pio;\n\t};\n\t__u8 data[8];\n};\n\nstruct kvm_coalesced_mmio_ring {\n\t__u32 first;\n\t__u32 last;\n\tstruct kvm_coalesced_mmio coalesced_mmio[0];\n};\n\nunion kvm_mmu_page_role {\n\tu32 word;\n\tstruct {\n\t\tunsigned int level: 4;\n\t\tunsigned int has_4_byte_gpte: 1;\n\t\tunsigned int quadrant: 2;\n\t\tunsigned int direct: 1;\n\t\tunsigned int access: 3;\n\t\tunsigned int invalid: 1;\n\t\tunsigned int efer_nx: 1;\n\t\tunsigned int cr0_wp: 1;\n\t\tunsigned int smep_andnot_wp: 1;\n\t\tunsigned int smap_andnot_wp: 1;\n\t\tunsigned int ad_disabled: 1;\n\t\tunsigned int guest_mode: 1;\n\t\tunsigned int passthrough: 1;\n\t\tchar: 5;\n\t\tunsigned int smm: 8;\n\t};\n};\n\nunion kvm_mmu_extended_role {\n\tu32 word;\n\tstruct {\n\t\tunsigned int valid: 1;\n\t\tunsigned int execonly: 1;\n\t\tunsigned int cr4_pse: 1;\n\t\tunsigned int cr4_pke: 1;\n\t\tunsigned int cr4_smap: 1;\n\t\tunsigned int cr4_smep: 1;\n\t\tunsigned int cr4_la57: 1;\n\t\tunsigned int efer_lma: 1;\n\t};\n};\n\nunion kvm_cpu_role {\n\tu64 as_u64;\n\tstruct {\n\t\tunion kvm_mmu_page_role base;\n\t\tunion kvm_mmu_extended_role ext;\n\t};\n};\n\nstruct kvm_cpuid_entry2 {\n\t__u32 function;\n\t__u32 index;\n\t__u32 flags;\n\t__u32 eax;\n\t__u32 ebx;\n\t__u32 ecx;\n\t__u32 edx;\n\t__u32 padding[3];\n};\n\nstruct kvm_debug_exit_arch {\n\t__u32 exception;\n\t__u32 pad;\n\t__u64 pc;\n\t__u64 dr6;\n\t__u64 dr7;\n};\n\nstruct kvm_dirty_gfn {\n\t__u32 flags;\n\t__u32 slot;\n\t__u64 offset;\n};\n\nstruct kvm_dirty_ring {\n\tu32 dirty_index;\n\tu32 reset_index;\n\tu32 size;\n\tu32 soft_limit;\n\tstruct kvm_dirty_gfn *dirty_gfns;\n\tint index;\n};\n\nstruct kvm_dtable {\n\t__u64 base;\n\t__u16 limit;\n\t__u16 padding[3];\n};\n\nstruct kvm_enc_region {\n\t__u64 addr;\n\t__u64 size;\n};\n\nstruct kvm_hyperv_exit {\n\t__u32 type;\n\t__u32 pad1;\n\tunion {\n\t\tstruct {\n\t\t\t__u32 msr;\n\t\t\t__u32 pad2;\n\t\t\t__u64 control;\n\t\t\t__u64 evt_page;\n\t\t\t__u64 msg_page;\n\t\t} synic;\n\t\tstruct {\n\t\t\t__u64 input;\n\t\t\t__u64 result;\n\t\t\t__u64 params[2];\n\t\t} hcall;\n\t\tstruct {\n\t\t\t__u32 msr;\n\t\t\t__u32 pad2;\n\t\t\t__u64 control;\n\t\t\t__u64 status;\n\t\t\t__u64 send_page;\n\t\t\t__u64 recv_page;\n\t\t\t__u64 pending_page;\n\t\t} syndbg;\n\t} u;\n};\n\nstruct kvm_hypervisor_cpuid {\n\tu32 base;\n\tu32 limit;\n};\n\nstruct kvm_io_device;\n\nstruct kvm_io_range {\n\tgpa_t addr;\n\tint len;\n\tstruct kvm_io_device *dev;\n};\n\nstruct kvm_io_bus {\n\tint dev_count;\n\tint ioeventfd_count;\n\tstruct kvm_io_range range[0];\n};\n\nstruct kvm_irq_routing_table {\n\tint chip[72];\n\tu32 nr_rt_entries;\n\tstruct hlist_head map[0];\n};\n\nstruct kvm_lpage_info {\n\tint disallow_lpage;\n};\n\nstruct kvm_memory_slot {\n\tstruct hlist_node id_node[2];\n\tstruct interval_tree_node hva_node[2];\n\tstruct rb_node gfn_node[2];\n\tgfn_t base_gfn;\n\tlong unsigned int npages;\n\tlong unsigned int *dirty_bitmap;\n\tstruct kvm_arch_memory_slot arch;\n\tlong unsigned int userspace_addr;\n\tu32 flags;\n\tshort int id;\n\tu16 as_id;\n\tstruct {\n\t\tstruct file *file;\n\t\tlong unsigned int pgoff;\n\t} gmem;\n};\n\nstruct kvm_mmio_fragment {\n\tgpa_t gpa;\n\tvoid *data;\n\tunsigned int len;\n};\n\nstruct kvm_page_fault;\n\nstruct x86_exception;\n\nstruct kvm_mmu_page;\n\nstruct kvm_mmu_root_info {\n\tgpa_t pgd;\n\thpa_t hpa;\n};\n\nstruct rsvd_bits_validate {\n\tu64 rsvd_bits_mask[10];\n\tu64 bad_mt_xwr;\n};\n\nstruct kvm_vcpu;\n\nstruct kvm_mmu {\n\tlong unsigned int (*get_guest_pgd)(struct kvm_vcpu *);\n\tu64 (*get_pdptr)(struct kvm_vcpu *, int);\n\tint (*page_fault)(struct kvm_vcpu *, struct kvm_page_fault *);\n\tvoid (*inject_page_fault)(struct kvm_vcpu *, struct x86_exception *);\n\tgpa_t (*gva_to_gpa)(struct kvm_vcpu *, struct kvm_mmu *, gpa_t, u64, struct x86_exception *);\n\tint (*sync_spte)(struct kvm_vcpu *, struct kvm_mmu_page *, int);\n\tstruct kvm_mmu_root_info root;\n\tunion kvm_cpu_role cpu_role;\n\tunion kvm_mmu_page_role root_role;\n\tu32 pkru_mask;\n\tstruct kvm_mmu_root_info prev_roots[3];\n\tu8 permissions[16];\n\tu64 *pae_root;\n\tu64 *pml4_root;\n\tu64 *pml5_root;\n\tstruct rsvd_bits_validate shadow_zero_check;\n\tstruct rsvd_bits_validate guest_rsvd_check;\n\tu64 pdptrs[4];\n};\n\nstruct kvm_msr_entry {\n\t__u32 index;\n\t__u32 reserved;\n\t__u64 data;\n};\n\nstruct kvm_mtrr {\n\tu64 var[16];\n\tu64 fixed_64k;\n\tu64 fixed_16k[2];\n\tu64 fixed_4k[8];\n\tu64 deftype;\n};\n\nstruct kvm_vmx_nested_state_hdr {\n\t__u64 vmxon_pa;\n\t__u64 vmcs12_pa;\n\tstruct {\n\t\t__u16 flags;\n\t} smm;\n\t__u16 pad;\n\t__u32 flags;\n\t__u64 preemption_timer_deadline;\n};\n\nstruct kvm_svm_nested_state_hdr {\n\t__u64 vmcb_pa;\n};\n\nstruct kvm_vmx_nested_state_data {\n\t__u8 vmcs12[4096];\n\t__u8 shadow_vmcs12[4096];\n};\n\nstruct kvm_svm_nested_state_data {\n\t__u8 vmcb12[4096];\n};\n\nstruct kvm_nested_state {\n\t__u16 flags;\n\t__u16 format;\n\t__u32 size;\n\tunion {\n\t\tstruct kvm_vmx_nested_state_hdr vmx;\n\t\tstruct kvm_svm_nested_state_hdr svm;\n\t\t__u8 pad[120];\n\t} hdr;\n\tunion {\n\t\tstruct {\n\t\t\tstruct {} __empty_vmx;\n\t\t\tstruct kvm_vmx_nested_state_data vmx[0];\n\t\t};\n\t\tstruct {\n\t\t\tstruct {} __empty_svm;\n\t\t\tstruct kvm_svm_nested_state_data svm[0];\n\t\t};\n\t} data;\n};\n\nstruct kvm_pio_request {\n\tlong unsigned int linear_rip;\n\tlong unsigned int count;\n\tint in;\n\tint port;\n\tint size;\n};\n\nstruct kvm_pmc {\n\tenum pmc_type type;\n\tu8 idx;\n\tbool is_paused;\n\tbool intr;\n\tu64 counter;\n\tu64 emulated_counter;\n\tu64 eventsel;\n\tstruct perf_event *perf_event;\n\tstruct kvm_vcpu *vcpu;\n\tu64 current_config;\n};\n\nstruct kvm_pmu {\n\tu8 version;\n\tunsigned int nr_arch_gp_counters;\n\tunsigned int nr_arch_fixed_counters;\n\tunsigned int available_event_types;\n\tu64 fixed_ctr_ctrl;\n\tu64 fixed_ctr_ctrl_rsvd;\n\tu64 global_ctrl;\n\tu64 global_status;\n\tu64 counter_bitmask[2];\n\tu64 global_ctrl_rsvd;\n\tu64 global_status_rsvd;\n\tu64 reserved_bits;\n\tu64 raw_event_mask;\n\tstruct kvm_pmc gp_counters[8];\n\tstruct kvm_pmc fixed_counters[3];\n\tunion {\n\t\tlong unsigned int reprogram_pmi[1];\n\t\tatomic64_t __reprogram_pmi;\n\t};\n\tlong unsigned int all_valid_pmc_idx[1];\n\tlong unsigned int pmc_in_use[1];\n\tu64 ds_area;\n\tu64 pebs_enable;\n\tu64 pebs_enable_rsvd;\n\tu64 pebs_data_cfg;\n\tu64 pebs_data_cfg_rsvd;\n\tu64 host_cross_mapped_mask;\n\tbool need_cleanup;\n\tu8 event_count;\n};\n\nstruct kvm_queued_exception {\n\tbool pending;\n\tbool injected;\n\tbool has_error_code;\n\tu8 vector;\n\tu32 error_code;\n\tlong unsigned int payload;\n\tbool has_payload;\n};\n\nstruct kvm_queued_interrupt {\n\tbool injected;\n\tbool soft;\n\tu8 nr;\n};\n\nstruct kvm_regs {\n\t__u64 rax;\n\t__u64 rbx;\n\t__u64 rcx;\n\t__u64 rdx;\n\t__u64 rsi;\n\t__u64 rdi;\n\t__u64 rsp;\n\t__u64 rbp;\n\t__u64 r8;\n\t__u64 r9;\n\t__u64 r10;\n\t__u64 r11;\n\t__u64 r12;\n\t__u64 r13;\n\t__u64 r14;\n\t__u64 r15;\n\t__u64 rip;\n\t__u64 rflags;\n};\n\nstruct kvm_rmap_head {\n\tlong unsigned int val;\n};\n\nstruct kvm_xen_exit {\n\t__u32 type;\n\tunion {\n\t\tstruct {\n\t\t\t__u32 longmode;\n\t\t\t__u32 cpl;\n\t\t\t__u64 input;\n\t\t\t__u64 result;\n\t\t\t__u64 params[6];\n\t\t} hcall;\n\t} u;\n};\n\nstruct kvm_segment {\n\t__u64 base;\n\t__u32 limit;\n\t__u16 selector;\n\t__u8 type;\n\t__u8 present;\n\t__u8 dpl;\n\t__u8 db;\n\t__u8 s;\n\t__u8 l;\n\t__u8 g;\n\t__u8 avl;\n\t__u8 unusable;\n\t__u8 padding;\n};\n\nstruct kvm_sregs {\n\tstruct kvm_segment cs;\n\tstruct kvm_segment ds;\n\tstruct kvm_segment es;\n\tstruct kvm_segment fs;\n\tstruct kvm_segment gs;\n\tstruct kvm_segment ss;\n\tstruct kvm_segment tr;\n\tstruct kvm_segment ldt;\n\tstruct kvm_dtable gdt;\n\tstruct kvm_dtable idt;\n\t__u64 cr0;\n\t__u64 cr2;\n\t__u64 cr3;\n\t__u64 cr4;\n\t__u64 cr8;\n\t__u64 efer;\n\t__u64 apic_base;\n\t__u64 interrupt_bitmap[4];\n};\n\nstruct kvm_vcpu_events {\n\tstruct {\n\t\t__u8 injected;\n\t\t__u8 nr;\n\t\t__u8 has_error_code;\n\t\t__u8 pending;\n\t\t__u32 error_code;\n\t} exception;\n\tstruct {\n\t\t__u8 injected;\n\t\t__u8 nr;\n\t\t__u8 soft;\n\t\t__u8 shadow;\n\t} interrupt;\n\tstruct {\n\t\t__u8 injected;\n\t\t__u8 pending;\n\t\t__u8 masked;\n\t\t__u8 pad;\n\t} nmi;\n\t__u32 sipi_vector;\n\t__u32 flags;\n\tstruct {\n\t\t__u8 smm;\n\t\t__u8 pending;\n\t\t__u8 smm_inside_nmi;\n\t\t__u8 latched_init;\n\t} smi;\n\tstruct {\n\t\t__u8 pending;\n\t} triple_fault;\n\t__u8 reserved[26];\n\t__u8 exception_has_payload;\n\t__u64 exception_payload;\n};\n\nstruct kvm_sync_regs {\n\tstruct kvm_regs regs;\n\tstruct kvm_sregs sregs;\n\tstruct kvm_vcpu_events events;\n};\n\nstruct kvm_run {\n\t__u8 request_interrupt_window;\n\t__u8 immediate_exit__unsafe;\n\t__u8 padding1[6];\n\t__u32 exit_reason;\n\t__u8 ready_for_interrupt_injection;\n\t__u8 if_flag;\n\t__u16 flags;\n\t__u64 cr8;\n\t__u64 apic_base;\n\tunion {\n\t\tstruct {\n\t\t\t__u64 hardware_exit_reason;\n\t\t} hw;\n\t\tstruct {\n\t\t\t__u64 hardware_entry_failure_reason;\n\t\t\t__u32 cpu;\n\t\t} fail_entry;\n\t\tstruct {\n\t\t\t__u32 exception;\n\t\t\t__u32 error_code;\n\t\t} ex;\n\t\tstruct {\n\t\t\t__u8 direction;\n\t\t\t__u8 size;\n\t\t\t__u16 port;\n\t\t\t__u32 count;\n\t\t\t__u64 data_offset;\n\t\t} io;\n\t\tstruct {\n\t\t\tstruct kvm_debug_exit_arch arch;\n\t\t} debug;\n\t\tstruct {\n\t\t\t__u64 phys_addr;\n\t\t\t__u8 data[8];\n\t\t\t__u32 len;\n\t\t\t__u8 is_write;\n\t\t} mmio;\n\t\tstruct {\n\t\t\t__u64 phys_addr;\n\t\t\t__u8 data[8];\n\t\t\t__u32 len;\n\t\t\t__u8 is_write;\n\t\t} iocsr_io;\n\t\tstruct {\n\t\t\t__u64 nr;\n\t\t\t__u64 args[6];\n\t\t\t__u64 ret;\n\t\t\tunion {\n\t\t\t\t__u64 flags;\n\t\t\t};\n\t\t} hypercall;\n\t\tstruct {\n\t\t\t__u64 rip;\n\t\t\t__u32 is_write;\n\t\t\t__u32 pad;\n\t\t} tpr_access;\n\t\tstruct {\n\t\t\t__u8 icptcode;\n\t\t\t__u16 ipa;\n\t\t\t__u32 ipb;\n\t\t} s390_sieic;\n\t\t__u64 s390_reset_flags;\n\t\tstruct {\n\t\t\t__u64 trans_exc_code;\n\t\t\t__u32 pgm_code;\n\t\t} s390_ucontrol;\n\t\tstruct {\n\t\t\t__u32 dcrn;\n\t\t\t__u32 data;\n\t\t\t__u8 is_write;\n\t\t} dcr;\n\t\tstruct {\n\t\t\t__u32 suberror;\n\t\t\t__u32 ndata;\n\t\t\t__u64 data[16];\n\t\t} internal;\n\t\tstruct {\n\t\t\t__u32 suberror;\n\t\t\t__u32 ndata;\n\t\t\t__u64 flags;\n\t\t\tunion {\n\t\t\t\tstruct {\n\t\t\t\t\t__u8 insn_size;\n\t\t\t\t\t__u8 insn_bytes[15];\n\t\t\t\t};\n\t\t\t};\n\t\t} emulation_failure;\n\t\tstruct {\n\t\t\t__u64 gprs[32];\n\t\t} osi;\n\t\tstruct {\n\t\t\t__u64 nr;\n\t\t\t__u64 ret;\n\t\t\t__u64 args[9];\n\t\t} papr_hcall;\n\t\tstruct {\n\t\t\t__u16 subchannel_id;\n\t\t\t__u16 subchannel_nr;\n\t\t\t__u32 io_int_parm;\n\t\t\t__u32 io_int_word;\n\t\t\t__u32 ipb;\n\t\t\t__u8 dequeued;\n\t\t} s390_tsch;\n\t\tstruct {\n\t\t\t__u32 epr;\n\t\t} epr;\n\t\tstruct {\n\t\t\t__u32 type;\n\t\t\t__u32 ndata;\n\t\t\tunion {\n\t\t\t\t__u64 data[16];\n\t\t\t};\n\t\t} system_event;\n\t\tstruct {\n\t\t\t__u64 addr;\n\t\t\t__u8 ar;\n\t\t\t__u8 reserved;\n\t\t\t__u8 fc;\n\t\t\t__u8 sel1;\n\t\t\t__u16 sel2;\n\t\t} s390_stsi;\n\t\tstruct {\n\t\t\t__u8 vector;\n\t\t} eoi;\n\t\tstruct kvm_hyperv_exit hyperv;\n\t\tstruct {\n\t\t\t__u64 esr_iss;\n\t\t\t__u64 fault_ipa;\n\t\t} arm_nisv;\n\t\tstruct {\n\t\t\t__u8 error;\n\t\t\t__u8 pad[7];\n\t\t\t__u32 reason;\n\t\t\t__u32 index;\n\t\t\t__u64 data;\n\t\t} msr;\n\t\tstruct kvm_xen_exit xen;\n\t\tstruct {\n\t\t\tlong unsigned int extension_id;\n\t\t\tlong unsigned int function_id;\n\t\t\tlong unsigned int args[6];\n\t\t\tlong unsigned int ret[2];\n\t\t} riscv_sbi;\n\t\tstruct {\n\t\t\tlong unsigned int csr_num;\n\t\t\tlong unsigned int new_value;\n\t\t\tlong unsigned int write_mask;\n\t\t\tlong unsigned int ret_value;\n\t\t} riscv_csr;\n\t\tstruct {\n\t\t\t__u32 flags;\n\t\t} notify;\n\t\tstruct {\n\t\t\t__u64 flags;\n\t\t\t__u64 gpa;\n\t\t\t__u64 size;\n\t\t} memory_fault;\n\t\tchar padding[256];\n\t};\n\t__u64 kvm_valid_regs;\n\t__u64 kvm_dirty_regs;\n\tunion {\n\t\tstruct kvm_sync_regs regs;\n\t\tchar padding[2048];\n\t} s;\n};\n\nstruct kvm_stat_data {\n\tstruct kvm *kvm;\n\tconst struct _kvm_stats_desc *desc;\n\tenum kvm_stat_kind kind;\n};\n\nstruct kvm_steal_time {\n\t__u64 steal;\n\t__u32 version;\n\t__u32 flags;\n\t__u8 preempted;\n\t__u8 u8_pad[3];\n\t__u32 pad[11];\n};\n\nstruct kvm_task_sleep_head {\n\traw_spinlock_t lock;\n\tstruct hlist_head list;\n};\n\nstruct kvm_task_sleep_node {\n\tstruct hlist_node link;\n\tstruct swait_queue_head wq;\n\tu32 token;\n\tint cpu;\n};\n\nstruct preempt_ops;\n\nstruct preempt_notifier {\n\tstruct hlist_node link;\n\tstruct preempt_ops *ops;\n};\n\nstruct x86_emulate_ctxt;\n\nstruct pvclock_vcpu_time_info {\n\tu32 version;\n\tu32 pad0;\n\tu64 tsc_timestamp;\n\tu64 system_time;\n\tu32 tsc_to_system_mul;\n\ts8 tsc_shift;\n\tu8 flags;\n\tu8 pad[2];\n};\n\nstruct kvm_vcpu_xen {\n\tu64 hypercall_rip;\n\tu32 current_runstate;\n\tu8 upcall_vector;\n\tstruct gfn_to_pfn_cache vcpu_info_cache;\n\tstruct gfn_to_pfn_cache vcpu_time_info_cache;\n\tstruct gfn_to_pfn_cache runstate_cache;\n\tstruct gfn_to_pfn_cache runstate2_cache;\n\tu64 last_steal;\n\tu64 runstate_entry_time;\n\tu64 runstate_times[4];\n\tlong unsigned int evtchn_pending_sel;\n\tu32 vcpu_id;\n\tu32 timer_virq;\n\tu64 timer_expires;\n\tatomic_t timer_pending;\n\tstruct hrtimer timer;\n\tint poll_evtchn;\n\tstruct timer_list poll_timer;\n\tstruct kvm_hypervisor_cpuid cpuid;\n};\n\nstruct kvm_vcpu_hv;\n\nstruct kvm_vcpu_arch {\n\tlong unsigned int regs[17];\n\tu32 regs_avail;\n\tu32 regs_dirty;\n\tlong unsigned int cr0;\n\tlong unsigned int cr0_guest_owned_bits;\n\tlong unsigned int cr2;\n\tlong unsigned int cr3;\n\tlong unsigned int cr4;\n\tlong unsigned int cr4_guest_owned_bits;\n\tlong unsigned int cr4_guest_rsvd_bits;\n\tlong unsigned int cr8;\n\tu32 host_pkru;\n\tu32 pkru;\n\tu32 hflags;\n\tu64 efer;\n\tu64 apic_base;\n\tstruct kvm_lapic *apic;\n\tbool load_eoi_exitmap_pending;\n\tlong unsigned int ioapic_handled_vectors[4];\n\tlong unsigned int apic_attention;\n\tint32_t apic_arb_prio;\n\tint mp_state;\n\tu64 ia32_misc_enable_msr;\n\tu64 smbase;\n\tu64 smi_count;\n\tbool at_instruction_boundary;\n\tbool tpr_access_reporting;\n\tbool xfd_no_write_intercept;\n\tu64 ia32_xss;\n\tu64 microcode_version;\n\tu64 arch_capabilities;\n\tu64 perf_capabilities;\n\tstruct kvm_mmu *mmu;\n\tstruct kvm_mmu root_mmu;\n\tstruct kvm_mmu guest_mmu;\n\tstruct kvm_mmu nested_mmu;\n\tstruct kvm_mmu *walk_mmu;\n\tstruct kvm_mmu_memory_cache mmu_pte_list_desc_cache;\n\tstruct kvm_mmu_memory_cache mmu_shadow_page_cache;\n\tstruct kvm_mmu_memory_cache mmu_shadowed_info_cache;\n\tstruct kvm_mmu_memory_cache mmu_page_header_cache;\n\tstruct fpu_guest guest_fpu;\n\tu64 xcr0;\n\tu64 guest_supported_xcr0;\n\tstruct kvm_pio_request pio;\n\tvoid *pio_data;\n\tvoid *sev_pio_data;\n\tunsigned int sev_pio_count;\n\tu8 event_exit_inst_len;\n\tbool exception_from_userspace;\n\tstruct kvm_queued_exception exception;\n\tstruct kvm_queued_exception exception_vmexit;\n\tstruct kvm_queued_interrupt interrupt;\n\tint halt_request;\n\tint cpuid_nent;\n\tstruct kvm_cpuid_entry2 *cpuid_entries;\n\tstruct kvm_hypervisor_cpuid kvm_cpuid;\n\tbool is_amd_compatible;\n\tstruct {\n\t\tlong unsigned int enabled[1];\n\t} governed_features;\n\tu64 reserved_gpa_bits;\n\tint maxphyaddr;\n\tstruct x86_emulate_ctxt *emulate_ctxt;\n\tbool emulate_regs_need_sync_to_vcpu;\n\tbool emulate_regs_need_sync_from_vcpu;\n\tint (*complete_userspace_io)(struct kvm_vcpu *);\n\tgpa_t time;\n\tstruct pvclock_vcpu_time_info hv_clock;\n\tunsigned int hw_tsc_khz;\n\tstruct gfn_to_pfn_cache pv_time;\n\tbool pvclock_set_guest_stopped_request;\n\tstruct {\n\t\tu8 preempted;\n\t\tu64 msr_val;\n\t\tu64 last_steal;\n\t\tstruct gfn_to_hva_cache cache;\n\t} st;\n\tu64 l1_tsc_offset;\n\tu64 tsc_offset;\n\tu64 last_guest_tsc;\n\tu64 last_host_tsc;\n\tu64 tsc_offset_adjustment;\n\tu64 this_tsc_nsec;\n\tu64 this_tsc_write;\n\tu64 this_tsc_generation;\n\tbool tsc_catchup;\n\tbool tsc_always_catchup;\n\ts8 virtual_tsc_shift;\n\tu32 virtual_tsc_mult;\n\tu32 virtual_tsc_khz;\n\ts64 ia32_tsc_adjust_msr;\n\tu64 msr_ia32_power_ctl;\n\tu64 l1_tsc_scaling_ratio;\n\tu64 tsc_scaling_ratio;\n\tatomic_t nmi_queued;\n\tunsigned int nmi_pending;\n\tbool nmi_injected;\n\tbool smi_pending;\n\tu8 handling_intr_from_guest;\n\tstruct kvm_mtrr mtrr_state;\n\tu64 pat;\n\tunsigned int switch_db_regs;\n\tlong unsigned int db[4];\n\tlong unsigned int dr6;\n\tlong unsigned int dr7;\n\tlong unsigned int eff_db[4];\n\tlong unsigned int guest_debug_dr7;\n\tu64 msr_platform_info;\n\tu64 msr_misc_features_enables;\n\tu64 mcg_cap;\n\tu64 mcg_status;\n\tu64 mcg_ctl;\n\tu64 mcg_ext_ctl;\n\tu64 *mce_banks;\n\tu64 *mci_ctl2_banks;\n\tu64 mmio_gva;\n\tunsigned int mmio_access;\n\tgfn_t mmio_gfn;\n\tu64 mmio_gen;\n\tstruct kvm_pmu pmu;\n\tlong unsigned int singlestep_rip;\n\tbool hyperv_enabled;\n\tstruct kvm_vcpu_hv *hyperv;\n\tstruct kvm_vcpu_xen xen;\n\tcpumask_var_t wbinvd_dirty_mask;\n\tlong unsigned int last_retry_eip;\n\tlong unsigned int last_retry_addr;\n\tstruct {\n\t\tbool halted;\n\t\tgfn_t gfns[64];\n\t\tstruct gfn_to_hva_cache data;\n\t\tu64 msr_en_val;\n\t\tu64 msr_int_val;\n\t\tu16 vec;\n\t\tu32 id;\n\t\tbool send_user_only;\n\t\tu32 host_apf_flags;\n\t\tbool delivery_as_pf_vmexit;\n\t\tbool pageready_pending;\n\t} apf;\n\tstruct {\n\t\tu64 length;\n\t\tu64 status;\n\t} osvw;\n\tstruct {\n\t\tu64 msr_val;\n\t\tstruct gfn_to_hva_cache data;\n\t} pv_eoi;\n\tu64 msr_kvm_poll_control;\n\tstruct {\n\t\tbool pv_unhalted;\n\t} pv;\n\tint pending_ioapic_eoi;\n\tint pending_external_vector;\n\tbool preempted_in_kernel;\n\tbool l1tf_flush_l1d;\n\tint last_vmentry_cpu;\n\tu64 msr_hwcr;\n\tstruct {\n\t\tu32 features;\n\t\tbool enforce;\n\t} pv_cpuid;\n\tbool guest_state_protected;\n\tbool pdptrs_from_userspace;\n\thpa_t hv_root_tdp;\n};\n\nstruct kvm_vcpu_stat_generic {\n\tu64 halt_successful_poll;\n\tu64 halt_attempted_poll;\n\tu64 halt_poll_invalid;\n\tu64 halt_wakeup;\n\tu64 halt_poll_success_ns;\n\tu64 halt_poll_fail_ns;\n\tu64 halt_wait_ns;\n\tu64 halt_poll_success_hist[32];\n\tu64 halt_poll_fail_hist[32];\n\tu64 halt_wait_hist[32];\n\tu64 blocking;\n};\n\nstruct kvm_vcpu_stat {\n\tstruct kvm_vcpu_stat_generic generic;\n\tu64 pf_taken;\n\tu64 pf_fixed;\n\tu64 pf_emulate;\n\tu64 pf_spurious;\n\tu64 pf_fast;\n\tu64 pf_mmio_spte_created;\n\tu64 pf_guest;\n\tu64 tlb_flush;\n\tu64 invlpg;\n\tu64 exits;\n\tu64 io_exits;\n\tu64 mmio_exits;\n\tu64 signal_exits;\n\tu64 irq_window_exits;\n\tu64 nmi_window_exits;\n\tu64 l1d_flush;\n\tu64 halt_exits;\n\tu64 request_irq_exits;\n\tu64 irq_exits;\n\tu64 host_state_reload;\n\tu64 fpu_reload;\n\tu64 insn_emulation;\n\tu64 insn_emulation_fail;\n\tu64 hypercalls;\n\tu64 irq_injections;\n\tu64 nmi_injections;\n\tu64 req_event;\n\tu64 nested_run;\n\tu64 directed_yield_attempted;\n\tu64 directed_yield_successful;\n\tu64 preemption_reported;\n\tu64 preemption_other;\n\tu64 guest_mode;\n\tu64 notify_window_exits;\n};\n\nstruct kvm_vcpu {\n\tstruct kvm *kvm;\n\tstruct preempt_notifier preempt_notifier;\n\tint cpu;\n\tint vcpu_id;\n\tint vcpu_idx;\n\tint ____srcu_idx;\n\tint mode;\n\tu64 requests;\n\tlong unsigned int guest_debug;\n\tstruct mutex mutex;\n\tstruct kvm_run *run;\n\tstruct rcuwait wait;\n\tstruct pid *pid;\n\tint sigset_active;\n\tsigset_t sigset;\n\tunsigned int halt_poll_ns;\n\tbool valid_wakeup;\n\tint mmio_needed;\n\tint mmio_read_completed;\n\tint mmio_is_write;\n\tint mmio_cur_fragment;\n\tint mmio_nr_fragments;\n\tstruct kvm_mmio_fragment mmio_fragments[2];\n\tstruct {\n\t\tu32 queued;\n\t\tstruct list_head queue;\n\t\tstruct list_head done;\n\t\tspinlock_t lock;\n\t} async_pf;\n\tstruct {\n\t\tbool in_spin_loop;\n\t\tbool dy_eligible;\n\t} spin_loop;\n\tbool wants_to_run;\n\tbool preempted;\n\tbool ready;\n\tbool scheduled_out;\n\tstruct kvm_vcpu_arch arch;\n\tstruct kvm_vcpu_stat stat;\n\tchar stats_id[48];\n\tstruct kvm_dirty_ring dirty_ring;\n\tstruct kvm_memory_slot *last_used_slot;\n\tu64 last_used_slot_gen;\n};\n\nstruct kvm_vcpu_hv_synic {\n\tu64 version;\n\tu64 control;\n\tu64 msg_page;\n\tu64 evt_page;\n\tatomic64_t sint[16];\n\tatomic_t sint_to_gsi[16];\n\tlong unsigned int auto_eoi_bitmap[4];\n\tlong unsigned int vec_bitmap[4];\n\tbool active;\n\tbool dont_zero_synic_pages;\n};\n\nstruct kvm_vcpu_hv_stimer {\n\tstruct hrtimer timer;\n\tint index;\n\tunion hv_stimer_config config;\n\tu64 count;\n\tu64 exp_time;\n\tstruct hv_message msg;\n\tbool msg_pending;\n};\n\nstruct kvm_vcpu_hv_tlb_flush_fifo {\n\tspinlock_t write_lock;\n\tstruct {\n\t\tunion {\n\t\t\tstruct __kfifo kfifo;\n\t\t\tu64 *type;\n\t\t\tconst u64 *const_type;\n\t\t\tchar (*rectype)[0];\n\t\t\tu64 *ptr;\n\t\t\tconst u64 *ptr_const;\n\t\t};\n\t\tu64 buf[16];\n\t} entries;\n};\n\nstruct kvm_vcpu_hv {\n\tstruct kvm_vcpu *vcpu;\n\tu32 vp_index;\n\tu64 hv_vapic;\n\ts64 runtime_offset;\n\tstruct kvm_vcpu_hv_synic synic;\n\tstruct kvm_hyperv_exit exit;\n\tstruct kvm_vcpu_hv_stimer stimer[4];\n\tlong unsigned int stimer_pending_bitmap[1];\n\tbool enforce_cpuid;\n\tstruct {\n\t\tu32 features_eax;\n\t\tu32 features_ebx;\n\t\tu32 features_edx;\n\t\tu32 enlightenments_eax;\n\t\tu32 enlightenments_ebx;\n\t\tu32 syndbg_cap_eax;\n\t\tu32 nested_eax;\n\t\tu32 nested_ebx;\n\t} cpuid_cache;\n\tstruct kvm_vcpu_hv_tlb_flush_fifo tlb_flush_fifo[2];\n\tu64 sparse_banks[64];\n\tstruct hv_vp_assist_page vp_assist_page;\n\tstruct {\n\t\tu64 pa_page_gpa;\n\t\tu64 vm_id;\n\t\tu32 vp_id;\n\t} nested;\n};\n\nstruct kvm_vcpu_pv_apf_data {\n\t__u32 flags;\n\t__u32 token;\n\t__u8 pad[56];\n};\n\nstruct msr_bitmap_range {\n\tu32 flags;\n\tu32 nmsrs;\n\tu32 base;\n\tlong unsigned int *bitmap;\n};\n\nstruct kvm_x86_msr_filter {\n\tu8 count;\n\tbool default_allow: 1;\n\tstruct msr_bitmap_range ranges[16];\n};\n\nstruct kvm_x86_nested_ops {\n\tvoid (*leave_nested)(struct kvm_vcpu *);\n\tbool (*is_exception_vmexit)(struct kvm_vcpu *, u8, u32);\n\tint (*check_events)(struct kvm_vcpu *);\n\tbool (*has_events)(struct kvm_vcpu *, bool);\n\tvoid (*triple_fault)(struct kvm_vcpu *);\n\tint (*get_state)(struct kvm_vcpu *, struct kvm_nested_state *, unsigned int);\n\tint (*set_state)(struct kvm_vcpu *, struct kvm_nested_state *, struct kvm_nested_state *);\n\tbool (*get_nested_state_pages)(struct kvm_vcpu *);\n\tint (*write_log_dirty)(struct kvm_vcpu *, gpa_t);\n\tint (*enable_evmcs)(struct kvm_vcpu *, uint16_t *);\n\tuint16_t (*get_evmcs_version)(struct kvm_vcpu *);\n\tvoid (*hv_inject_synthetic_vmexit_post_tlb_flush)(struct kvm_vcpu *);\n};\n\nstruct x86_instruction_info;\n\nunion kvm_smram;\n\nstruct msr_data;\n\nstruct kvm_x86_ops {\n\tconst char *name;\n\tint (*check_processor_compatibility)(void);\n\tint (*hardware_enable)(void);\n\tvoid (*hardware_disable)(void);\n\tvoid (*hardware_unsetup)(void);\n\tbool (*has_emulated_msr)(struct kvm *, u32);\n\tvoid (*vcpu_after_set_cpuid)(struct kvm_vcpu *);\n\tunsigned int vm_size;\n\tint (*vm_init)(struct kvm *);\n\tvoid (*vm_destroy)(struct kvm *);\n\tint (*vcpu_precreate)(struct kvm *);\n\tint (*vcpu_create)(struct kvm_vcpu *);\n\tvoid (*vcpu_free)(struct kvm_vcpu *);\n\tvoid (*vcpu_reset)(struct kvm_vcpu *, bool);\n\tvoid (*prepare_switch_to_guest)(struct kvm_vcpu *);\n\tvoid (*vcpu_load)(struct kvm_vcpu *, int);\n\tvoid (*vcpu_put)(struct kvm_vcpu *);\n\tvoid (*update_exception_bitmap)(struct kvm_vcpu *);\n\tint (*get_msr)(struct kvm_vcpu *, struct msr_data *);\n\tint (*set_msr)(struct kvm_vcpu *, struct msr_data *);\n\tu64 (*get_segment_base)(struct kvm_vcpu *, int);\n\tvoid (*get_segment)(struct kvm_vcpu *, struct kvm_segment *, int);\n\tint (*get_cpl)(struct kvm_vcpu *);\n\tvoid (*set_segment)(struct kvm_vcpu *, struct kvm_segment *, int);\n\tvoid (*get_cs_db_l_bits)(struct kvm_vcpu *, int *, int *);\n\tbool (*is_valid_cr0)(struct kvm_vcpu *, long unsigned int);\n\tvoid (*set_cr0)(struct kvm_vcpu *, long unsigned int);\n\tvoid (*post_set_cr3)(struct kvm_vcpu *, long unsigned int);\n\tbool (*is_valid_cr4)(struct kvm_vcpu *, long unsigned int);\n\tvoid (*set_cr4)(struct kvm_vcpu *, long unsigned int);\n\tint (*set_efer)(struct kvm_vcpu *, u64);\n\tvoid (*get_idt)(struct kvm_vcpu *, struct desc_ptr *);\n\tvoid (*set_idt)(struct kvm_vcpu *, struct desc_ptr *);\n\tvoid (*get_gdt)(struct kvm_vcpu *, struct desc_ptr *);\n\tvoid (*set_gdt)(struct kvm_vcpu *, struct desc_ptr *);\n\tvoid (*sync_dirty_debug_regs)(struct kvm_vcpu *);\n\tvoid (*set_dr7)(struct kvm_vcpu *, long unsigned int);\n\tvoid (*cache_reg)(struct kvm_vcpu *, enum kvm_reg);\n\tlong unsigned int (*get_rflags)(struct kvm_vcpu *);\n\tvoid (*set_rflags)(struct kvm_vcpu *, long unsigned int);\n\tbool (*get_if_flag)(struct kvm_vcpu *);\n\tvoid (*flush_tlb_all)(struct kvm_vcpu *);\n\tvoid (*flush_tlb_current)(struct kvm_vcpu *);\n\tint (*flush_remote_tlbs)(struct kvm *);\n\tint (*flush_remote_tlbs_range)(struct kvm *, gfn_t, gfn_t);\n\tvoid (*flush_tlb_gva)(struct kvm_vcpu *, gva_t);\n\tvoid (*flush_tlb_guest)(struct kvm_vcpu *);\n\tint (*vcpu_pre_run)(struct kvm_vcpu *);\n\tenum exit_fastpath_completion (*vcpu_run)(struct kvm_vcpu *, bool);\n\tint (*handle_exit)(struct kvm_vcpu *, enum exit_fastpath_completion);\n\tint (*skip_emulated_instruction)(struct kvm_vcpu *);\n\tvoid (*update_emulated_instruction)(struct kvm_vcpu *);\n\tvoid (*set_interrupt_shadow)(struct kvm_vcpu *, int);\n\tu32 (*get_interrupt_shadow)(struct kvm_vcpu *);\n\tvoid (*patch_hypercall)(struct kvm_vcpu *, unsigned char *);\n\tvoid (*inject_irq)(struct kvm_vcpu *, bool);\n\tvoid (*inject_nmi)(struct kvm_vcpu *);\n\tvoid (*inject_exception)(struct kvm_vcpu *);\n\tvoid (*cancel_injection)(struct kvm_vcpu *);\n\tint (*interrupt_allowed)(struct kvm_vcpu *, bool);\n\tint (*nmi_allowed)(struct kvm_vcpu *, bool);\n\tbool (*get_nmi_mask)(struct kvm_vcpu *);\n\tvoid (*set_nmi_mask)(struct kvm_vcpu *, bool);\n\tbool (*is_vnmi_pending)(struct kvm_vcpu *);\n\tbool (*set_vnmi_pending)(struct kvm_vcpu *);\n\tvoid (*enable_nmi_window)(struct kvm_vcpu *);\n\tvoid (*enable_irq_window)(struct kvm_vcpu *);\n\tvoid (*update_cr8_intercept)(struct kvm_vcpu *, int, int);\n\tconst bool x2apic_icr_is_split;\n\tconst long unsigned int required_apicv_inhibits;\n\tbool allow_apicv_in_x2apic_without_x2apic_virtualization;\n\tvoid (*refresh_apicv_exec_ctrl)(struct kvm_vcpu *);\n\tvoid (*hwapic_irr_update)(struct kvm_vcpu *, int);\n\tvoid (*hwapic_isr_update)(int);\n\tvoid (*load_eoi_exitmap)(struct kvm_vcpu *, u64 *);\n\tvoid (*set_virtual_apic_mode)(struct kvm_vcpu *);\n\tvoid (*set_apic_access_page_addr)(struct kvm_vcpu *);\n\tvoid (*deliver_interrupt)(struct kvm_lapic *, int, int, int);\n\tint (*sync_pir_to_irr)(struct kvm_vcpu *);\n\tint (*set_tss_addr)(struct kvm *, unsigned int);\n\tint (*set_identity_map_addr)(struct kvm *, u64);\n\tu8 (*get_mt_mask)(struct kvm_vcpu *, gfn_t, bool);\n\tvoid (*load_mmu_pgd)(struct kvm_vcpu *, hpa_t, int);\n\tbool (*has_wbinvd_exit)(void);\n\tu64 (*get_l2_tsc_offset)(struct kvm_vcpu *);\n\tu64 (*get_l2_tsc_multiplier)(struct kvm_vcpu *);\n\tvoid (*write_tsc_offset)(struct kvm_vcpu *);\n\tvoid (*write_tsc_multiplier)(struct kvm_vcpu *);\n\tvoid (*get_exit_info)(struct kvm_vcpu *, u32 *, u64 *, u64 *, u32 *, u32 *);\n\tint (*check_intercept)(struct kvm_vcpu *, struct x86_instruction_info *, enum x86_intercept_stage, struct x86_exception *);\n\tvoid (*handle_exit_irqoff)(struct kvm_vcpu *);\n\tint cpu_dirty_log_size;\n\tvoid (*update_cpu_dirty_logging)(struct kvm_vcpu *);\n\tconst struct kvm_x86_nested_ops *nested_ops;\n\tvoid (*vcpu_blocking)(struct kvm_vcpu *);\n\tvoid (*vcpu_unblocking)(struct kvm_vcpu *);\n\tint (*pi_update_irte)(struct kvm *, unsigned int, uint32_t, bool);\n\tvoid (*pi_start_assignment)(struct kvm *);\n\tvoid (*apicv_pre_state_restore)(struct kvm_vcpu *);\n\tvoid (*apicv_post_state_restore)(struct kvm_vcpu *);\n\tbool (*dy_apicv_has_pending_interrupt)(struct kvm_vcpu *);\n\tint (*set_hv_timer)(struct kvm_vcpu *, u64, bool *);\n\tvoid (*cancel_hv_timer)(struct kvm_vcpu *);\n\tvoid (*setup_mce)(struct kvm_vcpu *);\n\tint (*smi_allowed)(struct kvm_vcpu *, bool);\n\tint (*enter_smm)(struct kvm_vcpu *, union kvm_smram *);\n\tint (*leave_smm)(struct kvm_vcpu *, const union kvm_smram *);\n\tvoid (*enable_smi_window)(struct kvm_vcpu *);\n\tint (*dev_get_attr)(u32, u64, u64 *);\n\tint (*mem_enc_ioctl)(struct kvm *, void *);\n\tint (*mem_enc_register_region)(struct kvm *, struct kvm_enc_region *);\n\tint (*mem_enc_unregister_region)(struct kvm *, struct kvm_enc_region *);\n\tint (*vm_copy_enc_context_from)(struct kvm *, unsigned int);\n\tint (*vm_move_enc_context_from)(struct kvm *, unsigned int);\n\tvoid (*guest_memory_reclaimed)(struct kvm *);\n\tint (*get_msr_feature)(struct kvm_msr_entry *);\n\tint (*check_emulate_instruction)(struct kvm_vcpu *, int, void *, int);\n\tbool (*apic_init_signal_blocked)(struct kvm_vcpu *);\n\tint (*enable_l2_tlb_flush)(struct kvm_vcpu *);\n\tvoid (*migrate_timers)(struct kvm_vcpu *);\n\tvoid (*msr_filter_changed)(struct kvm_vcpu *);\n\tint (*complete_emulated_msr)(struct kvm_vcpu *, int);\n\tvoid (*vcpu_deliver_sipi_vector)(struct kvm_vcpu *, u8);\n\tlong unsigned int (*vcpu_get_apicv_inhibit_reasons)(struct kvm_vcpu *);\n\tgva_t (*get_untagged_addr)(struct kvm_vcpu *, gva_t, unsigned int);\n\tvoid * (*alloc_apic_backing_page)(struct kvm_vcpu *);\n\tint (*gmem_prepare)(struct kvm *, kvm_pfn_t, gfn_t, int);\n\tvoid (*gmem_invalidate)(kvm_pfn_t, kvm_pfn_t);\n\tint (*private_max_mapping_level)(struct kvm *, kvm_pfn_t);\n};\n\nstruct kvm_x86_pmu_event_filter {\n\t__u32 action;\n\t__u32 nevents;\n\t__u32 fixed_counter_bitmap;\n\t__u32 flags;\n\t__u32 nr_includes;\n\t__u32 nr_excludes;\n\t__u64 *includes;\n\t__u64 *excludes;\n\t__u64 events[0];\n};\n\nunion l1_cache {\n\tstruct {\n\t\tunsigned int line_size: 8;\n\t\tunsigned int lines_per_tag: 8;\n\t\tunsigned int assoc: 8;\n\t\tunsigned int size_in_kb: 8;\n\t};\n\tunsigned int val;\n};\n\nunion l2_cache {\n\tstruct {\n\t\tunsigned int line_size: 8;\n\t\tunsigned int lines_per_tag: 4;\n\t\tunsigned int assoc: 4;\n\t\tunsigned int size_in_kb: 16;\n\t};\n\tunsigned int val;\n};\n\nunion l3_cache {\n\tstruct {\n\t\tunsigned int line_size: 8;\n\t\tunsigned int lines_per_tag: 4;\n\t\tunsigned int assoc: 4;\n\t\tunsigned int res: 2;\n\t\tunsigned int size_encoded: 14;\n\t};\n\tunsigned int val;\n};\n\ntypedef int (*lookup_by_table_id_t)(struct net *, u32);\n\nstruct l3mdev_handler {\n\tlookup_by_table_id_t dev_lookup;\n};\n\nstruct l3mdev_ops {\n\tu32 (*l3mdev_fib_table)(const struct net_device *);\n\tstruct sk_buff * (*l3mdev_l3_rcv)(struct net_device *, struct sk_buff *, u16);\n\tstruct sk_buff * (*l3mdev_l3_out)(struct net_device *, struct sock *, struct sk_buff *, u16);\n\tstruct dst_entry * (*l3mdev_link_scope_lookup)(const struct net_device *, struct flowi6 *);\n};\n\nstruct label_it {\n\tint i;\n\tint j;\n};\n\nstruct ladder_device_state {\n\tstruct {\n\t\tu32 promotion_count;\n\t\tu32 demotion_count;\n\t\tu64 promotion_time_ns;\n\t\tu64 demotion_time_ns;\n\t} threshold;\n\tstruct {\n\t\tint promotion_count;\n\t\tint demotion_count;\n\t} stats;\n};\n\nstruct ladder_device {\n\tstruct ladder_device_state states[10];\n};\n\nstruct landlock_ruleset;\n\nstruct landlock_cred_security {\n\tstruct landlock_ruleset *domain;\n};\n\nstruct landlock_file_security {\n\taccess_mask_t allowed_access;\n};\n\nstruct landlock_hierarchy {\n\tstruct landlock_hierarchy *parent;\n\trefcount_t usage;\n};\n\nstruct landlock_object;\n\nunion landlock_key {\n\tstruct landlock_object *object;\n\tuintptr_t data;\n};\n\nstruct landlock_id {\n\tunion landlock_key key;\n\tconst enum landlock_key_type type;\n};\n\nstruct landlock_inode_security {\n\tstruct landlock_object *object;\n};\n\nstruct landlock_layer {\n\tu16 level;\n\taccess_mask_t access;\n};\n\nstruct landlock_net_port_attr {\n\t__u64 allowed_access;\n\t__u64 port;\n};\n\nstruct landlock_object_underops;\n\nstruct landlock_object {\n\trefcount_t usage;\n\tspinlock_t lock;\n\tvoid *underobj;\n\tunion {\n\t\tstruct callback_head rcu_free;\n\t\tconst struct landlock_object_underops *underops;\n\t};\n};\n\nstruct landlock_object_underops {\n\tvoid (*release)(struct landlock_object * const);\n};\n\nstruct landlock_path_beneath_attr {\n\t__u64 allowed_access;\n\t__s32 parent_fd;\n} __attribute__((packed));\n\nstruct landlock_rule {\n\tstruct rb_node node;\n\tunion landlock_key key;\n\tu32 num_layers;\n\tstruct landlock_layer layers[0];\n};\n\nstruct landlock_ruleset {\n\tstruct rb_root root_inode;\n\tstruct rb_root root_net_port;\n\tstruct landlock_hierarchy *hierarchy;\n\tunion {\n\t\tstruct work_struct work_free;\n\t\tstruct {\n\t\t\tstruct mutex lock;\n\t\t\trefcount_t usage;\n\t\t\tu32 num_rules;\n\t\t\tu32 num_layers;\n\t\t\tstruct access_masks access_masks[0];\n\t\t};\n\t};\n};\n\nstruct landlock_ruleset_attr {\n\t__u64 handled_access_fs;\n\t__u64 handled_access_net;\n};\n\nstruct landlock_superblock_security {\n\tatomic_long_t inode_refs;\n};\n\nstruct latch_tree_ops {\n\tbool (*less)(struct latch_tree_node *, struct latch_tree_node *);\n\tint (*comp)(void *, struct latch_tree_node *);\n};\n\nstruct latch_tree_root {\n\tseqcount_latch_t seq;\n\tstruct rb_root tree[2];\n};\n\nstruct latched_seq {\n\tseqcount_latch_t latch;\n\tu64 val[2];\n};\n\nstruct lateeoi_work {\n\tstruct delayed_work delayed;\n\tspinlock_t eoi_list_lock;\n\tstruct list_head eoi_list;\n};\n\nstruct latency_record {\n\tlong unsigned int backtrace[12];\n\tunsigned int count;\n\tlong unsigned int time;\n\tlong unsigned int max;\n};\n\nstruct sched_domain;\n\nstruct lb_env {\n\tstruct sched_domain *sd;\n\tstruct rq *src_rq;\n\tint src_cpu;\n\tint dst_cpu;\n\tstruct rq *dst_rq;\n\tstruct cpumask *dst_grpmask;\n\tint new_dst_cpu;\n\tenum cpu_idle_type idle;\n\tlong int imbalance;\n\tstruct cpumask *cpus;\n\tunsigned int flags;\n\tunsigned int loop;\n\tunsigned int loop_break;\n\tunsigned int loop_max;\n\tenum fbq_type fbq_type;\n\tenum migration_type migration_type;\n\tstruct list_head tasks;\n};\n\nstruct ld_semaphore {\n\tatomic_long_t count;\n\traw_spinlock_t wait_lock;\n\tunsigned int wait_readers;\n\tstruct list_head read_wait;\n\tstruct list_head write_wait;\n};\n\nstruct ldma_port;\n\nstruct ldma_chan {\n\tstruct virt_dma_chan vchan;\n\tstruct ldma_port *port;\n\tchar name[8];\n\tint nr;\n\tu32 flags;\n\tenum ldma_chan_on_off onoff;\n\tdma_addr_t desc_phys;\n\tvoid *desc_base;\n\tu32 desc_cnt;\n\tint rst;\n\tu32 hdrm_len;\n\tbool hdrm_csum;\n\tu32 boff_len;\n\tu32 data_endian;\n\tu32 desc_endian;\n\tbool pden;\n\tbool desc_rx_np;\n\tbool data_endian_en;\n\tbool desc_endian_en;\n\tbool abc_en;\n\tbool desc_init;\n\tstruct dma_pool *desc_pool;\n\tu32 desc_num;\n\tstruct dw2_desc_sw *ds;\n\tstruct work_struct work;\n\tstruct dma_slave_config config;\n};\n\nstruct ldma_inst_data;\n\nstruct ldma_dev {\n\tstruct device *dev;\n\tvoid *base;\n\tstruct reset_control *rst;\n\tstruct clk *core_clk;\n\tstruct dma_device dma_dev;\n\tu32 ver;\n\tint irq;\n\tstruct ldma_port *ports;\n\tstruct ldma_chan *chans;\n\tspinlock_t dev_lock;\n\tu32 chan_nrs;\n\tu32 port_nrs;\n\tu32 channels_mask;\n\tu32 flags;\n\tu32 pollcnt;\n\tconst struct ldma_inst_data *inst;\n\tstruct workqueue_struct *wq;\n};\n\nstruct ldma_inst_data {\n\tbool desc_in_sram;\n\tbool chan_fc;\n\tbool desc_fod;\n\tbool valid_desc_fetch_ack;\n\tu32 orrc;\n\tconst char *name;\n\tu32 type;\n};\n\nstruct ldma_port {\n\tstruct ldma_dev *ldev;\n\tu32 portid;\n\tu32 rxbl;\n\tu32 txbl;\n\tu32 rxendi;\n\tu32 txendi;\n\tu32 pkt_drop;\n};\n\nstruct privhead {\n\tu16 ver_major;\n\tu16 ver_minor;\n\tu64 logical_disk_start;\n\tu64 logical_disk_size;\n\tu64 config_start;\n\tu64 config_size;\n\tuuid_t disk_id;\n};\n\nstruct tocblock {\n\tu8 bitmap1_name[16];\n\tu64 bitmap1_start;\n\tu64 bitmap1_size;\n\tu8 bitmap2_name[16];\n\tu64 bitmap2_start;\n\tu64 bitmap2_size;\n};\n\nstruct vmdb {\n\tu16 ver_major;\n\tu16 ver_minor;\n\tu32 vblk_size;\n\tu32 vblk_offset;\n\tu32 last_vblk_seq;\n};\n\nstruct ldmdb {\n\tstruct privhead ph;\n\tstruct tocblock toc;\n\tstruct vmdb vm;\n\tstruct list_head v_dgrp;\n\tstruct list_head v_disk;\n\tstruct list_head v_volu;\n\tstruct list_head v_comp;\n\tstruct list_head v_part;\n};\n\nstruct ldsem_waiter {\n\tstruct list_head list;\n\tstruct task_struct *task;\n};\n\nstruct ldt_struct {\n\tstruct desc_struct *entries;\n\tunsigned int nr_entries;\n\tint slot;\n};\n\nstruct ldttss_desc {\n\tu16 limit0;\n\tu16 base0;\n\tu16 base1: 8;\n\tu16 type: 5;\n\tu16 dpl: 2;\n\tu16 p: 1;\n\tu16 limit1: 4;\n\tu16 zero0: 3;\n\tu16 g: 1;\n\tu16 base2: 8;\n\tu32 base3;\n\tu32 zero1;\n};\n\ntypedef struct ldttss_desc ldt_desc;\n\ntypedef struct ldttss_desc tss_desc;\n\nstruct lease_manager_operations {\n\tbool (*lm_break)(struct file_lease *);\n\tint (*lm_change)(struct file_lease *, int, struct list_head *);\n\tvoid (*lm_setup)(struct file_lease *, void **);\n\tbool (*lm_breaker_owns_lease)(struct file_lease *);\n};\n\nstruct led_pattern;\n\nstruct led_classdev {\n\tconst char *name;\n\tunsigned int brightness;\n\tunsigned int max_brightness;\n\tunsigned int color;\n\tint flags;\n\tlong unsigned int work_flags;\n\tvoid (*brightness_set)(struct led_classdev *, enum led_brightness);\n\tint (*brightness_set_blocking)(struct led_classdev *, enum led_brightness);\n\tenum led_brightness (*brightness_get)(struct led_classdev *);\n\tint (*blink_set)(struct led_classdev *, long unsigned int *, long unsigned int *);\n\tint (*pattern_set)(struct led_classdev *, struct led_pattern *, u32, int);\n\tint (*pattern_clear)(struct led_classdev *);\n\tstruct device *dev;\n\tconst struct attribute_group **groups;\n\tstruct list_head node;\n\tconst char *default_trigger;\n\tlong unsigned int blink_delay_on;\n\tlong unsigned int blink_delay_off;\n\tstruct timer_list blink_timer;\n\tint blink_brightness;\n\tint new_blink_brightness;\n\tvoid (*flash_resume)(struct led_classdev *);\n\tstruct work_struct set_brightness_work;\n\tint delayed_set_value;\n\tlong unsigned int delayed_delay_on;\n\tlong unsigned int delayed_delay_off;\n\tstruct rw_semaphore trigger_lock;\n\tstruct led_trigger *trigger;\n\tstruct list_head trig_list;\n\tvoid *trigger_data;\n\tbool activated;\n\tstruct led_hw_trigger_type *trigger_type;\n\tconst char *hw_control_trigger;\n\tint (*hw_control_is_supported)(struct led_classdev *, long unsigned int);\n\tint (*hw_control_set)(struct led_classdev *, long unsigned int);\n\tint (*hw_control_get)(struct led_classdev *, long unsigned int *);\n\tstruct device * (*hw_control_get_device)(struct led_classdev *);\n\tint brightness_hw_changed;\n\tstruct kernfs_node *brightness_hw_changed_kn;\n\tstruct mutex led_access;\n};\n\nstruct mc_subled;\n\nstruct led_classdev_mc {\n\tstruct led_classdev led_cdev;\n\tunsigned int num_colors;\n\tstruct mc_subled *subled_info;\n};\n\nstruct led_hw_trigger_type {\n\tint dummy;\n};\n\nstruct led_init_data {\n\tstruct fwnode_handle *fwnode;\n\tconst char *default_label;\n\tconst char *devicename;\n\tbool devname_mandatory;\n};\n\nstruct led_lookup_data {\n\tstruct list_head list;\n\tconst char *provider;\n\tconst char *dev_id;\n\tconst char *con_id;\n};\n\nstruct led_pattern {\n\tu32 delta_t;\n\tint brightness;\n};\n\nstruct led_properties {\n\tu32 color;\n\tbool color_present;\n\tconst char *function;\n\tu32 func_enum;\n\tbool func_enum_present;\n\tconst char *label;\n};\n\nstruct led_trigger_cpu {\n\tbool is_active;\n\tchar name[8];\n\tstruct led_trigger *_trig;\n};\n\nstruct legacy_fs_context {\n\tchar *legacy_data;\n\tsize_t data_size;\n\tenum legacy_fs_param param_type;\n};\n\nstruct legacy_pic {\n\tint nr_legacy_irqs;\n\tstruct irq_chip *chip;\n\tvoid (*mask)(unsigned int);\n\tvoid (*unmask)(unsigned int);\n\tvoid (*mask_all)(void);\n\tvoid (*restore_mask)(void);\n\tvoid (*init)(int);\n\tint (*probe)(void);\n\tint (*irq_pending)(unsigned int);\n\tvoid (*make_irq)(unsigned int);\n};\n\nstruct level_datum {\n\tstruct mls_level *level;\n\tunsigned char isalias;\n};\n\nstruct limit_names {\n\tconst char *name;\n\tconst char *unit;\n};\n\nstruct linereq;\n\nstruct line {\n\tstruct rb_node node;\n\tstruct gpio_desc *desc;\n\tstruct linereq *req;\n\tunsigned int irq;\n\tu64 edflags;\n\tu64 timestamp_ns;\n\tu32 req_seqno;\n\tu32 line_seqno;\n\tstruct delayed_work work;\n\tunsigned int debounce_period_us;\n\tunsigned int sw_debounced;\n\tunsigned int level;\n\tstruct hte_ts_desc hdesc;\n\tint raw_level;\n\tu32 total_discard_seq;\n\tu32 last_seqno;\n};\n\nstruct linear_c {\n\tstruct dm_dev *dev;\n\tsector_t start;\n};\n\nstruct linear_range {\n\tunsigned int min;\n\tunsigned int min_sel;\n\tunsigned int max_sel;\n\tunsigned int step;\n};\n\nstruct lineevent_state {\n\tstruct gpio_device *gdev;\n\tconst char *label;\n\tstruct gpio_desc *desc;\n\tu32 eflags;\n\tint irq;\n\twait_queue_head_t wait;\n\tstruct notifier_block device_unregistered_nb;\n\tstruct {\n\t\tunion {\n\t\t\tstruct __kfifo kfifo;\n\t\t\tstruct gpioevent_data *type;\n\t\t\tconst struct gpioevent_data *const_type;\n\t\t\tchar (*rectype)[0];\n\t\t\tstruct gpioevent_data *ptr;\n\t\t\tconst struct gpioevent_data *ptr_const;\n\t\t};\n\t\tstruct gpioevent_data buf[16];\n\t} events;\n\tu64 timestamp;\n};\n\nstruct linehandle_state {\n\tstruct gpio_device *gdev;\n\tconst char *label;\n\tstruct gpio_desc *descs[64];\n\tu32 num_descs;\n};\n\nstruct linereq {\n\tstruct gpio_device *gdev;\n\tconst char *label;\n\tu32 num_lines;\n\twait_queue_head_t wait;\n\tstruct notifier_block device_unregistered_nb;\n\tu32 event_buffer_size;\n\tstruct {\n\t\tunion {\n\t\t\tstruct __kfifo kfifo;\n\t\t\tstruct gpio_v2_line_event *type;\n\t\t\tconst struct gpio_v2_line_event *const_type;\n\t\t\tchar (*rectype)[0];\n\t\t\tstruct gpio_v2_line_event *ptr;\n\t\t\tconst struct gpio_v2_line_event *ptr_const;\n\t\t};\n\t\tstruct gpio_v2_line_event buf[0];\n\t} events;\n\tatomic_t seqno;\n\tstruct mutex config_mutex;\n\tstruct line lines[0];\n};\n\nstruct linger {\n\tint l_onoff;\n\tint l_linger;\n};\n\nstruct link_free {\n\tunion {\n\t\tlong unsigned int next;\n\t\tlong unsigned int handle;\n\t};\n};\n\nstruct link_mode_info {\n\tint speed;\n\tu8 lanes;\n\tu8 duplex;\n};\n\nstruct linked_page {\n\tstruct linked_page *next;\n\tchar data[4088];\n};\n\nstruct linkinfo_reply_data {\n\tstruct ethnl_reply_data base;\n\tstruct ethtool_link_ksettings ksettings;\n\tstruct ethtool_link_settings *lsettings;\n};\n\nstruct linkmodes_reply_data {\n\tstruct ethnl_reply_data base;\n\tstruct ethtool_link_ksettings ksettings;\n\tstruct ethtool_link_settings *lsettings;\n\tbool peer_empty;\n};\n\nstruct linkstate_reply_data {\n\tstruct ethnl_reply_data base;\n\tint link;\n\tint sqi;\n\tint sqi_max;\n\tstruct ethtool_link_ext_stats link_stats;\n\tbool link_ext_state_provided;\n\tstruct ethtool_link_ext_state_info ethtool_link_ext_state_info;\n};\n\nstruct linux_binprm;\n\nstruct linux_binfmt {\n\tstruct list_head lh;\n\tstruct module *module;\n\tint (*load_binary)(struct linux_binprm *);\n\tint (*load_shlib)(struct file *);\n\tint (*core_dump)(struct coredump_params *);\n\tlong unsigned int min_coredump;\n};\n\nstruct linux_binprm {\n\tstruct vm_area_struct *vma;\n\tlong unsigned int vma_pages;\n\tlong unsigned int argmin;\n\tstruct mm_struct *mm;\n\tlong unsigned int p;\n\tunsigned int have_execfd: 1;\n\tunsigned int execfd_creds: 1;\n\tunsigned int secureexec: 1;\n\tunsigned int point_of_no_return: 1;\n\tstruct file *executable;\n\tstruct file *interpreter;\n\tstruct file *file;\n\tstruct cred *cred;\n\tint unsafe;\n\tunsigned int per_clear;\n\tint argc;\n\tint envc;\n\tconst char *filename;\n\tconst char *interp;\n\tconst char *fdpath;\n\tunsigned int interp_flags;\n\tint execfd;\n\tlong unsigned int loader;\n\tlong unsigned int exec;\n\tstruct rlimit rlim_stack;\n\tchar buf[256];\n};\n\nstruct linux_binprm__safe_trusted {\n\tstruct file *file;\n};\n\nstruct linux_dirent {\n\tlong unsigned int d_ino;\n\tlong unsigned int d_off;\n\tshort unsigned int d_reclen;\n\tchar d_name[0];\n};\n\nstruct linux_dirent64 {\n\tu64 d_ino;\n\ts64 d_off;\n\tshort unsigned int d_reclen;\n\tunsigned char d_type;\n\tchar d_name[0];\n};\n\nstruct linux_efi_initrd {\n\tlong unsigned int base;\n\tlong unsigned int size;\n};\n\nstruct linux_efi_memreserve {\n\tint size;\n\tatomic_t count;\n\tphys_addr_t next;\n\tstruct {\n\t\tphys_addr_t base;\n\t\tphys_addr_t size;\n\t} entry[0];\n};\n\nstruct linux_efi_random_seed {\n\tu32 size;\n\tu8 bits[0];\n};\n\nstruct linux_efi_tpm_eventlog {\n\tu32 size;\n\tu32 final_events_preboot_size;\n\tu8 version;\n\tu8 log[0];\n};\n\nstruct linux_mib {\n\tlong unsigned int mibs[132];\n};\n\nstruct linux_tls_mib {\n\tlong unsigned int mibs[13];\n};\n\nstruct linux_xfrm_mib {\n\tlong unsigned int mibs[31];\n};\n\nstruct list_lru_node;\n\nstruct list_lru {\n\tstruct list_lru_node *node;\n\tstruct list_head list;\n\tint shrinker_id;\n\tbool memcg_aware;\n\tstruct xarray xa;\n};\n\nstruct list_lru_one {\n\tstruct list_head list;\n\tlong int nr_items;\n};\n\nstruct list_lru_memcg {\n\tstruct callback_head rcu;\n\tstruct list_lru_one node[0];\n};\n\nstruct list_lru_memcg_table {\n\tstruct list_lru_memcg *mlru;\n\tstruct mem_cgroup *memcg;\n};\n\nstruct list_lru_node {\n\tspinlock_t lock;\n\tstruct list_lru_one lru;\n\tlong int nr_items;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct listener {\n\tstruct list_head list;\n\tpid_t pid;\n\tchar valid;\n};\n\nstruct listener_list {\n\tstruct rw_semaphore sem;\n\tstruct list_head list;\n};\n\nstruct listeners {\n\tstruct callback_head rcu;\n\tlong unsigned int masks[0];\n};\n\nstruct load_info {\n\tconst char *name;\n\tstruct module *mod;\n\tElf64_Ehdr *hdr;\n\tlong unsigned int len;\n\tElf64_Shdr *sechdrs;\n\tchar *secstrings;\n\tchar *strtab;\n\tlong unsigned int symoffs;\n\tlong unsigned int stroffs;\n\tlong unsigned int init_typeoffs;\n\tlong unsigned int core_typeoffs;\n\tbool sig_ok;\n\tlong unsigned int mod_kallsyms_init_off;\n\tstruct page **pages;\n\tunsigned int max_pages;\n\tunsigned int used_pages;\n\tstruct {\n\t\tunsigned int sym;\n\t\tunsigned int str;\n\t\tunsigned int mod;\n\t\tunsigned int vers;\n\t\tunsigned int info;\n\t\tunsigned int pcpu;\n\t} index;\n};\n\nstruct location;\n\nstruct loc_track {\n\tlong unsigned int max;\n\tlong unsigned int count;\n\tstruct location *loc;\n\tloff_t idx;\n};\n\nstruct local_event {\n\tlocal_lock_t lock;\n\t__u32 count;\n};\n\nstruct local_ports {\n\tu32 range;\n\tbool warned;\n};\n\nstruct location {\n\tdepot_stack_handle_t handle;\n\tlong unsigned int count;\n\tlong unsigned int addr;\n\tlong unsigned int waste;\n\tlong long int sum_time;\n\tlong int min_time;\n\tlong int max_time;\n\tlong int min_pid;\n\tlong int max_pid;\n\tlong unsigned int cpus[128];\n\tnodemask_t nodes;\n};\n\nstruct lock_manager_operations {\n\tvoid *lm_mod_owner;\n\tfl_owner_t (*lm_get_owner)(fl_owner_t);\n\tvoid (*lm_put_owner)(fl_owner_t);\n\tvoid (*lm_notify)(struct file_lock *);\n\tint (*lm_grant)(struct file_lock *, int);\n\tbool (*lm_lock_expirable)(struct file_lock *);\n\tvoid (*lm_expire_lock)(void);\n};\n\nstruct locks_iterator {\n\tint li_cpu;\n\tloff_t li_pos;\n};\n\nstruct logic_pio_host_ops {\n\tu32 (*in)(void *, long unsigned int, size_t);\n\tvoid (*out)(void *, long unsigned int, u32, size_t);\n\tu32 (*ins)(void *, long unsigned int, void *, size_t, unsigned int);\n\tvoid (*outs)(void *, long unsigned int, const void *, size_t, unsigned int);\n};\n\nstruct logic_pio_hwaddr {\n\tstruct list_head list;\n\tstruct fwnode_handle *fwnode;\n\tresource_size_t hw_start;\n\tresource_size_t io_start;\n\tresource_size_t size;\n\tlong unsigned int flags;\n\tvoid *hostdata;\n\tconst struct logic_pio_host_ops *ops;\n};\n\nstruct lookup_args {\n\tint offset;\n\tconst struct in6_addr *addr;\n};\n\nstruct loop_cmd {\n\tstruct list_head list_entry;\n\tbool use_aio;\n\tatomic_t ref;\n\tlong int ret;\n\tstruct kiocb iocb;\n\tstruct bio_vec *bvec;\n\tstruct cgroup_subsys_state *blkcg_css;\n\tstruct cgroup_subsys_state *memcg_css;\n};\n\nstruct loop_info64 {\n\t__u64 lo_device;\n\t__u64 lo_inode;\n\t__u64 lo_rdevice;\n\t__u64 lo_offset;\n\t__u64 lo_sizelimit;\n\t__u32 lo_number;\n\t__u32 lo_encrypt_type;\n\t__u32 lo_encrypt_key_size;\n\t__u32 lo_flags;\n\t__u8 lo_file_name[64];\n\t__u8 lo_crypt_name[64];\n\t__u8 lo_encrypt_key[32];\n\t__u64 lo_init[2];\n};\n\nstruct loop_config {\n\t__u32 fd;\n\t__u32 block_size;\n\tstruct loop_info64 info;\n\t__u64 __reserved[8];\n};\n\nstruct loop_device {\n\tint lo_number;\n\tloff_t lo_offset;\n\tloff_t lo_sizelimit;\n\tint lo_flags;\n\tchar lo_file_name[64];\n\tstruct file *lo_backing_file;\n\tstruct block_device *lo_device;\n\tgfp_t old_gfp_mask;\n\tspinlock_t lo_lock;\n\tint lo_state;\n\tspinlock_t lo_work_lock;\n\tstruct workqueue_struct *workqueue;\n\tstruct work_struct rootcg_work;\n\tstruct list_head rootcg_cmd_list;\n\tstruct list_head idle_worker_list;\n\tstruct rb_root worker_tree;\n\tstruct timer_list timer;\n\tbool use_dio;\n\tbool sysfs_inited;\n\tstruct request_queue *lo_queue;\n\tstruct blk_mq_tag_set tag_set;\n\tstruct gendisk *lo_disk;\n\tstruct mutex lo_mutex;\n\tbool idr_visible;\n};\n\nstruct loop_info {\n\tint lo_number;\n\t__kernel_old_dev_t lo_device;\n\tlong unsigned int lo_inode;\n\t__kernel_old_dev_t lo_rdevice;\n\tint lo_offset;\n\tint lo_encrypt_type;\n\tint lo_encrypt_key_size;\n\tint lo_flags;\n\tchar lo_name[64];\n\tunsigned char lo_encrypt_key[32];\n\tlong unsigned int lo_init[2];\n\tchar reserved[4];\n};\n\nstruct loop_worker {\n\tstruct rb_node rb_node;\n\tstruct work_struct work;\n\tstruct list_head cmd_list;\n\tstruct list_head idle_list;\n\tstruct loop_device *lo;\n\tstruct cgroup_subsys_state *blkcg_css;\n\tlong unsigned int last_ran_at;\n};\n\nunion lower_chunk {\n\tunion lower_chunk *next;\n\tlong unsigned int data[256];\n};\n\nstruct lp8788_platform_data;\n\nstruct lp8788 {\n\tstruct device *dev;\n\tstruct regmap *regmap;\n\tstruct irq_domain *irqdm;\n\tint irq;\n\tstruct lp8788_platform_data *pdata;\n};\n\nstruct lp8788_buck1_dvs {\n\tenum lp8788_dvs_sel vsel;\n};\n\nstruct lp8788_buck2_dvs {\n\tenum lp8788_dvs_sel vsel;\n};\n\nstruct lp8788_chg_param;\n\nstruct lp8788_charger_platform_data {\n\tconst char *adc_vbatt;\n\tconst char *adc_batt_temp;\n\tunsigned int max_vbatt_mv;\n\tstruct lp8788_chg_param *chg_params;\n\tint num_chg_params;\n\tvoid (*charger_event)(struct lp8788 *, enum lp8788_charger_event);\n};\n\nstruct lp8788_chg_param {\n\tu8 addr;\n\tu8 val;\n};\n\nstruct lp8788_irq_data {\n\tstruct lp8788 *lp;\n\tstruct mutex irq_lock;\n\tstruct irq_domain *domain;\n\tint enabled[24];\n};\n\nstruct lp8788_led_platform_data {\n\tchar *name;\n\tenum lp8788_isink_scale scale;\n\tenum lp8788_isink_number num;\n\tint iout_code;\n};\n\nstruct iio_map;\n\nstruct lp8788_vib_platform_data;\n\nstruct lp8788_platform_data {\n\tint (*init_func)(struct lp8788 *);\n\tstruct regulator_init_data *buck_data[4];\n\tstruct regulator_init_data *dldo_data[12];\n\tstruct regulator_init_data *aldo_data[10];\n\tstruct lp8788_buck1_dvs *buck1_dvs;\n\tstruct lp8788_buck2_dvs *buck2_dvs;\n\tstruct lp8788_charger_platform_data *chg_pdata;\n\tenum lp8788_alarm_sel alarm_sel;\n\tstruct lp8788_led_platform_data *led_pdata;\n\tstruct lp8788_vib_platform_data *vib_pdata;\n\tstruct iio_map *adc_pdata;\n};\n\nstruct lp8788_vib_platform_data {\n\tchar *name;\n\tenum lp8788_isink_scale scale;\n\tenum lp8788_isink_number num;\n\tint iout_code;\n\tint pwm_code;\n};\n\nstruct lpi_constraints {\n\tacpi_handle handle;\n\tint min_dstate;\n};\n\nstruct lpi_device_constraint {\n\tint uid;\n\tint min_dstate;\n\tint function_states;\n};\n\nstruct lpi_device_constraint_amd {\n\tchar *name;\n\tint enabled;\n\tint function_states;\n\tint min_dstate;\n};\n\nstruct lpi_device_info {\n\tchar *name;\n\tint enabled;\n\tunion acpi_object *package;\n};\n\nstruct lpit_residency_info {\n\tstruct acpi_generic_address gaddr;\n\tu64 frequency;\n\tvoid *iomem_addr;\n};\n\nstruct lpm_trie_node;\n\nstruct lpm_trie {\n\tstruct bpf_map map;\n\tstruct lpm_trie_node *root;\n\tsize_t n_entries;\n\tsize_t max_prefixlen;\n\tsize_t data_size;\n\tspinlock_t lock;\n};\n\nstruct lpm_trie_node {\n\tstruct callback_head rcu;\n\tstruct lpm_trie_node *child[2];\n\tu32 prefixlen;\n\tu32 flags;\n\tu8 data[0];\n};\n\nstruct lpss_clk_data {\n\tconst char *name;\n\tstruct clk *clk;\n};\n\nstruct lpss_private_data;\n\nstruct lpss_device_desc {\n\tunsigned int flags;\n\tconst char *clk_con_id;\n\tunsigned int prv_offset;\n\tsize_t prv_size_override;\n\tconst struct property_entry *properties;\n\tvoid (*setup)(struct lpss_private_data *);\n\tbool resume_from_noirq;\n};\n\nstruct lpss_device_links {\n\tconst char *supplier_hid;\n\tconst char *supplier_uid;\n\tconst char *consumer_hid;\n\tconst char *consumer_uid;\n\tu32 flags;\n\tconst struct dmi_system_id *dep_missing_ids;\n};\n\nstruct lpss_private_data {\n\tstruct acpi_device *adev;\n\tvoid *mmio_base;\n\tresource_size_t mmio_size;\n\tunsigned int fixed_clk_rate;\n\tstruct clk *clk;\n\tconst struct lpss_device_desc *dev_desc;\n\tu32 prv_reg_ctx[9];\n};\n\nstruct lru_gen_folio {\n\tlong unsigned int max_seq;\n\tlong unsigned int min_seq[2];\n\tlong unsigned int timestamps[4];\n\tstruct list_head folios[40];\n\tlong int nr_pages[40];\n\tlong unsigned int avg_refaulted[8];\n\tlong unsigned int avg_total[8];\n\tlong unsigned int protected[6];\n\tatomic_long_t evicted[8];\n\tatomic_long_t refaulted[8];\n\tbool enabled;\n\tu8 gen;\n\tu8 seg;\n\tstruct hlist_nulls_node list;\n};\n\nstruct lru_gen_memcg {\n\tlong unsigned int seq;\n\tlong unsigned int nr_memcgs[3];\n\tstruct hlist_nulls_head fifo[24];\n\tspinlock_t lock;\n};\n\nstruct lru_gen_mm_list {\n\tstruct list_head fifo;\n\tspinlock_t lock;\n};\n\nstruct lru_gen_mm_state {\n\tlong unsigned int seq;\n\tstruct list_head *head;\n\tstruct list_head *tail;\n\tlong unsigned int *filters[2];\n\tlong unsigned int stats[4];\n};\n\nstruct lruvec;\n\nstruct lru_gen_mm_walk {\n\tstruct lruvec *lruvec;\n\tlong unsigned int seq;\n\tlong unsigned int next_addr;\n\tint nr_pages[40];\n\tint mm_stats[4];\n\tint batched;\n\tbool can_swap;\n\tbool force_scan;\n};\n\nstruct lru_rotate {\n\tlocal_lock_t lock;\n\tstruct folio_batch fbatch;\n};\n\nstruct zswap_lruvec_state {\n\tatomic_long_t nr_zswap_protected;\n};\n\nstruct pglist_data;\n\nstruct lruvec {\n\tstruct list_head lists[5];\n\tspinlock_t lru_lock;\n\tlong unsigned int anon_cost;\n\tlong unsigned int file_cost;\n\tatomic_long_t nonresident_age;\n\tlong unsigned int refaults[2];\n\tlong unsigned int flags;\n\tstruct lru_gen_folio lrugen;\n\tstruct lru_gen_mm_state mm_state;\n\tstruct pglist_data *pgdat;\n\tstruct zswap_lruvec_state zswap_lruvec_state;\n};\n\nstruct lruvec_stats {\n\tlong int state[27];\n\tlong int state_local[27];\n\tlong int state_pending[27];\n};\n\nstruct lruvec_stats_percpu {\n\tlong int state[27];\n\tlong int state_prev[27];\n};\n\nstruct skcipher_alg_common {\n\tunsigned int min_keysize;\n\tunsigned int max_keysize;\n\tunsigned int ivsize;\n\tunsigned int chunksize;\n\tunsigned int statesize;\n\tstruct crypto_alg base;\n};\n\nstruct lskcipher_alg {\n\tint (*setkey)(struct crypto_lskcipher *, const u8 *, unsigned int);\n\tint (*encrypt)(struct crypto_lskcipher *, const u8 *, u8 *, unsigned int, u8 *, u32);\n\tint (*decrypt)(struct crypto_lskcipher *, const u8 *, u8 *, unsigned int, u8 *, u32);\n\tint (*init)(struct crypto_lskcipher *);\n\tvoid (*exit)(struct crypto_lskcipher *);\n\tstruct skcipher_alg_common co;\n};\n\nstruct lskcipher_instance {\n\tvoid (*free)(struct lskcipher_instance *);\n\tunion {\n\t\tstruct {\n\t\t\tchar head[64];\n\t\t\tstruct crypto_instance base;\n\t\t} s;\n\t\tstruct lskcipher_alg alg;\n\t};\n};\n\nstruct lsm_blob_sizes {\n\tint lbs_cred;\n\tint lbs_file;\n\tint lbs_inode;\n\tint lbs_sock;\n\tint lbs_superblock;\n\tint lbs_ipc;\n\tint lbs_key;\n\tint lbs_msg_msg;\n\tint lbs_task;\n\tint lbs_xattr_count;\n\tint lbs_mnt_opts;\n\tbool lbs_secmark;\n\tbool lbs_netlabel;\n};\n\nstruct lsm_ctx {\n\t__u64 id;\n\t__u64 flags;\n\t__u64 len;\n\t__u64 ctx_len;\n\t__u8 ctx[0];\n};\n\nstruct lsm_ibendport_audit {\n\tconst char *dev_name;\n\tu8 port;\n};\n\nstruct lsm_ibpkey_audit {\n\tu64 subnet_prefix;\n\tu16 pkey;\n};\n\nstruct lsm_id {\n\tconst char *name;\n\tu64 id;\n\tbool lsmblob;\n};\n\nstruct lsm_info {\n\tconst char *name;\n\tenum lsm_order order;\n\tlong unsigned int flags;\n\tint *enabled;\n\tint (*init)(void);\n\tstruct lsm_blob_sizes *blobs;\n};\n\nstruct lsm_ioctlop_audit {\n\tstruct path path;\n\tu16 cmd;\n};\n\nstruct lsm_network_audit {\n\tint netif;\n\tconst struct sock *sk;\n\tu16 family;\n\t__be16 dport;\n\t__be16 sport;\n\tunion {\n\t\tstruct {\n\t\t\t__be32 daddr;\n\t\t\t__be32 saddr;\n\t\t} v4;\n\t\tstruct {\n\t\t\tstruct in6_addr daddr;\n\t\t\tstruct in6_addr saddr;\n\t\t} v6;\n\t} fam;\n};\n\nstruct lsmcontext {\n\tchar *context;\n\tu32 len;\n\tint id;\n};\n\nstruct lv_info {\n\tshort unsigned int pps_per_lv;\n\tshort unsigned int pps_found;\n\tunsigned char lv_is_contiguous;\n};\n\nstruct lvd {\n\t__be16 lv_ix;\n\t__be16 res2;\n\t__be16 res4;\n\t__be16 maxsize;\n\t__be16 lv_state;\n\t__be16 mirror;\n\t__be16 mirror_policy;\n\t__be16 num_lps;\n\t__be16 res10[8];\n};\n\nstruct lvm_rec {\n\tchar lvm_id[4];\n\tchar reserved4[16];\n\t__be32 lvmarea_len;\n\t__be32 vgda_len;\n\t__be32 vgda_psn[2];\n\tchar reserved36[10];\n\t__be16 pp_size;\n\tchar reserved46[12];\n\t__be16 version;\n};\n\nstruct lvname {\n\tchar name[64];\n};\n\nstruct lwq {\n\tspinlock_t lock;\n\tstruct llist_node *ready;\n\tstruct llist_head new;\n};\n\nstruct lwq_node {\n\tstruct llist_node node;\n};\n\nstruct lwtunnel_encap_ops {\n\tint (*build_state)(struct net *, struct nlattr *, unsigned int, const void *, struct lwtunnel_state **, struct netlink_ext_ack *);\n\tvoid (*destroy_state)(struct lwtunnel_state *);\n\tint (*output)(struct net *, struct sock *, struct sk_buff *);\n\tint (*input)(struct sk_buff *);\n\tint (*fill_encap)(struct sk_buff *, struct lwtunnel_state *);\n\tint (*get_encap_size)(struct lwtunnel_state *);\n\tint (*cmp_encap)(struct lwtunnel_state *, struct lwtunnel_state *);\n\tint (*xmit)(struct sk_buff *);\n\tstruct module *owner;\n};\n\nstruct lwtunnel_state {\n\t__u16 type;\n\t__u16 flags;\n\t__u16 headroom;\n\tatomic_t refcnt;\n\tint (*orig_output)(struct net *, struct sock *, struct sk_buff *);\n\tint (*orig_input)(struct sk_buff *);\n\tstruct callback_head rcu;\n\t__u8 data[0];\n};\n\nstruct lz4_comp_opts {\n\t__le32 version;\n\t__le32 flags;\n};\n\nstruct lzma2_dec {\n\tenum lzma2_seq sequence;\n\tenum lzma2_seq next_sequence;\n\tuint32_t uncompressed;\n\tuint32_t compressed;\n\tbool need_dict_reset;\n\tbool need_props;\n\tbool pedantic_microlzma;\n};\n\nstruct lzma_len_dec {\n\tuint16_t choice;\n\tuint16_t choice2;\n\tuint16_t low[128];\n\tuint16_t mid[128];\n\tuint16_t high[256];\n};\n\nstruct lzma_dec {\n\tuint32_t rep0;\n\tuint32_t rep1;\n\tuint32_t rep2;\n\tuint32_t rep3;\n\tenum lzma_state state;\n\tuint32_t len;\n\tuint32_t lc;\n\tuint32_t literal_pos_mask;\n\tuint32_t pos_mask;\n\tuint16_t is_match[192];\n\tuint16_t is_rep[12];\n\tuint16_t is_rep0[12];\n\tuint16_t is_rep1[12];\n\tuint16_t is_rep2[12];\n\tuint16_t is_rep0_long[192];\n\tuint16_t dist_slot[256];\n\tuint16_t dist_special[114];\n\tuint16_t dist_align[16];\n\tstruct lzma_len_dec match_len_dec;\n\tstruct lzma_len_dec rep_len_dec;\n\tuint16_t literal[12288];\n};\n\nstruct lzma_header {\n\tuint8_t pos;\n\tuint32_t dict_size;\n\tuint64_t dst_size;\n} __attribute__((packed));\n\nstruct lzo_ctx {\n\tvoid *lzo_comp_mem;\n};\n\nstruct lzorle_ctx {\n\tvoid *lzorle_comp_mem;\n};\n\nstruct ma_topiary {\n\tstruct maple_enode *head;\n\tstruct maple_enode *tail;\n\tstruct maple_tree *mtree;\n};\n\nstruct maple_node;\n\nstruct ma_wr_state {\n\tstruct ma_state *mas;\n\tstruct maple_node *node;\n\tlong unsigned int r_min;\n\tlong unsigned int r_max;\n\tenum maple_type type;\n\tunsigned char offset_end;\n\tlong unsigned int *pivots;\n\tlong unsigned int end_piv;\n\tvoid **slots;\n\tvoid *entry;\n\tvoid *content;\n};\n\nstruct mac_addr {\n\tunsigned char addr[6];\n};\n\ntypedef struct mac_addr mac_addr;\n\nstruct mac_address {\n\tu8 addr[6];\n};\n\nstruct mac_driver_desc {\n\t__be16 signature;\n\t__be16 block_size;\n\t__be32 block_count;\n};\n\nstruct mac_partition {\n\t__be16 signature;\n\t__be16 res1;\n\t__be32 map_count;\n\t__be32 start_block;\n\t__be32 block_count;\n\tchar name[32];\n\tchar type[32];\n\t__be32 data_start;\n\t__be32 data_count;\n\t__be32 status;\n\t__be32 boot_start;\n\t__be32 boot_size;\n\t__be32 boot_load;\n\t__be32 boot_load2;\n\t__be32 boot_entry;\n\t__be32 boot_entry2;\n\t__be32 boot_cksum;\n\tchar processor[16];\n};\n\nstruct machine_ops {\n\tvoid (*restart)(char *);\n\tvoid (*halt)(void);\n\tvoid (*power_off)(void);\n\tvoid (*shutdown)(void);\n\tvoid (*crash_shutdown)(struct pt_regs *);\n\tvoid (*emergency_restart)(void);\n};\n\nstruct macsec_secy;\n\nstruct macsec_rx_sc;\n\nstruct macsec_rx_sa;\n\nstruct macsec_tx_sa;\n\nstruct macsec_tx_sc_stats;\n\nstruct macsec_tx_sa_stats;\n\nstruct macsec_rx_sc_stats;\n\nstruct macsec_rx_sa_stats;\n\nstruct macsec_dev_stats;\n\nstruct macsec_context {\n\tunion {\n\t\tstruct net_device *netdev;\n\t\tstruct phy_device *phydev;\n\t};\n\tenum macsec_offload offload;\n\tstruct macsec_secy *secy;\n\tstruct macsec_rx_sc *rx_sc;\n\tstruct {\n\t\tbool update_pn;\n\t\tunsigned char assoc_num;\n\t\tu8 key[128];\n\t\tunion {\n\t\t\tstruct macsec_rx_sa *rx_sa;\n\t\t\tstruct macsec_tx_sa *tx_sa;\n\t\t};\n\t} sa;\n\tunion {\n\t\tstruct macsec_tx_sc_stats *tx_sc_stats;\n\t\tstruct macsec_tx_sa_stats *tx_sa_stats;\n\t\tstruct macsec_rx_sc_stats *rx_sc_stats;\n\t\tstruct macsec_rx_sa_stats *rx_sa_stats;\n\t\tstruct macsec_dev_stats *dev_stats;\n\t} stats;\n};\n\nstruct macsec_dev_stats {\n\t__u64 OutPktsUntagged;\n\t__u64 InPktsUntagged;\n\t__u64 OutPktsTooLong;\n\t__u64 InPktsNoTag;\n\t__u64 InPktsBadTag;\n\t__u64 InPktsUnknownSCI;\n\t__u64 InPktsNoSCI;\n\t__u64 InPktsOverrun;\n};\n\nstruct macsec_info {\n\tsci_t sci;\n};\n\nunion salt {\n\tstruct {\n\t\tu32 ssci;\n\t\tu64 pn;\n\t} __attribute__((packed));\n\tu8 bytes[12];\n};\n\ntypedef union salt salt_t;\n\nstruct macsec_key {\n\tu8 id[16];\n\tstruct crypto_aead *tfm;\n\tsalt_t salt;\n};\n\nstruct macsec_ops {\n\tint (*mdo_dev_open)(struct macsec_context *);\n\tint (*mdo_dev_stop)(struct macsec_context *);\n\tint (*mdo_add_secy)(struct macsec_context *);\n\tint (*mdo_upd_secy)(struct macsec_context *);\n\tint (*mdo_del_secy)(struct macsec_context *);\n\tint (*mdo_add_rxsc)(struct macsec_context *);\n\tint (*mdo_upd_rxsc)(struct macsec_context *);\n\tint (*mdo_del_rxsc)(struct macsec_context *);\n\tint (*mdo_add_rxsa)(struct macsec_context *);\n\tint (*mdo_upd_rxsa)(struct macsec_context *);\n\tint (*mdo_del_rxsa)(struct macsec_context *);\n\tint (*mdo_add_txsa)(struct macsec_context *);\n\tint (*mdo_upd_txsa)(struct macsec_context *);\n\tint (*mdo_del_txsa)(struct macsec_context *);\n\tint (*mdo_get_dev_stats)(struct macsec_context *);\n\tint (*mdo_get_tx_sc_stats)(struct macsec_context *);\n\tint (*mdo_get_tx_sa_stats)(struct macsec_context *);\n\tint (*mdo_get_rx_sc_stats)(struct macsec_context *);\n\tint (*mdo_get_rx_sa_stats)(struct macsec_context *);\n\tint (*mdo_insert_tx_tag)(struct phy_device *, struct sk_buff *);\n\tunsigned int needed_headroom;\n\tunsigned int needed_tailroom;\n\tbool rx_uses_md_dst;\n};\n\nunion pn {\n\tstruct {\n\t\tu32 lower;\n\t\tu32 upper;\n\t};\n\tu64 full64;\n};\n\ntypedef union pn pn_t;\n\nstruct macsec_rx_sa {\n\tstruct macsec_key key;\n\tssci_t ssci;\n\tspinlock_t lock;\n\tunion {\n\t\tpn_t next_pn_halves;\n\t\tu64 next_pn;\n\t};\n\trefcount_t refcnt;\n\tbool active;\n\tstruct macsec_rx_sa_stats *stats;\n\tstruct macsec_rx_sc *sc;\n\tstruct callback_head rcu;\n};\n\nstruct macsec_rx_sa_stats {\n\t__u32 InPktsOK;\n\t__u32 InPktsInvalid;\n\t__u32 InPktsNotValid;\n\t__u32 InPktsNotUsingSA;\n\t__u32 InPktsUnusedSA;\n};\n\nstruct pcpu_rx_sc_stats;\n\nstruct macsec_rx_sc {\n\tstruct macsec_rx_sc *next;\n\tsci_t sci;\n\tbool active;\n\tstruct macsec_rx_sa *sa[4];\n\tstruct pcpu_rx_sc_stats *stats;\n\trefcount_t refcnt;\n\tstruct callback_head callback_head;\n};\n\nstruct macsec_rx_sc_stats {\n\t__u64 InOctetsValidated;\n\t__u64 InOctetsDecrypted;\n\t__u64 InPktsUnchecked;\n\t__u64 InPktsDelayed;\n\t__u64 InPktsOK;\n\t__u64 InPktsInvalid;\n\t__u64 InPktsLate;\n\t__u64 InPktsNotValid;\n\t__u64 InPktsNotUsingSA;\n\t__u64 InPktsUnusedSA;\n};\n\nstruct pcpu_tx_sc_stats;\n\nstruct macsec_tx_sc {\n\tbool active;\n\tu8 encoding_sa;\n\tbool encrypt;\n\tbool send_sci;\n\tbool end_station;\n\tbool scb;\n\tstruct macsec_tx_sa *sa[4];\n\tstruct pcpu_tx_sc_stats *stats;\n\tstruct metadata_dst *md_dst;\n};\n\nstruct macsec_secy {\n\tstruct net_device *netdev;\n\tunsigned int n_rx_sc;\n\tsci_t sci;\n\tu16 key_len;\n\tu16 icv_len;\n\tenum macsec_validation_type validate_frames;\n\tbool xpn;\n\tbool operational;\n\tbool protect_frames;\n\tbool replay_protect;\n\tu32 replay_window;\n\tstruct macsec_tx_sc tx_sc;\n\tstruct macsec_rx_sc *rx_sc;\n};\n\nstruct macsec_tx_sa {\n\tstruct macsec_key key;\n\tssci_t ssci;\n\tspinlock_t lock;\n\tunion {\n\t\tpn_t next_pn_halves;\n\t\tu64 next_pn;\n\t};\n\trefcount_t refcnt;\n\tbool active;\n\tstruct macsec_tx_sa_stats *stats;\n\tstruct callback_head rcu;\n};\n\nstruct macsec_tx_sa_stats {\n\t__u32 OutPktsProtected;\n\t__u32 OutPktsEncrypted;\n};\n\nstruct macsec_tx_sc_stats {\n\t__u64 OutPktsProtected;\n\t__u64 OutPktsEncrypted;\n\t__u64 OutOctetsProtected;\n\t__u64 OutOctetsEncrypted;\n};\n\nstruct mmu_gather;\n\nstruct madvise_walk_private {\n\tstruct mmu_gather *tlb;\n\tbool pageout;\n};\n\nstruct mafield {\n\tconst char *prefix;\n\tint field;\n};\n\nstruct make_exclusive_args {\n\tstruct mm_struct *mm;\n\tlong unsigned int address;\n\tvoid *owner;\n\tbool valid;\n};\n\nstruct map_attribute {\n\tstruct attribute attr;\n\tssize_t (*show)(struct efi_runtime_map_entry *, char *);\n};\n\nstruct map_balloon_pages {\n\txen_pfn_t *pfns;\n\tunsigned int idx;\n};\n\nstruct map_files_info {\n\tlong unsigned int start;\n\tlong unsigned int end;\n\tfmode_t mode;\n};\n\nstruct map_info___2 {\n\tstruct map_info___2 *next;\n\tstruct mm_struct *mm;\n\tlong unsigned int vaddr;\n};\n\nstruct map_iter {\n\tvoid *key;\n\tbool done;\n};\n\nstruct map_range {\n\tlong unsigned int start;\n\tlong unsigned int end;\n\tunsigned int page_size_mask;\n};\n\nstruct xenbus_map_node;\n\nstruct map_ring_valloc {\n\tstruct xenbus_map_node *node;\n\tlong unsigned int addrs[16];\n\tphys_addr_t phys_addrs[16];\n\tstruct gnttab_map_grant_ref map[16];\n\tstruct gnttab_unmap_grant_ref unmap[16];\n\tunsigned int idx;\n};\n\nstruct maple_alloc {\n\tlong unsigned int total;\n\tunsigned char node_count;\n\tunsigned int request_count;\n\tstruct maple_alloc *slot[30];\n};\n\nstruct maple_pnode;\n\nstruct maple_metadata {\n\tunsigned char end;\n\tunsigned char gap;\n};\n\nstruct maple_arange_64 {\n\tstruct maple_pnode *parent;\n\tlong unsigned int pivot[9];\n\tvoid *slot[10];\n\tlong unsigned int gap[10];\n\tstruct maple_metadata meta;\n};\n\nstruct maple_big_node {\n\tstruct maple_pnode *parent;\n\tlong unsigned int pivot[33];\n\tunion {\n\t\tstruct maple_enode *slot[34];\n\t\tstruct {\n\t\t\tlong unsigned int padding[21];\n\t\t\tlong unsigned int gap[21];\n\t\t};\n\t};\n\tunsigned char b_end;\n\tenum maple_type type;\n};\n\nstruct maple_range_64 {\n\tstruct maple_pnode *parent;\n\tlong unsigned int pivot[15];\n\tunion {\n\t\tvoid *slot[16];\n\t\tstruct {\n\t\t\tvoid *pad[15];\n\t\t\tstruct maple_metadata meta;\n\t\t};\n\t};\n};\n\nstruct maple_node {\n\tunion {\n\t\tstruct {\n\t\t\tstruct maple_pnode *parent;\n\t\t\tvoid *slot[31];\n\t\t};\n\t\tstruct {\n\t\t\tvoid *pad;\n\t\t\tstruct callback_head rcu;\n\t\t\tstruct maple_enode *piv_parent;\n\t\t\tunsigned char parent_slot;\n\t\t\tenum maple_type type;\n\t\t\tunsigned char slot_len;\n\t\t\tunsigned int ma_flags;\n\t\t};\n\t\tstruct maple_range_64 mr64;\n\t\tstruct maple_arange_64 ma64;\n\t\tstruct maple_alloc alloc;\n\t};\n};\n\nstruct maple_subtree_state {\n\tstruct ma_state *orig_l;\n\tstruct ma_state *orig_r;\n\tstruct ma_state *l;\n\tstruct ma_state *m;\n\tstruct ma_state *r;\n\tstruct ma_topiary *free;\n\tstruct ma_topiary *destroy;\n\tstruct maple_big_node *bn;\n};\n\nstruct maple_topiary {\n\tstruct maple_pnode *parent;\n\tstruct maple_enode *next;\n};\n\nstruct mapped_device {\n\tstruct mutex suspend_lock;\n\tstruct mutex table_devices_lock;\n\tstruct list_head table_devices;\n\tvoid *map;\n\tlong unsigned int flags;\n\tstruct mutex type_lock;\n\tenum dm_queue_mode type;\n\tint numa_node_id;\n\tstruct request_queue *queue;\n\tatomic_t holders;\n\tatomic_t open_count;\n\tstruct dm_target *immutable_target;\n\tstruct target_type *immutable_target_type;\n\tchar name[16];\n\tstruct gendisk *disk;\n\tstruct dax_device *dax_dev;\n\twait_queue_head_t wait;\n\tlong unsigned int *pending_io;\n\tstruct hd_geometry geometry;\n\tstruct workqueue_struct *wq;\n\tstruct work_struct work;\n\tspinlock_t deferred_lock;\n\tstruct bio_list deferred;\n\tstruct work_struct requeue_work;\n\tstruct dm_io *requeue_list;\n\tvoid *interface_ptr;\n\twait_queue_head_t eventq;\n\tatomic_t event_nr;\n\tatomic_t uevent_seq;\n\tstruct list_head uevent_list;\n\tspinlock_t uevent_lock;\n\tbool init_tio_pdu: 1;\n\tstruct blk_mq_tag_set *tag_set;\n\tstruct dm_stats stats;\n\tunsigned int internal_suspend_count;\n\tint swap_bios;\n\tstruct semaphore swap_bios_semaphore;\n\tstruct mutex swap_bios_lock;\n\tstruct dm_md_mempools *mempools;\n\tstruct dm_kobject_holder kobj_holder;\n\tstruct srcu_struct io_barrier;\n\tunsigned int nr_zones;\n\tvoid *zone_revalidate_map;\n\tstruct dm_ima_measurements ima;\n};\n\nstruct mapping_area {\n\tlocal_lock_t lock;\n\tchar *vm_buf;\n\tchar *vm_addr;\n\tenum zs_mapmode vm_mm;\n};\n\nstruct match_addr {\n\tconst char *addrp;\n\tenum addr_type addrtype;\n\tint len;\n\t__be16 port;\n};\n\nstruct match_ids_walk_data {\n\tstruct acpi_device_id *ids;\n\tstruct acpi_device *adev;\n};\n\nstruct match_token {\n\tint token;\n\tconst char *pattern;\n};\n\nstruct match_workbuf {\n\tunsigned int count;\n\tunsigned int pos;\n\tunsigned int len;\n\tunsigned int size;\n\tunsigned int history[24];\n};\n\nstruct math_emu_info {\n\tlong int ___orig_eip;\n\tstruct pt_regs *regs;\n};\n\nstruct max14577 {\n\tstruct device *dev;\n\tstruct i2c_client *i2c;\n\tstruct i2c_client *i2c_pmic;\n\tenum maxim_device_type dev_type;\n\tstruct regmap *regmap;\n\tstruct regmap *regmap_pmic;\n\tstruct regmap_irq_chip_data *irq_data;\n\tstruct regmap_irq_chip_data *irq_data_pmic;\n\tint irq;\n};\n\nstruct max14577_regulator_platform_data;\n\nstruct max14577_platform_data {\n\tint irq_base;\n\tint gpio_pogo_vbatt_en;\n\tint gpio_pogo_vbus_en;\n\tint (*set_gpio_pogo_vbatt_en)(int);\n\tint (*set_gpio_pogo_vbus_en)(int);\n\tint (*set_gpio_pogo_cb)(int);\n\tstruct max14577_regulator_platform_data *regulators;\n};\n\nstruct max14577_regulator_platform_data {\n\tint id;\n\tstruct regulator_init_data *initdata;\n\tstruct device_node *of_node;\n};\n\nstruct max310x_devtype {\n\tstruct {\n\t\tshort unsigned int min;\n\t\tshort unsigned int max;\n\t} slave_addr;\n\tint nr;\n\tchar name[9];\n\tu8 mode1;\n\tu8 rev_id_val;\n\tu8 rev_id_reg;\n\tu8 power_reg;\n\tu8 power_bit;\n};\n\nstruct max310x_if_cfg {\n\tint (*extended_reg_enable)(struct device *, bool);\n\tu8 rev_id_offset;\n};\n\nstruct max310x_one {\n\tstruct uart_port port;\n\tstruct work_struct tx_work;\n\tstruct work_struct md_work;\n\tstruct work_struct rs_work;\n\tstruct regmap *regmap;\n\tu8 rx_buf[128];\n};\n\nstruct max310x_port {\n\tconst struct max310x_devtype *devtype;\n\tconst struct max310x_if_cfg *if_cfg;\n\tstruct regmap *regmap;\n\tstruct clk *clk;\n\tstruct gpio_chip gpio;\n\tstruct max310x_one p[0];\n};\n\nstruct max77693_dev {\n\tstruct device *dev;\n\tstruct i2c_client *i2c;\n\tstruct i2c_client *i2c_muic;\n\tstruct i2c_client *i2c_haptic;\n\tstruct i2c_client *i2c_chg;\n\tenum max77693_types type;\n\tstruct regmap *regmap;\n\tstruct regmap *regmap_muic;\n\tstruct regmap *regmap_haptic;\n\tstruct regmap *regmap_chg;\n\tstruct regmap_irq_chip_data *irq_data_led;\n\tstruct regmap_irq_chip_data *irq_data_topsys;\n\tstruct regmap_irq_chip_data *irq_data_chg;\n\tstruct regmap_irq_chip_data *irq_data_muic;\n\tint irq;\n};\n\nstruct max8925_backlight_pdata {\n\tint lxw_scl;\n\tint lxw_freq;\n\tint dual_string;\n};\n\nstruct max8925_chip {\n\tstruct device *dev;\n\tstruct i2c_client *i2c;\n\tstruct i2c_client *adc;\n\tstruct i2c_client *rtc;\n\tstruct mutex io_lock;\n\tstruct mutex irq_lock;\n\tint irq_base;\n\tint core_irq;\n\tint tsc_irq;\n\tunsigned int wakeup_flag;\n};\n\nstruct max8925_irq_data {\n\tint reg;\n\tint mask_reg;\n\tint enable;\n\tint offs;\n\tint flags;\n\tint tsc_irq;\n};\n\nstruct max8925_touch_pdata;\n\nstruct max8925_power_pdata;\n\nstruct max8925_platform_data {\n\tstruct max8925_backlight_pdata *backlight;\n\tstruct max8925_touch_pdata *touch;\n\tstruct max8925_power_pdata *power;\n\tstruct regulator_init_data *sd1;\n\tstruct regulator_init_data *sd2;\n\tstruct regulator_init_data *sd3;\n\tstruct regulator_init_data *ldo1;\n\tstruct regulator_init_data *ldo2;\n\tstruct regulator_init_data *ldo3;\n\tstruct regulator_init_data *ldo4;\n\tstruct regulator_init_data *ldo5;\n\tstruct regulator_init_data *ldo6;\n\tstruct regulator_init_data *ldo7;\n\tstruct regulator_init_data *ldo8;\n\tstruct regulator_init_data *ldo9;\n\tstruct regulator_init_data *ldo10;\n\tstruct regulator_init_data *ldo11;\n\tstruct regulator_init_data *ldo12;\n\tstruct regulator_init_data *ldo13;\n\tstruct regulator_init_data *ldo14;\n\tstruct regulator_init_data *ldo15;\n\tstruct regulator_init_data *ldo16;\n\tstruct regulator_init_data *ldo17;\n\tstruct regulator_init_data *ldo18;\n\tstruct regulator_init_data *ldo19;\n\tstruct regulator_init_data *ldo20;\n\tint irq_base;\n\tint tsc_irq;\n};\n\nstruct max8925_power_pdata {\n\tint (*set_charger)(int);\n\tunsigned int batt_detect: 1;\n\tunsigned int topoff_threshold: 2;\n\tunsigned int fast_charge: 3;\n\tunsigned int no_temp_support: 1;\n\tunsigned int no_insert_detect: 1;\n\tchar **supplied_to;\n\tint num_supplicants;\n};\n\nstruct max8925_touch_pdata {\n\tunsigned int flags;\n};\n\nstruct max8997_platform_data;\n\nstruct max8997_dev {\n\tstruct device *dev;\n\tstruct max8997_platform_data *pdata;\n\tstruct i2c_client *i2c;\n\tstruct i2c_client *rtc;\n\tstruct i2c_client *haptic;\n\tstruct i2c_client *muic;\n\tstruct mutex iolock;\n\tlong unsigned int type;\n\tstruct platform_device *battery;\n\tint irq;\n\tint ono;\n\tstruct irq_domain *irq_domain;\n\tstruct mutex irqlock;\n\tint irq_masks_cur[11];\n\tint irq_masks_cache[11];\n\tu8 reg_dump[187];\n\tbool gpio_status[12];\n};\n\nstruct max8997_haptic_platform_data {\n\tunsigned int pwm_period;\n\tenum max8997_haptic_motor_type type;\n\tenum max8997_haptic_pulse_mode mode;\n\tenum max8997_haptic_pwm_divisor pwm_divisor;\n\tunsigned int internal_mode_pattern;\n\tunsigned int pattern_cycle;\n\tunsigned int pattern_signal_period;\n};\n\nstruct max8997_irq_data {\n\tint mask;\n\tenum max8997_irq_source group;\n};\n\nstruct max8997_led_platform_data {\n\tenum max8997_led_mode mode[2];\n\tu8 brightness[2];\n};\n\nstruct max8997_muic_reg_data;\n\nstruct max8997_muic_platform_data {\n\tstruct max8997_muic_reg_data *init_data;\n\tint num_init_data;\n\tint detcable_delay_ms;\n\tint path_usb;\n\tint path_uart;\n};\n\nstruct max8997_muic_reg_data {\n\tu8 addr;\n\tu8 data;\n};\n\nstruct max8997_regulator_data;\n\nstruct max8997_platform_data {\n\tint ono;\n\tstruct max8997_regulator_data *regulators;\n\tint num_regulators;\n\tbool ignore_gpiodvs_side_effect;\n\tint buck125_default_idx;\n\tunsigned int buck1_voltage[8];\n\tbool buck1_gpiodvs;\n\tunsigned int buck2_voltage[8];\n\tbool buck2_gpiodvs;\n\tunsigned int buck5_voltage[8];\n\tbool buck5_gpiodvs;\n\tint eoc_mA;\n\tint timeout;\n\tstruct max8997_muic_platform_data *muic_pdata;\n\tstruct max8997_haptic_platform_data *haptic_pdata;\n\tstruct max8997_led_platform_data *led_pdata;\n};\n\nstruct max8997_regulator_data {\n\tint id;\n\tstruct regulator_init_data *initdata;\n\tstruct device_node *reg_node;\n};\n\nstruct max8998_platform_data;\n\nstruct max8998_dev {\n\tstruct device *dev;\n\tstruct max8998_platform_data *pdata;\n\tstruct i2c_client *i2c;\n\tstruct i2c_client *rtc;\n\tstruct mutex iolock;\n\tstruct mutex irqlock;\n\tunsigned int irq_base;\n\tstruct irq_domain *irq_domain;\n\tint irq;\n\tint ono;\n\tu8 irq_masks_cur[4];\n\tu8 irq_masks_cache[4];\n\tlong unsigned int type;\n\tbool wakeup;\n};\n\nstruct max8998_irq_data {\n\tint reg;\n\tint mask;\n};\n\nstruct max8998_regulator_data;\n\nstruct max8998_platform_data {\n\tstruct max8998_regulator_data *regulators;\n\tint num_regulators;\n\tunsigned int irq_base;\n\tint ono;\n\tbool buck_voltage_lock;\n\tint buck1_voltage[4];\n\tint buck2_voltage[2];\n\tint buck1_default_idx;\n\tint buck2_default_idx;\n\tbool wakeup;\n\tbool rtc_delay;\n\tint eoc;\n\tint restart;\n\tint timeout;\n};\n\nstruct max8998_reg_dump {\n\tu8 addr;\n\tu8 val;\n};\n\nstruct max8998_regulator_data {\n\tint id;\n\tstruct regulator_init_data *initdata;\n\tstruct device_node *reg_node;\n};\n\nstruct maxim_charger_current {\n\tunsigned int min;\n\tunsigned int high_start;\n\tunsigned int high_step;\n\tunsigned int max;\n};\n\nstruct mb_cache {\n\tstruct hlist_bl_head *c_hash;\n\tint c_bucket_bits;\n\tlong unsigned int c_max_entries;\n\tspinlock_t c_list_lock;\n\tstruct list_head c_list;\n\tlong unsigned int c_entry_count;\n\tstruct shrinker *c_shrink;\n\tstruct work_struct c_shrink_work;\n};\n\nstruct mb_cache_entry {\n\tstruct list_head e_list;\n\tstruct hlist_bl_node e_hash_list;\n\tatomic_t e_refcnt;\n\tu32 e_key;\n\tlong unsigned int e_flags;\n\tu64 e_value;\n};\n\nstruct mbm_correction_factor_table {\n\tu32 rmidthreshold;\n\tu64 cf;\n};\n\nstruct mbm_state {\n\tu64 prev_bw_bytes;\n\tu32 prev_bw;\n};\n\nstruct mbox_controller;\n\nstruct mbox_client;\n\nstruct mbox_chan {\n\tstruct mbox_controller *mbox;\n\tunsigned int txdone_method;\n\tstruct mbox_client *cl;\n\tstruct completion tx_complete;\n\tvoid *active_req;\n\tunsigned int msg_count;\n\tunsigned int msg_free;\n\tvoid *msg_data[20];\n\tspinlock_t lock;\n\tvoid *con_priv;\n};\n\nstruct mbox_chan_ops {\n\tint (*send_data)(struct mbox_chan *, void *);\n\tint (*flush)(struct mbox_chan *, long unsigned int);\n\tint (*startup)(struct mbox_chan *);\n\tvoid (*shutdown)(struct mbox_chan *);\n\tbool (*last_tx_done)(struct mbox_chan *);\n\tbool (*peek_data)(struct mbox_chan *);\n};\n\nstruct mbox_client {\n\tstruct device *dev;\n\tbool tx_block;\n\tlong unsigned int tx_tout;\n\tbool knows_txdone;\n\tvoid (*rx_callback)(struct mbox_client *, void *);\n\tvoid (*tx_prepare)(struct mbox_client *, void *);\n\tvoid (*tx_done)(struct mbox_client *, void *, int);\n};\n\nstruct mbox_controller {\n\tstruct device *dev;\n\tconst struct mbox_chan_ops *ops;\n\tstruct mbox_chan *chans;\n\tint num_chans;\n\tbool txdone_irq;\n\tbool txdone_poll;\n\tunsigned int txpoll_period;\n\tstruct mbox_chan * (*of_xlate)(struct mbox_controller *, const struct of_phandle_args *);\n\tstruct hrtimer poll_hrt;\n\tspinlock_t poll_hrt_lock;\n\tstruct list_head node;\n};\n\nstruct mc146818_get_time_callback_param {\n\tstruct rtc_time *time;\n\tunsigned char ctrl;\n\tunsigned char century;\n};\n\nstruct multicall_entry {\n\txen_ulong_t op;\n\txen_long_t result;\n\txen_ulong_t args[6];\n};\n\nstruct mc_buffer {\n\tunsigned int mcidx;\n\tunsigned int argidx;\n\tunsigned int cbidx;\n\tstruct multicall_entry entries[32];\n\tunsigned char args[512];\n\tstruct callback callbacks[32];\n};\n\nstruct mc_debug_data {\n\tstruct multicall_entry entries[32];\n\tvoid *caller[32];\n\tsize_t argsz[32];\n\tlong unsigned int *args[32];\n};\n\nstruct mc_info;\n\ntypedef struct mc_info *__guest_handle_mc_info;\n\nstruct mc_info {\n\tuint32_t mi_nentries;\n\tuint32_t flags;\n\tuint64_t mi_data[95];\n};\n\nstruct mc_subled {\n\tunsigned int color_index;\n\tunsigned int brightness;\n\tunsigned int intensity;\n\tunsigned int channel;\n};\n\nstruct mca_config {\n\t__u64 lmce_disabled: 1;\n\t__u64 disabled: 1;\n\t__u64 ser: 1;\n\t__u64 recovery: 1;\n\t__u64 bios_cmci_threshold: 1;\n\t__u64 initialized: 1;\n\t__u64 __reserved: 58;\n\tbool dont_log_ce;\n\tbool cmci_disabled;\n\tbool ignore_ce;\n\tbool print_all;\n\tint monarch_timeout;\n\tint panic_timeout;\n\tu32 rip_msr;\n\ts8 bootlog;\n};\n\nstruct storm_bank {\n\tu64 history;\n\tu64 timestamp;\n\tbool in_storm_mode;\n\tbool poll_only;\n};\n\nstruct mca_storm_desc {\n\tstruct storm_bank banks[64];\n\tu8 stormy_bank_count;\n\tbool poll_mode;\n};\n\nstruct mce_bank {\n\tu64 ctl;\n\t__u64 init: 1;\n\t__u64 lsb_in_status: 1;\n\t__u64 __reserved_1: 62;\n};\n\nstruct mce_bank_dev {\n\tstruct device_attribute attr;\n\tchar attrname[16];\n\tu8 bank;\n};\n\nstruct mce_evt_llist {\n\tstruct llist_node llnode;\n\tstruct mce mce;\n};\n\nstruct mce_log_buffer {\n\tchar signature[12];\n\tunsigned int len;\n\tunsigned int next;\n\tunsigned int flags;\n\tunsigned int recordlen;\n\tstruct mce entry[0];\n};\n\nstruct mce_vendor_flags {\n\t__u64 overflow_recov: 1;\n\t__u64 succor: 1;\n\t__u64 smca: 1;\n\t__u64 zen_ifu_quirk: 1;\n\t__u64 amd_threshold: 1;\n\t__u64 p5: 1;\n\t__u64 winchip: 1;\n\t__u64 snb_ifu_quirk: 1;\n\t__u64 skx_repmov_quirk: 1;\n\t__u64 __reserved_0: 55;\n};\n\nstruct mcinfo_common {\n\tuint16_t type;\n\tuint16_t size;\n};\n\nstruct mcinfo_bank {\n\tstruct mcinfo_common common;\n\tuint16_t mc_bank;\n\tuint16_t mc_domid;\n\tuint64_t mc_status;\n\tuint64_t mc_addr;\n\tuint64_t mc_misc;\n\tuint64_t mc_ctrl2;\n\tuint64_t mc_tsc;\n};\n\nstruct mcinfo_global {\n\tstruct mcinfo_common common;\n\tuint16_t mc_domid;\n\tuint16_t mc_vcpuid;\n\tuint32_t mc_socketid;\n\tuint16_t mc_coreid;\n\tuint16_t mc_core_threadid;\n\tuint32_t mc_apicid;\n\tuint32_t mc_flags;\n\tuint64_t mc_gstatus;\n};\n\nstruct mcinfo_logical_cpu;\n\ntypedef struct mcinfo_logical_cpu *__guest_handle_mcinfo_logical_cpu;\n\nstruct mcinfo_msr {\n\tuint64_t reg;\n\tuint64_t value;\n};\n\nstruct mcinfo_logical_cpu {\n\tuint32_t mc_cpunr;\n\tuint32_t mc_chipid;\n\tuint16_t mc_coreid;\n\tuint16_t mc_threadid;\n\tuint32_t mc_apicid;\n\tuint32_t mc_clusterid;\n\tuint32_t mc_ncores;\n\tuint32_t mc_ncores_active;\n\tuint32_t mc_nthreads;\n\tuint32_t mc_cpuid_level;\n\tuint32_t mc_family;\n\tuint32_t mc_vendor;\n\tuint32_t mc_model;\n\tuint32_t mc_step;\n\tchar mc_vendorid[16];\n\tchar mc_brandid[64];\n\tuint32_t mc_cpu_caps[7];\n\tuint32_t mc_cache_size;\n\tuint32_t mc_cache_alignment;\n\tuint32_t mc_nmsrvals;\n\tstruct mcinfo_msr mc_msrvalues[8];\n};\n\nstruct mcs_spinlock {\n\tstruct mcs_spinlock *next;\n\tint locked;\n\tint count;\n};\n\nstruct mctp_addr {\n\tmctp_eid_t s_addr;\n};\n\nstruct mctp_netdev_ops;\n\nstruct mctp_dev {\n\tstruct net_device *dev;\n\trefcount_t refs;\n\tunsigned int net;\n\tconst struct mctp_netdev_ops *ops;\n\tu8 *addrs;\n\tsize_t num_addrs;\n\tspinlock_t addrs_lock;\n\tstruct callback_head rcu;\n};\n\nstruct mctp_dump_cb {\n\tint h;\n\tint idx;\n\tsize_t a_idx;\n};\n\nstruct mctp_hdr {\n\tu8 ver;\n\tu8 dest;\n\tu8 src;\n\tu8 flags_seq_tag;\n};\n\nstruct mctp_ioc_tag_ctl {\n\tmctp_eid_t peer_addr;\n\t__u8 tag;\n\t__u16 flags;\n};\n\nstruct mctp_ioc_tag_ctl2 {\n\tunsigned int net;\n\tmctp_eid_t peer_addr;\n\tmctp_eid_t local_addr;\n\t__u16 flags;\n\t__u8 tag;\n};\n\nstruct mctp_neigh {\n\tstruct mctp_dev *dev;\n\tmctp_eid_t eid;\n\tenum mctp_neigh_source source;\n\tunsigned char ha[32];\n\tstruct list_head list;\n\tstruct callback_head rcu;\n};\n\nstruct mctp_sk_key;\n\nstruct mctp_netdev_ops {\n\tvoid (*release_flow)(struct mctp_dev *, struct mctp_sk_key *);\n};\n\nstruct mctp_route {\n\tmctp_eid_t min;\n\tmctp_eid_t max;\n\tunsigned char type;\n\tunsigned int mtu;\n\tstruct mctp_dev *dev;\n\tint (*output)(struct mctp_route *, struct sk_buff *);\n\tstruct list_head list;\n\trefcount_t refs;\n\tstruct callback_head rcu;\n};\n\nstruct mctp_sk_key {\n\tunsigned int net;\n\tmctp_eid_t peer_addr;\n\tmctp_eid_t local_addr;\n\t__u8 tag;\n\tstruct sock *sk;\n\tstruct hlist_node hlist;\n\tstruct hlist_node sklist;\n\tspinlock_t lock;\n\trefcount_t refs;\n\tstruct sk_buff *reasm_head;\n\tstruct sk_buff **reasm_tailp;\n\tbool reasm_dead;\n\tu8 last_seq;\n\tbool valid;\n\tlong unsigned int expiry;\n\tlong unsigned int dev_flow_state;\n\tstruct mctp_dev *dev;\n\tbool manual_alloc;\n};\n\nstruct mctp_skb_cb {\n\tunsigned int magic;\n\tunsigned int net;\n\tint ifindex;\n\tmctp_eid_t src;\n\tunsigned char halen;\n\tunsigned char haddr[32];\n};\n\nstruct mctp_sock {\n\tstruct sock sk;\n\tunsigned int bind_net;\n\tmctp_eid_t bind_addr;\n\t__u8 bind_type;\n\tbool addr_ext;\n\tstruct hlist_head keys;\n\tstruct timer_list key_expiry;\n};\n\nstruct mctrl_gpios {\n\tstruct uart_port *port;\n\tstruct gpio_desc *gpio[6];\n\tint irq[6];\n\tunsigned int mctrl_prev;\n\tbool mctrl_on;\n};\n\nstruct md5_state {\n\tu32 hash[4];\n\tu32 block[16];\n\tu64 byte_count;\n};\n\nstruct md_rdev;\n\nstruct md_cluster_operations {\n\tint (*join)(struct mddev *, int);\n\tint (*leave)(struct mddev *);\n\tint (*slot_number)(struct mddev *);\n\tint (*resync_info_update)(struct mddev *, sector_t, sector_t);\n\tint (*resync_start_notify)(struct mddev *);\n\tint (*resync_status_get)(struct mddev *);\n\tvoid (*resync_info_get)(struct mddev *, sector_t *, sector_t *);\n\tint (*metadata_update_start)(struct mddev *);\n\tint (*metadata_update_finish)(struct mddev *);\n\tvoid (*metadata_update_cancel)(struct mddev *);\n\tint (*resync_start)(struct mddev *);\n\tint (*resync_finish)(struct mddev *);\n\tint (*area_resyncing)(struct mddev *, int, sector_t, sector_t);\n\tint (*add_new_disk)(struct mddev *, struct md_rdev *);\n\tvoid (*add_new_disk_cancel)(struct mddev *);\n\tint (*new_disk_ack)(struct mddev *, bool);\n\tint (*remove_disk)(struct mddev *, struct md_rdev *);\n\tvoid (*load_bitmaps)(struct mddev *, int);\n\tint (*gather_bitmaps)(struct md_rdev *);\n\tint (*resize_bitmaps)(struct mddev *, sector_t, sector_t);\n\tint (*lock_all_bitmaps)(struct mddev *);\n\tvoid (*unlock_all_bitmaps)(struct mddev *);\n\tvoid (*update_size)(struct mddev *, sector_t);\n};\n\nstruct md_io_clone {\n\tstruct mddev *mddev;\n\tstruct bio *orig_bio;\n\tlong unsigned int start_time;\n\tstruct bio bio_clone;\n};\n\nstruct md_personality {\n\tchar *name;\n\tint level;\n\tstruct list_head list;\n\tstruct module *owner;\n\tbool (*make_request)(struct mddev *, struct bio *);\n\tint (*run)(struct mddev *);\n\tint (*start)(struct mddev *);\n\tvoid (*free)(struct mddev *, void *);\n\tvoid (*status)(struct seq_file *, struct mddev *);\n\tvoid (*error_handler)(struct mddev *, struct md_rdev *);\n\tint (*hot_add_disk)(struct mddev *, struct md_rdev *);\n\tint (*hot_remove_disk)(struct mddev *, struct md_rdev *);\n\tint (*spare_active)(struct mddev *);\n\tsector_t (*sync_request)(struct mddev *, sector_t, sector_t, int *);\n\tint (*resize)(struct mddev *, sector_t);\n\tsector_t (*size)(struct mddev *, sector_t, int);\n\tint (*check_reshape)(struct mddev *);\n\tint (*start_reshape)(struct mddev *);\n\tvoid (*finish_reshape)(struct mddev *);\n\tvoid (*update_reshape_pos)(struct mddev *);\n\tvoid (*prepare_suspend)(struct mddev *);\n\tvoid (*quiesce)(struct mddev *, int);\n\tvoid * (*takeover)(struct mddev *);\n\tint (*change_consistency_policy)(struct mddev *, const char *);\n};\n\nstruct serial_in_rdev;\n\nstruct md_rdev {\n\tstruct list_head same_set;\n\tsector_t sectors;\n\tstruct mddev *mddev;\n\tint last_events;\n\tstruct block_device *meta_bdev;\n\tstruct block_device *bdev;\n\tstruct file *bdev_file;\n\tstruct page *sb_page;\n\tstruct page *bb_page;\n\tint sb_loaded;\n\t__u64 sb_events;\n\tsector_t data_offset;\n\tsector_t new_data_offset;\n\tsector_t sb_start;\n\tint sb_size;\n\tint preferred_minor;\n\tstruct kobject kobj;\n\tlong unsigned int flags;\n\twait_queue_head_t blocked_wait;\n\tint desc_nr;\n\tint raid_disk;\n\tint new_raid_disk;\n\tint saved_raid_disk;\n\tunion {\n\t\tsector_t recovery_offset;\n\t\tsector_t journal_tail;\n\t};\n\tatomic_t nr_pending;\n\tatomic_t read_errors;\n\ttime64_t last_read_error;\n\tatomic_t corrected_errors;\n\tstruct serial_in_rdev *serial;\n\tstruct kernfs_node *sysfs_state;\n\tstruct kernfs_node *sysfs_unack_badblocks;\n\tstruct kernfs_node *sysfs_badblocks;\n\tstruct badblocks badblocks;\n\tstruct {\n\t\tshort int offset;\n\t\tunsigned int size;\n\t\tsector_t sector;\n\t} ppl;\n};\n\nstruct md_setup_args {\n\tint minor;\n\tint partitioned;\n\tint level;\n\tint chunk;\n\tchar *device_names;\n};\n\nstruct md_sysfs_entry {\n\tstruct attribute attr;\n\tssize_t (*show)(struct mddev *, char *);\n\tssize_t (*store)(struct mddev *, const char *, size_t);\n};\n\nstruct md_thread {\n\tvoid (*run)(struct md_thread *);\n\tstruct mddev *mddev;\n\twait_queue_head_t wqueue;\n\tlong unsigned int flags;\n\tstruct task_struct *tsk;\n\tlong unsigned int timeout;\n\tvoid *private;\n};\n\nstruct md_cluster_info;\n\nstruct mddev {\n\tvoid *private;\n\tstruct md_personality *pers;\n\tdev_t unit;\n\tint md_minor;\n\tstruct list_head disks;\n\tlong unsigned int flags;\n\tlong unsigned int sb_flags;\n\tint suspended;\n\tstruct mutex suspend_mutex;\n\tstruct percpu_ref active_io;\n\tint ro;\n\tint sysfs_active;\n\tstruct gendisk *gendisk;\n\tstruct kobject kobj;\n\tint hold_active;\n\tint major_version;\n\tint minor_version;\n\tint patch_version;\n\tint persistent;\n\tint external;\n\tchar metadata_type[17];\n\tint chunk_sectors;\n\ttime64_t ctime;\n\ttime64_t utime;\n\tint level;\n\tint layout;\n\tchar clevel[16];\n\tint raid_disks;\n\tint max_disks;\n\tsector_t dev_sectors;\n\tsector_t array_sectors;\n\tint external_size;\n\t__u64 events;\n\tint can_decrease_events;\n\tchar uuid[16];\n\tsector_t reshape_position;\n\tint delta_disks;\n\tint new_level;\n\tint new_layout;\n\tint new_chunk_sectors;\n\tint reshape_backwards;\n\tstruct md_thread *thread;\n\tstruct md_thread *sync_thread;\n\tenum sync_action last_sync_action;\n\tsector_t curr_resync;\n\tsector_t curr_resync_completed;\n\tlong unsigned int resync_mark;\n\tsector_t resync_mark_cnt;\n\tsector_t curr_mark_cnt;\n\tsector_t resync_max_sectors;\n\tatomic64_t resync_mismatches;\n\tsector_t suspend_lo;\n\tsector_t suspend_hi;\n\tint sync_speed_min;\n\tint sync_speed_max;\n\tint parallel_resync;\n\tint ok_start_degraded;\n\tlong unsigned int recovery;\n\tint recovery_disabled;\n\tint in_sync;\n\tstruct mutex open_mutex;\n\tstruct mutex reconfig_mutex;\n\tatomic_t active;\n\tatomic_t openers;\n\tint changed;\n\tint degraded;\n\tatomic_t recovery_active;\n\twait_queue_head_t recovery_wait;\n\tsector_t recovery_cp;\n\tsector_t resync_min;\n\tsector_t resync_max;\n\tstruct kernfs_node *sysfs_state;\n\tstruct kernfs_node *sysfs_action;\n\tstruct kernfs_node *sysfs_completed;\n\tstruct kernfs_node *sysfs_degraded;\n\tstruct kernfs_node *sysfs_level;\n\tstruct work_struct del_work;\n\tstruct work_struct sync_work;\n\tspinlock_t lock;\n\twait_queue_head_t sb_wait;\n\tatomic_t pending_writes;\n\tunsigned int safemode;\n\tunsigned int safemode_delay;\n\tstruct timer_list safemode_timer;\n\tstruct percpu_ref writes_pending;\n\tint sync_checkers;\n\tstruct bitmap *bitmap;\n\tstruct {\n\t\tstruct file *file;\n\t\tloff_t offset;\n\t\tlong unsigned int space;\n\t\tloff_t default_offset;\n\t\tlong unsigned int default_space;\n\t\tstruct mutex mutex;\n\t\tlong unsigned int chunksize;\n\t\tlong unsigned int daemon_sleep;\n\t\tlong unsigned int max_write_behind;\n\t\tint external;\n\t\tint nodes;\n\t\tchar cluster_name[64];\n\t} bitmap_info;\n\tatomic_t max_corr_read_errors;\n\tstruct list_head all_mddevs;\n\tconst struct attribute_group *to_remove;\n\tstruct bio_set bio_set;\n\tstruct bio_set sync_set;\n\tstruct bio_set io_clone_set;\n\tstruct bio *flush_bio;\n\tatomic_t flush_pending;\n\tktime_t start_flush;\n\tktime_t prev_flush_start;\n\tstruct work_struct flush_work;\n\tstruct work_struct event_work;\n\tmempool_t *serial_info_pool;\n\tvoid (*sync_super)(struct mddev *, struct md_rdev *);\n\tstruct md_cluster_info *cluster_info;\n\tunsigned int good_device_nr;\n\tunsigned int noio_flag;\n\tstruct list_head deleting;\n\tatomic_t sync_seq;\n\tbool has_superblocks: 1;\n\tbool fail_last_dev: 1;\n\tbool serialize_policy: 1;\n};\n\nstruct mdio_board_info {\n\tconst char *bus_id;\n\tchar modalias[32];\n\tint mdio_addr;\n\tconst void *platform_data;\n};\n\nstruct mdio_board_entry {\n\tstruct list_head list;\n\tstruct mdio_board_info board_info;\n};\n\nstruct mdio_bus_stat_attr {\n\tint addr;\n\tunsigned int field_offset;\n};\n\nstruct mdio_bus_stats {\n\tu64_stats_t transfers;\n\tu64_stats_t errors;\n\tu64_stats_t writes;\n\tu64_stats_t reads;\n\tstruct u64_stats_sync syncp;\n};\n\nstruct mdio_device {\n\tstruct device dev;\n\tstruct mii_bus *bus;\n\tchar modalias[32];\n\tint (*bus_match)(struct device *, const struct device_driver *);\n\tvoid (*device_free)(struct mdio_device *);\n\tvoid (*device_remove)(struct mdio_device *);\n\tint addr;\n\tint flags;\n\tint reset_state;\n\tstruct gpio_desc *reset_gpio;\n\tstruct reset_control *reset_ctrl;\n\tunsigned int reset_assert_delay;\n\tunsigned int reset_deassert_delay;\n};\n\nstruct mdio_device_id {\n\t__u32 phy_id;\n\t__u32 phy_id_mask;\n};\n\nstruct mdio_driver_common {\n\tstruct device_driver driver;\n\tint flags;\n};\n\nstruct mdio_driver {\n\tstruct mdio_driver_common mdiodrv;\n\tint (*probe)(struct mdio_device *);\n\tvoid (*remove)(struct mdio_device *);\n\tvoid (*shutdown)(struct mdio_device *);\n};\n\nstruct mdiobus_devres {\n\tstruct mii_bus *mii;\n};\n\nstruct mdp_device_descriptor_s {\n\t__u32 number;\n\t__u32 major;\n\t__u32 minor;\n\t__u32 raid_disk;\n\t__u32 state;\n\t__u32 reserved[27];\n};\n\ntypedef struct mdp_device_descriptor_s mdp_disk_t;\n\nstruct mdp_superblock_1 {\n\t__le32 magic;\n\t__le32 major_version;\n\t__le32 feature_map;\n\t__le32 pad0;\n\t__u8 set_uuid[16];\n\tchar set_name[32];\n\t__le64 ctime;\n\t__le32 level;\n\t__le32 layout;\n\t__le64 size;\n\t__le32 chunksize;\n\t__le32 raid_disks;\n\tunion {\n\t\t__le32 bitmap_offset;\n\t\tstruct {\n\t\t\t__le16 offset;\n\t\t\t__le16 size;\n\t\t} ppl;\n\t};\n\t__le32 new_level;\n\t__le64 reshape_position;\n\t__le32 delta_disks;\n\t__le32 new_layout;\n\t__le32 new_chunk;\n\t__le32 new_offset;\n\t__le64 data_offset;\n\t__le64 data_size;\n\t__le64 super_offset;\n\tunion {\n\t\t__le64 recovery_offset;\n\t\t__le64 journal_tail;\n\t};\n\t__le32 dev_number;\n\t__le32 cnt_corrected_read;\n\t__u8 device_uuid[16];\n\t__u8 devflags;\n\t__u8 bblog_shift;\n\t__le16 bblog_size;\n\t__le32 bblog_offset;\n\t__le64 utime;\n\t__le64 events;\n\t__le64 resync_offset;\n\t__le32 sb_csum;\n\t__le32 max_dev;\n\t__u8 pad3[32];\n\t__le16 dev_roles[0];\n};\n\nstruct mdp_superblock_s {\n\t__u32 md_magic;\n\t__u32 major_version;\n\t__u32 minor_version;\n\t__u32 patch_version;\n\t__u32 gvalid_words;\n\t__u32 set_uuid0;\n\t__u32 ctime;\n\t__u32 level;\n\t__u32 size;\n\t__u32 nr_disks;\n\t__u32 raid_disks;\n\t__u32 md_minor;\n\t__u32 not_persistent;\n\t__u32 set_uuid1;\n\t__u32 set_uuid2;\n\t__u32 set_uuid3;\n\t__u32 gstate_creserved[16];\n\t__u32 utime;\n\t__u32 state;\n\t__u32 active_disks;\n\t__u32 working_disks;\n\t__u32 failed_disks;\n\t__u32 spare_disks;\n\t__u32 sb_csum;\n\t__u32 events_lo;\n\t__u32 events_hi;\n\t__u32 cp_events_lo;\n\t__u32 cp_events_hi;\n\t__u32 recovery_cp;\n\t__u64 reshape_position;\n\t__u32 new_level;\n\t__u32 delta_disks;\n\t__u32 new_layout;\n\t__u32 new_chunk;\n\t__u32 gstate_sreserved[14];\n\t__u32 layout;\n\t__u32 chunk_size;\n\t__u32 root_pv;\n\t__u32 root_block;\n\t__u32 pstate_reserved[60];\n\tmdp_disk_t disks[27];\n\t__u32 reserved[0];\n\tmdp_disk_t this_disk;\n};\n\ntypedef struct mdp_superblock_s mdp_super_t;\n\nstruct mdu_array_info_s {\n\tint major_version;\n\tint minor_version;\n\tint patch_version;\n\tunsigned int ctime;\n\tint level;\n\tint size;\n\tint nr_disks;\n\tint raid_disks;\n\tint md_minor;\n\tint not_persistent;\n\tunsigned int utime;\n\tint state;\n\tint active_disks;\n\tint working_disks;\n\tint failed_disks;\n\tint spare_disks;\n\tint layout;\n\tint chunk_size;\n};\n\ntypedef struct mdu_array_info_s mdu_array_info_t;\n\nstruct mdu_bitmap_file_s {\n\tchar pathname[4096];\n};\n\ntypedef struct mdu_bitmap_file_s mdu_bitmap_file_t;\n\nstruct mdu_disk_info_s {\n\tint number;\n\tint major;\n\tint minor;\n\tint raid_disk;\n\tint state;\n};\n\ntypedef struct mdu_disk_info_s mdu_disk_info_t;\n\nstruct mdu_version_s {\n\tint major;\n\tint minor;\n\tint patchlevel;\n};\n\ntypedef struct mdu_version_s mdu_version_t;\n\nstruct media_event_desc {\n\t__u8 media_event_code: 4;\n\t__u8 reserved1: 4;\n\t__u8 door_open: 1;\n\t__u8 media_present: 1;\n\t__u8 reserved2: 6;\n\t__u8 start_slot;\n\t__u8 end_slot;\n};\n\nstruct mem_cgroup_id {\n\tint id;\n\trefcount_t ref;\n};\n\nstruct vmpressure {\n\tlong unsigned int scanned;\n\tlong unsigned int reclaimed;\n\tlong unsigned int tree_scanned;\n\tlong unsigned int tree_reclaimed;\n\tspinlock_t sr_lock;\n\tstruct list_head events;\n\tstruct mutex events_lock;\n\tstruct work_struct work;\n};\n\nstruct wb_domain {\n\tspinlock_t lock;\n\tstruct fprop_global completions;\n\tstruct timer_list period_timer;\n\tlong unsigned int period_time;\n\tlong unsigned int dirty_limit_tstamp;\n\tlong unsigned int dirty_limit;\n};\n\nstruct wb_completion {\n\tatomic_t cnt;\n\twait_queue_head_t *waitq;\n};\n\nstruct memcg_cgwb_frn {\n\tu64 bdi_id;\n\tint memcg_id;\n\tu64 at;\n\tstruct wb_completion done;\n};\n\nstruct memcg_vmstats;\n\nstruct memcg_vmstats_percpu;\n\nstruct mem_cgroup_per_node;\n\nstruct mem_cgroup {\n\tstruct cgroup_subsys_state css;\n\tstruct mem_cgroup_id id;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tstruct page_counter memory;\n\tunion {\n\t\tstruct page_counter swap;\n\t\tstruct page_counter memsw;\n\t};\n\tstruct work_struct high_work;\n\tlong unsigned int zswap_max;\n\tbool zswap_writeback;\n\tstruct vmpressure vmpressure;\n\tbool oom_group;\n\tint swappiness;\n\tstruct cgroup_file events_file;\n\tstruct cgroup_file events_local_file;\n\tstruct cgroup_file swap_events_file;\n\tstruct memcg_vmstats *vmstats;\n\tatomic_long_t memory_events[9];\n\tatomic_long_t memory_events_local[9];\n\tlong unsigned int socket_pressure;\n\tint kmemcg_id;\n\tstruct obj_cgroup *objcg;\n\tstruct obj_cgroup *orig_objcg;\n\tstruct list_head objcg_list;\n\tstruct memcg_vmstats_percpu *vmstats_percpu;\n\tstruct list_head cgwb_list;\n\tstruct wb_domain cgwb_domain;\n\tstruct memcg_cgwb_frn cgwb_frn[4];\n\tstruct deferred_split deferred_split_queue;\n\tstruct lru_gen_mm_list mm_list;\n\tstruct mem_cgroup_per_node *nodeinfo[0];\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct mem_cgroup_reclaim_iter {\n\tstruct mem_cgroup *position;\n\tunsigned int generation;\n};\n\nstruct shrinker_info;\n\nstruct mem_cgroup_per_node {\n\tstruct mem_cgroup *memcg;\n\tstruct lruvec_stats_percpu *lruvec_stats_percpu;\n\tstruct lruvec_stats *lruvec_stats;\n\tstruct shrinker_info *shrinker_info;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tstruct cacheline_padding _pad1_;\n\tstruct lruvec lruvec;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tstruct cacheline_padding _pad2_;\n\tlong unsigned int lru_zone_size[25];\n\tstruct mem_cgroup_reclaim_iter iter;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n};\n\ntypedef struct pglist_data pg_data_t;\n\nstruct mem_cgroup_reclaim_cookie {\n\tpg_data_t *pgdat;\n\tunsigned int generation;\n};\n\nstruct mcidev_sysfs_attribute;\n\nstruct mem_ctl_info {\n\tstruct device dev;\n\tconst struct bus_type *bus;\n\tstruct list_head link;\n\tstruct module *owner;\n\tlong unsigned int mtype_cap;\n\tlong unsigned int edac_ctl_cap;\n\tlong unsigned int edac_cap;\n\tlong unsigned int scrub_cap;\n\tenum scrub_type scrub_mode;\n\tint (*set_sdram_scrub_rate)(struct mem_ctl_info *, u32);\n\tint (*get_sdram_scrub_rate)(struct mem_ctl_info *);\n\tvoid (*edac_check)(struct mem_ctl_info *);\n\tlong unsigned int (*ctl_page_to_phys)(struct mem_ctl_info *, long unsigned int);\n\tint mc_idx;\n\tstruct csrow_info **csrows;\n\tunsigned int nr_csrows;\n\tunsigned int num_cschannel;\n\tunsigned int n_layers;\n\tstruct edac_mc_layer *layers;\n\tbool csbased;\n\tunsigned int tot_dimms;\n\tstruct dimm_info **dimms;\n\tstruct device *pdev;\n\tconst char *mod_name;\n\tconst char *ctl_name;\n\tconst char *dev_name;\n\tvoid *pvt_info;\n\tlong unsigned int start_time;\n\tu32 ce_noinfo_count;\n\tu32 ue_noinfo_count;\n\tu32 ue_mc;\n\tu32 ce_mc;\n\tstruct completion complete;\n\tconst struct mcidev_sysfs_attribute *mc_driver_sysfs_attributes;\n\tstruct delayed_work work;\n\tstruct edac_raw_error_desc error_desc;\n\tint op_state;\n\tstruct dentry *debugfs;\n\tu8 fake_inject_layer[3];\n\tbool fake_inject_ue;\n\tu16 fake_inject_count;\n};\n\nstruct quota_format_type;\n\nstruct mem_dqinfo {\n\tstruct quota_format_type *dqi_format;\n\tint dqi_fmt_id;\n\tstruct list_head dqi_dirty_list;\n\tlong unsigned int dqi_flags;\n\tunsigned int dqi_bgrace;\n\tunsigned int dqi_igrace;\n\tqsize_t dqi_max_spc_limit;\n\tqsize_t dqi_max_ino_limit;\n\tvoid *dqi_priv;\n};\n\nstruct mem_extent {\n\tstruct list_head hook;\n\tlong unsigned int start;\n\tlong unsigned int end;\n};\n\nstruct mem_section_usage;\n\nstruct mem_section {\n\tlong unsigned int section_mem_map;\n\tstruct mem_section_usage *usage;\n};\n\nstruct mem_section_usage {\n\tstruct callback_head rcu;\n\tlong unsigned int subsection_map[1];\n\tlong unsigned int pageblock_flags[0];\n};\n\nstruct mem_size_stats {\n\tlong unsigned int resident;\n\tlong unsigned int shared_clean;\n\tlong unsigned int shared_dirty;\n\tlong unsigned int private_clean;\n\tlong unsigned int private_dirty;\n\tlong unsigned int referenced;\n\tlong unsigned int anonymous;\n\tlong unsigned int lazyfree;\n\tlong unsigned int anonymous_thp;\n\tlong unsigned int shmem_thp;\n\tlong unsigned int file_thp;\n\tlong unsigned int swap;\n\tlong unsigned int shared_hugetlb;\n\tlong unsigned int private_hugetlb;\n\tlong unsigned int ksm;\n\tu64 pss;\n\tu64 pss_anon;\n\tu64 pss_file;\n\tu64 pss_shmem;\n\tu64 pss_dirty;\n\tu64 pss_locked;\n\tu64 swap_pss;\n};\n\nstruct mem_zone_bm_rtree {\n\tstruct list_head list;\n\tstruct list_head nodes;\n\tstruct list_head leaves;\n\tlong unsigned int start_pfn;\n\tlong unsigned int end_pfn;\n\tstruct rtree_node *rtree;\n\tint levels;\n\tunsigned int blocks;\n};\n\nstruct memblock_region;\n\nstruct memblock_type {\n\tlong unsigned int cnt;\n\tlong unsigned int max;\n\tphys_addr_t total_size;\n\tstruct memblock_region *regions;\n\tchar *name;\n};\n\nstruct memblock {\n\tbool bottom_up;\n\tphys_addr_t current_limit;\n\tstruct memblock_type memory;\n\tstruct memblock_type reserved;\n};\n\nstruct memblock_region {\n\tphys_addr_t base;\n\tphys_addr_t size;\n\tenum memblock_flags flags;\n\tint nid;\n};\n\nstruct membuf {\n\tvoid *p;\n\tsize_t left;\n};\n\nstruct memcg_stock_pcp {\n\tlocal_lock_t stock_lock;\n\tstruct mem_cgroup *cached;\n\tunsigned int nr_pages;\n\tstruct obj_cgroup *cached_objcg;\n\tstruct pglist_data *cached_pgdat;\n\tunsigned int nr_bytes;\n\tint nr_slab_reclaimable_b;\n\tint nr_slab_unreclaimable_b;\n\tstruct work_struct work;\n\tlong unsigned int flags;\n};\n\nstruct memcg_vmstats {\n\tlong int state[34];\n\tlong unsigned int events[22];\n\tlong int state_local[34];\n\tlong unsigned int events_local[22];\n\tlong int state_pending[34];\n\tlong unsigned int events_pending[22];\n\tatomic64_t stats_updates;\n};\n\nstruct memcg_vmstats_percpu {\n\tunsigned int stats_updates;\n\tstruct memcg_vmstats_percpu *parent;\n\tstruct memcg_vmstats *vmstats;\n\tlong int state[34];\n\tlong unsigned int events[22];\n\tlong int state_prev[34];\n\tlong unsigned int events_prev[22];\n\tlong unsigned int nr_page_events;\n\tlong unsigned int targets[2];\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct memdev {\n\tconst char *name;\n\tconst struct file_operations *fops;\n\tfmode_t fmode;\n\tumode_t mode;\n};\n\nstruct memdev_dmi_entry {\n\tu8 type;\n\tu8 length;\n\tu16 handle;\n\tu16 phys_mem_array_handle;\n\tu16 mem_err_info_handle;\n\tu16 total_width;\n\tu16 data_width;\n\tu16 size;\n\tu8 form_factor;\n\tu8 device_set;\n\tu8 device_locator;\n\tu8 bank_locator;\n\tu8 memory_type;\n\tu16 type_detail;\n\tu16 speed;\n\tu8 manufacturer;\n\tu8 serial_number;\n\tu8 asset_tag;\n\tu8 part_number;\n\tu8 attributes;\n\tu32 extended_size;\n\tu16 conf_mem_clk_speed;\n} __attribute__((packed));\n\nstruct memmap_attribute {\n\tstruct attribute attr;\n\tssize_t (*show)(struct firmware_map_entry *, char *);\n};\n\nstruct memory_bitmap {\n\tstruct list_head zones;\n\tstruct linked_page *p_list;\n\tstruct bm_position cur;\n};\n\nstruct memory_group;\n\nstruct memory_block {\n\tlong unsigned int start_section_nr;\n\tlong unsigned int state;\n\tint online_type;\n\tint nid;\n\tstruct zone *zone;\n\tstruct device dev;\n\tstruct vmem_altmap *altmap;\n\tstruct memory_group *group;\n\tstruct list_head group_next;\n\tatomic_long_t nr_hwpoison;\n};\n\nstruct memory_dev_type {\n\tstruct list_head tier_sibling;\n\tstruct list_head list;\n\tint adistance;\n\tnodemask_t nodes;\n\tstruct kref kref;\n};\n\nstruct memory_failure_entry {\n\tlong unsigned int pfn;\n\tint flags;\n};\n\nstruct memory_failure_cpu {\n\tstruct {\n\t\tunion {\n\t\t\tstruct __kfifo kfifo;\n\t\t\tstruct memory_failure_entry *type;\n\t\t\tconst struct memory_failure_entry *const_type;\n\t\t\tchar (*rectype)[0];\n\t\t\tstruct memory_failure_entry *ptr;\n\t\t\tconst struct memory_failure_entry *ptr_const;\n\t\t};\n\t\tstruct memory_failure_entry buf[16];\n\t} fifo;\n\traw_spinlock_t lock;\n\tstruct work_struct work;\n};\n\nstruct memory_failure_stats {\n\tlong unsigned int total;\n\tlong unsigned int ignored;\n\tlong unsigned int failed;\n\tlong unsigned int delayed;\n\tlong unsigned int recovered;\n};\n\nstruct memory_group {\n\tint nid;\n\tstruct list_head memory_blocks;\n\tlong unsigned int present_kernel_pages;\n\tlong unsigned int present_movable_pages;\n\tbool is_dynamic;\n\tunion {\n\t\tstruct {\n\t\t\tlong unsigned int max_pages;\n\t\t} s;\n\t\tstruct {\n\t\t\tlong unsigned int unit_pages;\n\t\t} d;\n\t};\n};\n\nstruct memory_initiator {\n\tstruct list_head node;\n\tunsigned int processor_pxm;\n\tbool has_cpu;\n};\n\nstruct memory_locality {\n\tstruct list_head node;\n\tstruct acpi_hmat_locality *hmat_loc;\n};\n\nstruct memory_notify {\n\tlong unsigned int altmap_start_pfn;\n\tlong unsigned int altmap_nr_pages;\n\tlong unsigned int start_pfn;\n\tlong unsigned int nr_pages;\n\tint status_change_nid_normal;\n\tint status_change_nid;\n};\n\nstruct memory_stat {\n\tconst char *name;\n\tunsigned int idx;\n};\n\nstruct node_cache_attrs {\n\tenum cache_indexing indexing;\n\tenum cache_write_policy write_policy;\n\tu64 size;\n\tu16 line_size;\n\tu8 level;\n};\n\nstruct memory_target {\n\tstruct list_head node;\n\tunsigned int memory_pxm;\n\tunsigned int processor_pxm;\n\tstruct resource memregions;\n\tstruct access_coordinate coord[4];\n\tstruct list_head caches;\n\tstruct node_cache_attrs cache_attrs;\n\tu8 gen_port_device_handle[16];\n\tbool registered;\n\tbool ext_updated;\n};\n\nstruct memory_tier {\n\tstruct list_head list;\n\tstruct list_head memory_types;\n\tint adistance_start;\n\tstruct device dev;\n\tnodemask_t lower_tier_mask;\n};\n\nstruct mempolicy {\n\tatomic_t refcnt;\n\tshort unsigned int mode;\n\tshort unsigned int flags;\n\tnodemask_t nodes;\n\tint home_node;\n\tunion {\n\t\tnodemask_t cpuset_mems_allowed;\n\t\tnodemask_t user_nodemask;\n\t} w;\n};\n\nstruct mempolicy_operations {\n\tint (*create)(struct mempolicy *, const nodemask_t *);\n\tvoid (*rebind)(struct mempolicy *, const nodemask_t *);\n};\n\nstruct memtype {\n\tu64 start;\n\tu64 end;\n\tu64 subtree_max_end;\n\tenum page_cache_mode type;\n\tstruct rb_node rb;\n};\n\nstruct menu_device {\n\tint needs_update;\n\tint tick_wakeup;\n\tu64 next_timer_ns;\n\tunsigned int bucket;\n\tunsigned int correction_factor[12];\n\tunsigned int intervals[8];\n\tint interval_ptr;\n};\n\nstruct meta_entry {\n\tu64 data_block;\n\tunsigned int index_block;\n\tshort unsigned int offset;\n\tshort unsigned int pad;\n};\n\nstruct meta_index {\n\tunsigned int inode_number;\n\tunsigned int offset;\n\tshort unsigned int entries;\n\tshort unsigned int skip;\n\tshort unsigned int locked;\n\tshort unsigned int pad;\n\tstruct meta_entry meta_entry[127];\n};\n\nstruct xfrm_md_info {\n\tu32 if_id;\n\tint link;\n\tstruct dst_entry *dst_orig;\n};\n\nstruct metadata_dst {\n\tstruct dst_entry dst;\n\tenum metadata_type type;\n\tunion {\n\t\tstruct ip_tunnel_info tun_info;\n\t\tstruct hw_port_info port_info;\n\t\tstruct macsec_info macsec_info;\n\t\tstruct xfrm_md_info xfrm_info;\n\t} u;\n};\n\nstruct mf6cctl {\n\tstruct sockaddr_in6 mf6cc_origin;\n\tstruct sockaddr_in6 mf6cc_mcastgrp;\n\tmifi_t mf6cc_parent;\n\tstruct if_set mf6cc_ifset;\n};\n\nstruct mr_mfc {\n\tstruct rhlist_head mnode;\n\tshort unsigned int mfc_parent;\n\tint mfc_flags;\n\tunion {\n\t\tstruct {\n\t\t\tlong unsigned int expires;\n\t\t\tstruct sk_buff_head unresolved;\n\t\t} unres;\n\t\tstruct {\n\t\t\tlong unsigned int last_assert;\n\t\t\tint minvif;\n\t\t\tint maxvif;\n\t\t\tlong unsigned int bytes;\n\t\t\tlong unsigned int pkt;\n\t\t\tlong unsigned int wrong_if;\n\t\t\tlong unsigned int lastuse;\n\t\t\tunsigned char ttls[32];\n\t\t\trefcount_t refcount;\n\t\t} res;\n\t} mfc_un;\n\tstruct list_head list;\n\tstruct callback_head rcu;\n\tvoid (*free)(struct callback_head *);\n};\n\nstruct mfc6_cache_cmp_arg {\n\tstruct in6_addr mf6c_mcastgrp;\n\tstruct in6_addr mf6c_origin;\n};\n\nstruct mfc6_cache {\n\tstruct mr_mfc _c;\n\tunion {\n\t\tstruct {\n\t\t\tstruct in6_addr mf6c_mcastgrp;\n\t\t\tstruct in6_addr mf6c_origin;\n\t\t};\n\t\tstruct mfc6_cache_cmp_arg cmparg;\n\t};\n};\n\nstruct mfc_cache_cmp_arg {\n\t__be32 mfc_mcastgrp;\n\t__be32 mfc_origin;\n};\n\nstruct mfc_cache {\n\tstruct mr_mfc _c;\n\tunion {\n\t\tstruct {\n\t\t\t__be32 mfc_mcastgrp;\n\t\t\t__be32 mfc_origin;\n\t\t};\n\t\tstruct mfc_cache_cmp_arg cmparg;\n\t};\n};\n\nstruct mfc_entry_notifier_info {\n\tstruct fib_notifier_info info;\n\tstruct mr_mfc *mfc;\n\tu32 tb_id;\n};\n\nstruct mfcctl {\n\tstruct in_addr mfcc_origin;\n\tstruct in_addr mfcc_mcastgrp;\n\tvifi_t mfcc_parent;\n\tunsigned char mfcc_ttls[32];\n\tunsigned int mfcc_pkt_cnt;\n\tunsigned int mfcc_byte_cnt;\n\tunsigned int mfcc_wrong_if;\n\tint mfcc_expire;\n};\n\nstruct mfd_cell_acpi_match;\n\nstruct mfd_cell {\n\tconst char *name;\n\tint id;\n\tint level;\n\tint (*suspend)(struct platform_device *);\n\tint (*resume)(struct platform_device *);\n\tvoid *platform_data;\n\tsize_t pdata_size;\n\tconst struct mfd_cell_acpi_match *acpi_match;\n\tconst struct software_node *swnode;\n\tconst char *of_compatible;\n\tu64 of_reg;\n\tbool use_of_reg;\n\tint num_resources;\n\tconst struct resource *resources;\n\tbool ignore_resource_conflicts;\n\tbool pm_runtime_no_callbacks;\n\tint num_parent_supplies;\n\tconst char * const *parent_supplies;\n};\n\nstruct mfd_cell_acpi_match {\n\tconst char *pnpid;\n\tconst long long unsigned int adr;\n};\n\nstruct mfd_of_node_entry {\n\tstruct list_head list;\n\tstruct device *dev;\n\tstruct device_node *np;\n};\n\nstruct mhp_params {\n\tstruct vmem_altmap *altmap;\n\tpgprot_t pgprot;\n\tstruct dev_pagemap *pgmap;\n};\n\nstruct microcode_header_amd {\n\tu32 data_code;\n\tu32 patch_id;\n\tu16 mc_patch_data_id;\n\tu8 mc_patch_data_len;\n\tu8 init_flag;\n\tu32 mc_patch_data_checksum;\n\tu32 nb_dev_id;\n\tu32 sb_dev_id;\n\tu16 processor_rev_id;\n\tu8 nb_rev_id;\n\tu8 sb_rev_id;\n\tu8 bios_api_rev;\n\tu8 reserved1[3];\n\tu32 match_reg[8];\n};\n\nstruct microcode_amd {\n\tstruct microcode_header_amd hdr;\n\tunsigned int mpb[0];\n};\n\nstruct microcode_header_intel {\n\tunsigned int hdrver;\n\tunsigned int rev;\n\tunsigned int date;\n\tunsigned int sig;\n\tunsigned int cksum;\n\tunsigned int ldrver;\n\tunsigned int pf;\n\tunsigned int datasize;\n\tunsigned int totalsize;\n\tunsigned int metasize;\n\tunsigned int min_req_ver;\n\tunsigned int reserved;\n};\n\nstruct microcode_intel {\n\tstruct microcode_header_intel hdr;\n\tunsigned int bits[0];\n};\n\nstruct microcode_ops {\n\tenum ucode_state (*request_microcode_fw)(int, struct device *);\n\tvoid (*microcode_fini_cpu)(int);\n\tenum ucode_state (*apply_microcode)(int);\n\tint (*collect_cpu_info)(int, struct cpu_signature *);\n\tvoid (*finalize_late_load)(int);\n\tunsigned int nmi_safe: 1;\n\tunsigned int use_nmi: 1;\n};\n\nstruct mid8250_board;\n\nstruct mid8250 {\n\tint line;\n\tint dma_index;\n\tstruct pci_dev *dma_dev;\n\tstruct uart_8250_dma dma;\n\tstruct mid8250_board *board;\n\tstruct hsu_dma_chip dma_chip;\n};\n\nstruct mid8250_board {\n\tlong unsigned int freq;\n\tunsigned int base_baud;\n\tunsigned int bar;\n\tint (*setup)(struct mid8250 *, struct uart_port *);\n\tvoid (*exit)(struct mid8250 *);\n};\n\nstruct mif6ctl {\n\tmifi_t mif6c_mifi;\n\tunsigned char mif6c_flags;\n\tunsigned char vifc_threshold;\n\t__u16 mif6c_pifi;\n\tunsigned int vifc_rate_limit;\n};\n\nstruct migrate_pages_stats {\n\tint nr_succeeded;\n\tint nr_failed_pages;\n\tint nr_thp_succeeded;\n\tint nr_thp_failed;\n\tint nr_thp_split;\n\tint nr_split;\n};\n\nstruct migrate_struct {\n\text4_lblk_t first_block;\n\text4_lblk_t last_block;\n\text4_lblk_t curr_block;\n\text4_fsblk_t first_pblock;\n\text4_fsblk_t last_pblock;\n};\n\nstruct migrate_vma {\n\tstruct vm_area_struct *vma;\n\tlong unsigned int *dst;\n\tlong unsigned int *src;\n\tlong unsigned int cpages;\n\tlong unsigned int npages;\n\tlong unsigned int start;\n\tlong unsigned int end;\n\tvoid *pgmap_owner;\n\tlong unsigned int flags;\n\tstruct page *fault_page;\n};\n\nstruct set_affinity_pending;\n\nstruct migration_arg {\n\tstruct task_struct *task;\n\tint dest_cpu;\n\tstruct set_affinity_pending *pending;\n};\n\nstruct migration_mpol {\n\tstruct mempolicy *pol;\n\tlong unsigned int ilx;\n};\n\nstruct migration_swap_arg {\n\tstruct task_struct *src_task;\n\tstruct task_struct *dst_task;\n\tint src_cpu;\n\tint dst_cpu;\n};\n\nstruct migration_target_control {\n\tint nid;\n\tnodemask_t *nmask;\n\tgfp_t gfp_mask;\n\tenum migrate_reason reason;\n};\n\nstruct phy_package_shared;\n\nstruct mii_bus {\n\tstruct module *owner;\n\tconst char *name;\n\tchar id[61];\n\tvoid *priv;\n\tint (*read)(struct mii_bus *, int, int);\n\tint (*write)(struct mii_bus *, int, int, u16);\n\tint (*read_c45)(struct mii_bus *, int, int, int);\n\tint (*write_c45)(struct mii_bus *, int, int, int, u16);\n\tint (*reset)(struct mii_bus *);\n\tstruct mdio_bus_stats stats[32];\n\tstruct mutex mdio_lock;\n\tstruct device *parent;\n\tenum {\n\t\tMDIOBUS_ALLOCATED = 1,\n\t\tMDIOBUS_REGISTERED = 2,\n\t\tMDIOBUS_UNREGISTERED = 3,\n\t\tMDIOBUS_RELEASED = 4,\n\t} state;\n\tstruct device dev;\n\tstruct mdio_device *mdio_map[32];\n\tu32 phy_mask;\n\tu32 phy_ignore_ta_mask;\n\tint irq[32];\n\tint reset_delay_us;\n\tint reset_post_delay_us;\n\tstruct gpio_desc *reset_gpiod;\n\tstruct mutex shared_lock;\n\tstruct phy_package_shared *shared[32];\n};\n\nstruct mii_ioctl_data {\n\t__u16 phy_id;\n\t__u16 reg_num;\n\t__u16 val_in;\n\t__u16 val_out;\n};\n\nstruct mii_timestamper {\n\tbool (*rxtstamp)(struct mii_timestamper *, struct sk_buff *, int);\n\tvoid (*txtstamp)(struct mii_timestamper *, struct sk_buff *, int);\n\tint (*hwtstamp)(struct mii_timestamper *, struct kernel_hwtstamp_config *, struct netlink_ext_ack *);\n\tvoid (*link_state)(struct mii_timestamper *, struct phy_device *);\n\tint (*ts_info)(struct mii_timestamper *, struct kernel_ethtool_ts_info *);\n\tstruct device *device;\n};\n\nstruct mii_timestamping_ctrl {\n\tstruct mii_timestamper * (*probe_channel)(struct device *, unsigned int);\n\tvoid (*release_channel)(struct device *, struct mii_timestamper *);\n};\n\nstruct mii_timestamping_desc {\n\tstruct list_head list;\n\tstruct mii_timestamping_ctrl *ctrl;\n\tstruct device *device;\n};\n\nstruct min_heap_callbacks {\n\tbool (*less)(const void *, const void *, void *);\n\tvoid (*swp)(void *, void *, void *);\n};\n\nstruct min_heap_char {\n\tint nr;\n\tint size;\n\tchar *data;\n\tchar preallocated[0];\n};\n\ntypedef struct min_heap_char min_heap_char;\n\nstruct tcf_proto;\n\nstruct mini_Qdisc {\n\tstruct tcf_proto *filter_list;\n\tstruct tcf_block *block;\n\tstruct gnet_stats_basic_sync *cpu_bstats;\n\tstruct gnet_stats_queue *cpu_qstats;\n\tlong unsigned int rcu_state;\n};\n\nstruct mini_Qdisc_pair {\n\tstruct mini_Qdisc miniq1;\n\tstruct mini_Qdisc miniq2;\n\tstruct mini_Qdisc **p_miniq;\n};\n\nstruct minimode {\n\tshort int w;\n\tshort int h;\n\tshort int r;\n\tshort int rb;\n};\n\nstruct minmax_sample {\n\tu32 t;\n\tu32 v;\n};\n\nstruct minmax {\n\tstruct minmax_sample s[3];\n};\n\nstruct mipi_dsi_host;\n\nstruct mipi_dsi_device {\n\tstruct mipi_dsi_host *host;\n\tstruct device dev;\n\tbool attached;\n\tchar name[20];\n\tunsigned int channel;\n\tunsigned int lanes;\n\tenum mipi_dsi_pixel_format format;\n\tlong unsigned int mode_flags;\n\tlong unsigned int hs_rate;\n\tlong unsigned int lp_rate;\n\tstruct drm_dsc_config *dsc;\n};\n\nstruct mipi_dsi_device_info {\n\tchar type[20];\n\tu32 channel;\n\tstruct device_node *node;\n};\n\nstruct mipi_dsi_driver {\n\tstruct device_driver driver;\n\tint (*probe)(struct mipi_dsi_device *);\n\tvoid (*remove)(struct mipi_dsi_device *);\n\tvoid (*shutdown)(struct mipi_dsi_device *);\n};\n\nstruct mipi_dsi_host_ops;\n\nstruct mipi_dsi_host {\n\tstruct device *dev;\n\tconst struct mipi_dsi_host_ops *ops;\n\tstruct list_head list;\n};\n\nstruct mipi_dsi_msg;\n\nstruct mipi_dsi_host_ops {\n\tint (*attach)(struct mipi_dsi_host *, struct mipi_dsi_device *);\n\tint (*detach)(struct mipi_dsi_host *, struct mipi_dsi_device *);\n\tssize_t (*transfer)(struct mipi_dsi_host *, const struct mipi_dsi_msg *);\n};\n\nstruct mipi_dsi_msg {\n\tu8 channel;\n\tu8 type;\n\tu16 flags;\n\tsize_t tx_len;\n\tconst void *tx_buf;\n\tsize_t rx_len;\n\tvoid *rx_buf;\n};\n\nstruct mipi_dsi_multi_context {\n\tstruct mipi_dsi_device *dsi;\n\tint accum_err;\n};\n\nstruct mipi_dsi_packet {\n\tsize_t size;\n\tu8 header[4];\n\tsize_t payload_length;\n\tconst u8 *payload;\n};\n\nstruct misc_res {\n\tu64 max;\n\tatomic64_t watermark;\n\tatomic64_t usage;\n\tatomic64_t events;\n\tatomic64_t events_local;\n};\n\nstruct misc_cg {\n\tstruct cgroup_subsys_state css;\n\tstruct cgroup_file events_file;\n\tstruct cgroup_file events_local_file;\n\tstruct misc_res res[2];\n};\n\nstruct miscdevice {\n\tint minor;\n\tconst char *name;\n\tconst struct file_operations *fops;\n\tstruct list_head list;\n\tstruct device *parent;\n\tstruct device *this_device;\n\tconst struct attribute_group **groups;\n\tconst char *nodename;\n\tumode_t mode;\n};\n\nstruct mld2_grec {\n\t__u8 grec_type;\n\t__u8 grec_auxwords;\n\t__be16 grec_nsrcs;\n\tstruct in6_addr grec_mca;\n\tstruct in6_addr grec_src[0];\n};\n\nstruct mld2_query {\n\tstruct icmp6hdr mld2q_hdr;\n\tstruct in6_addr mld2q_mca;\n\t__u8 mld2q_qrv: 3;\n\t__u8 mld2q_suppress: 1;\n\t__u8 mld2q_resv2: 4;\n\t__u8 mld2q_qqic;\n\t__be16 mld2q_nsrcs;\n\tstruct in6_addr mld2q_srcs[0];\n};\n\nstruct mld2_report {\n\tstruct icmp6hdr mld2r_hdr;\n\tstruct mld2_grec mld2r_grec[0];\n};\n\nstruct mld_msg {\n\tstruct icmp6hdr mld_hdr;\n\tstruct in6_addr mld_mca;\n};\n\nstruct mlock_fbatch {\n\tlocal_lock_t lock;\n\tstruct folio_batch fbatch;\n};\n\nstruct mm_cid {\n\tu64 time;\n\tint cid;\n};\n\nstruct mm_reply_data {\n\tstruct ethnl_reply_data base;\n\tstruct ethtool_mm_state state;\n\tstruct ethtool_mm_stats stats;\n};\n\nstruct xol_area;\n\nstruct uprobes_state {\n\tstruct xol_area *xol_area;\n};\n\nstruct mmu_notifier_subscriptions;\n\nstruct mm_struct {\n\tstruct {\n\t\tstruct {\n\t\t\tatomic_t mm_count;\n\t\t\tlong: 64;\n\t\t\tlong: 64;\n\t\t\tlong: 64;\n\t\t\tlong: 64;\n\t\t\tlong: 64;\n\t\t\tlong: 64;\n\t\t\tlong: 64;\n\t\t};\n\t\tstruct maple_tree mm_mt;\n\t\tlong unsigned int mmap_base;\n\t\tlong unsigned int mmap_legacy_base;\n\t\tlong unsigned int mmap_compat_base;\n\t\tlong unsigned int mmap_compat_legacy_base;\n\t\tlong unsigned int task_size;\n\t\tpgd_t *pgd;\n\t\tatomic_t membarrier_state;\n\t\tatomic_t mm_users;\n\t\tstruct mm_cid *pcpu_cid;\n\t\tlong unsigned int mm_cid_next_scan;\n\t\tatomic_long_t pgtables_bytes;\n\t\tint map_count;\n\t\tspinlock_t page_table_lock;\n\t\tstruct rw_semaphore mmap_lock;\n\t\tstruct list_head mmlist;\n\t\tint mm_lock_seq;\n\t\tlong unsigned int hiwater_rss;\n\t\tlong unsigned int hiwater_vm;\n\t\tlong unsigned int total_vm;\n\t\tlong unsigned int locked_vm;\n\t\tatomic64_t pinned_vm;\n\t\tlong unsigned int data_vm;\n\t\tlong unsigned int exec_vm;\n\t\tlong unsigned int stack_vm;\n\t\tlong unsigned int def_flags;\n\t\tseqcount_t write_protect_seq;\n\t\tspinlock_t arg_lock;\n\t\tlong unsigned int start_code;\n\t\tlong unsigned int end_code;\n\t\tlong unsigned int start_data;\n\t\tlong unsigned int end_data;\n\t\tlong unsigned int start_brk;\n\t\tlong unsigned int brk;\n\t\tlong unsigned int start_stack;\n\t\tlong unsigned int arg_start;\n\t\tlong unsigned int arg_end;\n\t\tlong unsigned int env_start;\n\t\tlong unsigned int env_end;\n\t\tlong unsigned int saved_auxv[52];\n\t\tstruct percpu_counter rss_stat[4];\n\t\tstruct linux_binfmt *binfmt;\n\t\tmm_context_t context;\n\t\tlong unsigned int flags;\n\t\tspinlock_t ioctx_lock;\n\t\tstruct kioctx_table *ioctx_table;\n\t\tstruct task_struct *owner;\n\t\tstruct user_namespace *user_ns;\n\t\tstruct file *exe_file;\n\t\tstruct mmu_notifier_subscriptions *notifier_subscriptions;\n\t\tlong unsigned int numa_next_scan;\n\t\tlong unsigned int numa_scan_offset;\n\t\tint numa_scan_seq;\n\t\tatomic_t tlb_flush_pending;\n\t\tatomic_t tlb_flush_batched;\n\t\tstruct uprobes_state uprobes_state;\n\t\tatomic_long_t hugetlb_usage;\n\t\tstruct work_struct async_put_work;\n\t\tstruct iommu_mm_data *iommu_mm;\n\t\tlong unsigned int ksm_merging_pages;\n\t\tlong unsigned int ksm_rmap_items;\n\t\tatomic_long_t ksm_zero_pages;\n\t\tstruct {\n\t\t\tstruct list_head list;\n\t\t\tlong unsigned int bitmap;\n\t\t\tstruct mem_cgroup *memcg;\n\t\t} lru_gen;\n\t\tlong: 64;\n\t\tlong: 64;\n\t\tlong: 64;\n\t\tlong: 64;\n\t};\n\tlong unsigned int cpu_bitmap[0];\n};\n\nstruct mm_struct__safe_rcu_or_null {\n\tstruct file *exe_file;\n};\n\nstruct mm_walk_ops;\n\nstruct mm_walk {\n\tconst struct mm_walk_ops *ops;\n\tstruct mm_struct *mm;\n\tpgd_t *pgd;\n\tstruct vm_area_struct *vma;\n\tenum page_walk_action action;\n\tbool no_vma;\n\tvoid *private;\n};\n\nstruct mm_walk_ops {\n\tint (*pgd_entry)(pgd_t *, long unsigned int, long unsigned int, struct mm_walk *);\n\tint (*p4d_entry)(p4d_t *, long unsigned int, long unsigned int, struct mm_walk *);\n\tint (*pud_entry)(pud_t *, long unsigned int, long unsigned int, struct mm_walk *);\n\tint (*pmd_entry)(pmd_t *, long unsigned int, long unsigned int, struct mm_walk *);\n\tint (*pte_entry)(pte_t *, long unsigned int, long unsigned int, struct mm_walk *);\n\tint (*pte_hole)(long unsigned int, long unsigned int, int, struct mm_walk *);\n\tint (*hugetlb_entry)(pte_t *, long unsigned int, long unsigned int, long unsigned int, struct mm_walk *);\n\tint (*test_walk)(long unsigned int, long unsigned int, struct mm_walk *);\n\tint (*pre_vma)(long unsigned int, long unsigned int, struct mm_walk *);\n\tvoid (*post_vma)(struct mm_walk *);\n\tenum page_walk_lock walk_lock;\n};\n\nstruct mmap_arg_struct32 {\n\tunsigned int addr;\n\tunsigned int len;\n\tunsigned int prot;\n\tunsigned int flags;\n\tunsigned int fd;\n\tunsigned int offset;\n};\n\nstruct mmap_unlock_irq_work {\n\tstruct irq_work irq_work;\n\tstruct mm_struct *mm;\n};\n\nstruct mmc_command;\n\nstruct mmc_data;\n\nstruct mmc_host;\n\nstruct mmc_request {\n\tstruct mmc_command *sbc;\n\tstruct mmc_command *cmd;\n\tstruct mmc_data *data;\n\tstruct mmc_command *stop;\n\tstruct completion completion;\n\tstruct completion cmd_completion;\n\tvoid (*done)(struct mmc_request *);\n\tvoid (*recovery_notifier)(struct mmc_request *);\n\tstruct mmc_host *host;\n\tbool cap_cmd_during_tfr;\n\tint tag;\n\tconst struct bio_crypt_ctx *crypto_ctx;\n\tint crypto_key_slot;\n};\n\nstruct mmc_command {\n\tu32 opcode;\n\tu32 arg;\n\tu32 resp[4];\n\tunsigned int flags;\n\tunsigned int retries;\n\tint error;\n\tunsigned int busy_timeout;\n\tstruct mmc_data *data;\n\tstruct mmc_request *mrq;\n};\n\nstruct mmc_data {\n\tunsigned int timeout_ns;\n\tunsigned int timeout_clks;\n\tunsigned int blksz;\n\tunsigned int blocks;\n\tunsigned int blk_addr;\n\tint error;\n\tunsigned int flags;\n\tunsigned int bytes_xfered;\n\tstruct mmc_command *stop;\n\tstruct mmc_request *mrq;\n\tunsigned int sg_len;\n\tint sg_count;\n\tstruct scatterlist *sg;\n\ts32 host_cookie;\n};\n\nstruct mmc_blk_request {\n\tstruct mmc_request mrq;\n\tstruct mmc_command sbc;\n\tstruct mmc_command cmd;\n\tstruct mmc_command stop;\n\tstruct mmc_data data;\n};\n\nstruct mmc_bus_ops {\n\tvoid (*remove)(struct mmc_host *);\n\tvoid (*detect)(struct mmc_host *);\n\tint (*pre_suspend)(struct mmc_host *);\n\tint (*suspend)(struct mmc_host *);\n\tint (*resume)(struct mmc_host *);\n\tint (*runtime_suspend)(struct mmc_host *);\n\tint (*runtime_resume)(struct mmc_host *);\n\tint (*alive)(struct mmc_host *);\n\tint (*shutdown)(struct mmc_host *);\n\tint (*hw_reset)(struct mmc_host *);\n\tint (*sw_reset)(struct mmc_host *);\n\tbool (*cache_enabled)(struct mmc_host *);\n\tint (*flush_cache)(struct mmc_host *);\n};\n\nstruct mmc_busy_data {\n\tstruct mmc_card *card;\n\tbool retry_crc_err;\n\tenum mmc_busy_cmd busy_cmd;\n};\n\nstruct mmc_cid {\n\tunsigned int manfid;\n\tchar prod_name[8];\n\tunsigned char prv;\n\tunsigned int serial;\n\tshort unsigned int oemid;\n\tshort unsigned int year;\n\tunsigned char hwrev;\n\tunsigned char fwrev;\n\tunsigned char month;\n};\n\nstruct mmc_csd {\n\tunsigned char structure;\n\tunsigned char mmca_vsn;\n\tshort unsigned int cmdclass;\n\tshort unsigned int taac_clks;\n\tunsigned int taac_ns;\n\tunsigned int c_size;\n\tunsigned int r2w_factor;\n\tunsigned int max_dtr;\n\tunsigned int erase_size;\n\tunsigned int wp_grp_size;\n\tunsigned int read_blkbits;\n\tunsigned int write_blkbits;\n\tsector_t capacity;\n\tunsigned int read_partial: 1;\n\tunsigned int read_misalign: 1;\n\tunsigned int write_partial: 1;\n\tunsigned int write_misalign: 1;\n\tunsigned int dsr_imp: 1;\n};\n\nstruct mmc_ext_csd {\n\tu8 rev;\n\tu8 erase_group_def;\n\tu8 sec_feature_support;\n\tu8 rel_sectors;\n\tu8 rel_param;\n\tbool enhanced_rpmb_supported;\n\tu8 part_config;\n\tu8 cache_ctrl;\n\tu8 rst_n_function;\n\tunsigned int part_time;\n\tunsigned int sa_timeout;\n\tunsigned int generic_cmd6_time;\n\tunsigned int power_off_longtime;\n\tu8 power_off_notification;\n\tunsigned int hs_max_dtr;\n\tunsigned int hs200_max_dtr;\n\tunsigned int sectors;\n\tunsigned int hc_erase_size;\n\tunsigned int hc_erase_timeout;\n\tunsigned int sec_trim_mult;\n\tunsigned int sec_erase_mult;\n\tunsigned int trim_timeout;\n\tbool partition_setting_completed;\n\tlong long unsigned int enhanced_area_offset;\n\tunsigned int enhanced_area_size;\n\tunsigned int cache_size;\n\tbool hpi_en;\n\tbool hpi;\n\tunsigned int hpi_cmd;\n\tbool bkops;\n\tbool man_bkops_en;\n\tbool auto_bkops_en;\n\tunsigned int data_sector_size;\n\tunsigned int data_tag_unit_size;\n\tunsigned int boot_ro_lock;\n\tbool boot_ro_lockable;\n\tbool ffu_capable;\n\tbool cmdq_en;\n\tbool cmdq_support;\n\tunsigned int cmdq_depth;\n\tu8 fwrev[8];\n\tu8 raw_exception_status;\n\tu8 raw_partition_support;\n\tu8 raw_rpmb_size_mult;\n\tu8 raw_erased_mem_count;\n\tu8 strobe_support;\n\tu8 raw_ext_csd_structure;\n\tu8 raw_card_type;\n\tu8 raw_driver_strength;\n\tu8 out_of_int_time;\n\tu8 raw_pwr_cl_52_195;\n\tu8 raw_pwr_cl_26_195;\n\tu8 raw_pwr_cl_52_360;\n\tu8 raw_pwr_cl_26_360;\n\tu8 raw_s_a_timeout;\n\tu8 raw_hc_erase_gap_size;\n\tu8 raw_erase_timeout_mult;\n\tu8 raw_hc_erase_grp_size;\n\tu8 raw_boot_mult;\n\tu8 raw_sec_trim_mult;\n\tu8 raw_sec_erase_mult;\n\tu8 raw_sec_feature_support;\n\tu8 raw_trim_mult;\n\tu8 raw_pwr_cl_200_195;\n\tu8 raw_pwr_cl_200_360;\n\tu8 raw_pwr_cl_ddr_52_195;\n\tu8 raw_pwr_cl_ddr_52_360;\n\tu8 raw_pwr_cl_ddr_200_360;\n\tu8 raw_bkops_status;\n\tu8 raw_sectors[4];\n\tu8 pre_eol_info;\n\tu8 device_life_time_est_typ_a;\n\tu8 device_life_time_est_typ_b;\n\tunsigned int feature_support;\n};\n\nstruct sd_scr {\n\tunsigned char sda_vsn;\n\tunsigned char sda_spec3;\n\tunsigned char sda_spec4;\n\tunsigned char sda_specx;\n\tunsigned char bus_widths;\n\tunsigned char cmds;\n};\n\nstruct sd_ssr {\n\tunsigned int au;\n\tunsigned int erase_timeout;\n\tunsigned int erase_offset;\n};\n\nstruct sd_switch_caps {\n\tunsigned int hs_max_dtr;\n\tunsigned int uhs_max_dtr;\n\tunsigned int sd3_bus_mode;\n\tunsigned int sd3_drv_type;\n\tunsigned int sd3_curr_limit;\n};\n\nstruct sd_ext_reg {\n\tu8 fno;\n\tu8 page;\n\tu16 offset;\n\tu8 rev;\n\tu8 feature_enabled;\n\tu8 feature_support;\n};\n\nstruct sdio_cccr {\n\tunsigned int sdio_vsn;\n\tunsigned int sd_vsn;\n\tunsigned int multi_block: 1;\n\tunsigned int low_speed: 1;\n\tunsigned int wide_bus: 1;\n\tunsigned int high_power: 1;\n\tunsigned int high_speed: 1;\n\tunsigned int disable_cd: 1;\n\tunsigned int enable_async_irq: 1;\n};\n\nstruct sdio_cis {\n\tshort unsigned int vendor;\n\tshort unsigned int device;\n\tshort unsigned int blksize;\n\tunsigned int max_dtr;\n};\n\nstruct mmc_part {\n\tu64 size;\n\tunsigned int part_cfg;\n\tchar name[20];\n\tbool force_ro;\n\tunsigned int area_type;\n};\n\nstruct sdio_func_tuple;\n\nstruct mmc_card {\n\tstruct mmc_host *host;\n\tstruct device dev;\n\tu32 ocr;\n\tunsigned int rca;\n\tunsigned int type;\n\tunsigned int state;\n\tunsigned int quirks;\n\tunsigned int quirk_max_rate;\n\tbool written_flag;\n\tbool reenable_cmdq;\n\tunsigned int erase_size;\n\tunsigned int erase_shift;\n\tunsigned int pref_erase;\n\tunsigned int eg_boundary;\n\tunsigned int erase_arg;\n\tu8 erased_byte;\n\tunsigned int wp_grp_size;\n\tu32 raw_cid[4];\n\tu32 raw_csd[4];\n\tu32 raw_scr[2];\n\tu32 raw_ssr[16];\n\tstruct mmc_cid cid;\n\tstruct mmc_csd csd;\n\tstruct mmc_ext_csd ext_csd;\n\tstruct sd_scr scr;\n\tstruct sd_ssr ssr;\n\tstruct sd_switch_caps sw_caps;\n\tstruct sd_ext_reg ext_power;\n\tstruct sd_ext_reg ext_perf;\n\tunsigned int sdio_funcs;\n\tatomic_t sdio_funcs_probed;\n\tstruct sdio_cccr cccr;\n\tstruct sdio_cis cis;\n\tstruct sdio_func *sdio_func[7];\n\tstruct sdio_func *sdio_single_irq;\n\tu8 major_rev;\n\tu8 minor_rev;\n\tunsigned int num_info;\n\tconst char **info;\n\tstruct sdio_func_tuple *tuples;\n\tunsigned int sd_bus_speed;\n\tunsigned int mmc_avail_type;\n\tunsigned int drive_strength;\n\tstruct dentry *debugfs_root;\n\tstruct mmc_part part[7];\n\tunsigned int nr_parts;\n\tstruct workqueue_struct *complete_wq;\n};\n\nstruct mmc_clk_phase {\n\tbool valid;\n\tu16 in_deg;\n\tu16 out_deg;\n};\n\nstruct mmc_clk_phase_map {\n\tstruct mmc_clk_phase phase[11];\n};\n\nstruct mmc_cqe_ops {\n\tint (*cqe_enable)(struct mmc_host *, struct mmc_card *);\n\tvoid (*cqe_disable)(struct mmc_host *);\n\tint (*cqe_request)(struct mmc_host *, struct mmc_request *);\n\tvoid (*cqe_post_req)(struct mmc_host *, struct mmc_request *);\n\tvoid (*cqe_off)(struct mmc_host *);\n\tint (*cqe_wait_for_idle)(struct mmc_host *);\n\tbool (*cqe_timeout)(struct mmc_host *, struct mmc_request *, bool *);\n\tvoid (*cqe_recovery_start)(struct mmc_host *);\n\tvoid (*cqe_recovery_finish)(struct mmc_host *);\n};\n\nstruct mmc_ctx {\n\tstruct task_struct *task;\n};\n\nstruct mmc_driver {\n\tstruct device_driver drv;\n\tint (*probe)(struct mmc_card *);\n\tvoid (*remove)(struct mmc_card *);\n\tvoid (*shutdown)(struct mmc_card *);\n};\n\nstruct mmc_fixup {\n\tconst char *name;\n\tu64 rev_start;\n\tu64 rev_end;\n\tunsigned int manfid;\n\tshort unsigned int oemid;\n\tshort unsigned int year;\n\tunsigned char month;\n\tu16 cis_vendor;\n\tu16 cis_device;\n\tunsigned int ext_csd_rev;\n\tconst char *of_compatible;\n\tvoid (*vendor_fixup)(struct mmc_card *, int);\n\tint data;\n};\n\nstruct mmc_gpio {\n\tstruct gpio_desc *ro_gpio;\n\tstruct gpio_desc *cd_gpio;\n\tirq_handler_t cd_gpio_isr;\n\tchar *ro_label;\n\tchar *cd_label;\n\tu32 cd_debounce_delay_ms;\n\tint cd_irq;\n};\n\nstruct mmc_ios {\n\tunsigned int clock;\n\tshort unsigned int vdd;\n\tunsigned int power_delay_ms;\n\tunsigned char bus_mode;\n\tunsigned char chip_select;\n\tunsigned char power_mode;\n\tunsigned char bus_width;\n\tunsigned char timing;\n\tunsigned char signal_voltage;\n\tunsigned char drv_type;\n\tbool enhanced_strobe;\n};\n\nstruct mmc_slot {\n\tint cd_irq;\n\tbool cd_wake_enabled;\n\tvoid *handler_priv;\n};\n\nstruct mmc_supply {\n\tstruct regulator *vmmc;\n\tstruct regulator *vqmmc;\n};\n\nstruct mmc_host_ops;\n\nstruct mmc_pwrseq;\n\nstruct mmc_host {\n\tstruct device *parent;\n\tstruct device class_dev;\n\tint index;\n\tconst struct mmc_host_ops *ops;\n\tstruct mmc_pwrseq *pwrseq;\n\tunsigned int f_min;\n\tunsigned int f_max;\n\tunsigned int f_init;\n\tu32 ocr_avail;\n\tu32 ocr_avail_sdio;\n\tu32 ocr_avail_sd;\n\tu32 ocr_avail_mmc;\n\tstruct wakeup_source *ws;\n\tu32 max_current_330;\n\tu32 max_current_300;\n\tu32 max_current_180;\n\tu32 caps;\n\tu32 caps2;\n\tint fixed_drv_type;\n\tmmc_pm_flag_t pm_caps;\n\tunsigned int max_seg_size;\n\tshort unsigned int max_segs;\n\tshort unsigned int unused;\n\tunsigned int max_req_size;\n\tunsigned int max_blk_size;\n\tunsigned int max_blk_count;\n\tunsigned int max_busy_timeout;\n\tspinlock_t lock;\n\tstruct mmc_ios ios;\n\tunsigned int use_spi_crc: 1;\n\tunsigned int claimed: 1;\n\tunsigned int doing_init_tune: 1;\n\tunsigned int can_retune: 1;\n\tunsigned int doing_retune: 1;\n\tunsigned int retune_now: 1;\n\tunsigned int retune_paused: 1;\n\tunsigned int retune_crc_disable: 1;\n\tunsigned int can_dma_map_merge: 1;\n\tunsigned int vqmmc_enabled: 1;\n\tint rescan_disable;\n\tint rescan_entered;\n\tint need_retune;\n\tint hold_retune;\n\tunsigned int retune_period;\n\tstruct timer_list retune_timer;\n\tbool trigger_card_event;\n\tstruct mmc_card *card;\n\twait_queue_head_t wq;\n\tstruct mmc_ctx *claimer;\n\tint claim_cnt;\n\tstruct mmc_ctx default_ctx;\n\tstruct delayed_work detect;\n\tint detect_change;\n\tstruct mmc_slot slot;\n\tconst struct mmc_bus_ops *bus_ops;\n\tunsigned int sdio_irqs;\n\tstruct task_struct *sdio_irq_thread;\n\tstruct work_struct sdio_irq_work;\n\tbool sdio_irq_pending;\n\tatomic_t sdio_irq_thread_abort;\n\tmmc_pm_flag_t pm_flags;\n\tstruct led_trigger *led;\n\tbool regulator_enabled;\n\tstruct mmc_supply supply;\n\tstruct dentry *debugfs_root;\n\tstruct mmc_request *ongoing_mrq;\n\tunsigned int actual_clock;\n\tunsigned int slotno;\n\tint dsr_req;\n\tu32 dsr;\n\tconst struct mmc_cqe_ops *cqe_ops;\n\tvoid *cqe_private;\n\tint cqe_qdepth;\n\tbool cqe_enabled;\n\tbool cqe_on;\n\tstruct blk_crypto_profile crypto_profile;\n\tbool hsq_enabled;\n\tint hsq_depth;\n\tu32 err_stats[15];\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong unsigned int private[0];\n};\n\nstruct mmc_host_ops {\n\tvoid (*post_req)(struct mmc_host *, struct mmc_request *, int);\n\tvoid (*pre_req)(struct mmc_host *, struct mmc_request *);\n\tvoid (*request)(struct mmc_host *, struct mmc_request *);\n\tint (*request_atomic)(struct mmc_host *, struct mmc_request *);\n\tvoid (*set_ios)(struct mmc_host *, struct mmc_ios *);\n\tint (*get_ro)(struct mmc_host *);\n\tint (*get_cd)(struct mmc_host *);\n\tvoid (*enable_sdio_irq)(struct mmc_host *, int);\n\tvoid (*ack_sdio_irq)(struct mmc_host *);\n\tvoid (*init_card)(struct mmc_host *, struct mmc_card *);\n\tint (*start_signal_voltage_switch)(struct mmc_host *, struct mmc_ios *);\n\tint (*card_busy)(struct mmc_host *);\n\tint (*execute_tuning)(struct mmc_host *, u32);\n\tint (*prepare_hs400_tuning)(struct mmc_host *, struct mmc_ios *);\n\tint (*execute_hs400_tuning)(struct mmc_host *, struct mmc_card *);\n\tint (*prepare_sd_hs_tuning)(struct mmc_host *, struct mmc_card *);\n\tint (*execute_sd_hs_tuning)(struct mmc_host *, struct mmc_card *);\n\tint (*hs400_prepare_ddr)(struct mmc_host *);\n\tvoid (*hs400_downgrade)(struct mmc_host *);\n\tvoid (*hs400_complete)(struct mmc_host *);\n\tvoid (*hs400_enhanced_strobe)(struct mmc_host *, struct mmc_ios *);\n\tint (*select_drive_strength)(struct mmc_card *, unsigned int, int, int, int *);\n\tvoid (*card_hw_reset)(struct mmc_host *);\n\tvoid (*card_event)(struct mmc_host *);\n\tint (*multi_io_quirk)(struct mmc_card *, unsigned int, int);\n\tint (*init_sd_express)(struct mmc_host *, struct mmc_ios *);\n};\n\nstruct mmc_op_cond_busy_data {\n\tstruct mmc_host *host;\n\tu32 ocr;\n\tstruct mmc_command *cmd;\n};\n\nstruct mmc_pwrseq_ops;\n\nstruct mmc_pwrseq {\n\tconst struct mmc_pwrseq_ops *ops;\n\tstruct device *dev;\n\tstruct list_head pwrseq_node;\n\tstruct module *owner;\n};\n\nstruct mmc_pwrseq_ops {\n\tvoid (*pre_power_on)(struct mmc_host *);\n\tvoid (*post_power_on)(struct mmc_host *);\n\tvoid (*power_off)(struct mmc_host *);\n\tvoid (*reset)(struct mmc_host *);\n};\n\nstruct mmc_queue_req {\n\tstruct mmc_blk_request brq;\n\tstruct scatterlist *sg;\n\tenum mmc_drv_op drv_op;\n\tint drv_op_result;\n\tvoid *drv_op_data;\n\tunsigned int ioc_count;\n\tint retries;\n};\n\nstruct mminit_pfnnid_cache {\n\tlong unsigned int last_start;\n\tlong unsigned int last_end;\n\tint last_nid;\n};\n\nstruct mmiotrace_map {\n\tresource_size_t phys;\n\tlong unsigned int virt;\n\tlong unsigned int len;\n\tint map_id;\n\tunsigned char opcode;\n};\n\nstruct mmiotrace_rw {\n\tresource_size_t phys;\n\tlong unsigned int value;\n\tlong unsigned int pc;\n\tint map_id;\n\tunsigned char opcode;\n\tunsigned char width;\n};\n\nstruct mmp_struct {\n\t__le32 mmp_magic;\n\t__le32 mmp_seq;\n\t__le64 mmp_time;\n\tchar mmp_nodename[64];\n\tchar mmp_bdevname[32];\n\t__le16 mmp_check_interval;\n\t__le16 mmp_pad1;\n\t__le32 mmp_pad2[226];\n\t__le32 mmp_checksum;\n};\n\nstruct mmpin {\n\tstruct user_struct *user;\n\tunsigned int num_pg;\n};\n\nstruct user_msghdr {\n\tvoid *msg_name;\n\tint msg_namelen;\n\tstruct iovec *msg_iov;\n\t__kernel_size_t msg_iovlen;\n\tvoid *msg_control;\n\t__kernel_size_t msg_controllen;\n\tunsigned int msg_flags;\n};\n\nstruct mmsghdr {\n\tstruct user_msghdr msg_hdr;\n\tunsigned int msg_len;\n};\n\nstruct encoded_page;\n\nstruct mmu_gather_batch {\n\tstruct mmu_gather_batch *next;\n\tunsigned int nr;\n\tunsigned int max;\n\tstruct encoded_page *encoded_pages[0];\n};\n\nstruct mmu_table_batch;\n\nstruct mmu_gather {\n\tstruct mm_struct *mm;\n\tstruct mmu_table_batch *batch;\n\tlong unsigned int start;\n\tlong unsigned int end;\n\tunsigned int fullmm: 1;\n\tunsigned int need_flush_all: 1;\n\tunsigned int freed_tables: 1;\n\tunsigned int delayed_rmap: 1;\n\tunsigned int cleared_ptes: 1;\n\tunsigned int cleared_pmds: 1;\n\tunsigned int cleared_puds: 1;\n\tunsigned int cleared_p4ds: 1;\n\tunsigned int vma_exec: 1;\n\tunsigned int vma_huge: 1;\n\tunsigned int vma_pfn: 1;\n\tunsigned int batch_count;\n\tstruct mmu_gather_batch *active;\n\tstruct mmu_gather_batch local;\n\tstruct page *__pages[8];\n};\n\nstruct mmu_interval_notifier_ops;\n\nstruct mmu_interval_notifier {\n\tstruct interval_tree_node interval_tree;\n\tconst struct mmu_interval_notifier_ops *ops;\n\tstruct mm_struct *mm;\n\tstruct hlist_node deferred_item;\n\tlong unsigned int invalidate_seq;\n};\n\nstruct mmu_interval_notifier_ops {\n\tbool (*invalidate)(struct mmu_interval_notifier *, const struct mmu_notifier_range *, long unsigned int);\n};\n\nstruct mmu_notifier_ops {\n\tvoid (*release)(struct mmu_notifier *, struct mm_struct *);\n\tint (*clear_flush_young)(struct mmu_notifier *, struct mm_struct *, long unsigned int, long unsigned int);\n\tint (*clear_young)(struct mmu_notifier *, struct mm_struct *, long unsigned int, long unsigned int);\n\tint (*test_young)(struct mmu_notifier *, struct mm_struct *, long unsigned int);\n\tint (*invalidate_range_start)(struct mmu_notifier *, const struct mmu_notifier_range *);\n\tvoid (*invalidate_range_end)(struct mmu_notifier *, const struct mmu_notifier_range *);\n\tvoid (*arch_invalidate_secondary_tlbs)(struct mmu_notifier *, struct mm_struct *, long unsigned int, long unsigned int);\n\tstruct mmu_notifier * (*alloc_notifier)(struct mm_struct *);\n\tvoid (*free_notifier)(struct mmu_notifier *);\n};\n\nstruct mmu_notifier_subscriptions {\n\tstruct hlist_head list;\n\tbool has_itree;\n\tspinlock_t lock;\n\tlong unsigned int invalidate_seq;\n\tlong unsigned int active_invalidate_ranges;\n\tstruct rb_root_cached itree;\n\twait_queue_head_t wq;\n\tstruct hlist_head deferred_list;\n};\n\nstruct mmu_table_batch {\n\tstruct callback_head rcu;\n\tunsigned int nr;\n\tvoid *tables[0];\n};\n\nstruct mmu_update {\n\tuint64_t ptr;\n\tuint64_t val;\n};\n\nstruct mmuext_op {\n\tunsigned int cmd;\n\tunion {\n\t\txen_pfn_t mfn;\n\t\tlong unsigned int linear_addr;\n\t} arg1;\n\tunion {\n\t\tunsigned int nr_ents;\n\t\tvoid *vcpumask;\n\t\txen_pfn_t src_mfn;\n\t} arg2;\n};\n\nstruct mn {\n\tunsigned char m_val;\n\tunsigned char n_val;\n\tunsigned char m_shift;\n\tunsigned char n_lshift;\n};\n\nstruct mnt_id_req {\n\t__u32 size;\n\t__u32 spare;\n\t__u64 mnt_id;\n\t__u64 param;\n\t__u64 mnt_ns_id;\n};\n\nstruct uid_gid_extent {\n\tu32 first;\n\tu32 lower_first;\n\tu32 count;\n};\n\nstruct uid_gid_map {\n\tu32 nr_extents;\n\tunion {\n\t\tstruct uid_gid_extent extent[5];\n\t\tstruct {\n\t\t\tstruct uid_gid_extent *forward;\n\t\t\tstruct uid_gid_extent *reverse;\n\t\t};\n\t};\n};\n\nstruct mnt_idmap {\n\tstruct uid_gid_map uid_map;\n\tstruct uid_gid_map gid_map;\n\trefcount_t count;\n};\n\nstruct mount;\n\nstruct mnt_namespace {\n\tstruct ns_common ns;\n\tstruct mount *root;\n\tstruct rb_root mounts;\n\tstruct user_namespace *user_ns;\n\tstruct ucounts *ucounts;\n\tu64 seq;\n\twait_queue_head_t poll;\n\tu64 event;\n\tunsigned int nr_mounts;\n\tunsigned int pending_mounts;\n\tstruct rb_node mnt_ns_tree_node;\n\trefcount_t passive;\n};\n\nstruct mnt_pcp {\n\tint mnt_count;\n\tint mnt_writers;\n};\n\nstruct mod_arch_specific {};\n\nstruct mod_initfree {\n\tstruct llist_node node;\n\tvoid *init_text;\n\tvoid *init_data;\n\tvoid *init_rodata;\n};\n\nstruct mod_kallsyms {\n\tElf64_Sym *symtab;\n\tunsigned int num_symtab;\n\tchar *strtab;\n\tchar *typetab;\n};\n\nstruct mod_tree_node {\n\tstruct module *mod;\n\tstruct latch_tree_node node;\n};\n\nstruct mod_tree_root {\n\tstruct latch_tree_root root;\n\tlong unsigned int addr_min;\n\tlong unsigned int addr_max;\n};\n\nstruct mode_page_header {\n\t__be16 mode_data_length;\n\t__u8 medium_type;\n\t__u8 reserved1;\n\t__u8 reserved2;\n\t__u8 reserved3;\n\t__be16 desc_length;\n};\n\nstruct modesel_head {\n\t__u8 reserved1;\n\t__u8 medium;\n\t__u8 reserved2;\n\t__u8 block_desc_length;\n\t__u8 density;\n\t__u8 number_of_blocks_hi;\n\t__u8 number_of_blocks_med;\n\t__u8 number_of_blocks_lo;\n\t__u8 reserved3;\n\t__u8 block_length_hi;\n\t__u8 block_length_med;\n\t__u8 block_length_lo;\n};\n\nstruct pkcs7_message;\n\nstruct modsig {\n\tstruct pkcs7_message *pkcs7_msg;\n\tenum hash_algo hash_algo;\n\tconst u8 *digest;\n\tu32 digest_size;\n\tint raw_pkcs7_len;\n\tu8 raw_pkcs7[0];\n};\n\nstruct module_param_attrs;\n\nstruct module_kobject {\n\tstruct kobject kobj;\n\tstruct module *mod;\n\tstruct kobject *drivers_dir;\n\tstruct module_param_attrs *mp;\n\tstruct completion *kobj_completion;\n};\n\nstruct module_memory {\n\tvoid *base;\n\tunsigned int size;\n\tstruct mod_tree_node mtn;\n};\n\nstruct module_attribute;\n\nstruct module_sect_attrs;\n\nstruct module_notes_attrs;\n\nstruct trace_event_call;\n\nstruct trace_eval_map;\n\nstruct static_call_site;\n\nstruct module {\n\tenum module_state state;\n\tstruct list_head list;\n\tchar name[56];\n\tstruct module_kobject mkobj;\n\tstruct module_attribute *modinfo_attrs;\n\tconst char *version;\n\tconst char *srcversion;\n\tstruct kobject *holders_dir;\n\tconst struct kernel_symbol *syms;\n\tconst s32 *crcs;\n\tunsigned int num_syms;\n\tstruct mutex param_lock;\n\tstruct kernel_param *kp;\n\tunsigned int num_kp;\n\tunsigned int num_gpl_syms;\n\tconst struct kernel_symbol *gpl_syms;\n\tconst s32 *gpl_crcs;\n\tbool using_gplonly_symbols;\n\tbool sig_ok;\n\tbool async_probe_requested;\n\tunsigned int num_exentries;\n\tstruct exception_table_entry *extable;\n\tint (*init)(void);\n\tstruct module_memory mem[7];\n\tstruct mod_arch_specific arch;\n\tlong unsigned int taints;\n\tunsigned int num_bugs;\n\tstruct list_head bug_list;\n\tstruct bug_entry *bug_table;\n\tstruct mod_kallsyms *kallsyms;\n\tstruct mod_kallsyms core_kallsyms;\n\tstruct module_sect_attrs *sect_attrs;\n\tstruct module_notes_attrs *notes_attrs;\n\tchar *args;\n\tvoid *percpu;\n\tunsigned int percpu_size;\n\tvoid *noinstr_text_start;\n\tunsigned int noinstr_text_size;\n\tunsigned int num_tracepoints;\n\ttracepoint_ptr_t *tracepoints_ptrs;\n\tunsigned int num_srcu_structs;\n\tstruct srcu_struct **srcu_struct_ptrs;\n\tunsigned int num_bpf_raw_events;\n\tstruct bpf_raw_event_map *bpf_raw_events;\n\tunsigned int btf_data_size;\n\tunsigned int btf_base_data_size;\n\tvoid *btf_data;\n\tvoid *btf_base_data;\n\tstruct jump_entry *jump_entries;\n\tunsigned int num_jump_entries;\n\tunsigned int num_trace_bprintk_fmt;\n\tconst char **trace_bprintk_fmt_start;\n\tstruct trace_event_call **trace_events;\n\tunsigned int num_trace_events;\n\tstruct trace_eval_map **trace_evals;\n\tunsigned int num_trace_evals;\n\tunsigned int num_ftrace_callsites;\n\tlong unsigned int *ftrace_callsites;\n\tvoid *kprobes_text_start;\n\tunsigned int kprobes_text_size;\n\tlong unsigned int *kprobe_blacklist;\n\tunsigned int num_kprobe_blacklist;\n\tint num_static_call_sites;\n\tstruct static_call_site *static_call_sites;\n\tbool klp;\n\tbool klp_alive;\n\tstruct klp_modinfo *klp_info;\n\tstruct list_head source_list;\n\tstruct list_head target_list;\n\tvoid (*exit)(void);\n\tatomic_t refcnt;\n\tstruct error_injection_entry *ei_funcs;\n\tunsigned int num_ei_funcs;\n\tstruct _ddebug_info dyndbg_info;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct module_attribute {\n\tstruct attribute attr;\n\tssize_t (*show)(struct module_attribute *, struct module_kobject *, char *);\n\tssize_t (*store)(struct module_attribute *, struct module_kobject *, const char *, size_t);\n\tvoid (*setup)(struct module *, const char *);\n\tint (*test)(struct module *);\n\tvoid (*free)(struct module *);\n};\n\nstruct module_notes_attrs {\n\tstruct kobject *dir;\n\tunsigned int notes;\n\tstruct bin_attribute attrs[0];\n};\n\nstruct param_attribute {\n\tstruct module_attribute mattr;\n\tconst struct kernel_param *param;\n};\n\nstruct module_param_attrs {\n\tunsigned int num;\n\tstruct attribute_group grp;\n\tstruct param_attribute attrs[0];\n};\n\nstruct module_reply_data {\n\tstruct ethnl_reply_data base;\n\tstruct ethtool_module_power_mode_params power;\n};\n\nstruct module_sect_attr {\n\tstruct bin_attribute battr;\n\tlong unsigned int address;\n};\n\nstruct module_sect_attrs {\n\tstruct attribute_group grp;\n\tunsigned int nsections;\n\tstruct module_sect_attr attrs[0];\n};\n\nstruct module_signature {\n\tu8 algo;\n\tu8 hash;\n\tu8 id_type;\n\tu8 signer_len;\n\tu8 key_id_len;\n\tu8 __pad[3];\n\t__be32 sig_len;\n};\n\nstruct module_string {\n\tstruct list_head next;\n\tstruct module *module;\n\tchar *str;\n};\n\nstruct module_use {\n\tstruct list_head source_list;\n\tstruct list_head target_list;\n\tstruct module *source;\n\tstruct module *target;\n};\n\nstruct module_version_attribute {\n\tstruct module_attribute mattr;\n\tconst char *module_name;\n\tconst char *version;\n};\n\nstruct modules_array {\n\tstruct module **mods;\n\tint mods_cnt;\n\tint mods_cap;\n};\n\nstruct modversion_info {\n\tu32 next;\n\tu32 crc;\n\tchar name[0];\n};\n\nstruct mon_config_info {\n\tu32 evtid;\n\tu32 mon_config;\n};\n\nunion mon_data_bits {\n\tvoid *priv;\n\tstruct {\n\t\tunsigned int rid: 10;\n\t\tenum resctrl_event_id evtid: 7;\n\t\tunsigned int sum: 1;\n\t\tunsigned int domid: 14;\n\t} u;\n};\n\nstruct mon_evt {\n\tenum resctrl_event_id evtid;\n\tchar *name;\n\tbool configurable;\n\tstruct list_head list;\n};\n\nstruct rdtgroup;\n\nstruct mongroup {\n\tstruct kernfs_node *mon_data_kn;\n\tstruct rdtgroup *parent;\n\tstruct list_head crdtgrp_list;\n\tu32 rmid;\n};\n\nstruct vfsmount {\n\tstruct dentry *mnt_root;\n\tstruct super_block *mnt_sb;\n\tint mnt_flags;\n\tstruct mnt_idmap *mnt_idmap;\n};\n\nstruct mountpoint;\n\nstruct mount {\n\tstruct hlist_node mnt_hash;\n\tstruct mount *mnt_parent;\n\tstruct dentry *mnt_mountpoint;\n\tstruct vfsmount mnt;\n\tunion {\n\t\tstruct rb_node mnt_node;\n\t\tstruct callback_head mnt_rcu;\n\t\tstruct llist_node mnt_llist;\n\t};\n\tstruct mnt_pcp *mnt_pcp;\n\tstruct list_head mnt_mounts;\n\tstruct list_head mnt_child;\n\tstruct list_head mnt_instance;\n\tconst char *mnt_devname;\n\tstruct list_head mnt_list;\n\tstruct list_head mnt_expire;\n\tstruct list_head mnt_share;\n\tstruct list_head mnt_slave_list;\n\tstruct list_head mnt_slave;\n\tstruct mount *mnt_master;\n\tstruct mnt_namespace *mnt_ns;\n\tstruct mountpoint *mnt_mp;\n\tunion {\n\t\tstruct hlist_node mnt_mp_list;\n\t\tstruct hlist_node mnt_umount;\n\t};\n\tstruct list_head mnt_umounting;\n\tstruct fsnotify_mark_connector *mnt_fsnotify_marks;\n\t__u32 mnt_fsnotify_mask;\n\tint mnt_id;\n\tu64 mnt_id_unique;\n\tint mnt_group_id;\n\tint mnt_expiry_mark;\n\tstruct hlist_head mnt_pins;\n\tstruct hlist_head mnt_stuck_children;\n};\n\nstruct mount_attr {\n\t__u64 attr_set;\n\t__u64 attr_clr;\n\t__u64 propagation;\n\t__u64 userns_fd;\n};\n\nstruct mount_kattr {\n\tunsigned int attr_set;\n\tunsigned int attr_clr;\n\tunsigned int propagation;\n\tunsigned int lookup_flags;\n\tbool recurse;\n\tstruct user_namespace *mnt_userns;\n\tstruct mnt_idmap *mnt_idmap;\n};\n\nstruct mount_opts {\n\tint token;\n\tint mount_opt;\n\tint flags;\n};\n\nstruct mountpoint {\n\tstruct hlist_node m_hash;\n\tstruct dentry *m_dentry;\n\tstruct hlist_head m_list;\n\tint m_count;\n};\n\nstruct mousedev_hw_data {\n\tint dx;\n\tint dy;\n\tint dz;\n\tint x;\n\tint y;\n\tint abs_event;\n\tlong unsigned int buttons;\n};\n\nstruct mousedev {\n\tint open;\n\tstruct input_handle handle;\n\twait_queue_head_t wait;\n\tstruct list_head client_list;\n\tspinlock_t client_lock;\n\tstruct mutex mutex;\n\tstruct device dev;\n\tstruct cdev cdev;\n\tbool exist;\n\tstruct list_head mixdev_node;\n\tbool opened_by_mixdev;\n\tstruct mousedev_hw_data packet;\n\tunsigned int pkt_count;\n\tint old_x[4];\n\tint old_y[4];\n\tint frac_dx;\n\tint frac_dy;\n\tlong unsigned int touch;\n\tint (*open_device)(struct mousedev *);\n\tvoid (*close_device)(struct mousedev *);\n};\n\nstruct mousedev_motion {\n\tint dx;\n\tint dy;\n\tint dz;\n\tlong unsigned int buttons;\n};\n\nstruct mousedev_client {\n\tstruct fasync_struct *fasync;\n\tstruct mousedev *mousedev;\n\tstruct list_head node;\n\tstruct mousedev_motion packets[16];\n\tunsigned int head;\n\tunsigned int tail;\n\tspinlock_t packet_lock;\n\tint pos_x;\n\tint pos_y;\n\tu8 ps2[6];\n\tunsigned char ready;\n\tunsigned char buffer;\n\tunsigned char bufsiz;\n\tunsigned char imexseq;\n\tunsigned char impsseq;\n\tenum mousedev_emul mode;\n\tlong unsigned int last_buttons;\n};\n\nstruct movable_operations {\n\tbool (*isolate_page)(struct page *, isolate_mode_t);\n\tint (*migrate_page)(struct page *, struct page *, enum migrate_mode);\n\tvoid (*putback_page)(struct page *);\n};\n\nstruct move_extent {\n\t__u32 reserved;\n\t__u32 donor_fd;\n\t__u64 orig_start;\n\t__u64 donor_start;\n\t__u64 len;\n\t__u64 moved_len;\n};\n\nstruct mp_chip_data {\n\tstruct list_head irq_2_pin;\n\tstruct IO_APIC_route_entry entry;\n\tbool is_level;\n\tbool active_low;\n\tbool isa_irq;\n\tu32 count;\n};\n\nstruct mpage_da_data {\n\tstruct inode *inode;\n\tstruct writeback_control *wbc;\n\tunsigned int can_map: 1;\n\tlong unsigned int first_page;\n\tlong unsigned int next_page;\n\tlong unsigned int last_page;\n\tstruct ext4_map_blocks map;\n\tstruct ext4_io_submit io_submit;\n\tunsigned int do_map: 1;\n\tunsigned int scanned_until_end: 1;\n\tunsigned int journalled_more_data: 1;\n};\n\nstruct mpage_data {\n\tstruct bio *bio;\n\tsector_t last_block_in_bio;\n\tget_block_t *get_block;\n};\n\nstruct mpage_readpage_args {\n\tstruct bio *bio;\n\tstruct folio *folio;\n\tunsigned int nr_pages;\n\tbool is_readahead;\n\tsector_t last_block_in_bio;\n\tstruct buffer_head map_bh;\n\tlong unsigned int first_logical_block;\n\tget_block_t *get_block;\n};\n\nstruct mpc_bus {\n\tunsigned char type;\n\tunsigned char busid;\n\tunsigned char bustype[6];\n};\n\nstruct mpc_cpu {\n\tunsigned char type;\n\tunsigned char apicid;\n\tunsigned char apicver;\n\tunsigned char cpuflag;\n\tunsigned int cpufeature;\n\tunsigned int featureflag;\n\tunsigned int reserved[2];\n};\n\nstruct mpc_intsrc {\n\tunsigned char type;\n\tunsigned char irqtype;\n\tshort unsigned int irqflag;\n\tunsigned char srcbus;\n\tunsigned char srcbusirq;\n\tunsigned char dstapic;\n\tunsigned char dstirq;\n};\n\nstruct mpc_lintsrc {\n\tunsigned char type;\n\tunsigned char irqtype;\n\tshort unsigned int irqflag;\n\tunsigned char srcbusid;\n\tunsigned char srcbusirq;\n\tunsigned char destapic;\n\tunsigned char destapiclint;\n};\n\nstruct mpc_table {\n\tchar signature[4];\n\tshort unsigned int length;\n\tchar spec;\n\tchar checksum;\n\tchar oem[8];\n\tchar productid[12];\n\tunsigned int oemptr;\n\tshort unsigned int oemsize;\n\tshort unsigned int oemcount;\n\tunsigned int lapic;\n\tunsigned int reserved;\n};\n\nstruct mpf_intel {\n\tchar signature[4];\n\tunsigned int physptr;\n\tunsigned char length;\n\tunsigned char specification;\n\tunsigned char checksum;\n\tunsigned char feature1;\n\tunsigned char feature2;\n\tunsigned char feature3;\n\tunsigned char feature4;\n\tunsigned char feature5;\n};\n\nstruct mpi_ec_ctx {\n\tenum gcry_mpi_ec_models model;\n\tenum ecc_dialects dialect;\n\tint flags;\n\tunsigned int nbits;\n\tMPI p;\n\tMPI a;\n\tMPI b;\n\tMPI_POINT G;\n\tMPI n;\n\tunsigned int h;\n\tMPI_POINT Q;\n\tMPI d;\n\tconst char *name;\n\tstruct {\n\t\tstruct {\n\t\t\tunsigned int a_is_pminus3: 1;\n\t\t\tunsigned int two_inv_p: 1;\n\t\t} valid;\n\t\tint a_is_pminus3;\n\t\tMPI two_inv_p;\n\t\tmpi_barrett_t p_barrett;\n\t\tMPI scratch[11];\n\t} t;\n\tvoid (*addm)(MPI, MPI, MPI, struct mpi_ec_ctx *);\n\tvoid (*subm)(MPI, MPI, MPI, struct mpi_ec_ctx *);\n\tvoid (*mulm)(MPI, MPI, MPI, struct mpi_ec_ctx *);\n\tvoid (*pow2)(MPI, const MPI, struct mpi_ec_ctx *);\n\tvoid (*mul2)(MPI, MPI, struct mpi_ec_ctx *);\n};\n\nstruct mpls_label {\n\t__be32 entry;\n};\n\nstruct mpls_shim_hdr {\n\t__be32 label_stack_entry;\n};\n\nstruct mptcp_addr_info {\n\tu8 id;\n\tsa_family_t family;\n\t__be16 port;\n\tunion {\n\t\tstruct in_addr addr;\n\t\tstruct in6_addr addr6;\n\t};\n};\n\nstruct mptcp_data_frag {\n\tstruct list_head list;\n\tu64 data_seq;\n\tu16 data_len;\n\tu16 offset;\n\tu16 overhead;\n\tu16 already_sent;\n\tstruct page *page;\n};\n\nstruct mptcp_delegated_action {\n\tstruct napi_struct napi;\n\tstruct list_head head;\n};\n\nstruct mptcp_ext {\n\tunion {\n\t\tu64 data_ack;\n\t\tu32 data_ack32;\n\t};\n\tu64 data_seq;\n\tu32 subflow_seq;\n\tu16 data_len;\n\t__sum16 csum;\n\tu8 use_map: 1;\n\tu8 dsn64: 1;\n\tu8 data_fin: 1;\n\tu8 use_ack: 1;\n\tu8 ack64: 1;\n\tu8 mpc_map: 1;\n\tu8 frozen: 1;\n\tu8 reset_transient: 1;\n\tu8 reset_reason: 4;\n\tu8 csum_reqd: 1;\n\tu8 infinite_map: 1;\n};\n\nstruct mptcp_info {\n\t__u8 mptcpi_subflows;\n\t__u8 mptcpi_add_addr_signal;\n\t__u8 mptcpi_add_addr_accepted;\n\t__u8 mptcpi_subflows_max;\n\t__u8 mptcpi_add_addr_signal_max;\n\t__u8 mptcpi_add_addr_accepted_max;\n\t__u32 mptcpi_flags;\n\t__u32 mptcpi_token;\n\t__u64 mptcpi_write_seq;\n\t__u64 mptcpi_snd_una;\n\t__u64 mptcpi_rcv_nxt;\n\t__u8 mptcpi_local_addr_used;\n\t__u8 mptcpi_local_addr_max;\n\t__u8 mptcpi_csum_enabled;\n\t__u32 mptcpi_retransmits;\n\t__u64 mptcpi_bytes_retrans;\n\t__u64 mptcpi_bytes_sent;\n\t__u64 mptcpi_bytes_received;\n\t__u64 mptcpi_bytes_acked;\n\t__u8 mptcpi_subflows_total;\n\t__u8 reserved[3];\n\t__u32 mptcpi_last_data_sent;\n\t__u32 mptcpi_last_data_recv;\n\t__u32 mptcpi_last_ack_recv;\n};\n\nstruct mptcp_full_info {\n\t__u32 size_tcpinfo_kernel;\n\t__u32 size_tcpinfo_user;\n\t__u32 size_sfinfo_kernel;\n\t__u32 size_sfinfo_user;\n\t__u32 num_subflows;\n\t__u32 size_arrays_user;\n\t__u64 subflow_info;\n\t__u64 tcp_info;\n\tstruct mptcp_info mptcp_info;\n};\n\nstruct mptcp_mib {\n\tlong unsigned int mibs[64];\n};\n\nstruct mptcp_rm_list {\n\tu8 ids[8];\n\tu8 nr;\n};\n\nstruct mptcp_options_received {\n\tu64 sndr_key;\n\tu64 rcvr_key;\n\tu64 data_ack;\n\tu64 data_seq;\n\tu32 subflow_seq;\n\tu16 data_len;\n\t__sum16 csum;\n\tu16 suboptions;\n\tu32 token;\n\tu32 nonce;\n\tu16 use_map: 1;\n\tu16 dsn64: 1;\n\tu16 data_fin: 1;\n\tu16 use_ack: 1;\n\tu16 ack64: 1;\n\tu16 mpc_map: 1;\n\tu16 reset_reason: 4;\n\tu16 reset_transient: 1;\n\tu16 echo: 1;\n\tu16 backup: 1;\n\tu16 deny_join_id0: 1;\n\tu16 __unused: 2;\n\tu8 join_id;\n\tu64 thmac;\n\tu8 hmac[20];\n\tstruct mptcp_addr_info addr;\n\tstruct mptcp_rm_list rm_list;\n\tu64 ahmac;\n\tu64 fail_seq;\n};\n\nstruct mptcp_out_options {\n\tu16 suboptions;\n\tstruct mptcp_rm_list rm_list;\n\tu8 join_id;\n\tu8 backup;\n\tu8 reset_reason: 4;\n\tu8 reset_transient: 1;\n\tu8 csum_reqd: 1;\n\tu8 allow_join_id0: 1;\n\tunion {\n\t\tstruct {\n\t\t\tu64 sndr_key;\n\t\t\tu64 rcvr_key;\n\t\t\tu64 data_seq;\n\t\t\tu32 subflow_seq;\n\t\t\tu16 data_len;\n\t\t\t__sum16 csum;\n\t\t};\n\t\tstruct {\n\t\t\tstruct mptcp_addr_info addr;\n\t\t\tu64 ahmac;\n\t\t};\n\t\tstruct {\n\t\t\tstruct mptcp_ext ext_copy;\n\t\t\tu64 fail_seq;\n\t\t};\n\t\tstruct {\n\t\t\tu32 nonce;\n\t\t\tu32 token;\n\t\t\tu64 thmac;\n\t\t\tu8 hmac[20];\n\t\t};\n\t};\n};\n\nstruct mptcp_pernet {\n\tstruct ctl_table_header *ctl_table_hdr;\n\tunsigned int add_addr_timeout;\n\tunsigned int close_timeout;\n\tunsigned int stale_loss_cnt;\n\tu8 mptcp_enabled;\n\tu8 checksum_enabled;\n\tu8 allow_join_initial_addr_port;\n\tu8 pm_type;\n\tchar scheduler[16];\n};\n\nstruct mptcp_sock;\n\nstruct mptcp_pm_add_entry {\n\tstruct list_head list;\n\tstruct mptcp_addr_info addr;\n\tu8 retrans_times;\n\tstruct timer_list add_timer;\n\tstruct mptcp_sock *sock;\n};\n\nstruct mptcp_pm_addr_entry {\n\tstruct list_head list;\n\tstruct mptcp_addr_info addr;\n\tu8 flags;\n\tint ifindex;\n\tstruct socket *lsk;\n};\n\nstruct mptcp_pm_data {\n\tstruct mptcp_addr_info local;\n\tstruct mptcp_addr_info remote;\n\tstruct list_head anno_list;\n\tstruct list_head userspace_pm_local_addr_list;\n\tspinlock_t lock;\n\tu8 addr_signal;\n\tbool server_side;\n\tbool work_pending;\n\tbool accept_addr;\n\tbool accept_subflow;\n\tbool remote_deny_join_id0;\n\tu8 add_addr_signaled;\n\tu8 add_addr_accepted;\n\tu8 local_addr_used;\n\tu8 pm_type;\n\tu8 subflows;\n\tu8 status;\n\tlong unsigned int id_avail_bitmap[4];\n\tstruct mptcp_rm_list rm_list_tx;\n\tstruct mptcp_rm_list rm_list_rx;\n};\n\nstruct mptcp_subflow_context;\n\nstruct mptcp_sched_data {\n\tbool reinject;\n\tu8 subflows;\n\tstruct mptcp_subflow_context *contexts[8];\n};\n\nstruct mptcp_sched_ops {\n\tint (*get_subflow)(struct mptcp_sock *, struct mptcp_sched_data *);\n\tchar name[16];\n\tstruct module *owner;\n\tstruct list_head list;\n\tvoid (*init)(struct mptcp_sock *);\n\tvoid (*release)(struct mptcp_sock *);\n};\n\nstruct mptcp_sendmsg_info {\n\tint mss_now;\n\tint size_goal;\n\tu16 limit;\n\tu16 sent;\n\tunsigned int flags;\n\tbool data_lock_held;\n};\n\nstruct mptcp_skb_cb {\n\tu64 map_seq;\n\tu64 end_seq;\n\tu32 offset;\n\tu8 has_rxtstamp: 1;\n};\n\nstruct mptcp_sock {\n\tstruct inet_connection_sock sk;\n\tu64 local_key;\n\tu64 remote_key;\n\tu64 write_seq;\n\tu64 bytes_sent;\n\tu64 snd_nxt;\n\tu64 bytes_received;\n\tu64 ack_seq;\n\tatomic64_t rcv_wnd_sent;\n\tu64 rcv_data_fin_seq;\n\tu64 bytes_retrans;\n\tu64 bytes_consumed;\n\tint rmem_fwd_alloc;\n\tint snd_burst;\n\tint old_wspace;\n\tu64 recovery_snd_nxt;\n\tu64 bytes_acked;\n\tu64 snd_una;\n\tu64 wnd_end;\n\tu32 last_data_sent;\n\tu32 last_data_recv;\n\tu32 last_ack_recv;\n\tlong unsigned int timer_ival;\n\tu32 token;\n\tint rmem_released;\n\tlong unsigned int flags;\n\tlong unsigned int cb_flags;\n\tbool recovery;\n\tbool can_ack;\n\tbool fully_established;\n\tbool rcv_data_fin;\n\tbool snd_data_fin_enable;\n\tbool rcv_fastclose;\n\tbool use_64bit_ack;\n\tbool csum_enabled;\n\tbool allow_infinite_fallback;\n\tu8 pending_state;\n\tu8 mpc_endpoint_id;\n\tu8 recvmsg_inq: 1;\n\tu8 cork: 1;\n\tu8 nodelay: 1;\n\tu8 fastopening: 1;\n\tu8 in_accept_queue: 1;\n\tu8 free_first: 1;\n\tu8 rcvspace_init: 1;\n\tu32 notsent_lowat;\n\tint keepalive_cnt;\n\tint keepalive_idle;\n\tint keepalive_intvl;\n\tstruct work_struct work;\n\tstruct sk_buff *ooo_last_skb;\n\tstruct rb_root out_of_order_queue;\n\tstruct sk_buff_head receive_queue;\n\tstruct list_head conn_list;\n\tstruct list_head rtx_queue;\n\tstruct mptcp_data_frag *first_pending;\n\tstruct list_head join_list;\n\tstruct sock *first;\n\tstruct mptcp_pm_data pm;\n\tstruct mptcp_sched_ops *sched;\n\tstruct {\n\t\tu32 space;\n\t\tu32 copied;\n\t\tu64 time;\n\t\tu64 rtt_us;\n\t} rcvq_space;\n\tu8 scaling_ratio;\n\tu32 subflow_id;\n\tu32 setsockopt_seq;\n\tchar ca_name[16];\n};\n\nstruct sockaddr_in {\n\t__kernel_sa_family_t sin_family;\n\t__be16 sin_port;\n\tstruct in_addr sin_addr;\n\tunsigned char __pad[8];\n};\n\nstruct mptcp_subflow_addrs {\n\tunion {\n\t\t__kernel_sa_family_t sa_family;\n\t\tstruct sockaddr sa_local;\n\t\tstruct sockaddr_in sin_local;\n\t\tstruct sockaddr_in6 sin6_local;\n\t\tstruct __kernel_sockaddr_storage ss_local;\n\t};\n\tunion {\n\t\tstruct sockaddr sa_remote;\n\t\tstruct sockaddr_in sin_remote;\n\t\tstruct sockaddr_in6 sin6_remote;\n\t\tstruct __kernel_sockaddr_storage ss_remote;\n\t};\n};\n\nstruct mptcp_subflow_context {\n\tstruct list_head node;\n\tunion {\n\t\tstruct {\n\t\t\tlong unsigned int avg_pacing_rate;\n\t\t\tu64 local_key;\n\t\t\tu64 remote_key;\n\t\t\tu64 idsn;\n\t\t\tu64 map_seq;\n\t\t\tu32 snd_isn;\n\t\t\tu32 token;\n\t\t\tu32 rel_write_seq;\n\t\t\tu32 map_subflow_seq;\n\t\t\tu32 ssn_offset;\n\t\t\tu32 map_data_len;\n\t\t\t__wsum map_data_csum;\n\t\t\tu32 map_csum_len;\n\t\t\tu32 request_mptcp: 1;\n\t\t\tu32 request_join: 1;\n\t\t\tu32 request_bkup: 1;\n\t\t\tu32 mp_capable: 1;\n\t\t\tu32 mp_join: 1;\n\t\t\tu32 pm_notified: 1;\n\t\t\tu32 conn_finished: 1;\n\t\t\tu32 map_valid: 1;\n\t\t\tu32 map_csum_reqd: 1;\n\t\t\tu32 map_data_fin: 1;\n\t\t\tu32 mpc_map: 1;\n\t\t\tu32 backup: 1;\n\t\t\tu32 send_mp_prio: 1;\n\t\t\tu32 send_mp_fail: 1;\n\t\t\tu32 send_fastclose: 1;\n\t\t\tu32 send_infinite_map: 1;\n\t\t\tu32 remote_key_valid: 1;\n\t\t\tu32 disposable: 1;\n\t\t\tu32 stale: 1;\n\t\t\tu32 valid_csum_seen: 1;\n\t\t\tu32 is_mptfo: 1;\n\t\t\tu32 close_event_done: 1;\n\t\t\tu32 __unused: 10;\n\t\t\tbool data_avail;\n\t\t\tbool scheduled;\n\t\t\tbool pm_listener;\n\t\t\tbool fully_established;\n\t\t\tu32 remote_nonce;\n\t\t\tu64 thmac;\n\t\t\tu32 local_nonce;\n\t\t\tu32 remote_token;\n\t\t\tunion {\n\t\t\t\tu8 hmac[20];\n\t\t\t\tu64 iasn;\n\t\t\t};\n\t\t\ts16 local_id;\n\t\t\tu8 remote_id;\n\t\t\tu8 reset_seen: 1;\n\t\t\tu8 reset_transient: 1;\n\t\t\tu8 reset_reason: 4;\n\t\t\tu8 stale_count;\n\t\t\tu32 subflow_id;\n\t\t\tlong int delegated_status;\n\t\t\tlong unsigned int fail_tout;\n\t\t};\n\t\tstruct {\n\t\t\tlong unsigned int avg_pacing_rate;\n\t\t\tu64 local_key;\n\t\t\tu64 remote_key;\n\t\t\tu64 idsn;\n\t\t\tu64 map_seq;\n\t\t\tu32 snd_isn;\n\t\t\tu32 token;\n\t\t\tu32 rel_write_seq;\n\t\t\tu32 map_subflow_seq;\n\t\t\tu32 ssn_offset;\n\t\t\tu32 map_data_len;\n\t\t\t__wsum map_data_csum;\n\t\t\tu32 map_csum_len;\n\t\t\tu32 request_mptcp: 1;\n\t\t\tu32 request_join: 1;\n\t\t\tu32 request_bkup: 1;\n\t\t\tu32 mp_capable: 1;\n\t\t\tu32 mp_join: 1;\n\t\t\tu32 pm_notified: 1;\n\t\t\tu32 conn_finished: 1;\n\t\t\tu32 map_valid: 1;\n\t\t\tu32 map_csum_reqd: 1;\n\t\t\tu32 map_data_fin: 1;\n\t\t\tu32 mpc_map: 1;\n\t\t\tu32 backup: 1;\n\t\t\tu32 send_mp_prio: 1;\n\t\t\tu32 send_mp_fail: 1;\n\t\t\tu32 send_fastclose: 1;\n\t\t\tu32 send_infinite_map: 1;\n\t\t\tu32 remote_key_valid: 1;\n\t\t\tu32 disposable: 1;\n\t\t\tu32 stale: 1;\n\t\t\tu32 valid_csum_seen: 1;\n\t\t\tu32 is_mptfo: 1;\n\t\t\tu32 close_event_done: 1;\n\t\t\tu32 __unused: 10;\n\t\t\tbool data_avail;\n\t\t\tbool scheduled;\n\t\t\tbool pm_listener;\n\t\t\tbool fully_established;\n\t\t\tu32 remote_nonce;\n\t\t\tu64 thmac;\n\t\t\tu32 local_nonce;\n\t\t\tu32 remote_token;\n\t\t\tunion {\n\t\t\t\tu8 hmac[20];\n\t\t\t\tu64 iasn;\n\t\t\t};\n\t\t\ts16 local_id;\n\t\t\tu8 remote_id;\n\t\t\tu8 reset_seen: 1;\n\t\t\tu8 reset_transient: 1;\n\t\t\tu8 reset_reason: 4;\n\t\t\tu8 stale_count;\n\t\t\tu32 subflow_id;\n\t\t\tlong int delegated_status;\n\t\t\tlong unsigned int fail_tout;\n\t\t} reset;\n\t};\n\tstruct list_head delegated_node;\n\tu32 setsockopt_seq;\n\tu32 stale_rcv_tstamp;\n\tint cached_sndbuf;\n\tstruct sock *tcp_sock;\n\tstruct sock *conn;\n\tconst struct inet_connection_sock_af_ops *icsk_af_ops;\n\tvoid (*tcp_state_change)(struct sock *);\n\tvoid (*tcp_error_report)(struct sock *);\n\tstruct callback_head rcu;\n};\n\nstruct mptcp_subflow_data {\n\t__u32 size_subflow_data;\n\t__u32 num_subflows;\n\t__u32 size_kernel;\n\t__u32 size_user;\n};\n\nstruct mptcp_subflow_info {\n\t__u32 id;\n\tstruct mptcp_subflow_addrs addrs;\n};\n\nstruct tcp_request_sock_ops;\n\nstruct tcp_request_sock {\n\tstruct inet_request_sock req;\n\tconst struct tcp_request_sock_ops *af_specific;\n\tu64 snt_synack;\n\tbool tfo_listener;\n\tbool is_mptcp;\n\tbool req_usec_ts;\n\tbool drop_req;\n\tu32 txhash;\n\tu32 rcv_isn;\n\tu32 snt_isn;\n\tu32 ts_off;\n\tu32 last_oow_ack_time;\n\tu32 rcv_nxt;\n\tu8 syn_tos;\n\tu8 ao_keyid;\n\tu8 ao_rcv_next;\n\tbool used_tcp_ao;\n};\n\nstruct mptcp_subflow_request_sock {\n\tstruct tcp_request_sock sk;\n\tu16 mp_capable: 1;\n\tu16 mp_join: 1;\n\tu16 backup: 1;\n\tu16 request_bkup: 1;\n\tu16 csum_reqd: 1;\n\tu16 allow_join_id0: 1;\n\tu8 local_id;\n\tu8 remote_id;\n\tu64 local_key;\n\tu64 idsn;\n\tu32 token;\n\tu32 ssn_offset;\n\tu64 thmac;\n\tu32 local_nonce;\n\tu32 remote_nonce;\n\tstruct mptcp_sock *msk;\n\tstruct hlist_nulls_node token_node;\n};\n\nstruct mq_inflight {\n\tstruct block_device *part;\n\tunsigned int inflight[2];\n};\n\nstruct mq_sched {\n\tstruct Qdisc **qdiscs;\n};\n\nstruct mqueue_fs_context {\n\tstruct ipc_namespace *ipc_ns;\n\tbool newns;\n};\n\nstruct sigevent {\n\tsigval_t sigev_value;\n\tint sigev_signo;\n\tint sigev_notify;\n\tunion {\n\t\tint _pad[12];\n\t\tint _tid;\n\t\tstruct {\n\t\t\tvoid (*_function)(sigval_t);\n\t\t\tvoid *_attribute;\n\t\t} _sigev_thread;\n\t} _sigev_un;\n};\n\nstruct posix_msg_tree_node;\n\nstruct mqueue_inode_info {\n\tspinlock_t lock;\n\tstruct inode vfs_inode;\n\twait_queue_head_t wait_q;\n\tstruct rb_root msg_tree;\n\tstruct rb_node *msg_tree_rightmost;\n\tstruct posix_msg_tree_node *node_cache;\n\tstruct mq_attr attr;\n\tstruct sigevent notify;\n\tstruct pid *notify_owner;\n\tu32 notify_self_exec_id;\n\tstruct user_namespace *notify_user_ns;\n\tstruct ucounts *ucounts;\n\tstruct sock *notify_sock;\n\tstruct sk_buff *notify_cookie;\n\tstruct ext_wait_queue e_wait_q[2];\n\tlong unsigned int qsize;\n};\n\nstruct mr_mfc_iter {\n\tstruct seq_net_private p;\n\tstruct mr_table *mrt;\n\tstruct list_head *cache;\n\tspinlock_t *lock;\n};\n\nstruct mr_table_ops {\n\tconst struct rhashtable_params *rht_params;\n\tvoid *cmparg_any;\n};\n\nstruct vif_device {\n\tstruct net_device *dev;\n\tnetdevice_tracker dev_tracker;\n\tlong unsigned int bytes_in;\n\tlong unsigned int bytes_out;\n\tlong unsigned int pkt_in;\n\tlong unsigned int pkt_out;\n\tlong unsigned int rate_limit;\n\tunsigned char threshold;\n\tshort unsigned int flags;\n\tint link;\n\tstruct netdev_phys_item_id dev_parent_id;\n\t__be32 local;\n\t__be32 remote;\n};\n\nstruct rhltable {\n\tstruct rhashtable ht;\n};\n\nstruct mr_table {\n\tstruct list_head list;\n\tpossible_net_t net;\n\tstruct mr_table_ops ops;\n\tu32 id;\n\tstruct sock *mroute_sk;\n\tstruct timer_list ipmr_expire_timer;\n\tstruct list_head mfc_unres_queue;\n\tstruct vif_device vif_table[32];\n\tstruct rhltable mfc_hash;\n\tstruct list_head mfc_cache_list;\n\tint maxvif;\n\tatomic_t cache_resolve_queue_len;\n\tbool mroute_do_assert;\n\tbool mroute_do_pim;\n\tbool mroute_do_wrvifwhole;\n\tint mroute_reg_vif_num;\n};\n\nstruct mr_vif_iter {\n\tstruct seq_net_private p;\n\tstruct mr_table *mrt;\n\tint ct;\n};\n\nstruct mrt6msg {\n\t__u8 im6_mbz;\n\t__u8 im6_msgtype;\n\t__u16 im6_mif;\n\t__u32 im6_pad;\n\tstruct in6_addr im6_src;\n\tstruct in6_addr im6_dst;\n};\n\nstruct mrw_feature_desc {\n\t__be16 feature_code;\n\t__u8 curr: 1;\n\t__u8 persistent: 1;\n\t__u8 feature_version: 4;\n\t__u8 reserved1: 2;\n\t__u8 add_len;\n\t__u8 write: 1;\n\t__u8 reserved2: 7;\n\t__u8 reserved3;\n\t__u8 reserved4;\n\t__u8 reserved5;\n};\n\nstruct ms_hyperv_info {\n\tu32 features;\n\tu32 priv_high;\n\tu32 misc_features;\n\tu32 hints;\n\tu32 nested_features;\n\tu32 max_vp_index;\n\tu32 max_lp_index;\n\tu8 vtl;\n\tunion {\n\t\tu32 isolation_config_a;\n\t\tstruct {\n\t\t\tu32 paravisor_present: 1;\n\t\t\tu32 reserved_a1: 31;\n\t\t};\n\t};\n\tunion {\n\t\tu32 isolation_config_b;\n\t\tstruct {\n\t\t\tu32 cvm_type: 4;\n\t\t\tu32 reserved_b1: 1;\n\t\t\tu32 shared_gpa_boundary_active: 1;\n\t\t\tu32 shared_gpa_boundary_bits: 6;\n\t\t\tu32 reserved_b2: 20;\n\t\t};\n\t};\n\tu64 shared_gpa_boundary;\n};\n\nstruct msdos_dir_entry {\n\t__u8 name[11];\n\t__u8 attr;\n\t__u8 lcase;\n\t__u8 ctime_cs;\n\t__le16 ctime;\n\t__le16 cdate;\n\t__le16 adate;\n\t__le16 starthi;\n\t__le16 time;\n\t__le16 date;\n\t__le16 start;\n\t__le32 size;\n};\n\nstruct msdos_dir_slot {\n\t__u8 id;\n\t__u8 name0_4[10];\n\t__u8 attr;\n\t__u8 reserved;\n\t__u8 alias_checksum;\n\t__u8 name5_10[12];\n\t__le16 start;\n\t__u8 name11_12[4];\n};\n\nstruct msdos_inode_info {\n\tspinlock_t cache_lru_lock;\n\tstruct list_head cache_lru;\n\tint nr_caches;\n\tunsigned int cache_valid_id;\n\tloff_t mmu_private;\n\tint i_start;\n\tint i_logstart;\n\tint i_attrs;\n\tloff_t i_pos;\n\tstruct hlist_node i_fat_hash;\n\tstruct hlist_node i_dir_hash;\n\tstruct rw_semaphore truncate_lock;\n\tstruct timespec64 i_crtime;\n\tstruct inode vfs_inode;\n};\n\nstruct msdos_partition {\n\tu8 boot_ind;\n\tu8 head;\n\tu8 sector;\n\tu8 cyl;\n\tu8 sys_ind;\n\tu8 end_head;\n\tu8 end_sector;\n\tu8 end_cyl;\n\t__le32 start_sect;\n\t__le32 nr_sects;\n};\n\nstruct nls_table;\n\nstruct msdos_sb_info {\n\tshort unsigned int sec_per_clus;\n\tshort unsigned int cluster_bits;\n\tunsigned int cluster_size;\n\tunsigned char fats;\n\tunsigned char fat_bits;\n\tshort unsigned int fat_start;\n\tlong unsigned int fat_length;\n\tlong unsigned int dir_start;\n\tshort unsigned int dir_entries;\n\tlong unsigned int data_start;\n\tlong unsigned int max_cluster;\n\tlong unsigned int root_cluster;\n\tlong unsigned int fsinfo_sector;\n\tstruct mutex fat_lock;\n\tstruct mutex nfs_build_inode_lock;\n\tstruct mutex s_lock;\n\tunsigned int prev_free;\n\tunsigned int free_clusters;\n\tunsigned int free_clus_valid;\n\tstruct fat_mount_options options;\n\tstruct nls_table *nls_disk;\n\tstruct nls_table *nls_io;\n\tconst void *dir_ops;\n\tint dir_per_block;\n\tint dir_per_block_bits;\n\tunsigned int vol_id;\n\tint fatent_shift;\n\tconst struct fatent_operations *fatent_ops;\n\tstruct inode *fat_inode;\n\tstruct inode *fsinfo_inode;\n\tstruct ratelimit_state ratelimit;\n\tspinlock_t inode_hash_lock;\n\tstruct hlist_head inode_hashtable[256];\n\tspinlock_t dir_hash_lock;\n\tstruct hlist_head dir_hashtable[256];\n\tunsigned int dirty;\n\tstruct callback_head rcu;\n};\n\nstruct msg_msgseg;\n\nstruct msg_msg {\n\tstruct list_head m_list;\n\tlong int m_type;\n\tsize_t m_ts;\n\tstruct msg_msgseg *next;\n\tvoid *security;\n};\n\nstruct msg_msgseg {\n\tstruct msg_msgseg *next;\n};\n\nstruct msg_queue {\n\tstruct kern_ipc_perm q_perm;\n\ttime64_t q_stime;\n\ttime64_t q_rtime;\n\ttime64_t q_ctime;\n\tlong unsigned int q_cbytes;\n\tlong unsigned int q_qnum;\n\tlong unsigned int q_qbytes;\n\tstruct pid *q_lspid;\n\tstruct pid *q_lrpid;\n\tstruct list_head q_messages;\n\tstruct list_head q_receivers;\n\tstruct list_head q_senders;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct msg_receiver {\n\tstruct list_head r_list;\n\tstruct task_struct *r_tsk;\n\tint r_mode;\n\tlong int r_msgtype;\n\tlong int r_maxsize;\n\tstruct msg_msg *r_msg;\n};\n\nstruct msg_security_struct {\n\tu32 sid;\n};\n\nstruct msg_sender {\n\tstruct list_head list;\n\tstruct task_struct *tsk;\n\tsize_t msgsz;\n};\n\nstruct msgbuf {\n\t__kernel_long_t mtype;\n\tchar mtext[1];\n};\n\nstruct msginfo {\n\tint msgpool;\n\tint msgmap;\n\tint msgmax;\n\tint msgmnb;\n\tint msgmni;\n\tint msgssz;\n\tint msgtql;\n\tshort unsigned int msgseg;\n};\n\nstruct msi_ctrl {\n\tunsigned int domid;\n\tunsigned int first;\n\tunsigned int last;\n\tunsigned int nirqs;\n};\n\nstruct pci_msi_desc {\n\tunion {\n\t\tu32 msi_mask;\n\t\tu32 msix_ctrl;\n\t};\n\tstruct {\n\t\tu8 is_msix: 1;\n\t\tu8 multiple: 3;\n\t\tu8 multi_cap: 3;\n\t\tu8 can_mask: 1;\n\t\tu8 is_64: 1;\n\t\tu8 is_virtual: 1;\n\t\tunsigned int default_irq;\n\t} msi_attrib;\n\tunion {\n\t\tu8 mask_pos;\n\t\tvoid *mask_base;\n\t};\n};\n\nunion msi_domain_cookie {\n\tu64 value;\n\tvoid *ptr;\n\tvoid *iobase;\n};\n\nunion msi_instance_cookie {\n\tu64 value;\n\tvoid *ptr;\n};\n\nstruct msi_desc_data {\n\tunion msi_domain_cookie dcookie;\n\tunion msi_instance_cookie icookie;\n};\n\nstruct msi_desc {\n\tunsigned int irq;\n\tunsigned int nvec_used;\n\tstruct device *dev;\n\tstruct msi_msg msg;\n\tstruct irq_affinity_desc *affinity;\n\tconst void *iommu_cookie;\n\tstruct device_attribute *sysfs_attrs;\n\tvoid (*write_msi_msg)(struct msi_desc *, void *);\n\tvoid *write_msi_msg_data;\n\tu16 msi_index;\n\tunion {\n\t\tstruct pci_msi_desc pci;\n\t\tstruct msi_desc_data data;\n\t};\n};\n\nstruct msi_dev_domain {\n\tstruct xarray store;\n\tstruct irq_domain *domain;\n};\n\nstruct msi_device_data {\n\tlong unsigned int properties;\n\tstruct mutex mutex;\n\tstruct msi_dev_domain __domains[1];\n\tlong unsigned int __iter_idx;\n};\n\nstruct msi_domain_ops;\n\nstruct msi_domain_info {\n\tu32 flags;\n\tenum irq_domain_bus_token bus_token;\n\tunsigned int hwsize;\n\tstruct msi_domain_ops *ops;\n\tstruct irq_chip *chip;\n\tvoid *chip_data;\n\tirq_flow_handler_t handler;\n\tvoid *handler_data;\n\tconst char *handler_name;\n\tvoid *data;\n};\n\nstruct msi_domain_ops {\n\tirq_hw_number_t (*get_hwirq)(struct msi_domain_info *, msi_alloc_info_t *);\n\tint (*msi_init)(struct irq_domain *, struct msi_domain_info *, unsigned int, irq_hw_number_t, msi_alloc_info_t *);\n\tvoid (*msi_free)(struct irq_domain *, struct msi_domain_info *, unsigned int);\n\tint (*msi_prepare)(struct irq_domain *, struct device *, int, msi_alloc_info_t *);\n\tvoid (*prepare_desc)(struct irq_domain *, msi_alloc_info_t *, struct msi_desc *);\n\tvoid (*set_desc)(msi_alloc_info_t *, struct msi_desc *);\n\tint (*domain_alloc_irqs)(struct irq_domain *, struct device *, int);\n\tvoid (*domain_free_irqs)(struct irq_domain *, struct device *);\n\tvoid (*msi_post_free)(struct irq_domain *, struct device *);\n\tint (*msi_translate)(struct irq_domain *, struct irq_fwspec *, irq_hw_number_t *, unsigned int *);\n};\n\nstruct msi_domain_template {\n\tchar name[48];\n\tstruct irq_chip chip;\n\tstruct msi_domain_ops ops;\n\tstruct msi_domain_info info;\n};\n\nstruct msi_map {\n\tint index;\n\tint virq;\n};\n\nstruct msi_parent_ops {\n\tu32 supported_flags;\n\tu32 required_flags;\n\tu32 bus_select_token;\n\tu32 bus_select_mask;\n\tconst char *prefix;\n\tbool (*init_dev_msi_info)(struct device *, struct irq_domain *, struct irq_domain *, struct msi_domain_info *);\n};\n\nstruct msix_entry {\n\tu32 vector;\n\tu16 entry;\n};\n\nstruct msqid64_ds {\n\tstruct ipc64_perm msg_perm;\n\tlong int msg_stime;\n\tlong int msg_rtime;\n\tlong int msg_ctime;\n\tlong unsigned int msg_cbytes;\n\tlong unsigned int msg_qnum;\n\tlong unsigned int msg_qbytes;\n\t__kernel_pid_t msg_lspid;\n\t__kernel_pid_t msg_lrpid;\n\tlong unsigned int __unused4;\n\tlong unsigned int __unused5;\n};\n\nstruct msg;\n\nstruct msqid_ds {\n\tstruct ipc_perm msg_perm;\n\tstruct msg *msg_first;\n\tstruct msg *msg_last;\n\t__kernel_old_time_t msg_stime;\n\t__kernel_old_time_t msg_rtime;\n\t__kernel_old_time_t msg_ctime;\n\tlong unsigned int msg_lcbytes;\n\tlong unsigned int msg_lqbytes;\n\tshort unsigned int msg_cbytes;\n\tshort unsigned int msg_qnum;\n\tshort unsigned int msg_qbytes;\n\t__kernel_ipc_pid_t msg_lspid;\n\t__kernel_ipc_pid_t msg_lrpid;\n};\n\nstruct msr {\n\tunion {\n\t\tstruct {\n\t\t\tu32 l;\n\t\t\tu32 h;\n\t\t};\n\t\tu64 q;\n\t};\n};\n\nstruct msr_data {\n\tbool host_initiated;\n\tu32 index;\n\tu64 data;\n};\n\nstruct msr_enumeration {\n\tu32 msr_no;\n\tu32 feature;\n};\n\nstruct msr_info {\n\tu32 msr_no;\n\tstruct msr reg;\n\tstruct msr *msrs;\n\tint err;\n};\n\nstruct msr_info_completion {\n\tstruct msr_info msr;\n\tstruct completion done;\n};\n\nstruct rdt_resource;\n\nstruct rdt_ctrl_domain;\n\nstruct msr_param {\n\tstruct rdt_resource *res;\n\tstruct rdt_ctrl_domain *dom;\n\tu32 low;\n\tu32 high;\n};\n\nstruct msr_regs_info {\n\tu32 *regs;\n\tint err;\n};\n\nstruct mt6323_pwrc {\n\tstruct device *dev;\n\tstruct regmap *regmap;\n\tu32 base;\n};\n\nstruct mt6397_chip {\n\tstruct device *dev;\n\tstruct regmap *regmap;\n\tstruct notifier_block pm_nb;\n\tint irq;\n\tstruct irq_domain *irq_domain;\n\tstruct mutex irqlock;\n\tu16 wake_mask[2];\n\tu16 irq_masks_cur[2];\n\tu16 irq_masks_cache[2];\n\tu16 int_con[2];\n\tu16 int_status[2];\n\tu16 chip_id;\n\tvoid *irq_data;\n};\n\nstruct mthp_stat {\n\tlong unsigned int stats[110];\n};\n\nstruct mtrr_cleanup_result {\n\tlong unsigned int gran_sizek;\n\tlong unsigned int chunk_sizek;\n\tlong unsigned int lose_cover_sizek;\n\tunsigned int num_reg;\n\tint bad;\n};\n\nstruct mtrr_gentry {\n\t__u64 base;\n\t__u32 size;\n\t__u32 regnum;\n\t__u32 type;\n\t__u32 _pad;\n};\n\nstruct mtrr_gentry32 {\n\tcompat_ulong_t regnum;\n\tcompat_uint_t base;\n\tcompat_uint_t size;\n\tcompat_uint_t type;\n};\n\nstruct mtrr_ops {\n\tu32 var_regs;\n\tvoid (*set)(unsigned int, long unsigned int, long unsigned int, mtrr_type);\n\tvoid (*get)(unsigned int, long unsigned int *, long unsigned int *, mtrr_type *);\n\tint (*get_free_region)(long unsigned int, long unsigned int, int);\n\tint (*validate_add_page)(long unsigned int, long unsigned int, unsigned int);\n\tint (*have_wrcomb)(void);\n};\n\nstruct mtrr_sentry {\n\t__u64 base;\n\t__u32 size;\n\t__u32 type;\n};\n\nstruct mtrr_sentry32 {\n\tcompat_ulong_t base;\n\tcompat_uint_t size;\n\tcompat_uint_t type;\n};\n\nstruct mtrr_var_range {\n\t__u32 base_lo;\n\t__u32 base_hi;\n\t__u32 mask_lo;\n\t__u32 mask_hi;\n};\n\nstruct mtrr_state_type {\n\tstruct mtrr_var_range var_ranges[256];\n\tmtrr_type fixed_ranges[88];\n\tunsigned char enabled;\n\tbool have_fixed;\n\tmtrr_type def_type;\n};\n\nstruct multi_stop_data {\n\tcpu_stop_fn_t fn;\n\tvoid *data;\n\tunsigned int num_threads;\n\tconst struct cpumask *active_cpus;\n\tenum multi_stop_state state;\n\tatomic_t thread_ack;\n};\n\nstruct multi_symbols_sort {\n\tconst char **funcs;\n\tu64 *cookies;\n};\n\nstruct multi_transaction {\n\tstruct kref count;\n\tssize_t size;\n\tchar data[0];\n};\n\nstruct multicall_space {\n\tstruct multicall_entry *mc;\n\tvoid *args;\n};\n\nstruct multiprocess_signals {\n\tsigset_t signal;\n\tstruct hlist_node node;\n};\n\ntypedef struct mutex *class_mutex_t;\n\ntypedef class_mutex_t class_mutex_intr_t;\n\nstruct mutex_waiter {\n\tstruct list_head list;\n\tstruct task_struct *task;\n\tstruct ww_acquire_ctx *ww_ctx;\n};\n\nstruct mwait_cpu_dead {\n\tunsigned int control;\n\tunsigned int status;\n};\n\nstruct mz_hdr {\n\tuint16_t magic;\n\tuint16_t lbsize;\n\tuint16_t blocks;\n\tuint16_t relocs;\n\tuint16_t hdrsize;\n\tuint16_t min_extra_pps;\n\tuint16_t max_extra_pps;\n\tuint16_t ss;\n\tuint16_t sp;\n\tuint16_t checksum;\n\tuint16_t ip;\n\tuint16_t cs;\n\tuint16_t reloc_table_offset;\n\tuint16_t overlay_num;\n\tuint16_t reserved0[4];\n\tuint16_t oem_id;\n\tuint16_t oem_info;\n\tuint16_t reserved1[10];\n\tuint32_t peaddr;\n\tchar message[0];\n};\n\nstruct n_tty_data {\n\tsize_t read_head;\n\tsize_t commit_head;\n\tsize_t canon_head;\n\tsize_t echo_head;\n\tsize_t echo_commit;\n\tsize_t echo_mark;\n\tlong unsigned int char_map[4];\n\tlong unsigned int overrun_time;\n\tunsigned int num_overrun;\n\tbool no_room;\n\tunsigned char lnext: 1;\n\tunsigned char erasing: 1;\n\tunsigned char raw: 1;\n\tunsigned char real_raw: 1;\n\tunsigned char icanon: 1;\n\tunsigned char push: 1;\n\tu8 read_buf[4096];\n\tlong unsigned int read_flags[64];\n\tu8 echo_buf[4096];\n\tsize_t read_tail;\n\tsize_t line_start;\n\tsize_t lookahead_count;\n\tunsigned int column;\n\tunsigned int canon_column;\n\tsize_t echo_tail;\n\tstruct mutex atomic_read_lock;\n\tstruct mutex output_lock;\n};\n\nstruct name_snapshot {\n\tstruct qstr name;\n\tunsigned char inline_name[40];\n};\n\nstruct saved {\n\tstruct path link;\n\tstruct delayed_call done;\n\tconst char *name;\n\tunsigned int seq;\n};\n\nstruct nameidata {\n\tstruct path path;\n\tstruct qstr last;\n\tstruct path root;\n\tstruct inode *inode;\n\tunsigned int flags;\n\tunsigned int state;\n\tunsigned int seq;\n\tunsigned int next_seq;\n\tunsigned int m_seq;\n\tunsigned int r_seq;\n\tint last_type;\n\tunsigned int depth;\n\tint total_link_count;\n\tstruct saved *stack;\n\tstruct saved internal[2];\n\tstruct filename *name;\n\tstruct nameidata *saved;\n\tunsigned int root_seq;\n\tint dfd;\n\tvfsuid_t dir_vfsuid;\n\tumode_t dir_mode;\n};\n\nstruct page_frag_cache {\n\tvoid *va;\n\t__u16 offset;\n\t__u16 size;\n\tunsigned int pagecnt_bias;\n\tbool pfmemalloc;\n};\n\nstruct page_frag_1k {\n\tvoid *va;\n\tu16 offset;\n\tbool pfmemalloc;\n};\n\nstruct napi_alloc_cache {\n\tlocal_lock_t bh_lock;\n\tstruct page_frag_cache page;\n\tstruct page_frag_1k page_small;\n\tunsigned int skb_count;\n\tvoid *skb_cache[64];\n};\n\nstruct napi_gro_cb {\n\tunion {\n\t\tstruct {\n\t\t\tvoid *frag0;\n\t\t\tunsigned int frag0_len;\n\t\t};\n\t\tstruct {\n\t\t\tstruct sk_buff *last;\n\t\t\tlong unsigned int age;\n\t\t};\n\t};\n\tint data_offset;\n\tu16 flush;\n\tu16 count;\n\tu16 proto;\n\tu16 pad;\n\tunion {\n\t\tstruct {\n\t\t\tu16 gro_remcsum_start;\n\t\t\tu8 same_flow: 1;\n\t\t\tu8 encap_mark: 1;\n\t\t\tu8 csum_valid: 1;\n\t\t\tu8 csum_cnt: 3;\n\t\t\tu8 free: 2;\n\t\t\tu8 is_ipv6: 1;\n\t\t\tu8 is_fou: 1;\n\t\t\tu8 ip_fixedid: 1;\n\t\t\tu8 recursion_counter: 4;\n\t\t\tu8 is_flist: 1;\n\t\t};\n\t\tstruct {\n\t\t\tu16 gro_remcsum_start;\n\t\t\tu8 same_flow: 1;\n\t\t\tu8 encap_mark: 1;\n\t\t\tu8 csum_valid: 1;\n\t\t\tu8 csum_cnt: 3;\n\t\t\tu8 free: 2;\n\t\t\tu8 is_ipv6: 1;\n\t\t\tu8 is_fou: 1;\n\t\t\tu8 ip_fixedid: 1;\n\t\t\tu8 recursion_counter: 4;\n\t\t\tu8 is_flist: 1;\n\t\t} zeroed;\n\t};\n\t__wsum csum;\n\tunion {\n\t\tstruct {\n\t\t\tu16 network_offset;\n\t\t\tu16 inner_network_offset;\n\t\t};\n\t\tu16 network_offsets[2];\n\t};\n};\n\nstruct nat_keepalive {\n\tstruct net *net;\n\tu16 family;\n\txfrm_address_t saddr;\n\txfrm_address_t daddr;\n\t__be16 encap_sport;\n\t__be16 encap_dport;\n\t__u32 smark;\n};\n\nstruct nat_keepalive_work_ctx {\n\ttime64_t next_run;\n\ttime64_t now;\n};\n\nstruct nbcon_context {\n\tstruct console *console;\n\tunsigned int spinwait_max_us;\n\tenum nbcon_prio prio;\n\tunsigned int allow_unsafe_takeover: 1;\n\tunsigned int backlog: 1;\n\tstruct printk_buffers *pbufs;\n\tu64 seq;\n};\n\nstruct nbcon_state {\n\tunion {\n\t\tunsigned int atom;\n\t\tstruct {\n\t\t\tunsigned int prio: 2;\n\t\t\tunsigned int req_prio: 2;\n\t\t\tunsigned int unsafe: 1;\n\t\t\tunsigned int unsafe_takeover: 1;\n\t\t\tunsigned int cpu: 24;\n\t\t};\n\t};\n};\n\nstruct nbcon_write_context {\n\tstruct nbcon_context ctxt;\n\tchar *outbuf;\n\tunsigned int len;\n\tbool unsafe_takeover;\n};\n\nstruct ncsi_dev_priv;\n\nstruct ncsi_aen_pkt_hdr;\n\nstruct ncsi_aen_handler {\n\tunsigned char type;\n\tint payload;\n\tint (*handler)(struct ncsi_dev_priv *, struct ncsi_aen_pkt_hdr *);\n};\n\nstruct ncsi_pkt_hdr {\n\tunsigned char mc_id;\n\tunsigned char revision;\n\tunsigned char reserved;\n\tunsigned char id;\n\tunsigned char type;\n\tunsigned char channel;\n\t__be16 length;\n\t__be32 reserved1[2];\n};\n\nstruct ncsi_aen_pkt_hdr {\n\tstruct ncsi_pkt_hdr common;\n\tunsigned char reserved2[3];\n\tunsigned char type;\n};\n\nstruct ncsi_aen_hncdsc_pkt {\n\tstruct ncsi_aen_pkt_hdr aen;\n\t__be32 status;\n\t__be32 checksum;\n\tunsigned char pad[18];\n};\n\nstruct ncsi_aen_lsc_pkt {\n\tstruct ncsi_aen_pkt_hdr aen;\n\t__be32 status;\n\t__be32 oem_status;\n\t__be32 checksum;\n\tunsigned char pad[14];\n};\n\nstruct ncsi_channel_version {\n\tu8 major;\n\tu8 minor;\n\tu8 update;\n\tchar alpha1;\n\tchar alpha2;\n\tu8 fw_name[12];\n\tu32 fw_version;\n\tu16 pci_ids[4];\n\tu32 mf_id;\n};\n\nstruct ncsi_channel_cap {\n\tu32 index;\n\tu32 cap;\n};\n\nstruct ncsi_channel_mode {\n\tu32 index;\n\tu32 enable;\n\tu32 size;\n\tu32 data[8];\n};\n\nstruct ncsi_channel_mac_filter {\n\tu8 n_uc;\n\tu8 n_mc;\n\tu8 n_mixed;\n\tu64 bitmap;\n\tunsigned char *addrs;\n};\n\nstruct ncsi_channel_vlan_filter {\n\tu8 n_vids;\n\tu64 bitmap;\n\tu16 *vids;\n};\n\nstruct ncsi_channel_stats {\n\tu32 hnc_cnt_hi;\n\tu32 hnc_cnt_lo;\n\tu32 hnc_rx_bytes;\n\tu32 hnc_tx_bytes;\n\tu32 hnc_rx_uc_pkts;\n\tu32 hnc_rx_mc_pkts;\n\tu32 hnc_rx_bc_pkts;\n\tu32 hnc_tx_uc_pkts;\n\tu32 hnc_tx_mc_pkts;\n\tu32 hnc_tx_bc_pkts;\n\tu32 hnc_fcs_err;\n\tu32 hnc_align_err;\n\tu32 hnc_false_carrier;\n\tu32 hnc_runt_pkts;\n\tu32 hnc_jabber_pkts;\n\tu32 hnc_rx_pause_xon;\n\tu32 hnc_rx_pause_xoff;\n\tu32 hnc_tx_pause_xon;\n\tu32 hnc_tx_pause_xoff;\n\tu32 hnc_tx_s_collision;\n\tu32 hnc_tx_m_collision;\n\tu32 hnc_l_collision;\n\tu32 hnc_e_collision;\n\tu32 hnc_rx_ctl_frames;\n\tu32 hnc_rx_64_frames;\n\tu32 hnc_rx_127_frames;\n\tu32 hnc_rx_255_frames;\n\tu32 hnc_rx_511_frames;\n\tu32 hnc_rx_1023_frames;\n\tu32 hnc_rx_1522_frames;\n\tu32 hnc_rx_9022_frames;\n\tu32 hnc_tx_64_frames;\n\tu32 hnc_tx_127_frames;\n\tu32 hnc_tx_255_frames;\n\tu32 hnc_tx_511_frames;\n\tu32 hnc_tx_1023_frames;\n\tu32 hnc_tx_1522_frames;\n\tu32 hnc_tx_9022_frames;\n\tu32 hnc_rx_valid_bytes;\n\tu32 hnc_rx_runt_pkts;\n\tu32 hnc_rx_jabber_pkts;\n\tu32 ncsi_rx_cmds;\n\tu32 ncsi_dropped_cmds;\n\tu32 ncsi_cmd_type_errs;\n\tu32 ncsi_cmd_csum_errs;\n\tu32 ncsi_rx_pkts;\n\tu32 ncsi_tx_pkts;\n\tu32 ncsi_tx_aen_pkts;\n\tu32 pt_tx_pkts;\n\tu32 pt_tx_dropped;\n\tu32 pt_tx_channel_err;\n\tu32 pt_tx_us_err;\n\tu32 pt_rx_pkts;\n\tu32 pt_rx_dropped;\n\tu32 pt_rx_channel_err;\n\tu32 pt_rx_us_err;\n\tu32 pt_rx_os_err;\n};\n\nstruct ncsi_package;\n\nstruct ncsi_channel {\n\tunsigned char id;\n\tint state;\n\tbool reconfigure_needed;\n\tspinlock_t lock;\n\tstruct ncsi_package *package;\n\tstruct ncsi_channel_version version;\n\tstruct ncsi_channel_cap caps[6];\n\tstruct ncsi_channel_mode modes[8];\n\tstruct ncsi_channel_mac_filter mac_filter;\n\tstruct ncsi_channel_vlan_filter vlan_filter;\n\tstruct ncsi_channel_stats stats;\n\tstruct {\n\t\tstruct timer_list timer;\n\t\tbool enabled;\n\t\tunsigned int state;\n\t} monitor;\n\tstruct list_head node;\n\tstruct list_head link;\n};\n\nstruct ncsi_cmd_pkt_hdr {\n\tstruct ncsi_pkt_hdr common;\n};\n\nstruct ncsi_cmd_ae_pkt {\n\tstruct ncsi_cmd_pkt_hdr cmd;\n\tunsigned char reserved[3];\n\tunsigned char mc_id;\n\t__be32 mode;\n\t__be32 checksum;\n\tunsigned char pad[18];\n};\n\nstruct ncsi_cmd_arg {\n\tstruct ncsi_dev_priv *ndp;\n\tunsigned char type;\n\tunsigned char id;\n\tunsigned char package;\n\tunsigned char channel;\n\tshort unsigned int payload;\n\tunsigned int req_flags;\n\tunion {\n\t\tunsigned char bytes[16];\n\t\tshort unsigned int words[8];\n\t\tunsigned int dwords[4];\n\t};\n\tunsigned char *data;\n\tstruct genl_info *info;\n};\n\nstruct ncsi_cmd_dc_pkt {\n\tstruct ncsi_cmd_pkt_hdr cmd;\n\tunsigned char reserved[3];\n\tunsigned char ald;\n\t__be32 checksum;\n\tunsigned char pad[22];\n};\n\nstruct ncsi_cmd_ebf_pkt {\n\tstruct ncsi_cmd_pkt_hdr cmd;\n\t__be32 mode;\n\t__be32 checksum;\n\tunsigned char pad[22];\n};\n\nstruct ncsi_cmd_egmf_pkt {\n\tstruct ncsi_cmd_pkt_hdr cmd;\n\t__be32 mode;\n\t__be32 checksum;\n\tunsigned char pad[22];\n};\n\nstruct ncsi_cmd_ev_pkt {\n\tstruct ncsi_cmd_pkt_hdr cmd;\n\tunsigned char reserved[3];\n\tunsigned char mode;\n\t__be32 checksum;\n\tunsigned char pad[22];\n};\n\nstruct ncsi_cmd_handler {\n\tunsigned char type;\n\tint payload;\n\tint (*handler)(struct sk_buff *, struct ncsi_cmd_arg *);\n};\n\nstruct ncsi_cmd_oem_pkt {\n\tstruct ncsi_cmd_pkt_hdr cmd;\n\t__be32 mfr_id;\n\tunsigned char data[0];\n};\n\nstruct ncsi_cmd_pkt {\n\tstruct ncsi_cmd_pkt_hdr cmd;\n\t__be32 checksum;\n\tunsigned char pad[26];\n};\n\nstruct ncsi_cmd_rc_pkt {\n\tstruct ncsi_cmd_pkt_hdr cmd;\n\t__be32 reserved;\n\t__be32 checksum;\n\tunsigned char pad[22];\n};\n\nstruct ncsi_cmd_sl_pkt {\n\tstruct ncsi_cmd_pkt_hdr cmd;\n\t__be32 mode;\n\t__be32 oem_mode;\n\t__be32 checksum;\n\tunsigned char pad[18];\n};\n\nstruct ncsi_cmd_sma_pkt {\n\tstruct ncsi_cmd_pkt_hdr cmd;\n\tunsigned char mac[6];\n\tunsigned char index;\n\tunsigned char at_e;\n\t__be32 checksum;\n\tunsigned char pad[18];\n};\n\nstruct ncsi_cmd_snfc_pkt {\n\tstruct ncsi_cmd_pkt_hdr cmd;\n\tunsigned char reserved[3];\n\tunsigned char mode;\n\t__be32 checksum;\n\tunsigned char pad[22];\n};\n\nstruct ncsi_cmd_sp_pkt {\n\tstruct ncsi_cmd_pkt_hdr cmd;\n\tunsigned char reserved[3];\n\tunsigned char hw_arbitration;\n\t__be32 checksum;\n\tunsigned char pad[22];\n};\n\nstruct ncsi_cmd_svf_pkt {\n\tstruct ncsi_cmd_pkt_hdr cmd;\n\t__be16 reserved;\n\t__be16 vlan;\n\t__be16 reserved1;\n\tunsigned char index;\n\tunsigned char enable;\n\t__be32 checksum;\n\tunsigned char pad[18];\n};\n\nstruct ncsi_dev {\n\tint state;\n\tint link_up;\n\tstruct net_device *dev;\n\tvoid (*handler)(struct ncsi_dev *);\n};\n\nstruct nlmsghdr {\n\t__u32 nlmsg_len;\n\t__u16 nlmsg_type;\n\t__u16 nlmsg_flags;\n\t__u32 nlmsg_seq;\n\t__u32 nlmsg_pid;\n};\n\nstruct ncsi_request {\n\tunsigned char id;\n\tbool used;\n\tunsigned int flags;\n\tstruct ncsi_dev_priv *ndp;\n\tstruct sk_buff *cmd;\n\tstruct sk_buff *rsp;\n\tstruct timer_list timer;\n\tbool enabled;\n\tu32 snd_seq;\n\tu32 snd_portid;\n\tstruct nlmsghdr nlhdr;\n};\n\nstruct packet_type {\n\t__be16 type;\n\tbool ignore_outgoing;\n\tstruct net_device *dev;\n\tnetdevice_tracker dev_tracker;\n\tint (*func)(struct sk_buff *, struct net_device *, struct packet_type *, struct net_device *);\n\tvoid (*list_func)(struct list_head *, struct packet_type *, struct net_device *);\n\tbool (*id_match)(struct packet_type *, struct sock *);\n\tstruct net *af_packet_net;\n\tvoid *af_packet_priv;\n\tstruct list_head list;\n};\n\nstruct ncsi_dev_priv {\n\tstruct ncsi_dev ndev;\n\tunsigned int flags;\n\tunsigned int gma_flag;\n\tstruct sockaddr pending_mac;\n\tspinlock_t lock;\n\tunsigned int package_probe_id;\n\tunsigned int package_num;\n\tunsigned int channel_probe_id;\n\tstruct list_head packages;\n\tstruct ncsi_channel *hot_channel;\n\tstruct ncsi_request requests[256];\n\tunsigned int request_id;\n\tunsigned int pending_req_num;\n\tstruct ncsi_package *active_package;\n\tstruct ncsi_channel *active_channel;\n\tstruct list_head channel_queue;\n\tstruct work_struct work;\n\tstruct packet_type ptype;\n\tstruct list_head node;\n\tstruct list_head vlan_vids;\n\tbool multi_package;\n\tbool mlx_multi_host;\n\tu32 package_whitelist;\n\tunsigned char channel_count;\n};\n\nstruct ncsi_oem_gma_handler {\n\tunsigned int mfr_id;\n\tint (*handler)(struct ncsi_cmd_arg *);\n};\n\nstruct ncsi_package {\n\tunsigned char id;\n\tunsigned char uuid[16];\n\tstruct ncsi_dev_priv *ndp;\n\tspinlock_t lock;\n\tunsigned int channel_num;\n\tstruct list_head channels;\n\tstruct list_head node;\n\tbool multi_channel;\n\tu32 channel_whitelist;\n\tstruct ncsi_channel *preferred_channel;\n};\n\nstruct ncsi_rsp_pkt_hdr {\n\tstruct ncsi_pkt_hdr common;\n\t__be16 code;\n\t__be16 reason;\n};\n\nstruct ncsi_rsp_gc_pkt {\n\tstruct ncsi_rsp_pkt_hdr rsp;\n\t__be32 cap;\n\t__be32 bc_cap;\n\t__be32 mc_cap;\n\t__be32 buf_cap;\n\t__be32 aen_cap;\n\tunsigned char vlan_cnt;\n\tunsigned char mixed_cnt;\n\tunsigned char mc_cnt;\n\tunsigned char uc_cnt;\n\tunsigned char reserved[2];\n\tunsigned char vlan_mode;\n\tunsigned char channel_cnt;\n\t__be32 checksum;\n};\n\nstruct ncsi_rsp_gcps_pkt {\n\tstruct ncsi_rsp_pkt_hdr rsp;\n\t__be32 cnt_hi;\n\t__be32 cnt_lo;\n\t__be32 rx_bytes;\n\t__be32 tx_bytes;\n\t__be32 rx_uc_pkts;\n\t__be32 rx_mc_pkts;\n\t__be32 rx_bc_pkts;\n\t__be32 tx_uc_pkts;\n\t__be32 tx_mc_pkts;\n\t__be32 tx_bc_pkts;\n\t__be32 fcs_err;\n\t__be32 align_err;\n\t__be32 false_carrier;\n\t__be32 runt_pkts;\n\t__be32 jabber_pkts;\n\t__be32 rx_pause_xon;\n\t__be32 rx_pause_xoff;\n\t__be32 tx_pause_xon;\n\t__be32 tx_pause_xoff;\n\t__be32 tx_s_collision;\n\t__be32 tx_m_collision;\n\t__be32 l_collision;\n\t__be32 e_collision;\n\t__be32 rx_ctl_frames;\n\t__be32 rx_64_frames;\n\t__be32 rx_127_frames;\n\t__be32 rx_255_frames;\n\t__be32 rx_511_frames;\n\t__be32 rx_1023_frames;\n\t__be32 rx_1522_frames;\n\t__be32 rx_9022_frames;\n\t__be32 tx_64_frames;\n\t__be32 tx_127_frames;\n\t__be32 tx_255_frames;\n\t__be32 tx_511_frames;\n\t__be32 tx_1023_frames;\n\t__be32 tx_1522_frames;\n\t__be32 tx_9022_frames;\n\t__be32 rx_valid_bytes;\n\t__be32 rx_runt_pkts;\n\t__be32 rx_jabber_pkts;\n\t__be32 checksum;\n};\n\nstruct ncsi_rsp_gls_pkt {\n\tstruct ncsi_rsp_pkt_hdr rsp;\n\t__be32 status;\n\t__be32 other;\n\t__be32 oem_status;\n\t__be32 checksum;\n\tunsigned char pad[10];\n};\n\nstruct ncsi_rsp_gmcma_pkt {\n\tstruct ncsi_rsp_pkt_hdr rsp;\n\tunsigned char address_count;\n\tunsigned char reserved[3];\n\tunsigned char addresses[0];\n};\n\nstruct ncsi_rsp_gnpts_pkt {\n\tstruct ncsi_rsp_pkt_hdr rsp;\n\t__be32 tx_pkts;\n\t__be32 tx_dropped;\n\t__be32 tx_channel_err;\n\t__be32 tx_us_err;\n\t__be32 rx_pkts;\n\t__be32 rx_dropped;\n\t__be32 rx_channel_err;\n\t__be32 rx_us_err;\n\t__be32 rx_os_err;\n\t__be32 checksum;\n};\n\nstruct ncsi_rsp_gns_pkt {\n\tstruct ncsi_rsp_pkt_hdr rsp;\n\t__be32 rx_cmds;\n\t__be32 dropped_cmds;\n\t__be32 cmd_type_errs;\n\t__be32 cmd_csum_errs;\n\t__be32 rx_pkts;\n\t__be32 tx_pkts;\n\t__be32 tx_aen_pkts;\n\t__be32 checksum;\n};\n\nstruct ncsi_rsp_gp_pkt {\n\tstruct ncsi_rsp_pkt_hdr rsp;\n\tunsigned char mac_cnt;\n\tunsigned char reserved[2];\n\tunsigned char mac_enable;\n\tunsigned char vlan_cnt;\n\tunsigned char reserved1;\n\t__be16 vlan_enable;\n\t__be32 link_mode;\n\t__be32 bc_mode;\n\t__be32 valid_modes;\n\tunsigned char vlan_mode;\n\tunsigned char fc_mode;\n\tunsigned char reserved2[2];\n\t__be32 aen_mode;\n\tunsigned char mac[6];\n\t__be16 vlan;\n\t__be32 checksum;\n};\n\nstruct ncsi_rsp_gps_pkt {\n\tstruct ncsi_rsp_pkt_hdr rsp;\n\t__be32 status;\n\t__be32 checksum;\n};\n\nstruct ncsi_rsp_gpuuid_pkt {\n\tstruct ncsi_rsp_pkt_hdr rsp;\n\tunsigned char uuid[16];\n\t__be32 checksum;\n};\n\nstruct ncsi_rsp_gvi_pkt {\n\tstruct ncsi_rsp_pkt_hdr rsp;\n\tunsigned char major;\n\tunsigned char minor;\n\tunsigned char update;\n\tunsigned char alpha1;\n\tunsigned char reserved[3];\n\tunsigned char alpha2;\n\tunsigned char fw_name[12];\n\t__be32 fw_version;\n\t__be16 pci_ids[4];\n\t__be32 mf_id;\n\t__be32 checksum;\n};\n\nstruct ncsi_rsp_handler {\n\tunsigned char type;\n\tint payload;\n\tint (*handler)(struct ncsi_request *);\n};\n\nstruct ncsi_rsp_oem_bcm_pkt {\n\tunsigned char ver;\n\tunsigned char type;\n\t__be16 len;\n\tunsigned char data[0];\n};\n\nstruct ncsi_rsp_oem_handler {\n\tunsigned int mfr_id;\n\tint (*handler)(struct ncsi_request *);\n};\n\nstruct ncsi_rsp_oem_intel_pkt {\n\tunsigned char cmd;\n\tunsigned char data[0];\n};\n\nstruct ncsi_rsp_oem_mlx_pkt {\n\tunsigned char cmd_rev;\n\tunsigned char cmd;\n\tunsigned char param;\n\tunsigned char optional;\n\tunsigned char data[0];\n};\n\nstruct ncsi_rsp_oem_pkt {\n\tstruct ncsi_rsp_pkt_hdr rsp;\n\t__be32 mfr_id;\n\tunsigned char data[0];\n};\n\nstruct ncsi_rsp_pkt {\n\tstruct ncsi_rsp_pkt_hdr rsp;\n\t__be32 checksum;\n\tunsigned char pad[22];\n};\n\nstruct nd_namespace_common;\n\nstruct nd_btt {\n\tstruct device dev;\n\tstruct nd_namespace_common *ndns;\n\tstruct btt *btt;\n\tlong unsigned int lbasize;\n\tu64 size;\n\tuuid_t *uuid;\n\tint id;\n\tint initial_offset;\n\tu16 version_major;\n\tu16 version_minor;\n};\n\nstruct nd_cmd_ars_cap {\n\t__u64 address;\n\t__u64 length;\n\t__u32 status;\n\t__u32 max_ars_out;\n\t__u32 clear_err_unit;\n\t__u16 flags;\n\t__u16 reserved;\n};\n\nstruct nd_cmd_clear_error {\n\t__u64 address;\n\t__u64 length;\n\t__u32 status;\n\t__u8 reserved[4];\n\t__u64 cleared;\n};\n\nstruct nd_cmd_desc {\n\tint in_num;\n\tint out_num;\n\tu32 in_sizes[5];\n\tint out_sizes[5];\n};\n\nstruct nd_cmd_get_config_data_hdr {\n\t__u32 in_offset;\n\t__u32 in_length;\n\t__u32 status;\n\t__u8 out_buf[0];\n};\n\nstruct nd_cmd_get_config_size {\n\t__u32 status;\n\t__u32 config_size;\n\t__u32 max_xfer;\n};\n\nstruct nd_cmd_pkg {\n\t__u64 nd_family;\n\t__u64 nd_command;\n\t__u32 nd_size_in;\n\t__u32 nd_size_out;\n\t__u32 nd_reserved2[9];\n\t__u32 nd_fw_size;\n\tunsigned char nd_payload[0];\n};\n\nstruct nd_cmd_set_config_hdr {\n\t__u32 in_offset;\n\t__u32 in_length;\n\t__u8 in_buf[0];\n};\n\nstruct nd_cmd_vendor_hdr {\n\t__u32 opcode;\n\t__u32 in_length;\n\t__u8 in_buf[0];\n};\n\nstruct nd_pfn_sb;\n\nstruct nd_pfn {\n\tint id;\n\tuuid_t *uuid;\n\tstruct device dev;\n\tlong unsigned int align;\n\tlong unsigned int npfns;\n\tenum nd_pfn_mode mode;\n\tstruct nd_pfn_sb *pfn_sb;\n\tstruct nd_namespace_common *ndns;\n};\n\nstruct nd_dax {\n\tstruct nd_pfn nd_pfn;\n};\n\nstruct nd_device_driver {\n\tstruct device_driver drv;\n\tlong unsigned int type;\n\tint (*probe)(struct device *);\n\tvoid (*remove)(struct device *);\n\tvoid (*shutdown)(struct device *);\n\tvoid (*notify)(struct device *, enum nvdimm_event);\n};\n\nstruct nd_gen_sb {\n\tchar reserved[4088];\n\t__le64 checksum;\n};\n\nstruct nd_interleave_set {\n\tu64 cookie1;\n\tu64 cookie2;\n\tu64 altcookie;\n\tguid_t type_guid;\n};\n\nstruct nd_namespace_label;\n\nstruct nd_label_ent {\n\tstruct list_head list;\n\tlong unsigned int flags;\n\tstruct nd_namespace_label *label;\n};\n\nstruct nd_label_id {\n\tchar id[50];\n};\n\nstruct nvdimm;\n\nstruct nvdimm_drvdata;\n\nstruct nd_mapping {\n\tstruct nvdimm *nvdimm;\n\tu64 start;\n\tu64 size;\n\tint position;\n\tstruct list_head labels;\n\tstruct mutex lock;\n\tstruct nvdimm_drvdata *ndd;\n};\n\nstruct nd_mapping_desc {\n\tstruct nvdimm *nvdimm;\n\tu64 start;\n\tu64 size;\n\tint position;\n};\n\nstruct nd_msg {\n\tstruct icmp6hdr icmph;\n\tstruct in6_addr target;\n\t__u8 opt[0];\n};\n\nstruct nd_namespace_common {\n\tint force_raw;\n\tstruct device dev;\n\tstruct device *claim;\n\tenum nvdimm_claim_class claim_class;\n\tint (*rw_bytes)(struct nd_namespace_common *, resource_size_t, void *, size_t, int, long unsigned int);\n};\n\nstruct nd_namespace_index {\n\tu8 sig[16];\n\tu8 flags[3];\n\tu8 labelsize;\n\t__le32 seq;\n\t__le64 myoff;\n\t__le64 mysize;\n\t__le64 otheroff;\n\t__le64 labeloff;\n\t__le32 nslot;\n\t__le16 major;\n\t__le16 minor;\n\t__le64 checksum;\n\tu8 free[0];\n};\n\nstruct nd_namespace_io {\n\tstruct nd_namespace_common common;\n\tstruct resource res;\n\tresource_size_t size;\n\tvoid *addr;\n\tstruct badblocks bb;\n};\n\nstruct nvdimm_cxl_label {\n\tu8 type[16];\n\tu8 uuid[16];\n\tu8 name[64];\n\t__le32 flags;\n\t__le16 nrange;\n\t__le16 position;\n\t__le64 dpa;\n\t__le64 rawsize;\n\t__le32 slot;\n\t__le32 align;\n\tu8 region_uuid[16];\n\tu8 abstraction_uuid[16];\n\t__le16 lbasize;\n\tu8 reserved[86];\n\t__le64 checksum;\n};\n\nstruct nvdimm_efi_label {\n\tu8 uuid[16];\n\tu8 name[64];\n\t__le32 flags;\n\t__le16 nlabel;\n\t__le16 position;\n\t__le64 isetcookie;\n\t__le64 lbasize;\n\t__le64 dpa;\n\t__le64 rawsize;\n\t__le32 slot;\n\tu8 align;\n\tu8 reserved[3];\n\tguid_t type_guid;\n\tguid_t abstraction_guid;\n\tu8 reserved2[88];\n\t__le64 checksum;\n};\n\nstruct nd_namespace_label {\n\tunion {\n\t\tstruct nvdimm_cxl_label cxl;\n\t\tstruct nvdimm_efi_label efi;\n\t};\n};\n\nstruct nd_namespace_pmem {\n\tstruct nd_namespace_io nsio;\n\tlong unsigned int lbasize;\n\tchar *alt_name;\n\tuuid_t *uuid;\n\tint id;\n};\n\nstruct nd_opt_hdr {\n\t__u8 nd_opt_type;\n\t__u8 nd_opt_len;\n};\n\nstruct nd_percpu_lane {\n\tint count;\n\tspinlock_t lock;\n};\n\nstruct nd_pfn_sb {\n\tu8 signature[16];\n\tu8 uuid[16];\n\tu8 parent_uuid[16];\n\t__le32 flags;\n\t__le16 version_major;\n\t__le16 version_minor;\n\t__le64 dataoff;\n\t__le64 npfns;\n\t__le32 mode;\n\t__le32 start_pad;\n\t__le32 end_trunc;\n\t__le32 align;\n\t__le32 page_size;\n\t__le16 page_struct_size;\n\tu8 padding[3994];\n\t__le64 checksum;\n};\n\nstruct nd_region {\n\tstruct device dev;\n\tstruct ida ns_ida;\n\tstruct ida btt_ida;\n\tstruct ida pfn_ida;\n\tstruct ida dax_ida;\n\tlong unsigned int flags;\n\tstruct device *ns_seed;\n\tstruct device *btt_seed;\n\tstruct device *pfn_seed;\n\tstruct device *dax_seed;\n\tlong unsigned int align;\n\tu16 ndr_mappings;\n\tu64 ndr_size;\n\tu64 ndr_start;\n\tint id;\n\tint num_lanes;\n\tint ro;\n\tint numa_node;\n\tint target_node;\n\tvoid *provider_data;\n\tstruct kernfs_node *bb_state;\n\tstruct badblocks bb;\n\tstruct nd_interleave_set *nd_set;\n\tstruct nd_percpu_lane *lane;\n\tint (*flush)(struct nd_region *, struct bio *);\n\tstruct nd_mapping mapping[0];\n};\n\nstruct nd_region_data {\n\tint ns_count;\n\tint ns_active;\n\tunsigned int hints_shift;\n\tvoid *flush_wpq[0];\n};\n\nstruct nd_region_desc {\n\tstruct resource *res;\n\tstruct nd_mapping_desc *mapping;\n\tu16 num_mappings;\n\tconst struct attribute_group **attr_groups;\n\tstruct nd_interleave_set *nd_set;\n\tvoid *provider_data;\n\tint num_lanes;\n\tint numa_node;\n\tint target_node;\n\tlong unsigned int flags;\n\tint memregion;\n\tstruct device_node *of_node;\n\tint (*flush)(struct nd_region *, struct bio *);\n};\n\nstruct nda_cacheinfo {\n\t__u32 ndm_confirmed;\n\t__u32 ndm_used;\n\t__u32 ndm_updated;\n\t__u32 ndm_refcnt;\n};\n\nstruct ndisc_options;\n\nstruct prefix_info;\n\nstruct ndisc_ops {\n\tint (*is_useropt)(u8);\n\tint (*parse_options)(const struct net_device *, struct nd_opt_hdr *, struct ndisc_options *);\n\tvoid (*update)(const struct net_device *, struct neighbour *, u32, u8, const struct ndisc_options *);\n\tint (*opt_addr_space)(const struct net_device *, u8, struct neighbour *, u8 *, u8 **);\n\tvoid (*fill_addr_option)(const struct net_device *, struct sk_buff *, u8, const u8 *);\n\tvoid (*prefix_rcv_add_addr)(struct net *, struct net_device *, const struct prefix_info *, struct inet6_dev *, struct in6_addr *, int, u32, bool, bool, __u32, u32, bool);\n};\n\nstruct ndisc_options {\n\tstruct nd_opt_hdr *nd_opt_array[15];\n\tstruct nd_opt_hdr *nd_opts_ri;\n\tstruct nd_opt_hdr *nd_opts_ri_end;\n\tstruct nd_opt_hdr *nd_useropts;\n\tstruct nd_opt_hdr *nd_useropts_end;\n\tstruct nd_opt_hdr *nd_802154_opt_array[3];\n};\n\nstruct ndmsg {\n\t__u8 ndm_family;\n\t__u8 ndm_pad1;\n\t__u16 ndm_pad2;\n\t__s32 ndm_ifindex;\n\t__u16 ndm_state;\n\t__u8 ndm_flags;\n\t__u8 ndm_type;\n};\n\nstruct ndt_config {\n\t__u16 ndtc_key_len;\n\t__u16 ndtc_entry_size;\n\t__u32 ndtc_entries;\n\t__u32 ndtc_last_flush;\n\t__u32 ndtc_last_rand;\n\t__u32 ndtc_hash_rnd;\n\t__u32 ndtc_hash_mask;\n\t__u32 ndtc_hash_chain_gc;\n\t__u32 ndtc_proxy_qlen;\n};\n\nstruct ndt_stats {\n\t__u64 ndts_allocs;\n\t__u64 ndts_destroys;\n\t__u64 ndts_hash_grows;\n\t__u64 ndts_res_failed;\n\t__u64 ndts_lookups;\n\t__u64 ndts_hits;\n\t__u64 ndts_rcv_probes_mcast;\n\t__u64 ndts_rcv_probes_ucast;\n\t__u64 ndts_periodic_gc_runs;\n\t__u64 ndts_forced_gc_runs;\n\t__u64 ndts_table_fulls;\n};\n\nstruct ndtmsg {\n\t__u8 ndtm_family;\n\t__u8 ndtm_pad1;\n\t__u16 ndtm_pad2;\n};\n\nstruct nduseroptmsg {\n\tunsigned char nduseropt_family;\n\tunsigned char nduseropt_pad1;\n\tshort unsigned int nduseropt_opts_len;\n\tint nduseropt_ifindex;\n\t__u8 nduseropt_icmp_type;\n\t__u8 nduseropt_icmp_code;\n\tshort unsigned int nduseropt_pad2;\n\tunsigned int nduseropt_pad3;\n};\n\nstruct neigh_dump_filter {\n\tint master_idx;\n\tint dev_idx;\n};\n\nstruct neigh_hash_table {\n\tstruct neighbour **hash_buckets;\n\tunsigned int hash_shift;\n\t__u32 hash_rnd[4];\n\tstruct callback_head rcu;\n};\n\nstruct neigh_ops {\n\tint family;\n\tvoid (*solicit)(struct neighbour *, struct sk_buff *);\n\tvoid (*error_report)(struct neighbour *, struct sk_buff *);\n\tint (*output)(struct neighbour *, struct sk_buff *);\n\tint (*connected_output)(struct neighbour *, struct sk_buff *);\n};\n\nstruct neigh_parms {\n\tpossible_net_t net;\n\tstruct net_device *dev;\n\tnetdevice_tracker dev_tracker;\n\tstruct list_head list;\n\tint (*neigh_setup)(struct neighbour *);\n\tstruct neigh_table *tbl;\n\tvoid *sysctl_table;\n\tint dead;\n\trefcount_t refcnt;\n\tstruct callback_head callback_head;\n\tint reachable_time;\n\tu32 qlen;\n\tint data[14];\n\tlong unsigned int data_state[1];\n};\n\nstruct neigh_seq_state {\n\tstruct seq_net_private p;\n\tstruct neigh_table *tbl;\n\tstruct neigh_hash_table *nht;\n\tvoid * (*neigh_sub_iter)(struct neigh_seq_state *, struct neighbour *, loff_t *);\n\tunsigned int bucket;\n\tunsigned int flags;\n};\n\nstruct neigh_statistics {\n\tlong unsigned int allocs;\n\tlong unsigned int destroys;\n\tlong unsigned int hash_grows;\n\tlong unsigned int res_failed;\n\tlong unsigned int lookups;\n\tlong unsigned int hits;\n\tlong unsigned int rcv_probes_mcast;\n\tlong unsigned int rcv_probes_ucast;\n\tlong unsigned int periodic_gc_runs;\n\tlong unsigned int forced_gc_runs;\n\tlong unsigned int unres_discards;\n\tlong unsigned int table_fulls;\n};\n\nstruct neigh_sysctl_table {\n\tstruct ctl_table_header *sysctl_header;\n\tstruct ctl_table neigh_vars[21];\n};\n\nstruct pneigh_entry;\n\nstruct neigh_table {\n\tint family;\n\tunsigned int entry_size;\n\tunsigned int key_len;\n\t__be16 protocol;\n\t__u32 (*hash)(const void *, const struct net_device *, __u32 *);\n\tbool (*key_eq)(const struct neighbour *, const void *);\n\tint (*constructor)(struct neighbour *);\n\tint (*pconstructor)(struct pneigh_entry *);\n\tvoid (*pdestructor)(struct pneigh_entry *);\n\tvoid (*proxy_redo)(struct sk_buff *);\n\tint (*is_multicast)(const void *);\n\tbool (*allow_add)(const struct net_device *, struct netlink_ext_ack *);\n\tchar *id;\n\tstruct neigh_parms parms;\n\tstruct list_head parms_list;\n\tint gc_interval;\n\tint gc_thresh1;\n\tint gc_thresh2;\n\tint gc_thresh3;\n\tlong unsigned int last_flush;\n\tstruct delayed_work gc_work;\n\tstruct delayed_work managed_work;\n\tstruct timer_list proxy_timer;\n\tstruct sk_buff_head proxy_queue;\n\tatomic_t entries;\n\tatomic_t gc_entries;\n\tstruct list_head gc_list;\n\tstruct list_head managed_list;\n\trwlock_t lock;\n\tlong unsigned int last_rand;\n\tstruct neigh_statistics *stats;\n\tstruct neigh_hash_table *nht;\n\tstruct pneigh_entry **phash_buckets;\n};\n\nstruct neighbour {\n\tstruct neighbour *next;\n\tstruct neigh_table *tbl;\n\tstruct neigh_parms *parms;\n\tlong unsigned int confirmed;\n\tlong unsigned int updated;\n\trwlock_t lock;\n\trefcount_t refcnt;\n\tunsigned int arp_queue_len_bytes;\n\tstruct sk_buff_head arp_queue;\n\tstruct timer_list timer;\n\tlong unsigned int used;\n\tatomic_t probes;\n\tu8 nud_state;\n\tu8 type;\n\tu8 dead;\n\tu8 protocol;\n\tu32 flags;\n\tseqlock_t ha_lock;\n\tlong: 0;\n\tunsigned char ha[32];\n\tstruct hh_cache hh;\n\tint (*output)(struct neighbour *, struct sk_buff *);\n\tconst struct neigh_ops *ops;\n\tstruct list_head gc_list;\n\tstruct list_head managed_list;\n\tstruct callback_head rcu;\n\tstruct net_device *dev;\n\tnetdevice_tracker dev_tracker;\n\tu8 primary_key[0];\n};\n\nstruct neighbour_cb {\n\tlong unsigned int sched_next;\n\tunsigned int flags;\n};\n\nunion nested_table {\n\tunion nested_table *table;\n\tstruct rhash_lock_head *bucket;\n};\n\nstruct ref_tracker_dir {};\n\nstruct prot_inuse;\n\nstruct netns_core {\n\tstruct ctl_table_header *sysctl_hdr;\n\tint sysctl_somaxconn;\n\tint sysctl_optmem_max;\n\tu8 sysctl_txrehash;\n\tstruct prot_inuse *prot_inuse;\n\tstruct cpumask *rps_default_mask;\n};\n\nstruct tcp_mib;\n\nstruct udp_mib;\n\nstruct netns_mib {\n\tstruct ipstats_mib *ip_statistics;\n\tstruct ipstats_mib *ipv6_statistics;\n\tstruct tcp_mib *tcp_statistics;\n\tstruct linux_mib *net_statistics;\n\tstruct udp_mib *udp_statistics;\n\tstruct udp_mib *udp_stats_in6;\n\tstruct linux_xfrm_mib *xfrm_statistics;\n\tstruct linux_tls_mib *tls_statistics;\n\tstruct mptcp_mib *mptcp_statistics;\n\tstruct udp_mib *udplite_statistics;\n\tstruct udp_mib *udplite_stats_in6;\n\tstruct icmp_mib *icmp_statistics;\n\tstruct icmpmsg_mib *icmpmsg_statistics;\n\tstruct icmpv6_mib *icmpv6_statistics;\n\tstruct icmpv6msg_mib *icmpv6msg_statistics;\n\tstruct proc_dir_entry *proc_net_devsnmp6;\n};\n\nstruct netns_packet {\n\tstruct mutex sklist_lock;\n\tstruct hlist_head sklist;\n};\n\nstruct unix_table {\n\tspinlock_t *locks;\n\tstruct hlist_head *buckets;\n};\n\nstruct netns_unix {\n\tstruct unix_table table;\n\tint sysctl_max_dgram_qlen;\n\tstruct ctl_table_header *ctl;\n};\n\nstruct netns_nexthop {\n\tstruct rb_root rb_root;\n\tstruct hlist_head *devhash;\n\tunsigned int seq;\n\tu32 last_id_allocated;\n\tstruct blocking_notifier_head notifier_chain;\n};\n\nstruct ping_group_range {\n\tseqlock_t lock;\n\tkgid_t range[2];\n};\n\nstruct sysctl_fib_multipath_hash_seed {\n\tu32 user_seed;\n\tu32 mp_seed;\n};\n\nstruct netns_ipv4 {\n\t__u8 __cacheline_group_begin__netns_ipv4_read_tx[0];\n\tu8 sysctl_tcp_early_retrans;\n\tu8 sysctl_tcp_tso_win_divisor;\n\tu8 sysctl_tcp_tso_rtt_log;\n\tu8 sysctl_tcp_autocorking;\n\tint sysctl_tcp_min_snd_mss;\n\tunsigned int sysctl_tcp_notsent_lowat;\n\tint sysctl_tcp_limit_output_bytes;\n\tint sysctl_tcp_min_rtt_wlen;\n\tint sysctl_tcp_wmem[3];\n\tu8 sysctl_ip_fwd_use_pmtu;\n\t__u8 __cacheline_group_end__netns_ipv4_read_tx[0];\n\t__u8 __cacheline_group_begin__netns_ipv4_read_txrx[0];\n\tu8 sysctl_tcp_moderate_rcvbuf;\n\t__u8 __cacheline_group_end__netns_ipv4_read_txrx[0];\n\t__u8 __cacheline_group_begin__netns_ipv4_read_rx[0];\n\tu8 sysctl_ip_early_demux;\n\tu8 sysctl_tcp_early_demux;\n\tint sysctl_tcp_reordering;\n\tint sysctl_tcp_rmem[3];\n\t__u8 __cacheline_group_end__netns_ipv4_read_rx[0];\n\tlong: 64;\n\tstruct inet_timewait_death_row tcp_death_row;\n\tstruct udp_table *udp_table;\n\tstruct ctl_table_header *forw_hdr;\n\tstruct ctl_table_header *frags_hdr;\n\tstruct ctl_table_header *ipv4_hdr;\n\tstruct ctl_table_header *route_hdr;\n\tstruct ctl_table_header *xfrm4_hdr;\n\tstruct ipv4_devconf *devconf_all;\n\tstruct ipv4_devconf *devconf_dflt;\n\tstruct ip_ra_chain *ra_chain;\n\tstruct mutex ra_mutex;\n\tstruct fib_rules_ops *rules_ops;\n\tstruct fib_table *fib_main;\n\tstruct fib_table *fib_default;\n\tunsigned int fib_rules_require_fldissect;\n\tbool fib_has_custom_rules;\n\tbool fib_has_custom_local_routes;\n\tbool fib_offload_disabled;\n\tu8 sysctl_tcp_shrink_window;\n\tatomic_t fib_num_tclassid_users;\n\tstruct hlist_head *fib_table_hash;\n\tstruct sock *fibnl;\n\tstruct sock *mc_autojoin_sk;\n\tstruct inet_peer_base *peers;\n\tstruct fqdir *fqdir;\n\tu8 sysctl_icmp_echo_ignore_all;\n\tu8 sysctl_icmp_echo_enable_probe;\n\tu8 sysctl_icmp_echo_ignore_broadcasts;\n\tu8 sysctl_icmp_ignore_bogus_error_responses;\n\tu8 sysctl_icmp_errors_use_inbound_ifaddr;\n\tint sysctl_icmp_ratelimit;\n\tint sysctl_icmp_ratemask;\n\tu32 ip_rt_min_pmtu;\n\tint ip_rt_mtu_expires;\n\tint ip_rt_min_advmss;\n\tstruct local_ports ip_local_ports;\n\tu8 sysctl_tcp_ecn;\n\tu8 sysctl_tcp_ecn_fallback;\n\tu8 sysctl_ip_default_ttl;\n\tu8 sysctl_ip_no_pmtu_disc;\n\tu8 sysctl_ip_fwd_update_priority;\n\tu8 sysctl_ip_nonlocal_bind;\n\tu8 sysctl_ip_autobind_reuse;\n\tu8 sysctl_ip_dynaddr;\n\tu8 sysctl_raw_l3mdev_accept;\n\tu8 sysctl_udp_early_demux;\n\tu8 sysctl_nexthop_compat_mode;\n\tu8 sysctl_fwmark_reflect;\n\tu8 sysctl_tcp_fwmark_accept;\n\tu8 sysctl_tcp_l3mdev_accept;\n\tu8 sysctl_tcp_mtu_probing;\n\tint sysctl_tcp_mtu_probe_floor;\n\tint sysctl_tcp_base_mss;\n\tint sysctl_tcp_probe_threshold;\n\tu32 sysctl_tcp_probe_interval;\n\tint sysctl_tcp_keepalive_time;\n\tint sysctl_tcp_keepalive_intvl;\n\tu8 sysctl_tcp_keepalive_probes;\n\tu8 sysctl_tcp_syn_retries;\n\tu8 sysctl_tcp_synack_retries;\n\tu8 sysctl_tcp_syncookies;\n\tu8 sysctl_tcp_migrate_req;\n\tu8 sysctl_tcp_comp_sack_nr;\n\tu8 sysctl_tcp_backlog_ack_defer;\n\tu8 sysctl_tcp_pingpong_thresh;\n\tu8 sysctl_tcp_retries1;\n\tu8 sysctl_tcp_retries2;\n\tu8 sysctl_tcp_orphan_retries;\n\tu8 sysctl_tcp_tw_reuse;\n\tint sysctl_tcp_fin_timeout;\n\tu8 sysctl_tcp_sack;\n\tu8 sysctl_tcp_window_scaling;\n\tu8 sysctl_tcp_timestamps;\n\tint sysctl_tcp_rto_min_us;\n\tu8 sysctl_tcp_recovery;\n\tu8 sysctl_tcp_thin_linear_timeouts;\n\tu8 sysctl_tcp_slow_start_after_idle;\n\tu8 sysctl_tcp_retrans_collapse;\n\tu8 sysctl_tcp_stdurg;\n\tu8 sysctl_tcp_rfc1337;\n\tu8 sysctl_tcp_abort_on_overflow;\n\tu8 sysctl_tcp_fack;\n\tint sysctl_tcp_max_reordering;\n\tint sysctl_tcp_adv_win_scale;\n\tu8 sysctl_tcp_dsack;\n\tu8 sysctl_tcp_app_win;\n\tu8 sysctl_tcp_frto;\n\tu8 sysctl_tcp_nometrics_save;\n\tu8 sysctl_tcp_no_ssthresh_metrics_save;\n\tu8 sysctl_tcp_workaround_signed_windows;\n\tint sysctl_tcp_challenge_ack_limit;\n\tu8 sysctl_tcp_min_tso_segs;\n\tu8 sysctl_tcp_reflect_tos;\n\tint sysctl_tcp_invalid_ratelimit;\n\tint sysctl_tcp_pacing_ss_ratio;\n\tint sysctl_tcp_pacing_ca_ratio;\n\tunsigned int sysctl_tcp_child_ehash_entries;\n\tlong unsigned int sysctl_tcp_comp_sack_delay_ns;\n\tlong unsigned int sysctl_tcp_comp_sack_slack_ns;\n\tint sysctl_max_syn_backlog;\n\tint sysctl_tcp_fastopen;\n\tconst struct tcp_congestion_ops *tcp_congestion_control;\n\tstruct tcp_fastopen_context *tcp_fastopen_ctx;\n\tunsigned int sysctl_tcp_fastopen_blackhole_timeout;\n\tatomic_t tfo_active_disable_times;\n\tlong unsigned int tfo_active_disable_stamp;\n\tu32 tcp_challenge_timestamp;\n\tu32 tcp_challenge_count;\n\tu8 sysctl_tcp_plb_enabled;\n\tu8 sysctl_tcp_plb_idle_rehash_rounds;\n\tu8 sysctl_tcp_plb_rehash_rounds;\n\tu8 sysctl_tcp_plb_suspend_rto_sec;\n\tint sysctl_tcp_plb_cong_thresh;\n\tint sysctl_udp_wmem_min;\n\tint sysctl_udp_rmem_min;\n\tu8 sysctl_fib_notify_on_flag_change;\n\tu8 sysctl_tcp_syn_linear_timeouts;\n\tu8 sysctl_udp_l3mdev_accept;\n\tu8 sysctl_igmp_llm_reports;\n\tint sysctl_igmp_max_memberships;\n\tint sysctl_igmp_max_msf;\n\tint sysctl_igmp_qrv;\n\tstruct ping_group_range ping_group_range;\n\tatomic_t dev_addr_genid;\n\tunsigned int sysctl_udp_child_hash_entries;\n\tlong unsigned int *sysctl_local_reserved_ports;\n\tint sysctl_ip_prot_sock;\n\tstruct list_head mr_tables;\n\tstruct fib_rules_ops *mr_rules_ops;\n\tstruct sysctl_fib_multipath_hash_seed sysctl_fib_multipath_hash_seed;\n\tu32 sysctl_fib_multipath_hash_fields;\n\tu8 sysctl_fib_multipath_use_neigh;\n\tu8 sysctl_fib_multipath_hash_policy;\n\tstruct fib_notifier_ops *notifier_ops;\n\tunsigned int fib_seq;\n\tstruct fib_notifier_ops *ipmr_notifier_ops;\n\tunsigned int ipmr_seq;\n\tatomic_t rt_genid;\n\tsiphash_key_t ip_id_key;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct netns_sysctl_ipv6 {\n\tstruct ctl_table_header *hdr;\n\tstruct ctl_table_header *route_hdr;\n\tstruct ctl_table_header *icmp_hdr;\n\tstruct ctl_table_header *frags_hdr;\n\tstruct ctl_table_header *xfrm6_hdr;\n\tint flush_delay;\n\tint ip6_rt_max_size;\n\tint ip6_rt_gc_min_interval;\n\tint ip6_rt_gc_timeout;\n\tint ip6_rt_gc_interval;\n\tint ip6_rt_gc_elasticity;\n\tint ip6_rt_mtu_expires;\n\tint ip6_rt_min_advmss;\n\tu32 multipath_hash_fields;\n\tu8 multipath_hash_policy;\n\tu8 bindv6only;\n\tu8 flowlabel_consistency;\n\tu8 auto_flowlabels;\n\tint icmpv6_time;\n\tu8 icmpv6_echo_ignore_all;\n\tu8 icmpv6_echo_ignore_multicast;\n\tu8 icmpv6_echo_ignore_anycast;\n\tlong unsigned int icmpv6_ratemask[4];\n\tlong unsigned int *icmpv6_ratemask_ptr;\n\tu8 anycast_src_echo_reply;\n\tu8 ip_nonlocal_bind;\n\tu8 fwmark_reflect;\n\tu8 flowlabel_state_ranges;\n\tint idgen_retries;\n\tint idgen_delay;\n\tint flowlabel_reflect;\n\tint max_dst_opts_cnt;\n\tint max_hbh_opts_cnt;\n\tint max_dst_opts_len;\n\tint max_hbh_opts_len;\n\tint seg6_flowlabel;\n\tu32 ioam6_id;\n\tu64 ioam6_id_wide;\n\tu8 skip_notify_on_dev_down;\n\tu8 fib_notify_on_flag_change;\n\tu8 icmpv6_error_anycast_as_unicast;\n};\n\nstruct rt6_statistics;\n\nstruct seg6_pernet_data;\n\nstruct netns_ipv6 {\n\tstruct dst_ops ip6_dst_ops;\n\tstruct netns_sysctl_ipv6 sysctl;\n\tstruct ipv6_devconf *devconf_all;\n\tstruct ipv6_devconf *devconf_dflt;\n\tstruct inet_peer_base *peers;\n\tstruct fqdir *fqdir;\n\tstruct fib6_info *fib6_null_entry;\n\tstruct rt6_info *ip6_null_entry;\n\tstruct rt6_statistics *rt6_stats;\n\tstruct timer_list ip6_fib_timer;\n\tstruct hlist_head *fib_table_hash;\n\tstruct fib6_table *fib6_main_tbl;\n\tstruct list_head fib6_walkers;\n\trwlock_t fib6_walker_lock;\n\tspinlock_t fib6_gc_lock;\n\tatomic_t ip6_rt_gc_expire;\n\tlong unsigned int ip6_rt_last_gc;\n\tunsigned char flowlabel_has_excl;\n\tbool fib6_has_custom_rules;\n\tunsigned int fib6_rules_require_fldissect;\n\tunsigned int fib6_routes_require_src;\n\tstruct rt6_info *ip6_prohibit_entry;\n\tstruct rt6_info *ip6_blk_hole_entry;\n\tstruct fib6_table *fib6_local_tbl;\n\tstruct fib_rules_ops *fib6_rules_ops;\n\tstruct sock *ndisc_sk;\n\tstruct sock *tcp_sk;\n\tstruct sock *igmp_sk;\n\tstruct sock *mc_autojoin_sk;\n\tstruct hlist_head *inet6_addr_lst;\n\tspinlock_t addrconf_hash_lock;\n\tstruct delayed_work addr_chk_work;\n\tstruct list_head mr6_tables;\n\tstruct fib_rules_ops *mr6_rules_ops;\n\tatomic_t dev_addr_genid;\n\tatomic_t fib6_sernum;\n\tstruct seg6_pernet_data *seg6_data;\n\tstruct fib_notifier_ops *notifier_ops;\n\tstruct fib_notifier_ops *ip6mr_notifier_ops;\n\tunsigned int ipmr_seq;\n\tstruct {\n\t\tstruct hlist_head head;\n\t\tspinlock_t lock;\n\t\tu32 seq;\n\t} ip6addrlbl_table;\n\tstruct ioam6_pernet_data *ioam6_data;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct netns_sysctl_lowpan {\n\tstruct ctl_table_header *frags_hdr;\n};\n\nstruct netns_ieee802154_lowpan {\n\tstruct netns_sysctl_lowpan sysctl;\n\tstruct fqdir *fqdir;\n};\n\nstruct sctp_mib;\n\nstruct netns_sctp {\n\tstruct sctp_mib *sctp_statistics;\n\tstruct proc_dir_entry *proc_net_sctp;\n\tstruct ctl_table_header *sysctl_header;\n\tstruct sock *ctl_sock;\n\tstruct sock *udp4_sock;\n\tstruct sock *udp6_sock;\n\tint udp_port;\n\tint encap_port;\n\tstruct list_head local_addr_list;\n\tstruct list_head addr_waitq;\n\tstruct timer_list addr_wq_timer;\n\tstruct list_head auto_asconf_splist;\n\tspinlock_t addr_wq_lock;\n\tspinlock_t local_addr_lock;\n\tunsigned int rto_initial;\n\tunsigned int rto_min;\n\tunsigned int rto_max;\n\tint rto_alpha;\n\tint rto_beta;\n\tint max_burst;\n\tint cookie_preserve_enable;\n\tchar *sctp_hmac_alg;\n\tunsigned int valid_cookie_life;\n\tunsigned int sack_timeout;\n\tunsigned int hb_interval;\n\tunsigned int probe_interval;\n\tint max_retrans_association;\n\tint max_retrans_path;\n\tint max_retrans_init;\n\tint pf_retrans;\n\tint ps_retrans;\n\tint pf_enable;\n\tint pf_expose;\n\tint sndbuf_policy;\n\tint rcvbuf_policy;\n\tint default_auto_asconf;\n\tint addip_enable;\n\tint addip_noauth;\n\tint prsctp_enable;\n\tint reconf_enable;\n\tint auth_enable;\n\tint intl_enable;\n\tint ecn_enable;\n\tint scope_policy;\n\tint rwnd_upd_shift;\n\tlong unsigned int max_autoclose;\n\tint l3mdev_accept;\n};\n\nstruct nf_logger;\n\nstruct nf_hook_entries;\n\nstruct netns_nf {\n\tstruct proc_dir_entry *proc_netfilter;\n\tconst struct nf_logger *nf_loggers[11];\n\tstruct ctl_table_header *nf_log_dir_header;\n\tstruct ctl_table_header *nf_lwtnl_dir_header;\n\tstruct nf_hook_entries *hooks_ipv4[5];\n\tstruct nf_hook_entries *hooks_ipv6[5];\n\tstruct nf_hook_entries *hooks_arp[3];\n\tstruct nf_hook_entries *hooks_bridge[5];\n\tunsigned int defrag_ipv4_users;\n\tunsigned int defrag_ipv6_users;\n};\n\nstruct nf_generic_net {\n\tunsigned int timeout;\n};\n\nstruct nf_tcp_net {\n\tunsigned int timeouts[14];\n\tu8 tcp_loose;\n\tu8 tcp_be_liberal;\n\tu8 tcp_max_retrans;\n\tu8 tcp_ignore_invalid_rst;\n\tunsigned int offload_timeout;\n};\n\nstruct nf_udp_net {\n\tunsigned int timeouts[2];\n\tunsigned int offload_timeout;\n};\n\nstruct nf_icmp_net {\n\tunsigned int timeout;\n};\n\nstruct nf_dccp_net {\n\tu8 dccp_loose;\n\tunsigned int dccp_timeout[10];\n};\n\nstruct nf_sctp_net {\n\tunsigned int timeouts[10];\n};\n\nstruct nf_gre_net {\n\tstruct list_head keymap_list;\n\tunsigned int timeouts[2];\n};\n\nstruct nf_ip_net {\n\tstruct nf_generic_net generic;\n\tstruct nf_tcp_net tcp;\n\tstruct nf_udp_net udp;\n\tstruct nf_icmp_net icmp;\n\tstruct nf_icmp_net icmpv6;\n\tstruct nf_dccp_net dccp;\n\tstruct nf_sctp_net sctp;\n\tstruct nf_gre_net gre;\n};\n\nstruct nf_ct_event_notifier;\n\nstruct netns_ct {\n\tbool ecache_dwork_pending;\n\tu8 sysctl_log_invalid;\n\tu8 sysctl_events;\n\tu8 sysctl_acct;\n\tu8 sysctl_tstamp;\n\tu8 sysctl_checksum;\n\tstruct ip_conntrack_stat *stat;\n\tstruct nf_ct_event_notifier *nf_conntrack_event_cb;\n\tstruct nf_ip_net nf_ct_proto;\n\tatomic_t labels_used;\n};\n\nstruct netns_nftables {\n\tu8 gencursor;\n};\n\nstruct nf_flow_table_stat;\n\nstruct netns_ft {\n\tstruct nf_flow_table_stat *stat;\n};\n\nstruct netns_bpf {\n\tstruct bpf_prog_array *run_array[2];\n\tstruct bpf_prog *progs[2];\n\tstruct list_head links[2];\n};\n\nstruct xfrm_policy_hash {\n\tstruct hlist_head *table;\n\tunsigned int hmask;\n\tu8 dbits4;\n\tu8 sbits4;\n\tu8 dbits6;\n\tu8 sbits6;\n};\n\nstruct xfrm_policy_hthresh {\n\tstruct work_struct work;\n\tseqlock_t lock;\n\tu8 lbits4;\n\tu8 rbits4;\n\tu8 lbits6;\n\tu8 rbits6;\n};\n\nstruct netns_xfrm {\n\tstruct list_head state_all;\n\tstruct hlist_head *state_bydst;\n\tstruct hlist_head *state_bysrc;\n\tstruct hlist_head *state_byspi;\n\tstruct hlist_head *state_byseq;\n\tunsigned int state_hmask;\n\tunsigned int state_num;\n\tstruct work_struct state_hash_work;\n\tstruct list_head policy_all;\n\tstruct hlist_head *policy_byidx;\n\tunsigned int policy_idx_hmask;\n\tunsigned int idx_generator;\n\tstruct hlist_head policy_inexact[3];\n\tstruct xfrm_policy_hash policy_bydst[3];\n\tunsigned int policy_count[6];\n\tstruct work_struct policy_hash_work;\n\tstruct xfrm_policy_hthresh policy_hthresh;\n\tstruct list_head inexact_bins;\n\tstruct sock *nlsk;\n\tstruct sock *nlsk_stash;\n\tu32 sysctl_aevent_etime;\n\tu32 sysctl_aevent_rseqth;\n\tint sysctl_larval_drop;\n\tu32 sysctl_acq_expires;\n\tu8 policy_default[3];\n\tstruct ctl_table_header *sysctl_hdr;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tstruct dst_ops xfrm4_dst_ops;\n\tstruct dst_ops xfrm6_dst_ops;\n\tspinlock_t xfrm_state_lock;\n\tseqcount_spinlock_t xfrm_state_hash_generation;\n\tseqcount_spinlock_t xfrm_policy_hash_generation;\n\tspinlock_t xfrm_policy_lock;\n\tstruct mutex xfrm_cfg_mutex;\n\tstruct delayed_work nat_keepalive_work;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct netns_ipvs;\n\nstruct mpls_route;\n\nstruct netns_mpls {\n\tint ip_ttl_propagate;\n\tint default_ttl;\n\tsize_t platform_labels;\n\tstruct mpls_route **platform_label;\n\tstruct ctl_table_header *ctl;\n};\n\nstruct can_dev_rcv_lists;\n\nstruct can_pkg_stats;\n\nstruct can_rcv_lists_stats;\n\nstruct netns_can {\n\tstruct proc_dir_entry *proc_dir;\n\tstruct proc_dir_entry *pde_stats;\n\tstruct proc_dir_entry *pde_reset_stats;\n\tstruct proc_dir_entry *pde_rcvlist_all;\n\tstruct proc_dir_entry *pde_rcvlist_fil;\n\tstruct proc_dir_entry *pde_rcvlist_inv;\n\tstruct proc_dir_entry *pde_rcvlist_sff;\n\tstruct proc_dir_entry *pde_rcvlist_eff;\n\tstruct proc_dir_entry *pde_rcvlist_err;\n\tstruct proc_dir_entry *bcmproc_dir;\n\tstruct can_dev_rcv_lists *rx_alldev_list;\n\tspinlock_t rcvlists_lock;\n\tstruct timer_list stattimer;\n\tstruct can_pkg_stats *pkg_stats;\n\tstruct can_rcv_lists_stats *rcv_lists_stats;\n\tstruct hlist_head cgw_list;\n};\n\nstruct netns_xdp {\n\tstruct mutex lock;\n\tstruct hlist_head list;\n};\n\nstruct netns_mctp {\n\tstruct list_head routes;\n\tstruct mutex bind_lock;\n\tstruct hlist_head binds;\n\tspinlock_t keys_lock;\n\tstruct hlist_head keys;\n\tunsigned int default_net;\n\tstruct mutex neigh_lock;\n\tstruct list_head neighbours;\n};\n\nstruct smc_stats;\n\nstruct smc_stats_rsn;\n\nstruct netns_smc {\n\tstruct smc_stats *smc_stats;\n\tstruct mutex mutex_fback_rsn;\n\tstruct smc_stats_rsn *fback_rsn;\n\tbool limit_smc_hs;\n\tstruct ctl_table_header *smc_hdr;\n\tunsigned int sysctl_autocorking_size;\n\tunsigned int sysctl_smcr_buf_type;\n\tint sysctl_smcr_testlink_time;\n\tint sysctl_wmem;\n\tint sysctl_rmem;\n\tint sysctl_max_links_per_lgr;\n\tint sysctl_max_conns_per_lgr;\n};\n\nstruct uevent_sock;\n\nstruct net_generic;\n\nstruct net {\n\trefcount_t passive;\n\tspinlock_t rules_mod_lock;\n\tunsigned int dev_base_seq;\n\tu32 ifindex;\n\tspinlock_t nsid_lock;\n\tatomic_t fnhe_genid;\n\tstruct list_head list;\n\tstruct list_head exit_list;\n\tstruct llist_node defer_free_list;\n\tstruct llist_node cleanup_list;\n\tstruct key_tag *key_domain;\n\tstruct user_namespace *user_ns;\n\tstruct ucounts *ucounts;\n\tstruct idr netns_ids;\n\tstruct ns_common ns;\n\tstruct ref_tracker_dir refcnt_tracker;\n\tstruct ref_tracker_dir notrefcnt_tracker;\n\tstruct list_head dev_base_head;\n\tstruct proc_dir_entry *proc_net;\n\tstruct proc_dir_entry *proc_net_stat;\n\tstruct ctl_table_set sysctls;\n\tstruct sock *rtnl;\n\tstruct sock *genl_sock;\n\tstruct uevent_sock *uevent_sock;\n\tstruct hlist_head *dev_name_head;\n\tstruct hlist_head *dev_index_head;\n\tstruct xarray dev_by_index;\n\tstruct raw_notifier_head netdev_chain;\n\tu32 hash_mix;\n\tstruct net_device *loopback_dev;\n\tstruct list_head rules_ops;\n\tstruct netns_core core;\n\tstruct netns_mib mib;\n\tstruct netns_packet packet;\n\tstruct netns_unix unx;\n\tstruct netns_nexthop nexthop;\n\tlong: 64;\n\tlong: 64;\n\tstruct netns_ipv4 ipv4;\n\tstruct netns_ipv6 ipv6;\n\tstruct netns_ieee802154_lowpan ieee802154_lowpan;\n\tstruct netns_sctp sctp;\n\tstruct netns_nf nf;\n\tstruct netns_ct ct;\n\tstruct netns_nftables nft;\n\tstruct netns_ft ft;\n\tstruct sk_buff_head wext_nlevents;\n\tstruct net_generic *gen;\n\tstruct netns_bpf bpf;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tstruct netns_xfrm xfrm;\n\tu64 net_cookie;\n\tstruct netns_ipvs *ipvs;\n\tstruct netns_mpls mpls;\n\tstruct netns_can can;\n\tstruct netns_xdp xdp;\n\tstruct netns_mctp mctp;\n\tstruct sock *crypto_nlsk;\n\tstruct sock *diag_nlsk;\n\tstruct netns_smc smc;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct rtable {\n\tstruct dst_entry dst;\n\tint rt_genid;\n\tunsigned int rt_flags;\n\t__u16 rt_type;\n\t__u8 rt_is_input;\n\t__u8 rt_uses_gateway;\n\tint rt_iif;\n\tu8 rt_gw_family;\n\tunion {\n\t\t__be32 rt_gw4;\n\t\tstruct in6_addr rt_gw6;\n\t};\n\tu32 rt_mtu_locked: 1;\n\tu32 rt_pmtu: 31;\n};\n\nstruct rt6_info {\n\tstruct dst_entry dst;\n\tstruct fib6_info *from;\n\tint sernum;\n\tstruct rt6key rt6i_dst;\n\tstruct rt6key rt6i_src;\n\tstruct in6_addr rt6i_gateway;\n\tstruct inet6_dev *rt6i_idev;\n\tu32 rt6i_flags;\n\tshort unsigned int rt6i_nfheader_len;\n};\n\nstruct net_bridge;\n\nstruct net_bridge_vlan;\n\nstruct net_bridge_mcast {\n\tstruct net_bridge *br;\n\tstruct net_bridge_vlan *vlan;\n\tu32 multicast_last_member_count;\n\tu32 multicast_startup_query_count;\n\tu8 multicast_querier;\n\tu8 multicast_igmp_version;\n\tu8 multicast_router;\n\tu8 multicast_mld_version;\n\tlong unsigned int multicast_last_member_interval;\n\tlong unsigned int multicast_membership_interval;\n\tlong unsigned int multicast_querier_interval;\n\tlong unsigned int multicast_query_interval;\n\tlong unsigned int multicast_query_response_interval;\n\tlong unsigned int multicast_startup_query_interval;\n\tstruct hlist_head ip4_mc_router_list;\n\tstruct timer_list ip4_mc_router_timer;\n\tstruct bridge_mcast_other_query ip4_other_query;\n\tstruct bridge_mcast_own_query ip4_own_query;\n\tstruct bridge_mcast_querier ip4_querier;\n\tstruct hlist_head ip6_mc_router_list;\n\tstruct timer_list ip6_mc_router_timer;\n\tstruct bridge_mcast_other_query ip6_other_query;\n\tstruct bridge_mcast_own_query ip6_own_query;\n\tstruct bridge_mcast_querier ip6_querier;\n};\n\nstruct net_bridge_vlan_group;\n\nstruct net_bridge {\n\tspinlock_t lock;\n\tspinlock_t hash_lock;\n\tstruct hlist_head frame_type_list;\n\tstruct net_device *dev;\n\tlong unsigned int options;\n\t__be16 vlan_proto;\n\tu16 default_pvid;\n\tstruct net_bridge_vlan_group *vlgrp;\n\tstruct rhashtable fdb_hash_tbl;\n\tstruct list_head port_list;\n\tunion {\n\t\tstruct rtable fake_rtable;\n\t\tstruct rt6_info fake_rt6_info;\n\t};\n\tu16 group_fwd_mask;\n\tu16 group_fwd_mask_required;\n\tbridge_id designated_root;\n\tbridge_id bridge_id;\n\tunsigned char topology_change;\n\tunsigned char topology_change_detected;\n\tu16 root_port;\n\tlong unsigned int max_age;\n\tlong unsigned int hello_time;\n\tlong unsigned int forward_delay;\n\tlong unsigned int ageing_time;\n\tlong unsigned int bridge_max_age;\n\tlong unsigned int bridge_hello_time;\n\tlong unsigned int bridge_forward_delay;\n\tlong unsigned int bridge_ageing_time;\n\tu32 root_path_cost;\n\tu8 group_addr[6];\n\tenum {\n\t\tBR_NO_STP = 0,\n\t\tBR_KERNEL_STP = 1,\n\t\tBR_USER_STP = 2,\n\t} stp_enabled;\n\tstruct net_bridge_mcast multicast_ctx;\n\tstruct bridge_mcast_stats *mcast_stats;\n\tu32 hash_max;\n\tspinlock_t multicast_lock;\n\tstruct rhashtable mdb_hash_tbl;\n\tstruct rhashtable sg_port_tbl;\n\tstruct hlist_head mcast_gc_list;\n\tstruct hlist_head mdb_list;\n\tstruct work_struct mcast_gc_work;\n\tstruct timer_list hello_timer;\n\tstruct timer_list tcn_timer;\n\tstruct timer_list topology_change_timer;\n\tstruct delayed_work gc_work;\n\tstruct kobject *ifobj;\n\tu32 auto_cnt;\n\tatomic_t fdb_n_learned;\n\tu32 fdb_max_learned;\n\tint last_hwdom;\n\tlong unsigned int busy_hwdoms;\n\tstruct hlist_head fdb_list;\n\tstruct hlist_head mrp_list;\n\tstruct hlist_head mep_list;\n};\n\nstruct net_bridge_fdb_key {\n\tmac_addr addr;\n\tu16 vlan_id;\n};\n\nstruct net_bridge_port;\n\nstruct net_bridge_fdb_entry {\n\tstruct rhash_head rhnode;\n\tstruct net_bridge_port *dst;\n\tstruct net_bridge_fdb_key key;\n\tstruct hlist_node fdb_node;\n\tlong unsigned int flags;\n\tlong: 64;\n\tlong: 64;\n\tlong unsigned int updated;\n\tlong unsigned int used;\n\tstruct callback_head rcu;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct net_bridge_mcast_port {\n\tstruct net_bridge_port *port;\n\tstruct net_bridge_vlan *vlan;\n\tstruct bridge_mcast_own_query ip4_own_query;\n\tstruct timer_list ip4_mc_router_timer;\n\tstruct hlist_node ip4_rlist;\n\tstruct bridge_mcast_own_query ip6_own_query;\n\tstruct timer_list ip6_mc_router_timer;\n\tstruct hlist_node ip6_rlist;\n\tunsigned char multicast_router;\n\tu32 mdb_n_entries;\n\tu32 mdb_max_entries;\n};\n\nstruct netpoll;\n\nstruct net_bridge_port {\n\tstruct net_bridge *br;\n\tstruct net_device *dev;\n\tnetdevice_tracker dev_tracker;\n\tstruct list_head list;\n\tlong unsigned int flags;\n\tstruct net_bridge_vlan_group *vlgrp;\n\tstruct net_bridge_port *backup_port;\n\tu32 backup_nhid;\n\tu8 priority;\n\tu8 state;\n\tu16 port_no;\n\tunsigned char topology_change_ack;\n\tunsigned char config_pending;\n\tport_id port_id;\n\tport_id designated_port;\n\tbridge_id designated_root;\n\tbridge_id designated_bridge;\n\tu32 path_cost;\n\tu32 designated_cost;\n\tlong unsigned int designated_age;\n\tstruct timer_list forward_delay_timer;\n\tstruct timer_list hold_timer;\n\tstruct timer_list message_age_timer;\n\tstruct kobject kobj;\n\tstruct callback_head rcu;\n\tstruct net_bridge_mcast_port multicast_ctx;\n\tstruct bridge_mcast_stats *mcast_stats;\n\tu32 multicast_eht_hosts_limit;\n\tu32 multicast_eht_hosts_cnt;\n\tstruct hlist_head mglist;\n\tchar sysfs_name[16];\n\tstruct netpoll *np;\n\tint hwdom;\n\tint offload_count;\n\tstruct netdev_phys_item_id ppid;\n\tu16 group_fwd_mask;\n\tu16 backup_redirected_cnt;\n\tstruct bridge_stp_xstats stp_xstats;\n};\n\nstruct pcpu_sw_netstats;\n\nstruct net_bridge_vlan {\n\tstruct rhash_head vnode;\n\tstruct rhash_head tnode;\n\tu16 vid;\n\tu16 flags;\n\tu16 priv_flags;\n\tu8 state;\n\tstruct pcpu_sw_netstats *stats;\n\tunion {\n\t\tstruct net_bridge *br;\n\t\tstruct net_bridge_port *port;\n\t};\n\tunion {\n\t\trefcount_t refcnt;\n\t\tstruct net_bridge_vlan *brvlan;\n\t};\n\tstruct br_tunnel_info tinfo;\n\tunion {\n\t\tstruct net_bridge_mcast br_mcast_ctx;\n\t\tstruct net_bridge_mcast_port port_mcast_ctx;\n\t};\n\tu16 msti;\n\tstruct list_head vlist;\n\tstruct callback_head rcu;\n};\n\nstruct net_bridge_vlan_group {\n\tstruct rhashtable vlan_hash;\n\tstruct rhashtable tunnel_hash;\n\tstruct list_head vlan_list;\n\tu16 num_vlans;\n\tu16 pvid;\n\tu8 pvid_state;\n};\n\nstruct netdev_tc_txq {\n\tu16 count;\n\tu16 offset;\n};\n\ntypedef rx_handler_result_t rx_handler_func_t(struct sk_buff **);\n\nstruct net_device_stats {\n\tunion {\n\t\tlong unsigned int rx_packets;\n\t\tatomic_long_t __rx_packets;\n\t};\n\tunion {\n\t\tlong unsigned int tx_packets;\n\t\tatomic_long_t __tx_packets;\n\t};\n\tunion {\n\t\tlong unsigned int rx_bytes;\n\t\tatomic_long_t __rx_bytes;\n\t};\n\tunion {\n\t\tlong unsigned int tx_bytes;\n\t\tatomic_long_t __tx_bytes;\n\t};\n\tunion {\n\t\tlong unsigned int rx_errors;\n\t\tatomic_long_t __rx_errors;\n\t};\n\tunion {\n\t\tlong unsigned int tx_errors;\n\t\tatomic_long_t __tx_errors;\n\t};\n\tunion {\n\t\tlong unsigned int rx_dropped;\n\t\tatomic_long_t __rx_dropped;\n\t};\n\tunion {\n\t\tlong unsigned int tx_dropped;\n\t\tatomic_long_t __tx_dropped;\n\t};\n\tunion {\n\t\tlong unsigned int multicast;\n\t\tatomic_long_t __multicast;\n\t};\n\tunion {\n\t\tlong unsigned int collisions;\n\t\tatomic_long_t __collisions;\n\t};\n\tunion {\n\t\tlong unsigned int rx_length_errors;\n\t\tatomic_long_t __rx_length_errors;\n\t};\n\tunion {\n\t\tlong unsigned int rx_over_errors;\n\t\tatomic_long_t __rx_over_errors;\n\t};\n\tunion {\n\t\tlong unsigned int rx_crc_errors;\n\t\tatomic_long_t __rx_crc_errors;\n\t};\n\tunion {\n\t\tlong unsigned int rx_frame_errors;\n\t\tatomic_long_t __rx_frame_errors;\n\t};\n\tunion {\n\t\tlong unsigned int rx_fifo_errors;\n\t\tatomic_long_t __rx_fifo_errors;\n\t};\n\tunion {\n\t\tlong unsigned int rx_missed_errors;\n\t\tatomic_long_t __rx_missed_errors;\n\t};\n\tunion {\n\t\tlong unsigned int tx_aborted_errors;\n\t\tatomic_long_t __tx_aborted_errors;\n\t};\n\tunion {\n\t\tlong unsigned int tx_carrier_errors;\n\t\tatomic_long_t __tx_carrier_errors;\n\t};\n\tunion {\n\t\tlong unsigned int tx_fifo_errors;\n\t\tatomic_long_t __tx_fifo_errors;\n\t};\n\tunion {\n\t\tlong unsigned int tx_heartbeat_errors;\n\t\tatomic_long_t __tx_heartbeat_errors;\n\t};\n\tunion {\n\t\tlong unsigned int tx_window_errors;\n\t\tatomic_long_t __tx_window_errors;\n\t};\n\tunion {\n\t\tlong unsigned int rx_compressed;\n\t\tatomic_long_t __rx_compressed;\n\t};\n\tunion {\n\t\tlong unsigned int tx_compressed;\n\t\tatomic_long_t __tx_compressed;\n\t};\n};\n\nstruct netdev_hw_addr_list {\n\tstruct list_head list;\n\tint count;\n\tstruct rb_root tree;\n};\n\nstruct tipc_bearer;\n\nstruct mpls_dev;\n\nstruct garp_port;\n\nstruct mrp_port;\n\nstruct udp_tunnel_nic;\n\nstruct net_device_ops;\n\nstruct xps_dev_maps;\n\nstruct pcpu_lstats;\n\nstruct pcpu_dstats;\n\nstruct netdev_rx_queue;\n\nstruct netpoll_info;\n\nstruct netdev_name_node;\n\nstruct xdp_metadata_ops;\n\nstruct xsk_tx_metadata_ops;\n\nstruct net_device_core_stats;\n\nstruct xfrmdev_ops;\n\nstruct tlsdev_ops;\n\nstruct vlan_info;\n\nstruct wireless_dev;\n\nstruct wpan_dev;\n\nstruct xdp_dev_bulk_queue;\n\nstruct rtnl_link_ops;\n\nstruct netdev_stat_ops;\n\nstruct netdev_queue_mgmt_ops;\n\nstruct netprio_map;\n\nstruct sfp_bus;\n\nstruct udp_tunnel_nic_info;\n\nstruct rtnl_hw_stats64;\n\nstruct net_device {\n\t__u8 __cacheline_group_begin__net_device_read_tx[0];\n\tlong long unsigned int priv_flags;\n\tconst struct net_device_ops *netdev_ops;\n\tconst struct header_ops *header_ops;\n\tstruct netdev_queue *_tx;\n\tnetdev_features_t gso_partial_features;\n\tunsigned int real_num_tx_queues;\n\tunsigned int gso_max_size;\n\tunsigned int gso_ipv4_max_size;\n\tu16 gso_max_segs;\n\ts16 num_tc;\n\tunsigned int mtu;\n\tshort unsigned int needed_headroom;\n\tstruct netdev_tc_txq tc_to_txq[16];\n\tstruct xps_dev_maps *xps_maps[2];\n\tstruct nf_hook_entries *nf_hooks_egress;\n\tstruct bpf_mprog_entry *tcx_egress;\n\t__u8 __cacheline_group_end__net_device_read_tx[0];\n\t__u8 __cacheline_group_begin__net_device_read_txrx[0];\n\tunion {\n\t\tstruct pcpu_lstats *lstats;\n\t\tstruct pcpu_sw_netstats *tstats;\n\t\tstruct pcpu_dstats *dstats;\n\t};\n\tlong unsigned int state;\n\tunsigned int flags;\n\tshort unsigned int hard_header_len;\n\tnetdev_features_t features;\n\tstruct inet6_dev *ip6_ptr;\n\t__u8 __cacheline_group_end__net_device_read_txrx[0];\n\t__u8 __cacheline_group_begin__net_device_read_rx[0];\n\tstruct bpf_prog *xdp_prog;\n\tstruct list_head ptype_specific;\n\tint ifindex;\n\tunsigned int real_num_rx_queues;\n\tstruct netdev_rx_queue *_rx;\n\tlong unsigned int gro_flush_timeout;\n\tu32 napi_defer_hard_irqs;\n\tunsigned int gro_max_size;\n\tunsigned int gro_ipv4_max_size;\n\trx_handler_func_t *rx_handler;\n\tvoid *rx_handler_data;\n\tpossible_net_t nd_net;\n\tstruct netpoll_info *npinfo;\n\tstruct bpf_mprog_entry *tcx_ingress;\n\t__u8 __cacheline_group_end__net_device_read_rx[0];\n\tchar name[16];\n\tstruct netdev_name_node *name_node;\n\tstruct dev_ifalias *ifalias;\n\tlong unsigned int mem_end;\n\tlong unsigned int mem_start;\n\tlong unsigned int base_addr;\n\tstruct list_head dev_list;\n\tstruct list_head napi_list;\n\tstruct list_head unreg_list;\n\tstruct list_head close_list;\n\tstruct list_head ptype_all;\n\tstruct {\n\t\tstruct list_head upper;\n\t\tstruct list_head lower;\n\t} adj_list;\n\txdp_features_t xdp_features;\n\tconst struct xdp_metadata_ops *xdp_metadata_ops;\n\tconst struct xsk_tx_metadata_ops *xsk_tx_metadata_ops;\n\tshort unsigned int gflags;\n\tshort unsigned int needed_tailroom;\n\tnetdev_features_t hw_features;\n\tnetdev_features_t wanted_features;\n\tnetdev_features_t vlan_features;\n\tnetdev_features_t hw_enc_features;\n\tnetdev_features_t mpls_features;\n\tunsigned int min_mtu;\n\tunsigned int max_mtu;\n\tshort unsigned int type;\n\tunsigned char min_header_len;\n\tunsigned char name_assign_type;\n\tint group;\n\tstruct net_device_stats stats;\n\tstruct net_device_core_stats *core_stats;\n\tatomic_t carrier_up_count;\n\tatomic_t carrier_down_count;\n\tconst struct iw_handler_def *wireless_handlers;\n\tstruct iw_public_data *wireless_data;\n\tconst struct ethtool_ops *ethtool_ops;\n\tconst struct l3mdev_ops *l3mdev_ops;\n\tconst struct ndisc_ops *ndisc_ops;\n\tconst struct xfrmdev_ops *xfrmdev_ops;\n\tconst struct tlsdev_ops *tlsdev_ops;\n\tunsigned int operstate;\n\tunsigned char link_mode;\n\tunsigned char if_port;\n\tunsigned char dma;\n\tunsigned char perm_addr[32];\n\tunsigned char addr_assign_type;\n\tunsigned char addr_len;\n\tunsigned char upper_level;\n\tunsigned char lower_level;\n\tshort unsigned int neigh_priv_len;\n\tshort unsigned int dev_id;\n\tshort unsigned int dev_port;\n\tint irq;\n\tu32 priv_len;\n\tspinlock_t addr_list_lock;\n\tstruct netdev_hw_addr_list uc;\n\tstruct netdev_hw_addr_list mc;\n\tstruct netdev_hw_addr_list dev_addrs;\n\tstruct kset *queues_kset;\n\tunsigned int promiscuity;\n\tunsigned int allmulti;\n\tbool uc_promisc;\n\tstruct in_device *ip_ptr;\n\tstruct vlan_info *vlan_info;\n\tstruct dsa_port *dsa_ptr;\n\tstruct tipc_bearer *tipc_ptr;\n\tvoid *atalk_ptr;\n\tvoid *ax25_ptr;\n\tstruct wireless_dev *ieee80211_ptr;\n\tstruct wpan_dev *ieee802154_ptr;\n\tstruct mpls_dev *mpls_ptr;\n\tstruct mctp_dev *mctp_ptr;\n\tconst unsigned char *dev_addr;\n\tunsigned int num_rx_queues;\n\tunsigned int xdp_zc_max_segs;\n\tstruct netdev_queue *ingress_queue;\n\tstruct nf_hook_entries *nf_hooks_ingress;\n\tunsigned char broadcast[32];\n\tstruct cpu_rmap *rx_cpu_rmap;\n\tstruct hlist_node index_hlist;\n\tunsigned int num_tx_queues;\n\tstruct Qdisc *qdisc;\n\tunsigned int tx_queue_len;\n\tspinlock_t tx_global_lock;\n\tstruct xdp_dev_bulk_queue *xdp_bulkq;\n\tstruct hlist_head qdisc_hash[16];\n\tstruct timer_list watchdog_timer;\n\tint watchdog_timeo;\n\tu32 proto_down_reason;\n\tstruct list_head todo_list;\n\tint *pcpu_refcnt;\n\tstruct ref_tracker_dir refcnt_tracker;\n\tstruct list_head link_watch_list;\n\tu8 reg_state;\n\tbool dismantle;\n\tenum {\n\t\tRTNL_LINK_INITIALIZED = 0,\n\t\tRTNL_LINK_INITIALIZING = 1,\n\t} rtnl_link_state: 16;\n\tbool needs_free_netdev;\n\tvoid (*priv_destructor)(struct net_device *);\n\tvoid *ml_priv;\n\tenum netdev_ml_priv_type ml_priv_type;\n\tenum netdev_stat_type pcpu_stat_type: 8;\n\tstruct garp_port *garp_port;\n\tstruct mrp_port *mrp_port;\n\tstruct dm_hw_stat_delta *dm_private;\n\tstruct device dev;\n\tconst struct attribute_group *sysfs_groups[4];\n\tconst struct attribute_group *sysfs_rx_queue_group;\n\tconst struct rtnl_link_ops *rtnl_link_ops;\n\tconst struct netdev_stat_ops *stat_ops;\n\tconst struct netdev_queue_mgmt_ops *queue_mgmt_ops;\n\tunsigned int tso_max_size;\n\tu16 tso_max_segs;\n\tconst struct dcbnl_rtnl_ops *dcbnl_ops;\n\tu8 prio_tc_map[16];\n\tunsigned int fcoe_ddp_xid;\n\tstruct netprio_map *priomap;\n\tstruct phy_device *phydev;\n\tstruct sfp_bus *sfp_bus;\n\tstruct lock_class_key *qdisc_tx_busylock;\n\tbool proto_down;\n\tbool threaded;\n\tstruct list_head net_notifier_list;\n\tconst struct macsec_ops *macsec_ops;\n\tconst struct udp_tunnel_nic_info *udp_tunnel_nic_info;\n\tstruct udp_tunnel_nic *udp_tunnel_nic;\n\tstruct ethtool_netdev_state *ethtool;\n\tstruct bpf_xdp_entity xdp_state[3];\n\tu8 dev_addr_shadow[32];\n\tnetdevice_tracker linkwatch_dev_tracker;\n\tnetdevice_tracker watchdog_dev_tracker;\n\tnetdevice_tracker dev_registered_tracker;\n\tstruct rtnl_hw_stats64 *offload_xstats_l3;\n\tstruct devlink_port *devlink_port;\n\tstruct dpll_pin *dpll_pin;\n\tstruct hlist_head page_pools;\n\tstruct dim_irq_moder *irq_moder;\n\tlong: 64;\n\tu8 priv[0];\n};\n\nstruct net_device_core_stats {\n\tlong unsigned int rx_dropped;\n\tlong unsigned int tx_dropped;\n\tlong unsigned int rx_nohandler;\n\tlong unsigned int rx_otherhost_dropped;\n};\n\nstruct net_device_devres {\n\tstruct net_device *ndev;\n};\n\nstruct netdev_fcoe_hbainfo;\n\nstruct netdev_bpf;\n\nstruct xdp_frame;\n\nstruct net_device_path_ctx;\n\nstruct net_device_path;\n\nstruct skb_shared_hwtstamps;\n\nstruct net_device_ops {\n\tint (*ndo_init)(struct net_device *);\n\tvoid (*ndo_uninit)(struct net_device *);\n\tint (*ndo_open)(struct net_device *);\n\tint (*ndo_stop)(struct net_device *);\n\tnetdev_tx_t (*ndo_start_xmit)(struct sk_buff *, struct net_device *);\n\tnetdev_features_t (*ndo_features_check)(struct sk_buff *, struct net_device *, netdev_features_t);\n\tu16 (*ndo_select_queue)(struct net_device *, struct sk_buff *, struct net_device *);\n\tvoid (*ndo_change_rx_flags)(struct net_device *, int);\n\tvoid (*ndo_set_rx_mode)(struct net_device *);\n\tint (*ndo_set_mac_address)(struct net_device *, void *);\n\tint (*ndo_validate_addr)(struct net_device *);\n\tint (*ndo_do_ioctl)(struct net_device *, struct ifreq *, int);\n\tint (*ndo_eth_ioctl)(struct net_device *, struct ifreq *, int);\n\tint (*ndo_siocbond)(struct net_device *, struct ifreq *, int);\n\tint (*ndo_siocwandev)(struct net_device *, struct if_settings *);\n\tint (*ndo_siocdevprivate)(struct net_device *, struct ifreq *, void *, int);\n\tint (*ndo_set_config)(struct net_device *, struct ifmap *);\n\tint (*ndo_change_mtu)(struct net_device *, int);\n\tint (*ndo_neigh_setup)(struct net_device *, struct neigh_parms *);\n\tvoid (*ndo_tx_timeout)(struct net_device *, unsigned int);\n\tvoid (*ndo_get_stats64)(struct net_device *, struct rtnl_link_stats64 *);\n\tbool (*ndo_has_offload_stats)(const struct net_device *, int);\n\tint (*ndo_get_offload_stats)(int, const struct net_device *, void *);\n\tstruct net_device_stats * (*ndo_get_stats)(struct net_device *);\n\tint (*ndo_vlan_rx_add_vid)(struct net_device *, __be16, u16);\n\tint (*ndo_vlan_rx_kill_vid)(struct net_device *, __be16, u16);\n\tvoid (*ndo_poll_controller)(struct net_device *);\n\tint (*ndo_netpoll_setup)(struct net_device *, struct netpoll_info *);\n\tvoid (*ndo_netpoll_cleanup)(struct net_device *);\n\tint (*ndo_set_vf_mac)(struct net_device *, int, u8 *);\n\tint (*ndo_set_vf_vlan)(struct net_device *, int, u16, u8, __be16);\n\tint (*ndo_set_vf_rate)(struct net_device *, int, int, int);\n\tint (*ndo_set_vf_spoofchk)(struct net_device *, int, bool);\n\tint (*ndo_set_vf_trust)(struct net_device *, int, bool);\n\tint (*ndo_get_vf_config)(struct net_device *, int, struct ifla_vf_info *);\n\tint (*ndo_set_vf_link_state)(struct net_device *, int, int);\n\tint (*ndo_get_vf_stats)(struct net_device *, int, struct ifla_vf_stats *);\n\tint (*ndo_set_vf_port)(struct net_device *, int, struct nlattr **);\n\tint (*ndo_get_vf_port)(struct net_device *, int, struct sk_buff *);\n\tint (*ndo_get_vf_guid)(struct net_device *, int, struct ifla_vf_guid *, struct ifla_vf_guid *);\n\tint (*ndo_set_vf_guid)(struct net_device *, int, u64, int);\n\tint (*ndo_set_vf_rss_query_en)(struct net_device *, int, bool);\n\tint (*ndo_setup_tc)(struct net_device *, enum tc_setup_type, void *);\n\tint (*ndo_fcoe_enable)(struct net_device *);\n\tint (*ndo_fcoe_disable)(struct net_device *);\n\tint (*ndo_fcoe_ddp_setup)(struct net_device *, u16, struct scatterlist *, unsigned int);\n\tint (*ndo_fcoe_ddp_done)(struct net_device *, u16);\n\tint (*ndo_fcoe_ddp_target)(struct net_device *, u16, struct scatterlist *, unsigned int);\n\tint (*ndo_fcoe_get_hbainfo)(struct net_device *, struct netdev_fcoe_hbainfo *);\n\tint (*ndo_fcoe_get_wwn)(struct net_device *, u64 *, int);\n\tint (*ndo_rx_flow_steer)(struct net_device *, const struct sk_buff *, u16, u32);\n\tint (*ndo_add_slave)(struct net_device *, struct net_device *, struct netlink_ext_ack *);\n\tint (*ndo_del_slave)(struct net_device *, struct net_device *);\n\tstruct net_device * (*ndo_get_xmit_slave)(struct net_device *, struct sk_buff *, bool);\n\tstruct net_device * (*ndo_sk_get_lower_dev)(struct net_device *, struct sock *);\n\tnetdev_features_t (*ndo_fix_features)(struct net_device *, netdev_features_t);\n\tint (*ndo_set_features)(struct net_device *, netdev_features_t);\n\tint (*ndo_neigh_construct)(struct net_device *, struct neighbour *);\n\tvoid (*ndo_neigh_destroy)(struct net_device *, struct neighbour *);\n\tint (*ndo_fdb_add)(struct ndmsg *, struct nlattr **, struct net_device *, const unsigned char *, u16, u16, struct netlink_ext_ack *);\n\tint (*ndo_fdb_del)(struct ndmsg *, struct nlattr **, struct net_device *, const unsigned char *, u16, struct netlink_ext_ack *);\n\tint (*ndo_fdb_del_bulk)(struct nlmsghdr *, struct net_device *, struct netlink_ext_ack *);\n\tint (*ndo_fdb_dump)(struct sk_buff *, struct netlink_callback *, struct net_device *, struct net_device *, int *);\n\tint (*ndo_fdb_get)(struct sk_buff *, struct nlattr **, struct net_device *, const unsigned char *, u16, u32, u32, struct netlink_ext_ack *);\n\tint (*ndo_mdb_add)(struct net_device *, struct nlattr **, u16, struct netlink_ext_ack *);\n\tint (*ndo_mdb_del)(struct net_device *, struct nlattr **, struct netlink_ext_ack *);\n\tint (*ndo_mdb_del_bulk)(struct net_device *, struct nlattr **, struct netlink_ext_ack *);\n\tint (*ndo_mdb_dump)(struct net_device *, struct sk_buff *, struct netlink_callback *);\n\tint (*ndo_mdb_get)(struct net_device *, struct nlattr **, u32, u32, struct netlink_ext_ack *);\n\tint (*ndo_bridge_setlink)(struct net_device *, struct nlmsghdr *, u16, struct netlink_ext_ack *);\n\tint (*ndo_bridge_getlink)(struct sk_buff *, u32, u32, struct net_device *, u32, int);\n\tint (*ndo_bridge_dellink)(struct net_device *, struct nlmsghdr *, u16);\n\tint (*ndo_change_carrier)(struct net_device *, bool);\n\tint (*ndo_get_phys_port_id)(struct net_device *, struct netdev_phys_item_id *);\n\tint (*ndo_get_port_parent_id)(struct net_device *, struct netdev_phys_item_id *);\n\tint (*ndo_get_phys_port_name)(struct net_device *, char *, size_t);\n\tvoid * (*ndo_dfwd_add_station)(struct net_device *, struct net_device *);\n\tvoid (*ndo_dfwd_del_station)(struct net_device *, void *);\n\tint (*ndo_set_tx_maxrate)(struct net_device *, int, u32);\n\tint (*ndo_get_iflink)(const struct net_device *);\n\tint (*ndo_fill_metadata_dst)(struct net_device *, struct sk_buff *);\n\tvoid (*ndo_set_rx_headroom)(struct net_device *, int);\n\tint (*ndo_bpf)(struct net_device *, struct netdev_bpf *);\n\tint (*ndo_xdp_xmit)(struct net_device *, int, struct xdp_frame **, u32);\n\tstruct net_device * (*ndo_xdp_get_xmit_slave)(struct net_device *, struct xdp_buff *);\n\tint (*ndo_xsk_wakeup)(struct net_device *, u32, u32);\n\tint (*ndo_tunnel_ctl)(struct net_device *, struct ip_tunnel_parm_kern *, int);\n\tstruct net_device * (*ndo_get_peer_dev)(struct net_device *);\n\tint (*ndo_fill_forward_path)(struct net_device_path_ctx *, struct net_device_path *);\n\tktime_t (*ndo_get_tstamp)(struct net_device *, const struct skb_shared_hwtstamps *, bool);\n\tint (*ndo_hwtstamp_get)(struct net_device *, struct kernel_hwtstamp_config *);\n\tint (*ndo_hwtstamp_set)(struct net_device *, struct kernel_hwtstamp_config *, struct netlink_ext_ack *);\n};\n\nstruct net_device_path {\n\tenum net_device_path_type type;\n\tconst struct net_device *dev;\n\tunion {\n\t\tstruct {\n\t\t\tu16 id;\n\t\t\t__be16 proto;\n\t\t\tu8 h_dest[6];\n\t\t} encap;\n\t\tstruct {\n\t\t\tenum {\n\t\t\t\tDEV_PATH_BR_VLAN_KEEP = 0,\n\t\t\t\tDEV_PATH_BR_VLAN_TAG = 1,\n\t\t\t\tDEV_PATH_BR_VLAN_UNTAG = 2,\n\t\t\t\tDEV_PATH_BR_VLAN_UNTAG_HW = 3,\n\t\t\t} vlan_mode;\n\t\t\tu16 vlan_id;\n\t\t\t__be16 vlan_proto;\n\t\t} bridge;\n\t\tstruct {\n\t\t\tint port;\n\t\t\tu16 proto;\n\t\t} dsa;\n\t\tstruct {\n\t\t\tu8 wdma_idx;\n\t\t\tu8 queue;\n\t\t\tu16 wcid;\n\t\t\tu8 bss;\n\t\t\tu8 amsdu;\n\t\t} mtk_wdma;\n\t};\n};\n\nstruct net_device_path_ctx {\n\tconst struct net_device *dev;\n\tu8 daddr[6];\n\tint num_vlans;\n\tstruct {\n\t\tu16 id;\n\t\t__be16 proto;\n\t} vlan[2];\n};\n\nstruct net_device_path_stack {\n\tint num_paths;\n\tstruct net_device_path path[5];\n};\n\nstruct net_dm_drop_point {\n\t__u8 pc[8];\n\t__u32 count;\n};\n\nstruct net_dm_alert_msg {\n\t__u32 entries;\n\tstruct net_dm_drop_point points[0];\n};\n\nstruct net_dm_alert_ops {\n\tvoid (*kfree_skb_probe)(void *, struct sk_buff *, void *, enum skb_drop_reason, struct sock *);\n\tvoid (*napi_poll_probe)(void *, struct napi_struct *, int, int);\n\tvoid (*work_item_func)(struct work_struct *);\n\tvoid (*hw_work_item_func)(struct work_struct *);\n\tvoid (*hw_trap_probe)(void *, const struct devlink *, struct sk_buff *, const struct devlink_trap_metadata *);\n};\n\nstruct net_dm_hw_entry {\n\tchar trap_name[40];\n\tu32 count;\n};\n\nstruct net_dm_hw_entries {\n\tu32 num_entries;\n\tstruct net_dm_hw_entry entries[0];\n};\n\nstruct net_dm_skb_cb {\n\tunion {\n\t\tstruct devlink_trap_metadata *hw_metadata;\n\t\tvoid *pc;\n\t};\n\tenum skb_drop_reason reason;\n};\n\nstruct net_dm_stats {\n\tu64_stats_t dropped;\n\tstruct u64_stats_sync syncp;\n};\n\nstruct rtnl_link_stats64 {\n\t__u64 rx_packets;\n\t__u64 tx_packets;\n\t__u64 rx_bytes;\n\t__u64 tx_bytes;\n\t__u64 rx_errors;\n\t__u64 tx_errors;\n\t__u64 rx_dropped;\n\t__u64 tx_dropped;\n\t__u64 multicast;\n\t__u64 collisions;\n\t__u64 rx_length_errors;\n\t__u64 rx_over_errors;\n\t__u64 rx_crc_errors;\n\t__u64 rx_frame_errors;\n\t__u64 rx_fifo_errors;\n\t__u64 rx_missed_errors;\n\t__u64 tx_aborted_errors;\n\t__u64 tx_carrier_errors;\n\t__u64 tx_fifo_errors;\n\t__u64 tx_heartbeat_errors;\n\t__u64 tx_window_errors;\n\t__u64 rx_compressed;\n\t__u64 tx_compressed;\n\t__u64 rx_nohandler;\n\t__u64 rx_otherhost_dropped;\n};\n\nstruct net_failover_info {\n\tstruct net_device *primary_dev;\n\tstruct net_device *standby_dev;\n\tstruct rtnl_link_stats64 primary_stats;\n\tstruct rtnl_link_stats64 standby_stats;\n\tstruct rtnl_link_stats64 failover_stats;\n\tspinlock_t stats_lock;\n};\n\nstruct net_fill_args {\n\tu32 portid;\n\tu32 seq;\n\tint flags;\n\tint cmd;\n\tint nsid;\n\tbool add_ref;\n\tint ref_nsid;\n};\n\nstruct net_generic {\n\tunion {\n\t\tstruct {\n\t\t\tunsigned int len;\n\t\t\tstruct callback_head rcu;\n\t\t} s;\n\t\tstruct {\n\t\t\tstruct {} __empty_ptr;\n\t\t\tvoid *ptr[0];\n\t\t};\n\t};\n};\n\nstruct offload_callbacks {\n\tstruct sk_buff * (*gso_segment)(struct sk_buff *, netdev_features_t);\n\tstruct sk_buff * (*gro_receive)(struct list_head *, struct sk_buff *);\n\tint (*gro_complete)(struct sk_buff *, int);\n};\n\nstruct packet_offload {\n\t__be16 type;\n\tu16 priority;\n\tstruct offload_callbacks callbacks;\n\tstruct list_head list;\n};\n\nstruct net_offload {\n\tstruct offload_callbacks callbacks;\n\tunsigned int flags;\n\tu32 secret;\n};\n\nstruct net_protocol {\n\tint (*handler)(struct sk_buff *);\n\tint (*err_handler)(struct sk_buff *, u32);\n\tunsigned int no_policy: 1;\n\tunsigned int icmp_strict_tag_validation: 1;\n\tu32 secret;\n};\n\nstruct rps_sock_flow_table;\n\nstruct net_hotdata {\n\tstruct packet_offload ip_packet_offload;\n\tstruct net_offload tcpv4_offload;\n\tstruct net_protocol tcp_protocol;\n\tstruct net_offload udpv4_offload;\n\tstruct net_protocol udp_protocol;\n\tstruct packet_offload ipv6_packet_offload;\n\tstruct net_offload tcpv6_offload;\n\tstruct inet6_protocol tcpv6_protocol;\n\tstruct inet6_protocol udpv6_protocol;\n\tstruct net_offload udpv6_offload;\n\tstruct list_head offload_base;\n\tstruct list_head ptype_all;\n\tstruct kmem_cache *skbuff_cache;\n\tstruct kmem_cache *skbuff_fclone_cache;\n\tstruct kmem_cache *skb_small_head_cache;\n\tstruct rps_sock_flow_table *rps_sock_flow_table;\n\tu32 rps_cpu_mask;\n\tint gro_normal_batch;\n\tint netdev_budget;\n\tint netdev_budget_usecs;\n\tint tstamp_prequeue;\n\tint max_backlog;\n\tint dev_tx_weight;\n\tint dev_rx_weight;\n\tint sysctl_max_skb_frags;\n\tint sysctl_skb_defer_max;\n\tint sysctl_mem_pcpu_rsv;\n};\n\nstruct net_packet_attrs {\n\tconst unsigned char *src;\n\tconst unsigned char *dst;\n\tu32 ip_src;\n\tu32 ip_dst;\n\tbool tcp;\n\tu16 sport;\n\tu16 dport;\n\tint timeout;\n\tint size;\n\tint max_size;\n\tu8 id;\n\tu16 queue_mapping;\n};\n\nstruct net_proto_family {\n\tint family;\n\tint (*create)(struct net *, struct socket *, int, int);\n\tstruct module *owner;\n};\n\nstruct net_rate_estimator {\n\tstruct gnet_stats_basic_sync *bstats;\n\tspinlock_t *stats_lock;\n\tbool running;\n\tstruct gnet_stats_basic_sync *cpu_bstats;\n\tu8 ewma_log;\n\tu8 intvl_log;\n\tseqcount_t seq;\n\tu64 last_packets;\n\tu64 last_bytes;\n\tu64 avpps;\n\tu64 avbps;\n\tlong unsigned int next_jiffies;\n\tstruct timer_list timer;\n\tstruct callback_head rcu;\n};\n\nstruct net_test {\n\tchar name[32];\n\tint (*fn)(struct net_device *);\n};\n\nstruct net_test_priv {\n\tstruct net_packet_attrs *packet;\n\tstruct packet_type pt;\n\tstruct completion comp;\n\tint double_vlan;\n\tint vlan_id;\n\tint ok;\n};\n\nstruct netconfmsg {\n\t__u8 ncm_family;\n};\n\nstruct netdev_adjacent {\n\tstruct net_device *dev;\n\tnetdevice_tracker dev_tracker;\n\tbool master;\n\tbool ignore;\n\tu16 ref_nr;\n\tvoid *private;\n\tstruct list_head list;\n\tstruct callback_head rcu;\n};\n\nstruct netdev_bonding_info {\n\tifslave slave;\n\tifbond master;\n};\n\nstruct xsk_buff_pool;\n\nstruct netdev_bpf {\n\tenum bpf_netdev_command command;\n\tunion {\n\t\tstruct {\n\t\t\tu32 flags;\n\t\t\tstruct bpf_prog *prog;\n\t\t\tstruct netlink_ext_ack *extack;\n\t\t};\n\t\tstruct {\n\t\t\tstruct bpf_offloaded_map *offmap;\n\t\t};\n\t\tstruct {\n\t\t\tstruct xsk_buff_pool *pool;\n\t\t\tu16 queue_id;\n\t\t} xsk;\n\t};\n};\n\nstruct netdev_fcoe_hbainfo {\n\tchar manufacturer[64];\n\tchar serial_number[64];\n\tchar hardware_version[64];\n\tchar driver_version[64];\n\tchar optionrom_version[64];\n\tchar firmware_version[64];\n\tchar model[256];\n\tchar model_description[256];\n};\n\nstruct netdev_hw_addr {\n\tstruct list_head list;\n\tstruct rb_node node;\n\tunsigned char addr[32];\n\tunsigned char type;\n\tbool global_use;\n\tint sync_cnt;\n\tint refcount;\n\tint synced;\n\tstruct callback_head callback_head;\n};\n\nstruct netdev_lag_lower_state_info {\n\tu8 link_up: 1;\n\tu8 tx_enabled: 1;\n};\n\nstruct netdev_lag_upper_info {\n\tenum netdev_lag_tx_type tx_type;\n\tenum netdev_lag_hash hash_type;\n};\n\nstruct netdev_name_node {\n\tstruct hlist_node hlist;\n\tstruct list_head list;\n\tstruct net_device *dev;\n\tconst char *name;\n\tstruct callback_head rcu;\n};\n\nstruct netdev_nested_priv {\n\tunsigned char flags;\n\tvoid *data;\n};\n\nstruct netdev_net_notifier {\n\tstruct list_head list;\n\tstruct notifier_block *nb;\n};\n\nstruct netdev_nl_dump_ctx {\n\tlong unsigned int ifindex;\n\tunsigned int rxq_idx;\n\tunsigned int txq_idx;\n\tunsigned int napi_id;\n};\n\nstruct netdev_notifier_info {\n\tstruct net_device *dev;\n\tstruct netlink_ext_ack *extack;\n};\n\nstruct netdev_notifier_bonding_info {\n\tstruct netdev_notifier_info info;\n\tstruct netdev_bonding_info bonding_info;\n};\n\nstruct netdev_notifier_change_info {\n\tstruct netdev_notifier_info info;\n\tunsigned int flags_changed;\n};\n\nstruct netdev_notifier_changelowerstate_info {\n\tstruct netdev_notifier_info info;\n\tvoid *lower_state_info;\n};\n\nstruct netdev_notifier_changeupper_info {\n\tstruct netdev_notifier_info info;\n\tstruct net_device *upper_dev;\n\tbool master;\n\tbool linking;\n\tvoid *upper_info;\n};\n\nstruct netdev_notifier_info_ext {\n\tstruct netdev_notifier_info info;\n\tunion {\n\t\tu32 mtu;\n\t} ext;\n};\n\nstruct netdev_notifier_offload_xstats_rd;\n\nstruct netdev_notifier_offload_xstats_ru;\n\nstruct netdev_notifier_offload_xstats_info {\n\tstruct netdev_notifier_info info;\n\tenum netdev_offload_xstats_type type;\n\tunion {\n\t\tstruct netdev_notifier_offload_xstats_rd *report_delta;\n\t\tstruct netdev_notifier_offload_xstats_ru *report_used;\n\t};\n};\n\nstruct rtnl_hw_stats64 {\n\t__u64 rx_packets;\n\t__u64 tx_packets;\n\t__u64 rx_bytes;\n\t__u64 tx_bytes;\n\t__u64 rx_errors;\n\t__u64 tx_errors;\n\t__u64 rx_dropped;\n\t__u64 tx_dropped;\n\t__u64 multicast;\n};\n\nstruct netdev_notifier_offload_xstats_rd {\n\tstruct rtnl_hw_stats64 stats;\n\tbool used;\n};\n\nstruct netdev_notifier_offload_xstats_ru {\n\tbool used;\n};\n\nstruct netdev_notifier_pre_changeaddr_info {\n\tstruct netdev_notifier_info info;\n\tconst unsigned char *dev_addr;\n};\n\nstruct netdev_queue {\n\tstruct net_device *dev;\n\tnetdevice_tracker dev_tracker;\n\tstruct Qdisc *qdisc;\n\tstruct Qdisc *qdisc_sleeping;\n\tstruct kobject kobj;\n\tint numa_node;\n\tlong unsigned int tx_maxrate;\n\tatomic_long_t trans_timeout;\n\tstruct net_device *sb_dev;\n\tstruct xsk_buff_pool *pool;\n\tstruct napi_struct *napi;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tspinlock_t _xmit_lock;\n\tint xmit_lock_owner;\n\tlong unsigned int trans_start;\n\tlong unsigned int state;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tstruct dql dql;\n};\n\nstruct netdev_queue_attribute {\n\tstruct attribute attr;\n\tssize_t (*show)(struct netdev_queue *, char *);\n\tssize_t (*store)(struct netdev_queue *, const char *, size_t);\n};\n\nstruct netdev_queue_mgmt_ops {\n\tsize_t ndo_queue_mem_size;\n\tint (*ndo_queue_mem_alloc)(struct net_device *, void *, int);\n\tvoid (*ndo_queue_mem_free)(struct net_device *, void *);\n\tint (*ndo_queue_start)(struct net_device *, void *, int);\n\tint (*ndo_queue_stop)(struct net_device *, void *, int);\n};\n\nstruct netdev_queue_stats_rx {\n\tu64 bytes;\n\tu64 packets;\n\tu64 alloc_fail;\n\tu64 hw_drops;\n\tu64 hw_drop_overruns;\n\tu64 csum_unnecessary;\n\tu64 csum_none;\n\tu64 csum_bad;\n\tu64 hw_gro_packets;\n\tu64 hw_gro_bytes;\n\tu64 hw_gro_wire_packets;\n\tu64 hw_gro_wire_bytes;\n\tu64 hw_drop_ratelimits;\n};\n\nstruct netdev_queue_stats_tx {\n\tu64 bytes;\n\tu64 packets;\n\tu64 hw_drops;\n\tu64 hw_drop_errors;\n\tu64 csum_none;\n\tu64 needs_csum;\n\tu64 hw_gso_packets;\n\tu64 hw_gso_bytes;\n\tu64 hw_gso_wire_packets;\n\tu64 hw_gso_wire_bytes;\n\tu64 hw_drop_ratelimits;\n\tu64 stop;\n\tu64 wake;\n};\n\nstruct xdp_mem_info {\n\tu32 type;\n\tu32 id;\n};\n\nstruct xdp_rxq_info {\n\tstruct net_device *dev;\n\tu32 queue_index;\n\tu32 reg_state;\n\tstruct xdp_mem_info mem;\n\tunsigned int napi_id;\n\tu32 frag_size;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct rps_map;\n\nstruct rps_dev_flow_table;\n\nstruct netdev_rx_queue {\n\tstruct xdp_rxq_info xdp_rxq;\n\tstruct rps_map *rps_map;\n\tstruct rps_dev_flow_table *rps_flow_table;\n\tstruct kobject kobj;\n\tstruct net_device *dev;\n\tnetdevice_tracker dev_tracker;\n\tstruct xsk_buff_pool *pool;\n\tstruct napi_struct *napi;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct netdev_stat_ops {\n\tvoid (*get_queue_stats_rx)(struct net_device *, int, struct netdev_queue_stats_rx *);\n\tvoid (*get_queue_stats_tx)(struct net_device *, int, struct netdev_queue_stats_tx *);\n\tvoid (*get_base_stats)(struct net_device *, struct netdev_queue_stats_rx *, struct netdev_queue_stats_tx *);\n};\n\nstruct netdev_xmit {\n\tu16 recursion;\n\tu8 more;\n\tu8 skip_txqueue;\n};\n\nstruct netevent_redirect {\n\tstruct dst_entry *old;\n\tstruct dst_entry *new;\n\tstruct neighbour *neigh;\n\tconst void *daddr;\n};\n\nstruct netfront_cb {\n\tint pull_to;\n};\n\nstruct netfront_queue;\n\nstruct netfront_stats;\n\nstruct netfront_info {\n\tstruct list_head list;\n\tstruct net_device *netdev;\n\tstruct xenbus_device *xbdev;\n\tstruct netfront_queue *queues;\n\tstruct netfront_stats *rx_stats;\n\tstruct netfront_stats *tx_stats;\n\tbool netback_has_xdp_headroom;\n\tbool netfront_xdp_enabled;\n\tbool broken;\n\tbool bounce;\n\tatomic_t rx_gso_checksum_fixup;\n};\n\nstruct xen_netif_tx_sring;\n\nstruct xen_netif_tx_front_ring {\n\tRING_IDX req_prod_pvt;\n\tRING_IDX rsp_cons;\n\tunsigned int nr_ents;\n\tstruct xen_netif_tx_sring *sring;\n};\n\nstruct xen_netif_rx_sring;\n\nstruct xen_netif_rx_front_ring {\n\tRING_IDX req_prod_pvt;\n\tRING_IDX rsp_cons;\n\tunsigned int nr_ents;\n\tstruct xen_netif_rx_sring *sring;\n};\n\nstruct netfront_queue {\n\tunsigned int id;\n\tchar name[22];\n\tstruct netfront_info *info;\n\tstruct bpf_prog *xdp_prog;\n\tstruct napi_struct napi;\n\tunsigned int tx_evtchn;\n\tunsigned int rx_evtchn;\n\tunsigned int tx_irq;\n\tunsigned int rx_irq;\n\tchar tx_irq_name[25];\n\tchar rx_irq_name[25];\n\tspinlock_t tx_lock;\n\tstruct xen_netif_tx_front_ring tx;\n\tint tx_ring_ref;\n\tstruct sk_buff *tx_skbs[256];\n\tshort unsigned int tx_link[256];\n\tgrant_ref_t gref_tx_head;\n\tgrant_ref_t grant_tx_ref[256];\n\tstruct page *grant_tx_page[256];\n\tunsigned int tx_skb_freelist;\n\tunsigned int tx_pend_queue;\n\tlong: 64;\n\tspinlock_t rx_lock;\n\tstruct xen_netif_rx_front_ring rx;\n\tint rx_ring_ref;\n\tstruct timer_list rx_refill_timer;\n\tstruct sk_buff *rx_skbs[256];\n\tgrant_ref_t gref_rx_head;\n\tgrant_ref_t grant_rx_ref[256];\n\tunsigned int rx_rsp_unconsumed;\n\tspinlock_t rx_cons_lock;\n\tstruct page_pool *page_pool;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tstruct xdp_rxq_info xdp_rxq;\n};\n\nstruct xen_netif_rx_response {\n\tuint16_t id;\n\tuint16_t offset;\n\tuint16_t flags;\n\tint16_t status;\n};\n\nstruct xen_netif_extra_info {\n\tuint8_t type;\n\tuint8_t flags;\n\tunion {\n\t\tstruct {\n\t\t\tuint16_t size;\n\t\t\tuint8_t type;\n\t\t\tuint8_t pad;\n\t\t\tuint16_t features;\n\t\t} gso;\n\t\tstruct {\n\t\t\tuint8_t addr[6];\n\t\t} mcast;\n\t\tstruct {\n\t\t\tuint8_t type;\n\t\t\tuint8_t algorithm;\n\t\t\tuint8_t value[4];\n\t\t} hash;\n\t\tstruct {\n\t\t\tuint16_t headroom;\n\t\t\tuint16_t pad[2];\n\t\t} xdp;\n\t\tuint16_t pad[3];\n\t} u;\n};\n\nstruct netfront_rx_info {\n\tstruct xen_netif_rx_response rx;\n\tstruct xen_netif_extra_info extras[5];\n};\n\nstruct netfront_stats {\n\tu64 packets;\n\tu64 bytes;\n\tstruct u64_stats_sync syncp;\n};\n\nstruct netif_security_struct {\n\tstruct net *ns;\n\tint ifindex;\n\tu32 sid;\n};\n\nstruct netkit {\n\tstruct net_device *peer;\n\tstruct bpf_mprog_entry *active;\n\tenum netkit_action policy;\n\tenum netkit_scrub scrub;\n\tstruct bpf_mprog_bundle bundle;\n\tenum netkit_mode mode;\n\tbool primary;\n\tu32 headroom;\n};\n\nstruct netkit_link {\n\tstruct bpf_link link;\n\tstruct net_device *dev;\n\tu32 location;\n};\n\nstruct netlbl_af4list {\n\t__be32 addr;\n\t__be32 mask;\n\tu32 valid;\n\tstruct list_head list;\n};\n\nstruct netlbl_af6list {\n\tstruct in6_addr addr;\n\tstruct in6_addr mask;\n\tu32 valid;\n\tstruct list_head list;\n};\n\nstruct netlbl_audit {\n\tstruct lsmblob blob;\n\tkuid_t loginuid;\n\tunsigned int sessionid;\n};\n\nstruct netlbl_calipso_doiwalk_arg {\n\tstruct netlink_callback *nl_cb;\n\tstruct sk_buff *skb;\n\tu32 seq;\n};\n\nstruct netlbl_lsm_secattr;\n\nstruct netlbl_calipso_ops {\n\tint (*doi_add)(struct calipso_doi *, struct netlbl_audit *);\n\tvoid (*doi_free)(struct calipso_doi *);\n\tint (*doi_remove)(u32, struct netlbl_audit *);\n\tstruct calipso_doi * (*doi_getdef)(u32);\n\tvoid (*doi_putdef)(struct calipso_doi *);\n\tint (*doi_walk)(u32 *, int (*)(struct calipso_doi *, void *), void *);\n\tint (*sock_getattr)(struct sock *, struct netlbl_lsm_secattr *);\n\tint (*sock_setattr)(struct sock *, const struct calipso_doi *, const struct netlbl_lsm_secattr *);\n\tvoid (*sock_delattr)(struct sock *);\n\tint (*req_setattr)(struct request_sock *, const struct calipso_doi *, const struct netlbl_lsm_secattr *);\n\tvoid (*req_delattr)(struct request_sock *);\n\tint (*opt_getattr)(const unsigned char *, struct netlbl_lsm_secattr *);\n\tunsigned char * (*skbuff_optptr)(const struct sk_buff *);\n\tint (*skbuff_setattr)(struct sk_buff *, const struct calipso_doi *, const struct netlbl_lsm_secattr *);\n\tint (*skbuff_delattr)(struct sk_buff *);\n\tvoid (*cache_invalidate)(void);\n\tint (*cache_add)(const unsigned char *, const struct netlbl_lsm_secattr *);\n};\n\nstruct netlbl_cipsov4_doiwalk_arg {\n\tstruct netlink_callback *nl_cb;\n\tstruct sk_buff *skb;\n\tu32 seq;\n};\n\nstruct netlbl_domaddr_map;\n\nstruct netlbl_dommap_def {\n\tu32 type;\n\tunion {\n\t\tstruct netlbl_domaddr_map *addrsel;\n\t\tstruct cipso_v4_doi *cipso;\n\t\tstruct calipso_doi *calipso;\n\t};\n};\n\nstruct netlbl_dom_map {\n\tchar *domain;\n\tstruct netlbl_dommap_def def;\n\tu16 family;\n\tu32 valid;\n\tstruct list_head list;\n\tstruct callback_head rcu;\n};\n\nstruct netlbl_domaddr4_map {\n\tstruct netlbl_dommap_def def;\n\tstruct netlbl_af4list list;\n};\n\nstruct netlbl_domaddr6_map {\n\tstruct netlbl_dommap_def def;\n\tstruct netlbl_af6list list;\n};\n\nstruct netlbl_domaddr_map {\n\tstruct list_head list4;\n\tstruct list_head list6;\n};\n\nstruct netlbl_domhsh_tbl {\n\tstruct list_head *tbl;\n\tu32 size;\n};\n\nstruct netlbl_domhsh_walk_arg {\n\tstruct netlink_callback *nl_cb;\n\tstruct sk_buff *skb;\n\tu32 seq;\n};\n\nstruct netlbl_domhsh_walk_arg___2 {\n\tstruct netlbl_audit *audit_info;\n\tu32 doi;\n};\n\nstruct netlbl_lsm_cache {\n\trefcount_t refcount;\n\tvoid (*free)(const void *);\n\tvoid *data;\n};\n\nstruct netlbl_lsm_catmap {\n\tu32 startbit;\n\tu64 bitmap[4];\n\tstruct netlbl_lsm_catmap *next;\n};\n\nstruct netlbl_lsm_secattr {\n\tu32 flags;\n\tu32 type;\n\tchar *domain;\n\tstruct netlbl_lsm_cache *cache;\n\tstruct {\n\t\tstruct {\n\t\t\tstruct netlbl_lsm_catmap *cat;\n\t\t\tu32 lvl;\n\t\t} mls;\n\t\tu32 secid;\n\t} attr;\n};\n\nstruct netlbl_unlhsh_addr4 {\n\tu32 secid;\n\tstruct netlbl_af4list list;\n\tstruct callback_head rcu;\n};\n\nstruct netlbl_unlhsh_addr6 {\n\tu32 secid;\n\tstruct netlbl_af6list list;\n\tstruct callback_head rcu;\n};\n\nstruct netlbl_unlhsh_iface {\n\tint ifindex;\n\tstruct list_head addr4_list;\n\tstruct list_head addr6_list;\n\tu32 valid;\n\tstruct list_head list;\n\tstruct callback_head rcu;\n};\n\nstruct netlbl_unlhsh_tbl {\n\tstruct list_head *tbl;\n\tu32 size;\n};\n\nstruct netlbl_unlhsh_walk_arg {\n\tstruct netlink_callback *nl_cb;\n\tstruct sk_buff *skb;\n\tu32 seq;\n};\n\nstruct netlink_broadcast_data {\n\tstruct sock *exclude_sk;\n\tstruct net *net;\n\tu32 portid;\n\tu32 group;\n\tint failure;\n\tint delivery_failure;\n\tint congested;\n\tint delivered;\n\tgfp_t allocation;\n\tstruct sk_buff *skb;\n\tstruct sk_buff *skb2;\n\tint (*tx_filter)(struct sock *, struct sk_buff *, void *);\n\tvoid *tx_data;\n};\n\nstruct netlink_callback {\n\tstruct sk_buff *skb;\n\tconst struct nlmsghdr *nlh;\n\tint (*dump)(struct sk_buff *, struct netlink_callback *);\n\tint (*done)(struct netlink_callback *);\n\tvoid *data;\n\tstruct module *module;\n\tstruct netlink_ext_ack *extack;\n\tu16 family;\n\tu16 answer_flags;\n\tu32 min_dump_alloc;\n\tunsigned int prev_seq;\n\tunsigned int seq;\n\tint flags;\n\tbool strict_check;\n\tunion {\n\t\tu8 ctx[48];\n\t\tlong int args[6];\n\t};\n};\n\nstruct netlink_compare_arg {\n\tpossible_net_t pnet;\n\tu32 portid;\n};\n\nstruct netlink_dump_control {\n\tint (*start)(struct netlink_callback *);\n\tint (*dump)(struct sk_buff *, struct netlink_callback *);\n\tint (*done)(struct netlink_callback *);\n\tstruct netlink_ext_ack *extack;\n\tvoid *data;\n\tstruct module *module;\n\tu32 min_dump_alloc;\n\tint flags;\n};\n\nstruct netlink_ext_ack {\n\tconst char *_msg;\n\tconst struct nlattr *bad_attr;\n\tconst struct nla_policy *policy;\n\tconst struct nlattr *miss_nest;\n\tu16 miss_type;\n\tu8 cookie[20];\n\tu8 cookie_len;\n\tchar _msg_buf[80];\n};\n\nstruct netlink_kernel_cfg {\n\tunsigned int groups;\n\tunsigned int flags;\n\tvoid (*input)(struct sk_buff *);\n\tint (*bind)(struct net *, int);\n\tvoid (*unbind)(struct net *, int);\n\tvoid (*release)(struct sock *, long unsigned int *);\n};\n\nstruct netlink_notify {\n\tstruct net *net;\n\tu32 portid;\n\tint protocol;\n};\n\nstruct netlink_policy_dump_state {\n\tunsigned int policy_idx;\n\tunsigned int attr_idx;\n\tunsigned int n_alloc;\n\tstruct {\n\t\tconst struct nla_policy *policy;\n\t\tunsigned int maxtype;\n\t} policies[0];\n};\n\nstruct netlink_range_validation {\n\tu64 min;\n\tu64 max;\n};\n\nstruct netlink_range_validation_signed {\n\ts64 min;\n\ts64 max;\n};\n\nstruct netlink_set_err_data {\n\tstruct sock *exclude_sk;\n\tu32 portid;\n\tu32 group;\n\tint code;\n};\n\nstruct scm_creds {\n\tu32 pid;\n\tkuid_t uid;\n\tkgid_t gid;\n};\n\nstruct netlink_skb_parms {\n\tstruct scm_creds creds;\n\t__u32 portid;\n\t__u32 dst_group;\n\t__u32 flags;\n\tstruct sock *sk;\n\tbool nsid_is_set;\n\tint nsid;\n};\n\nstruct netlink_sock {\n\tstruct sock sk;\n\tlong unsigned int flags;\n\tu32 portid;\n\tu32 dst_portid;\n\tu32 dst_group;\n\tu32 subscriptions;\n\tu32 ngroups;\n\tlong unsigned int *groups;\n\tlong unsigned int state;\n\tsize_t max_recvmsg_len;\n\twait_queue_head_t wait;\n\tbool bound;\n\tbool cb_running;\n\tint dump_done_errno;\n\tstruct netlink_callback cb;\n\tstruct mutex nl_cb_mutex;\n\tstruct mutex *dump_cb_mutex;\n\tvoid (*netlink_rcv)(struct sk_buff *);\n\tint (*netlink_bind)(struct net *, int);\n\tvoid (*netlink_unbind)(struct net *, int);\n\tvoid (*netlink_release)(struct sock *, long unsigned int *);\n\tstruct module *module;\n\tstruct rhash_head node;\n\tstruct callback_head rcu;\n};\n\nstruct netlink_table {\n\tstruct rhashtable hash;\n\tstruct hlist_head mc_list;\n\tstruct listeners *listeners;\n\tunsigned int flags;\n\tunsigned int groups;\n\tstruct mutex *cb_mutex;\n\tstruct module *module;\n\tint (*bind)(struct net *, int);\n\tvoid (*unbind)(struct net *, int);\n\tvoid (*release)(struct sock *, long unsigned int *);\n\tint registered;\n};\n\nstruct netlink_tap {\n\tstruct net_device *dev;\n\tstruct module *module;\n\tstruct list_head list;\n};\n\nstruct netlink_tap_net {\n\tstruct list_head netlink_tap_all;\n\tstruct mutex netlink_tap_lock;\n};\n\nstruct netnode_security_struct {\n\tunion {\n\t\t__be32 ipv4;\n\t\tstruct in6_addr ipv6;\n\t} addr;\n\tu32 sid;\n\tu16 family;\n};\n\nstruct netpoll {\n\tstruct net_device *dev;\n\tnetdevice_tracker dev_tracker;\n\tchar dev_name[16];\n\tconst char *name;\n\tunion inet_addr local_ip;\n\tunion inet_addr remote_ip;\n\tbool ipv6;\n\tu16 local_port;\n\tu16 remote_port;\n\tu8 remote_mac[6];\n};\n\nstruct netpoll_info {\n\trefcount_t refcnt;\n\tstruct semaphore dev_lock;\n\tstruct sk_buff_head txq;\n\tstruct delayed_work tx_work;\n\tstruct netpoll *netpoll;\n\tstruct callback_head rcu;\n};\n\nstruct netport_security_struct {\n\tu32 sid;\n\tu16 port;\n\tu8 protocol;\n};\n\nstruct netprio_map {\n\tstruct callback_head rcu;\n\tu32 priomap_len;\n\tu32 priomap[0];\n};\n\nstruct netsfhdr {\n\t__be32 version;\n\t__be64 magic;\n\tu8 id;\n} __attribute__((packed));\n\nstruct new_utsname {\n\tchar sysname[65];\n\tchar nodename[65];\n\tchar release[65];\n\tchar version[65];\n\tchar machine[65];\n\tchar domainname[65];\n};\n\nstruct nh_info;\n\nstruct nh_group;\n\nstruct nexthop {\n\tstruct rb_node rb_node;\n\tstruct list_head fi_list;\n\tstruct list_head f6i_list;\n\tstruct list_head fdb_list;\n\tstruct list_head grp_list;\n\tstruct net *net;\n\tu32 id;\n\tu8 protocol;\n\tu8 nh_flags;\n\tbool is_group;\n\trefcount_t refcnt;\n\tstruct callback_head rcu;\n\tunion {\n\t\tstruct nh_info *nh_info;\n\t\tstruct nh_group *nh_grp;\n\t};\n};\n\nstruct nexthop_grp {\n\t__u32 id;\n\t__u8 weight;\n\t__u8 resvd1;\n\t__u16 resvd2;\n};\n\nstruct nf_bridge_info {\n\tenum {\n\t\tBRNF_PROTO_UNCHANGED = 0,\n\t\tBRNF_PROTO_8021Q = 1,\n\t\tBRNF_PROTO_PPPOE = 2,\n\t} orig_proto: 8;\n\tu8 pkt_otherhost: 1;\n\tu8 in_prerouting: 1;\n\tu8 bridged_dnat: 1;\n\tu8 sabotage_in_done: 1;\n\t__u16 frag_max_size;\n\tint physinif;\n\tstruct net_device *physoutdev;\n\tunion {\n\t\t__be32 ipv4_daddr;\n\t\tstruct in6_addr ipv6_daddr;\n\t\tchar neigh_header[8];\n\t};\n};\n\nstruct nf_conntrack {\n\trefcount_t use;\n};\n\nstruct nf_conntrack_zone {\n\tu16 id;\n\tu8 flags;\n\tu8 dir;\n};\n\nunion nf_inet_addr {\n\t__u32 all[4];\n\t__be32 ip;\n\t__be32 ip6[4];\n\tstruct in_addr in;\n\tstruct in6_addr in6;\n};\n\nunion nf_conntrack_man_proto {\n\t__be16 all;\n\tstruct {\n\t\t__be16 port;\n\t} tcp;\n\tstruct {\n\t\t__be16 port;\n\t} udp;\n\tstruct {\n\t\t__be16 id;\n\t} icmp;\n\tstruct {\n\t\t__be16 port;\n\t} dccp;\n\tstruct {\n\t\t__be16 port;\n\t} sctp;\n\tstruct {\n\t\t__be16 key;\n\t} gre;\n};\n\nstruct nf_conntrack_man {\n\tunion nf_inet_addr u3;\n\tunion nf_conntrack_man_proto u;\n\tu_int16_t l3num;\n};\n\nstruct nf_conntrack_tuple {\n\tstruct nf_conntrack_man src;\n\tstruct {\n\t\tunion nf_inet_addr u3;\n\t\tunion {\n\t\t\t__be16 all;\n\t\t\tstruct {\n\t\t\t\t__be16 port;\n\t\t\t} tcp;\n\t\t\tstruct {\n\t\t\t\t__be16 port;\n\t\t\t} udp;\n\t\t\tstruct {\n\t\t\t\tu_int8_t type;\n\t\t\t\tu_int8_t code;\n\t\t\t} icmp;\n\t\t\tstruct {\n\t\t\t\t__be16 port;\n\t\t\t} dccp;\n\t\t\tstruct {\n\t\t\t\t__be16 port;\n\t\t\t} sctp;\n\t\t\tstruct {\n\t\t\t\t__be16 key;\n\t\t\t} gre;\n\t\t} u;\n\t\tu_int8_t protonum;\n\t\tstruct {} __nfct_hash_offsetend;\n\t\tu_int8_t dir;\n\t} dst;\n};\n\nstruct nf_conntrack_tuple_hash {\n\tstruct hlist_nulls_node hnnode;\n\tstruct nf_conntrack_tuple tuple;\n};\n\nstruct nf_ct_dccp {\n\tu_int8_t role[2];\n\tu_int8_t state;\n\tu_int8_t last_pkt;\n\tu_int8_t last_dir;\n\tu_int64_t handshake_seq;\n};\n\nstruct nf_ct_udp {\n\tlong unsigned int stream_ts;\n};\n\nstruct nf_ct_gre {\n\tunsigned int stream_timeout;\n\tunsigned int timeout;\n};\n\nunion nf_conntrack_proto {\n\tstruct nf_ct_dccp dccp;\n\tstruct ip_ct_sctp sctp;\n\tstruct ip_ct_tcp tcp;\n\tstruct nf_ct_udp udp;\n\tstruct nf_ct_gre gre;\n\tunsigned int tmpl_padto;\n};\n\nstruct nf_ct_ext;\n\nstruct nf_conn {\n\tstruct nf_conntrack ct_general;\n\tspinlock_t lock;\n\tu32 timeout;\n\tstruct nf_conntrack_zone zone;\n\tstruct nf_conntrack_tuple_hash tuplehash[2];\n\tlong unsigned int status;\n\tpossible_net_t ct_net;\n\tstruct hlist_node nat_bysource;\n\tstruct {} __nfct_init_offset;\n\tstruct nf_conn *master;\n\tu_int32_t mark;\n\tu_int32_t secmark;\n\tstruct nf_ct_ext *ext;\n\tunion nf_conntrack_proto proto;\n};\n\nstruct nf_conn___init {\n\tstruct nf_conn ct;\n};\n\nstruct nf_conn_labels {\n\tlong unsigned int bits[2];\n};\n\nstruct nf_conntrack_tuple_mask {\n\tstruct {\n\t\tunion nf_inet_addr u3;\n\t\tunion nf_conntrack_man_proto u;\n\t} src;\n};\n\nstruct nf_conntrack_helper;\n\nstruct nf_conntrack_expect {\n\tstruct hlist_node lnode;\n\tstruct hlist_node hnode;\n\tstruct nf_conntrack_tuple tuple;\n\tstruct nf_conntrack_tuple_mask mask;\n\trefcount_t use;\n\tunsigned int flags;\n\tunsigned int class;\n\tvoid (*expectfn)(struct nf_conn *, struct nf_conntrack_expect *);\n\tstruct nf_conntrack_helper *helper;\n\tstruct nf_conn *master;\n\tstruct timer_list timeout;\n\tunion nf_inet_addr saved_addr;\n\tunion nf_conntrack_man_proto saved_proto;\n\tenum ip_conntrack_dir dir;\n\tstruct callback_head rcu;\n};\n\nstruct nf_ct_event {\n\tstruct nf_conn *ct;\n\tu32 portid;\n\tint report;\n};\n\nstruct nf_exp_event;\n\nstruct nf_ct_event_notifier {\n\tint (*ct_event)(unsigned int, const struct nf_ct_event *);\n\tint (*exp_event)(unsigned int, const struct nf_exp_event *);\n};\n\nstruct nf_ct_ext {\n\tu8 offset[10];\n\tu8 len;\n\tunsigned int gen_id;\n\tchar data[0];\n};\n\nstruct nf_ct_hook {\n\tint (*update)(struct net *, struct sk_buff *);\n\tvoid (*destroy)(struct nf_conntrack *);\n\tbool (*get_tuple_skb)(struct nf_conntrack_tuple *, const struct sk_buff *);\n\tvoid (*attach)(struct sk_buff *, const struct sk_buff *);\n\tvoid (*set_closing)(struct nf_conntrack *);\n\tint (*confirm)(struct sk_buff *);\n};\n\nstruct nf_defrag_hook {\n\tstruct module *owner;\n\tint (*enable)(struct net *);\n\tvoid (*disable)(struct net *);\n};\n\nstruct nf_exp_event {\n\tstruct nf_conntrack_expect *exp;\n\tu32 portid;\n\tint report;\n};\n\nstruct nf_flow_table_stat {\n\tunsigned int count_wq_add;\n\tunsigned int count_wq_del;\n\tunsigned int count_wq_stats;\n};\n\nstruct nf_hook_entry {\n\tnf_hookfn *hook;\n\tvoid *priv;\n};\n\nstruct nf_hook_entries {\n\tu16 num_hook_entries;\n\tstruct nf_hook_entry hooks[0];\n};\n\nstruct nf_hook_entries_rcu_head {\n\tstruct callback_head head;\n\tvoid *allocation;\n};\n\nstruct nf_hook_state {\n\tu8 hook;\n\tu8 pf;\n\tstruct net_device *in;\n\tstruct net_device *out;\n\tstruct sock *sk;\n\tstruct net *net;\n\tint (*okfn)(struct net *, struct sock *, struct sk_buff *);\n};\n\nstruct nf_queue_entry;\n\nstruct nf_ipv6_ops {\n\tvoid (*route_input)(struct sk_buff *);\n\tint (*fragment)(struct net *, struct sock *, struct sk_buff *, int (*)(struct net *, struct sock *, struct sk_buff *));\n\tint (*reroute)(struct sk_buff *, const struct nf_queue_entry *);\n};\n\nstruct nf_log_buf {\n\tunsigned int count;\n\tchar buf[1020];\n};\n\nstruct nf_loginfo;\n\ntypedef void nf_logfn(struct net *, u_int8_t, unsigned int, const struct sk_buff *, const struct net_device *, const struct net_device *, const struct nf_loginfo *, const char *);\n\nstruct nf_logger {\n\tchar *name;\n\tenum nf_log_type type;\n\tnf_logfn *logfn;\n\tstruct module *me;\n};\n\nstruct nf_loginfo {\n\tu_int8_t type;\n\tunion {\n\t\tstruct {\n\t\t\tu_int32_t copy_len;\n\t\t\tu_int16_t group;\n\t\t\tu_int16_t qthreshold;\n\t\t\tu_int16_t flags;\n\t\t} ulog;\n\t\tstruct {\n\t\t\tu_int8_t level;\n\t\t\tu_int8_t logflags;\n\t\t} log;\n\t} u;\n};\n\nstruct nf_nat_hook {\n\tint (*parse_nat_setup)(struct nf_conn *, enum nf_nat_manip_type, const struct nlattr *);\n\tvoid (*decode_session)(struct sk_buff *, struct flowi *);\n\tunsigned int (*manip_pkt)(struct sk_buff *, struct nf_conn *, enum nf_nat_manip_type, enum ip_conntrack_dir);\n\tvoid (*remove_nat_bysrc)(struct nf_conn *);\n};\n\nstruct nf_queue_entry {\n\tstruct list_head list;\n\tstruct sk_buff *skb;\n\tunsigned int id;\n\tunsigned int hook_index;\n\tstruct net_device *physin;\n\tstruct net_device *physout;\n\tstruct nf_hook_state state;\n\tu16 size;\n};\n\nstruct nf_queue_handler {\n\tint (*outfn)(struct nf_queue_entry *, unsigned int);\n\tvoid (*nf_hook_drop)(struct net *);\n};\n\nstruct nf_sockopt_ops {\n\tstruct list_head list;\n\tu_int8_t pf;\n\tint set_optmin;\n\tint set_optmax;\n\tint (*set)(struct sock *, int, sockptr_t, unsigned int);\n\tint get_optmin;\n\tint get_optmax;\n\tint (*get)(struct sock *, int, void *, int *);\n\tstruct module *owner;\n};\n\nstruct nfnl_ct_hook {\n\tsize_t (*build_size)(const struct nf_conn *);\n\tint (*build)(struct sk_buff *, struct nf_conn *, enum ip_conntrack_info, u_int16_t, u_int16_t);\n\tint (*parse)(const struct nlattr *, struct nf_conn *);\n\tint (*attach_expect)(const struct nlattr *, struct nf_conn *, u32, u32);\n\tvoid (*seq_adjust)(struct sk_buff *, struct nf_conn *, enum ip_conntrack_info, s32);\n};\n\nstruct nfstime4 {\n\tu64 seconds;\n\tu32 nseconds;\n};\n\nstruct nfs41_impl_id {\n\tchar domain[1025];\n\tchar name[1025];\n\tstruct nfstime4 date;\n};\n\nstruct nfs41_server_owner {\n\tuint64_t minor_id;\n\tuint32_t major_id_sz;\n\tchar major_id[1024];\n};\n\nstruct nfs41_server_scope {\n\tuint32_t server_scope_sz;\n\tchar server_scope[1024];\n};\n\nstruct nfs4_change_info {\n\tu32 atomic;\n\tu64 before;\n\tu64 after;\n};\n\nstruct nfs4_string {\n\tunsigned int len;\n\tchar *data;\n};\n\nstruct nfs4_pathname {\n\tunsigned int ncomponents;\n\tstruct nfs4_string components[512];\n};\n\nstruct nfs4_fs_location {\n\tunsigned int nservers;\n\tstruct nfs4_string servers[10];\n\tstruct nfs4_pathname rootpath;\n};\n\nstruct nfs_fattr;\n\nstruct nfs_server;\n\nstruct nfs4_fs_locations {\n\tstruct nfs_fattr *fattr;\n\tconst struct nfs_server *server;\n\tstruct nfs4_pathname fs_path;\n\tint nlocations;\n\tstruct nfs4_fs_location locations[10];\n};\n\nstruct nfs4_label {\n\tuint32_t lfs;\n\tuint32_t pi;\n\tstruct lsmcontext lsmctx;\n};\n\nstruct rpc_timer {\n\tstruct list_head list;\n\tlong unsigned int expires;\n\tstruct delayed_work dwork;\n};\n\nstruct rpc_wait_queue {\n\tspinlock_t lock;\n\tstruct list_head tasks[4];\n\tunsigned char maxpriority;\n\tunsigned char priority;\n\tunsigned char nr;\n\tunsigned int qlen;\n\tstruct rpc_timer timer_list;\n\tconst char *name;\n};\n\nstruct nfs_seqid_counter {\n\tktime_t create_time;\n\tint owner_id;\n\tint flags;\n\tu32 counter;\n\tspinlock_t lock;\n\tstruct list_head list;\n\tstruct rpc_wait_queue wait;\n};\n\nstruct nfs4_stateid_struct {\n\tunion {\n\t\tchar data[16];\n\t\tstruct {\n\t\t\t__be32 seqid;\n\t\t\tchar other[12];\n\t\t};\n\t};\n\tenum {\n\t\tNFS4_INVALID_STATEID_TYPE = 0,\n\t\tNFS4_SPECIAL_STATEID_TYPE = 1,\n\t\tNFS4_OPEN_STATEID_TYPE = 2,\n\t\tNFS4_LOCK_STATEID_TYPE = 3,\n\t\tNFS4_DELEGATION_STATEID_TYPE = 4,\n\t\tNFS4_LAYOUT_STATEID_TYPE = 5,\n\t\tNFS4_PNFS_DS_STATEID_TYPE = 6,\n\t\tNFS4_REVOKED_STATEID_TYPE = 7,\n\t} type;\n};\n\ntypedef struct nfs4_stateid_struct nfs4_stateid;\n\nstruct nfs4_state;\n\nstruct nfs4_lock_state {\n\tstruct list_head ls_locks;\n\tstruct nfs4_state *ls_state;\n\tlong unsigned int ls_flags;\n\tstruct nfs_seqid_counter ls_seqid;\n\tnfs4_stateid ls_stateid;\n\trefcount_t ls_count;\n\tfl_owner_t ls_owner;\n};\n\nstruct nfs_fh;\n\nstruct nfs4_mig_recovery_ops {\n\tint (*get_locations)(struct nfs_server *, struct nfs_fh *, struct nfs4_fs_locations *, struct page *, const struct cred *);\n\tint (*fsid_present)(struct inode *, const struct cred *);\n};\n\nstruct nfs_client;\n\nstruct nfs_fsinfo;\n\nstruct nfs_seqid;\n\nstruct rpc_clnt;\n\nstruct rpc_xprt;\n\nstruct rpc_call_ops;\n\nstruct nfs4_state_recovery_ops;\n\nstruct nfs4_state_maintenance_ops;\n\nstruct nfs4_minor_version_ops {\n\tu32 minor_version;\n\tunsigned int init_caps;\n\tint (*init_client)(struct nfs_client *);\n\tvoid (*shutdown_client)(struct nfs_client *);\n\tbool (*match_stateid)(const nfs4_stateid *, const nfs4_stateid *);\n\tint (*find_root_sec)(struct nfs_server *, struct nfs_fh *, struct nfs_fsinfo *);\n\tvoid (*free_lock_state)(struct nfs_server *, struct nfs4_lock_state *);\n\tint (*test_and_free_expired)(struct nfs_server *, const nfs4_stateid *, const struct cred *);\n\tstruct nfs_seqid * (*alloc_seqid)(struct nfs_seqid_counter *, gfp_t);\n\tvoid (*session_trunk)(struct rpc_clnt *, struct rpc_xprt *, void *);\n\tconst struct rpc_call_ops *call_sync_ops;\n\tconst struct nfs4_state_recovery_ops *reboot_recovery_ops;\n\tconst struct nfs4_state_recovery_ops *nograce_recovery_ops;\n\tconst struct nfs4_state_maintenance_ops *state_renewal_ops;\n\tconst struct nfs4_mig_recovery_ops *mig_recovery_ops;\n};\n\nstruct nfs4_slot;\n\nstruct nfs4_sequence_args {\n\tstruct nfs4_slot *sa_slot;\n\tu8 sa_cache_this: 1;\n\tu8 sa_privileged: 1;\n};\n\nstruct nfs4_sequence_res {\n\tstruct nfs4_slot *sr_slot;\n\tlong unsigned int sr_timestamp;\n\tint sr_status;\n\tu32 sr_status_flags;\n\tu32 sr_highest_slotid;\n\tu32 sr_target_highest_slotid;\n};\n\nstruct nfs4_ssc_client_ops {\n\tstruct file * (*sco_open)(struct vfsmount *, struct nfs_fh *, nfs4_stateid *);\n\tvoid (*sco_close)(struct file *);\n};\n\nstruct nfs4_state_owner;\n\nstruct nfs4_state {\n\tstruct list_head open_states;\n\tstruct list_head inode_states;\n\tstruct list_head lock_states;\n\tstruct nfs4_state_owner *owner;\n\tstruct inode *inode;\n\tlong unsigned int flags;\n\tspinlock_t state_lock;\n\tseqlock_t seqlock;\n\tnfs4_stateid stateid;\n\tnfs4_stateid open_stateid;\n\tunsigned int n_rdonly;\n\tunsigned int n_wronly;\n\tunsigned int n_rdwr;\n\tfmode_t state;\n\trefcount_t count;\n\twait_queue_head_t waitq;\n\tstruct callback_head callback_head;\n};\n\nstruct nfs4_state_maintenance_ops {\n\tint (*sched_state_renewal)(struct nfs_client *, const struct cred *, unsigned int);\n\tconst struct cred * (*get_state_renewal_cred)(struct nfs_client *);\n\tint (*renew_lease)(struct nfs_client *, const struct cred *);\n};\n\nstruct nfs4_state_owner {\n\tstruct nfs_server *so_server;\n\tstruct list_head so_lru;\n\tlong unsigned int so_expires;\n\tstruct rb_node so_server_node;\n\tconst struct cred *so_cred;\n\tspinlock_t so_lock;\n\tatomic_t so_count;\n\tlong unsigned int so_flags;\n\tstruct list_head so_states;\n\tstruct nfs_seqid_counter so_seqid;\n\tstruct mutex so_delegreturn_mutex;\n};\n\nstruct nfs4_state_recovery_ops {\n\tint owner_flag_bit;\n\tint state_flag_bit;\n\tint (*recover_open)(struct nfs4_state_owner *, struct nfs4_state *);\n\tint (*recover_lock)(struct nfs4_state *, struct file_lock *);\n\tint (*establish_clid)(struct nfs_client *, const struct cred *);\n\tint (*reclaim_complete)(struct nfs_client *, const struct cred *);\n\tint (*detect_trunking)(struct nfs_client *, struct nfs_client **, const struct cred *);\n};\n\nstruct nfs4_threshold {\n\t__u32 bm;\n\t__u32 l_type;\n\t__u64 rd_sz;\n\t__u64 wr_sz;\n\t__u64 rd_io_sz;\n\t__u64 wr_io_sz;\n};\n\nstruct nfs_access_entry {\n\tstruct rb_node rb_node;\n\tstruct list_head lru;\n\tkuid_t fsuid;\n\tkgid_t fsgid;\n\tstruct group_info *group_info;\n\tu64 timestamp;\n\t__u32 mask;\n\tstruct callback_head callback_head;\n};\n\nstruct nfs_auth_info {\n\tunsigned int flavor_len;\n\trpc_authflavor_t flavors[12];\n};\n\nstruct nfs_subversion;\n\nstruct xprtsec_parms {\n\tenum xprtsec_policies policy;\n\tkey_serial_t cert_serial;\n\tkey_serial_t privkey_serial;\n};\n\nstruct idmap;\n\nstruct nfs4_slot_table;\n\nstruct nfs4_session;\n\nstruct nfs_rpc_ops;\n\nstruct nfs_client {\n\trefcount_t cl_count;\n\tatomic_t cl_mds_count;\n\tint cl_cons_state;\n\tlong unsigned int cl_res_state;\n\tlong unsigned int cl_flags;\n\tstruct __kernel_sockaddr_storage cl_addr;\n\tsize_t cl_addrlen;\n\tchar *cl_hostname;\n\tchar *cl_acceptor;\n\tstruct list_head cl_share_link;\n\tstruct list_head cl_superblocks;\n\tstruct rpc_clnt *cl_rpcclient;\n\tconst struct nfs_rpc_ops *rpc_ops;\n\tint cl_proto;\n\tstruct nfs_subversion *cl_nfs_mod;\n\tu32 cl_minorversion;\n\tunsigned int cl_nconnect;\n\tunsigned int cl_max_connect;\n\tconst char *cl_principal;\n\tstruct xprtsec_parms cl_xprtsec;\n\tstruct list_head cl_ds_clients;\n\tu64 cl_clientid;\n\tnfs4_verifier cl_confirm;\n\tlong unsigned int cl_state;\n\tspinlock_t cl_lock;\n\tlong unsigned int cl_lease_time;\n\tlong unsigned int cl_last_renewal;\n\tstruct delayed_work cl_renewd;\n\tstruct rpc_wait_queue cl_rpcwaitq;\n\tstruct idmap *cl_idmap;\n\tconst char *cl_owner_id;\n\tu32 cl_cb_ident;\n\tconst struct nfs4_minor_version_ops *cl_mvops;\n\tlong unsigned int cl_mig_gen;\n\tstruct nfs4_slot_table *cl_slot_tbl;\n\tu32 cl_seqid;\n\tu32 cl_exchange_flags;\n\tstruct nfs4_session *cl_session;\n\tbool cl_preserve_clid;\n\tstruct nfs41_server_owner *cl_serverowner;\n\tstruct nfs41_server_scope *cl_serverscope;\n\tstruct nfs41_impl_id *cl_implid;\n\tlong unsigned int cl_sp4_flags;\n\twait_queue_head_t cl_lock_waitq;\n\tchar cl_ipaddr[48];\n\tstruct net *cl_net;\n\tstruct list_head pending_cb_stateids;\n\tstruct callback_head rcu;\n};\n\nstruct nfs_page;\n\nstruct nfs_commit_data;\n\nstruct nfs_commit_info;\n\nstruct nfs_commit_completion_ops {\n\tvoid (*completion)(struct nfs_commit_data *);\n\tvoid (*resched_write)(struct nfs_commit_info *, struct nfs_page *);\n};\n\nstruct rpc_wait {\n\tstruct list_head list;\n\tstruct list_head links;\n\tstruct list_head timer_list;\n};\n\nstruct rpc_procinfo;\n\nstruct rpc_message {\n\tconst struct rpc_procinfo *rpc_proc;\n\tvoid *rpc_argp;\n\tvoid *rpc_resp;\n\tconst struct cred *rpc_cred;\n};\n\nstruct rpc_cred;\n\nstruct rpc_rqst;\n\nstruct rpc_task {\n\tatomic_t tk_count;\n\tint tk_status;\n\tstruct list_head tk_task;\n\tvoid (*tk_callback)(struct rpc_task *);\n\tvoid (*tk_action)(struct rpc_task *);\n\tlong unsigned int tk_timeout;\n\tlong unsigned int tk_runstate;\n\tstruct rpc_wait_queue *tk_waitqueue;\n\tunion {\n\t\tstruct work_struct tk_work;\n\t\tstruct rpc_wait tk_wait;\n\t} u;\n\tstruct rpc_message tk_msg;\n\tvoid *tk_calldata;\n\tconst struct rpc_call_ops *tk_ops;\n\tstruct rpc_clnt *tk_client;\n\tstruct rpc_xprt *tk_xprt;\n\tstruct rpc_cred *tk_op_cred;\n\tstruct rpc_rqst *tk_rqstp;\n\tstruct workqueue_struct *tk_workqueue;\n\tktime_t tk_start;\n\tpid_t tk_owner;\n\tint tk_rpc_status;\n\tshort unsigned int tk_flags;\n\tshort unsigned int tk_timeouts;\n\tshort unsigned int tk_pid;\n\tunsigned char tk_priority: 2;\n\tunsigned char tk_garb_retry: 2;\n\tunsigned char tk_cred_retry: 2;\n};\n\nstruct nfs_fsid {\n\tuint64_t major;\n\tuint64_t minor;\n};\n\nstruct nfs_fattr {\n\tunsigned int valid;\n\tumode_t mode;\n\t__u32 nlink;\n\tkuid_t uid;\n\tkgid_t gid;\n\tdev_t rdev;\n\t__u64 size;\n\tunion {\n\t\tstruct {\n\t\t\t__u32 blocksize;\n\t\t\t__u32 blocks;\n\t\t} nfs2;\n\t\tstruct {\n\t\t\t__u64 used;\n\t\t} nfs3;\n\t} du;\n\tstruct nfs_fsid fsid;\n\t__u64 fileid;\n\t__u64 mounted_on_fileid;\n\tstruct timespec64 atime;\n\tstruct timespec64 mtime;\n\tstruct timespec64 ctime;\n\t__u64 change_attr;\n\t__u64 pre_change_attr;\n\t__u64 pre_size;\n\tstruct timespec64 pre_mtime;\n\tstruct timespec64 pre_ctime;\n\tlong unsigned int time_start;\n\tlong unsigned int gencount;\n\tstruct nfs4_string *owner_name;\n\tstruct nfs4_string *group_name;\n\tstruct nfs4_threshold *mdsthreshold;\n\tstruct nfs4_label *label;\n};\n\nstruct nfs_write_verifier {\n\tchar data[8];\n};\n\nstruct nfs_writeverf {\n\tstruct nfs_write_verifier verifier;\n\tenum nfs3_stable_how committed;\n};\n\nstruct nfs_direct_req;\n\nstruct nfs_commitargs {\n\tstruct nfs4_sequence_args seq_args;\n\tstruct nfs_fh *fh;\n\t__u64 offset;\n\t__u32 count;\n\tconst u32 *bitmask;\n};\n\nstruct nfs_commitres {\n\tstruct nfs4_sequence_res seq_res;\n\t__u32 op_status;\n\tstruct nfs_fattr *fattr;\n\tstruct nfs_writeverf *verf;\n\tconst struct nfs_server *server;\n};\n\nstruct pnfs_layout_segment;\n\nstruct nfs_open_context;\n\nstruct nfs_commit_data {\n\tstruct rpc_task task;\n\tstruct inode *inode;\n\tconst struct cred *cred;\n\tstruct nfs_fattr fattr;\n\tstruct nfs_writeverf verf;\n\tstruct list_head pages;\n\tstruct list_head list;\n\tstruct nfs_direct_req *dreq;\n\tstruct nfs_commitargs args;\n\tstruct nfs_commitres res;\n\tstruct nfs_open_context *context;\n\tstruct pnfs_layout_segment *lseg;\n\tstruct nfs_client *ds_clp;\n\tint ds_commit_index;\n\tloff_t lwb;\n\tconst struct rpc_call_ops *mds_ops;\n\tconst struct nfs_commit_completion_ops *completion_ops;\n\tint (*commit_done_cb)(struct rpc_task *, struct nfs_commit_data *);\n\tlong unsigned int flags;\n};\n\nstruct nfs_mds_commit_info;\n\nstruct pnfs_ds_commit_info;\n\nstruct nfs_commit_info {\n\tstruct inode *inode;\n\tstruct nfs_mds_commit_info *mds;\n\tstruct pnfs_ds_commit_info *ds;\n\tstruct nfs_direct_req *dreq;\n\tconst struct nfs_commit_completion_ops *completion_ops;\n};\n\nstruct nfs_entry {\n\t__u64 ino;\n\t__u64 cookie;\n\tconst char *name;\n\tunsigned int len;\n\tint eof;\n\tstruct nfs_fh *fh;\n\tstruct nfs_fattr *fattr;\n\tunsigned char d_type;\n\tstruct nfs_server *server;\n};\n\nstruct nfs_fh {\n\tshort unsigned int size;\n\tunsigned char data[128];\n};\n\nstruct nfs_fsinfo {\n\tstruct nfs_fattr *fattr;\n\t__u32 rtmax;\n\t__u32 rtpref;\n\t__u32 rtmult;\n\t__u32 wtmax;\n\t__u32 wtpref;\n\t__u32 wtmult;\n\t__u32 dtpref;\n\t__u64 maxfilesize;\n\tstruct timespec64 time_delta;\n\t__u32 lease_time;\n\t__u32 nlayouttypes;\n\t__u32 layouttype[8];\n\t__u32 blksize;\n\t__u32 clone_blksize;\n\tenum nfs4_change_attr_type change_attr_type;\n\t__u32 xattr_support;\n};\n\nstruct nfs_fsstat {\n\tstruct nfs_fattr *fattr;\n\t__u64 tbytes;\n\t__u64 fbytes;\n\t__u64 abytes;\n\t__u64 tfiles;\n\t__u64 ffiles;\n\t__u64 afiles;\n};\n\nstruct nfs_lock_context {\n\trefcount_t count;\n\tstruct list_head list;\n\tstruct nfs_open_context *open_context;\n\tfl_owner_t lockowner;\n\tatomic_t io_count;\n\tstruct callback_head callback_head;\n};\n\nstruct nfs_mds_commit_info {\n\tatomic_t rpcs_out;\n\tatomic_long_t ncommit;\n\tstruct list_head list;\n};\n\nstruct nfs_open_context {\n\tstruct nfs_lock_context lock_context;\n\tfl_owner_t flock_owner;\n\tstruct dentry *dentry;\n\tconst struct cred *cred;\n\tstruct rpc_cred *ll_cred;\n\tstruct nfs4_state *state;\n\tfmode_t mode;\n\tlong unsigned int flags;\n\tint error;\n\tstruct list_head list;\n\tstruct nfs4_threshold *mdsthreshold;\n\tstruct callback_head callback_head;\n};\n\nstruct nfs_page_array {\n\tstruct page **pagevec;\n\tunsigned int npages;\n\tstruct page *page_array[8];\n};\n\nstruct nfs_pathconf {\n\tstruct nfs_fattr *fattr;\n\t__u32 max_link;\n\t__u32 max_namelen;\n};\n\nstruct nfs_pgio_args {\n\tstruct nfs4_sequence_args seq_args;\n\tstruct nfs_fh *fh;\n\tstruct nfs_open_context *context;\n\tstruct nfs_lock_context *lock_context;\n\tnfs4_stateid stateid;\n\t__u64 offset;\n\t__u32 count;\n\tunsigned int pgbase;\n\tstruct page **pages;\n\tunion {\n\t\tunsigned int replen;\n\t\tstruct {\n\t\t\tconst u32 *bitmask;\n\t\t\tu32 bitmask_store[3];\n\t\t\tenum nfs3_stable_how stable;\n\t\t};\n\t};\n};\n\nstruct nfs_pgio_header;\n\nstruct nfs_pgio_completion_ops {\n\tvoid (*error_cleanup)(struct list_head *, int);\n\tvoid (*init_hdr)(struct nfs_pgio_header *);\n\tvoid (*completion)(struct nfs_pgio_header *);\n\tvoid (*reschedule_io)(struct nfs_pgio_header *);\n};\n\nstruct nfs_rw_ops;\n\nstruct nfs_io_completion;\n\nstruct nfs_pgio_res {\n\tstruct nfs4_sequence_res seq_res;\n\tstruct nfs_fattr *fattr;\n\t__u64 count;\n\t__u32 op_status;\n\tunion {\n\t\tstruct {\n\t\t\tunsigned int replen;\n\t\t\tint eof;\n\t\t\tvoid *scratch;\n\t\t};\n\t\tstruct {\n\t\t\tstruct nfs_writeverf *verf;\n\t\t\tconst struct nfs_server *server;\n\t\t};\n\t};\n};\n\nstruct nfs_pgio_header {\n\tstruct inode *inode;\n\tconst struct cred *cred;\n\tstruct list_head pages;\n\tstruct nfs_page *req;\n\tstruct nfs_writeverf verf;\n\tfmode_t rw_mode;\n\tstruct pnfs_layout_segment *lseg;\n\tloff_t io_start;\n\tconst struct rpc_call_ops *mds_ops;\n\tvoid (*release)(struct nfs_pgio_header *);\n\tconst struct nfs_pgio_completion_ops *completion_ops;\n\tconst struct nfs_rw_ops *rw_ops;\n\tstruct nfs_io_completion *io_completion;\n\tstruct nfs_direct_req *dreq;\n\tvoid *netfs;\n\tint pnfs_error;\n\tint error;\n\tunsigned int good_bytes;\n\tlong unsigned int flags;\n\tstruct rpc_task task;\n\tstruct nfs_fattr fattr;\n\tstruct nfs_pgio_args args;\n\tstruct nfs_pgio_res res;\n\tlong unsigned int timestamp;\n\tint (*pgio_done_cb)(struct rpc_task *, struct nfs_pgio_header *);\n\t__u64 mds_offset;\n\tstruct nfs_page_array page_array;\n\tstruct nfs_client *ds_clp;\n\tu32 ds_commit_idx;\n\tu32 pgio_mirror_idx;\n};\n\nstruct nfs_readdir_arg {\n\tstruct dentry *dentry;\n\tconst struct cred *cred;\n\t__be32 *verf;\n\tu64 cookie;\n\tstruct page **pages;\n\tunsigned int page_len;\n\tbool plus;\n};\n\nstruct nfs_readdir_res {\n\t__be32 *verf;\n};\n\nstruct nfs_removeargs {\n\tstruct nfs4_sequence_args seq_args;\n\tconst struct nfs_fh *fh;\n\tstruct qstr name;\n};\n\nstruct nfs_removeres {\n\tstruct nfs4_sequence_res seq_res;\n\tstruct nfs_server *server;\n\tstruct nfs_fattr *dir_attr;\n\tstruct nfs4_change_info cinfo;\n};\n\nstruct nfs_renameargs {\n\tstruct nfs4_sequence_args seq_args;\n\tconst struct nfs_fh *old_dir;\n\tconst struct nfs_fh *new_dir;\n\tconst struct qstr *old_name;\n\tconst struct qstr *new_name;\n};\n\nstruct nfs_renameres {\n\tstruct nfs4_sequence_res seq_res;\n\tstruct nfs_server *server;\n\tstruct nfs4_change_info old_cinfo;\n\tstruct nfs_fattr *old_fattr;\n\tstruct nfs4_change_info new_cinfo;\n\tstruct nfs_fattr *new_fattr;\n};\n\nstruct nfs_renamedata {\n\tstruct nfs_renameargs args;\n\tstruct nfs_renameres res;\n\tstruct rpc_task task;\n\tconst struct cred *cred;\n\tstruct inode *old_dir;\n\tstruct dentry *old_dentry;\n\tstruct nfs_fattr old_fattr;\n\tstruct inode *new_dir;\n\tstruct dentry *new_dentry;\n\tstruct nfs_fattr new_fattr;\n\tvoid (*complete)(struct rpc_task *, struct nfs_renamedata *);\n\tlong int timeout;\n\tbool cancelled;\n};\n\nstruct nlmclnt_operations;\n\nstruct nfs_client_initdata;\n\nstruct nfs_unlinkdata;\n\nstruct xdr_stream;\n\nstruct nfs_rpc_ops {\n\tu32 version;\n\tconst struct dentry_operations *dentry_ops;\n\tconst struct inode_operations *dir_inode_ops;\n\tconst struct inode_operations *file_inode_ops;\n\tconst struct file_operations *file_ops;\n\tconst struct nlmclnt_operations *nlmclnt_ops;\n\tint (*getroot)(struct nfs_server *, struct nfs_fh *, struct nfs_fsinfo *);\n\tint (*submount)(struct fs_context *, struct nfs_server *);\n\tint (*try_get_tree)(struct fs_context *);\n\tint (*getattr)(struct nfs_server *, struct nfs_fh *, struct nfs_fattr *, struct inode *);\n\tint (*setattr)(struct dentry *, struct nfs_fattr *, struct iattr *);\n\tint (*lookup)(struct inode *, struct dentry *, struct nfs_fh *, struct nfs_fattr *);\n\tint (*lookupp)(struct inode *, struct nfs_fh *, struct nfs_fattr *);\n\tint (*access)(struct inode *, struct nfs_access_entry *, const struct cred *);\n\tint (*readlink)(struct inode *, struct page *, unsigned int, unsigned int);\n\tint (*create)(struct inode *, struct dentry *, struct iattr *, int);\n\tint (*remove)(struct inode *, struct dentry *);\n\tvoid (*unlink_setup)(struct rpc_message *, struct dentry *, struct inode *);\n\tvoid (*unlink_rpc_prepare)(struct rpc_task *, struct nfs_unlinkdata *);\n\tint (*unlink_done)(struct rpc_task *, struct inode *);\n\tvoid (*rename_setup)(struct rpc_message *, struct dentry *, struct dentry *);\n\tvoid (*rename_rpc_prepare)(struct rpc_task *, struct nfs_renamedata *);\n\tint (*rename_done)(struct rpc_task *, struct inode *, struct inode *);\n\tint (*link)(struct inode *, struct inode *, const struct qstr *);\n\tint (*symlink)(struct inode *, struct dentry *, struct folio *, unsigned int, struct iattr *);\n\tint (*mkdir)(struct inode *, struct dentry *, struct iattr *);\n\tint (*rmdir)(struct inode *, const struct qstr *);\n\tint (*readdir)(struct nfs_readdir_arg *, struct nfs_readdir_res *);\n\tint (*mknod)(struct inode *, struct dentry *, struct iattr *, dev_t);\n\tint (*statfs)(struct nfs_server *, struct nfs_fh *, struct nfs_fsstat *);\n\tint (*fsinfo)(struct nfs_server *, struct nfs_fh *, struct nfs_fsinfo *);\n\tint (*pathconf)(struct nfs_server *, struct nfs_fh *, struct nfs_pathconf *);\n\tint (*set_capabilities)(struct nfs_server *, struct nfs_fh *);\n\tint (*decode_dirent)(struct xdr_stream *, struct nfs_entry *, bool);\n\tint (*pgio_rpc_prepare)(struct rpc_task *, struct nfs_pgio_header *);\n\tvoid (*read_setup)(struct nfs_pgio_header *, struct rpc_message *);\n\tint (*read_done)(struct rpc_task *, struct nfs_pgio_header *);\n\tvoid (*write_setup)(struct nfs_pgio_header *, struct rpc_message *, struct rpc_clnt **);\n\tint (*write_done)(struct rpc_task *, struct nfs_pgio_header *);\n\tvoid (*commit_setup)(struct nfs_commit_data *, struct rpc_message *, struct rpc_clnt **);\n\tvoid (*commit_rpc_prepare)(struct rpc_task *, struct nfs_commit_data *);\n\tint (*commit_done)(struct rpc_task *, struct nfs_commit_data *);\n\tint (*lock)(struct file *, int, struct file_lock *);\n\tint (*lock_check_bounds)(const struct file_lock *);\n\tvoid (*clear_acl_cache)(struct inode *);\n\tvoid (*close_context)(struct nfs_open_context *, int);\n\tstruct inode * (*open_context)(struct inode *, struct nfs_open_context *, int, struct iattr *, int *);\n\tint (*have_delegation)(struct inode *, fmode_t, int);\n\tint (*return_delegation)(struct inode *);\n\tstruct nfs_client * (*alloc_client)(const struct nfs_client_initdata *);\n\tstruct nfs_client * (*init_client)(struct nfs_client *, const struct nfs_client_initdata *);\n\tvoid (*free_client)(struct nfs_client *);\n\tstruct nfs_server * (*create_server)(struct fs_context *);\n\tstruct nfs_server * (*clone_server)(struct nfs_server *, struct nfs_fh *, struct nfs_fattr *, rpc_authflavor_t);\n\tint (*discover_trunking)(struct nfs_server *, struct nfs_fh *);\n\tvoid (*enable_swap)(struct inode *);\n\tvoid (*disable_swap)(struct inode *);\n};\n\nstruct nfs_seqid {\n\tstruct nfs_seqid_counter *sequence;\n\tstruct list_head list;\n\tstruct rpc_task *task;\n};\n\nstruct nlm_host;\n\nstruct nfs_iostats;\n\nstruct fscache_volume;\n\nstruct pnfs_layoutdriver_type;\n\nstruct nfs_server {\n\tstruct nfs_client *nfs_client;\n\tstruct list_head client_link;\n\tstruct list_head master_link;\n\tstruct rpc_clnt *client;\n\tstruct rpc_clnt *client_acl;\n\tstruct nlm_host *nlm_host;\n\tstruct nfs_iostats *io_stats;\n\twait_queue_head_t write_congestion_wait;\n\tatomic_long_t writeback;\n\tunsigned int write_congested;\n\tunsigned int flags;\n\tunsigned int fattr_valid;\n\tunsigned int caps;\n\tunsigned int rsize;\n\tunsigned int rpages;\n\tunsigned int wsize;\n\tunsigned int wpages;\n\tunsigned int wtmult;\n\tunsigned int dtsize;\n\tshort unsigned int port;\n\tunsigned int bsize;\n\tunsigned int gxasize;\n\tunsigned int sxasize;\n\tunsigned int lxasize;\n\tunsigned int acregmin;\n\tunsigned int acregmax;\n\tunsigned int acdirmin;\n\tunsigned int acdirmax;\n\tunsigned int namelen;\n\tunsigned int options;\n\tunsigned int clone_blksize;\n\tenum nfs4_change_attr_type change_attr_type;\n\tstruct nfs_fsid fsid;\n\tint s_sysfs_id;\n\t__u64 maxfilesize;\n\tstruct timespec64 time_delta;\n\tlong unsigned int mount_time;\n\tstruct super_block *super;\n\tdev_t s_dev;\n\tstruct nfs_auth_info auth_info;\n\tstruct fscache_volume *fscache;\n\tchar *fscache_uniq;\n\tu32 pnfs_blksize;\n\tu32 attr_bitmask[3];\n\tu32 attr_bitmask_nl[3];\n\tu32 exclcreat_bitmask[3];\n\tu32 cache_consistency_bitmask[3];\n\tu32 acl_bitmask;\n\tu32 fh_expire_type;\n\tstruct pnfs_layoutdriver_type *pnfs_curr_ld;\n\tstruct rpc_wait_queue roc_rpcwaitq;\n\tvoid *pnfs_ld_data;\n\tstruct rb_root state_owners;\n\tstruct ida openowner_id;\n\tstruct ida lockowner_id;\n\tstruct list_head state_owners_lru;\n\tstruct list_head layouts;\n\tstruct list_head delegations;\n\tstruct list_head ss_copies;\n\tstruct list_head ss_src_copies;\n\tlong unsigned int delegation_gen;\n\tlong unsigned int mig_gen;\n\tlong unsigned int mig_status;\n\tvoid (*destroy)(struct nfs_server *);\n\tatomic_t active;\n\tstruct __kernel_sockaddr_storage mountd_address;\n\tsize_t mountd_addrlen;\n\tu32 mountd_version;\n\tshort unsigned int mountd_port;\n\tshort unsigned int mountd_protocol;\n\tstruct rpc_wait_queue uoc_rpcwaitq;\n\tunsigned int read_hdrsize;\n\tconst struct cred *cred;\n\tbool has_sec_mnt_opts;\n\tstruct kobject kobj;\n\tstruct callback_head rcu;\n};\n\nstruct nfs_ssc_client_ops {\n\tvoid (*sco_sb_deactive)(struct super_block *);\n};\n\nstruct nfs_ssc_client_ops_tbl {\n\tconst struct nfs4_ssc_client_ops *ssc_nfs4_ops;\n\tconst struct nfs_ssc_client_ops *ssc_nfs_ops;\n};\n\nstruct nfs_unlinkdata {\n\tstruct nfs_removeargs args;\n\tstruct nfs_removeres res;\n\tstruct dentry *dentry;\n\twait_queue_head_t wq;\n\tconst struct cred *cred;\n\tstruct nfs_fattr dir_attr;\n\tlong int timeout;\n};\n\nstruct nh_config {\n\tu32 nh_id;\n\tu8 nh_family;\n\tu8 nh_protocol;\n\tu8 nh_blackhole;\n\tu8 nh_fdb;\n\tu32 nh_flags;\n\tint nh_ifindex;\n\tstruct net_device *dev;\n\tunion {\n\t\t__be32 ipv4;\n\t\tstruct in6_addr ipv6;\n\t} gw;\n\tstruct nlattr *nh_grp;\n\tu16 nh_grp_type;\n\tu16 nh_grp_res_num_buckets;\n\tlong unsigned int nh_grp_res_idle_timer;\n\tlong unsigned int nh_grp_res_unbalanced_timer;\n\tbool nh_grp_res_has_num_buckets;\n\tbool nh_grp_res_has_idle_timer;\n\tbool nh_grp_res_has_unbalanced_timer;\n\tbool nh_hw_stats;\n\tstruct nlattr *nh_encap;\n\tu16 nh_encap_type;\n\tu32 nlflags;\n\tstruct nl_info nlinfo;\n};\n\nstruct nh_dump_filter {\n\tu32 nh_id;\n\tint dev_idx;\n\tint master_idx;\n\tbool group_filter;\n\tbool fdb_filter;\n\tu32 res_bucket_nh_id;\n\tu32 op_flags;\n};\n\nstruct nh_grp_entry_stats;\n\nstruct nh_grp_entry {\n\tstruct nexthop *nh;\n\tstruct nh_grp_entry_stats *stats;\n\tu8 weight;\n\tunion {\n\t\tstruct {\n\t\t\tatomic_t upper_bound;\n\t\t} hthr;\n\t\tstruct {\n\t\t\tstruct list_head uw_nh_entry;\n\t\t\tu16 count_buckets;\n\t\t\tu16 wants_buckets;\n\t\t} res;\n\t};\n\tstruct list_head nh_list;\n\tstruct nexthop *nh_parent;\n\tu64 packets_hw;\n};\n\nstruct nh_res_table;\n\nstruct nh_group {\n\tstruct nh_group *spare;\n\tu16 num_nh;\n\tbool is_multipath;\n\tbool hash_threshold;\n\tbool resilient;\n\tbool fdb_nh;\n\tbool has_v4;\n\tbool hw_stats;\n\tstruct nh_res_table *res_table;\n\tstruct nh_grp_entry nh_entries[0];\n};\n\nstruct nh_grp_entry_stats {\n\tu64_stats_t packets;\n\tstruct u64_stats_sync syncp;\n};\n\nstruct nh_info {\n\tstruct hlist_node dev_hash;\n\tstruct nexthop *nh_parent;\n\tu8 family;\n\tbool reject_nh;\n\tbool fdb_nh;\n\tunion {\n\t\tstruct fib_nh_common fib_nhc;\n\t\tstruct fib_nh fib_nh;\n\t\tstruct fib6_nh fib6_nh;\n\t};\n};\n\nstruct nh_notifier_single_info {\n\tstruct net_device *dev;\n\tu8 gw_family;\n\tunion {\n\t\t__be32 ipv4;\n\t\tstruct in6_addr ipv6;\n\t};\n\tu32 id;\n\tu8 is_reject: 1;\n\tu8 is_fdb: 1;\n\tu8 has_encap: 1;\n};\n\nstruct nh_notifier_grp_entry_info {\n\tu8 weight;\n\tstruct nh_notifier_single_info nh;\n};\n\nstruct nh_notifier_grp_hw_stats_entry_info {\n\tu32 id;\n\tu64 packets;\n};\n\nstruct nh_notifier_grp_hw_stats_info {\n\tu16 num_nh;\n\tbool hw_stats_used;\n\tstruct nh_notifier_grp_hw_stats_entry_info stats[0];\n};\n\nstruct nh_notifier_grp_info {\n\tu16 num_nh;\n\tbool is_fdb;\n\tbool hw_stats;\n\tstruct nh_notifier_grp_entry_info nh_entries[0];\n};\n\nstruct nh_notifier_res_table_info;\n\nstruct nh_notifier_res_bucket_info;\n\nstruct nh_notifier_info {\n\tstruct net *net;\n\tstruct netlink_ext_ack *extack;\n\tu32 id;\n\tenum nh_notifier_info_type type;\n\tunion {\n\t\tstruct nh_notifier_single_info *nh;\n\t\tstruct nh_notifier_grp_info *nh_grp;\n\t\tstruct nh_notifier_res_table_info *nh_res_table;\n\t\tstruct nh_notifier_res_bucket_info *nh_res_bucket;\n\t\tstruct nh_notifier_grp_hw_stats_info *nh_grp_hw_stats;\n\t};\n};\n\nstruct nh_notifier_res_bucket_info {\n\tu16 bucket_index;\n\tunsigned int idle_timer_ms;\n\tbool force;\n\tstruct nh_notifier_single_info old_nh;\n\tstruct nh_notifier_single_info new_nh;\n};\n\nstruct nh_notifier_res_table_info {\n\tu16 num_nh_buckets;\n\tbool hw_stats;\n\tstruct nh_notifier_single_info nhs[0];\n};\n\nstruct nh_res_bucket {\n\tstruct nh_grp_entry *nh_entry;\n\tatomic_long_t used_time;\n\tlong unsigned int migrated_time;\n\tbool occupied;\n\tu8 nh_flags;\n};\n\nstruct nh_res_table {\n\tstruct net *net;\n\tu32 nhg_id;\n\tstruct delayed_work upkeep_dw;\n\tstruct list_head uw_nh_entries;\n\tlong unsigned int unbalanced_since;\n\tu32 idle_timer;\n\tu32 unbalanced_timer;\n\tu16 num_nh_buckets;\n\tstruct nh_res_bucket nh_buckets[0];\n};\n\nstruct nhmsg {\n\tunsigned char nh_family;\n\tunsigned char nh_scope;\n\tunsigned char nh_protocol;\n\tunsigned char resvd;\n\tunsigned int nh_flags;\n};\n\nstruct nl80211_vendor_cmd_info {\n\t__u32 vendor_id;\n\t__u32 subcmd;\n};\n\nstruct nl80211_wowlan_tcp_data_token_feature {\n\t__u32 min_len;\n\t__u32 max_len;\n\t__u32 bufsize;\n};\n\nstruct nl_pktinfo {\n\t__u32 group;\n};\n\nstruct rhashtable_walker {\n\tstruct list_head list;\n\tstruct bucket_table *tbl;\n};\n\nstruct rhashtable_iter {\n\tstruct rhashtable *ht;\n\tstruct rhash_head *p;\n\tstruct rhlist_head *list;\n\tstruct rhashtable_walker walker;\n\tunsigned int slot;\n\tunsigned int skip;\n\tbool end_of_table;\n};\n\nstruct nl_seq_iter {\n\tstruct seq_net_private p;\n\tstruct rhashtable_iter hti;\n\tint link;\n};\n\nstruct nla_bitfield32 {\n\t__u32 value;\n\t__u32 selector;\n};\n\nstruct nla_policy {\n\tu8 type;\n\tu8 validation_type;\n\tu16 len;\n\tunion {\n\t\tu16 strict_start_type;\n\t\tconst u32 bitfield32_valid;\n\t\tconst u32 mask;\n\t\tconst char *reject_message;\n\t\tconst struct nla_policy *nested_policy;\n\t\tconst struct netlink_range_validation *range;\n\t\tconst struct netlink_range_validation_signed *range_signed;\n\t\tstruct {\n\t\t\ts16 min;\n\t\t\ts16 max;\n\t\t};\n\t\tint (*validate)(const struct nlattr *, struct netlink_ext_ack *);\n\t};\n};\n\nstruct nlattr {\n\t__u16 nla_len;\n\t__u16 nla_type;\n};\n\nstruct nlmsg_perm {\n\tu16 nlmsg_type;\n\tu32 perm;\n};\n\nstruct nlmsgerr {\n\tint error;\n\tstruct nlmsghdr msg;\n};\n\nstruct nls_table {\n\tconst char *charset;\n\tconst char *alias;\n\tint (*uni2char)(wchar_t, unsigned char *, int);\n\tint (*char2uni)(const unsigned char *, int, wchar_t *);\n\tconst unsigned char *charset2lower;\n\tconst unsigned char *charset2upper;\n\tstruct module *owner;\n\tstruct nls_table *next;\n};\n\nstruct nmi_desc {\n\traw_spinlock_t lock;\n\tstruct list_head head;\n};\n\nstruct nmi_stats {\n\tunsigned int normal;\n\tunsigned int unknown;\n\tunsigned int external;\n\tunsigned int swallow;\n\tlong unsigned int recv_jiffies;\n\tlong unsigned int idt_seq;\n\tlong unsigned int idt_nmi_seq;\n\tlong unsigned int idt_ignored;\n\tatomic_long_t idt_calls;\n\tlong unsigned int idt_seq_snap;\n\tlong unsigned int idt_nmi_seq_snap;\n\tlong unsigned int idt_ignored_snap;\n\tlong int idt_calls_snap;\n};\n\ntypedef int (*nmi_handler_t)(unsigned int, struct pt_regs *);\n\nstruct nmiaction {\n\tstruct list_head list;\n\tnmi_handler_t handler;\n\tu64 max_duration;\n\tlong unsigned int flags;\n\tconst char *name;\n};\n\nstruct node {\n\tstruct device dev;\n\tstruct list_head access_list;\n\tstruct list_head cache_attrs;\n\tstruct device *cache_dev;\n};\n\nstruct node_access_nodes {\n\tstruct device dev;\n\tstruct list_head list_node;\n\tunsigned int access;\n\tstruct access_coordinate coord;\n};\n\nstruct node_attr {\n\tstruct device_attribute attr;\n\tenum node_states state;\n};\n\nstruct node_cache_info {\n\tstruct device dev;\n\tstruct list_head node;\n\tstruct node_cache_attrs cache_attrs;\n};\n\nstruct node_groups {\n\tunsigned int id;\n\tunion {\n\t\tunsigned int ngroups;\n\t\tunsigned int ncpus;\n\t};\n};\n\nstruct node_hstate {\n\tstruct kobject *hugepages_kobj;\n\tstruct kobject *hstate_kobjs[2];\n};\n\nstruct node_memory_type_map {\n\tstruct memory_dev_type *memtype;\n\tint map_count;\n};\n\nstruct nodemask_scratch {\n\tnodemask_t mask1;\n\tnodemask_t mask2;\n};\n\nstruct nonram_remap {\n\tphys_addr_t maddr;\n\tphys_addr_t paddr;\n\tsize_t size;\n};\n\nstruct nosave_region {\n\tstruct list_head list;\n\tlong unsigned int start_pfn;\n\tlong unsigned int end_pfn;\n};\n\nstruct notification {\n\tatomic_t requests;\n\tu32 flags;\n\tu64 next_id;\n\tstruct list_head notifications;\n};\n\nstruct npioctl {\n\tint protocol;\n\tenum NPmode mode;\n};\n\nstruct ns_get_path_bpf_map_args {\n\tstruct bpf_offloaded_map *offmap;\n\tstruct bpf_map_info *info;\n};\n\nstruct ns_get_path_bpf_prog_args {\n\tstruct bpf_prog *prog;\n\tstruct bpf_prog_info *info;\n};\n\nstruct ns_get_path_task_args {\n\tconst struct proc_ns_operations *ns_ops;\n\tstruct task_struct *task;\n};\n\nstruct uts_namespace;\n\nstruct time_namespace;\n\nstruct nsproxy {\n\trefcount_t count;\n\tstruct uts_namespace *uts_ns;\n\tstruct ipc_namespace *ipc_ns;\n\tstruct mnt_namespace *mnt_ns;\n\tstruct pid_namespace *pid_ns_for_children;\n\tstruct net *net_ns;\n\tstruct time_namespace *time_ns;\n\tstruct time_namespace *time_ns_for_children;\n\tstruct cgroup_namespace *cgroup_ns;\n};\n\nstruct nsset {\n\tunsigned int flags;\n\tstruct nsproxy *nsproxy;\n\tstruct fs_struct *fs;\n\tconst struct cred *cred;\n};\n\nstruct nt_partition_info {\n\tu32 xlink_enabled;\n\tu32 target_part_low;\n\tu32 target_part_high;\n\tu32 reserved;\n};\n\nstruct ntb_ctrl_regs {\n\tu32 partition_status;\n\tu32 partition_op;\n\tu32 partition_ctrl;\n\tu32 bar_setup;\n\tu32 bar_error;\n\tu16 lut_table_entries;\n\tu16 lut_table_offset;\n\tu32 lut_error;\n\tu16 req_id_table_size;\n\tu16 req_id_table_offset;\n\tu32 req_id_error;\n\tu32 reserved1[7];\n\tstruct {\n\t\tu32 ctl;\n\t\tu32 win_size;\n\t\tu64 xlate_addr;\n\t} bar_entry[6];\n\tstruct {\n\t\tu32 win_size;\n\t\tu32 reserved[3];\n\t} bar_ext_entry[6];\n\tu32 reserved2[192];\n\tu32 req_id_table[512];\n\tu32 reserved3[256];\n\tu64 lut_entry[512];\n};\n\nstruct ntb_info_regs {\n\tu8 partition_count;\n\tu8 partition_id;\n\tu16 reserved1;\n\tu64 ep_map;\n\tu16 requester_id;\n\tu16 reserved2;\n\tu32 reserved3[4];\n\tstruct nt_partition_info ntp_info[48];\n} __attribute__((packed));\n\nstruct numa_group {\n\trefcount_t refcount;\n\tspinlock_t lock;\n\tint nr_tasks;\n\tpid_t gid;\n\tint active_nodes;\n\tstruct callback_head rcu;\n\tlong unsigned int total_faults;\n\tlong unsigned int max_faults_cpu;\n\tlong unsigned int faults[0];\n};\n\nstruct numa_maps {\n\tlong unsigned int pages;\n\tlong unsigned int anon;\n\tlong unsigned int active;\n\tlong unsigned int writeback;\n\tlong unsigned int mapcount_max;\n\tlong unsigned int dirty;\n\tlong unsigned int swapcache;\n\tlong unsigned int node[1024];\n};\n\nstruct proc_maps_private {\n\tstruct inode *inode;\n\tstruct task_struct *task;\n\tstruct mm_struct *mm;\n\tstruct vma_iterator iter;\n\tstruct mempolicy *task_mempolicy;\n};\n\nstruct numa_maps_private {\n\tstruct proc_maps_private proc_maps;\n\tstruct numa_maps md;\n};\n\nstruct numa_memblk {\n\tu64 start;\n\tu64 end;\n\tint nid;\n};\n\nstruct numa_meminfo {\n\tint nr_blks;\n\tstruct numa_memblk blk[2048];\n};\n\nstruct numa_stats {\n\tlong unsigned int load;\n\tlong unsigned int runnable;\n\tlong unsigned int util;\n\tlong unsigned int compute_capacity;\n\tunsigned int nr_running;\n\tunsigned int weight;\n\tenum numa_type node_type;\n\tint idle_cpu;\n};\n\nstruct nvdimm_security_ops;\n\nstruct nvdimm_fw_ops;\n\nstruct nvdimm {\n\tlong unsigned int flags;\n\tvoid *provider_data;\n\tlong unsigned int cmd_mask;\n\tstruct device dev;\n\tatomic_t busy;\n\tint id;\n\tint num_flush;\n\tstruct resource *flush_wpq;\n\tconst char *dimm_id;\n\tstruct {\n\t\tconst struct nvdimm_security_ops *ops;\n\t\tlong unsigned int flags;\n\t\tlong unsigned int ext_flags;\n\t\tunsigned int overwrite_tmo;\n\t\tstruct kernfs_node *overwrite_state;\n\t} sec;\n\tstruct delayed_work dwork;\n\tconst struct nvdimm_fw_ops *fw_ops;\n};\n\nstruct nvdimm_bus_descriptor;\n\nstruct nvdimm_bus {\n\tstruct nvdimm_bus_descriptor *nd_desc;\n\twait_queue_head_t wait;\n\tstruct list_head list;\n\tstruct device dev;\n\tint id;\n\tint probe_active;\n\tatomic_t ioctl_active;\n\tstruct list_head mapping_list;\n\tstruct mutex reconfig_mutex;\n\tstruct badrange badrange;\n};\n\ntypedef int (*ndctl_fn)(struct nvdimm_bus_descriptor *, struct nvdimm *, unsigned int, void *, unsigned int, int *);\n\nstruct nvdimm_bus_fw_ops;\n\nstruct nvdimm_bus_descriptor {\n\tconst struct attribute_group **attr_groups;\n\tlong unsigned int cmd_mask;\n\tlong unsigned int dimm_family_mask;\n\tlong unsigned int bus_family_mask;\n\tstruct module *module;\n\tchar *provider_name;\n\tstruct device_node *of_node;\n\tndctl_fn ndctl;\n\tint (*flush_probe)(struct nvdimm_bus_descriptor *);\n\tint (*clear_to_send)(struct nvdimm_bus_descriptor *, struct nvdimm *, unsigned int, void *);\n\tconst struct nvdimm_bus_fw_ops *fw_ops;\n};\n\nstruct nvdimm_bus_fw_ops {\n\tenum nvdimm_fwa_state (*activate_state)(struct nvdimm_bus_descriptor *);\n\tenum nvdimm_fwa_capability (*capability)(struct nvdimm_bus_descriptor *);\n\tint (*activate)(struct nvdimm_bus_descriptor *);\n};\n\nstruct nvdimm_drvdata {\n\tstruct device *dev;\n\tint nslabel_size;\n\tstruct nd_cmd_get_config_size nsarea;\n\tvoid *data;\n\tbool cxl;\n\tint ns_current;\n\tint ns_next;\n\tstruct resource dpa;\n\tstruct kref kref;\n};\n\nstruct nvdimm_fw_ops {\n\tenum nvdimm_fwa_state (*activate_state)(struct nvdimm *);\n\tenum nvdimm_fwa_result (*activate_result)(struct nvdimm *);\n\tint (*arm)(struct nvdimm *, enum nvdimm_fwa_trigger);\n};\n\nstruct nvdimm_key_data {\n\tu8 data[32];\n};\n\nstruct nvdimm_map {\n\tstruct nvdimm_bus *nvdimm_bus;\n\tstruct list_head list;\n\tresource_size_t offset;\n\tlong unsigned int flags;\n\tsize_t size;\n\tunion {\n\t\tvoid *mem;\n\t\tvoid *iomem;\n\t};\n\tstruct kref kref;\n};\n\nstruct nvdimm_pmu {\n\tstruct pmu pmu;\n\tstruct device *dev;\n\tint cpu;\n\tstruct hlist_node node;\n\tenum cpuhp_state cpuhp_state;\n\tstruct cpumask arch_cpumask;\n};\n\nstruct nvdimm_security_ops {\n\tlong unsigned int (*get_flags)(struct nvdimm *, enum nvdimm_passphrase_type);\n\tint (*freeze)(struct nvdimm *);\n\tint (*change_key)(struct nvdimm *, const struct nvdimm_key_data *, const struct nvdimm_key_data *, enum nvdimm_passphrase_type);\n\tint (*unlock)(struct nvdimm *, const struct nvdimm_key_data *);\n\tint (*disable)(struct nvdimm *, const struct nvdimm_key_data *);\n\tint (*erase)(struct nvdimm *, const struct nvdimm_key_data *, enum nvdimm_passphrase_type);\n\tint (*overwrite)(struct nvdimm *, const struct nvdimm_key_data *);\n\tint (*query_overwrite)(struct nvdimm *);\n\tint (*disable_master)(struct nvdimm *, const struct nvdimm_key_data *);\n};\n\nstruct nvmem_cell_entry;\n\nstruct nvmem_cell {\n\tstruct nvmem_cell_entry *entry;\n\tconst char *id;\n\tint index;\n};\n\ntypedef int (*nvmem_cell_post_process_t)(void *, const char *, int, unsigned int, void *, size_t);\n\nstruct nvmem_device;\n\nstruct nvmem_cell_entry {\n\tconst char *name;\n\tint offset;\n\tsize_t raw_len;\n\tint bytes;\n\tint bit_offset;\n\tint nbits;\n\tnvmem_cell_post_process_t read_post_process;\n\tvoid *priv;\n\tstruct device_node *np;\n\tstruct nvmem_device *nvmem;\n\tstruct list_head node;\n};\n\nstruct nvmem_cell_info {\n\tconst char *name;\n\tunsigned int offset;\n\tsize_t raw_len;\n\tunsigned int bytes;\n\tunsigned int bit_offset;\n\tunsigned int nbits;\n\tstruct device_node *np;\n\tnvmem_cell_post_process_t read_post_process;\n\tvoid *priv;\n};\n\nstruct nvmem_cell_lookup {\n\tconst char *nvmem_name;\n\tconst char *cell_name;\n\tconst char *dev_id;\n\tconst char *con_id;\n\tstruct list_head node;\n};\n\nstruct nvmem_cell_table {\n\tconst char *nvmem_name;\n\tconst struct nvmem_cell_info *cells;\n\tsize_t ncells;\n\tstruct list_head node;\n};\n\ntypedef int (*nvmem_reg_read_t)(void *, unsigned int, void *, size_t);\n\ntypedef int (*nvmem_reg_write_t)(void *, unsigned int, void *, size_t);\n\nstruct nvmem_keepout;\n\nstruct nvmem_layout;\n\nstruct nvmem_config {\n\tstruct device *dev;\n\tconst char *name;\n\tint id;\n\tstruct module *owner;\n\tconst struct nvmem_cell_info *cells;\n\tint ncells;\n\tbool add_legacy_fixed_of_cells;\n\tvoid (*fixup_dt_cell_info)(struct nvmem_device *, struct nvmem_cell_info *);\n\tconst struct nvmem_keepout *keepout;\n\tunsigned int nkeepout;\n\tenum nvmem_type type;\n\tbool read_only;\n\tbool root_only;\n\tbool ignore_wp;\n\tstruct nvmem_layout *layout;\n\tstruct device_node *of_node;\n\tnvmem_reg_read_t reg_read;\n\tnvmem_reg_write_t reg_write;\n\tint size;\n\tint word_size;\n\tint stride;\n\tvoid *priv;\n\tbool compat;\n\tstruct device *base_dev;\n};\n\nstruct nvmem_device {\n\tstruct module *owner;\n\tstruct device dev;\n\tstruct list_head node;\n\tint stride;\n\tint word_size;\n\tint id;\n\tstruct kref refcnt;\n\tsize_t size;\n\tbool read_only;\n\tbool root_only;\n\tint flags;\n\tenum nvmem_type type;\n\tstruct bin_attribute eeprom;\n\tstruct device *base_dev;\n\tstruct list_head cells;\n\tvoid (*fixup_dt_cell_info)(struct nvmem_device *, struct nvmem_cell_info *);\n\tconst struct nvmem_keepout *keepout;\n\tunsigned int nkeepout;\n\tnvmem_reg_read_t reg_read;\n\tnvmem_reg_write_t reg_write;\n\tstruct gpio_desc *wp_gpio;\n\tstruct nvmem_layout *layout;\n\tvoid *priv;\n\tbool sysfs_cells_populated;\n};\n\nstruct nvmem_keepout {\n\tunsigned int start;\n\tunsigned int end;\n\tunsigned char value;\n};\n\nstruct nvmem_layout {\n\tstruct device dev;\n\tstruct nvmem_device *nvmem;\n\tint (*add_cells)(struct nvmem_layout *);\n};\n\nstruct nvs_page {\n\tlong unsigned int phys_start;\n\tunsigned int size;\n\tvoid *kaddr;\n\tvoid *data;\n\tbool unmap;\n\tstruct list_head node;\n};\n\nstruct nvs_region {\n\t__u64 phys_start;\n\t__u64 size;\n\tstruct list_head node;\n};\n\nstruct obj_cgroup {\n\tstruct percpu_ref refcnt;\n\tstruct mem_cgroup *memcg;\n\tatomic_t nr_charged_bytes;\n\tunion {\n\t\tstruct list_head list;\n\t\tstruct callback_head rcu;\n\t};\n};\n\nstruct objpool_head;\n\ntypedef int (*objpool_fini_cb)(struct objpool_head *, void *);\n\nstruct objpool_slot;\n\nstruct objpool_head {\n\tint obj_size;\n\tint nr_objs;\n\tint nr_possible_cpus;\n\tint capacity;\n\tgfp_t gfp;\n\trefcount_t ref;\n\tlong unsigned int flags;\n\tstruct objpool_slot **cpu_slots;\n\tobjpool_fini_cb release;\n\tvoid *context;\n};\n\nstruct objpool_slot {\n\tuint32_t head;\n\tuint32_t tail;\n\tuint32_t last;\n\tuint32_t mask;\n\tvoid *entries[0];\n};\n\nstruct obs_kernel_param {\n\tconst char *str;\n\tint (*setup_func)(char *);\n\tint early;\n};\n\nstruct ocontext {\n\tunion {\n\t\tchar *name;\n\t\tstruct {\n\t\t\tu8 protocol;\n\t\t\tu16 low_port;\n\t\t\tu16 high_port;\n\t\t} port;\n\t\tstruct {\n\t\t\tu32 addr;\n\t\t\tu32 mask;\n\t\t} node;\n\t\tstruct {\n\t\t\tu32 addr[4];\n\t\t\tu32 mask[4];\n\t\t} node6;\n\t\tstruct {\n\t\t\tu64 subnet_prefix;\n\t\t\tu16 low_pkey;\n\t\t\tu16 high_pkey;\n\t\t} ibpkey;\n\t\tstruct {\n\t\t\tchar *dev_name;\n\t\t\tu8 port;\n\t\t} ibendport;\n\t} u;\n\tunion {\n\t\tu32 sclass;\n\t\tu32 behavior;\n\t} v;\n\tstruct context___2 context[2];\n\tu32 sid[2];\n\tstruct ocontext *next;\n};\n\nstruct od_dbs_tuners {\n\tunsigned int powersave_bias;\n};\n\nstruct od_ops {\n\tunsigned int (*powersave_bias_target)(struct cpufreq_policy *, unsigned int, unsigned int);\n};\n\nstruct od_policy_dbs_info {\n\tstruct policy_dbs_info policy_dbs;\n\tunsigned int freq_lo;\n\tunsigned int freq_lo_delay_us;\n\tunsigned int freq_hi_delay_us;\n\tunsigned int sample_type: 1;\n};\n\nstruct of_dev_auxdata {\n\tchar *compatible;\n\tresource_size_t phys_addr;\n\tchar *name;\n\tvoid *platform_data;\n};\n\nstruct of_device_id {\n\tchar name[32];\n\tchar type[32];\n\tchar compatible[128];\n\tconst void *data;\n};\n\nstruct of_dma {\n\tstruct list_head of_dma_controllers;\n\tstruct device_node *of_node;\n\tstruct dma_chan * (*of_dma_xlate)(struct of_phandle_args *, struct of_dma *);\n\tvoid * (*of_dma_route_allocate)(struct of_phandle_args *, struct of_dma *);\n\tstruct dma_router *dma_router;\n\tvoid *of_dma_data;\n};\n\nstruct of_pci_range {\n\tunion {\n\t\tu64 pci_addr;\n\t\tu64 bus_addr;\n\t};\n\tu64 cpu_addr;\n\tu64 size;\n\tu32 flags;\n};\n\nstruct of_bus;\n\nstruct of_pci_range_parser {\n\tstruct device_node *node;\n\tstruct of_bus *bus;\n\tconst __be32 *range;\n\tconst __be32 *end;\n\tint na;\n\tint ns;\n\tint pna;\n\tbool dma;\n};\n\nstruct of_phandle_args {\n\tstruct device_node *np;\n\tint args_count;\n\tuint32_t args[16];\n};\n\nstruct offset_ctx {\n\tstruct maple_tree mt;\n\tlong unsigned int next_offset;\n};\n\nstruct ohci_driver_overrides {\n\tconst char *product_desc;\n\tsize_t extra_priv_size;\n\tint (*reset)(struct usb_hcd *);\n};\n\nstruct ohci_hcca {\n\t__hc32 int_table[32];\n\t__hc32 frame_no;\n\t__hc32 done_head;\n\tu8 reserved_for_hc[116];\n\tu8 what[4];\n};\n\nstruct ohci_regs;\n\nstruct ohci_hcd {\n\tspinlock_t lock;\n\tstruct ohci_regs *regs;\n\tstruct ohci_hcca *hcca;\n\tdma_addr_t hcca_dma;\n\tstruct ed *ed_rm_list;\n\tstruct ed *ed_bulktail;\n\tstruct ed *ed_controltail;\n\tstruct ed *periodic[32];\n\tvoid (*start_hnp)(struct ohci_hcd *);\n\tstruct dma_pool *td_cache;\n\tstruct dma_pool *ed_cache;\n\tstruct td *td_hash[64];\n\tstruct td *dl_start;\n\tstruct td *dl_end;\n\tstruct list_head pending;\n\tstruct list_head eds_in_use;\n\tenum ohci_rh_state rh_state;\n\tint num_ports;\n\tint load[32];\n\tu32 hc_control;\n\tlong unsigned int next_statechange;\n\tu32 fminterval;\n\tunsigned int autostop: 1;\n\tunsigned int working: 1;\n\tunsigned int restart_work: 1;\n\tlong unsigned int flags;\n\tunsigned int prev_frame_no;\n\tunsigned int wdh_cnt;\n\tunsigned int prev_wdh_cnt;\n\tu32 prev_donehead;\n\tstruct timer_list io_watchdog;\n\tstruct work_struct nec_work;\n\tstruct dentry *debug_dir;\n\tlong unsigned int priv[0];\n};\n\nstruct ohci_platform_priv {\n\tstruct clk *clks[4];\n\tstruct reset_control *resets;\n};\n\nstruct ohci_roothub_regs {\n\t__hc32 a;\n\t__hc32 b;\n\t__hc32 status;\n\t__hc32 portstatus[15];\n};\n\nstruct ohci_regs {\n\t__hc32 revision;\n\t__hc32 control;\n\t__hc32 cmdstatus;\n\t__hc32 intrstatus;\n\t__hc32 intrenable;\n\t__hc32 intrdisable;\n\t__hc32 hcca;\n\t__hc32 ed_periodcurrent;\n\t__hc32 ed_controlhead;\n\t__hc32 ed_controlcurrent;\n\t__hc32 ed_bulkhead;\n\t__hc32 ed_bulkcurrent;\n\t__hc32 donehead;\n\t__hc32 fminterval;\n\t__hc32 fmremaining;\n\t__hc32 fmnumber;\n\t__hc32 periodicstart;\n\t__hc32 lsthresh;\n\tstruct ohci_roothub_regs roothub;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct old_timespec32 {\n\told_time32_t tv_sec;\n\ts32 tv_nsec;\n};\n\nstruct old_itimerspec32 {\n\tstruct old_timespec32 it_interval;\n\tstruct old_timespec32 it_value;\n};\n\nstruct old_itimerval32 {\n\tstruct old_timeval32 it_interval;\n\tstruct old_timeval32 it_value;\n};\n\nstruct old_linux_dirent {\n\tlong unsigned int d_ino;\n\tlong unsigned int d_offset;\n\tshort unsigned int d_namlen;\n\tchar d_name[0];\n};\n\nstruct old_serial_port {\n\tunsigned int uart;\n\tunsigned int baud_base;\n\tunsigned int port;\n\tunsigned int irq;\n\tupf_t flags;\n\tunsigned char io_type;\n\tunsigned char *iomem_base;\n\tshort unsigned int iomem_reg_shift;\n};\n\nstruct old_timex32 {\n\tu32 modes;\n\ts32 offset;\n\ts32 freq;\n\ts32 maxerror;\n\ts32 esterror;\n\ts32 status;\n\ts32 constant;\n\ts32 precision;\n\ts32 tolerance;\n\tstruct old_timeval32 time;\n\ts32 tick;\n\ts32 ppsfreq;\n\ts32 jitter;\n\ts32 shift;\n\ts32 stabil;\n\ts32 jitcnt;\n\ts32 calcnt;\n\ts32 errcnt;\n\ts32 stbcnt;\n\ts32 tai;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct old_utimbuf32 {\n\told_time32_t actime;\n\told_time32_t modtime;\n};\n\nstruct old_utsname {\n\tchar sysname[65];\n\tchar nodename[65];\n\tchar release[65];\n\tchar version[65];\n\tchar machine[65];\n};\n\nstruct oldold_utsname {\n\tchar sysname[9];\n\tchar nodename[9];\n\tchar release[9];\n\tchar version[9];\n\tchar machine[9];\n};\n\nstruct once_work {\n\tstruct work_struct work;\n\tstruct static_key_true *key;\n\tstruct module *module;\n};\n\nstruct online_data {\n\tunsigned int cpu;\n\tbool online;\n};\n\nstruct oom_control {\n\tstruct zonelist *zonelist;\n\tnodemask_t *nodemask;\n\tstruct mem_cgroup *memcg;\n\tconst gfp_t gfp_mask;\n\tconst int order;\n\tlong unsigned int totalpages;\n\tstruct task_struct *chosen;\n\tlong int chosen_points;\n\tenum oom_constraint constraint;\n};\n\nstruct opal_compacket {\n\t__be32 reserved0;\n\tu8 extendedComID[4];\n\t__be32 outstandingData;\n\t__be32 minTransfer;\n\t__be32 length;\n};\n\nstruct opal_data_subpacket {\n\tu8 reserved0[6];\n\t__be16 kind;\n\t__be32 length;\n};\n\ntypedef int sec_send_recv(void *, u16, u8, void *, size_t, bool);\n\nstruct opal_resp_tok {\n\tconst u8 *pos;\n\tsize_t len;\n\tenum opal_response_token type;\n\tenum opal_atom_width width;\n\tunion {\n\t\tu64 u;\n\t\ts64 s;\n\t} stored;\n};\n\nstruct parsed_resp {\n\tint num;\n\tstruct opal_resp_tok toks[64];\n};\n\nstruct opal_dev {\n\tu32 flags;\n\tvoid *data;\n\tsec_send_recv *send_recv;\n\tstruct mutex dev_lock;\n\tu16 comid;\n\tu32 hsn;\n\tu32 tsn;\n\tu64 align;\n\tu64 lowest_lba;\n\tu32 logical_block_size;\n\tu8 align_required;\n\tsize_t pos;\n\tu8 *cmd;\n\tu8 *resp;\n\tstruct parsed_resp parsed;\n\tsize_t prev_d_len;\n\tvoid *prev_data;\n\tstruct list_head unlk_lst;\n};\n\nstruct opal_discovery {\n\t__u64 data;\n\t__u64 size;\n};\n\nstruct opal_geometry {\n\t__u8 align;\n\t__u32 logical_block_size;\n\t__u64 alignment_granularity;\n\t__u64 lowest_aligned_lba;\n\t__u8 __align[3];\n};\n\nstruct opal_packet {\n\t__be32 tsn;\n\t__be32 hsn;\n\t__be32 seq_number;\n\t__be16 reserved0;\n\t__be16 ack_type;\n\t__be32 acknowledgment;\n\t__be32 length;\n};\n\nstruct opal_header {\n\tstruct opal_compacket cp;\n\tstruct opal_packet pkt;\n\tstruct opal_data_subpacket subpkt;\n};\n\nstruct opal_key {\n\t__u8 lr;\n\t__u8 key_len;\n\t__u8 key_type;\n\t__u8 __align[5];\n\t__u8 key[256];\n};\n\nstruct opal_session_info {\n\t__u32 sum;\n\t__u32 who;\n\tstruct opal_key opal_key;\n};\n\nstruct opal_lock_unlock {\n\tstruct opal_session_info session;\n\t__u32 l_state;\n\t__u16 flags;\n\t__u8 __align[2];\n};\n\nstruct opal_lr_act {\n\tstruct opal_key key;\n\t__u32 sum;\n\t__u8 num_lrs;\n\t__u8 lr[9];\n\t__u8 align[2];\n};\n\nstruct opal_lr_status {\n\tstruct opal_session_info session;\n\t__u64 range_start;\n\t__u64 range_length;\n\t__u32 RLE;\n\t__u32 WLE;\n\t__u32 l_state;\n\t__u8 align[4];\n};\n\nstruct opal_mbr_data {\n\tstruct opal_key key;\n\t__u8 enable_disable;\n\t__u8 __align[7];\n};\n\nstruct opal_mbr_done {\n\tstruct opal_key key;\n\t__u8 done_flag;\n\t__u8 __align[7];\n};\n\nstruct opal_new_pw {\n\tstruct opal_session_info session;\n\tstruct opal_session_info new_user_pw;\n};\n\nstruct opal_read_write_table {\n\tstruct opal_key key;\n\tconst __u64 data;\n\tconst __u8 table_uid[8];\n\t__u64 offset;\n\t__u64 size;\n\t__u64 flags;\n\t__u64 priv;\n};\n\nstruct opal_revert_lsp {\n\tstruct opal_key key;\n\t__u32 options;\n\t__u32 __pad;\n};\n\nstruct opal_shadow_mbr {\n\tstruct opal_key key;\n\tconst __u64 data;\n\t__u64 offset;\n\t__u64 size;\n};\n\nstruct opal_status {\n\t__u32 flags;\n\t__u32 reserved;\n};\n\nstruct opal_step {\n\tint (*fn)(struct opal_dev *, void *);\n\tvoid *data;\n};\n\nstruct opal_suspend_data {\n\tstruct opal_lock_unlock unlk;\n\tu8 lr;\n\tstruct list_head node;\n};\n\nstruct opal_user_lr_setup {\n\t__u64 range_start;\n\t__u64 range_length;\n\t__u32 RLE;\n\t__u32 WLE;\n\tstruct opal_session_info session;\n};\n\nstruct open_flags {\n\tint open_flag;\n\tumode_t mode;\n\tint acc_mode;\n\tint intent;\n\tint lookup_flags;\n};\n\nstruct opp_config_data {\n\tstruct opp_table *opp_table;\n\tunsigned int flags;\n};\n\nstruct opp_device {\n\tstruct list_head node;\n\tconst struct device *dev;\n\tstruct dentry *dentry;\n};\n\nstruct opp_table {\n\tstruct list_head node;\n\tstruct list_head lazy;\n\tstruct blocking_notifier_head head;\n\tstruct list_head dev_list;\n\tstruct list_head opp_list;\n\tstruct kref kref;\n\tstruct mutex lock;\n\tstruct device_node *np;\n\tlong unsigned int clock_latency_ns_max;\n\tunsigned int voltage_tolerance_v1;\n\tunsigned int parsed_static_opps;\n\tenum opp_table_access shared_opp;\n\tlong unsigned int current_rate_single_clk;\n\tstruct dev_pm_opp *current_opp;\n\tstruct dev_pm_opp *suspend_opp;\n\tstruct opp_table **required_opp_tables;\n\tstruct device **required_devs;\n\tunsigned int required_opp_count;\n\tunsigned int *supported_hw;\n\tunsigned int supported_hw_count;\n\tconst char *prop_name;\n\tconfig_clks_t config_clks;\n\tstruct clk **clks;\n\tstruct clk *clk;\n\tint clk_count;\n\tconfig_regulators_t config_regulators;\n\tstruct regulator **regulators;\n\tint regulator_count;\n\tstruct icc_path **paths;\n\tunsigned int path_count;\n\tbool enabled;\n\tbool is_genpd;\n\tstruct dentry *dentry;\n\tchar dentry_name[255];\n};\n\nstruct optimistic_spin_node {\n\tstruct optimistic_spin_node *next;\n\tstruct optimistic_spin_node *prev;\n\tint locked;\n\tint cpu;\n};\n\nstruct optimized_kprobe {\n\tstruct kprobe kp;\n\tstruct list_head list;\n\tstruct arch_optimized_insn optinsn;\n};\n\nstruct orlov_stats {\n\t__u64 free_clusters;\n\t__u32 free_inodes;\n\t__u32 used_dirs;\n};\n\nstruct osapsess {\n\tuint32_t handle;\n\tunsigned char secret[20];\n\tunsigned char enonce[20];\n};\n\nstruct osn_irq {\n\tu64 count;\n\tu64 arrival_time;\n\tu64 delta_start;\n};\n\nstruct osn_nmi {\n\tu64 count;\n\tu64 delta_start;\n};\n\nstruct osn_softirq {\n\tu64 count;\n\tu64 arrival_time;\n\tu64 delta_start;\n};\n\nstruct osn_thread {\n\tu64 count;\n\tu64 arrival_time;\n\tu64 delta_start;\n};\n\nstruct osnoise_data {\n\tu64 sample_period;\n\tu64 sample_runtime;\n\tu64 stop_tracing;\n\tu64 stop_tracing_total;\n\tu64 timerlat_period;\n\tu64 print_stack;\n\tint timerlat_tracer;\n\tbool tainted;\n};\n\nstruct osnoise_entry {\n\tstruct trace_entry ent;\n\tu64 noise;\n\tu64 runtime;\n\tu64 max_sample;\n\tunsigned int hw_count;\n\tunsigned int nmi_count;\n\tunsigned int irq_count;\n\tunsigned int softirq_count;\n\tunsigned int thread_count;\n};\n\nstruct osnoise_instance {\n\tstruct list_head list;\n\tstruct trace_array *tr;\n};\n\nstruct osnoise_sample {\n\tu64 runtime;\n\tu64 noise;\n\tu64 max_sample;\n\tint hw_count;\n\tint nmi_count;\n\tint irq_count;\n\tint softirq_count;\n\tint thread_count;\n};\n\nstruct osnoise_variables {\n\tstruct task_struct *kthread;\n\tbool sampling;\n\tpid_t pid;\n\tstruct osn_nmi nmi;\n\tstruct osn_irq irq;\n\tstruct osn_softirq softirq;\n\tstruct osn_thread thread;\n\tlocal_t int_counter;\n};\n\nstruct out_of_bounds_data {\n\tstruct source_location location;\n\tstruct type_descriptor *array_type;\n\tstruct type_descriptor *index_type;\n};\n\nstruct overflow_data {\n\tstruct source_location location;\n\tstruct type_descriptor *type;\n};\n\nstruct x86_cpu_id {\n\t__u16 vendor;\n\t__u16 family;\n\t__u16 model;\n\t__u16 steppings;\n\t__u16 feature;\n\t__u16 flags;\n\tkernel_ulong_t driver_data;\n};\n\nstruct override_status_id {\n\tstruct acpi_device_id hid[2];\n\tstruct x86_cpu_id cpu_ids[2];\n\tstruct dmi_system_id dmi_ids[2];\n\tconst char *uid;\n\tconst char *path;\n\tlong long unsigned int status;\n};\n\nstruct p2sb_res_cache {\n\tu32 bus_dev_id;\n\tstruct resource res;\n};\n\nstruct p4_event_alias {\n\tu64 original;\n\tu64 alternative;\n};\n\nstruct p4_event_bind {\n\tunsigned int opcode;\n\tunsigned int escr_msr[2];\n\tunsigned int escr_emask;\n\tunsigned int shared;\n\tsigned char cntr[6];\n};\n\nstruct p4_pebs_bind {\n\tunsigned int metric_pebs;\n\tunsigned int metric_vert;\n};\n\nstruct pacct_struct {\n\tint ac_flag;\n\tlong int ac_exitcode;\n\tlong unsigned int ac_mem;\n\tu64 ac_utime;\n\tu64 ac_stime;\n\tlong unsigned int ac_minflt;\n\tlong unsigned int ac_majflt;\n};\n\nstruct scsi_sense_hdr;\n\nstruct packet_command {\n\tunsigned char cmd[12];\n\tunsigned char *buffer;\n\tunsigned int buflen;\n\tint stat;\n\tstruct scsi_sense_hdr *sshdr;\n\tunsigned char data_direction;\n\tint quiet;\n\tint timeout;\n\tvoid *reserved[1];\n};\n\nstruct packet_fanout {\n\tpossible_net_t net;\n\tunsigned int num_members;\n\tu32 max_num_members;\n\tu16 id;\n\tu8 type;\n\tu8 flags;\n\tunion {\n\t\tatomic_t rr_cur;\n\t\tstruct bpf_prog *bpf_prog;\n\t};\n\tstruct list_head list;\n\tspinlock_t lock;\n\trefcount_t sk_ref;\n\tlong: 64;\n\tstruct packet_type prot_hook;\n\tstruct sock *arr[0];\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct packet_mclist {\n\tstruct packet_mclist *next;\n\tint ifindex;\n\tint count;\n\tshort unsigned int type;\n\tshort unsigned int alen;\n\tunsigned char addr[32];\n};\n\nstruct packet_mreq_max {\n\tint mr_ifindex;\n\tshort unsigned int mr_type;\n\tshort unsigned int mr_alen;\n\tunsigned char mr_address[32];\n};\n\nstruct pgv;\n\nstruct tpacket_kbdq_core {\n\tstruct pgv *pkbdq;\n\tunsigned int feature_req_word;\n\tunsigned int hdrlen;\n\tunsigned char reset_pending_on_curr_blk;\n\tunsigned char delete_blk_timer;\n\tshort unsigned int kactive_blk_num;\n\tshort unsigned int blk_sizeof_priv;\n\tshort unsigned int last_kactive_blk_num;\n\tchar *pkblk_start;\n\tchar *pkblk_end;\n\tint kblk_size;\n\tunsigned int max_frame_len;\n\tunsigned int knum_blocks;\n\tuint64_t knxt_seq_num;\n\tchar *prev;\n\tchar *nxt_offset;\n\tstruct sk_buff *skb;\n\trwlock_t blk_fill_in_prog_lock;\n\tshort unsigned int retire_blk_tov;\n\tshort unsigned int version;\n\tlong unsigned int tov_in_jiffies;\n\tstruct timer_list retire_blk_timer;\n};\n\nstruct packet_ring_buffer {\n\tstruct pgv *pg_vec;\n\tunsigned int head;\n\tunsigned int frames_per_block;\n\tunsigned int frame_size;\n\tunsigned int frame_max;\n\tunsigned int pg_vec_order;\n\tunsigned int pg_vec_pages;\n\tunsigned int pg_vec_len;\n\tunsigned int *pending_refcnt;\n\tunion {\n\t\tlong unsigned int *rx_owner_map;\n\t\tstruct tpacket_kbdq_core prb_bdqc;\n\t};\n};\n\nstruct packet_rollover {\n\tint sock;\n\tatomic_long_t num;\n\tatomic_long_t num_huge;\n\tatomic_long_t num_failed;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tu32 history[16];\n};\n\nstruct sockaddr_pkt {\n\tshort unsigned int spkt_family;\n\tunsigned char spkt_device[14];\n\t__be16 spkt_protocol;\n};\n\nstruct sockaddr_ll {\n\tshort unsigned int sll_family;\n\t__be16 sll_protocol;\n\tint sll_ifindex;\n\tshort unsigned int sll_hatype;\n\tunsigned char sll_pkttype;\n\tunsigned char sll_halen;\n\tunsigned char sll_addr[8];\n};\n\nstruct packet_skb_cb {\n\tunion {\n\t\tstruct sockaddr_pkt pkt;\n\t\tunion {\n\t\t\tunsigned int origlen;\n\t\t\tstruct sockaddr_ll ll;\n\t\t};\n\t} sa;\n};\n\nstruct tpacket_stats {\n\tunsigned int tp_packets;\n\tunsigned int tp_drops;\n};\n\nstruct tpacket_stats_v3 {\n\tunsigned int tp_packets;\n\tunsigned int tp_drops;\n\tunsigned int tp_freeze_q_cnt;\n};\n\nunion tpacket_stats_u {\n\tstruct tpacket_stats stats1;\n\tstruct tpacket_stats_v3 stats3;\n};\n\nstruct packet_sock {\n\tstruct sock sk;\n\tstruct packet_fanout *fanout;\n\tunion tpacket_stats_u stats;\n\tstruct packet_ring_buffer rx_ring;\n\tstruct packet_ring_buffer tx_ring;\n\tint copy_thresh;\n\tspinlock_t bind_lock;\n\tstruct mutex pg_vec_lock;\n\tlong unsigned int flags;\n\tint ifindex;\n\tu8 vnet_hdr_sz;\n\t__be16 num;\n\tstruct packet_rollover *rollover;\n\tstruct packet_mclist *mclist;\n\tatomic_long_t mapped;\n\tenum tpacket_versions tp_version;\n\tunsigned int tp_hdrlen;\n\tunsigned int tp_reserve;\n\tunsigned int tp_tstamp;\n\tstruct completion skb_completion;\n\tstruct net_device *cached_dev;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tstruct packet_type prot_hook;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tatomic_t tp_drops;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct padata_cpumask {\n\tcpumask_var_t pcpu;\n\tcpumask_var_t cbcpu;\n};\n\nstruct padata_instance {\n\tstruct hlist_node cpu_online_node;\n\tstruct hlist_node cpu_dead_node;\n\tstruct workqueue_struct *parallel_wq;\n\tstruct workqueue_struct *serial_wq;\n\tstruct list_head pslist;\n\tstruct padata_cpumask cpumask;\n\tstruct kobject kobj;\n\tstruct mutex lock;\n\tu8 flags;\n};\n\nstruct padata_list {\n\tstruct list_head list;\n\tspinlock_t lock;\n};\n\nstruct padata_mt_job {\n\tvoid (*thread_fn)(long unsigned int, long unsigned int, void *);\n\tvoid *fn_arg;\n\tlong unsigned int start;\n\tlong unsigned int size;\n\tlong unsigned int align;\n\tlong unsigned int min_chunk;\n\tint max_threads;\n\tbool numa_aware;\n};\n\nstruct padata_mt_job_state {\n\tspinlock_t lock;\n\tstruct completion completion;\n\tstruct padata_mt_job *job;\n\tint nworks;\n\tint nworks_fini;\n\tlong unsigned int chunk_size;\n};\n\nstruct parallel_data;\n\nstruct padata_priv {\n\tstruct list_head list;\n\tstruct parallel_data *pd;\n\tint cb_cpu;\n\tunsigned int seq_nr;\n\tint info;\n\tvoid (*parallel)(struct padata_priv *);\n\tvoid (*serial)(struct padata_priv *);\n};\n\nstruct padata_serial_queue {\n\tstruct padata_list serial;\n\tstruct work_struct work;\n\tstruct parallel_data *pd;\n};\n\nstruct padata_shell {\n\tstruct padata_instance *pinst;\n\tstruct parallel_data *pd;\n\tstruct parallel_data *opd;\n\tstruct list_head list;\n};\n\nstruct padata_sysfs_entry {\n\tstruct attribute attr;\n\tssize_t (*show)(struct padata_instance *, struct attribute *, char *);\n\tssize_t (*store)(struct padata_instance *, struct attribute *, const char *, size_t);\n};\n\nstruct padata_work {\n\tstruct work_struct pw_work;\n\tstruct list_head pw_list;\n\tvoid *pw_data;\n};\n\ntypedef struct page *pgtable_t;\n\nstruct printf_spec;\n\nstruct page_flags_fields {\n\tint width;\n\tint shift;\n\tint mask;\n\tconst struct printf_spec *spec;\n\tconst char *name;\n};\n\nstruct page_list {\n\tstruct page_list *next;\n\tstruct page *page;\n};\n\nstruct page_pool_params_fast {\n\tunsigned int order;\n\tunsigned int pool_size;\n\tint nid;\n\tstruct device *dev;\n\tstruct napi_struct *napi;\n\tenum dma_data_direction dma_dir;\n\tunsigned int max_len;\n\tunsigned int offset;\n};\n\nstruct page_pool_alloc_stats {\n\tu64 fast;\n\tu64 slow;\n\tu64 slow_high_order;\n\tu64 empty;\n\tu64 refill;\n\tu64 waive;\n};\n\nstruct pp_alloc_cache {\n\tu32 count;\n\tnetmem_ref cache[128];\n};\n\nstruct ptr_ring {\n\tint producer;\n\tspinlock_t producer_lock;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tint consumer_head;\n\tint consumer_tail;\n\tspinlock_t consumer_lock;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tint size;\n\tint batch;\n\tvoid **queue;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct page_pool_params_slow {\n\tstruct net_device *netdev;\n\tunsigned int flags;\n\tvoid (*init_callback)(netmem_ref, void *);\n\tvoid *init_arg;\n};\n\nstruct page_pool_recycle_stats;\n\nstruct page_pool {\n\tstruct page_pool_params_fast p;\n\tint cpuid;\n\tu32 pages_state_hold_cnt;\n\tbool has_init_callback: 1;\n\tbool dma_map: 1;\n\tbool dma_sync: 1;\n\tbool system: 1;\n\tlong: 0;\n\t__u8 __cacheline_group_begin__frag[0];\n\tlong int frag_users;\n\tnetmem_ref frag_page;\n\tunsigned int frag_offset;\n\tlong: 0;\n\t__u8 __cacheline_group_end__frag[0];\n\tlong: 64;\n\tstruct {} __cacheline_group_pad__frag;\n\tstruct delayed_work release_dw;\n\tvoid (*disconnect)(void *);\n\tlong unsigned int defer_start;\n\tlong unsigned int defer_warn;\n\tstruct page_pool_alloc_stats alloc_stats;\n\tu32 xdp_mem_id;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tstruct pp_alloc_cache alloc;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tstruct ptr_ring ring;\n\tstruct page_pool_recycle_stats *recycle_stats;\n\tatomic_t pages_state_release_cnt;\n\trefcount_t user_cnt;\n\tu64 destroy_cnt;\n\tstruct page_pool_params_slow slow;\n\tstruct {\n\t\tstruct hlist_node list;\n\t\tu64 detach_time;\n\t\tu32 napi_id;\n\t\tu32 id;\n\t} user;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct page_pool_dump_cb {\n\tlong unsigned int ifindex;\n\tu32 pp_id;\n};\n\nstruct page_pool_params {\n\tunion {\n\t\tstruct {\n\t\t\tunsigned int order;\n\t\t\tunsigned int pool_size;\n\t\t\tint nid;\n\t\t\tstruct device *dev;\n\t\t\tstruct napi_struct *napi;\n\t\t\tenum dma_data_direction dma_dir;\n\t\t\tunsigned int max_len;\n\t\t\tunsigned int offset;\n\t\t};\n\t\tstruct page_pool_params_fast fast;\n\t};\n\tunion {\n\t\tstruct {\n\t\t\tstruct net_device *netdev;\n\t\t\tunsigned int flags;\n\t\t\tvoid (*init_callback)(netmem_ref, void *);\n\t\t\tvoid *init_arg;\n\t\t};\n\t\tstruct page_pool_params_slow slow;\n\t};\n};\n\nstruct page_pool_recycle_stats {\n\tu64 cached;\n\tu64 cache_full;\n\tu64 ring;\n\tu64 ring_full;\n\tu64 released_refcnt;\n};\n\nstruct page_pool_stats {\n\tstruct page_pool_alloc_stats alloc_stats;\n\tstruct page_pool_recycle_stats recycle_stats;\n};\n\nstruct page_region {\n\t__u64 start;\n\t__u64 end;\n\t__u64 categories;\n};\n\nstruct page_reporting_dev_info {\n\tint (*report)(struct page_reporting_dev_info *, struct scatterlist *, unsigned int);\n\tstruct delayed_work work;\n\tatomic_t state;\n\tunsigned int order;\n};\n\nstruct page_req_dsc {\n\tunion {\n\t\tstruct {\n\t\t\tu64 type: 8;\n\t\t\tu64 pasid_present: 1;\n\t\t\tu64 rsvd: 7;\n\t\t\tu64 rid: 16;\n\t\t\tu64 pasid: 20;\n\t\t\tu64 exe_req: 1;\n\t\t\tu64 pm_req: 1;\n\t\t\tu64 rsvd2: 10;\n\t\t};\n\t\tu64 qw_0;\n\t};\n\tunion {\n\t\tstruct {\n\t\t\tu64 rd_req: 1;\n\t\t\tu64 wr_req: 1;\n\t\t\tu64 lpig: 1;\n\t\t\tu64 prg_index: 9;\n\t\t\tu64 addr: 52;\n\t\t};\n\t\tu64 qw_1;\n\t};\n\tu64 qw_2;\n\tu64 qw_3;\n};\n\nstruct page_state {\n\tlong unsigned int mask;\n\tlong unsigned int res;\n\tenum mf_action_page_type type;\n\tint (*action)(struct page_state *, struct page *);\n};\n\nstruct page_vma_mapped_walk {\n\tlong unsigned int pfn;\n\tlong unsigned int nr_pages;\n\tlong unsigned int pgoff;\n\tstruct vm_area_struct *vma;\n\tlong unsigned int address;\n\tpmd_t *pmd;\n\tpte_t *pte;\n\tspinlock_t *ptl;\n\tunsigned int flags;\n};\n\nstruct pm_scan_arg {\n\t__u64 size;\n\t__u64 flags;\n\t__u64 start;\n\t__u64 end;\n\t__u64 walk_end;\n\t__u64 vec;\n\t__u64 vec_len;\n\t__u64 max_pages;\n\t__u64 category_inverted;\n\t__u64 category_mask;\n\t__u64 category_anyof_mask;\n\t__u64 return_mask;\n};\n\nstruct pagemap_scan_private {\n\tstruct pm_scan_arg arg;\n\tlong unsigned int masks_of_interest;\n\tlong unsigned int cur_vma_category;\n\tstruct page_region *vec_buf;\n\tlong unsigned int vec_buf_len;\n\tlong unsigned int vec_buf_index;\n\tlong unsigned int found_pages;\n\tstruct page_region *vec_out;\n};\n\nstruct pagemapread {\n\tint pos;\n\tint len;\n\tpagemap_entry_t *buffer;\n\tbool show_pfn;\n};\n\nstruct pagerange_state {\n\tlong unsigned int cur_pfn;\n\tint ram;\n\tint not_ram;\n};\n\nstruct pages_devres {\n\tlong unsigned int addr;\n\tunsigned int order;\n};\n\nstruct palmas_gpadc;\n\nstruct palmas_pmic_driver_data;\n\nstruct palmas_pmic;\n\nstruct palmas_resource;\n\nstruct palmas_usb;\n\nstruct palmas {\n\tstruct device *dev;\n\tstruct i2c_client *i2c_clients[3];\n\tstruct regmap *regmap[3];\n\tint id;\n\tunsigned int features;\n\tint irq;\n\tu32 irq_mask;\n\tstruct mutex irq_lock;\n\tstruct regmap_irq_chip_data *irq_data;\n\tstruct palmas_pmic_driver_data *pmic_ddata;\n\tstruct palmas_pmic *pmic;\n\tstruct palmas_gpadc *gpadc;\n\tstruct palmas_resource *resource;\n\tstruct palmas_usb *usb;\n\tu8 gpio_muxed;\n\tu8 led_muxed;\n\tu8 pwm_muxed;\n};\n\nstruct palmas_clk_platform_data {\n\tint clk32kg_mode_sleep;\n\tint clk32kgaudio_mode_sleep;\n};\n\nstruct palmas_device_data {\n\tint ngpio;\n};\n\nstruct palmas_driver_data {\n\tunsigned int features;\n\tconst struct regmap_irq_chip *irq_chip;\n};\n\nstruct palmas_gpadc_platform_data {\n\tint ch3_current;\n\tint ch0_current;\n\tbool extended_delay;\n\tint bat_removal;\n\tint start_polarity;\n\tint auto_conversion_period_ms;\n};\n\nstruct palmas_gpio {\n\tstruct gpio_chip gpio_chip;\n\tstruct palmas *palmas;\n};\n\nstruct palmas_pmic_platform_data;\n\nstruct palmas_usb_platform_data;\n\nstruct palmas_resource_platform_data;\n\nstruct palmas_platform_data {\n\tint irq_flags;\n\tint gpio_base;\n\tu8 power_ctrl;\n\tint mux_from_pdata;\n\tu8 pad1;\n\tu8 pad2;\n\tbool pm_off;\n\tstruct palmas_pmic_platform_data *pmic_pdata;\n\tstruct palmas_gpadc_platform_data *gpadc_pdata;\n\tstruct palmas_usb_platform_data *usb_pdata;\n\tstruct palmas_resource_platform_data *resource_pdata;\n\tstruct palmas_clk_platform_data *clk_pdata;\n};\n\nstruct regulator_config;\n\nstruct regulator_ops;\n\nstruct regulator_desc {\n\tconst char *name;\n\tconst char *supply_name;\n\tconst char *of_match;\n\tbool of_match_full_name;\n\tconst char *regulators_node;\n\tint (*of_parse_cb)(struct device_node *, const struct regulator_desc *, struct regulator_config *);\n\tint id;\n\tunsigned int continuous_voltage_range: 1;\n\tunsigned int n_voltages;\n\tunsigned int n_current_limits;\n\tconst struct regulator_ops *ops;\n\tint irq;\n\tenum regulator_type type;\n\tstruct module *owner;\n\tunsigned int min_uV;\n\tunsigned int uV_step;\n\tunsigned int linear_min_sel;\n\tint fixed_uV;\n\tunsigned int ramp_delay;\n\tint min_dropout_uV;\n\tconst struct linear_range *linear_ranges;\n\tconst unsigned int *linear_range_selectors_bitfield;\n\tint n_linear_ranges;\n\tconst unsigned int *volt_table;\n\tconst unsigned int *curr_table;\n\tunsigned int vsel_range_reg;\n\tunsigned int vsel_range_mask;\n\tbool range_applied_by_vsel;\n\tunsigned int vsel_reg;\n\tunsigned int vsel_mask;\n\tunsigned int vsel_step;\n\tunsigned int csel_reg;\n\tunsigned int csel_mask;\n\tunsigned int apply_reg;\n\tunsigned int apply_bit;\n\tunsigned int enable_reg;\n\tunsigned int enable_mask;\n\tunsigned int enable_val;\n\tunsigned int disable_val;\n\tbool enable_is_inverted;\n\tunsigned int bypass_reg;\n\tunsigned int bypass_mask;\n\tunsigned int bypass_val_on;\n\tunsigned int bypass_val_off;\n\tunsigned int active_discharge_on;\n\tunsigned int active_discharge_off;\n\tunsigned int active_discharge_mask;\n\tunsigned int active_discharge_reg;\n\tunsigned int soft_start_reg;\n\tunsigned int soft_start_mask;\n\tunsigned int soft_start_val_on;\n\tunsigned int pull_down_reg;\n\tunsigned int pull_down_mask;\n\tunsigned int pull_down_val_on;\n\tunsigned int ramp_reg;\n\tunsigned int ramp_mask;\n\tconst unsigned int *ramp_delay_table;\n\tunsigned int n_ramp_values;\n\tunsigned int enable_time;\n\tunsigned int off_on_delay;\n\tunsigned int poll_enabled_time;\n\tunsigned int (*of_map_mode)(unsigned int);\n};\n\nstruct palmas_pmic {\n\tstruct palmas *palmas;\n\tstruct device *dev;\n\tstruct regulator_desc desc[27];\n\tstruct mutex mutex;\n\tint smps123;\n\tint smps457;\n\tint smps12;\n\tint range[10];\n\tunsigned int ramp_delay[10];\n\tunsigned int current_reg_mode[10];\n};\n\nstruct of_regulator_match;\n\nstruct palmas_regs_info;\n\nstruct palmas_sleep_requestor_info;\n\nstruct palmas_pmic_driver_data {\n\tint smps_start;\n\tint smps_end;\n\tint ldo_begin;\n\tint ldo_end;\n\tint max_reg;\n\tbool has_regen3;\n\tstruct palmas_regs_info *palmas_regs_info;\n\tstruct of_regulator_match *palmas_matches;\n\tstruct palmas_sleep_requestor_info *sleep_req_info;\n\tint (*smps_register)(struct palmas_pmic *, struct palmas_pmic_driver_data *, struct palmas_pmic_platform_data *, const char *, struct regulator_config);\n\tint (*ldo_register)(struct palmas_pmic *, struct palmas_pmic_driver_data *, struct palmas_pmic_platform_data *, const char *, struct regulator_config);\n};\n\nstruct palmas_reg_init;\n\nstruct palmas_pmic_platform_data {\n\tstruct regulator_init_data *reg_data[27];\n\tstruct palmas_reg_init *reg_init[27];\n\tint ldo6_vibrator;\n\tbool enable_ldo8_tracking;\n};\n\nstruct palmas_reg_init {\n\tint warm_reset;\n\tint roof_floor;\n\tint mode_sleep;\n\tu8 vsel;\n};\n\nstruct palmas_regs_info {\n\tchar *name;\n\tchar *sname;\n\tu8 vsel_addr;\n\tu8 ctrl_addr;\n\tu8 tstep_addr;\n\tint sleep_id;\n};\n\nstruct palmas_resource {\n\tstruct palmas *palmas;\n\tstruct device *dev;\n};\n\nstruct palmas_resource_platform_data {\n\tint regen1_mode_sleep;\n\tint regen2_mode_sleep;\n\tint sysen1_mode_sleep;\n\tint sysen2_mode_sleep;\n\tu8 nsleep_res;\n\tu8 nsleep_smps;\n\tu8 nsleep_ldo1;\n\tu8 nsleep_ldo2;\n\tu8 enable1_res;\n\tu8 enable1_smps;\n\tu8 enable1_ldo1;\n\tu8 enable1_ldo2;\n\tu8 enable2_res;\n\tu8 enable2_smps;\n\tu8 enable2_ldo1;\n\tu8 enable2_ldo2;\n};\n\nstruct palmas_sleep_requestor_info {\n\tint id;\n\tint reg_offset;\n\tint bit_pos;\n};\n\nstruct palmas_usb {\n\tstruct palmas *palmas;\n\tstruct device *dev;\n\tstruct extcon_dev *edev;\n\tint id_otg_irq;\n\tint id_irq;\n\tint vbus_otg_irq;\n\tint vbus_irq;\n\tint gpio_id_irq;\n\tint gpio_vbus_irq;\n\tstruct gpio_desc *id_gpiod;\n\tstruct gpio_desc *vbus_gpiod;\n\tlong unsigned int sw_debounce_jiffies;\n\tstruct delayed_work wq_detectid;\n\tenum palmas_usb_state linkstat;\n\tint wakeup;\n\tbool enable_vbus_detection;\n\tbool enable_id_detection;\n\tbool enable_gpio_id_detection;\n\tbool enable_gpio_vbus_detection;\n};\n\nstruct palmas_usb_platform_data {\n\tint wakeup;\n};\n\nstruct panel_bridge {\n\tstruct drm_bridge bridge;\n\tstruct drm_connector connector;\n\tstruct drm_panel *panel;\n\tu32 connector_type;\n};\n\nstruct parallel_data {\n\tstruct padata_shell *ps;\n\tstruct padata_list *reorder_list;\n\tstruct padata_serial_queue *squeue;\n\trefcount_t refcnt;\n\tunsigned int seq_nr;\n\tunsigned int processed;\n\tint cpu;\n\tstruct padata_cpumask cpumask;\n\tstruct work_struct reorder_work;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tspinlock_t lock;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct thermal_genl_cpu_caps;\n\nstruct param {\n\tstruct nlattr **attrs;\n\tstruct sk_buff *msg;\n\tconst char *name;\n\tint tz_id;\n\tint cdev_id;\n\tint trip_id;\n\tint trip_temp;\n\tint trip_type;\n\tint trip_hyst;\n\tint temp;\n\tint cdev_state;\n\tint cdev_max_state;\n\tstruct thermal_genl_cpu_caps *cpu_capabilities;\n\tint cpu_capabilities_count;\n};\n\nstruct paravirt_callee_save {\n\tvoid *func;\n};\n\nstruct thread_struct;\n\nstruct pv_cpu_ops {\n\tvoid (*io_delay)(void);\n\tlong unsigned int (*get_debugreg)(int);\n\tvoid (*set_debugreg)(int, long unsigned int);\n\tlong unsigned int (*read_cr0)(void);\n\tvoid (*write_cr0)(long unsigned int);\n\tvoid (*write_cr4)(long unsigned int);\n\tvoid (*load_tr_desc)(void);\n\tvoid (*load_gdt)(const struct desc_ptr *);\n\tvoid (*load_idt)(const struct desc_ptr *);\n\tvoid (*set_ldt)(const void *, unsigned int);\n\tlong unsigned int (*store_tr)(void);\n\tvoid (*load_tls)(struct thread_struct *, unsigned int);\n\tvoid (*load_gs_index)(unsigned int);\n\tvoid (*write_ldt_entry)(struct desc_struct *, int, const void *);\n\tvoid (*write_gdt_entry)(struct desc_struct *, int, const void *, int);\n\tvoid (*write_idt_entry)(gate_desc *, int, const gate_desc *);\n\tvoid (*alloc_ldt)(struct desc_struct *, unsigned int);\n\tvoid (*free_ldt)(struct desc_struct *, unsigned int);\n\tvoid (*load_sp0)(long unsigned int);\n\tvoid (*invalidate_io_bitmap)(void);\n\tvoid (*update_io_bitmap)(void);\n\tvoid (*wbinvd)(void);\n\tvoid (*cpuid)(unsigned int *, unsigned int *, unsigned int *, unsigned int *);\n\tu64 (*read_msr)(unsigned int);\n\tvoid (*write_msr)(unsigned int, unsigned int, unsigned int);\n\tu64 (*read_msr_safe)(unsigned int, int *);\n\tint (*write_msr_safe)(unsigned int, unsigned int, unsigned int);\n\tu64 (*read_pmc)(int);\n\tvoid (*start_context_switch)(struct task_struct *);\n\tvoid (*end_context_switch)(struct task_struct *);\n};\n\nstruct pv_irq_ops {\n\tstruct paravirt_callee_save save_fl;\n\tstruct paravirt_callee_save irq_disable;\n\tstruct paravirt_callee_save irq_enable;\n\tvoid (*safe_halt)(void);\n\tvoid (*halt)(void);\n};\n\nstruct pv_lazy_ops {\n\tvoid (*enter)(void);\n\tvoid (*leave)(void);\n\tvoid (*flush)(void);\n};\n\nstruct pv_mmu_ops {\n\tvoid (*flush_tlb_user)(void);\n\tvoid (*flush_tlb_kernel)(void);\n\tvoid (*flush_tlb_one_user)(long unsigned int);\n\tvoid (*flush_tlb_multi)(const struct cpumask *, const struct flush_tlb_info *);\n\tvoid (*tlb_remove_table)(struct mmu_gather *, void *);\n\tvoid (*exit_mmap)(struct mm_struct *);\n\tvoid (*notify_page_enc_status_changed)(long unsigned int, int, bool);\n\tstruct paravirt_callee_save read_cr2;\n\tvoid (*write_cr2)(long unsigned int);\n\tlong unsigned int (*read_cr3)(void);\n\tvoid (*write_cr3)(long unsigned int);\n\tvoid (*enter_mmap)(struct mm_struct *);\n\tint (*pgd_alloc)(struct mm_struct *);\n\tvoid (*pgd_free)(struct mm_struct *, pgd_t *);\n\tvoid (*alloc_pte)(struct mm_struct *, long unsigned int);\n\tvoid (*alloc_pmd)(struct mm_struct *, long unsigned int);\n\tvoid (*alloc_pud)(struct mm_struct *, long unsigned int);\n\tvoid (*alloc_p4d)(struct mm_struct *, long unsigned int);\n\tvoid (*release_pte)(long unsigned int);\n\tvoid (*release_pmd)(long unsigned int);\n\tvoid (*release_pud)(long unsigned int);\n\tvoid (*release_p4d)(long unsigned int);\n\tvoid (*set_pte)(pte_t *, pte_t);\n\tvoid (*set_pmd)(pmd_t *, pmd_t);\n\tpte_t (*ptep_modify_prot_start)(struct vm_area_struct *, long unsigned int, pte_t *);\n\tvoid (*ptep_modify_prot_commit)(struct vm_area_struct *, long unsigned int, pte_t *, pte_t);\n\tstruct paravirt_callee_save pte_val;\n\tstruct paravirt_callee_save make_pte;\n\tstruct paravirt_callee_save pgd_val;\n\tstruct paravirt_callee_save make_pgd;\n\tvoid (*set_pud)(pud_t *, pud_t);\n\tstruct paravirt_callee_save pmd_val;\n\tstruct paravirt_callee_save make_pmd;\n\tstruct paravirt_callee_save pud_val;\n\tstruct paravirt_callee_save make_pud;\n\tvoid (*set_p4d)(p4d_t *, p4d_t);\n\tstruct paravirt_callee_save p4d_val;\n\tstruct paravirt_callee_save make_p4d;\n\tvoid (*set_pgd)(pgd_t *, pgd_t);\n\tstruct pv_lazy_ops lazy_mode;\n\tvoid (*set_fixmap)(unsigned int, phys_addr_t, pgprot_t);\n};\n\nstruct pv_lock_ops {\n\tvoid (*queued_spin_lock_slowpath)(struct qspinlock *, u32);\n\tstruct paravirt_callee_save queued_spin_unlock;\n\tvoid (*wait)(u8 *, u8);\n\tvoid (*kick)(int);\n\tstruct paravirt_callee_save vcpu_is_preempted;\n};\n\nstruct paravirt_patch_template {\n\tstruct pv_cpu_ops cpu;\n\tstruct pv_irq_ops irq;\n\tstruct pv_mmu_ops mmu;\n\tstruct pv_lock_ops lock;\n};\n\nstruct parsed_desc {\n\tu32 mb;\n\tu32 valid;\n};\n\nstruct partition_meta_info {\n\tchar uuid[37];\n\tu8 volname[64];\n};\n\nstruct parsed_partitions {\n\tstruct gendisk *disk;\n\tchar name[32];\n\tstruct {\n\t\tsector_t from;\n\t\tsector_t size;\n\t\tint flags;\n\t\tbool has_info;\n\t\tstruct partition_meta_info info;\n\t} *parts;\n\tint next;\n\tint limit;\n\tbool access_beyond_eod;\n\tchar *pp_buf;\n};\n\nstruct partial_cluster {\n\text4_fsblk_t pclu;\n\text4_lblk_t lblk;\n\tenum {\n\t\tinitial = 0,\n\t\ttofree = 1,\n\t\tnofree = 2,\n\t} state;\n};\n\nstruct partial_context {\n\tgfp_t flags;\n\tunsigned int orig_size;\n\tvoid *object;\n};\n\nstruct partial_page {\n\tunsigned int offset;\n\tunsigned int len;\n\tlong unsigned int private;\n};\n\nstruct partition_info {\n\tu8 flg;\n\tchar id[3];\n\t__be32 st;\n\t__be32 siz;\n};\n\nunion partition_info_u {\n\tu64 val;\n\tstruct {\n\t\tu64 hub_version: 8;\n\t\tu64 partition_id: 16;\n\t\tu64 coherence_id: 16;\n\t\tu64 region_size: 24;\n\t};\n};\n\nstruct pasid_dir_entry {\n\tu64 val;\n};\n\nstruct pasid_entry {\n\tu64 val[8];\n};\n\nstruct pasid_table {\n\tvoid *table;\n\tint order;\n\tu32 max_pasid;\n};\n\nstruct path_cond {\n\tkuid_t uid;\n\tumode_t mode;\n};\n\nstruct pause_reply_data {\n\tstruct ethnl_reply_data base;\n\tstruct ethtool_pauseparam pauseparam;\n\tstruct ethtool_pause_stats pausestat;\n};\n\nstruct pause_req_info {\n\tstruct ethnl_req_info base;\n\tenum ethtool_mac_stats_src src;\n};\n\nstruct pbe {\n\tvoid *address;\n\tvoid *orig_address;\n\tstruct pbe *next;\n};\n\nstruct pcap_adc_request {\n\tu8 bank;\n\tu8 ch[2];\n\tu32 flags;\n\tvoid (*callback)(void *, u16 *);\n\tvoid *data;\n};\n\nstruct pcap_adc_sync_request {\n\tu16 res[2];\n\tstruct completion completion;\n};\n\nstruct spi_device;\n\nstruct pcap_chip {\n\tstruct spi_device *spi;\n\tu32 buf;\n\tspinlock_t io_lock;\n\tunsigned int irq_base;\n\tu32 msr;\n\tstruct work_struct isr_work;\n\tstruct work_struct msr_work;\n\tstruct workqueue_struct *workqueue;\n\tstruct pcap_adc_request *adc_queue[8];\n\tu8 adc_head;\n\tu8 adc_tail;\n\tspinlock_t adc_lock;\n};\n\nstruct pcap_subdev;\n\nstruct pcap_platform_data {\n\tunsigned int irq_base;\n\tunsigned int config;\n\tint gpio;\n\tvoid (*init)(void *);\n\tint num_subdevs;\n\tstruct pcap_subdev *subdevs;\n};\n\nstruct pcap_subdev {\n\tint id;\n\tconst char *name;\n\tvoid *platform_data;\n};\n\nstruct pcc_mbox_chan {\n\tstruct mbox_chan *mchan;\n\tu64 shmem_base_addr;\n\tvoid *shmem;\n\tu64 shmem_size;\n\tu32 latency;\n\tu32 max_access_rate;\n\tu16 min_turnaround_time;\n};\n\nstruct pcc_chan_reg {\n\tvoid *vaddr;\n\tstruct acpi_generic_address *gas;\n\tu64 preserve_mask;\n\tu64 set_mask;\n\tu64 status_mask;\n};\n\nstruct pcc_chan_info {\n\tstruct pcc_mbox_chan chan;\n\tstruct pcc_chan_reg db;\n\tstruct pcc_chan_reg plat_irq_ack;\n\tstruct pcc_chan_reg cmd_complete;\n\tstruct pcc_chan_reg cmd_update;\n\tstruct pcc_chan_reg error;\n\tint plat_irq;\n\tu8 type;\n\tunsigned int plat_irq_flags;\n\tbool chan_in_use;\n};\n\nstruct pcc_cpu {\n\tu32 input_offset;\n\tu32 output_offset;\n};\n\nstruct pcc_data {\n\tstruct pcc_mbox_chan *pcc_chan;\n\tvoid *pcc_comm_addr;\n\tstruct completion done;\n\tstruct mbox_client cl;\n\tstruct acpi_pcc_info ctx;\n};\n\nstruct pcc_header {\n\tu32 signature;\n\tu16 length;\n\tu8 major;\n\tu8 minor;\n\tu32 features;\n\tu16 command;\n\tu16 status;\n\tu32 latency;\n\tu32 minimum_time;\n\tu32 maximum_time;\n\tu32 nominal;\n\tu32 throttled_frequency;\n\tu32 minimum_frequency;\n};\n\nstruct pcc_memory_resource {\n\tu8 descriptor;\n\tu16 length;\n\tu8 space_id;\n\tu8 resource_usage;\n\tu8 type_specific;\n\tu64 granularity;\n\tu64 minimum;\n\tu64 maximum;\n\tu64 translation_offset;\n\tu64 address_length;\n} __attribute__((packed));\n\nstruct pcc_register_resource {\n\tu8 descriptor;\n\tu16 length;\n\tu8 space_id;\n\tu8 bit_width;\n\tu8 bit_offset;\n\tu8 access_size;\n\tu64 address;\n} __attribute__((packed));\n\nstruct pci2phy_map {\n\tstruct list_head list;\n\tint segment;\n\tint pbus_to_dieid[256];\n};\n\nstruct pci_acs {\n\tu16 cap;\n\tu16 ctrl;\n\tu16 fw_ctrl;\n};\n\nstruct pci_bits {\n\tunsigned int reg;\n\tunsigned int width;\n\tlong unsigned int mask;\n\tlong unsigned int val;\n};\n\nstruct pci_bus {\n\tstruct list_head node;\n\tstruct pci_bus *parent;\n\tstruct list_head children;\n\tstruct list_head devices;\n\tstruct pci_dev *self;\n\tstruct list_head slots;\n\tstruct resource *resource[4];\n\tstruct list_head resources;\n\tstruct resource busn_res;\n\tstruct pci_ops *ops;\n\tvoid *sysdata;\n\tstruct proc_dir_entry *procdir;\n\tunsigned char number;\n\tunsigned char primary;\n\tunsigned char max_bus_speed;\n\tunsigned char cur_bus_speed;\n\tchar name[48];\n\tshort unsigned int bridge_ctl;\n\tpci_bus_flags_t bus_flags;\n\tstruct device *bridge;\n\tstruct device dev;\n\tstruct bin_attribute *legacy_io;\n\tstruct bin_attribute *legacy_mem;\n\tunsigned int is_added: 1;\n\tunsigned int unsafe_warn: 1;\n};\n\nstruct pci_bus_region {\n\tpci_bus_addr_t start;\n\tpci_bus_addr_t end;\n};\n\nstruct pci_bus_resource {\n\tstruct list_head list;\n\tstruct resource *res;\n\tunsigned int flags;\n};\n\nstruct pci_cap_saved_data {\n\tu16 cap_nr;\n\tbool cap_extended;\n\tunsigned int size;\n\tu32 data[0];\n};\n\nstruct pci_cap_saved_state {\n\tstruct hlist_node next;\n\tstruct pci_cap_saved_data cap;\n};\n\nstruct pci_check_idx_range {\n\tint start;\n\tint end;\n};\n\nstruct pci_vpd {\n\tstruct mutex lock;\n\tunsigned int len;\n\tu8 cap;\n};\n\nstruct rcec_ea;\n\nstruct pcie_link_state;\n\nstruct pci_sriov;\n\nstruct pci_p2pdma;\n\nstruct pci_dev {\n\tstruct list_head bus_list;\n\tstruct pci_bus *bus;\n\tstruct pci_bus *subordinate;\n\tvoid *sysdata;\n\tstruct proc_dir_entry *procent;\n\tstruct pci_slot *slot;\n\tunsigned int devfn;\n\tshort unsigned int vendor;\n\tshort unsigned int device;\n\tshort unsigned int subsystem_vendor;\n\tshort unsigned int subsystem_device;\n\tunsigned int class;\n\tu8 revision;\n\tu8 hdr_type;\n\tu16 aer_cap;\n\tstruct aer_stats *aer_stats;\n\tstruct rcec_ea *rcec_ea;\n\tstruct pci_dev *rcec;\n\tu32 devcap;\n\tu8 pcie_cap;\n\tu8 msi_cap;\n\tu8 msix_cap;\n\tu8 pcie_mpss: 3;\n\tu8 rom_base_reg;\n\tu8 pin;\n\tu16 pcie_flags_reg;\n\tlong unsigned int *dma_alias_mask;\n\tstruct pci_driver *driver;\n\tu64 dma_mask;\n\tstruct device_dma_parameters dma_parms;\n\tpci_power_t current_state;\n\tu8 pm_cap;\n\tunsigned int pme_support: 5;\n\tunsigned int pme_poll: 1;\n\tunsigned int pinned: 1;\n\tunsigned int imm_ready: 1;\n\tunsigned int d1_support: 1;\n\tunsigned int d2_support: 1;\n\tunsigned int no_d1d2: 1;\n\tunsigned int no_d3cold: 1;\n\tunsigned int bridge_d3: 1;\n\tunsigned int d3cold_allowed: 1;\n\tunsigned int mmio_always_on: 1;\n\tunsigned int wakeup_prepared: 1;\n\tunsigned int skip_bus_pm: 1;\n\tunsigned int ignore_hotplug: 1;\n\tunsigned int hotplug_user_indicators: 1;\n\tunsigned int clear_retrain_link: 1;\n\tunsigned int d3hot_delay;\n\tunsigned int d3cold_delay;\n\tu16 l1ss;\n\tstruct pcie_link_state *link_state;\n\tunsigned int ltr_path: 1;\n\tunsigned int pasid_no_tlp: 1;\n\tunsigned int eetlp_prefix_path: 1;\n\tpci_channel_state_t error_state;\n\tstruct device dev;\n\tint cfg_size;\n\tunsigned int irq;\n\tstruct resource resource[17];\n\tstruct resource driver_exclusive_resource;\n\tbool match_driver;\n\tunsigned int transparent: 1;\n\tunsigned int io_window: 1;\n\tunsigned int pref_window: 1;\n\tunsigned int pref_64_window: 1;\n\tunsigned int multifunction: 1;\n\tunsigned int is_busmaster: 1;\n\tunsigned int no_msi: 1;\n\tunsigned int no_64bit_msi: 1;\n\tunsigned int block_cfg_access: 1;\n\tunsigned int broken_parity_status: 1;\n\tunsigned int irq_reroute_variant: 2;\n\tunsigned int msi_enabled: 1;\n\tunsigned int msix_enabled: 1;\n\tunsigned int ari_enabled: 1;\n\tunsigned int ats_enabled: 1;\n\tunsigned int pasid_enabled: 1;\n\tunsigned int pri_enabled: 1;\n\tunsigned int is_managed: 1;\n\tunsigned int is_msi_managed: 1;\n\tunsigned int needs_freset: 1;\n\tunsigned int state_saved: 1;\n\tunsigned int is_physfn: 1;\n\tunsigned int is_virtfn: 1;\n\tunsigned int is_hotplug_bridge: 1;\n\tunsigned int shpc_managed: 1;\n\tunsigned int is_thunderbolt: 1;\n\tunsigned int untrusted: 1;\n\tunsigned int external_facing: 1;\n\tunsigned int broken_intx_masking: 1;\n\tunsigned int io_window_1k: 1;\n\tunsigned int irq_managed: 1;\n\tunsigned int non_compliant_bars: 1;\n\tunsigned int is_probed: 1;\n\tunsigned int link_active_reporting: 1;\n\tunsigned int no_vf_scan: 1;\n\tunsigned int no_command_memory: 1;\n\tunsigned int rom_bar_overlap: 1;\n\tunsigned int rom_attr_enabled: 1;\n\tunsigned int aspm_os_control: 1;\n\tpci_dev_flags_t dev_flags;\n\tatomic_t enable_cnt;\n\tspinlock_t pcie_cap_lock;\n\tu32 saved_config_space[16];\n\tstruct hlist_head saved_cap_space;\n\tstruct bin_attribute *res_attr[17];\n\tstruct bin_attribute *res_attr_wc[17];\n\tunsigned int broken_cmd_compl: 1;\n\tu16 ptm_cap;\n\tunsigned int ptm_root: 1;\n\tunsigned int ptm_enabled: 1;\n\tu8 ptm_granularity;\n\tvoid *msix_base;\n\traw_spinlock_t msi_lock;\n\tstruct pci_vpd vpd;\n\tu16 dpc_cap;\n\tunsigned int dpc_rp_extensions: 1;\n\tu8 dpc_rp_log_size;\n\tunion {\n\t\tstruct pci_sriov *sriov;\n\t\tstruct pci_dev *physfn;\n\t};\n\tu16 ats_cap;\n\tu8 ats_stu;\n\tu16 pri_cap;\n\tu32 pri_reqs_alloc;\n\tunsigned int pasid_required: 1;\n\tu16 pasid_cap;\n\tu16 pasid_features;\n\tstruct pci_p2pdma *p2pdma;\n\tstruct xarray doe_mbs;\n\tu16 acs_cap;\n\tphys_addr_t rom;\n\tsize_t romlen;\n\tconst char *driver_override;\n\tlong unsigned int priv_flags;\n\tu8 reset_methods[8];\n};\n\nstruct pci_dev_acs_enabled {\n\tu16 vendor;\n\tu16 device;\n\tint (*acs_enabled)(struct pci_dev *, u16);\n};\n\nstruct pci_dev_acs_ops {\n\tu16 vendor;\n\tu16 device;\n\tint (*enable_acs)(struct pci_dev *);\n\tint (*disable_acs_redir)(struct pci_dev *);\n};\n\nstruct pci_dev_reset_methods {\n\tu16 vendor;\n\tu16 device;\n\tint (*reset)(struct pci_dev *, bool);\n};\n\nstruct pci_dev_resource {\n\tstruct list_head list;\n\tstruct resource *res;\n\tstruct pci_dev *dev;\n\tresource_size_t start;\n\tresource_size_t end;\n\tresource_size_t add_size;\n\tresource_size_t min_align;\n\tlong unsigned int flags;\n};\n\nstruct pci_device_id {\n\t__u32 vendor;\n\t__u32 device;\n\t__u32 subvendor;\n\t__u32 subdevice;\n\t__u32 class;\n\t__u32 class_mask;\n\tkernel_ulong_t driver_data;\n\t__u32 override_only;\n};\n\nstruct pci_doe_mb {\n\tstruct pci_dev *pdev;\n\tu16 cap_offset;\n\tstruct xarray prots;\n\twait_queue_head_t wq;\n\tstruct workqueue_struct *work_queue;\n\tlong unsigned int flags;\n};\n\nstruct pci_doe_protocol {\n\tu16 vid;\n\tu8 type;\n};\n\nstruct pci_doe_task {\n\tstruct pci_doe_protocol prot;\n\tconst __le32 *request_pl;\n\tsize_t request_pl_sz;\n\t__le32 *response_pl;\n\tsize_t response_pl_sz;\n\tint rv;\n\tvoid (*complete)(struct pci_doe_task *);\n\tvoid *private;\n\tstruct work_struct work;\n\tstruct pci_doe_mb *doe_mb;\n};\n\nstruct pci_domain_busn_res {\n\tstruct list_head list;\n\tstruct resource res;\n\tint domain_nr;\n};\n\nstruct pci_dynids {\n\tspinlock_t lock;\n\tstruct list_head list;\n};\n\nstruct pci_error_handlers;\n\nstruct pci_driver {\n\tconst char *name;\n\tconst struct pci_device_id *id_table;\n\tint (*probe)(struct pci_dev *, const struct pci_device_id *);\n\tvoid (*remove)(struct pci_dev *);\n\tint (*suspend)(struct pci_dev *, pm_message_t);\n\tint (*resume)(struct pci_dev *);\n\tvoid (*shutdown)(struct pci_dev *);\n\tint (*sriov_configure)(struct pci_dev *, int);\n\tint (*sriov_set_msix_vec_count)(struct pci_dev *, int);\n\tu32 (*sriov_get_vf_total_msix)(struct pci_dev *);\n\tconst struct pci_error_handlers *err_handler;\n\tconst struct attribute_group **groups;\n\tconst struct attribute_group **dev_groups;\n\tstruct device_driver driver;\n\tstruct pci_dynids dynids;\n\tbool driver_managed_dma;\n};\n\nstruct pci_dynid {\n\tstruct list_head node;\n\tstruct pci_device_id id;\n};\n\nstruct pci_epc_ops;\n\nstruct pci_epc_mem;\n\nstruct pci_epc {\n\tstruct device dev;\n\tstruct list_head pci_epf;\n\tstruct mutex list_lock;\n\tconst struct pci_epc_ops *ops;\n\tstruct pci_epc_mem **windows;\n\tstruct pci_epc_mem *mem;\n\tunsigned int num_windows;\n\tu8 max_functions;\n\tu8 *max_vfs;\n\tstruct config_group *group;\n\tstruct mutex lock;\n\tlong unsigned int function_num_map;\n\tint domain_nr;\n\tbool init_complete;\n};\n\nstruct pci_epc_bar_desc {\n\tenum pci_epc_bar_type type;\n\tu64 fixed_size;\n\tbool only_64bit;\n};\n\nstruct pci_epf;\n\nstruct pci_epc_event_ops {\n\tint (*epc_init)(struct pci_epf *);\n\tvoid (*epc_deinit)(struct pci_epf *);\n\tint (*link_up)(struct pci_epf *);\n\tint (*link_down)(struct pci_epf *);\n\tint (*bus_master_enable)(struct pci_epf *);\n};\n\nstruct pci_epc_features {\n\tunsigned int linkup_notifier: 1;\n\tunsigned int msi_capable: 1;\n\tunsigned int msix_capable: 1;\n\tstruct pci_epc_bar_desc bar[6];\n\tsize_t align;\n};\n\nstruct pci_epc_group {\n\tstruct config_group group;\n\tstruct pci_epc *epc;\n\tbool start;\n};\n\nstruct pci_epc_mem_window {\n\tphys_addr_t phys_base;\n\tsize_t size;\n\tsize_t page_size;\n};\n\nstruct pci_epc_mem {\n\tstruct pci_epc_mem_window window;\n\tlong unsigned int *bitmap;\n\tint pages;\n\tstruct mutex lock;\n};\n\nstruct pci_epf_header;\n\nstruct pci_epc_ops {\n\tint (*write_header)(struct pci_epc *, u8, u8, struct pci_epf_header *);\n\tint (*set_bar)(struct pci_epc *, u8, u8, struct pci_epf_bar *);\n\tvoid (*clear_bar)(struct pci_epc *, u8, u8, struct pci_epf_bar *);\n\tint (*map_addr)(struct pci_epc *, u8, u8, phys_addr_t, u64, size_t);\n\tvoid (*unmap_addr)(struct pci_epc *, u8, u8, phys_addr_t);\n\tint (*set_msi)(struct pci_epc *, u8, u8, u8);\n\tint (*get_msi)(struct pci_epc *, u8, u8);\n\tint (*set_msix)(struct pci_epc *, u8, u8, u16, enum pci_barno, u32);\n\tint (*get_msix)(struct pci_epc *, u8, u8);\n\tint (*raise_irq)(struct pci_epc *, u8, u8, unsigned int, u16);\n\tint (*map_msi_irq)(struct pci_epc *, u8, u8, phys_addr_t, u8, u32, u32 *, u32 *);\n\tint (*start)(struct pci_epc *);\n\tvoid (*stop)(struct pci_epc *);\n\tconst struct pci_epc_features * (*get_features)(struct pci_epc *, u8, u8);\n\tstruct module *owner;\n};\n\nstruct pci_epf_bar {\n\tdma_addr_t phys_addr;\n\tvoid *addr;\n\tsize_t size;\n\tenum pci_barno barno;\n\tint flags;\n};\n\nstruct pci_epf_driver;\n\nstruct pci_epf_device_id;\n\nstruct pci_epf {\n\tstruct device dev;\n\tconst char *name;\n\tstruct pci_epf_header *header;\n\tstruct pci_epf_bar bar[6];\n\tu8 msi_interrupts;\n\tu16 msix_interrupts;\n\tu8 func_no;\n\tu8 vfunc_no;\n\tstruct pci_epc *epc;\n\tstruct pci_epf *epf_pf;\n\tstruct pci_epf_driver *driver;\n\tconst struct pci_epf_device_id *id;\n\tstruct list_head list;\n\tstruct mutex lock;\n\tstruct pci_epc *sec_epc;\n\tstruct list_head sec_epc_list;\n\tstruct pci_epf_bar sec_epc_bar[6];\n\tu8 sec_epc_func_no;\n\tstruct config_group *group;\n\tunsigned int is_bound;\n\tunsigned int is_vf;\n\tlong unsigned int vfunction_num_map;\n\tstruct list_head pci_vepf;\n\tconst struct pci_epc_event_ops *event_ops;\n};\n\nstruct pci_epf_device_id {\n\tchar name[20];\n\tkernel_ulong_t driver_data;\n};\n\nstruct pci_epf_ops;\n\nstruct pci_epf_driver {\n\tint (*probe)(struct pci_epf *, const struct pci_epf_device_id *);\n\tvoid (*remove)(struct pci_epf *);\n\tstruct device_driver driver;\n\tconst struct pci_epf_ops *ops;\n\tstruct module *owner;\n\tstruct list_head epf_group;\n\tconst struct pci_epf_device_id *id_table;\n};\n\nstruct pci_epf_group {\n\tstruct config_group group;\n\tstruct config_group primary_epc_group;\n\tstruct config_group secondary_epc_group;\n\tstruct delayed_work cfs_work;\n\tstruct pci_epf *epf;\n\tint index;\n};\n\nstruct pci_epf_header {\n\tu16 vendorid;\n\tu16 deviceid;\n\tu8 revid;\n\tu8 progif_code;\n\tu8 subclass_code;\n\tu8 baseclass_code;\n\tu8 cache_line_size;\n\tu16 subsys_vendor_id;\n\tu16 subsys_id;\n\tenum pci_interrupt_pin interrupt_pin;\n};\n\nstruct pci_epf_msix_tbl {\n\tu64 msg_addr;\n\tu32 msg_data;\n\tu32 vector_ctrl;\n};\n\nstruct pci_epf_ops {\n\tint (*bind)(struct pci_epf *);\n\tvoid (*unbind)(struct pci_epf *);\n\tstruct config_group * (*add_cfs)(struct pci_epf *, struct config_group *);\n};\n\nstruct pci_error_handlers {\n\tpci_ers_result_t (*error_detected)(struct pci_dev *, pci_channel_state_t);\n\tpci_ers_result_t (*mmio_enabled)(struct pci_dev *);\n\tpci_ers_result_t (*slot_reset)(struct pci_dev *);\n\tvoid (*reset_prepare)(struct pci_dev *);\n\tvoid (*reset_done)(struct pci_dev *);\n\tvoid (*resume)(struct pci_dev *);\n\tvoid (*cor_error_detected)(struct pci_dev *);\n};\n\nstruct pci_extra_dev {\n\tstruct pci_dev *dev[4];\n};\n\nstruct pci_filp_private {\n\tenum pci_mmap_state mmap_state;\n\tint write_combine;\n};\n\nstruct pci_fixup {\n\tu16 vendor;\n\tu16 device;\n\tu32 class;\n\tunsigned int class_shift;\n\tint hook_offset;\n};\n\nstruct pci_host_bridge {\n\tstruct device dev;\n\tstruct pci_bus *bus;\n\tstruct pci_ops *ops;\n\tstruct pci_ops *child_ops;\n\tvoid *sysdata;\n\tint busnr;\n\tint domain_nr;\n\tstruct list_head windows;\n\tstruct list_head dma_ranges;\n\tu8 (*swizzle_irq)(struct pci_dev *, u8 *);\n\tint (*map_irq)(const struct pci_dev *, u8, u8);\n\tvoid (*release_fn)(struct pci_host_bridge *);\n\tvoid *release_data;\n\tunsigned int ignore_reset_delay: 1;\n\tunsigned int no_ext_tags: 1;\n\tunsigned int no_inc_mrrs: 1;\n\tunsigned int native_aer: 1;\n\tunsigned int native_pcie_hotplug: 1;\n\tunsigned int native_shpc_hotplug: 1;\n\tunsigned int native_pme: 1;\n\tunsigned int native_ltr: 1;\n\tunsigned int native_dpc: 1;\n\tunsigned int native_cxl_error: 1;\n\tunsigned int preserve_config: 1;\n\tunsigned int size_windows: 1;\n\tunsigned int msi_domain: 1;\n\tresource_size_t (*align_resource)(struct pci_dev *, const struct resource *, resource_size_t, resource_size_t, resource_size_t);\n\tlong: 64;\n\tlong unsigned int private[0];\n};\n\nstruct pci_hostbridge_probe {\n\tu32 bus;\n\tu32 slot;\n\tu32 vendor;\n\tu32 device;\n};\n\nstruct pci_mmcfg_hostbridge_probe {\n\tu32 bus;\n\tu32 devfn;\n\tu32 vendor;\n\tu32 device;\n\tconst char * (*probe)(void);\n};\n\nstruct pci_mmcfg_region {\n\tstruct list_head list;\n\tstruct resource res;\n\tu64 address;\n\tchar *virt;\n\tu16 segment;\n\tu8 start_bus;\n\tu8 end_bus;\n\tchar name[30];\n};\n\nstruct pci_ops {\n\tint (*add_bus)(struct pci_bus *);\n\tvoid (*remove_bus)(struct pci_bus *);\n\tvoid * (*map_bus)(struct pci_bus *, unsigned int, int);\n\tint (*read)(struct pci_bus *, unsigned int, int, int, u32 *);\n\tint (*write)(struct pci_bus *, unsigned int, int, int, u32);\n};\n\nstruct pci_osc_bit_struct {\n\tu32 bit;\n\tchar *desc;\n};\n\nstruct pci_p2pdma {\n\tstruct gen_pool *pool;\n\tbool p2pmem_published;\n\tstruct xarray map_types;\n};\n\nstruct pci_p2pdma_map_state {\n\tstruct dev_pagemap *pgmap;\n\tint map;\n\tu64 bus_off;\n};\n\nstruct pci_p2pdma_pagemap {\n\tstruct pci_dev *provider;\n\tu64 bus_offset;\n\tstruct dev_pagemap pgmap;\n};\n\nstruct pci_p2pdma_whitelist_entry {\n\tshort unsigned int vendor;\n\tshort unsigned int device;\n\tenum {\n\t\tREQ_SAME_HOST_BRIDGE = 1,\n\t} flags;\n};\n\nstruct pci_pme_device {\n\tstruct list_head list;\n\tstruct pci_dev *dev;\n};\n\nstruct pci_raw_ops {\n\tint (*read)(unsigned int, unsigned int, unsigned int, int, int, u32 *);\n\tint (*write)(unsigned int, unsigned int, unsigned int, int, int, u32);\n};\n\nstruct pci_reset_fn_method {\n\tint (*reset_fn)(struct pci_dev *, bool);\n\tchar *name;\n};\n\nstruct pci_root_info {\n\tstruct list_head list;\n\tchar name[12];\n\tstruct list_head resources;\n\tstruct resource busn;\n\tint node;\n\tint link;\n};\n\nstruct pci_sysdata {\n\tint domain;\n\tint node;\n\tstruct acpi_device *companion;\n\tvoid *iommu;\n\tvoid *fwnode;\n\tstruct pci_dev *vmd_dev;\n};\n\nstruct pci_root_info___2 {\n\tstruct acpi_pci_root_info common;\n\tstruct pci_sysdata sd;\n\tbool mcfg_added;\n\tu8 start_bus;\n\tu8 end_bus;\n};\n\nstruct pci_root_res {\n\tstruct list_head list;\n\tstruct resource res;\n};\n\nstruct pci_saved_state {\n\tu32 config_space[16];\n\tstruct pci_cap_saved_data cap[0];\n};\n\nstruct serial_private;\n\nstruct pciserial_board;\n\nstruct pci_serial_quirk {\n\tu32 vendor;\n\tu32 device;\n\tu32 subvendor;\n\tu32 subdevice;\n\tint (*probe)(struct pci_dev *);\n\tint (*init)(struct pci_dev *);\n\tint (*setup)(struct serial_private *, const struct pciserial_board *, struct uart_8250_port *, int);\n\tvoid (*exit)(struct pci_dev *);\n};\n\nstruct pci_setup_rom {\n\tstruct setup_data data;\n\tuint16_t vendor;\n\tuint16_t devid;\n\tuint64_t pcilen;\n\tlong unsigned int segment;\n\tlong unsigned int bus;\n\tlong unsigned int device;\n\tlong unsigned int function;\n\tuint8_t romdata[0];\n};\n\nstruct pci_slot {\n\tstruct pci_bus *bus;\n\tstruct list_head list;\n\tstruct hotplug_slot *hotplug;\n\tunsigned char number;\n\tstruct kobject kobj;\n};\n\nstruct pci_slot_attribute {\n\tstruct attribute attr;\n\tssize_t (*show)(struct pci_slot *, char *);\n\tssize_t (*store)(struct pci_slot *, const char *, size_t);\n};\n\nstruct pci_sriov {\n\tint pos;\n\tint nres;\n\tu32 cap;\n\tu16 ctrl;\n\tu16 total_VFs;\n\tu16 initial_VFs;\n\tu16 num_VFs;\n\tu16 offset;\n\tu16 stride;\n\tu16 vf_device;\n\tu32 pgsz;\n\tu8 link;\n\tu8 max_VF_buses;\n\tu16 driver_max_VFs;\n\tstruct pci_dev *dev;\n\tstruct pci_dev *self;\n\tu32 class;\n\tu8 hdr_type;\n\tu16 subsystem_vendor;\n\tu16 subsystem_device;\n\tresource_size_t barsz[6];\n\tbool drivers_autoprobe;\n};\n\nstruct pcibios_fwaddrmap {\n\tstruct list_head list;\n\tstruct pci_dev *dev;\n\tresource_size_t fw_addr[17];\n};\n\nstruct pcie_device {\n\tint irq;\n\tstruct pci_dev *port;\n\tu32 service;\n\tvoid *priv_data;\n\tstruct device device;\n};\n\nstruct pcie_link_state {\n\tstruct pci_dev *pdev;\n\tstruct pci_dev *downstream;\n\tstruct pcie_link_state *root;\n\tstruct pcie_link_state *parent;\n\tstruct list_head sibling;\n\tu32 aspm_support: 7;\n\tu32 aspm_enabled: 7;\n\tu32 aspm_capable: 7;\n\tu32 aspm_default: 7;\n\tint: 4;\n\tu32 aspm_disable: 7;\n\tu32 clkpm_capable: 1;\n\tu32 clkpm_enabled: 1;\n\tu32 clkpm_default: 1;\n\tu32 clkpm_disable: 1;\n};\n\nstruct pcie_pme_service_data {\n\tspinlock_t lock;\n\tstruct pcie_device *srv;\n\tstruct work_struct work;\n\tbool noirq;\n};\n\nstruct pcie_port_service_driver {\n\tconst char *name;\n\tint (*probe)(struct pcie_device *);\n\tvoid (*remove)(struct pcie_device *);\n\tint (*suspend)(struct pcie_device *);\n\tint (*resume_noirq)(struct pcie_device *);\n\tint (*resume)(struct pcie_device *);\n\tint (*runtime_suspend)(struct pcie_device *);\n\tint (*runtime_resume)(struct pcie_device *);\n\tint (*slot_reset)(struct pcie_device *);\n\tint port_type;\n\tu32 service;\n\tstruct device_driver driver;\n};\n\nstruct pcim_addr_devres {\n\tenum pcim_addr_devres_type type;\n\tvoid *baseaddr;\n\tlong unsigned int offset;\n\tlong unsigned int len;\n\tint bar;\n};\n\nstruct pcim_intx_devres {\n\tint orig_intx;\n};\n\nstruct pcim_iomap_devres {\n\tvoid *table[6];\n};\n\nstruct pciserial_board {\n\tunsigned int flags;\n\tunsigned int num_ports;\n\tunsigned int base_baud;\n\tunsigned int uart_offset;\n\tunsigned int reg_shift;\n\tunsigned int first_offset;\n};\n\nstruct pcpu {\n\tstruct list_head list;\n\tstruct device dev;\n\tuint32_t cpu_id;\n\tuint32_t acpi_id;\n\tuint32_t flags;\n};\n\nstruct pcpu_group_info {\n\tint nr_units;\n\tlong unsigned int base_offset;\n\tunsigned int *cpu_map;\n};\n\nstruct pcpu_alloc_info {\n\tsize_t static_size;\n\tsize_t reserved_size;\n\tsize_t dyn_size;\n\tsize_t unit_size;\n\tsize_t atom_size;\n\tsize_t alloc_size;\n\tsize_t __ai_size;\n\tint nr_groups;\n\tstruct pcpu_group_info groups[0];\n};\n\nstruct pcpu_block_md {\n\tint scan_hint;\n\tint scan_hint_start;\n\tint contig_hint;\n\tint contig_hint_start;\n\tint left_free;\n\tint right_free;\n\tint first_free;\n\tint nr_bits;\n};\n\nstruct pcpuobj_ext;\n\nstruct pcpu_chunk {\n\tstruct list_head list;\n\tint free_bytes;\n\tstruct pcpu_block_md chunk_md;\n\tlong unsigned int *bound_map;\n\tvoid *base_addr;\n\tlong unsigned int *alloc_map;\n\tstruct pcpu_block_md *md_blocks;\n\tvoid *data;\n\tbool immutable;\n\tbool isolated;\n\tint start_offset;\n\tint end_offset;\n\tstruct pcpuobj_ext *obj_exts;\n\tint nr_pages;\n\tint nr_populated;\n\tint nr_empty_pop_pages;\n\tlong unsigned int populated[0];\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct pcpu_dstats {\n\tu64_stats_t rx_packets;\n\tu64_stats_t rx_bytes;\n\tu64_stats_t rx_drops;\n\tu64_stats_t tx_packets;\n\tu64_stats_t tx_bytes;\n\tu64_stats_t tx_drops;\n\tstruct u64_stats_sync syncp;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct pcpu_gen_cookie {\n\tlocal_t nesting;\n\tu64 last;\n};\n\nstruct pcpu_hot {\n\tunion {\n\t\tstruct {\n\t\t\tstruct task_struct *current_task;\n\t\t\tint preempt_count;\n\t\t\tint cpu_number;\n\t\t\tu64 call_depth;\n\t\t\tlong unsigned int top_of_stack;\n\t\t\tvoid *hardirq_stack_ptr;\n\t\t\tu16 softirq_pending;\n\t\t\tbool hardirq_stack_inuse;\n\t\t};\n\t\tu8 pad[64];\n\t};\n};\n\nstruct pcpu_lstats {\n\tu64_stats_t packets;\n\tu64_stats_t bytes;\n\tstruct u64_stats_sync syncp;\n};\n\nstruct pcpu_rx_sc_stats {\n\tstruct macsec_rx_sc_stats stats;\n\tstruct u64_stats_sync syncp;\n};\n\nstruct pcpu_seg6_local_counters {\n\tu64_stats_t packets;\n\tu64_stats_t bytes;\n\tu64_stats_t errors;\n\tstruct u64_stats_sync syncp;\n};\n\nstruct pcpu_sw_netstats {\n\tu64_stats_t rx_packets;\n\tu64_stats_t rx_bytes;\n\tu64_stats_t tx_packets;\n\tu64_stats_t tx_bytes;\n\tstruct u64_stats_sync syncp;\n};\n\nstruct pcpu_tx_sc_stats {\n\tstruct macsec_tx_sc_stats stats;\n\tstruct u64_stats_sync syncp;\n};\n\nstruct pcpuobj_ext {\n\tstruct obj_cgroup *cgroup;\n};\n\nstruct pde_opener {\n\tstruct list_head lh;\n\tstruct file *file;\n\tbool closing;\n\tstruct completion *c;\n};\n\nstruct pdom_dev_data {\n\tstruct iommu_dev_data *dev_data;\n\tioasid_t pasid;\n\tstruct list_head list;\n};\n\nstruct pe32_opt_hdr {\n\tuint16_t magic;\n\tuint8_t ld_major;\n\tuint8_t ld_minor;\n\tuint32_t text_size;\n\tuint32_t data_size;\n\tuint32_t bss_size;\n\tuint32_t entry_point;\n\tuint32_t code_base;\n\tuint32_t data_base;\n\tuint32_t image_base;\n\tuint32_t section_align;\n\tuint32_t file_align;\n\tuint16_t os_major;\n\tuint16_t os_minor;\n\tuint16_t image_major;\n\tuint16_t image_minor;\n\tuint16_t subsys_major;\n\tuint16_t subsys_minor;\n\tuint32_t win32_version;\n\tuint32_t image_size;\n\tuint32_t header_size;\n\tuint32_t csum;\n\tuint16_t subsys;\n\tuint16_t dll_flags;\n\tuint32_t stack_size_req;\n\tuint32_t stack_size;\n\tuint32_t heap_size_req;\n\tuint32_t heap_size;\n\tuint32_t loader_flags;\n\tuint32_t data_dirs;\n};\n\nstruct pe32plus_opt_hdr {\n\tuint16_t magic;\n\tuint8_t ld_major;\n\tuint8_t ld_minor;\n\tuint32_t text_size;\n\tuint32_t data_size;\n\tuint32_t bss_size;\n\tuint32_t entry_point;\n\tuint32_t code_base;\n\tuint64_t image_base;\n\tuint32_t section_align;\n\tuint32_t file_align;\n\tuint16_t os_major;\n\tuint16_t os_minor;\n\tuint16_t image_major;\n\tuint16_t image_minor;\n\tuint16_t subsys_major;\n\tuint16_t subsys_minor;\n\tuint32_t win32_version;\n\tuint32_t image_size;\n\tuint32_t header_size;\n\tuint32_t csum;\n\tuint16_t subsys;\n\tuint16_t dll_flags;\n\tuint64_t stack_size_req;\n\tuint64_t stack_size;\n\tuint64_t heap_size_req;\n\tuint64_t heap_size;\n\tuint32_t loader_flags;\n\tuint32_t data_dirs;\n};\n\nstruct pe_hdr {\n\tuint32_t magic;\n\tuint16_t machine;\n\tuint16_t sections;\n\tuint32_t timestamp;\n\tuint32_t symbol_table;\n\tuint32_t symbols;\n\tuint16_t opt_hdr_size;\n\tuint16_t flags;\n};\n\nstruct pebs_basic {\n\tu64 format_size;\n\tu64 ip;\n\tu64 applicable_counters;\n\tu64 tsc;\n};\n\nstruct pebs_gprs {\n\tu64 flags;\n\tu64 ip;\n\tu64 ax;\n\tu64 cx;\n\tu64 dx;\n\tu64 bx;\n\tu64 sp;\n\tu64 bp;\n\tu64 si;\n\tu64 di;\n\tu64 r8;\n\tu64 r9;\n\tu64 r10;\n\tu64 r11;\n\tu64 r12;\n\tu64 r13;\n\tu64 r14;\n\tu64 r15;\n};\n\nstruct pebs_meminfo {\n\tu64 address;\n\tu64 aux;\n\tu64 latency;\n\tu64 tsx_tuning;\n};\n\nstruct pebs_record_core {\n\tu64 flags;\n\tu64 ip;\n\tu64 ax;\n\tu64 bx;\n\tu64 cx;\n\tu64 dx;\n\tu64 si;\n\tu64 di;\n\tu64 bp;\n\tu64 sp;\n\tu64 r8;\n\tu64 r9;\n\tu64 r10;\n\tu64 r11;\n\tu64 r12;\n\tu64 r13;\n\tu64 r14;\n\tu64 r15;\n};\n\nstruct pebs_record_nhm {\n\tu64 flags;\n\tu64 ip;\n\tu64 ax;\n\tu64 bx;\n\tu64 cx;\n\tu64 dx;\n\tu64 si;\n\tu64 di;\n\tu64 bp;\n\tu64 sp;\n\tu64 r8;\n\tu64 r9;\n\tu64 r10;\n\tu64 r11;\n\tu64 r12;\n\tu64 r13;\n\tu64 r14;\n\tu64 r15;\n\tu64 status;\n\tu64 dla;\n\tu64 dse;\n\tu64 lat;\n};\n\nstruct pebs_record_skl {\n\tu64 flags;\n\tu64 ip;\n\tu64 ax;\n\tu64 bx;\n\tu64 cx;\n\tu64 dx;\n\tu64 si;\n\tu64 di;\n\tu64 bp;\n\tu64 sp;\n\tu64 r8;\n\tu64 r9;\n\tu64 r10;\n\tu64 r11;\n\tu64 r12;\n\tu64 r13;\n\tu64 r14;\n\tu64 r15;\n\tu64 status;\n\tu64 dla;\n\tu64 dse;\n\tu64 lat;\n\tu64 real_ip;\n\tu64 tsx_tuning;\n\tu64 tsc;\n};\n\nstruct pebs_xmm {\n\tu64 xmm[32];\n};\n\nstruct section_header;\n\nstruct pefile_context {\n\tunsigned int header_size;\n\tunsigned int image_checksum_offset;\n\tunsigned int cert_dirent_offset;\n\tunsigned int n_data_dirents;\n\tunsigned int n_sections;\n\tunsigned int certs_size;\n\tunsigned int sig_offset;\n\tunsigned int sig_len;\n\tconst struct section_header *secs;\n\tconst void *digest;\n\tunsigned int digest_len;\n\tconst char *digest_algo;\n};\n\nstruct pending_reservation {\n\tstruct rb_node rb_node;\n\text4_lblk_t lclu;\n};\n\nstruct per_cpu_dm_data {\n\traw_spinlock_t lock;\n\tunion {\n\t\tstruct sk_buff *skb;\n\t\tstruct net_dm_hw_entries *hw_entries;\n\t};\n\tstruct sk_buff_head drop_queue;\n\tstruct work_struct dm_alert_work;\n\tstruct timer_list send_timer;\n\tstruct net_dm_stats stats;\n};\n\nstruct per_cpu_nodestat {\n\ts8 stat_threshold;\n\ts8 vm_node_stat_diff[47];\n};\n\nstruct per_cpu_pages {\n\tspinlock_t lock;\n\tint count;\n\tint high;\n\tint high_min;\n\tint high_max;\n\tint batch;\n\tu8 flags;\n\tu8 alloc_factor;\n\tu8 expire;\n\tshort int free_count;\n\tstruct list_head lists[14];\n};\n\nstruct per_cpu_zonestat {\n\ts8 vm_stat_diff[12];\n\ts8 stat_threshold;\n\tlong unsigned int vm_numa_event[6];\n};\n\nstruct percpu_cluster {\n\tunsigned int next[10];\n};\n\nstruct percpu_free_defer {\n\tstruct callback_head rcu;\n\tvoid *ptr;\n};\n\ntypedef void percpu_ref_func_t(struct percpu_ref *);\n\nstruct percpu_ref_data {\n\tatomic_long_t count;\n\tpercpu_ref_func_t *release;\n\tpercpu_ref_func_t *confirm_switch;\n\tbool force_atomic: 1;\n\tbool allow_reinit: 1;\n\tstruct callback_head rcu;\n\tstruct percpu_ref *ref;\n};\n\nstruct perf_addr_filter {\n\tstruct list_head entry;\n\tstruct path path;\n\tlong unsigned int offset;\n\tlong unsigned int size;\n\tenum perf_addr_filter_action_t action;\n};\n\nstruct perf_addr_filter_range {\n\tlong unsigned int start;\n\tlong unsigned int size;\n};\n\nstruct perf_addr_filters_head {\n\tstruct list_head list;\n\traw_spinlock_t lock;\n\tunsigned int nr_file_filters;\n};\n\nstruct perf_amd_iommu {\n\tstruct list_head list;\n\tstruct pmu pmu;\n\tstruct amd_iommu *iommu;\n\tchar name[16];\n\tu8 max_banks;\n\tu8 max_counters;\n\tu64 cntr_assign_mask;\n\traw_spinlock_t lock;\n};\n\nstruct perf_event_header {\n\t__u32 type;\n\t__u16 misc;\n\t__u16 size;\n};\n\nstruct perf_aux_event {\n\tstruct perf_event_header header;\n\tu64 hw_id;\n};\n\nstruct perf_aux_event___2 {\n\tstruct perf_event_header header;\n\tu32 pid;\n\tu32 tid;\n};\n\nstruct perf_aux_event___3 {\n\tstruct perf_event_header header;\n\tu64 offset;\n\tu64 size;\n\tu64 flags;\n};\n\nstruct perf_bpf_event {\n\tstruct bpf_prog *prog;\n\tstruct {\n\t\tstruct perf_event_header header;\n\t\tu16 type;\n\t\tu16 flags;\n\t\tu32 id;\n\t\tu8 tag[8];\n\t} event_id;\n};\n\nstruct perf_event_mmap_page;\n\nstruct perf_buffer {\n\trefcount_t refcount;\n\tstruct callback_head callback_head;\n\tint nr_pages;\n\tint overwrite;\n\tint paused;\n\tatomic_t poll;\n\tlocal_t head;\n\tunsigned int nest;\n\tlocal_t events;\n\tlocal_t wakeup;\n\tlocal_t lost;\n\tlong int watermark;\n\tlong int aux_watermark;\n\tspinlock_t event_lock;\n\tstruct list_head event_list;\n\tatomic_t mmap_count;\n\tlong unsigned int mmap_locked;\n\tstruct user_struct *mmap_user;\n\tstruct mutex aux_mutex;\n\tlong int aux_head;\n\tunsigned int aux_nest;\n\tlong int aux_wakeup;\n\tlong unsigned int aux_pgoff;\n\tint aux_nr_pages;\n\tint aux_overwrite;\n\tatomic_t aux_mmap_count;\n\tlong unsigned int aux_mmap_locked;\n\tvoid (*free_aux)(void *);\n\trefcount_t aux_refcount;\n\tint aux_in_sampling;\n\tvoid **aux_pages;\n\tvoid *aux_priv;\n\tstruct perf_event_mmap_page *user_page;\n\tvoid *data_pages[0];\n};\n\nstruct perf_callchain_entry {\n\t__u64 nr;\n\t__u64 ip[0];\n};\n\nstruct perf_callchain_entry_ctx {\n\tstruct perf_callchain_entry *entry;\n\tu32 max_stack;\n\tu32 nr;\n\tshort int contexts;\n\tbool contexts_maxed;\n};\n\nunion perf_capabilities {\n\tstruct {\n\t\tu64 lbr_format: 6;\n\t\tu64 pebs_trap: 1;\n\t\tu64 pebs_arch_reg: 1;\n\t\tu64 pebs_format: 4;\n\t\tu64 smm_freeze: 1;\n\t\tu64 full_width_write: 1;\n\t\tu64 pebs_baseline: 1;\n\t\tu64 perf_metrics: 1;\n\t\tu64 pebs_output_pt_available: 1;\n\t\tu64 pebs_timing_info: 1;\n\t\tu64 anythread_deprecated: 1;\n\t};\n\tu64 capabilities;\n};\n\nstruct perf_cgroup_info;\n\nstruct perf_cgroup {\n\tstruct cgroup_subsys_state css;\n\tstruct perf_cgroup_info *info;\n};\n\nstruct perf_cgroup_event {\n\tchar *path;\n\tint path_size;\n\tstruct {\n\t\tstruct perf_event_header header;\n\t\tu64 id;\n\t\tchar path[0];\n\t} event_id;\n};\n\nstruct perf_cgroup_info {\n\tu64 time;\n\tu64 timestamp;\n\tu64 timeoffset;\n\tint active;\n};\n\nstruct perf_comm_event {\n\tstruct task_struct *task;\n\tchar *comm;\n\tint comm_size;\n\tstruct {\n\t\tstruct perf_event_header header;\n\t\tu32 pid;\n\t\tu32 tid;\n\t} event_id;\n};\n\nstruct perf_event_groups {\n\tstruct rb_root tree;\n\tu64 index;\n};\n\nstruct perf_event_context {\n\traw_spinlock_t lock;\n\tstruct mutex mutex;\n\tstruct list_head pmu_ctx_list;\n\tstruct perf_event_groups pinned_groups;\n\tstruct perf_event_groups flexible_groups;\n\tstruct list_head event_list;\n\tint nr_events;\n\tint nr_user;\n\tint is_active;\n\tint nr_task_data;\n\tint nr_stat;\n\tint nr_freq;\n\tint rotate_disable;\n\trefcount_t refcount;\n\tstruct task_struct *task;\n\tu64 time;\n\tu64 timestamp;\n\tu64 timeoffset;\n\tstruct perf_event_context *parent_ctx;\n\tu64 parent_gen;\n\tu64 generation;\n\tint pin_count;\n\tint nr_cgroups;\n\tstruct callback_head callback_head;\n\tlocal_t nr_pending;\n};\n\nstruct perf_cpu_context {\n\tstruct perf_event_context ctx;\n\tstruct perf_event_context *task_ctx;\n\tint online;\n\tstruct perf_cgroup *cgrp;\n\tint heap_size;\n\tstruct perf_event **heap;\n\tstruct perf_event *heap_default[2];\n};\n\nstruct perf_event_pmu_context {\n\tstruct pmu *pmu;\n\tstruct perf_event_context *ctx;\n\tstruct list_head pmu_ctx_entry;\n\tstruct list_head pinned_active;\n\tstruct list_head flexible_active;\n\tunsigned int embedded: 1;\n\tunsigned int nr_events;\n\tunsigned int nr_cgroups;\n\tunsigned int nr_freq;\n\tatomic_t refcount;\n\tstruct callback_head callback_head;\n\tvoid *task_ctx_data;\n\tint rotate_necessary;\n};\n\nstruct perf_cpu_pmu_context {\n\tstruct perf_event_pmu_context epc;\n\tstruct perf_event_pmu_context *task_epc;\n\tstruct list_head sched_cb_entry;\n\tint sched_cb_usage;\n\tint active_oncpu;\n\tint exclusive;\n\traw_spinlock_t hrtimer_lock;\n\tstruct hrtimer hrtimer;\n\tktime_t hrtimer_interval;\n\tunsigned int hrtimer_active;\n};\n\nstruct perf_domain {\n\tstruct em_perf_domain *em_pd;\n\tstruct perf_domain *next;\n\tstruct callback_head rcu;\n};\n\nstruct perf_event_attr {\n\t__u32 type;\n\t__u32 size;\n\t__u64 config;\n\tunion {\n\t\t__u64 sample_period;\n\t\t__u64 sample_freq;\n\t};\n\t__u64 sample_type;\n\t__u64 read_format;\n\t__u64 disabled: 1;\n\t__u64 inherit: 1;\n\t__u64 pinned: 1;\n\t__u64 exclusive: 1;\n\t__u64 exclude_user: 1;\n\t__u64 exclude_kernel: 1;\n\t__u64 exclude_hv: 1;\n\t__u64 exclude_idle: 1;\n\t__u64 mmap: 1;\n\t__u64 comm: 1;\n\t__u64 freq: 1;\n\t__u64 inherit_stat: 1;\n\t__u64 enable_on_exec: 1;\n\t__u64 task: 1;\n\t__u64 watermark: 1;\n\t__u64 precise_ip: 2;\n\t__u64 mmap_data: 1;\n\t__u64 sample_id_all: 1;\n\t__u64 exclude_host: 1;\n\t__u64 exclude_guest: 1;\n\t__u64 exclude_callchain_kernel: 1;\n\t__u64 exclude_callchain_user: 1;\n\t__u64 mmap2: 1;\n\t__u64 comm_exec: 1;\n\t__u64 use_clockid: 1;\n\t__u64 context_switch: 1;\n\t__u64 write_backward: 1;\n\t__u64 namespaces: 1;\n\t__u64 ksymbol: 1;\n\t__u64 bpf_event: 1;\n\t__u64 aux_output: 1;\n\t__u64 cgroup: 1;\n\t__u64 text_poke: 1;\n\t__u64 build_id: 1;\n\t__u64 inherit_thread: 1;\n\t__u64 remove_on_exec: 1;\n\t__u64 sigtrap: 1;\n\t__u64 __reserved_1: 26;\n\tunion {\n\t\t__u32 wakeup_events;\n\t\t__u32 wakeup_watermark;\n\t};\n\t__u32 bp_type;\n\tunion {\n\t\t__u64 bp_addr;\n\t\t__u64 kprobe_func;\n\t\t__u64 uprobe_path;\n\t\t__u64 config1;\n\t};\n\tunion {\n\t\t__u64 bp_len;\n\t\t__u64 kprobe_addr;\n\t\t__u64 probe_offset;\n\t\t__u64 config2;\n\t};\n\t__u64 branch_sample_type;\n\t__u64 sample_regs_user;\n\t__u32 sample_stack_user;\n\t__s32 clockid;\n\t__u64 sample_regs_intr;\n\t__u32 aux_watermark;\n\t__u16 sample_max_stack;\n\t__u16 __reserved_2;\n\t__u32 aux_sample_size;\n\t__u32 __reserved_3;\n\t__u64 sig_data;\n\t__u64 config3;\n};\n\ntypedef void (*perf_overflow_handler_t)(struct perf_event *, struct perf_sample_data *, struct pt_regs *);\n\nstruct perf_event {\n\tstruct list_head event_entry;\n\tstruct list_head sibling_list;\n\tstruct list_head active_list;\n\tstruct rb_node group_node;\n\tu64 group_index;\n\tstruct list_head migrate_entry;\n\tstruct hlist_node hlist_entry;\n\tstruct list_head active_entry;\n\tint nr_siblings;\n\tint event_caps;\n\tint group_caps;\n\tunsigned int group_generation;\n\tstruct perf_event *group_leader;\n\tstruct pmu *pmu;\n\tvoid *pmu_private;\n\tenum perf_event_state state;\n\tunsigned int attach_state;\n\tlocal64_t count;\n\tatomic64_t child_count;\n\tu64 total_time_enabled;\n\tu64 total_time_running;\n\tu64 tstamp;\n\tstruct perf_event_attr attr;\n\tu16 header_size;\n\tu16 id_header_size;\n\tu16 read_size;\n\tstruct hw_perf_event hw;\n\tstruct perf_event_context *ctx;\n\tstruct perf_event_pmu_context *pmu_ctx;\n\tatomic_long_t refcount;\n\tatomic64_t child_total_time_enabled;\n\tatomic64_t child_total_time_running;\n\tstruct mutex child_mutex;\n\tstruct list_head child_list;\n\tstruct perf_event *parent;\n\tint oncpu;\n\tint cpu;\n\tstruct list_head owner_entry;\n\tstruct task_struct *owner;\n\tstruct mutex mmap_mutex;\n\tatomic_t mmap_count;\n\tstruct perf_buffer *rb;\n\tstruct list_head rb_entry;\n\tlong unsigned int rcu_batches;\n\tint rcu_pending;\n\twait_queue_head_t waitq;\n\tstruct fasync_struct *fasync;\n\tunsigned int pending_wakeup;\n\tunsigned int pending_kill;\n\tunsigned int pending_disable;\n\tlong unsigned int pending_addr;\n\tstruct irq_work pending_irq;\n\tstruct irq_work pending_disable_irq;\n\tstruct callback_head pending_task;\n\tunsigned int pending_work;\n\tstruct rcuwait pending_work_wait;\n\tatomic_t event_limit;\n\tstruct perf_addr_filters_head addr_filters;\n\tstruct perf_addr_filter_range *addr_filter_ranges;\n\tlong unsigned int addr_filters_gen;\n\tstruct perf_event *aux_event;\n\tvoid (*destroy)(struct perf_event *);\n\tstruct callback_head callback_head;\n\tstruct pid_namespace *ns;\n\tu64 id;\n\tatomic64_t lost_samples;\n\tu64 (*clock)(void);\n\tperf_overflow_handler_t overflow_handler;\n\tvoid *overflow_handler_context;\n\tstruct bpf_prog *prog;\n\tu64 bpf_cookie;\n\tstruct trace_event_call *tp_event;\n\tstruct event_filter *filter;\n\tstruct ftrace_ops ftrace_ops;\n\tstruct perf_cgroup *cgrp;\n\tvoid *security;\n\tstruct list_head sb_list;\n\t__u32 orig_type;\n};\n\nstruct perf_event_min_heap {\n\tint nr;\n\tint size;\n\tstruct perf_event **data;\n\tstruct perf_event *preallocated[0];\n};\n\nstruct perf_event_mmap_page {\n\t__u32 version;\n\t__u32 compat_version;\n\t__u32 lock;\n\t__u32 index;\n\t__s64 offset;\n\t__u64 time_enabled;\n\t__u64 time_running;\n\tunion {\n\t\t__u64 capabilities;\n\t\tstruct {\n\t\t\t__u64 cap_bit0: 1;\n\t\t\t__u64 cap_bit0_is_deprecated: 1;\n\t\t\t__u64 cap_user_rdpmc: 1;\n\t\t\t__u64 cap_user_time: 1;\n\t\t\t__u64 cap_user_time_zero: 1;\n\t\t\t__u64 cap_user_time_short: 1;\n\t\t\t__u64 cap_____res: 58;\n\t\t};\n\t};\n\t__u16 pmc_width;\n\t__u16 time_shift;\n\t__u32 time_mult;\n\t__u64 time_offset;\n\t__u64 time_zero;\n\t__u32 size;\n\t__u32 __reserved_1;\n\t__u64 time_cycles;\n\t__u64 time_mask;\n\t__u8 __reserved[928];\n\t__u64 data_head;\n\t__u64 data_tail;\n\t__u64 data_offset;\n\t__u64 data_size;\n\t__u64 aux_head;\n\t__u64 aux_tail;\n\t__u64 aux_offset;\n\t__u64 aux_size;\n};\n\nstruct perf_event_query_bpf {\n\t__u32 ids_len;\n\t__u32 prog_cnt;\n\t__u32 ids[0];\n};\n\nstruct perf_event_security_struct {\n\tu32 sid;\n};\n\nstruct perf_guest_info_callbacks {\n\tunsigned int (*state)(void);\n\tlong unsigned int (*get_ip)(void);\n\tunsigned int (*handle_intel_pt_intr)(void);\n};\n\nstruct perf_ibs {\n\tstruct pmu pmu;\n\tunsigned int msr;\n\tu64 config_mask;\n\tu64 cnt_mask;\n\tu64 enable_mask;\n\tu64 valid_mask;\n\tu64 max_period;\n\tlong unsigned int offset_mask[1];\n\tint offset_max;\n\tunsigned int fetch_count_reset_broken: 1;\n\tunsigned int fetch_ignore_if_zero_rip: 1;\n\tstruct cpu_perf_ibs *pcpu;\n\tu64 (*get_count)(u64);\n};\n\nstruct perf_ibs_data {\n\tu32 size;\n\tunion {\n\t\tu32 data[0];\n\t\tu32 caps;\n\t};\n\tu64 regs[8];\n};\n\nstruct perf_ksymbol_event {\n\tconst char *name;\n\tint name_len;\n\tstruct {\n\t\tstruct perf_event_header header;\n\t\tu64 addr;\n\t\tu32 len;\n\t\tu16 ksym_type;\n\t\tu16 flags;\n\t} event_id;\n};\n\nstruct perf_mmap_event {\n\tstruct vm_area_struct *vma;\n\tconst char *file_name;\n\tint file_size;\n\tint maj;\n\tint min;\n\tu64 ino;\n\tu64 ino_generation;\n\tu32 prot;\n\tu32 flags;\n\tu8 build_id[20];\n\tu32 build_id_size;\n\tstruct {\n\t\tstruct perf_event_header header;\n\t\tu32 pid;\n\t\tu32 tid;\n\t\tu64 start;\n\t\tu64 len;\n\t\tu64 pgoff;\n\t} event_id;\n};\n\nstruct perf_msr {\n\tu64 msr;\n\tstruct attribute_group *grp;\n\tbool (*test)(int, void *);\n\tbool no_check;\n\tu64 mask;\n};\n\nstruct perf_ns_link_info {\n\t__u64 dev;\n\t__u64 ino;\n};\n\nstruct perf_namespaces_event {\n\tstruct task_struct *task;\n\tstruct {\n\t\tstruct perf_event_header header;\n\t\tu32 pid;\n\t\tu32 tid;\n\t\tu64 nr_namespaces;\n\t\tstruct perf_ns_link_info link_info[7];\n\t} event_id;\n};\n\nstruct perf_pmu_events_attr {\n\tstruct device_attribute attr;\n\tu64 id;\n\tconst char *event_str;\n};\n\nstruct perf_pmu_events_ht_attr {\n\tstruct device_attribute attr;\n\tu64 id;\n\tconst char *event_str_ht;\n\tconst char *event_str_noht;\n};\n\nstruct perf_pmu_events_hybrid_attr {\n\tstruct device_attribute attr;\n\tu64 id;\n\tconst char *event_str;\n\tu64 pmu_type;\n};\n\nstruct perf_pmu_format_hybrid_attr {\n\tstruct device_attribute attr;\n\tu64 pmu_type;\n};\n\ntypedef long unsigned int (*perf_copy_f)(void *, const void *, long unsigned int, long unsigned int);\n\nstruct perf_raw_frag {\n\tunion {\n\t\tstruct perf_raw_frag *next;\n\t\tlong unsigned int pad;\n\t};\n\tperf_copy_f copy;\n\tvoid *data;\n\tu32 size;\n} __attribute__((packed));\n\nstruct perf_raw_record {\n\tstruct perf_raw_frag frag;\n\tu32 size;\n};\n\nstruct perf_read_data {\n\tstruct perf_event *event;\n\tbool group;\n\tint ret;\n};\n\nstruct perf_read_event {\n\tstruct perf_event_header header;\n\tu32 pid;\n\tu32 tid;\n};\n\nstruct sched_state {\n\tint weight;\n\tint event;\n\tint counter;\n\tint unassigned;\n\tint nr_gp;\n\tu64 used;\n};\n\nstruct perf_sched {\n\tint max_weight;\n\tint max_events;\n\tint max_gp;\n\tint saved_states;\n\tstruct event_constraint **constraints;\n\tstruct sched_state state;\n\tstruct sched_state saved[2];\n};\n\nstruct perf_switch_event {\n\tstruct task_struct *task;\n\tstruct task_struct *next_prev;\n\tstruct {\n\t\tstruct perf_event_header header;\n\t\tu32 next_prev_pid;\n\t\tu32 next_prev_tid;\n\t} event_id;\n};\n\nstruct perf_task_event {\n\tstruct task_struct *task;\n\tstruct perf_event_context *task_ctx;\n\tstruct {\n\t\tstruct perf_event_header header;\n\t\tu32 pid;\n\t\tu32 ppid;\n\t\tu32 tid;\n\t\tu32 ptid;\n\t\tu64 time;\n\t} event_id;\n};\n\nstruct perf_text_poke_event {\n\tconst void *old_bytes;\n\tconst void *new_bytes;\n\tsize_t pad;\n\tu16 old_len;\n\tu16 new_len;\n\tstruct {\n\t\tstruct perf_event_header header;\n\t\tu64 addr;\n\t} event_id;\n};\n\nstruct perm_datum {\n\tu32 value;\n};\n\nstruct pernet_operations {\n\tstruct list_head list;\n\tint (*init)(struct net *);\n\tvoid (*pre_exit)(struct net *);\n\tvoid (*exit)(struct net *);\n\tvoid (*exit_batch)(struct list_head *);\n\tvoid (*exit_batch_rtnl)(struct list_head *, struct list_head *);\n\tunsigned int *id;\n\tsize_t size;\n};\n\nstruct pf_desc {\n\tu32 pseudoflavor;\n\tu32 qop;\n\tu32 service;\n\tchar *name;\n\tchar *auth_domain_name;\n\tstruct auth_domain *domain;\n\tbool datatouch;\n};\n\nstruct skb_array {\n\tstruct ptr_ring ring;\n};\n\nstruct pfifo_fast_priv {\n\tstruct skb_array q[3];\n};\n\nstruct ptdump_range;\n\nstruct ptdump_state {\n\tvoid (*note_page)(struct ptdump_state *, long unsigned int, int, u64);\n\tvoid (*effective_prot)(struct ptdump_state *, int, u64);\n\tconst struct ptdump_range *range;\n};\n\nstruct pg_state {\n\tstruct ptdump_state ptdump;\n\tint level;\n\tpgprotval_t current_prot;\n\tpgprotval_t effective_prot;\n\tpgprotval_t prot_levels[5];\n\tlong unsigned int start_address;\n\tconst struct addr_marker *marker;\n\tlong unsigned int lines;\n\tbool to_dmesg;\n\tbool check_wx;\n\tlong unsigned int wx_pages;\n\tstruct seq_file *seq;\n};\n\nstruct zone {\n\tlong unsigned int _watermark[4];\n\tlong unsigned int watermark_boost;\n\tlong unsigned int nr_reserved_highatomic;\n\tlong int lowmem_reserve[5];\n\tint node;\n\tstruct pglist_data *zone_pgdat;\n\tstruct per_cpu_pages *per_cpu_pageset;\n\tstruct per_cpu_zonestat *per_cpu_zonestats;\n\tint pageset_high_min;\n\tint pageset_high_max;\n\tint pageset_batch;\n\tlong unsigned int zone_start_pfn;\n\tatomic_long_t managed_pages;\n\tlong unsigned int spanned_pages;\n\tlong unsigned int present_pages;\n\tlong unsigned int present_early_pages;\n\tconst char *name;\n\tlong unsigned int nr_isolate_pageblock;\n\tseqlock_t span_seqlock;\n\tint initialized;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tstruct cacheline_padding _pad1_;\n\tstruct free_area free_area[11];\n\tstruct list_head unaccepted_pages;\n\tlong unsigned int flags;\n\tspinlock_t lock;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tstruct cacheline_padding _pad2_;\n\tlong unsigned int percpu_drift_mark;\n\tlong unsigned int compact_cached_free_pfn;\n\tlong unsigned int compact_cached_migrate_pfn[2];\n\tlong unsigned int compact_init_migrate_pfn;\n\tlong unsigned int compact_init_free_pfn;\n\tunsigned int compact_considered;\n\tunsigned int compact_defer_shift;\n\tint compact_order_failed;\n\tbool compact_blockskip_flush;\n\tbool contiguous;\n\tlong: 0;\n\tstruct cacheline_padding _pad3_;\n\tatomic_long_t vm_stat[12];\n\tatomic_long_t vm_numa_event[6];\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct zoneref {\n\tstruct zone *zone;\n\tint zone_idx;\n};\n\nstruct zonelist {\n\tstruct zoneref _zonerefs[5121];\n};\n\nstruct pglist_data {\n\tstruct zone node_zones[5];\n\tstruct zonelist node_zonelists[2];\n\tint nr_zones;\n\tspinlock_t node_size_lock;\n\tlong unsigned int node_start_pfn;\n\tlong unsigned int node_present_pages;\n\tlong unsigned int node_spanned_pages;\n\tint node_id;\n\twait_queue_head_t kswapd_wait;\n\twait_queue_head_t pfmemalloc_wait;\n\twait_queue_head_t reclaim_wait[4];\n\tatomic_t nr_writeback_throttled;\n\tlong unsigned int nr_reclaim_start;\n\tstruct mutex kswapd_lock;\n\tstruct task_struct *kswapd;\n\tint kswapd_order;\n\tenum zone_type kswapd_highest_zoneidx;\n\tint kswapd_failures;\n\tint kcompactd_max_order;\n\tenum zone_type kcompactd_highest_zoneidx;\n\twait_queue_head_t kcompactd_wait;\n\tstruct task_struct *kcompactd;\n\tbool proactive_compact_trigger;\n\tlong unsigned int totalreserve_pages;\n\tlong unsigned int min_unmapped_pages;\n\tlong unsigned int min_slab_pages;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tstruct cacheline_padding _pad1_;\n\tstruct deferred_split deferred_split_queue;\n\tunsigned int nbp_rl_start;\n\tlong unsigned int nbp_rl_nr_cand;\n\tunsigned int nbp_threshold;\n\tunsigned int nbp_th_start;\n\tlong unsigned int nbp_th_nr_cand;\n\tstruct lruvec __lruvec;\n\tlong unsigned int flags;\n\tstruct lru_gen_mm_walk mm_walk;\n\tstruct lru_gen_memcg memcg_lru;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tstruct cacheline_padding _pad2_;\n\tstruct per_cpu_nodestat *per_cpu_nodestats;\n\tatomic_long_t vm_stat[47];\n\tstruct memory_tier *memtier;\n\tstruct memory_failure_stats mf_stats;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct pgv {\n\tchar *buffer;\n};\n\nstruct phc_vclocks_reply_data {\n\tstruct ethnl_reply_data base;\n\tint num;\n\tint *index;\n};\n\nstruct phy_attrs {\n\tu32 bus_width;\n\tu32 max_link_rate;\n\tenum phy_mode mode;\n};\n\nstruct phy_ops;\n\nstruct phy {\n\tstruct device dev;\n\tint id;\n\tconst struct phy_ops *ops;\n\tstruct mutex mutex;\n\tint init_count;\n\tint power_count;\n\tstruct phy_attrs attrs;\n\tstruct regulator *pwr;\n\tstruct dentry *debugfs;\n};\n\nstruct phy_c45_device_ids {\n\tu32 devices_in_package;\n\tu32 mmds_present;\n\tu32 device_ids[32];\n};\n\nstruct phy_configure_opts_mipi_dphy {\n\tunsigned int clk_miss;\n\tunsigned int clk_post;\n\tunsigned int clk_pre;\n\tunsigned int clk_prepare;\n\tunsigned int clk_settle;\n\tunsigned int clk_term_en;\n\tunsigned int clk_trail;\n\tunsigned int clk_zero;\n\tunsigned int d_term_en;\n\tunsigned int eot;\n\tunsigned int hs_exit;\n\tunsigned int hs_prepare;\n\tunsigned int hs_settle;\n\tunsigned int hs_skip;\n\tunsigned int hs_trail;\n\tunsigned int hs_zero;\n\tunsigned int init;\n\tunsigned int lpx;\n\tunsigned int ta_get;\n\tunsigned int ta_go;\n\tunsigned int ta_sure;\n\tunsigned int wakeup;\n\tlong unsigned int hs_clk_rate;\n\tlong unsigned int lp_clk_rate;\n\tunsigned char lanes;\n};\n\nstruct phy_configure_opts_dp {\n\tunsigned int link_rate;\n\tunsigned int lanes;\n\tunsigned int voltage[4];\n\tunsigned int pre[4];\n\tu8 ssc: 1;\n\tu8 set_rate: 1;\n\tu8 set_lanes: 1;\n\tu8 set_voltages: 1;\n};\n\nstruct phy_configure_opts_lvds {\n\tunsigned int bits_per_lane_and_dclk_cycle;\n\tlong unsigned int differential_clk_rate;\n\tunsigned int lanes;\n\tbool is_slave;\n};\n\nunion phy_configure_opts {\n\tstruct phy_configure_opts_mipi_dphy mipi_dphy;\n\tstruct phy_configure_opts_dp dp;\n\tstruct phy_configure_opts_lvds lvds;\n};\n\nstruct phy_driver;\n\nstruct phy_led_trigger;\n\nstruct pse_control;\n\nstruct phy_device {\n\tstruct mdio_device mdio;\n\tconst struct phy_driver *drv;\n\tstruct device_link *devlink;\n\tu32 phy_id;\n\tstruct phy_c45_device_ids c45_ids;\n\tunsigned int is_c45: 1;\n\tunsigned int is_internal: 1;\n\tunsigned int is_pseudo_fixed_link: 1;\n\tunsigned int is_gigabit_capable: 1;\n\tunsigned int has_fixups: 1;\n\tunsigned int suspended: 1;\n\tunsigned int suspended_by_mdio_bus: 1;\n\tunsigned int sysfs_links: 1;\n\tunsigned int loopback_enabled: 1;\n\tunsigned int downshifted_rate: 1;\n\tunsigned int is_on_sfp_module: 1;\n\tunsigned int mac_managed_pm: 1;\n\tunsigned int wol_enabled: 1;\n\tunsigned int autoneg: 1;\n\tunsigned int link: 1;\n\tunsigned int autoneg_complete: 1;\n\tunsigned int interrupts: 1;\n\tunsigned int irq_suspended: 1;\n\tunsigned int irq_rerun: 1;\n\tunsigned int default_timestamp: 1;\n\tint rate_matching;\n\tenum phy_state state;\n\tu32 dev_flags;\n\tphy_interface_t interface;\n\tlong unsigned int possible_interfaces[1];\n\tint speed;\n\tint duplex;\n\tint port;\n\tint pause;\n\tint asym_pause;\n\tu8 master_slave_get;\n\tu8 master_slave_set;\n\tu8 master_slave_state;\n\tlong unsigned int supported[2];\n\tlong unsigned int advertising[2];\n\tlong unsigned int lp_advertising[2];\n\tlong unsigned int adv_old[2];\n\tlong unsigned int supported_eee[2];\n\tlong unsigned int advertising_eee[2];\n\tbool eee_enabled;\n\tlong unsigned int host_interfaces[1];\n\tu32 eee_broken_modes;\n\tbool enable_tx_lpi;\n\tstruct eee_config eee_cfg;\n\tstruct phy_led_trigger *phy_led_triggers;\n\tunsigned int phy_num_led_triggers;\n\tstruct phy_led_trigger *last_triggered;\n\tstruct phy_led_trigger *led_link_trigger;\n\tstruct list_head leds;\n\tint irq;\n\tvoid *priv;\n\tstruct phy_package_shared *shared;\n\tstruct sk_buff *skb;\n\tvoid *ehdr;\n\tstruct nlattr *nest;\n\tstruct delayed_work state_queue;\n\tstruct mutex lock;\n\tbool sfp_bus_attached;\n\tstruct sfp_bus *sfp_bus;\n\tstruct phylink *phylink;\n\tstruct net_device *attached_dev;\n\tstruct mii_timestamper *mii_ts;\n\tstruct pse_control *psec;\n\tu8 mdix;\n\tu8 mdix_ctrl;\n\tint pma_extable;\n\tunsigned int link_down_events;\n\tvoid (*phy_link_change)(struct phy_device *, bool);\n\tvoid (*adjust_link)(struct net_device *);\n\tconst struct macsec_ops *macsec_ops;\n};\n\nstruct phy_devm {\n\tstruct usb_phy *phy;\n\tstruct notifier_block *nb;\n};\n\nstruct phy_driver {\n\tstruct mdio_driver_common mdiodrv;\n\tu32 phy_id;\n\tchar *name;\n\tu32 phy_id_mask;\n\tconst long unsigned int * const features;\n\tu32 flags;\n\tconst void *driver_data;\n\tint (*soft_reset)(struct phy_device *);\n\tint (*config_init)(struct phy_device *);\n\tint (*probe)(struct phy_device *);\n\tint (*get_features)(struct phy_device *);\n\tint (*get_rate_matching)(struct phy_device *, phy_interface_t);\n\tint (*suspend)(struct phy_device *);\n\tint (*resume)(struct phy_device *);\n\tint (*config_aneg)(struct phy_device *);\n\tint (*aneg_done)(struct phy_device *);\n\tint (*read_status)(struct phy_device *);\n\tint (*config_intr)(struct phy_device *);\n\tirqreturn_t (*handle_interrupt)(struct phy_device *);\n\tvoid (*remove)(struct phy_device *);\n\tint (*match_phy_device)(struct phy_device *);\n\tint (*set_wol)(struct phy_device *, struct ethtool_wolinfo *);\n\tvoid (*get_wol)(struct phy_device *, struct ethtool_wolinfo *);\n\tvoid (*link_change_notify)(struct phy_device *);\n\tint (*read_mmd)(struct phy_device *, int, u16);\n\tint (*write_mmd)(struct phy_device *, int, u16, u16);\n\tint (*read_page)(struct phy_device *);\n\tint (*write_page)(struct phy_device *, int);\n\tint (*module_info)(struct phy_device *, struct ethtool_modinfo *);\n\tint (*module_eeprom)(struct phy_device *, struct ethtool_eeprom *, u8 *);\n\tint (*cable_test_start)(struct phy_device *);\n\tint (*cable_test_tdr_start)(struct phy_device *, const struct phy_tdr_config *);\n\tint (*cable_test_get_status)(struct phy_device *, bool *);\n\tint (*get_sset_count)(struct phy_device *);\n\tvoid (*get_strings)(struct phy_device *, u8 *);\n\tvoid (*get_stats)(struct phy_device *, struct ethtool_stats *, u64 *);\n\tint (*get_tunable)(struct phy_device *, struct ethtool_tunable *, void *);\n\tint (*set_tunable)(struct phy_device *, struct ethtool_tunable *, const void *);\n\tint (*set_loopback)(struct phy_device *, bool);\n\tint (*get_sqi)(struct phy_device *);\n\tint (*get_sqi_max)(struct phy_device *);\n\tint (*get_plca_cfg)(struct phy_device *, struct phy_plca_cfg *);\n\tint (*set_plca_cfg)(struct phy_device *, const struct phy_plca_cfg *);\n\tint (*get_plca_status)(struct phy_device *, struct phy_plca_status *);\n\tint (*led_brightness_set)(struct phy_device *, u8, enum led_brightness);\n\tint (*led_blink_set)(struct phy_device *, u8, long unsigned int *, long unsigned int *);\n\tint (*led_hw_is_supported)(struct phy_device *, u8, long unsigned int);\n\tint (*led_hw_control_set)(struct phy_device *, u8, long unsigned int);\n\tint (*led_hw_control_get)(struct phy_device *, u8, long unsigned int *);\n\tint (*led_polarity_set)(struct phy_device *, int, long unsigned int);\n};\n\nstruct phy_fixup {\n\tstruct list_head list;\n\tchar bus_id[64];\n\tu32 phy_uid;\n\tu32 phy_uid_mask;\n\tint (*run)(struct phy_device *);\n};\n\nstruct phy_led_trigger {\n\tstruct led_trigger trigger;\n\tchar name[76];\n\tunsigned int speed;\n};\n\nstruct phy_lookup {\n\tstruct list_head node;\n\tconst char *dev_id;\n\tconst char *con_id;\n\tstruct phy *phy;\n};\n\nstruct phy_ops {\n\tint (*init)(struct phy *);\n\tint (*exit)(struct phy *);\n\tint (*power_on)(struct phy *);\n\tint (*power_off)(struct phy *);\n\tint (*set_mode)(struct phy *, enum phy_mode, int);\n\tint (*set_media)(struct phy *, enum phy_media);\n\tint (*set_speed)(struct phy *, int);\n\tint (*configure)(struct phy *, union phy_configure_opts *);\n\tint (*validate)(struct phy *, enum phy_mode, int, union phy_configure_opts *);\n\tint (*reset)(struct phy *);\n\tint (*calibrate)(struct phy *);\n\tint (*connect)(struct phy *, int);\n\tint (*disconnect)(struct phy *, int);\n\tvoid (*release)(struct phy *);\n\tstruct module *owner;\n};\n\nstruct phy_package_shared {\n\tu8 base_addr;\n\tstruct device_node *np;\n\trefcount_t refcnt;\n\tlong unsigned int flags;\n\tsize_t priv_size;\n\tvoid *priv;\n};\n\nstruct phy_plca_cfg {\n\tint version;\n\tint enabled;\n\tint node_id;\n\tint node_cnt;\n\tint to_tmr;\n\tint burst_cnt;\n\tint burst_tmr;\n};\n\nstruct phy_plca_status {\n\tbool pst;\n};\n\nstruct phy_provider {\n\tstruct device *dev;\n\tstruct device_node *children;\n\tstruct module *owner;\n\tstruct list_head list;\n\tstruct phy * (*of_xlate)(struct device *, const struct of_phandle_args *);\n};\n\nstruct phy_setting {\n\tu32 speed;\n\tu8 duplex;\n\tu8 bit;\n};\n\nstruct phy_tdr_config {\n\tu32 first;\n\tu32 last;\n\tu32 step;\n\ts8 pair;\n};\n\nstruct phylib_stubs {\n\tint (*hwtstamp_get)(struct phy_device *, struct kernel_hwtstamp_config *);\n\tint (*hwtstamp_set)(struct phy_device *, struct kernel_hwtstamp_config *, struct netlink_ext_ack *);\n};\n\nstruct phylink_link_state {\n\tlong unsigned int advertising[2];\n\tlong unsigned int lp_advertising[2];\n\tphy_interface_t interface;\n\tint speed;\n\tint duplex;\n\tint pause;\n\tint rate_matching;\n\tunsigned int link: 1;\n\tunsigned int an_complete: 1;\n};\n\nstruct phylink_mac_ops {\n\tlong unsigned int (*mac_get_caps)(struct phylink_config *, phy_interface_t);\n\tstruct phylink_pcs * (*mac_select_pcs)(struct phylink_config *, phy_interface_t);\n\tint (*mac_prepare)(struct phylink_config *, unsigned int, phy_interface_t);\n\tvoid (*mac_config)(struct phylink_config *, unsigned int, const struct phylink_link_state *);\n\tint (*mac_finish)(struct phylink_config *, unsigned int, phy_interface_t);\n\tvoid (*mac_link_down)(struct phylink_config *, unsigned int, phy_interface_t);\n\tvoid (*mac_link_up)(struct phylink_config *, struct phy_device *, unsigned int, phy_interface_t, int, int, bool, bool);\n};\n\nstruct phylink_pcs_ops;\n\nstruct phylink_pcs {\n\tconst struct phylink_pcs_ops *ops;\n\tstruct phylink *phylink;\n\tbool neg_mode;\n\tbool poll;\n\tbool rxc_always_on;\n};\n\nstruct phylink_pcs_ops {\n\tint (*pcs_validate)(struct phylink_pcs *, long unsigned int *, const struct phylink_link_state *);\n\tint (*pcs_enable)(struct phylink_pcs *);\n\tvoid (*pcs_disable)(struct phylink_pcs *);\n\tvoid (*pcs_pre_config)(struct phylink_pcs *, phy_interface_t);\n\tint (*pcs_post_config)(struct phylink_pcs *, phy_interface_t);\n\tvoid (*pcs_get_state)(struct phylink_pcs *, struct phylink_link_state *);\n\tint (*pcs_config)(struct phylink_pcs *, unsigned int, phy_interface_t, const long unsigned int *, bool);\n\tvoid (*pcs_an_restart)(struct phylink_pcs *);\n\tvoid (*pcs_link_up)(struct phylink_pcs *, unsigned int, phy_interface_t, int, int);\n\tint (*pcs_pre_init)(struct phylink_pcs *);\n};\n\nstruct physdev_apic {\n\tlong unsigned int apic_physbase;\n\tuint32_t reg;\n\tuint32_t value;\n};\n\nstruct physdev_pci_device {\n\tuint16_t seg;\n\tuint8_t bus;\n\tuint8_t devfn;\n};\n\nstruct physdev_dbgp_op {\n\tuint8_t op;\n\tuint8_t bus;\n\tunion {\n\t\tstruct physdev_pci_device pci;\n\t} u;\n};\n\nstruct physdev_eoi {\n\tuint32_t irq;\n};\n\nstruct physdev_get_free_pirq {\n\tint type;\n\tuint32_t pirq;\n};\n\nstruct physdev_irq {\n\tuint32_t irq;\n\tuint32_t vector;\n};\n\nstruct physdev_irq_status_query {\n\tuint32_t irq;\n\tuint32_t flags;\n};\n\nstruct physdev_manage_pci {\n\tuint8_t bus;\n\tuint8_t devfn;\n};\n\nstruct physdev_manage_pci_ext {\n\tuint8_t bus;\n\tuint8_t devfn;\n\tunsigned int is_extfn;\n\tunsigned int is_virtfn;\n\tstruct {\n\t\tuint8_t bus;\n\t\tuint8_t devfn;\n\t} physfn;\n};\n\nstruct physdev_map_pirq {\n\tdomid_t domid;\n\tint type;\n\tint index;\n\tint pirq;\n\tint bus;\n\tint devfn;\n\tint entry_nr;\n\tuint64_t table_base;\n};\n\nstruct physdev_pci_device_add {\n\tuint16_t seg;\n\tuint8_t bus;\n\tuint8_t devfn;\n\tuint32_t flags;\n\tstruct {\n\t\tuint8_t bus;\n\t\tuint8_t devfn;\n\t} physfn;\n\tuint32_t optarr[0];\n};\n\nstruct physdev_pci_mmcfg_reserved {\n\tuint64_t address;\n\tuint16_t segment;\n\tuint8_t start_bus;\n\tuint8_t end_bus;\n\tuint32_t flags;\n};\n\nstruct physdev_pirq_eoi_gmfn {\n\txen_ulong_t gmfn;\n};\n\nstruct physdev_restore_msi {\n\tuint8_t bus;\n\tuint8_t devfn;\n};\n\nstruct physdev_set_iobitmap {\n\tuint8_t *bitmap;\n\tuint32_t nr_ports;\n};\n\nstruct physdev_set_iopl {\n\tuint32_t iopl;\n};\n\nstruct physdev_setup_gsi {\n\tint gsi;\n\tuint8_t triggering;\n\tuint8_t polarity;\n};\n\nstruct physdev_unmap_pirq {\n\tdomid_t domid;\n\tint pirq;\n};\n\nstruct upid {\n\tint nr;\n\tstruct pid_namespace *ns;\n};\n\nstruct pid {\n\trefcount_t count;\n\tunsigned int level;\n\tspinlock_t lock;\n\tstruct dentry *stashed;\n\tu64 ino;\n\tstruct hlist_head tasks[4];\n\tstruct hlist_head inodes;\n\twait_queue_head_t wait_pidfd;\n\tstruct callback_head rcu;\n\tstruct upid numbers[0];\n};\n\nunion proc_op {\n\tint (*proc_get_link)(struct dentry *, struct path *);\n\tint (*proc_show)(struct seq_file *, struct pid_namespace *, struct pid *, struct task_struct *);\n\tint lsmid;\n};\n\nstruct pid_entry {\n\tconst char *name;\n\tunsigned int len;\n\tumode_t mode;\n\tconst struct inode_operations *iop;\n\tconst struct file_operations *fop;\n\tunion proc_op op;\n};\n\nstruct pid_namespace {\n\tstruct idr idr;\n\tstruct callback_head rcu;\n\tunsigned int pid_allocated;\n\tstruct task_struct *child_reaper;\n\tstruct kmem_cache *pid_cachep;\n\tunsigned int level;\n\tstruct pid_namespace *parent;\n\tstruct fs_pin *bacct;\n\tstruct user_namespace *user_ns;\n\tstruct ucounts *ucounts;\n\tint reboot;\n\tstruct ns_common ns;\n\tint memfd_noexec_scope;\n};\n\nstruct pids_cgroup {\n\tstruct cgroup_subsys_state css;\n\tatomic64_t counter;\n\tatomic64_t limit;\n\tint64_t watermark;\n\tstruct cgroup_file events_file;\n\tstruct cgroup_file events_local_file;\n\tatomic64_t events[2];\n\tatomic64_t events_local[2];\n};\n\nstruct piix_host_priv {\n\tconst int *map;\n\tu32 saved_iocfg;\n\tvoid *sidpr;\n};\n\nstruct piix_map_db {\n\tconst u32 mask;\n\tconst u16 port_enable;\n\tconst int map[0];\n};\n\nstruct pimreghdr {\n\t__u8 type;\n\t__u8 reserved;\n\t__be16 csum;\n\t__be32 flags;\n};\n\nstruct pin_config_item {\n\tconst enum pin_config_param param;\n\tconst char * const display;\n\tconst char * const format;\n\tbool has_arg;\n};\n\nstruct pinctrl_setting_mux;\n\nstruct pin_desc {\n\tstruct pinctrl_dev *pctldev;\n\tconst char *name;\n\tbool dynamic_name;\n\tvoid *drv_data;\n\tunsigned int mux_usecount;\n\tconst char *mux_owner;\n\tconst struct pinctrl_setting_mux *mux_setting;\n\tconst char *gpio_owner;\n\tstruct mutex mux_lock;\n};\n\nstruct pinconf_generic_params {\n\tconst char * const property;\n\tenum pin_config_param param;\n\tu32 default_value;\n};\n\nstruct pinconf_ops {\n\tbool is_generic;\n\tint (*pin_config_get)(struct pinctrl_dev *, unsigned int, long unsigned int *);\n\tint (*pin_config_set)(struct pinctrl_dev *, unsigned int, long unsigned int *, unsigned int);\n\tint (*pin_config_group_get)(struct pinctrl_dev *, unsigned int, long unsigned int *);\n\tint (*pin_config_group_set)(struct pinctrl_dev *, unsigned int, long unsigned int *, unsigned int);\n\tvoid (*pin_config_dbg_show)(struct pinctrl_dev *, struct seq_file *, unsigned int);\n\tvoid (*pin_config_group_dbg_show)(struct pinctrl_dev *, struct seq_file *, unsigned int);\n\tvoid (*pin_config_config_dbg_show)(struct pinctrl_dev *, struct seq_file *, long unsigned int);\n};\n\nstruct pinctrl {\n\tstruct list_head node;\n\tstruct device *dev;\n\tstruct list_head states;\n\tstruct pinctrl_state *state;\n\tstruct list_head dt_maps;\n\tstruct kref users;\n};\n\nstruct pinctrl_dev {\n\tstruct list_head node;\n\tstruct pinctrl_desc *desc;\n\tstruct xarray pin_desc_tree;\n\tstruct list_head gpio_ranges;\n\tstruct device *dev;\n\tstruct module *owner;\n\tvoid *driver_data;\n\tstruct pinctrl *p;\n\tstruct pinctrl_state *hog_default;\n\tstruct pinctrl_state *hog_sleep;\n\tstruct mutex mutex;\n\tstruct dentry *device_root;\n};\n\nstruct pinctrl_map_mux {\n\tconst char *group;\n\tconst char *function;\n};\n\nstruct pinctrl_map_configs {\n\tconst char *group_or_pin;\n\tlong unsigned int *configs;\n\tunsigned int num_configs;\n};\n\nstruct pinctrl_map {\n\tconst char *dev_name;\n\tconst char *name;\n\tenum pinctrl_map_type type;\n\tconst char *ctrl_dev_name;\n\tunion {\n\t\tstruct pinctrl_map_mux mux;\n\t\tstruct pinctrl_map_configs configs;\n\t} data;\n};\n\nstruct pinctrl_maps {\n\tstruct list_head node;\n\tconst struct pinctrl_map *maps;\n\tunsigned int num_maps;\n};\n\nstruct pinctrl_ops {\n\tint (*get_groups_count)(struct pinctrl_dev *);\n\tconst char * (*get_group_name)(struct pinctrl_dev *, unsigned int);\n\tint (*get_group_pins)(struct pinctrl_dev *, unsigned int, const unsigned int **, unsigned int *);\n\tvoid (*pin_dbg_show)(struct pinctrl_dev *, struct seq_file *, unsigned int);\n\tint (*dt_node_to_map)(struct pinctrl_dev *, struct device_node *, struct pinctrl_map **, unsigned int *);\n\tvoid (*dt_free_map)(struct pinctrl_dev *, struct pinctrl_map *, unsigned int);\n};\n\nstruct pinctrl_pin_desc {\n\tunsigned int number;\n\tconst char *name;\n\tvoid *drv_data;\n};\n\nstruct pinctrl_setting_mux {\n\tunsigned int group;\n\tunsigned int func;\n};\n\nstruct pinctrl_setting_configs {\n\tunsigned int group_or_pin;\n\tlong unsigned int *configs;\n\tunsigned int num_configs;\n};\n\nstruct pinctrl_setting {\n\tstruct list_head node;\n\tenum pinctrl_map_type type;\n\tstruct pinctrl_dev *pctldev;\n\tconst char *dev_name;\n\tunion {\n\t\tstruct pinctrl_setting_mux mux;\n\t\tstruct pinctrl_setting_configs configs;\n\t} data;\n};\n\nstruct pinctrl_state {\n\tstruct list_head node;\n\tconst char *name;\n\tstruct list_head settings;\n};\n\nstruct ping_iter_state {\n\tstruct seq_net_private p;\n\tint bucket;\n\tsa_family_t family;\n};\n\nstruct ping_table {\n\tstruct hlist_head hash[64];\n\tspinlock_t lock;\n};\n\nstruct pingfakehdr {\n\tstruct icmphdr icmph;\n\tstruct msghdr *msg;\n\tsa_family_t family;\n\t__wsum wcheck;\n};\n\nstruct pingv6_ops {\n\tint (*ipv6_recv_error)(struct sock *, struct msghdr *, int, int *);\n\tvoid (*ip6_datagram_recv_common_ctl)(struct sock *, struct msghdr *, struct sk_buff *);\n\tvoid (*ip6_datagram_recv_specific_ctl)(struct sock *, struct msghdr *, struct sk_buff *);\n\tint (*icmpv6_err_convert)(u8, u8, int *);\n\tvoid (*ipv6_icmp_error)(struct sock *, struct sk_buff *, int, __be16, u32, u8 *);\n\tint (*ipv6_chk_addr)(struct net *, const struct in6_addr *, const struct net_device *, int);\n};\n\nstruct pinmux_ops {\n\tint (*request)(struct pinctrl_dev *, unsigned int);\n\tint (*free)(struct pinctrl_dev *, unsigned int);\n\tint (*get_functions_count)(struct pinctrl_dev *);\n\tconst char * (*get_function_name)(struct pinctrl_dev *, unsigned int);\n\tint (*get_function_groups)(struct pinctrl_dev *, unsigned int, const char * const **, unsigned int *);\n\tint (*set_mux)(struct pinctrl_dev *, unsigned int, unsigned int);\n\tint (*gpio_request_enable)(struct pinctrl_dev *, struct pinctrl_gpio_range *, unsigned int);\n\tvoid (*gpio_disable_free)(struct pinctrl_dev *, struct pinctrl_gpio_range *, unsigned int);\n\tint (*gpio_set_direction)(struct pinctrl_dev *, struct pinctrl_gpio_range *, unsigned int, bool);\n\tbool strict;\n};\n\nstruct pipe_buf_operations {\n\tint (*confirm)(struct pipe_inode_info *, struct pipe_buffer *);\n\tvoid (*release)(struct pipe_inode_info *, struct pipe_buffer *);\n\tbool (*try_steal)(struct pipe_inode_info *, struct pipe_buffer *);\n\tbool (*get)(struct pipe_inode_info *, struct pipe_buffer *);\n};\n\nstruct pipe_buffer {\n\tstruct page *page;\n\tunsigned int offset;\n\tunsigned int len;\n\tconst struct pipe_buf_operations *ops;\n\tunsigned int flags;\n\tlong unsigned int private;\n};\n\nstruct watch_queue;\n\nstruct pipe_inode_info {\n\tstruct mutex mutex;\n\twait_queue_head_t rd_wait;\n\twait_queue_head_t wr_wait;\n\tunsigned int head;\n\tunsigned int tail;\n\tunsigned int max_usage;\n\tunsigned int ring_size;\n\tunsigned int nr_accounted;\n\tunsigned int readers;\n\tunsigned int writers;\n\tunsigned int files;\n\tunsigned int r_counter;\n\tunsigned int w_counter;\n\tbool poll_usage;\n\tbool note_loss;\n\tstruct page *tmp_page;\n\tstruct fasync_struct *fasync_readers;\n\tstruct fasync_struct *fasync_writers;\n\tstruct pipe_buffer *bufs;\n\tstruct user_struct *user;\n\tstruct watch_queue *watch_queue;\n};\n\nstruct pipe_wait {\n\tstruct trace_iterator *iter;\n\tint wait_index;\n};\n\nstruct pkcs1pad_ctx {\n\tstruct crypto_akcipher *child;\n\tunsigned int key_size;\n};\n\nstruct rsa_asn1_template;\n\nstruct pkcs1pad_inst_ctx {\n\tstruct crypto_akcipher_spawn spawn;\n\tconst struct rsa_asn1_template *digest_info;\n};\n\nstruct pkcs1pad_request {\n\tstruct scatterlist in_sg[2];\n\tstruct scatterlist out_sg[1];\n\tuint8_t *in_buf;\n\tuint8_t *out_buf;\n\tstruct akcipher_request child_req;\n};\n\nstruct x509_certificate;\n\nstruct pkcs7_signed_info;\n\nstruct pkcs7_message {\n\tstruct x509_certificate *certs;\n\tstruct x509_certificate *crl;\n\tstruct pkcs7_signed_info *signed_infos;\n\tu8 version;\n\tbool have_authattrs;\n\tenum OID data_type;\n\tsize_t data_len;\n\tsize_t data_hdrlen;\n\tconst void *data;\n};\n\nstruct pkcs7_parse_context {\n\tstruct pkcs7_message *msg;\n\tstruct pkcs7_signed_info *sinfo;\n\tstruct pkcs7_signed_info **ppsinfo;\n\tstruct x509_certificate *certs;\n\tstruct x509_certificate **ppcerts;\n\tlong unsigned int data;\n\tenum OID last_oid;\n\tunsigned int x509_index;\n\tunsigned int sinfo_index;\n\tconst void *raw_serial;\n\tunsigned int raw_serial_size;\n\tunsigned int raw_issuer_size;\n\tconst void *raw_issuer;\n\tconst void *raw_skid;\n\tunsigned int raw_skid_size;\n\tbool expect_skid;\n};\n\nstruct pkcs7_signed_info {\n\tstruct pkcs7_signed_info *next;\n\tstruct x509_certificate *signer;\n\tunsigned int index;\n\tbool unsupported_crypto;\n\tbool blacklisted;\n\tconst void *msgdigest;\n\tunsigned int msgdigest_len;\n\tunsigned int authattrs_len;\n\tconst void *authattrs;\n\tlong unsigned int aa_set;\n\ttime64_t signing_time;\n\tstruct public_key_signature *sig;\n};\n\nstruct pkey_security_struct {\n\tu64 subnet_prefix;\n\tu16 pkey;\n\tu32 sid;\n};\n\nstruct pkru_state {\n\tu32 pkru;\n\tu32 pad;\n};\n\nstruct plat_serial8250_port {\n\tlong unsigned int iobase;\n\tvoid *membase;\n\tresource_size_t mapbase;\n\tresource_size_t mapsize;\n\tunsigned int uartclk;\n\tunsigned int irq;\n\tlong unsigned int irqflags;\n\tvoid *private_data;\n\tunsigned char regshift;\n\tunsigned char iotype;\n\tunsigned char hub6;\n\tunsigned char has_sysrq;\n\tunsigned int type;\n\tupf_t flags;\n\tu16 bugs;\n\tunsigned int (*serial_in)(struct uart_port *, int);\n\tvoid (*serial_out)(struct uart_port *, int, int);\n\tu32 (*dl_read)(struct uart_8250_port *);\n\tvoid (*dl_write)(struct uart_8250_port *, u32);\n\tvoid (*set_termios)(struct uart_port *, struct ktermios *, const struct ktermios *);\n\tvoid (*set_ldisc)(struct uart_port *, struct ktermios *);\n\tunsigned int (*get_mctrl)(struct uart_port *);\n\tint (*handle_irq)(struct uart_port *);\n\tvoid (*pm)(struct uart_port *, unsigned int, unsigned int);\n\tvoid (*handle_break)(struct uart_port *);\n};\n\nstruct platform_device_id {\n\tchar name[20];\n\tkernel_ulong_t driver_data;\n};\n\nstruct platform_device_info {\n\tstruct device *parent;\n\tstruct fwnode_handle *fwnode;\n\tbool of_node_reused;\n\tconst char *name;\n\tint id;\n\tconst struct resource *res;\n\tunsigned int num_res;\n\tconst void *data;\n\tsize_t size_data;\n\tu64 dma_mask;\n\tconst struct property_entry *properties;\n};\n\nstruct platform_driver {\n\tint (*probe)(struct platform_device *);\n\tunion {\n\t\tvoid (*remove)(struct platform_device *);\n\t\tvoid (*remove_new)(struct platform_device *);\n\t};\n\tvoid (*shutdown)(struct platform_device *);\n\tint (*suspend)(struct platform_device *, pm_message_t);\n\tint (*resume)(struct platform_device *);\n\tstruct device_driver driver;\n\tconst struct platform_device_id *id_table;\n\tbool prevent_deferred_probe;\n\tbool driver_managed_dma;\n};\n\nstruct platform_hibernation_ops {\n\tint (*begin)(pm_message_t);\n\tvoid (*end)(void);\n\tint (*pre_snapshot)(void);\n\tvoid (*finish)(void);\n\tint (*prepare)(void);\n\tint (*enter)(void);\n\tvoid (*leave)(void);\n\tint (*pre_restore)(void);\n\tvoid (*restore_cleanup)(void);\n\tvoid (*recover)(void);\n};\n\nstruct platform_object {\n\tstruct platform_device pdev;\n\tchar name[0];\n};\n\nstruct platform_s2idle_ops {\n\tint (*begin)(void);\n\tint (*prepare)(void);\n\tint (*prepare_late)(void);\n\tvoid (*check)(void);\n\tbool (*wake)(void);\n\tvoid (*restore_early)(void);\n\tvoid (*restore)(void);\n\tvoid (*end)(void);\n};\n\nstruct platform_suspend_ops {\n\tint (*valid)(suspend_state_t);\n\tint (*begin)(suspend_state_t);\n\tint (*prepare)(void);\n\tint (*prepare_late)(void);\n\tint (*enter)(suspend_state_t);\n\tvoid (*wake)(void);\n\tvoid (*finish)(void);\n\tbool (*suspend_again)(void);\n\tvoid (*end)(void);\n\tvoid (*recover)(void);\n};\n\nstruct plca_reply_data {\n\tstruct ethnl_reply_data base;\n\tstruct phy_plca_cfg plca_cfg;\n\tstruct phy_plca_status plca_st;\n};\n\nstruct pldm_pci_record_id {\n\tint vendor;\n\tint device;\n\tint subsystem_vendor;\n\tint subsystem_device;\n};\n\nstruct pldmfw_ops;\n\nstruct pldmfw {\n\tconst struct pldmfw_ops *ops;\n\tstruct device *dev;\n};\n\nstruct pldmfw_component {\n\tstruct list_head entry;\n\tu16 classification;\n\tu16 identifier;\n\tu16 options;\n\tu16 activation_method;\n\tu32 comparison_stamp;\n\tu32 component_size;\n\tconst u8 *component_data;\n\tconst u8 *version_string;\n\tu8 version_type;\n\tu8 version_len;\n\tu8 index;\n};\n\nstruct pldmfw_desc_tlv {\n\tstruct list_head entry;\n\tconst u8 *data;\n\tu16 type;\n\tu16 size;\n};\n\nstruct pldmfw_record;\n\nstruct pldmfw_ops {\n\tbool (*match_record)(struct pldmfw *, struct pldmfw_record *);\n\tint (*send_package_data)(struct pldmfw *, const u8 *, u16);\n\tint (*send_component_table)(struct pldmfw *, struct pldmfw_component *, u8);\n\tint (*flash_component)(struct pldmfw *, struct pldmfw_component *);\n\tint (*finalize_update)(struct pldmfw *);\n};\n\nstruct pldmfw_priv {\n\tstruct pldmfw *context;\n\tconst struct firmware *fw;\n\tsize_t offset;\n\tstruct list_head records;\n\tstruct list_head components;\n\tconst struct __pldm_header *header;\n\tu16 total_header_size;\n\tu16 component_bitmap_len;\n\tu16 bitmap_size;\n\tu16 component_count;\n\tconst u8 *component_start;\n\tconst u8 *record_start;\n\tu8 record_count;\n\tu32 header_crc;\n\tstruct pldmfw_record *matching_record;\n};\n\nstruct pldmfw_record {\n\tstruct list_head entry;\n\tstruct list_head descs;\n\tconst u8 *version_string;\n\tu8 version_type;\n\tu8 version_len;\n\tu16 package_data_len;\n\tu32 device_update_flags;\n\tconst u8 *package_data;\n\tlong unsigned int *component_bitmap;\n\tu16 component_bitmap_len;\n};\n\nstruct pm860x_backlight_pdata {\n\tint pwm;\n\tint iset;\n};\n\nstruct pm860x_chip {\n\tstruct device *dev;\n\tstruct mutex irq_lock;\n\tstruct mutex osc_lock;\n\tstruct i2c_client *client;\n\tstruct i2c_client *companion;\n\tstruct regmap *regmap;\n\tstruct regmap *regmap_companion;\n\tint buck3_double;\n\tint companion_addr;\n\tshort unsigned int osc_vote;\n\tint id;\n\tint irq_mode;\n\tint irq_base;\n\tint core_irq;\n\tunsigned char chip_version;\n\tunsigned char osc_status;\n\tunsigned int wakeup_flag;\n};\n\nstruct pm860x_irq_data {\n\tint reg;\n\tint mask_reg;\n\tint enable;\n\tint offs;\n};\n\nstruct pm860x_led_pdata {\n\tint iset;\n};\n\nstruct pm860x_rtc_pdata;\n\nstruct pm860x_touch_pdata;\n\nstruct pm860x_power_pdata;\n\nstruct pm860x_platform_data {\n\tstruct pm860x_backlight_pdata *backlight;\n\tstruct pm860x_led_pdata *led;\n\tstruct pm860x_rtc_pdata *rtc;\n\tstruct pm860x_touch_pdata *touch;\n\tstruct pm860x_power_pdata *power;\n\tstruct regulator_init_data *buck1;\n\tstruct regulator_init_data *buck2;\n\tstruct regulator_init_data *buck3;\n\tstruct regulator_init_data *ldo1;\n\tstruct regulator_init_data *ldo2;\n\tstruct regulator_init_data *ldo3;\n\tstruct regulator_init_data *ldo4;\n\tstruct regulator_init_data *ldo5;\n\tstruct regulator_init_data *ldo6;\n\tstruct regulator_init_data *ldo7;\n\tstruct regulator_init_data *ldo8;\n\tstruct regulator_init_data *ldo9;\n\tstruct regulator_init_data *ldo10;\n\tstruct regulator_init_data *ldo12;\n\tstruct regulator_init_data *ldo_vibrator;\n\tstruct regulator_init_data *ldo14;\n\tstruct charger_desc *chg_desc;\n\tint companion_addr;\n\tint i2c_port;\n\tint irq_mode;\n\tint irq_base;\n\tint num_leds;\n\tint num_backlights;\n};\n\nstruct pm860x_power_pdata {\n\tint max_capacity;\n\tint resistor;\n};\n\nstruct pm860x_rtc_pdata {\n\tint (*sync)(unsigned int);\n\tint vrtc;\n};\n\nstruct pm860x_touch_pdata {\n\tint gpadc_prebias;\n\tint slot_cycle;\n\tint off_scale;\n\tint sw_cal;\n\tint tsi_prebias;\n\tint pen_prebias;\n\tint pen_prechg;\n\tint res_x;\n\tlong unsigned int flags;\n};\n\nstruct pm_clk_notifier_block {\n\tstruct notifier_block nb;\n\tstruct dev_pm_domain *pm_domain;\n\tchar *con_ids[0];\n};\n\nstruct pm_clock_entry {\n\tstruct list_head node;\n\tchar *con_id;\n\tstruct clk *clk;\n\tenum pce_status status;\n\tbool enabled_when_prepared;\n};\n\nstruct pm_nl_pernet {\n\tspinlock_t lock;\n\tstruct list_head local_addr_list;\n\tunsigned int addrs;\n\tunsigned int stale_loss_cnt;\n\tunsigned int add_addr_signal_max;\n\tunsigned int add_addr_accept_max;\n\tunsigned int local_addr_max;\n\tunsigned int subflows_max;\n\tunsigned int next_id;\n\tlong unsigned int id_bitmap[4];\n};\n\nstruct pm_qos_request {\n\tstruct plist_node node;\n\tstruct pm_qos_constraints *qos;\n};\n\nstruct pm_subsys_data {\n\tspinlock_t lock;\n\tunsigned int refcount;\n\tunsigned int clock_op_might_sleep;\n\tstruct mutex clock_mutex;\n\tstruct list_head clock_list;\n\tstruct pm_domain_data *domain_data;\n};\n\nstruct pm_vt_switch {\n\tstruct list_head head;\n\tstruct device *dev;\n\tbool required;\n};\n\nstruct pmc_bit_map {\n\tconst char *name;\n\tu32 bit_mask;\n};\n\nstruct pmc_clk {\n\tconst char *name;\n\tlong unsigned int freq;\n\tconst char *parent_name;\n};\n\nstruct pmc_clk_data {\n\tvoid *base;\n\tconst struct pmc_clk *clks;\n\tbool critical;\n};\n\nstruct pmc_reg_map;\n\nstruct pmc_data {\n\tconst struct pmc_reg_map *map;\n\tconst struct pmc_clk *clks;\n};\n\nstruct pmc_dev {\n\tu32 base_addr;\n\tvoid *regmap;\n\tconst struct pmc_reg_map *map;\n\tstruct dentry *dbgfs_dir;\n\tbool init;\n};\n\nstruct pmc_reg_map {\n\tconst struct pmc_bit_map *d3_sts_0;\n\tconst struct pmc_bit_map *d3_sts_1;\n\tconst struct pmc_bit_map *func_dis;\n\tconst struct pmc_bit_map *func_dis_2;\n\tconst struct pmc_bit_map *pss;\n};\n\nstruct pmic_table {\n\tint address;\n\tint reg;\n\tint bit;\n};\n\nstruct pmu_event_list {\n\traw_spinlock_t lock;\n\tstruct list_head list;\n};\n\nstruct pmu_mode {\n\tconst char *name;\n\tuint32_t mode;\n};\n\nstruct pneigh_entry {\n\tstruct pneigh_entry *next;\n\tpossible_net_t net;\n\tstruct net_device *dev;\n\tnetdevice_tracker dev_tracker;\n\tu32 flags;\n\tu8 protocol;\n\tu32 key[0];\n};\n\nstruct pnfs_commit_ops;\n\nstruct pnfs_ds_commit_info {\n\tstruct list_head commits;\n\tunsigned int nwritten;\n\tunsigned int ncommitting;\n\tconst struct pnfs_commit_ops *ops;\n};\n\nstruct pnp_protocol;\n\nstruct pnp_id;\n\nstruct pnp_card {\n\tstruct device dev;\n\tunsigned char number;\n\tstruct list_head global_list;\n\tstruct list_head protocol_list;\n\tstruct list_head devices;\n\tstruct pnp_protocol *protocol;\n\tstruct pnp_id *id;\n\tchar name[50];\n\tunsigned char pnpver;\n\tunsigned char productver;\n\tunsigned int serial;\n\tunsigned char checksum;\n\tstruct proc_dir_entry *procdir;\n};\n\nstruct pnp_card_device_id {\n\t__u8 id[8];\n\tkernel_ulong_t driver_data;\n\tstruct {\n\t\t__u8 id[8];\n\t} devs[8];\n};\n\nstruct pnp_device_id;\n\nstruct pnp_driver {\n\tconst char *name;\n\tconst struct pnp_device_id *id_table;\n\tunsigned int flags;\n\tint (*probe)(struct pnp_dev *, const struct pnp_device_id *);\n\tvoid (*remove)(struct pnp_dev *);\n\tvoid (*shutdown)(struct pnp_dev *);\n\tint (*suspend)(struct pnp_dev *, pm_message_t);\n\tint (*resume)(struct pnp_dev *);\n\tstruct device_driver driver;\n};\n\nstruct pnp_card_link;\n\nstruct pnp_card_driver {\n\tstruct list_head global_list;\n\tchar *name;\n\tconst struct pnp_card_device_id *id_table;\n\tunsigned int flags;\n\tint (*probe)(struct pnp_card_link *, const struct pnp_card_device_id *);\n\tvoid (*remove)(struct pnp_card_link *);\n\tint (*suspend)(struct pnp_card_link *, pm_message_t);\n\tint (*resume)(struct pnp_card_link *);\n\tstruct pnp_driver link;\n};\n\nstruct pnp_card_link {\n\tstruct pnp_card *card;\n\tstruct pnp_card_driver *driver;\n\tvoid *driver_data;\n\tpm_message_t pm_state;\n};\n\nstruct pnp_dev {\n\tstruct device dev;\n\tu64 dma_mask;\n\tunsigned int number;\n\tint status;\n\tstruct list_head global_list;\n\tstruct list_head protocol_list;\n\tstruct list_head card_list;\n\tstruct list_head rdev_list;\n\tstruct pnp_protocol *protocol;\n\tstruct pnp_card *card;\n\tstruct pnp_driver *driver;\n\tstruct pnp_card_link *card_link;\n\tstruct pnp_id *id;\n\tint active;\n\tint capabilities;\n\tunsigned int num_dependent_sets;\n\tstruct list_head resources;\n\tstruct list_head options;\n\tchar name[50];\n\tint flags;\n\tstruct proc_dir_entry *procent;\n\tvoid *data;\n};\n\nstruct pnp_device_id {\n\t__u8 id[8];\n\tkernel_ulong_t driver_data;\n};\n\nstruct pnp_dma {\n\tunsigned char map;\n\tunsigned char flags;\n};\n\nstruct pnp_fixup {\n\tchar id[7];\n\tvoid (*quirk_function)(struct pnp_dev *);\n};\n\nstruct pnp_id {\n\tchar id[8];\n\tstruct pnp_id *next;\n};\n\nstruct pnp_info_buffer {\n\tchar *buffer;\n\tchar *curr;\n\tlong unsigned int size;\n\tlong unsigned int len;\n\tint stop;\n\tint error;\n};\n\ntypedef struct pnp_info_buffer pnp_info_buffer_t;\n\nstruct pnp_irq {\n\tpnp_irq_mask_t map;\n\tunsigned char flags;\n};\n\nstruct pnp_mem {\n\tresource_size_t min;\n\tresource_size_t max;\n\tresource_size_t align;\n\tresource_size_t size;\n\tunsigned char flags;\n};\n\nstruct pnp_port {\n\tresource_size_t min;\n\tresource_size_t max;\n\tresource_size_t align;\n\tresource_size_t size;\n\tunsigned char flags;\n};\n\nstruct pnp_option {\n\tstruct list_head list;\n\tunsigned int flags;\n\tlong unsigned int type;\n\tunion {\n\t\tstruct pnp_port port;\n\t\tstruct pnp_irq irq;\n\t\tstruct pnp_dma dma;\n\t\tstruct pnp_mem mem;\n\t} u;\n};\n\nstruct pnp_protocol {\n\tstruct list_head protocol_list;\n\tchar *name;\n\tint (*get)(struct pnp_dev *);\n\tint (*set)(struct pnp_dev *);\n\tint (*disable)(struct pnp_dev *);\n\tbool (*can_wakeup)(struct pnp_dev *);\n\tint (*suspend)(struct pnp_dev *, pm_message_t);\n\tint (*resume)(struct pnp_dev *);\n\tunsigned char number;\n\tstruct device dev;\n\tstruct list_head cards;\n\tstruct list_head devices;\n};\n\nstruct pnp_resource {\n\tstruct list_head list;\n\tstruct resource res;\n};\n\nstruct policy_data {\n\tstruct policydb *p;\n\tvoid *fp;\n};\n\nstruct policy_file {\n\tchar *data;\n\tsize_t len;\n};\n\nstruct policy_load_memory {\n\tsize_t len;\n\tvoid *data;\n};\n\nstruct role_datum;\n\nstruct user_datum;\n\nstruct type_datum;\n\nstruct role_allow;\n\nstruct policydb {\n\tint mls_enabled;\n\tstruct symtab symtab[8];\n\tchar **sym_val_to_name[8];\n\tstruct class_datum **class_val_to_struct;\n\tstruct role_datum **role_val_to_struct;\n\tstruct user_datum **user_val_to_struct;\n\tstruct type_datum **type_val_to_struct;\n\tstruct avtab te_avtab;\n\tstruct hashtab role_tr;\n\tstruct ebitmap filename_trans_ttypes;\n\tstruct hashtab filename_trans;\n\tu32 compat_filename_trans_count;\n\tstruct cond_bool_datum **bool_val_to_struct;\n\tstruct avtab te_cond_avtab;\n\tstruct cond_node *cond_list;\n\tu32 cond_list_len;\n\tstruct role_allow *role_allow;\n\tstruct ocontext *ocontexts[9];\n\tstruct genfs *genfs;\n\tstruct hashtab range_tr;\n\tstruct ebitmap *type_attr_map_array;\n\tstruct ebitmap policycaps;\n\tstruct ebitmap permissive_map;\n\tsize_t len;\n\tunsigned int policyvers;\n\tunsigned int reject_unknown: 1;\n\tunsigned int allow_unknown: 1;\n\tu16 process_class;\n\tu32 process_trans_perms;\n};\n\nstruct policydb_compat_info {\n\tunsigned int version;\n\tunsigned int sym_num;\n\tunsigned int ocon_num;\n};\n\nstruct pollfd {\n\tint fd;\n\tshort int events;\n\tshort int revents;\n};\n\nstruct poll_list {\n\tstruct poll_list *next;\n\tunsigned int len;\n\tstruct pollfd entries[0];\n};\n\nstruct poll_table_entry {\n\tstruct file *filp;\n\t__poll_t key;\n\twait_queue_entry_t wait;\n\twait_queue_head_t *wait_address;\n};\n\nstruct poll_table_page {\n\tstruct poll_table_page *next;\n\tstruct poll_table_entry *entry;\n\tstruct poll_table_entry entries[0];\n};\n\nstruct poll_wqueues {\n\tpoll_table pt;\n\tstruct poll_table_page *table;\n\tstruct task_struct *polling_task;\n\tint triggered;\n\tint error;\n\tint inline_index;\n\tstruct poll_table_entry inline_entries[9];\n};\n\nstruct worker_pool;\n\nstruct pool_workqueue {\n\tstruct worker_pool *pool;\n\tstruct workqueue_struct *wq;\n\tint work_color;\n\tint flush_color;\n\tint refcnt;\n\tint nr_in_flight[16];\n\tbool plugged;\n\tint nr_active;\n\tstruct list_head inactive_works;\n\tstruct list_head pending_node;\n\tstruct list_head pwqs_node;\n\tstruct list_head mayday_node;\n\tu64 stats[8];\n\tstruct kthread_work release_work;\n\tstruct callback_head rcu;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct port_stats {\n\tlong unsigned int bytes_sent;\n\tlong unsigned int bytes_received;\n\tlong unsigned int bytes_discarded;\n};\n\nstruct ports_device;\n\nstruct port_buffer;\n\nstruct virtqueue;\n\nstruct port {\n\tstruct list_head list;\n\tstruct ports_device *portdev;\n\tstruct port_buffer *inbuf;\n\tspinlock_t inbuf_lock;\n\tspinlock_t outvq_lock;\n\tstruct virtqueue *in_vq;\n\tstruct virtqueue *out_vq;\n\tstruct dentry *debugfs_file;\n\tstruct port_stats stats;\n\tstruct console___2 cons;\n\tstruct cdev *cdev;\n\tstruct device *dev;\n\tstruct kref kref;\n\twait_queue_head_t waitqueue;\n\tchar *name;\n\tstruct fasync_struct *async_queue;\n\tu32 id;\n\tbool outvq_full;\n\tbool host_connected;\n\tbool guest_connected;\n};\n\nstruct port_buffer {\n\tchar *buf;\n\tsize_t size;\n\tsize_t len;\n\tsize_t offset;\n\tdma_addr_t dma;\n\tstruct device *dev;\n\tstruct list_head list;\n\tunsigned int sgpages;\n\tstruct scatterlist sg[0];\n};\n\nstruct port_identity {\n\tstruct clock_identity clock_identity;\n\t__be16 port_number;\n};\n\nstruct portdrv_service_data {\n\tstruct pcie_port_service_driver *drv;\n\tstruct device *dev;\n\tu32 service;\n};\n\nstruct virtio_console_control {\n\t__virtio32 id;\n\t__virtio16 event;\n\t__virtio16 value;\n};\n\nstruct virtio_device;\n\nstruct ports_device {\n\tstruct list_head list;\n\tstruct work_struct control_work;\n\tstruct work_struct config_work;\n\tstruct list_head ports;\n\tspinlock_t ports_lock;\n\tspinlock_t c_ivq_lock;\n\tspinlock_t c_ovq_lock;\n\tu32 max_nr_ports;\n\tstruct virtio_device *vdev;\n\tstruct virtqueue *c_ivq;\n\tstruct virtqueue *c_ovq;\n\tstruct virtio_console_control cpkt;\n\tstruct virtqueue **in_vqs;\n\tstruct virtqueue **out_vqs;\n\tint chr_major;\n};\n\nstruct ports_driver_data {\n\tstruct dentry *debugfs_dir;\n\tstruct list_head portdevs;\n\tstruct list_head consoles;\n};\n\nstruct posix_acl_entry {\n\tshort int e_tag;\n\tshort unsigned int e_perm;\n\tunion {\n\t\tkuid_t e_uid;\n\t\tkgid_t e_gid;\n\t};\n};\n\nstruct posix_acl {\n\trefcount_t a_refcount;\n\tstruct callback_head a_rcu;\n\tunsigned int a_count;\n\tstruct posix_acl_entry a_entries[0];\n};\n\nstruct posix_acl_xattr_entry {\n\t__le16 e_tag;\n\t__le16 e_perm;\n\t__le32 e_id;\n};\n\nstruct posix_acl_xattr_header {\n\t__le32 a_version;\n};\n\nstruct posix_clock;\n\nstruct posix_clock_context;\n\nstruct posix_clock_operations {\n\tstruct module *owner;\n\tint (*clock_adjtime)(struct posix_clock *, struct __kernel_timex *);\n\tint (*clock_gettime)(struct posix_clock *, struct timespec64 *);\n\tint (*clock_getres)(struct posix_clock *, struct timespec64 *);\n\tint (*clock_settime)(struct posix_clock *, const struct timespec64 *);\n\tlong int (*ioctl)(struct posix_clock_context *, unsigned int, long unsigned int);\n\tint (*open)(struct posix_clock_context *, fmode_t);\n\t__poll_t (*poll)(struct posix_clock_context *, struct file *, poll_table *);\n\tint (*release)(struct posix_clock_context *);\n\tssize_t (*read)(struct posix_clock_context *, uint, char *, size_t);\n};\n\nstruct posix_clock {\n\tstruct posix_clock_operations ops;\n\tstruct cdev cdev;\n\tstruct device *dev;\n\tstruct rw_semaphore rwsem;\n\tbool zombie;\n};\n\nstruct posix_clock_context {\n\tstruct posix_clock *clk;\n\tvoid *private_clkdata;\n};\n\nstruct posix_clock_desc {\n\tstruct file *fp;\n\tstruct posix_clock *clk;\n};\n\nstruct posix_cputimer_base {\n\tu64 nextevt;\n\tstruct timerqueue_head tqhead;\n};\n\nstruct posix_cputimers {\n\tstruct posix_cputimer_base bases[3];\n\tunsigned int timers_active;\n\tunsigned int expiry_active;\n};\n\nstruct posix_cputimers_work {\n\tstruct callback_head work;\n\tstruct mutex mutex;\n\tunsigned int scheduled;\n};\n\nstruct posix_msg_tree_node {\n\tstruct rb_node rb_node;\n\tstruct list_head msg_list;\n\tint priority;\n};\n\nstruct postprocess_bh_ctx {\n\tstruct work_struct work;\n\tstruct buffer_head *bh;\n};\n\nstruct power_actor {\n\tu32 req_power;\n\tu32 max_power;\n\tu32 granted_power;\n\tu32 extra_actor_power;\n\tu32 weighted_req_power;\n};\n\nstruct thermal_trip;\n\nstruct power_allocator_params {\n\tbool allocated_tzp;\n\tbool update_cdevs;\n\ts64 err_integral;\n\ts32 prev_err;\n\tu32 sustainable_power;\n\tconst struct thermal_trip *trip_switch_on;\n\tconst struct thermal_trip *trip_max;\n\tint total_weight;\n\tunsigned int num_actors;\n\tunsigned int buffer_size;\n\tstruct power_actor *power;\n};\n\nstruct power_supply_battery_info;\n\nstruct power_supply {\n\tconst struct power_supply_desc *desc;\n\tchar **supplied_to;\n\tsize_t num_supplicants;\n\tchar **supplied_from;\n\tsize_t num_supplies;\n\tstruct device_node *of_node;\n\tvoid *drv_data;\n\tstruct device dev;\n\tstruct work_struct changed_work;\n\tstruct delayed_work deferred_register_work;\n\tspinlock_t changed_lock;\n\tbool changed;\n\tbool initialized;\n\tbool removing;\n\tatomic_t use_cnt;\n\tstruct power_supply_battery_info *battery_info;\n\tstruct thermal_zone_device *tzd;\n\tstruct thermal_cooling_device *tcd;\n\tstruct led_trigger *trig;\n\tstruct led_trigger *charging_trig;\n\tstruct led_trigger *full_trig;\n\tstruct led_trigger *charging_blink_full_solid_trig;\n\tstruct led_trigger *charging_orange_full_green_trig;\n};\n\nstruct power_supply_attr {\n\tconst char *prop_name;\n\tchar attr_name[31];\n\tstruct device_attribute dev_attr;\n\tconst char * const *text_values;\n\tint text_values_len;\n};\n\nstruct power_supply_maintenance_charge_table;\n\nstruct power_supply_battery_ocv_table;\n\nstruct power_supply_resistance_temp_table;\n\nstruct power_supply_vbat_ri_table;\n\nstruct power_supply_battery_info {\n\tunsigned int technology;\n\tint energy_full_design_uwh;\n\tint charge_full_design_uah;\n\tint voltage_min_design_uv;\n\tint voltage_max_design_uv;\n\tint tricklecharge_current_ua;\n\tint precharge_current_ua;\n\tint precharge_voltage_max_uv;\n\tint charge_term_current_ua;\n\tint charge_restart_voltage_uv;\n\tint overvoltage_limit_uv;\n\tint constant_charge_current_max_ua;\n\tint constant_charge_voltage_max_uv;\n\tconst struct power_supply_maintenance_charge_table *maintenance_charge;\n\tint maintenance_charge_size;\n\tint alert_low_temp_charge_current_ua;\n\tint alert_low_temp_charge_voltage_uv;\n\tint alert_high_temp_charge_current_ua;\n\tint alert_high_temp_charge_voltage_uv;\n\tint factory_internal_resistance_uohm;\n\tint factory_internal_resistance_charging_uohm;\n\tint ocv_temp[20];\n\tint temp_ambient_alert_min;\n\tint temp_ambient_alert_max;\n\tint temp_alert_min;\n\tint temp_alert_max;\n\tint temp_min;\n\tint temp_max;\n\tstruct power_supply_battery_ocv_table *ocv_table[20];\n\tint ocv_table_size[20];\n\tstruct power_supply_resistance_temp_table *resist_table;\n\tint resist_table_size;\n\tconst struct power_supply_vbat_ri_table *vbat2ri_discharging;\n\tint vbat2ri_discharging_size;\n\tconst struct power_supply_vbat_ri_table *vbat2ri_charging;\n\tint vbat2ri_charging_size;\n\tint bti_resistance_ohm;\n\tint bti_resistance_tolerance;\n};\n\nstruct power_supply_battery_ocv_table {\n\tint ocv;\n\tint capacity;\n};\n\nstruct power_supply_config {\n\tstruct device_node *of_node;\n\tstruct fwnode_handle *fwnode;\n\tvoid *drv_data;\n\tconst struct attribute_group **attr_grp;\n\tchar **supplied_to;\n\tsize_t num_supplicants;\n};\n\nstruct power_supply_hwmon {\n\tstruct power_supply *psy;\n\tlong unsigned int *props;\n};\n\nstruct power_supply_led_trigger {\n\tstruct led_trigger trig;\n\tstruct power_supply *psy;\n};\n\nstruct power_supply_maintenance_charge_table {\n\tint charge_current_max_ua;\n\tint charge_voltage_max_uv;\n\tint charge_safety_timer_minutes;\n};\n\nunion power_supply_propval {\n\tint intval;\n\tconst char *strval;\n};\n\nstruct power_supply_resistance_temp_table {\n\tint temp;\n\tint resistance;\n};\n\nstruct power_supply_vbat_ri_table {\n\tint vbat_uv;\n\tint ri_uohm;\n};\n\nstruct powercap_constraint_attr {\n\tstruct device_attribute power_limit_attr;\n\tstruct device_attribute time_window_attr;\n\tstruct device_attribute max_power_attr;\n\tstruct device_attribute min_power_attr;\n\tstruct device_attribute max_time_window_attr;\n\tstruct device_attribute min_time_window_attr;\n\tstruct device_attribute name_attr;\n};\n\nstruct powercap_control_type_ops;\n\nstruct powercap_control_type {\n\tstruct device dev;\n\tstruct idr idr;\n\tint nr_zones;\n\tconst struct powercap_control_type_ops *ops;\n\tstruct mutex lock;\n\tbool allocated;\n\tstruct list_head node;\n};\n\nstruct powercap_control_type_ops {\n\tint (*set_enable)(struct powercap_control_type *, bool);\n\tint (*get_enable)(struct powercap_control_type *, bool *);\n\tint (*release)(struct powercap_control_type *);\n};\n\nstruct powercap_zone_ops;\n\nstruct powercap_zone_constraint;\n\nstruct powercap_zone {\n\tint id;\n\tchar *name;\n\tvoid *control_type_inst;\n\tconst struct powercap_zone_ops *ops;\n\tstruct device dev;\n\tint const_id_cnt;\n\tstruct idr idr;\n\tstruct idr *parent_idr;\n\tvoid *private_data;\n\tstruct attribute **zone_dev_attrs;\n\tint zone_attr_count;\n\tstruct attribute_group dev_zone_attr_group;\n\tconst struct attribute_group *dev_attr_groups[2];\n\tbool allocated;\n\tstruct powercap_zone_constraint *constraints;\n};\n\nstruct powercap_zone_constraint_ops;\n\nstruct powercap_zone_constraint {\n\tint id;\n\tstruct powercap_zone *power_zone;\n\tconst struct powercap_zone_constraint_ops *ops;\n};\n\nstruct powercap_zone_constraint_ops {\n\tint (*set_power_limit_uw)(struct powercap_zone *, int, u64);\n\tint (*get_power_limit_uw)(struct powercap_zone *, int, u64 *);\n\tint (*set_time_window_us)(struct powercap_zone *, int, u64);\n\tint (*get_time_window_us)(struct powercap_zone *, int, u64 *);\n\tint (*get_max_power_uw)(struct powercap_zone *, int, u64 *);\n\tint (*get_min_power_uw)(struct powercap_zone *, int, u64 *);\n\tint (*get_max_time_window_us)(struct powercap_zone *, int, u64 *);\n\tint (*get_min_time_window_us)(struct powercap_zone *, int, u64 *);\n\tconst char * (*get_name)(struct powercap_zone *, int);\n};\n\nstruct powercap_zone_ops {\n\tint (*get_max_energy_range_uj)(struct powercap_zone *, u64 *);\n\tint (*get_energy_uj)(struct powercap_zone *, u64 *);\n\tint (*reset_energy_uj)(struct powercap_zone *);\n\tint (*get_max_power_range_uw)(struct powercap_zone *, u64 *);\n\tint (*get_power_uw)(struct powercap_zone *, u64 *);\n\tint (*set_enable)(struct powercap_zone *, bool);\n\tint (*get_enable)(struct powercap_zone *, bool *);\n\tint (*release)(struct powercap_zone *);\n};\n\nstruct powernow_k8_data {\n\tunsigned int cpu;\n\tu32 numps;\n\tu32 batps;\n\tu32 rvo;\n\tu32 irt;\n\tu32 vidmvs;\n\tu32 vstable;\n\tu32 plllock;\n\tu32 exttype;\n\tu32 currvid;\n\tu32 currfid;\n\tstruct cpufreq_frequency_table *powernow_table;\n\tstruct acpi_processor_performance acpi_data;\n\tstruct cpumask *available_cores;\n};\n\nstruct powernowk8_target_arg {\n\tstruct cpufreq_policy *pol;\n\tunsigned int newstate;\n};\n\nstruct ppe {\n\t__be16 lv_ix;\n\tshort unsigned int res2;\n\tshort unsigned int res4;\n\t__be16 lp_ix;\n\tshort unsigned int res8[12];\n};\n\nstruct ppin_info {\n\tint feature;\n\tint msr_ppin_ctl;\n\tint msr_ppin;\n};\n\nstruct ppp_link_stats {\n\tu64 rx_packets;\n\tu64 tx_packets;\n\tu64 rx_bytes;\n\tu64 tx_bytes;\n};\n\nstruct slcompress;\n\nstruct ppp {\n\tstruct ppp_file file;\n\tstruct file *owner;\n\tstruct list_head channels;\n\tint n_channels;\n\tspinlock_t rlock;\n\tspinlock_t wlock;\n\tint *xmit_recursion;\n\tint mru;\n\tunsigned int flags;\n\tunsigned int xstate;\n\tunsigned int rstate;\n\tint debug;\n\tstruct slcompress *vj;\n\tenum NPmode npmode[6];\n\tstruct sk_buff *xmit_pending;\n\tstruct compressor *xcomp;\n\tvoid *xc_state;\n\tstruct compressor *rcomp;\n\tvoid *rc_state;\n\tlong unsigned int last_xmit;\n\tlong unsigned int last_recv;\n\tstruct net_device *dev;\n\tint closing;\n\tint nxchan;\n\tu32 nxseq;\n\tint mrru;\n\tu32 nextseq;\n\tu32 minseq;\n\tstruct sk_buff_head mrq;\n\tstruct bpf_prog *pass_filter;\n\tstruct bpf_prog *active_filter;\n\tstruct net *ppp_net;\n\tstruct ppp_link_stats stats64;\n};\n\nstruct ppp_channel_ops;\n\nstruct ppp_channel {\n\tvoid *private;\n\tconst struct ppp_channel_ops *ops;\n\tint mtu;\n\tint hdrlen;\n\tvoid *ppp;\n\tint speed;\n\tint latency;\n};\n\nstruct ppp_channel_ops {\n\tint (*start_xmit)(struct ppp_channel *, struct sk_buff *);\n\tint (*ioctl)(struct ppp_channel *, unsigned int, long unsigned int);\n\tint (*fill_forward_path)(struct net_device_path_ctx *, struct net_device_path *, const struct ppp_channel *);\n};\n\nstruct ppp_comp_stats {\n\tstruct compstat c;\n\tstruct compstat d;\n};\n\nstruct ppp_config {\n\tstruct file *file;\n\ts32 unit;\n\tbool ifname_is_set;\n};\n\nstruct ppp_idle32 {\n\t__s32 xmit_idle;\n\t__s32 recv_idle;\n};\n\nstruct ppp_idle64 {\n\t__s64 xmit_idle;\n\t__s64 recv_idle;\n};\n\nstruct ppp_mp_skb_parm {\n\tu32 sequence;\n\tu8 BEbits;\n};\n\nstruct ppp_net {\n\tstruct idr units_idr;\n\tstruct mutex all_ppp_mutex;\n\tstruct list_head all_channels;\n\tstruct list_head new_channels;\n\tint last_channel_index;\n\tspinlock_t all_channels_lock;\n};\n\nstruct ppp_option_data {\n\t__u8 *ptr;\n\t__u32 length;\n\tint transmit;\n};\n\nstruct ppp_option_data32 {\n\tcompat_uptr_t ptr;\n\tu32 length;\n\tcompat_int_t transmit;\n};\n\nstruct pppstat {\n\t__u32 ppp_discards;\n\t__u32 ppp_ibytes;\n\t__u32 ppp_ioctects;\n\t__u32 ppp_ipackets;\n\t__u32 ppp_ierrors;\n\t__u32 ppp_ilqrs;\n\t__u32 ppp_obytes;\n\t__u32 ppp_ooctects;\n\t__u32 ppp_opackets;\n\t__u32 ppp_oerrors;\n\t__u32 ppp_olqrs;\n};\n\nstruct vjstat {\n\t__u32 vjs_packets;\n\t__u32 vjs_compressed;\n\t__u32 vjs_searches;\n\t__u32 vjs_misses;\n\t__u32 vjs_uncompressedin;\n\t__u32 vjs_compressedin;\n\t__u32 vjs_errorin;\n\t__u32 vjs_tossed;\n};\n\nstruct ppp_stats {\n\tstruct pppstat p;\n\tstruct vjstat vj;\n};\n\nstruct pppoe_tag {\n\t__be16 tag_type;\n\t__be16 tag_len;\n\tchar tag_data[0];\n};\n\nstruct pppoe_hdr {\n\t__u8 type: 4;\n\t__u8 ver: 4;\n\t__u8 code;\n\t__be16 sid;\n\t__be16 length;\n\tstruct pppoe_tag tag[0];\n};\n\nstruct pps_bind_args {\n\tint tsformat;\n\tint edge;\n\tint consumer;\n};\n\nstruct pps_device;\n\nstruct pps_source_info {\n\tchar name[32];\n\tchar path[32];\n\tint mode;\n\tvoid (*echo)(struct pps_device *, int, void *);\n\tstruct module *owner;\n\tstruct device *dev;\n};\n\nstruct pps_ktime {\n\t__s64 sec;\n\t__s32 nsec;\n\t__u32 flags;\n};\n\nstruct pps_kparams {\n\tint api_version;\n\tint mode;\n\tstruct pps_ktime assert_off_tu;\n\tstruct pps_ktime clear_off_tu;\n};\n\nstruct pps_device {\n\tstruct pps_source_info info;\n\tstruct pps_kparams params;\n\t__u32 assert_sequence;\n\t__u32 clear_sequence;\n\tstruct pps_ktime assert_tu;\n\tstruct pps_ktime clear_tu;\n\tint current_mode;\n\tunsigned int last_ev;\n\twait_queue_head_t queue;\n\tunsigned int id;\n\tconst void *lookup_cookie;\n\tstruct cdev cdev;\n\tstruct device *dev;\n\tstruct fasync_struct *async_queue;\n\tspinlock_t lock;\n};\n\nstruct pps_event_time {\n\tstruct timespec64 ts_real;\n};\n\nstruct pps_kinfo {\n\t__u32 assert_sequence;\n\t__u32 clear_sequence;\n\tstruct pps_ktime assert_tu;\n\tstruct pps_ktime clear_tu;\n\tint current_mode;\n};\n\nstruct pps_fdata {\n\tstruct pps_kinfo info;\n\tstruct pps_ktime timeout;\n};\n\nstruct pps_ktime_compat {\n\t__s64 sec;\n\t__s32 nsec;\n\t__u32 flags;\n};\n\nstruct pps_kinfo_compat {\n\t__u32 assert_sequence;\n\t__u32 clear_sequence;\n\tstruct pps_ktime_compat assert_tu;\n\tstruct pps_ktime_compat clear_tu;\n\tint current_mode;\n} __attribute__((packed));\n\nstruct pps_fdata_compat {\n\tstruct pps_kinfo_compat info;\n\tstruct pps_ktime_compat timeout;\n} __attribute__((packed));\n\nstruct pptp_gre_header {\n\tstruct gre_base_hdr gre_hd;\n\t__be16 payload_len;\n\t__be16 call_id;\n\t__be32 seq;\n\t__be32 ack;\n};\n\nstruct pr_clear {\n\t__u64 key;\n\t__u32 flags;\n\t__u32 __pad;\n};\n\nstruct pr_cont_work_struct {\n\tbool comma;\n\twork_func_t func;\n\tlong int ctr;\n};\n\nstruct pr_held_reservation {\n\tu64 key;\n\tu32 generation;\n\tenum pr_type type;\n};\n\nstruct pr_keys {\n\tu32 generation;\n\tu32 num_keys;\n\tu64 keys[0];\n};\n\nstruct pr_ops {\n\tint (*pr_register)(struct block_device *, u64, u64, u32);\n\tint (*pr_reserve)(struct block_device *, u64, enum pr_type, u32);\n\tint (*pr_release)(struct block_device *, u64, enum pr_type);\n\tint (*pr_preempt)(struct block_device *, u64, u64, enum pr_type, bool);\n\tint (*pr_clear)(struct block_device *, u64);\n\tint (*pr_read_keys)(struct block_device *, struct pr_keys *);\n\tint (*pr_read_reservation)(struct block_device *, struct pr_held_reservation *);\n};\n\nstruct pr_preempt {\n\t__u64 old_key;\n\t__u64 new_key;\n\t__u32 type;\n\t__u32 flags;\n};\n\nstruct pr_registration {\n\t__u64 old_key;\n\t__u64 new_key;\n\t__u32 flags;\n\t__u32 __pad;\n};\n\nstruct pr_reservation {\n\t__u64 key;\n\t__u32 type;\n\t__u32 flags;\n};\n\nstruct prb_data_blk_lpos {\n\tlong unsigned int begin;\n\tlong unsigned int next;\n};\n\nstruct prb_data_block {\n\tlong unsigned int id;\n\tchar data[0];\n};\n\nstruct prb_data_ring {\n\tunsigned int size_bits;\n\tchar *data;\n\tatomic_long_t head_lpos;\n\tatomic_long_t tail_lpos;\n};\n\nstruct prb_desc {\n\tatomic_long_t state_var;\n\tstruct prb_data_blk_lpos text_blk_lpos;\n};\n\nstruct printk_info;\n\nstruct prb_desc_ring {\n\tunsigned int count_bits;\n\tstruct prb_desc *descs;\n\tstruct printk_info *infos;\n\tatomic_long_t head_id;\n\tatomic_long_t tail_id;\n\tatomic_long_t last_finalized_seq;\n};\n\nstruct printk_ringbuffer;\n\nstruct prb_reserved_entry {\n\tstruct printk_ringbuffer *rb;\n\tlong unsigned int irqflags;\n\tlong unsigned int id;\n\tunsigned int text_space;\n};\n\nstruct prctl_mm_map {\n\t__u64 start_code;\n\t__u64 end_code;\n\t__u64 start_data;\n\t__u64 end_data;\n\t__u64 start_brk;\n\t__u64 brk;\n\t__u64 start_stack;\n\t__u64 arg_start;\n\t__u64 arg_end;\n\t__u64 env_start;\n\t__u64 env_end;\n\t__u64 *auxv;\n\t__u32 auxv_size;\n\t__u32 exe_fd;\n};\n\nstruct pre_voltage_change_data {\n\tlong unsigned int old_uV;\n\tlong unsigned int min_uV;\n\tlong unsigned int max_uV;\n};\n\nstruct preempt_ops {\n\tvoid (*sched_in)(struct preempt_notifier *, int);\n\tvoid (*sched_out)(struct preempt_notifier *, struct task_struct *);\n};\n\nstruct prefix_bits {\n\tunsigned int shorted: 1;\n\tunsigned int enlarged: 1;\n\tunsigned int rexr: 1;\n\tunsigned int rex: 1;\n};\n\nstruct prefix_cacheinfo {\n\t__u32 preferred_time;\n\t__u32 valid_time;\n};\n\nstruct prefix_info {\n\t__u8 type;\n\t__u8 length;\n\t__u8 prefix_len;\n\tunion {\n\t\t__u8 flags;\n\t\tstruct {\n\t\t\t__u8 reserved: 6;\n\t\t\t__u8 autoconf: 1;\n\t\t\t__u8 onlink: 1;\n\t\t};\n\t};\n\t__be32 valid;\n\t__be32 prefered;\n\t__be32 reserved2;\n\tstruct in6_addr prefix;\n};\n\nstruct prefixmsg {\n\tunsigned char prefix_family;\n\tunsigned char prefix_pad1;\n\tshort unsigned int prefix_pad2;\n\tint prefix_ifindex;\n\tunsigned char prefix_type;\n\tunsigned char prefix_len;\n\tunsigned char prefix_flags;\n\tunsigned char prefix_pad3;\n};\n\nstruct prepend_buffer {\n\tchar *buf;\n\tint len;\n};\n\nstruct print_entry {\n\tstruct trace_entry ent;\n\tlong unsigned int ip;\n\tchar buf[0];\n};\n\nstruct printf_spec {\n\tunsigned int type: 8;\n\tint field_width: 24;\n\tunsigned int flags: 8;\n\tunsigned int base: 8;\n\tint precision: 16;\n};\n\nstruct printk_info {\n\tu64 seq;\n\tu64 ts_nsec;\n\tu16 text_len;\n\tu8 facility;\n\tu8 flags: 5;\n\tu8 level: 3;\n\tu32 caller_id;\n\tstruct dev_printk_info dev_info;\n};\n\nstruct printk_message {\n\tstruct printk_buffers *pbufs;\n\tunsigned int outbuf_len;\n\tu64 seq;\n\tlong unsigned int dropped;\n};\n\nstruct printk_record {\n\tstruct printk_info *info;\n\tchar *text_buf;\n\tunsigned int text_buf_size;\n};\n\nstruct printk_ringbuffer {\n\tstruct prb_desc_ring desc_ring;\n\tstruct prb_data_ring text_data_ring;\n\tatomic_long_t fail;\n};\n\nstruct privflags_reply_data {\n\tstruct ethnl_reply_data base;\n\tconst char (*priv_flag_names)[32];\n\tunsigned int n_priv_flags;\n\tu32 priv_flags;\n};\n\nstruct prm_buffer {\n\tu8 prm_status;\n\tu64 efi_status;\n\tu8 prm_cmd;\n\tguid_t handler_guid;\n} __attribute__((packed));\n\nstruct prm_mmio_info;\n\nstruct prm_context_buffer {\n\tchar signature[4];\n\tu16 revision;\n\tu16 reserved;\n\tguid_t identifier;\n\tu64 static_data_buffer;\n\tstruct prm_mmio_info *mmio_ranges;\n};\n\nstruct prm_handler_info {\n\tefi_guid_t guid;\n\tefi_status_t (*handler_addr)(u64, void *);\n\tu64 static_data_buffer_addr;\n\tu64 acpi_param_buffer_addr;\n\tstruct list_head handler_list;\n};\n\nstruct prm_mmio_addr_range {\n\tu64 phys_addr;\n\tu64 virt_addr;\n\tu32 length;\n} __attribute__((packed));\n\nstruct prm_mmio_info {\n\tu64 mmio_count;\n\tstruct prm_mmio_addr_range addr_ranges[0];\n};\n\nstruct prm_module_info {\n\tguid_t guid;\n\tu16 major_rev;\n\tu16 minor_rev;\n\tu16 handler_count;\n\tstruct prm_mmio_info *mmio_info;\n\tbool updatable;\n\tstruct list_head module_list;\n\tstruct prm_handler_info handlers[0];\n};\n\ntypedef struct kobject *kobj_probe_t(dev_t, int *, void *);\n\nstruct probe {\n\tstruct probe *next;\n\tdev_t dev;\n\tlong unsigned int range;\n\tstruct module *owner;\n\tkobj_probe_t *get;\n\tint (*lock)(dev_t, void *);\n\tvoid *data;\n};\n\nstruct probe_arg {\n\tstruct fetch_insn *code;\n\tbool dynamic;\n\tunsigned int offset;\n\tunsigned int count;\n\tconst char *name;\n\tconst char *comm;\n\tchar *fmt;\n\tconst struct fetch_type *type;\n};\n\nstruct probe_entry_arg {\n\tstruct fetch_insn *code;\n\tunsigned int size;\n};\n\ntypedef int (*proc_write_t)(struct file *, char *, size_t);\n\nstruct proc_ops;\n\nstruct proc_dir_entry {\n\tatomic_t in_use;\n\trefcount_t refcnt;\n\tstruct list_head pde_openers;\n\tspinlock_t pde_unload_lock;\n\tstruct completion *pde_unload_completion;\n\tconst struct inode_operations *proc_iops;\n\tunion {\n\t\tconst struct proc_ops *proc_ops;\n\t\tconst struct file_operations *proc_dir_ops;\n\t};\n\tconst struct dentry_operations *proc_dops;\n\tunion {\n\t\tconst struct seq_operations *seq_ops;\n\t\tint (*single_show)(struct seq_file *, void *);\n\t};\n\tproc_write_t write;\n\tvoid *data;\n\tunsigned int state_size;\n\tunsigned int low_ino;\n\tnlink_t nlink;\n\tkuid_t uid;\n\tkgid_t gid;\n\tloff_t size;\n\tstruct proc_dir_entry *parent;\n\tstruct rb_root subdir;\n\tstruct rb_node subdir_node;\n\tchar *name;\n\tumode_t mode;\n\tu8 flags;\n\tu8 namelen;\n\tchar inline_name[0];\n};\n\nstruct sid_proc_event {\n\t__kernel_pid_t process_pid;\n\t__kernel_pid_t process_tgid;\n};\n\nstruct ptrace_proc_event {\n\t__kernel_pid_t process_pid;\n\t__kernel_pid_t process_tgid;\n\t__kernel_pid_t tracer_pid;\n\t__kernel_pid_t tracer_tgid;\n};\n\nstruct proc_event {\n\tenum proc_cn_event what;\n\t__u32 cpu;\n\t__u64 timestamp_ns;\n\tunion {\n\t\tstruct {\n\t\t\t__u32 err;\n\t\t} ack;\n\t\tstruct fork_proc_event fork;\n\t\tstruct exec_proc_event exec;\n\t\tstruct id_proc_event id;\n\t\tstruct sid_proc_event sid;\n\t\tstruct ptrace_proc_event ptrace;\n\t\tstruct comm_proc_event comm;\n\t\tstruct coredump_proc_event coredump;\n\t\tstruct exit_proc_event exit;\n\t} event_data;\n};\n\nstruct proc_fs_context {\n\tstruct pid_namespace *pid_ns;\n\tunsigned int mask;\n\tenum proc_hidepid hidepid;\n\tint gid;\n\tenum proc_pidonly pidonly;\n};\n\nstruct proc_fs_info {\n\tstruct pid_namespace *pid_ns;\n\tstruct dentry *proc_self;\n\tstruct dentry *proc_thread_self;\n\tkgid_t pid_gid;\n\tenum proc_hidepid hide_pid;\n\tenum proc_pidonly pidonly;\n\tstruct callback_head rcu;\n};\n\nstruct proc_fs_opts {\n\tint flag;\n\tconst char *str;\n};\n\nstruct proc_inode {\n\tstruct pid *pid;\n\tunsigned int fd;\n\tunion proc_op op;\n\tstruct proc_dir_entry *pde;\n\tstruct ctl_table_header *sysctl;\n\tstruct ctl_table *sysctl_entry;\n\tstruct hlist_node sibling_inodes;\n\tconst struct proc_ns_operations *ns_ops;\n\tstruct inode vfs_inode;\n};\n\nstruct proc_input {\n\tenum proc_cn_mcast_op mcast_op;\n\tenum proc_cn_event event_type;\n};\n\nstruct proc_mounts {\n\tstruct mnt_namespace *ns;\n\tstruct path root;\n\tint (*show)(struct seq_file *, struct vfsmount *);\n};\n\nstruct proc_ns_operations {\n\tconst char *name;\n\tconst char *real_ns_name;\n\tint type;\n\tstruct ns_common * (*get)(struct task_struct *);\n\tvoid (*put)(struct ns_common *);\n\tint (*install)(struct nsset *, struct ns_common *);\n\tstruct user_namespace * (*owner)(struct ns_common *);\n\tstruct ns_common * (*get_parent)(struct ns_common *);\n};\n\nstruct proc_ops {\n\tunsigned int proc_flags;\n\tint (*proc_open)(struct inode *, struct file *);\n\tssize_t (*proc_read)(struct file *, char *, size_t, loff_t *);\n\tssize_t (*proc_read_iter)(struct kiocb *, struct iov_iter *);\n\tssize_t (*proc_write)(struct file *, const char *, size_t, loff_t *);\n\tloff_t (*proc_lseek)(struct file *, loff_t, int);\n\tint (*proc_release)(struct inode *, struct file *);\n\t__poll_t (*proc_poll)(struct file *, struct poll_table_struct *);\n\tlong int (*proc_ioctl)(struct file *, unsigned int, long unsigned int);\n\tlong int (*proc_compat_ioctl)(struct file *, unsigned int, long unsigned int);\n\tint (*proc_mmap)(struct file *, struct vm_area_struct *);\n\tlong unsigned int (*proc_get_unmapped_area)(struct file *, long unsigned int, long unsigned int, long unsigned int, long unsigned int);\n};\n\nstruct proc_timens_offset {\n\tint clockid;\n\tstruct timespec64 val;\n};\n\nstruct process_timer {\n\tstruct timer_list timer;\n\tstruct task_struct *task;\n};\n\nstruct procmap_query {\n\t__u64 size;\n\t__u64 query_flags;\n\t__u64 query_addr;\n\t__u64 vma_start;\n\t__u64 vma_end;\n\t__u64 vma_flags;\n\t__u64 vma_page_size;\n\t__u64 vma_offset;\n\t__u64 inode;\n\t__u32 dev_major;\n\t__u32 dev_minor;\n\t__u32 vma_name_size;\n\t__u32 build_id_size;\n\t__u64 vma_name_addr;\n\t__u64 build_id_addr;\n};\n\nstruct prog_entry {\n\tint target;\n\tint when_to_branch;\n\tstruct filter_pred *pred;\n};\n\nstruct prog_poke_elem {\n\tstruct list_head list;\n\tstruct bpf_prog_aux *aux;\n};\n\nstruct prog_test_member1 {\n\tint a;\n};\n\nstruct prog_test_member {\n\tstruct prog_test_member1 m;\n\tint c;\n};\n\nstruct prog_test_ref_kfunc {\n\tint a;\n\tint b;\n\tstruct prog_test_member memb;\n\tstruct prog_test_ref_kfunc *next;\n\trefcount_t cnt;\n};\n\nstruct properties_header {\n\tu32 len;\n\tu32 version;\n\tu32 dev_count;\n\tstruct dev_header dev_header[0];\n} __attribute__((packed));\n\nstruct property {\n\tchar *name;\n\tint length;\n\tvoid *value;\n\tstruct property *next;\n};\n\nstruct prot_inuse {\n\tint all;\n\tint val[64];\n};\n\nstruct protection_domain {\n\tstruct list_head dev_list;\n\tstruct iommu_domain domain;\n\tstruct amd_io_pgtable iop;\n\tspinlock_t lock;\n\tu16 id;\n\tenum protection_domain_mode pd_mode;\n\tbool dirty_tracking;\n\tunsigned int dev_cnt;\n\tunsigned int dev_iommu[32];\n\tstruct mmu_notifier mn;\n\tstruct list_head dev_data_list;\n};\n\nstruct smc_hashinfo;\n\nstruct proto_accept_arg;\n\nstruct sk_psock;\n\nstruct timewait_sock_ops;\n\nstruct raw_hashinfo;\n\nstruct proto {\n\tvoid (*close)(struct sock *, long int);\n\tint (*pre_connect)(struct sock *, struct sockaddr *, int);\n\tint (*connect)(struct sock *, struct sockaddr *, int);\n\tint (*disconnect)(struct sock *, int);\n\tstruct sock * (*accept)(struct sock *, struct proto_accept_arg *);\n\tint (*ioctl)(struct sock *, int, int *);\n\tint (*init)(struct sock *);\n\tvoid (*destroy)(struct sock *);\n\tvoid (*shutdown)(struct sock *, int);\n\tint (*setsockopt)(struct sock *, int, int, sockptr_t, unsigned int);\n\tint (*getsockopt)(struct sock *, int, int, char *, int *);\n\tvoid (*keepalive)(struct sock *, int);\n\tint (*compat_ioctl)(struct sock *, unsigned int, long unsigned int);\n\tint (*sendmsg)(struct sock *, struct msghdr *, size_t);\n\tint (*recvmsg)(struct sock *, struct msghdr *, size_t, int, int *);\n\tvoid (*splice_eof)(struct socket *);\n\tint (*bind)(struct sock *, struct sockaddr *, int);\n\tint (*bind_add)(struct sock *, struct sockaddr *, int);\n\tint (*backlog_rcv)(struct sock *, struct sk_buff *);\n\tbool (*bpf_bypass_getsockopt)(int, int);\n\tvoid (*release_cb)(struct sock *);\n\tint (*hash)(struct sock *);\n\tvoid (*unhash)(struct sock *);\n\tvoid (*rehash)(struct sock *);\n\tint (*get_port)(struct sock *, short unsigned int);\n\tvoid (*put_port)(struct sock *);\n\tint (*psock_update_sk_prot)(struct sock *, struct sk_psock *, bool);\n\tunsigned int inuse_idx;\n\tint (*forward_alloc_get)(const struct sock *);\n\tbool (*stream_memory_free)(const struct sock *, int);\n\tbool (*sock_is_readable)(struct sock *);\n\tvoid (*enter_memory_pressure)(struct sock *);\n\tvoid (*leave_memory_pressure)(struct sock *);\n\tatomic_long_t *memory_allocated;\n\tint *per_cpu_fw_alloc;\n\tstruct percpu_counter *sockets_allocated;\n\tlong unsigned int *memory_pressure;\n\tlong int *sysctl_mem;\n\tint *sysctl_wmem;\n\tint *sysctl_rmem;\n\tu32 sysctl_wmem_offset;\n\tu32 sysctl_rmem_offset;\n\tint max_header;\n\tbool no_autobind;\n\tstruct kmem_cache *slab;\n\tunsigned int obj_size;\n\tunsigned int ipv6_pinfo_offset;\n\tslab_flags_t slab_flags;\n\tunsigned int useroffset;\n\tunsigned int usersize;\n\tunsigned int *orphan_count;\n\tstruct request_sock_ops *rsk_prot;\n\tstruct timewait_sock_ops *twsk_prot;\n\tunion {\n\t\tstruct inet_hashinfo *hashinfo;\n\t\tstruct udp_table *udp_table;\n\t\tstruct raw_hashinfo *raw_hash;\n\t\tstruct smc_hashinfo *smc_hash;\n\t} h;\n\tstruct module *owner;\n\tchar name[32];\n\tstruct list_head node;\n\tint (*diag_destroy)(struct sock *, int);\n};\n\nstruct proto_accept_arg {\n\tint flags;\n\tint err;\n\tint is_empty;\n\tbool kern;\n};\n\ntypedef int (*sk_read_actor_t)(read_descriptor_t *, struct sk_buff *, unsigned int, size_t);\n\ntypedef int (*skb_read_actor_t)(struct sock *, struct sk_buff *);\n\nstruct proto_ops {\n\tint family;\n\tstruct module *owner;\n\tint (*release)(struct socket *);\n\tint (*bind)(struct socket *, struct sockaddr *, int);\n\tint (*connect)(struct socket *, struct sockaddr *, int, int);\n\tint (*socketpair)(struct socket *, struct socket *);\n\tint (*accept)(struct socket *, struct socket *, struct proto_accept_arg *);\n\tint (*getname)(struct socket *, struct sockaddr *, int);\n\t__poll_t (*poll)(struct file *, struct socket *, struct poll_table_struct *);\n\tint (*ioctl)(struct socket *, unsigned int, long unsigned int);\n\tint (*compat_ioctl)(struct socket *, unsigned int, long unsigned int);\n\tint (*gettstamp)(struct socket *, void *, bool, bool);\n\tint (*listen)(struct socket *, int);\n\tint (*shutdown)(struct socket *, int);\n\tint (*setsockopt)(struct socket *, int, int, sockptr_t, unsigned int);\n\tint (*getsockopt)(struct socket *, int, int, char *, int *);\n\tvoid (*show_fdinfo)(struct seq_file *, struct socket *);\n\tint (*sendmsg)(struct socket *, struct msghdr *, size_t);\n\tint (*recvmsg)(struct socket *, struct msghdr *, size_t, int);\n\tint (*mmap)(struct file *, struct socket *, struct vm_area_struct *);\n\tssize_t (*splice_read)(struct socket *, loff_t *, struct pipe_inode_info *, size_t, unsigned int);\n\tvoid (*splice_eof)(struct socket *);\n\tint (*set_peek_off)(struct sock *, int);\n\tint (*peek_len)(struct socket *);\n\tint (*read_sock)(struct sock *, read_descriptor_t *, sk_read_actor_t);\n\tint (*read_skb)(struct sock *, skb_read_actor_t);\n\tint (*sendmsg_locked)(struct sock *, struct msghdr *, size_t);\n\tint (*set_rcvlowat)(struct sock *, int);\n};\n\nstruct prt_quirk {\n\tconst struct dmi_system_id *system;\n\tunsigned int segment;\n\tunsigned int bus;\n\tunsigned int device;\n\tunsigned char pin;\n\tconst char *source;\n\tconst char *actual_source;\n};\n\nstruct psample_group {\n\tstruct list_head list;\n\tstruct net *net;\n\tu32 group_num;\n\tu32 refcount;\n\tu32 seq;\n\tstruct callback_head rcu;\n};\n\nstruct psb_s {\n\tu8 signature[10];\n\tu8 tableversion;\n\tu8 flags1;\n\tu16 vstable;\n\tu8 flags2;\n\tu8 num_tables;\n\tu32 cpuid;\n\tu8 plllocktime;\n\tu8 maxfid;\n\tu8 maxvid;\n\tu8 numps;\n};\n\nstruct psc_entry {\n\tu64 cur_page: 12;\n\tu64 gfn: 40;\n\tu64 operation: 4;\n\tu64 pagesize: 1;\n\tu64 reserved: 7;\n};\n\nstruct psc_hdr {\n\tu16 cur_entry;\n\tu16 end_entry;\n\tu32 reserved;\n};\n\nstruct psched_pktrate {\n\tu64 rate_pkts_ps;\n\tu32 mult;\n\tu8 shift;\n};\n\nstruct psched_ratecfg {\n\tu64 rate_bytes_ps;\n\tu32 mult;\n\tu16 overhead;\n\tu16 mpu;\n\tu8 linklayer;\n\tu8 shift;\n};\n\nstruct pse_controller_dev;\n\nstruct pse_control {\n\tstruct pse_controller_dev *pcdev;\n\tstruct regulator *ps;\n\tstruct list_head list;\n\tunsigned int id;\n\tstruct kref refcnt;\n};\n\nstruct pse_control_config {\n\tenum ethtool_podl_pse_admin_state podl_admin_control;\n\tenum ethtool_c33_pse_admin_state c33_admin_control;\n};\n\nstruct pse_control_status {\n\tenum ethtool_podl_pse_admin_state podl_admin_state;\n\tenum ethtool_podl_pse_pw_d_status podl_pw_status;\n\tenum ethtool_c33_pse_admin_state c33_admin_state;\n\tenum ethtool_c33_pse_pw_d_status c33_pw_status;\n\tu32 c33_pw_class;\n\tu32 c33_actual_pw;\n\tstruct ethtool_c33_pse_ext_state_info c33_ext_state_info;\n\tu32 c33_avail_pw_limit;\n\tstruct ethtool_c33_pse_pw_limit_range *c33_pw_limit_ranges;\n\tu32 c33_pw_limit_nb_ranges;\n};\n\nstruct pse_controller_ops;\n\nstruct pse_pi;\n\nstruct pse_controller_dev {\n\tconst struct pse_controller_ops *ops;\n\tstruct module *owner;\n\tstruct list_head list;\n\tstruct list_head pse_control_head;\n\tstruct device *dev;\n\tint of_pse_n_cells;\n\tunsigned int nr_lines;\n\tstruct mutex lock;\n\tenum ethtool_pse_types types;\n\tstruct pse_pi *pi;\n\tbool no_of_pse_pi;\n};\n\nstruct pse_controller_ops {\n\tint (*ethtool_get_status)(struct pse_controller_dev *, long unsigned int, struct netlink_ext_ack *, struct pse_control_status *);\n\tint (*setup_pi_matrix)(struct pse_controller_dev *);\n\tint (*pi_is_enabled)(struct pse_controller_dev *, int);\n\tint (*pi_enable)(struct pse_controller_dev *, int);\n\tint (*pi_disable)(struct pse_controller_dev *, int);\n\tint (*pi_get_voltage)(struct pse_controller_dev *, int);\n\tint (*pi_get_current_limit)(struct pse_controller_dev *, int);\n\tint (*pi_set_current_limit)(struct pse_controller_dev *, int, int);\n};\n\nstruct pse_pi_pairset {\n\tenum pse_pi_pairset_pinout pinout;\n\tstruct device_node *np;\n};\n\nstruct pse_pi {\n\tstruct pse_pi_pairset pairset[2];\n\tstruct device_node *np;\n\tstruct regulator_dev *rdev;\n\tbool admin_state_enabled;\n};\n\nstruct pse_reply_data {\n\tstruct ethnl_reply_data base;\n\tstruct pse_control_status status;\n};\n\nstruct super_operations;\n\nstruct xattr_handler;\n\nstruct pseudo_fs_context {\n\tconst struct super_operations *ops;\n\tconst struct xattr_handler * const *xattr;\n\tconst struct dentry_operations *dops;\n\tlong unsigned int magic;\n};\n\nstruct pseudo_lock_pm_req {\n\tstruct list_head list;\n\tstruct dev_pm_qos_request req;\n};\n\nstruct resctrl_schema;\n\nstruct pseudo_lock_region {\n\tstruct resctrl_schema *s;\n\tstruct rdt_ctrl_domain *d;\n\tu32 cbm;\n\twait_queue_head_t lock_thread_wq;\n\tint thread_done;\n\tint cpu;\n\tunsigned int line_size;\n\tunsigned int size;\n\tvoid *kmem;\n\tunsigned int minor;\n\tstruct dentry *debugfs_dir;\n\tstruct list_head pm_reqs;\n};\n\nstruct psi_group_cpu;\n\nstruct psi_group {\n\tstruct psi_group *parent;\n\tbool enabled;\n\tstruct mutex avgs_lock;\n\tstruct psi_group_cpu *pcpu;\n\tu64 avg_total[6];\n\tu64 avg_last_update;\n\tu64 avg_next_update;\n\tstruct delayed_work avgs_work;\n\tstruct list_head avg_triggers;\n\tu32 avg_nr_triggers[6];\n\tu64 total[12];\n\tlong unsigned int avg[18];\n\tstruct task_struct *rtpoll_task;\n\tstruct timer_list rtpoll_timer;\n\twait_queue_head_t rtpoll_wait;\n\tatomic_t rtpoll_wakeup;\n\tatomic_t rtpoll_scheduled;\n\tstruct mutex rtpoll_trigger_lock;\n\tstruct list_head rtpoll_triggers;\n\tu32 rtpoll_nr_triggers[6];\n\tu32 rtpoll_states;\n\tu64 rtpoll_min_period;\n\tu64 rtpoll_total[6];\n\tu64 rtpoll_next_update;\n\tu64 rtpoll_until;\n};\n\nstruct psi_group_cpu {\n\tseqcount_t seq;\n\tunsigned int tasks[4];\n\tu32 state_mask;\n\tu32 times[7];\n\tu64 state_start;\n\tu32 times_prev[14];\n\tlong: 64;\n};\n\nstruct psi_window {\n\tu64 size;\n\tu64 start_time;\n\tu64 start_value;\n\tu64 prev_growth;\n};\n\nstruct psi_trigger {\n\tenum psi_states state;\n\tu64 threshold;\n\tstruct list_head node;\n\tstruct psi_group *group;\n\twait_queue_head_t event_wait;\n\tstruct kernfs_open_file *of;\n\tint event;\n\tstruct psi_window win;\n\tu64 last_event_time;\n\tbool pending_event;\n\tenum psi_aggregators aggregator;\n};\n\nstruct pst_s {\n\tu8 fid;\n\tu8 vid;\n};\n\nstruct pstate_funcs {\n\tint (*get_max)(int);\n\tint (*get_max_physical)(int);\n\tint (*get_min)(int);\n\tint (*get_turbo)(int);\n\tint (*get_scaling)(void);\n\tint (*get_cpu_scaling)(int);\n\tint (*get_aperf_mperf_shift)(void);\n\tu64 (*get_val)(struct cpudata *, int);\n\tvoid (*get_vid)(struct cpudata *);\n};\n\nstruct pstore_ftrace_record {\n\tlong unsigned int ip;\n\tlong unsigned int parent_ip;\n\tu64 ts;\n};\n\nstruct pstore_ftrace_seq_data {\n\tconst void *ptr;\n\tsize_t off;\n\tsize_t size;\n};\n\nstruct pstore_record;\n\nstruct pstore_info {\n\tstruct module *owner;\n\tconst char *name;\n\tspinlock_t buf_lock;\n\tchar *buf;\n\tsize_t bufsize;\n\tstruct mutex read_mutex;\n\tint flags;\n\tint max_reason;\n\tvoid *data;\n\tint (*open)(struct pstore_info *);\n\tint (*close)(struct pstore_info *);\n\tssize_t (*read)(struct pstore_record *);\n\tint (*write)(struct pstore_record *);\n\tint (*write_user)(struct pstore_record *, const char *);\n\tint (*erase)(struct pstore_record *);\n};\n\nstruct pstore_private {\n\tstruct list_head list;\n\tstruct dentry *dentry;\n\tstruct pstore_record *record;\n\tsize_t total_size;\n};\n\nstruct pstore_record {\n\tstruct pstore_info *psi;\n\tenum pstore_type_id type;\n\tu64 id;\n\tstruct timespec64 time;\n\tchar *buf;\n\tssize_t size;\n\tssize_t ecc_notice_size;\n\tvoid *priv;\n\tint count;\n\tenum kmsg_dump_reason reason;\n\tunsigned int part;\n\tbool compressed;\n};\n\nstruct psy_am_i_supplied_data {\n\tstruct power_supply *psy;\n\tunsigned int count;\n};\n\nstruct psy_get_supplier_prop_data {\n\tstruct power_supply *psy;\n\tenum power_supply_property psp;\n\tunion power_supply_propval *val;\n};\n\nstruct pt_filter {\n\tlong unsigned int msr_a;\n\tlong unsigned int msr_b;\n\tlong unsigned int config;\n};\n\nstruct pt_filters {\n\tstruct pt_filter filter[4];\n\tunsigned int nr_filters;\n};\n\nstruct pt {\n\tstruct perf_output_handle handle;\n\tstruct pt_filters filters;\n\tint handle_nmi;\n\tint vmx_on;\n\tu64 output_base;\n\tu64 output_mask;\n};\n\nstruct pt_address_range {\n\tlong unsigned int msr_a;\n\tlong unsigned int msr_b;\n\tunsigned int reg_off;\n};\n\nstruct topa;\n\nstruct topa_entry;\n\nstruct pt_buffer {\n\tstruct list_head tables;\n\tstruct topa *first;\n\tstruct topa *last;\n\tstruct topa *cur;\n\tunsigned int cur_idx;\n\tsize_t output_off;\n\tlong unsigned int nr_pages;\n\tlocal_t data_size;\n\tlocal64_t head;\n\tbool snapshot;\n\tbool single;\n\tbool wrapped;\n\tlong int stop_pos;\n\tlong int intr_pos;\n\tstruct topa_entry *stop_te;\n\tstruct topa_entry *intr_te;\n\tvoid **data_pages;\n};\n\nstruct pt_cap_desc {\n\tconst char *name;\n\tu32 leaf;\n\tu8 reg;\n\tu32 mask;\n};\n\nstruct pt_info {\n\ts32 pi_nblocks;\n\tu32 pi_blkoff;\n};\n\nstruct pt_pmu {\n\tstruct pmu pmu;\n\tu32 caps[8];\n\tbool vmx;\n\tbool branch_en_always_on;\n\tlong unsigned int max_nonturbo_ratio;\n\tunsigned int tsc_art_num;\n\tunsigned int tsc_art_den;\n};\n\nstruct pt_regs_offset {\n\tconst char *name;\n\tint offset;\n};\n\nstruct ptdesc {\n\tlong unsigned int __page_flags;\n\tunion {\n\t\tstruct callback_head pt_rcu_head;\n\t\tstruct list_head pt_list;\n\t\tstruct {\n\t\t\tlong unsigned int _pt_pad_1;\n\t\t\tpgtable_t pmd_huge_pte;\n\t\t};\n\t};\n\tlong unsigned int __page_mapping;\n\tunion {\n\t\tlong unsigned int pt_index;\n\t\tstruct mm_struct *pt_mm;\n\t\tatomic_t pt_frag_refcount;\n\t};\n\tunion {\n\t\tlong unsigned int _pt_pad_2;\n\t\tspinlock_t ptl;\n\t};\n\tunsigned int __page_type;\n\tatomic_t __page_refcount;\n\tlong unsigned int pt_memcg_data;\n};\n\nstruct ptdump_range {\n\tlong unsigned int start;\n\tlong unsigned int end;\n};\n\nstruct ptp_clock_info;\n\nstruct ptp_clock {\n\tstruct posix_clock clock;\n\tstruct device dev;\n\tstruct ptp_clock_info *info;\n\tdev_t devid;\n\tint index;\n\tstruct pps_device *pps_source;\n\tlong int dialed_frequency;\n\tstruct list_head tsevqs;\n\tspinlock_t tsevqs_lock;\n\tstruct mutex pincfg_mux;\n\twait_queue_head_t tsev_wq;\n\tint defunct;\n\tstruct device_attribute *pin_dev_attr;\n\tstruct attribute **pin_attr;\n\tstruct attribute_group pin_attr_group;\n\tconst struct attribute_group *pin_attr_groups[2];\n\tstruct kthread_worker *kworker;\n\tstruct kthread_delayed_work aux_work;\n\tunsigned int max_vclocks;\n\tunsigned int n_vclocks;\n\tint *vclock_index;\n\tstruct mutex n_vclocks_mux;\n\tbool is_virtual_clock;\n\tbool has_cycles;\n\tstruct dentry *debugfs_root;\n};\n\nstruct ptp_clock_caps {\n\tint max_adj;\n\tint n_alarm;\n\tint n_ext_ts;\n\tint n_per_out;\n\tint pps;\n\tint n_pins;\n\tint cross_timestamping;\n\tint adjust_phase;\n\tint max_phase_adj;\n\tint rsv[11];\n};\n\nstruct ptp_clock_event {\n\tint type;\n\tint index;\n\tunion {\n\t\tu64 timestamp;\n\t\ts64 offset;\n\t\tstruct pps_event_time pps_times;\n\t};\n};\n\nstruct ptp_pin_desc;\n\nstruct ptp_system_timestamp;\n\nstruct system_device_crosststamp;\n\nstruct ptp_clock_request;\n\nstruct ptp_clock_info {\n\tstruct module *owner;\n\tchar name[32];\n\ts32 max_adj;\n\tint n_alarm;\n\tint n_ext_ts;\n\tint n_per_out;\n\tint n_pins;\n\tint pps;\n\tstruct ptp_pin_desc *pin_config;\n\tint (*adjfine)(struct ptp_clock_info *, long int);\n\tint (*adjphase)(struct ptp_clock_info *, s32);\n\ts32 (*getmaxphase)(struct ptp_clock_info *);\n\tint (*adjtime)(struct ptp_clock_info *, s64);\n\tint (*gettime64)(struct ptp_clock_info *, struct timespec64 *);\n\tint (*gettimex64)(struct ptp_clock_info *, struct timespec64 *, struct ptp_system_timestamp *);\n\tint (*getcrosststamp)(struct ptp_clock_info *, struct system_device_crosststamp *);\n\tint (*settime64)(struct ptp_clock_info *, const struct timespec64 *);\n\tint (*getcycles64)(struct ptp_clock_info *, struct timespec64 *);\n\tint (*getcyclesx64)(struct ptp_clock_info *, struct timespec64 *, struct ptp_system_timestamp *);\n\tint (*getcrosscycles)(struct ptp_clock_info *, struct system_device_crosststamp *);\n\tint (*enable)(struct ptp_clock_info *, struct ptp_clock_request *, int);\n\tint (*verify)(struct ptp_clock_info *, unsigned int, enum ptp_pin_function, unsigned int);\n\tlong int (*do_aux_work)(struct ptp_clock_info *);\n};\n\nstruct ptp_extts_request {\n\tunsigned int index;\n\tunsigned int flags;\n\tunsigned int rsv[2];\n};\n\nstruct ptp_clock_time {\n\t__s64 sec;\n\t__u32 nsec;\n\t__u32 reserved;\n};\n\nstruct ptp_perout_request {\n\tunion {\n\t\tstruct ptp_clock_time start;\n\t\tstruct ptp_clock_time phase;\n\t};\n\tstruct ptp_clock_time period;\n\tunsigned int index;\n\tunsigned int flags;\n\tunion {\n\t\tstruct ptp_clock_time on;\n\t\tunsigned int rsv[4];\n\t};\n};\n\nstruct ptp_clock_request {\n\tenum {\n\t\tPTP_CLK_REQ_EXTTS = 0,\n\t\tPTP_CLK_REQ_PEROUT = 1,\n\t\tPTP_CLK_REQ_PPS = 2,\n\t} type;\n\tunion {\n\t\tstruct ptp_extts_request extts;\n\t\tstruct ptp_perout_request perout;\n\t};\n};\n\nstruct ptp_extts_event {\n\tstruct ptp_clock_time t;\n\tunsigned int index;\n\tunsigned int flags;\n\tunsigned int rsv[2];\n};\n\nstruct ptp_header {\n\tu8 tsmt;\n\tu8 ver;\n\t__be16 message_length;\n\tu8 domain_number;\n\tu8 reserved1;\n\tu8 flag_field[2];\n\t__be64 correction;\n\t__be32 reserved2;\n\tstruct port_identity source_port_identity;\n\t__be16 sequence_id;\n\tu8 control;\n\tu8 log_message_interval;\n} __attribute__((packed));\n\nstruct ptp_pin_desc {\n\tchar name[64];\n\tunsigned int index;\n\tunsigned int func;\n\tunsigned int chan;\n\tunsigned int rsv[5];\n};\n\nstruct ptp_sys_offset {\n\tunsigned int n_samples;\n\tunsigned int rsv[3];\n\tstruct ptp_clock_time ts[51];\n};\n\nstruct ptp_sys_offset_extended {\n\tunsigned int n_samples;\n\tunsigned int rsv[3];\n\tstruct ptp_clock_time ts[75];\n};\n\nstruct ptp_sys_offset_precise {\n\tstruct ptp_clock_time device;\n\tstruct ptp_clock_time sys_realtime;\n\tstruct ptp_clock_time sys_monoraw;\n\tunsigned int rsv[4];\n};\n\nstruct ptp_system_timestamp {\n\tstruct timespec64 pre_ts;\n\tstruct timespec64 post_ts;\n};\n\nstruct timecounter {\n\tconst struct cyclecounter *cc;\n\tu64 cycle_last;\n\tu64 nsec;\n\tu64 mask;\n\tu64 frac;\n};\n\nstruct ptp_vclock {\n\tstruct ptp_clock *pclock;\n\tstruct ptp_clock_info info;\n\tstruct ptp_clock *clock;\n\tstruct hlist_node vclock_hash_node;\n\tstruct cyclecounter cc;\n\tstruct timecounter tc;\n\tstruct mutex lock;\n};\n\nstruct ptrace_peeksiginfo_args {\n\t__u64 off;\n\t__u32 flags;\n\t__s32 nr;\n};\n\nstruct ptrace_relation {\n\tstruct task_struct *tracer;\n\tstruct task_struct *tracee;\n\tbool invalid;\n\tstruct list_head node;\n\tstruct callback_head rcu;\n};\n\nstruct ptrace_rseq_configuration {\n\t__u64 rseq_abi_pointer;\n\t__u32 rseq_abi_size;\n\t__u32 signature;\n\t__u32 flags;\n\t__u32 pad;\n};\n\nstruct ptrace_sud_config {\n\t__u64 mode;\n\t__u64 selector;\n\t__u64 offset;\n\t__u64 len;\n};\n\nstruct ptrace_syscall_info {\n\t__u8 op;\n\t__u8 pad[3];\n\t__u32 arch;\n\t__u64 instruction_pointer;\n\t__u64 stack_pointer;\n\tunion {\n\t\tstruct {\n\t\t\t__u64 nr;\n\t\t\t__u64 args[6];\n\t\t} entry;\n\t\tstruct {\n\t\t\t__s64 rval;\n\t\t\t__u8 is_error;\n\t\t} exit;\n\t\tstruct {\n\t\t\t__u64 nr;\n\t\t\t__u64 args[6];\n\t\t\t__u32 ret_data;\n\t\t} seccomp;\n\t};\n};\n\nstruct pts_mount_opts {\n\tint setuid;\n\tint setgid;\n\tkuid_t uid;\n\tkgid_t gid;\n\tumode_t mode;\n\tumode_t ptmxmode;\n\tint reserve;\n\tint max;\n};\n\nstruct pts_fs_info {\n\tstruct ida allocated_ptys;\n\tstruct pts_mount_opts mount_opts;\n\tstruct super_block *sb;\n\tstruct dentry *ptmx_dentry;\n};\n\nstruct pubkey_hdr {\n\tuint8_t version;\n\tuint32_t timestamp;\n\tuint8_t algo;\n\tuint8_t nmpi;\n\tchar mpi[0];\n} __attribute__((packed));\n\nstruct public_key {\n\tvoid *key;\n\tu32 keylen;\n\tenum OID algo;\n\tvoid *params;\n\tu32 paramlen;\n\tbool key_is_private;\n\tconst char *id_type;\n\tconst char *pkey_algo;\n\tlong unsigned int key_eflags;\n};\n\nstruct public_key_signature {\n\tstruct asymmetric_key_id *auth_ids[3];\n\tu8 *s;\n\tu8 *digest;\n\tu32 s_size;\n\tu32 digest_size;\n\tconst char *pkey_algo;\n\tconst char *hash_algo;\n\tconst char *encoding;\n};\n\nstruct pushbutton_work_info {\n\tstruct slot___3 *p_slot;\n\tstruct work_struct work;\n};\n\nstruct pv_node;\n\nstruct pv_hash_entry {\n\tstruct qspinlock *lock;\n\tstruct pv_node *node;\n};\n\nstruct pv_info {\n\tu16 extra_user_64bit_cs;\n\tconst char *name;\n};\n\nstruct pv_node {\n\tstruct mcs_spinlock mcs;\n\tint cpu;\n\tu8 state;\n};\n\nstruct pvclock_vsyscall_time_info {\n\tstruct pvclock_vcpu_time_info pvti;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct pvclock_wall_clock {\n\tu32 version;\n\tu32 sec;\n\tu32 nsec;\n};\n\nstruct pvd {\n\tchar reserved0[16];\n\t__be16 pp_count;\n\tchar reserved18[2];\n\t__be32 psn_part1;\n\tchar reserved24[8];\n\tstruct ppe ppe[1016];\n};\n\nstruct pwm_args {\n\tu64 period;\n\tenum pwm_polarity polarity;\n};\n\nstruct pwm_capture {\n\tunsigned int period;\n\tunsigned int duty_cycle;\n};\n\nstruct pwm_state {\n\tu64 period;\n\tu64 duty_cycle;\n\tenum pwm_polarity polarity;\n\tbool enabled;\n\tbool usage_power;\n};\n\nstruct pwm_chip;\n\nstruct pwm_device {\n\tconst char *label;\n\tlong unsigned int flags;\n\tunsigned int hwpwm;\n\tstruct pwm_chip *chip;\n\tstruct pwm_args args;\n\tstruct pwm_state state;\n\tstruct pwm_state last;\n};\n\nstruct pwm_ops;\n\nstruct pwm_chip {\n\tstruct device dev;\n\tconst struct pwm_ops *ops;\n\tstruct module *owner;\n\tunsigned int id;\n\tunsigned int npwm;\n\tstruct pwm_device * (*of_xlate)(struct pwm_chip *, const struct of_phandle_args *);\n\tbool atomic;\n\tbool uses_pwmchip_alloc;\n\tstruct pwm_device pwms[0];\n};\n\nstruct pwm_export {\n\tstruct device pwm_dev;\n\tstruct pwm_device *pwm;\n\tstruct mutex lock;\n\tstruct pwm_state suspend;\n};\n\nstruct pwm_lookup {\n\tstruct list_head list;\n\tconst char *provider;\n\tunsigned int index;\n\tconst char *dev_id;\n\tconst char *con_id;\n\tunsigned int period;\n\tenum pwm_polarity polarity;\n\tconst char *module;\n};\n\nstruct pwm_lpss_boardinfo {\n\tlong unsigned int clk_rate;\n\tunsigned int npwm;\n\tlong unsigned int base_unit_bits;\n\tbool bypass;\n\tbool other_devices_aml_touches_pwm_regs;\n};\n\nstruct pwm_lpss_chip {\n\tvoid *regs;\n\tconst struct pwm_lpss_boardinfo *info;\n};\n\nstruct pwm_ops {\n\tint (*request)(struct pwm_chip *, struct pwm_device *);\n\tvoid (*free)(struct pwm_chip *, struct pwm_device *);\n\tint (*capture)(struct pwm_chip *, struct pwm_device *, struct pwm_capture *, long unsigned int);\n\tint (*apply)(struct pwm_chip *, struct pwm_device *, const struct pwm_state *);\n\tint (*get_state)(struct pwm_chip *, struct pwm_device *, struct pwm_state *);\n};\n\nstruct q_inval {\n\traw_spinlock_t q_lock;\n\tvoid *desc;\n\tint *desc_status;\n\tint free_head;\n\tint free_tail;\n\tint free_cnt;\n};\n\nstruct qc_dqblk {\n\tint d_fieldmask;\n\tu64 d_spc_hardlimit;\n\tu64 d_spc_softlimit;\n\tu64 d_ino_hardlimit;\n\tu64 d_ino_softlimit;\n\tu64 d_space;\n\tu64 d_ino_count;\n\ts64 d_ino_timer;\n\ts64 d_spc_timer;\n\tint d_ino_warns;\n\tint d_spc_warns;\n\tu64 d_rt_spc_hardlimit;\n\tu64 d_rt_spc_softlimit;\n\tu64 d_rt_space;\n\ts64 d_rt_spc_timer;\n\tint d_rt_spc_warns;\n};\n\nstruct qc_info {\n\tint i_fieldmask;\n\tunsigned int i_flags;\n\tunsigned int i_spc_timelimit;\n\tunsigned int i_ino_timelimit;\n\tunsigned int i_rt_spc_timelimit;\n\tunsigned int i_spc_warnlimit;\n\tunsigned int i_ino_warnlimit;\n\tunsigned int i_rt_spc_warnlimit;\n};\n\nstruct qc_type_state {\n\tunsigned int flags;\n\tunsigned int spc_timelimit;\n\tunsigned int ino_timelimit;\n\tunsigned int rt_spc_timelimit;\n\tunsigned int spc_warnlimit;\n\tunsigned int ino_warnlimit;\n\tunsigned int rt_spc_warnlimit;\n\tlong long unsigned int ino;\n\tblkcnt_t blocks;\n\tblkcnt_t nextents;\n};\n\nstruct qc_state {\n\tunsigned int s_incoredqs;\n\tstruct qc_type_state s_state[3];\n};\n\nstruct qdisc_dump_args {\n\tstruct qdisc_walker w;\n\tstruct sk_buff *skb;\n\tstruct netlink_callback *cb;\n};\n\nstruct tc_ratespec {\n\tunsigned char cell_log;\n\t__u8 linklayer;\n\tshort unsigned int overhead;\n\tshort int cell_align;\n\tshort unsigned int mpu;\n\t__u32 rate;\n};\n\nstruct qdisc_rate_table {\n\tstruct tc_ratespec rate;\n\tu32 data[256];\n\tstruct qdisc_rate_table *next;\n\tint refcnt;\n};\n\nstruct tc_sizespec {\n\tunsigned char cell_log;\n\tunsigned char size_log;\n\tshort int cell_align;\n\tint overhead;\n\tunsigned int linklayer;\n\tunsigned int mpu;\n\tunsigned int mtu;\n\tunsigned int tsize;\n};\n\nstruct qdisc_size_table {\n\tstruct callback_head rcu;\n\tstruct list_head list;\n\tstruct tc_sizespec szopts;\n\tint refcnt;\n\tu16 data[0];\n};\n\nstruct qdisc_watchdog {\n\tstruct hrtimer timer;\n\tstruct Qdisc *qdisc;\n};\n\nstruct qi_desc {\n\tu64 qw0;\n\tu64 qw1;\n\tu64 qw2;\n\tu64 qw3;\n};\n\nstruct qnode {\n\tstruct mcs_spinlock mcs;\n\tlong int reserved[2];\n};\n\nstruct queue_limits {\n\tblk_features_t features;\n\tblk_flags_t flags;\n\tlong unsigned int seg_boundary_mask;\n\tlong unsigned int virt_boundary_mask;\n\tunsigned int max_hw_sectors;\n\tunsigned int max_dev_sectors;\n\tunsigned int chunk_sectors;\n\tunsigned int max_sectors;\n\tunsigned int max_user_sectors;\n\tunsigned int max_segment_size;\n\tunsigned int physical_block_size;\n\tunsigned int logical_block_size;\n\tunsigned int alignment_offset;\n\tunsigned int io_min;\n\tunsigned int io_opt;\n\tunsigned int max_discard_sectors;\n\tunsigned int max_hw_discard_sectors;\n\tunsigned int max_user_discard_sectors;\n\tunsigned int max_secure_erase_sectors;\n\tunsigned int max_write_zeroes_sectors;\n\tunsigned int max_zone_append_sectors;\n\tunsigned int discard_granularity;\n\tunsigned int discard_alignment;\n\tunsigned int zone_write_granularity;\n\tunsigned int atomic_write_hw_max;\n\tunsigned int atomic_write_max_sectors;\n\tunsigned int atomic_write_hw_boundary;\n\tunsigned int atomic_write_boundary_sectors;\n\tunsigned int atomic_write_hw_unit_min;\n\tunsigned int atomic_write_unit_min;\n\tunsigned int atomic_write_hw_unit_max;\n\tunsigned int atomic_write_unit_max;\n\tshort unsigned int max_segments;\n\tshort unsigned int max_integrity_segments;\n\tshort unsigned int max_discard_segments;\n\tunsigned int max_open_zones;\n\tunsigned int max_active_zones;\n\tunsigned int dma_alignment;\n\tunsigned int dma_pad_mask;\n\tstruct blk_integrity integrity;\n};\n\nstruct queue_pages {\n\tstruct list_head *pagelist;\n\tlong unsigned int flags;\n\tnodemask_t *nmask;\n\tlong unsigned int start;\n\tlong unsigned int end;\n\tstruct vm_area_struct *first;\n\tstruct folio *large;\n\tlong int nr_failed;\n};\n\nstruct queue_sysfs_entry {\n\tstruct attribute attr;\n\tssize_t (*show)(struct gendisk *, char *);\n\tint (*load_module)(struct gendisk *, const char *, size_t);\n\tssize_t (*store)(struct gendisk *, const char *, size_t);\n};\n\nstruct quirk_entry {\n\tu32 nominal_freq;\n\tu32 lowest_freq;\n};\n\nstruct quirk_entry___2 {\n\tu16 vid;\n\tu16 pid;\n\tu32 flags;\n};\n\nstruct quota_format_ops {\n\tint (*check_quota_file)(struct super_block *, int);\n\tint (*read_file_info)(struct super_block *, int);\n\tint (*write_file_info)(struct super_block *, int);\n\tint (*free_file_info)(struct super_block *, int);\n\tint (*read_dqblk)(struct dquot *);\n\tint (*commit_dqblk)(struct dquot *);\n\tint (*release_dqblk)(struct dquot *);\n\tint (*get_next_id)(struct super_block *, struct kqid *);\n};\n\nstruct quota_format_type {\n\tint qf_fmt_id;\n\tconst struct quota_format_ops *qf_ops;\n\tstruct module *qf_owner;\n\tstruct quota_format_type *qf_next;\n};\n\nstruct quota_id {\n\tstruct rb_node node;\n\tqid_t id;\n\tqsize_t bhardlimit;\n\tqsize_t bsoftlimit;\n\tqsize_t ihardlimit;\n\tqsize_t isoftlimit;\n};\n\nstruct quota_info {\n\tunsigned int flags;\n\tstruct rw_semaphore dqio_sem;\n\tstruct inode *files[3];\n\tstruct mem_dqinfo info[3];\n\tconst struct quota_format_ops *ops[3];\n};\n\nstruct quota_module_name {\n\tint qm_fmt_id;\n\tchar *qm_mod_name;\n};\n\nstruct quotactl_ops {\n\tint (*quota_on)(struct super_block *, int, int, const struct path *);\n\tint (*quota_off)(struct super_block *, int);\n\tint (*quota_enable)(struct super_block *, unsigned int);\n\tint (*quota_disable)(struct super_block *, unsigned int);\n\tint (*quota_sync)(struct super_block *, int);\n\tint (*set_info)(struct super_block *, int, struct qc_info *);\n\tint (*get_dqblk)(struct super_block *, struct kqid, struct qc_dqblk *);\n\tint (*get_nextdqblk)(struct super_block *, struct kqid *, struct qc_dqblk *);\n\tint (*set_dqblk)(struct super_block *, struct kqid, struct qc_dqblk *);\n\tint (*get_state)(struct super_block *, struct qc_state *);\n\tint (*rm_xquota)(struct super_block *, unsigned int);\n};\n\nstruct ra_msg {\n\tstruct icmp6hdr icmph;\n\t__be32 reachable_time;\n\t__be32 retrans_timer;\n};\n\nstruct xa_node;\n\nstruct radix_tree_iter {\n\tlong unsigned int index;\n\tlong unsigned int next_index;\n\tlong unsigned int tags;\n\tstruct xa_node *node;\n};\n\nstruct radix_tree_preload {\n\tlocal_lock_t lock;\n\tunsigned int nr;\n\tstruct xa_node *nodes;\n};\n\nstruct ramfs_mount_opts {\n\tumode_t mode;\n};\n\nstruct ramfs_fs_info {\n\tstruct ramfs_mount_opts mount_opts;\n};\n\nstruct rand_data {\n\tvoid *hash_state;\n\t__u64 prev_time;\n\t__u64 last_delta;\n\t__s64 last_delta2;\n\tunsigned int flags;\n\tunsigned int osr;\n\tunsigned char *mem;\n\tunsigned int memlocation;\n\tunsigned int memblocks;\n\tunsigned int memblocksize;\n\tunsigned int memaccessloops;\n\tunsigned int rct_count;\n\tunsigned int apt_cutoff;\n\tunsigned int apt_cutoff_permanent;\n\tunsigned int apt_observations;\n\tunsigned int apt_count;\n\tunsigned int apt_base;\n\tunsigned int health_failure;\n\tunsigned int apt_base_set: 1;\n};\n\nstruct range_trans {\n\tu32 source_type;\n\tu32 target_type;\n\tu32 target_class;\n};\n\nstruct rank_info {\n\tint chan_idx;\n\tstruct csrow_info *csrow;\n\tstruct dimm_info *dimm;\n\tu32 ce_count;\n};\n\nstruct rate_sample {\n\tu64 prior_mstamp;\n\tu32 prior_delivered;\n\tu32 prior_delivered_ce;\n\ts32 delivered;\n\ts32 delivered_ce;\n\tlong int interval_us;\n\tu32 snd_interval_us;\n\tu32 rcv_interval_us;\n\tlong int rtt_us;\n\tint losses;\n\tu32 acked_sacked;\n\tu32 prior_in_flight;\n\tu32 last_end_seq;\n\tbool is_app_limited;\n\tbool is_retrans;\n\tbool is_ack_delayed;\n};\n\nstruct raw6_frag_vec {\n\tstruct msghdr *msg;\n\tint hlen;\n\tchar c[4];\n};\n\nstruct raw6_sock {\n\tstruct inet_sock inet;\n\t__u32 checksum;\n\t__u32 offset;\n\tstruct icmp6_filter filter;\n\t__u32 ip6mr_table;\n\tstruct ipv6_pinfo inet6;\n};\n\nstruct raw_data_entry {\n\tstruct trace_entry ent;\n\tunsigned int id;\n\tchar buf[0];\n};\n\nstruct raw_frag_vec {\n\tstruct msghdr *msg;\n\tunion {\n\t\tstruct icmphdr icmph;\n\t\tchar c[1];\n\t} hdr;\n\tint hlen;\n};\n\nstruct raw_hashinfo {\n\tspinlock_t lock;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tstruct hlist_head ht[256];\n};\n\nstruct raw_hwp_page {\n\tstruct llist_node node;\n\tstruct page *page;\n};\n\nstruct raw_iter_state {\n\tstruct seq_net_private p;\n\tint bucket;\n};\n\nstruct raw_sock {\n\tstruct inet_sock inet;\n\tstruct icmp_filter filter;\n\tu32 ipmr_table;\n};\n\nstruct rawdata_f_data {\n\tstruct aa_loaddata *loaddata;\n};\n\nstruct rb_augment_callbacks {\n\tvoid (*propagate)(struct rb_node *, struct rb_node *);\n\tvoid (*copy)(struct rb_node *, struct rb_node *);\n\tvoid (*rotate)(struct rb_node *, struct rb_node *);\n};\n\nstruct rb_event_info {\n\tu64 ts;\n\tu64 delta;\n\tu64 before;\n\tu64 after;\n\tlong unsigned int length;\n\tstruct buffer_page *tail_page;\n\tint add_timestamp;\n};\n\nstruct rb_irq_work {\n\tstruct irq_work work;\n\twait_queue_head_t waiters;\n\twait_queue_head_t full_waiters;\n\tatomic_t seq;\n\tbool waiters_pending;\n\tbool full_waiters_pending;\n\tbool wakeup_full;\n};\n\nstruct rb_list {\n\tstruct rb_root root;\n\tstruct list_head head;\n\tspinlock_t lock;\n};\n\nstruct rb_time_struct {\n\tlocal64_t time;\n};\n\ntypedef struct rb_time_struct rb_time_t;\n\nstruct rb_wait_data {\n\tstruct rb_irq_work *irq_work;\n\tint seq;\n};\n\nstruct rc {\n\tlong int (*fill)(void *, long unsigned int);\n\tuint8_t *ptr;\n\tuint8_t *buffer;\n\tuint8_t *buffer_end;\n\tlong int buffer_size;\n\tuint32_t code;\n\tuint32_t range;\n\tuint32_t bound;\n\tvoid (*error)(char *);\n};\n\nstruct rc5t583 {\n\tstruct device *dev;\n\tstruct regmap *regmap;\n\tint chip_irq;\n\tint irq_base;\n\tstruct mutex irq_lock;\n\tlong unsigned int group_irq_en[5];\n\tuint8_t intc_inten_reg;\n\tuint8_t irq_en_reg[8];\n\tuint8_t gpedge_reg[2];\n};\n\nstruct rc5t583_gpio {\n\tstruct gpio_chip gpio_chip;\n\tstruct rc5t583 *rc5t583;\n};\n\nstruct rc5t583_irq_data {\n\tu8 int_type;\n\tu8 master_bit;\n\tu8 int_en_bit;\n\tu8 mask_reg_index;\n\tint grp_index;\n};\n\nstruct rc5t583_platform_data {\n\tint irq_base;\n\tint gpio_base;\n\tbool enable_shutdown;\n\tint regulator_deepsleep_slot[14];\n\tlong unsigned int regulator_ext_pwr_control[14];\n\tstruct regulator_init_data *reg_init_data[14];\n};\n\nstruct rc_dec {\n\tuint32_t range;\n\tuint32_t code;\n\tuint32_t init_bytes_left;\n\tconst uint8_t *in;\n\tsize_t in_pos;\n\tsize_t in_limit;\n};\n\nstruct rcec_ea {\n\tu8 nextbusn;\n\tu8 lastbusn;\n\tu32 bitmap;\n};\n\nstruct rchan_callbacks;\n\nstruct rchan_buf;\n\nstruct rchan {\n\tu32 version;\n\tsize_t subbuf_size;\n\tsize_t n_subbufs;\n\tsize_t alloc_size;\n\tconst struct rchan_callbacks *cb;\n\tstruct kref kref;\n\tvoid *private_data;\n\tsize_t last_toobig;\n\tstruct rchan_buf **buf;\n\tint is_global;\n\tstruct list_head list;\n\tstruct dentry *parent;\n\tint has_base_filename;\n\tchar base_filename[255];\n};\n\nstruct rchan_buf {\n\tvoid *start;\n\tvoid *data;\n\tsize_t offset;\n\tsize_t subbufs_produced;\n\tsize_t subbufs_consumed;\n\tstruct rchan *chan;\n\twait_queue_head_t read_wait;\n\tstruct irq_work wakeup_work;\n\tstruct dentry *dentry;\n\tstruct kref kref;\n\tstruct page **page_array;\n\tunsigned int page_count;\n\tunsigned int finalized;\n\tsize_t *padding;\n\tsize_t prev_padding;\n\tsize_t bytes_consumed;\n\tsize_t early_bytes;\n\tunsigned int cpu;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct rchan_callbacks {\n\tint (*subbuf_start)(struct rchan_buf *, void *, void *, size_t);\n\tstruct dentry * (*create_buf_file)(const char *, struct dentry *, umode_t, struct rchan_buf *, int *);\n\tint (*remove_buf_file)(struct dentry *);\n};\n\nstruct rchan_percpu_buf_dispatcher {\n\tstruct rchan_buf *buf;\n\tstruct dentry *dentry;\n};\n\nstruct rcu_cblist {\n\tstruct callback_head *head;\n\tstruct callback_head **tail;\n\tlong int len;\n};\n\nunion rcu_noqs {\n\tstruct {\n\t\tu8 norm;\n\t\tu8 exp;\n\t} b;\n\tu16 s;\n};\n\nstruct rcu_segcblist {\n\tstruct callback_head *head;\n\tstruct callback_head **tails[4];\n\tlong unsigned int gp_seq[4];\n\tatomic_long_t len;\n\tlong int seglen[4];\n\tu8 flags;\n};\n\nstruct rcu_snap_record {\n\tlong unsigned int gp_seq;\n\tu64 cputime_irq;\n\tu64 cputime_softirq;\n\tu64 cputime_system;\n\tlong unsigned int nr_hardirqs;\n\tunsigned int nr_softirqs;\n\tlong long unsigned int nr_csw;\n\tlong unsigned int jiffies;\n};\n\nstruct rcu_node;\n\nstruct rcu_data {\n\tlong unsigned int gp_seq;\n\tlong unsigned int gp_seq_needed;\n\tunion rcu_noqs cpu_no_qs;\n\tbool core_needs_qs;\n\tbool beenonline;\n\tbool gpwrap;\n\tbool cpu_started;\n\tstruct rcu_node *mynode;\n\tlong unsigned int grpmask;\n\tlong unsigned int ticks_this_gp;\n\tstruct irq_work defer_qs_iw;\n\tbool defer_qs_iw_pending;\n\tstruct work_struct strict_work;\n\tstruct rcu_segcblist cblist;\n\tlong int qlen_last_fqs_check;\n\tlong unsigned int n_cbs_invoked;\n\tlong unsigned int n_force_qs_snap;\n\tlong int blimit;\n\tint dynticks_snap;\n\tbool rcu_need_heavy_qs;\n\tbool rcu_urgent_qs;\n\tbool rcu_forced_tick;\n\tbool rcu_forced_tick_exp;\n\tlong unsigned int barrier_seq_snap;\n\tstruct callback_head barrier_head;\n\tint exp_dynticks_snap;\n\tstruct swait_queue_head nocb_cb_wq;\n\tstruct swait_queue_head nocb_state_wq;\n\tstruct task_struct *nocb_gp_kthread;\n\traw_spinlock_t nocb_lock;\n\tint nocb_defer_wakeup;\n\tstruct timer_list nocb_timer;\n\tlong unsigned int nocb_gp_adv_time;\n\tstruct mutex nocb_gp_kthread_mutex;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\traw_spinlock_t nocb_bypass_lock;\n\tstruct rcu_cblist nocb_bypass;\n\tlong unsigned int nocb_bypass_first;\n\tlong unsigned int nocb_nobypass_last;\n\tint nocb_nobypass_count;\n\tlong: 64;\n\traw_spinlock_t nocb_gp_lock;\n\tu8 nocb_gp_sleep;\n\tu8 nocb_gp_bypass;\n\tu8 nocb_gp_gp;\n\tlong unsigned int nocb_gp_seq;\n\tlong unsigned int nocb_gp_loops;\n\tstruct swait_queue_head nocb_gp_wq;\n\tbool nocb_cb_sleep;\n\tstruct task_struct *nocb_cb_kthread;\n\tstruct list_head nocb_head_rdp;\n\tstruct list_head nocb_entry_rdp;\n\tstruct rcu_data *nocb_toggling_rdp;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tstruct rcu_data *nocb_gp_rdp;\n\tstruct task_struct *rcu_cpu_kthread_task;\n\tunsigned int rcu_cpu_kthread_status;\n\tchar rcu_cpu_has_work;\n\tlong unsigned int rcuc_activity;\n\tunsigned int softirq_snap;\n\tstruct irq_work rcu_iw;\n\tbool rcu_iw_pending;\n\tlong unsigned int rcu_iw_gp_seq;\n\tlong unsigned int rcu_ofl_gp_seq;\n\tshort int rcu_ofl_gp_state;\n\tlong unsigned int rcu_onl_gp_seq;\n\tshort int rcu_onl_gp_state;\n\tlong unsigned int last_fqs_resched;\n\tlong unsigned int last_sched_clock;\n\tstruct rcu_snap_record snap_record;\n\tlong int lazy_len;\n\tint cpu;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct rcu_exp_work {\n\tlong unsigned int rew_s;\n\tstruct kthread_work rew_work;\n};\n\nstruct rcu_node {\n\traw_spinlock_t lock;\n\tlong unsigned int gp_seq;\n\tlong unsigned int gp_seq_needed;\n\tlong unsigned int completedqs;\n\tlong unsigned int qsmask;\n\tlong unsigned int rcu_gp_init_mask;\n\tlong unsigned int qsmaskinit;\n\tlong unsigned int qsmaskinitnext;\n\tlong unsigned int expmask;\n\tlong unsigned int expmaskinit;\n\tlong unsigned int expmaskinitnext;\n\tstruct kthread_worker *exp_kworker;\n\tlong unsigned int cbovldmask;\n\tlong unsigned int ffmask;\n\tlong unsigned int grpmask;\n\tint grplo;\n\tint grphi;\n\tu8 grpnum;\n\tu8 level;\n\tbool wait_blkd_tasks;\n\tstruct rcu_node *parent;\n\tstruct list_head blkd_tasks;\n\tstruct list_head *gp_tasks;\n\tstruct list_head *exp_tasks;\n\tstruct list_head *boost_tasks;\n\tstruct rt_mutex boost_mtx;\n\tlong unsigned int boost_time;\n\tstruct mutex kthread_mutex;\n\tstruct task_struct *boost_kthread_task;\n\tunsigned int boost_kthread_status;\n\tlong unsigned int n_boosts;\n\tstruct swait_queue_head nocb_gp_wq[2];\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\traw_spinlock_t fqslock;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tspinlock_t exp_lock;\n\tlong unsigned int exp_seq_rq;\n\twait_queue_head_t exp_wq[4];\n\tstruct rcu_exp_work rew;\n\tbool exp_need_flush;\n\traw_spinlock_t exp_poll_lock;\n\tlong unsigned int exp_seq_poll_rq;\n\tstruct work_struct exp_poll_wq;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n};\n\nunion rcu_special {\n\tstruct {\n\t\tu8 blocked;\n\t\tu8 need_qs;\n\t\tu8 exp_hint;\n\t\tu8 need_mb;\n\t} b;\n\tu32 s;\n};\n\nstruct rcu_stall_chk_rdr {\n\tint nesting;\n\tunion rcu_special rs;\n\tbool on_blkd_list;\n};\n\nstruct sr_wait_node {\n\tatomic_t inuse;\n\tstruct llist_node node;\n};\n\nstruct rcu_state {\n\tstruct rcu_node node[521];\n\tstruct rcu_node *level[4];\n\tint ncpus;\n\tint n_online_cpus;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong unsigned int gp_seq;\n\tlong unsigned int gp_max;\n\tstruct task_struct *gp_kthread;\n\tstruct swait_queue_head gp_wq;\n\tshort int gp_flags;\n\tshort int gp_state;\n\tlong unsigned int gp_wake_time;\n\tlong unsigned int gp_wake_seq;\n\tlong unsigned int gp_seq_polled;\n\tlong unsigned int gp_seq_polled_snap;\n\tlong unsigned int gp_seq_polled_exp_snap;\n\tstruct mutex barrier_mutex;\n\tatomic_t barrier_cpu_count;\n\tstruct completion barrier_completion;\n\tlong unsigned int barrier_sequence;\n\traw_spinlock_t barrier_lock;\n\tstruct mutex exp_mutex;\n\tstruct mutex exp_wake_mutex;\n\tlong unsigned int expedited_sequence;\n\tatomic_t expedited_need_qs;\n\tstruct swait_queue_head expedited_wq;\n\tint ncpus_snap;\n\tu8 cbovld;\n\tu8 cbovldnext;\n\tlong unsigned int jiffies_force_qs;\n\tlong unsigned int jiffies_kick_kthreads;\n\tlong unsigned int n_force_qs;\n\tlong unsigned int gp_start;\n\tlong unsigned int gp_end;\n\tlong unsigned int gp_activity;\n\tlong unsigned int gp_req_activity;\n\tlong unsigned int jiffies_stall;\n\tint nr_fqs_jiffies_stall;\n\tlong unsigned int jiffies_resched;\n\tlong unsigned int n_force_qs_gpstart;\n\tconst char *name;\n\tchar abbr;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tarch_spinlock_t ofl_lock;\n\tint nocb_is_setup;\n\tstruct llist_head srs_next;\n\tstruct llist_node *srs_wait_tail;\n\tstruct llist_node *srs_done_tail;\n\tstruct sr_wait_node srs_wait_nodes[5];\n\tstruct work_struct srs_cleanup_work;\n\tatomic_t srs_cleanups_pending;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct rcu_synchronize {\n\tstruct callback_head head;\n\tstruct completion completion;\n};\n\nstruct rcu_tasks;\n\ntypedef void (*rcu_tasks_gp_func_t)(struct rcu_tasks *);\n\ntypedef void (*pregp_func_t)(struct list_head *);\n\ntypedef void (*pertask_func_t)(struct task_struct *, struct list_head *);\n\ntypedef void (*postscan_func_t)(struct list_head *);\n\ntypedef void (*holdouts_func_t)(struct list_head *, bool, bool *);\n\ntypedef void (*postgp_func_t)(struct rcu_tasks *);\n\ntypedef void (*rcu_callback_t)(struct callback_head *);\n\ntypedef void (*call_rcu_func_t)(struct callback_head *, rcu_callback_t);\n\nstruct rcu_tasks_percpu;\n\nstruct rcu_tasks {\n\tstruct rcuwait cbs_wait;\n\traw_spinlock_t cbs_gbl_lock;\n\tstruct mutex tasks_gp_mutex;\n\tint gp_state;\n\tint gp_sleep;\n\tint init_fract;\n\tlong unsigned int gp_jiffies;\n\tlong unsigned int gp_start;\n\tlong unsigned int tasks_gp_seq;\n\tlong unsigned int n_ipis;\n\tlong unsigned int n_ipis_fails;\n\tstruct task_struct *kthread_ptr;\n\tlong unsigned int lazy_jiffies;\n\trcu_tasks_gp_func_t gp_func;\n\tpregp_func_t pregp_func;\n\tpertask_func_t pertask_func;\n\tpostscan_func_t postscan_func;\n\tholdouts_func_t holdouts_func;\n\tpostgp_func_t postgp_func;\n\tcall_rcu_func_t call_func;\n\tunsigned int wait_state;\n\tstruct rcu_tasks_percpu *rtpcpu;\n\tstruct rcu_tasks_percpu **rtpcp_array;\n\tint percpu_enqueue_shift;\n\tint percpu_enqueue_lim;\n\tint percpu_dequeue_lim;\n\tlong unsigned int percpu_dequeue_gpseq;\n\tstruct mutex barrier_q_mutex;\n\tatomic_t barrier_q_count;\n\tstruct completion barrier_q_completion;\n\tlong unsigned int barrier_q_seq;\n\tchar *name;\n\tchar *kname;\n};\n\nstruct rcu_tasks_percpu {\n\tstruct rcu_segcblist cblist;\n\traw_spinlock_t lock;\n\tlong unsigned int rtp_jiffies;\n\tlong unsigned int rtp_n_lock_retries;\n\tstruct timer_list lazy_timer;\n\tunsigned int urgent_gp;\n\tstruct work_struct rtp_work;\n\tstruct irq_work rtp_irq_work;\n\tstruct callback_head barrier_q_head;\n\tstruct list_head rtp_blkd_tasks;\n\tstruct list_head rtp_exit_list;\n\tint cpu;\n\tint index;\n\tstruct rcu_tasks *rtpp;\n};\n\nstruct rd_msg {\n\tstruct icmp6hdr icmph;\n\tstruct in6_addr target;\n\tstruct in6_addr dest;\n\t__u8 opt[0];\n};\n\nstruct rdev_sysfs_entry {\n\tstruct attribute attr;\n\tssize_t (*show)(struct md_rdev *, char *);\n\tssize_t (*store)(struct md_rdev *, const char *, size_t);\n};\n\nstruct rdma_ah_init_attr {\n\tstruct rdma_ah_attr *ah_attr;\n\tu32 flags;\n\tstruct net_device *xmit_slave;\n};\n\nstruct rdma_cgroup {\n\tstruct cgroup_subsys_state css;\n\tstruct list_head rpools;\n};\n\nstruct rdma_counter {\n\tstruct rdma_restrack_entry res;\n\tstruct ib_device *device;\n\tuint32_t id;\n\tstruct kref kref;\n\tstruct rdma_counter_mode mode;\n\tstruct mutex lock;\n\tstruct rdma_hw_stats *stats;\n\tu32 port;\n};\n\nstruct rdma_stat_desc;\n\nstruct rdma_hw_stats {\n\tstruct mutex lock;\n\tlong unsigned int timestamp;\n\tlong unsigned int lifespan;\n\tconst struct rdma_stat_desc *descs;\n\tlong unsigned int *is_disabled;\n\tint num_counters;\n\tu64 value[0];\n};\n\nstruct rdma_link_ops {\n\tstruct list_head list;\n\tconst char *type;\n\tint (*newlink)(const char *, struct net_device *);\n};\n\nstruct rdma_netdev_alloc_params {\n\tsize_t sizeof_priv;\n\tunsigned int txqs;\n\tunsigned int rxqs;\n\tvoid *param;\n\tint (*initialize_rdma_netdev)(struct ib_device *, u32, struct net_device *, void *);\n};\n\nstruct rdma_stat_desc {\n\tconst char *name;\n\tunsigned int flags;\n\tconst void *priv;\n};\n\nstruct rdma_user_mmap_entry {\n\tstruct kref ref;\n\tstruct ib_ucontext *ucontext;\n\tlong unsigned int start_pgoff;\n\tsize_t npages;\n\tbool driver_removed;\n};\n\nstruct rdmacg_resource {\n\tint max;\n\tint usage;\n};\n\nstruct rdmacg_resource_pool {\n\tstruct rdmacg_device *device;\n\tstruct rdmacg_resource resources[2];\n\tstruct list_head cg_node;\n\tstruct list_head dev_node;\n\tu64 usage_sum;\n\tint num_max_cnt;\n};\n\nstruct rdt_domain_hdr {\n\tstruct list_head list;\n\tint id;\n\tenum resctrl_domain_type type;\n\tstruct cpumask cpu_mask;\n};\n\nstruct resctrl_staged_config {\n\tu32 new_ctrl;\n\tbool have_new_ctrl;\n};\n\nstruct rdt_ctrl_domain {\n\tstruct rdt_domain_hdr hdr;\n\tstruct pseudo_lock_region *plr;\n\tstruct resctrl_staged_config staged_config[3];\n\tu32 *mbps_val;\n};\n\nstruct rdt_fs_context {\n\tstruct kernfs_fs_context kfc;\n\tbool enable_cdpl2;\n\tbool enable_cdpl3;\n\tbool enable_mba_mbps;\n\tbool enable_debug;\n};\n\nstruct rdt_hw_ctrl_domain {\n\tstruct rdt_ctrl_domain d_resctrl;\n\tu32 *ctrl_val;\n};\n\nstruct rdt_mon_domain {\n\tstruct rdt_domain_hdr hdr;\n\tstruct cacheinfo *ci;\n\tlong unsigned int *rmid_busy_llc;\n\tstruct mbm_state *mbm_total;\n\tstruct mbm_state *mbm_local;\n\tstruct delayed_work mbm_over;\n\tstruct delayed_work cqm_limbo;\n\tint mbm_work_cpu;\n\tint cqm_work_cpu;\n};\n\nstruct rdt_hw_mon_domain {\n\tstruct rdt_mon_domain d_resctrl;\n\tstruct arch_mbm_state *arch_mbm_total;\n\tstruct arch_mbm_state *arch_mbm_local;\n};\n\nstruct resctrl_cache {\n\tunsigned int cbm_len;\n\tunsigned int min_cbm_bits;\n\tunsigned int shareable_bits;\n\tbool arch_has_sparse_bitmasks;\n\tbool arch_has_per_cpu_cfg;\n};\n\nstruct resctrl_membw {\n\tu32 min_bw;\n\tu32 bw_gran;\n\tu32 delay_linear;\n\tbool arch_needs_linear;\n\tenum membw_throttle_mode throttle_mode;\n\tbool mba_sc;\n\tu32 *mb_map;\n};\n\nstruct rdt_parse_data;\n\nstruct rdt_resource {\n\tint rid;\n\tbool alloc_capable;\n\tbool mon_capable;\n\tint num_rmid;\n\tenum resctrl_scope ctrl_scope;\n\tenum resctrl_scope mon_scope;\n\tstruct resctrl_cache cache;\n\tstruct resctrl_membw membw;\n\tstruct list_head ctrl_domains;\n\tstruct list_head mon_domains;\n\tchar *name;\n\tint data_width;\n\tu32 default_ctrl;\n\tconst char *format_str;\n\tint (*parse_ctrlval)(struct rdt_parse_data *, struct resctrl_schema *, struct rdt_ctrl_domain *);\n\tstruct list_head evt_list;\n\tlong unsigned int fflags;\n\tbool cdp_capable;\n};\n\nstruct rdt_hw_resource {\n\tstruct rdt_resource r_resctrl;\n\tu32 num_closid;\n\tunsigned int msr_base;\n\tvoid (*msr_update)(struct msr_param *);\n\tunsigned int mon_scale;\n\tunsigned int mbm_width;\n\tunsigned int mbm_cfg_mask;\n\tbool cdp_enabled;\n};\n\nstruct rdt_options {\n\tchar *name;\n\tint flag;\n\tbool force_off;\n\tbool force_on;\n};\n\nstruct rdt_parse_data {\n\tstruct rdtgroup *rdtgrp;\n\tchar *buf;\n};\n\nstruct rdtgroup {\n\tstruct kernfs_node *kn;\n\tstruct list_head rdtgroup_list;\n\tu32 closid;\n\tstruct cpumask cpu_mask;\n\tint flags;\n\tatomic_t waitcount;\n\tenum rdt_group_type type;\n\tstruct mongroup mon;\n\tenum rdtgrp_mode mode;\n\tstruct pseudo_lock_region *plr;\n};\n\nstruct read_buffer {\n\tstruct list_head list;\n\tunsigned int cons;\n\tunsigned int len;\n\tchar msg[0];\n};\n\nstruct readahead_control {\n\tstruct file *file;\n\tstruct address_space *mapping;\n\tstruct file_ra_state *ra;\n\tlong unsigned int _index;\n\tunsigned int _nr_pages;\n\tunsigned int _batch_count;\n\tbool _workingset;\n\tlong unsigned int _pflags;\n};\n\nstruct readdir_callback {\n\tstruct dir_context ctx;\n\tstruct old_linux_dirent *dirent;\n\tint result;\n};\n\nstruct real_mode_header {\n\tu32 text_start;\n\tu32 ro_end;\n\tu32 trampoline_start;\n\tu32 trampoline_header;\n\tu32 sev_es_trampoline_start;\n\tu32 trampoline_start64;\n\tu32 trampoline_pgd;\n\tu32 wakeup_start;\n\tu32 wakeup_header;\n\tu32 machine_real_restart_asm;\n\tu32 machine_real_restart_seg;\n};\n\nstruct virtnet_rq_stats {\n\tstruct u64_stats_sync syncp;\n\tu64_stats_t packets;\n\tu64_stats_t bytes;\n\tu64_stats_t drops;\n\tu64_stats_t xdp_packets;\n\tu64_stats_t xdp_tx;\n\tu64_stats_t xdp_redirects;\n\tu64_stats_t xdp_drops;\n\tu64_stats_t kicks;\n};\n\nstruct virtnet_interrupt_coalesce {\n\tu32 max_packets;\n\tu32 max_usecs;\n};\n\nstruct virtnet_rq_dma;\n\nstruct receive_queue {\n\tstruct virtqueue *vq;\n\tstruct napi_struct napi;\n\tstruct bpf_prog *xdp_prog;\n\tstruct virtnet_rq_stats stats;\n\tu16 calls;\n\tbool dim_enabled;\n\tstruct mutex dim_lock;\n\tstruct dim dim;\n\tu32 packets_in_napi;\n\tstruct virtnet_interrupt_coalesce intr_coal;\n\tstruct page *pages;\n\tstruct ewma_pkt_len mrg_avg_pkt_len;\n\tstruct page_frag alloc_frag;\n\tstruct scatterlist sg[19];\n\tunsigned int min_buf_len;\n\tchar name[16];\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tstruct xdp_rxq_info xdp_rxq;\n\tstruct virtnet_rq_dma *last_dma;\n\tstruct xsk_buff_pool *xsk_pool;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tstruct xdp_rxq_info xsk_rxq_info;\n\tstruct xdp_buff **xsk_buffs;\n\tbool do_dma;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct reciprocal_value_adv {\n\tu32 m;\n\tu8 sh;\n\tu8 exp;\n\tbool is_wide_m;\n};\n\nstruct reclaim_stat {\n\tunsigned int nr_dirty;\n\tunsigned int nr_unqueued_dirty;\n\tunsigned int nr_congested;\n\tunsigned int nr_writeback;\n\tunsigned int nr_immediate;\n\tunsigned int nr_pageout;\n\tunsigned int nr_activate[2];\n\tunsigned int nr_ref_keep;\n\tunsigned int nr_unmap_fail;\n\tunsigned int nr_lazyfree_fail;\n};\n\nstruct reclaim_state {\n\tlong unsigned int reclaimed;\n\tstruct lru_gen_mm_walk *mm_walk;\n};\n\nstruct recovery_info {\n\ttid_t start_transaction;\n\ttid_t end_transaction;\n\tlong unsigned int head_block;\n\tint nr_replays;\n\tint nr_revokes;\n\tint nr_revoke_hits;\n};\n\nstruct reg_default {\n\tunsigned int reg;\n\tunsigned int def;\n};\n\nstruct reg_field {\n\tunsigned int reg;\n\tunsigned int lsb;\n\tunsigned int msb;\n\tunsigned int id_size;\n\tunsigned int id_offset;\n};\n\nstruct reg_genl_event {\n\tchar reg_name[32];\n\tuint64_t event;\n};\n\nstruct reg_sequence {\n\tunsigned int reg;\n\tunsigned int def;\n\tunsigned int delay_us;\n};\n\nstruct regcache_ops {\n\tconst char *name;\n\tenum regcache_type type;\n\tint (*init)(struct regmap *);\n\tint (*exit)(struct regmap *);\n\tvoid (*debugfs_init)(struct regmap *);\n\tint (*read)(struct regmap *, unsigned int, unsigned int *);\n\tint (*write)(struct regmap *, unsigned int, unsigned int);\n\tint (*sync)(struct regmap *, unsigned int, unsigned int);\n\tint (*drop)(struct regmap *, unsigned int, unsigned int);\n};\n\nstruct regcache_rbtree_node;\n\nstruct regcache_rbtree_ctx {\n\tstruct rb_root root;\n\tstruct regcache_rbtree_node *cached_rbnode;\n};\n\nstruct regcache_rbtree_node {\n\tvoid *block;\n\tlong unsigned int *cache_present;\n\tunsigned int base_reg;\n\tunsigned int blklen;\n\tstruct rb_node node;\n};\n\ntypedef int (*regex_match_func)(char *, struct regex *, int);\n\nstruct regex {\n\tchar pattern[256];\n\tint len;\n\tint field_len;\n\tregex_match_func match;\n};\n\nstruct region {\n\tunsigned int start;\n\tunsigned int off;\n\tunsigned int group_len;\n\tunsigned int end;\n\tunsigned int nbits;\n};\n\nstruct region_devres {\n\tstruct resource *parent;\n\tresource_size_t start;\n\tresource_size_t n;\n};\n\ntypedef void (*regmap_lock)(void *);\n\ntypedef void (*regmap_unlock)(void *);\n\nstruct regmap_format {\n\tsize_t buf_size;\n\tsize_t reg_bytes;\n\tsize_t pad_bytes;\n\tsize_t val_bytes;\n\ts8 reg_shift;\n\tvoid (*format_write)(struct regmap *, unsigned int, unsigned int);\n\tvoid (*format_reg)(void *, unsigned int, unsigned int);\n\tvoid (*format_val)(void *, unsigned int, unsigned int);\n\tunsigned int (*parse_val)(const void *);\n\tvoid (*parse_inplace)(void *);\n};\n\nstruct regmap_bus;\n\nstruct regmap_access_table;\n\nstruct regmap {\n\tunion {\n\t\tstruct mutex mutex;\n\t\tstruct {\n\t\t\tspinlock_t spinlock;\n\t\t\tlong unsigned int spinlock_flags;\n\t\t};\n\t\tstruct {\n\t\t\traw_spinlock_t raw_spinlock;\n\t\t\tlong unsigned int raw_spinlock_flags;\n\t\t};\n\t};\n\tstruct lock_class_key *lock_key;\n\tregmap_lock lock;\n\tregmap_unlock unlock;\n\tvoid *lock_arg;\n\tgfp_t alloc_flags;\n\tunsigned int reg_base;\n\tstruct device *dev;\n\tvoid *work_buf;\n\tstruct regmap_format format;\n\tconst struct regmap_bus *bus;\n\tvoid *bus_context;\n\tconst char *name;\n\tbool async;\n\tspinlock_t async_lock;\n\twait_queue_head_t async_waitq;\n\tstruct list_head async_list;\n\tstruct list_head async_free;\n\tint async_ret;\n\tbool debugfs_disable;\n\tstruct dentry *debugfs;\n\tconst char *debugfs_name;\n\tunsigned int debugfs_reg_len;\n\tunsigned int debugfs_val_len;\n\tunsigned int debugfs_tot_len;\n\tstruct list_head debugfs_off_cache;\n\tstruct mutex cache_lock;\n\tunsigned int max_register;\n\tbool max_register_is_set;\n\tbool (*writeable_reg)(struct device *, unsigned int);\n\tbool (*readable_reg)(struct device *, unsigned int);\n\tbool (*volatile_reg)(struct device *, unsigned int);\n\tbool (*precious_reg)(struct device *, unsigned int);\n\tbool (*writeable_noinc_reg)(struct device *, unsigned int);\n\tbool (*readable_noinc_reg)(struct device *, unsigned int);\n\tconst struct regmap_access_table *wr_table;\n\tconst struct regmap_access_table *rd_table;\n\tconst struct regmap_access_table *volatile_table;\n\tconst struct regmap_access_table *precious_table;\n\tconst struct regmap_access_table *wr_noinc_table;\n\tconst struct regmap_access_table *rd_noinc_table;\n\tint (*reg_read)(void *, unsigned int, unsigned int *);\n\tint (*reg_write)(void *, unsigned int, unsigned int);\n\tint (*reg_update_bits)(void *, unsigned int, unsigned int, unsigned int);\n\tint (*read)(void *, const void *, size_t, void *, size_t);\n\tint (*write)(void *, const void *, size_t);\n\tbool defer_caching;\n\tlong unsigned int read_flag_mask;\n\tlong unsigned int write_flag_mask;\n\tint reg_shift;\n\tint reg_stride;\n\tint reg_stride_order;\n\tbool force_write_field;\n\tconst struct regcache_ops *cache_ops;\n\tenum regcache_type cache_type;\n\tunsigned int cache_size_raw;\n\tunsigned int cache_word_size;\n\tunsigned int num_reg_defaults;\n\tunsigned int num_reg_defaults_raw;\n\tbool cache_only;\n\tbool cache_bypass;\n\tbool cache_free;\n\tstruct reg_default *reg_defaults;\n\tconst void *reg_defaults_raw;\n\tvoid *cache;\n\tbool cache_dirty;\n\tbool no_sync_defaults;\n\tstruct reg_sequence *patch;\n\tint patch_regs;\n\tbool use_single_read;\n\tbool use_single_write;\n\tbool can_multi_write;\n\tsize_t max_raw_read;\n\tsize_t max_raw_write;\n\tstruct rb_root range_tree;\n\tvoid *selector_work_buf;\n\tstruct hwspinlock *hwlock;\n\tbool can_sleep;\n};\n\nstruct regmap_range;\n\nstruct regmap_access_table {\n\tconst struct regmap_range *yes_ranges;\n\tunsigned int n_yes_ranges;\n\tconst struct regmap_range *no_ranges;\n\tunsigned int n_no_ranges;\n};\n\nstruct regmap_async {\n\tstruct list_head list;\n\tstruct regmap *map;\n\tvoid *work_buf;\n};\n\nstruct spi_message {\n\tstruct list_head transfers;\n\tstruct spi_device *spi;\n\tbool pre_optimized;\n\tbool optimized;\n\tbool prepared;\n\tint status;\n\tvoid (*complete)(void *);\n\tvoid *context;\n\tunsigned int frame_length;\n\tunsigned int actual_length;\n\tstruct list_head queue;\n\tvoid *state;\n\tvoid *opt_state;\n\tstruct list_head resources;\n};\n\nstruct spi_delay {\n\tu16 value;\n\tu8 unit;\n};\n\nstruct spi_transfer {\n\tconst void *tx_buf;\n\tvoid *rx_buf;\n\tunsigned int len;\n\tu16 error;\n\tbool tx_sg_mapped;\n\tbool rx_sg_mapped;\n\tstruct sg_table tx_sg;\n\tstruct sg_table rx_sg;\n\tdma_addr_t tx_dma;\n\tdma_addr_t rx_dma;\n\tunsigned int dummy_data: 1;\n\tunsigned int cs_off: 1;\n\tunsigned int cs_change: 1;\n\tunsigned int tx_nbits: 4;\n\tunsigned int rx_nbits: 4;\n\tunsigned int timestamped: 1;\n\tu8 bits_per_word;\n\tstruct spi_delay delay;\n\tstruct spi_delay cs_change_delay;\n\tstruct spi_delay word_delay;\n\tu32 speed_hz;\n\tu32 effective_speed_hz;\n\tunsigned int ptp_sts_word_pre;\n\tunsigned int ptp_sts_word_post;\n\tstruct ptp_system_timestamp *ptp_sts;\n\tstruct list_head transfer_list;\n};\n\nstruct regmap_async_spi {\n\tstruct regmap_async core;\n\tstruct spi_message m;\n\tstruct spi_transfer t[2];\n};\n\ntypedef int (*regmap_hw_write)(void *, const void *, size_t);\n\ntypedef int (*regmap_hw_gather_write)(void *, const void *, size_t, const void *, size_t);\n\ntypedef int (*regmap_hw_async_write)(void *, const void *, size_t, const void *, size_t, struct regmap_async *);\n\ntypedef int (*regmap_hw_reg_write)(void *, unsigned int, unsigned int);\n\ntypedef int (*regmap_hw_reg_noinc_write)(void *, unsigned int, const void *, size_t);\n\ntypedef int (*regmap_hw_reg_update_bits)(void *, unsigned int, unsigned int, unsigned int);\n\ntypedef int (*regmap_hw_read)(void *, const void *, size_t, void *, size_t);\n\ntypedef int (*regmap_hw_reg_read)(void *, unsigned int, unsigned int *);\n\ntypedef int (*regmap_hw_reg_noinc_read)(void *, unsigned int, void *, size_t);\n\ntypedef void (*regmap_hw_free_context)(void *);\n\ntypedef struct regmap_async * (*regmap_hw_async_alloc)(void);\n\nstruct regmap_bus {\n\tbool fast_io;\n\tbool free_on_exit;\n\tregmap_hw_write write;\n\tregmap_hw_gather_write gather_write;\n\tregmap_hw_async_write async_write;\n\tregmap_hw_reg_write reg_write;\n\tregmap_hw_reg_noinc_write reg_noinc_write;\n\tregmap_hw_reg_update_bits reg_update_bits;\n\tregmap_hw_read read;\n\tregmap_hw_reg_read reg_read;\n\tregmap_hw_reg_noinc_read reg_noinc_read;\n\tregmap_hw_free_context free_context;\n\tregmap_hw_async_alloc async_alloc;\n\tu8 read_flag_mask;\n\tenum regmap_endian reg_format_endian_default;\n\tenum regmap_endian val_format_endian_default;\n\tsize_t max_raw_read;\n\tsize_t max_raw_write;\n};\n\nstruct regmap_range_cfg;\n\nstruct regmap_config {\n\tconst char *name;\n\tint reg_bits;\n\tint reg_stride;\n\tint reg_shift;\n\tunsigned int reg_base;\n\tint pad_bits;\n\tint val_bits;\n\tbool (*writeable_reg)(struct device *, unsigned int);\n\tbool (*readable_reg)(struct device *, unsigned int);\n\tbool (*volatile_reg)(struct device *, unsigned int);\n\tbool (*precious_reg)(struct device *, unsigned int);\n\tbool (*writeable_noinc_reg)(struct device *, unsigned int);\n\tbool (*readable_noinc_reg)(struct device *, unsigned int);\n\tint (*reg_read)(void *, unsigned int, unsigned int *);\n\tint (*reg_write)(void *, unsigned int, unsigned int);\n\tint (*reg_update_bits)(void *, unsigned int, unsigned int, unsigned int);\n\tint (*read)(void *, const void *, size_t, void *, size_t);\n\tint (*write)(void *, const void *, size_t);\n\tsize_t max_raw_read;\n\tsize_t max_raw_write;\n\tbool can_sleep;\n\tbool fast_io;\n\tbool io_port;\n\tbool disable_locking;\n\tregmap_lock lock;\n\tregmap_unlock unlock;\n\tvoid *lock_arg;\n\tunsigned int max_register;\n\tbool max_register_is_0;\n\tconst struct regmap_access_table *wr_table;\n\tconst struct regmap_access_table *rd_table;\n\tconst struct regmap_access_table *volatile_table;\n\tconst struct regmap_access_table *precious_table;\n\tconst struct regmap_access_table *wr_noinc_table;\n\tconst struct regmap_access_table *rd_noinc_table;\n\tconst struct reg_default *reg_defaults;\n\tunsigned int num_reg_defaults;\n\tenum regcache_type cache_type;\n\tconst void *reg_defaults_raw;\n\tunsigned int num_reg_defaults_raw;\n\tlong unsigned int read_flag_mask;\n\tlong unsigned int write_flag_mask;\n\tbool zero_flag_mask;\n\tbool use_single_read;\n\tbool use_single_write;\n\tbool use_relaxed_mmio;\n\tbool can_multi_write;\n\tbool use_hwlock;\n\tbool use_raw_spinlock;\n\tunsigned int hwlock_id;\n\tunsigned int hwlock_mode;\n\tenum regmap_endian reg_format_endian;\n\tenum regmap_endian val_format_endian;\n\tconst struct regmap_range_cfg *ranges;\n\tunsigned int num_ranges;\n};\n\nstruct regmap_debugfs_node {\n\tstruct regmap *map;\n\tstruct list_head link;\n};\n\nstruct regmap_debugfs_off_cache {\n\tstruct list_head list;\n\toff_t min;\n\toff_t max;\n\tunsigned int base_reg;\n\tunsigned int max_reg;\n};\n\nstruct regmap_field {\n\tstruct regmap *regmap;\n\tunsigned int mask;\n\tunsigned int shift;\n\tunsigned int reg;\n\tunsigned int id_size;\n\tunsigned int id_offset;\n};\n\nstruct regmap_irq_type {\n\tunsigned int type_reg_offset;\n\tunsigned int type_reg_mask;\n\tunsigned int type_rising_val;\n\tunsigned int type_falling_val;\n\tunsigned int type_level_low_val;\n\tunsigned int type_level_high_val;\n\tunsigned int types_supported;\n};\n\nstruct regmap_irq {\n\tunsigned int reg_offset;\n\tunsigned int mask;\n\tstruct regmap_irq_type type;\n};\n\nstruct regmap_irq_sub_irq_map;\n\nstruct regmap_irq_chip {\n\tconst char *name;\n\tconst char *domain_suffix;\n\tunsigned int main_status;\n\tunsigned int num_main_status_bits;\n\tconst struct regmap_irq_sub_irq_map *sub_reg_offsets;\n\tint num_main_regs;\n\tunsigned int status_base;\n\tunsigned int mask_base;\n\tunsigned int unmask_base;\n\tunsigned int ack_base;\n\tunsigned int wake_base;\n\tconst unsigned int *config_base;\n\tunsigned int irq_reg_stride;\n\tunsigned int init_ack_masked: 1;\n\tunsigned int mask_unmask_non_inverted: 1;\n\tunsigned int use_ack: 1;\n\tunsigned int ack_invert: 1;\n\tunsigned int clear_ack: 1;\n\tunsigned int status_invert: 1;\n\tunsigned int wake_invert: 1;\n\tunsigned int type_in_mask: 1;\n\tunsigned int clear_on_unmask: 1;\n\tunsigned int runtime_pm: 1;\n\tunsigned int no_status: 1;\n\tint num_regs;\n\tconst struct regmap_irq *irqs;\n\tint num_irqs;\n\tint num_config_bases;\n\tint num_config_regs;\n\tint (*handle_pre_irq)(void *);\n\tint (*handle_post_irq)(void *);\n\tint (*handle_mask_sync)(int, unsigned int, unsigned int, void *);\n\tint (*set_type_config)(unsigned int **, unsigned int, const struct regmap_irq *, int, void *);\n\tunsigned int (*get_irq_reg)(struct regmap_irq_chip_data *, unsigned int, int);\n\tvoid *irq_drv_data;\n};\n\nstruct regmap_irq_chip_data {\n\tstruct mutex lock;\n\tstruct irq_chip irq_chip;\n\tstruct regmap *map;\n\tconst struct regmap_irq_chip *chip;\n\tint irq_base;\n\tstruct irq_domain *domain;\n\tint irq;\n\tint wake_count;\n\tvoid *status_reg_buf;\n\tunsigned int *main_status_buf;\n\tunsigned int *status_buf;\n\tunsigned int *mask_buf;\n\tunsigned int *mask_buf_def;\n\tunsigned int *wake_buf;\n\tunsigned int *type_buf;\n\tunsigned int *type_buf_def;\n\tunsigned int **config_buf;\n\tunsigned int irq_reg_stride;\n\tunsigned int (*get_irq_reg)(struct regmap_irq_chip_data *, unsigned int, int);\n\tunsigned int clear_status: 1;\n};\n\nstruct regmap_irq_sub_irq_map {\n\tunsigned int num_regs;\n\tunsigned int *offset;\n};\n\nstruct regmap_mmio_context {\n\tvoid *regs;\n\tunsigned int val_bytes;\n\tbool big_endian;\n\tbool attached_clk;\n\tstruct clk *clk;\n\tvoid (*reg_write)(struct regmap_mmio_context *, unsigned int, unsigned int);\n\tunsigned int (*reg_read)(struct regmap_mmio_context *, unsigned int);\n};\n\nstruct regmap_range {\n\tunsigned int range_min;\n\tunsigned int range_max;\n};\n\nstruct regmap_range_cfg {\n\tconst char *name;\n\tunsigned int range_min;\n\tunsigned int range_max;\n\tunsigned int selector_reg;\n\tunsigned int selector_mask;\n\tint selector_shift;\n\tunsigned int window_start;\n\tunsigned int window_len;\n};\n\nstruct regmap_range_node {\n\tstruct rb_node node;\n\tconst char *name;\n\tstruct regmap *map;\n\tunsigned int range_min;\n\tunsigned int range_max;\n\tunsigned int selector_reg;\n\tunsigned int selector_mask;\n\tint selector_shift;\n\tunsigned int window_start;\n\tunsigned int window_len;\n};\n\nstruct regulator_voltage {\n\tint min_uV;\n\tint max_uV;\n};\n\nstruct regulator {\n\tstruct device *dev;\n\tstruct list_head list;\n\tunsigned int always_on: 1;\n\tunsigned int bypass: 1;\n\tunsigned int device_link: 1;\n\tint uA_load;\n\tunsigned int enable_count;\n\tunsigned int deferred_disables;\n\tstruct regulator_voltage voltage[5];\n\tconst char *supply_name;\n\tstruct device_attribute dev_attr;\n\tstruct regulator_dev *rdev;\n\tstruct dentry *debugfs;\n};\n\nstruct regulator_bulk_devres {\n\tstruct regulator_bulk_data *consumers;\n\tint num_consumers;\n};\n\nstruct regulator_config {\n\tstruct device *dev;\n\tconst struct regulator_init_data *init_data;\n\tvoid *driver_data;\n\tstruct device_node *of_node;\n\tstruct regmap *regmap;\n\tstruct gpio_desc *ena_gpiod;\n};\n\nstruct regulator_consumer_supply {\n\tconst char *dev_name;\n\tconst char *supply;\n};\n\nstruct regulator_coupler {\n\tstruct list_head list;\n\tint (*attach_regulator)(struct regulator_coupler *, struct regulator_dev *);\n\tint (*detach_regulator)(struct regulator_coupler *, struct regulator_dev *);\n\tint (*balance_voltage)(struct regulator_coupler *, struct regulator_dev *, suspend_state_t);\n};\n\nstruct regulator_enable_gpio;\n\nstruct regulator_dev {\n\tconst struct regulator_desc *desc;\n\tint exclusive;\n\tu32 use_count;\n\tu32 open_count;\n\tu32 bypass_count;\n\tstruct list_head list;\n\tstruct list_head consumer_list;\n\tstruct coupling_desc coupling_desc;\n\tstruct blocking_notifier_head notifier;\n\tstruct ww_mutex mutex;\n\tstruct task_struct *mutex_owner;\n\tint ref_cnt;\n\tstruct module *owner;\n\tstruct device dev;\n\tstruct regulation_constraints *constraints;\n\tstruct regulator *supply;\n\tconst char *supply_name;\n\tstruct regmap *regmap;\n\tstruct delayed_work disable_work;\n\tvoid *reg_data;\n\tstruct dentry *debugfs;\n\tstruct regulator_enable_gpio *ena_pin;\n\tunsigned int ena_gpio_state: 1;\n\tunsigned int is_switch: 1;\n\tktime_t last_off;\n\tint cached_err;\n\tbool use_cached_err;\n\tspinlock_t err_lock;\n};\n\nstruct regulator_enable_gpio {\n\tstruct list_head list;\n\tstruct gpio_desc *gpiod;\n\tu32 enable_count;\n\tu32 request_count;\n};\n\nstruct regulator_err_state {\n\tstruct regulator_dev *rdev;\n\tlong unsigned int notifs;\n\tlong unsigned int errors;\n\tint possible_errs;\n};\n\nstruct regulator_irq_data {\n\tstruct regulator_err_state *states;\n\tint num_states;\n\tvoid *data;\n\tlong int opaque;\n};\n\nstruct regulator_irq_desc {\n\tconst char *name;\n\tint fatal_cnt;\n\tint reread_ms;\n\tint irq_off_ms;\n\tbool skip_off;\n\tbool high_prio;\n\tvoid *data;\n\tint (*die)(struct regulator_irq_data *);\n\tint (*map_event)(int, struct regulator_irq_data *, long unsigned int *);\n\tint (*renable)(struct regulator_irq_data *);\n};\n\nstruct regulator_irq {\n\tstruct regulator_irq_data rdata;\n\tstruct regulator_irq_desc desc;\n\tint irq;\n\tint retry_cnt;\n\tstruct delayed_work isr_work;\n};\n\nstruct regulator_map {\n\tstruct list_head list;\n\tconst char *dev_name;\n\tconst char *supply;\n\tstruct regulator_dev *regulator;\n};\n\nstruct regulator_notifier_match {\n\tstruct regulator *regulator;\n\tstruct notifier_block *nb;\n};\n\nstruct regulator_ops {\n\tint (*list_voltage)(struct regulator_dev *, unsigned int);\n\tint (*set_voltage)(struct regulator_dev *, int, int, unsigned int *);\n\tint (*map_voltage)(struct regulator_dev *, int, int);\n\tint (*set_voltage_sel)(struct regulator_dev *, unsigned int);\n\tint (*get_voltage)(struct regulator_dev *);\n\tint (*get_voltage_sel)(struct regulator_dev *);\n\tint (*set_current_limit)(struct regulator_dev *, int, int);\n\tint (*get_current_limit)(struct regulator_dev *);\n\tint (*set_input_current_limit)(struct regulator_dev *, int);\n\tint (*set_over_current_protection)(struct regulator_dev *, int, int, bool);\n\tint (*set_over_voltage_protection)(struct regulator_dev *, int, int, bool);\n\tint (*set_under_voltage_protection)(struct regulator_dev *, int, int, bool);\n\tint (*set_thermal_protection)(struct regulator_dev *, int, int, bool);\n\tint (*set_active_discharge)(struct regulator_dev *, bool);\n\tint (*enable)(struct regulator_dev *);\n\tint (*disable)(struct regulator_dev *);\n\tint (*is_enabled)(struct regulator_dev *);\n\tint (*set_mode)(struct regulator_dev *, unsigned int);\n\tunsigned int (*get_mode)(struct regulator_dev *);\n\tint (*get_error_flags)(struct regulator_dev *, unsigned int *);\n\tint (*enable_time)(struct regulator_dev *);\n\tint (*set_ramp_delay)(struct regulator_dev *, int);\n\tint (*set_voltage_time)(struct regulator_dev *, int, int);\n\tint (*set_voltage_time_sel)(struct regulator_dev *, unsigned int, unsigned int);\n\tint (*set_soft_start)(struct regulator_dev *);\n\tint (*get_status)(struct regulator_dev *);\n\tunsigned int (*get_optimum_mode)(struct regulator_dev *, int, int, int);\n\tint (*set_load)(struct regulator_dev *, int);\n\tint (*set_bypass)(struct regulator_dev *, bool);\n\tint (*get_bypass)(struct regulator_dev *, bool *);\n\tint (*set_suspend_voltage)(struct regulator_dev *, int);\n\tint (*set_suspend_enable)(struct regulator_dev *);\n\tint (*set_suspend_disable)(struct regulator_dev *);\n\tint (*set_suspend_mode)(struct regulator_dev *, unsigned int);\n\tint (*resume)(struct regulator_dev *);\n\tint (*set_pull_down)(struct regulator_dev *);\n};\n\nstruct regulator_supply_alias {\n\tstruct list_head list;\n\tstruct device *src_dev;\n\tconst char *src_supply;\n\tstruct device *alias_dev;\n\tconst char *alias_supply;\n};\n\nstruct regulator_supply_alias_match {\n\tstruct device *dev;\n\tconst char *id;\n};\n\nstruct regulatory_request {\n\tstruct callback_head callback_head;\n\tint wiphy_idx;\n\tenum nl80211_reg_initiator initiator;\n\tenum nl80211_user_reg_hint_type user_reg_hint_type;\n\tchar alpha2[3];\n\tenum nl80211_dfs_regions dfs_region;\n\tbool intersect;\n\tbool processed;\n\tenum environment_cap country_ie_env;\n\tstruct list_head list;\n};\n\nstruct remap_data {\n\txen_pfn_t *pfn;\n\tbool contiguous;\n\tbool no_translate;\n\tpgprot_t prot;\n\tstruct mmu_update *mmu_update;\n};\n\nstruct xen_remap_gfn_info;\n\nstruct remap_data___2 {\n\txen_pfn_t *fgfn;\n\tint nr_fgfn;\n\tpgprot_t prot;\n\tdomid_t domid;\n\tstruct vm_area_struct *vma;\n\tint index;\n\tstruct page **pages;\n\tstruct xen_remap_gfn_info *info;\n\tint *err_ptr;\n\tint mapped;\n\tint h_errs[1];\n\txen_ulong_t h_idxs[1];\n\txen_pfn_t h_gpfns[1];\n\tint h_iter;\n};\n\nstruct remap_pfn {\n\tstruct mm_struct *mm;\n\tstruct page **pages;\n\tpgprot_t prot;\n\tlong unsigned int i;\n};\n\nstruct remap_trace {\n\tstruct list_head list;\n\tstruct kmmio_probe probe;\n\tresource_size_t phys;\n\tlong unsigned int id;\n};\n\ntypedef int (*remote_function_f)(void *);\n\nstruct remote_function_call {\n\tstruct task_struct *p;\n\tremote_function_f func;\n\tvoid *info;\n\tint ret;\n};\n\nstruct remote_output {\n\tstruct perf_buffer *rb;\n\tint err;\n};\n\nstruct renamedata {\n\tstruct mnt_idmap *old_mnt_idmap;\n\tstruct inode *old_dir;\n\tstruct dentry *old_dentry;\n\tstruct mnt_idmap *new_mnt_idmap;\n\tstruct inode *new_dir;\n\tstruct dentry *new_dentry;\n\tstruct inode **delegated_inode;\n\tunsigned int flags;\n};\n\nstruct repcodes_s {\n\tU32 rep[3];\n};\n\ntypedef struct repcodes_s repcodes_t;\n\nstruct reply_func {\n\tint type;\n\tint (*cb)(struct net_device *, struct nlmsghdr *, u32, struct nlattr **, struct sk_buff *);\n};\n\nstruct req {\n\tstruct req *next;\n\tstruct completion done;\n\tint err;\n\tconst char *name;\n\tumode_t mode;\n\tkuid_t uid;\n\tkgid_t gid;\n\tstruct device *dev;\n};\n\nstruct req_iterator {\n\tstruct bvec_iter iter;\n\tstruct bio *bio;\n};\n\ntypedef enum rq_end_io_ret rq_end_io_fn(struct request *, blk_status_t);\n\nstruct request {\n\tstruct request_queue *q;\n\tstruct blk_mq_ctx *mq_ctx;\n\tstruct blk_mq_hw_ctx *mq_hctx;\n\tblk_opf_t cmd_flags;\n\treq_flags_t rq_flags;\n\tint tag;\n\tint internal_tag;\n\tunsigned int timeout;\n\tunsigned int __data_len;\n\tsector_t __sector;\n\tstruct bio *bio;\n\tstruct bio *biotail;\n\tunion {\n\t\tstruct list_head queuelist;\n\t\tstruct request *rq_next;\n\t};\n\tstruct block_device *part;\n\tu64 alloc_time_ns;\n\tu64 start_time_ns;\n\tu64 io_start_time_ns;\n\tshort unsigned int wbt_flags;\n\tshort unsigned int stats_sectors;\n\tshort unsigned int nr_phys_segments;\n\tshort unsigned int nr_integrity_segments;\n\tstruct bio_crypt_ctx *crypt_ctx;\n\tstruct blk_crypto_keyslot *crypt_keyslot;\n\tenum rw_hint write_hint;\n\tshort unsigned int ioprio;\n\tenum mq_rq_state state;\n\tatomic_t ref;\n\tlong unsigned int deadline;\n\tunion {\n\t\tstruct hlist_node hash;\n\t\tstruct llist_node ipi_list;\n\t};\n\tunion {\n\t\tstruct rb_node rb_node;\n\t\tstruct bio_vec special_vec;\n\t};\n\tstruct {\n\t\tstruct io_cq *icq;\n\t\tvoid *priv[2];\n\t} elv;\n\tstruct {\n\t\tunsigned int seq;\n\t\trq_end_io_fn *saved_end_io;\n\t} flush;\n\tu64 fifo_time;\n\trq_end_io_fn *end_io;\n\tvoid *end_io_data;\n};\n\nstruct request_key_auth {\n\tstruct callback_head rcu;\n\tstruct key *target_key;\n\tstruct key *dest_keyring;\n\tconst struct cred *cred;\n\tvoid *callout_info;\n\tsize_t callout_len;\n\tpid_t pid;\n\tchar op[8];\n};\n\nstruct throtl_data;\n\nstruct request_queue {\n\tvoid *queuedata;\n\tstruct elevator_queue *elevator;\n\tconst struct blk_mq_ops *mq_ops;\n\tstruct blk_mq_ctx *queue_ctx;\n\tlong unsigned int queue_flags;\n\tunsigned int rq_timeout;\n\tunsigned int queue_depth;\n\trefcount_t refs;\n\tunsigned int nr_hw_queues;\n\tstruct xarray hctx_table;\n\tstruct percpu_ref q_usage_counter;\n\tstruct lock_class_key io_lock_cls_key;\n\tstruct lockdep_map io_lockdep_map;\n\tstruct lock_class_key q_lock_cls_key;\n\tstruct lockdep_map q_lockdep_map;\n\tstruct request *last_merge;\n\tspinlock_t queue_lock;\n\tint quiesce_depth;\n\tstruct gendisk *disk;\n\tstruct kobject *mq_kobj;\n\tstruct queue_limits limits;\n\tstruct device *dev;\n\tenum rpm_status rpm_status;\n\tatomic_t pm_only;\n\tstruct blk_queue_stats *stats;\n\tstruct rq_qos *rq_qos;\n\tstruct mutex rq_qos_mutex;\n\tint id;\n\tlong unsigned int nr_requests;\n\tstruct blk_crypto_profile *crypto_profile;\n\tstruct kobject *crypto_kobject;\n\tstruct timer_list timeout;\n\tstruct work_struct timeout_work;\n\tatomic_t nr_active_requests_shared_tags;\n\tstruct blk_mq_tags *sched_shared_tags;\n\tstruct list_head icq_list;\n\tlong unsigned int blkcg_pols[1];\n\tstruct blkcg_gq *root_blkg;\n\tstruct list_head blkg_list;\n\tstruct mutex blkcg_mutex;\n\tint node;\n\tspinlock_t requeue_lock;\n\tstruct list_head requeue_list;\n\tstruct delayed_work requeue_work;\n\tstruct blk_trace *blk_trace;\n\tstruct blk_flush_queue *fq;\n\tstruct list_head flush_list;\n\tstruct mutex sysfs_lock;\n\tstruct mutex sysfs_dir_lock;\n\tstruct mutex limits_lock;\n\tstruct list_head unused_hctx_list;\n\tspinlock_t unused_hctx_lock;\n\tint mq_freeze_depth;\n\tstruct throtl_data *td;\n\tstruct callback_head callback_head;\n\twait_queue_head_t mq_freeze_wq;\n\tstruct mutex mq_freeze_lock;\n\tstruct blk_mq_tag_set *tag_set;\n\tstruct list_head tag_set_list;\n\tstruct dentry *debugfs_dir;\n\tstruct dentry *sched_debugfs_dir;\n\tstruct dentry *rqos_debugfs_dir;\n\tstruct mutex debugfs_mutex;\n\tbool mq_sysfs_init_done;\n};\n\nstruct request_sense {\n\t__u8 error_code: 7;\n\t__u8 valid: 1;\n\t__u8 segment_number;\n\t__u8 sense_key: 4;\n\t__u8 reserved2: 1;\n\t__u8 ili: 1;\n\t__u8 reserved1: 2;\n\t__u8 information[4];\n\t__u8 add_sense_len;\n\t__u8 command_info[4];\n\t__u8 asc;\n\t__u8 ascq;\n\t__u8 fruc;\n\t__u8 sks[3];\n\t__u8 asb[46];\n};\n\nstruct request_sock__safe_rcu_or_null {\n\tstruct sock *sk;\n};\n\nstruct request_sock_ops {\n\tint family;\n\tunsigned int obj_size;\n\tstruct kmem_cache *slab;\n\tchar *slab_name;\n\tint (*rtx_syn_ack)(const struct sock *, struct request_sock *);\n\tvoid (*send_ack)(const struct sock *, struct sk_buff *, struct request_sock *);\n\tvoid (*send_reset)(const struct sock *, struct sk_buff *, enum sk_rst_reason);\n\tvoid (*destructor)(struct request_sock *);\n\tvoid (*syn_ack_timeout)(const struct request_sock *);\n};\n\nstruct res_proc_context {\n\tstruct list_head *list;\n\tint (*preproc)(struct acpi_resource *, void *);\n\tvoid *preproc_data;\n\tint count;\n\tint error;\n};\n\nstruct resctrl_pqr_state {\n\tu32 cur_rmid;\n\tu32 cur_closid;\n\tu32 default_rmid;\n\tu32 default_closid;\n};\n\nstruct resctrl_schema {\n\tstruct list_head list;\n\tchar name[8];\n\tenum resctrl_conf_type conf_type;\n\tstruct rdt_resource *res;\n\tu32 num_closid;\n};\n\nstruct reserve_mem_table {\n\tchar name[16];\n\tphys_addr_t start;\n\tphys_addr_t size;\n};\n\nstruct reset_controller_dev;\n\nstruct reset_control {\n\tstruct reset_controller_dev *rcdev;\n\tstruct list_head list;\n\tunsigned int id;\n\tstruct kref refcnt;\n\tbool acquired;\n\tbool shared;\n\tbool array;\n\tatomic_t deassert_count;\n\tatomic_t triggered_count;\n};\n\nstruct reset_control_array {\n\tstruct reset_control base;\n\tunsigned int num_rstcs;\n\tstruct reset_control *rstc[0];\n};\n\nstruct reset_control_bulk_devres {\n\tint num_rstcs;\n\tstruct reset_control_bulk_data *rstcs;\n};\n\nstruct reset_control_lookup {\n\tstruct list_head list;\n\tconst char *provider;\n\tunsigned int index;\n\tconst char *dev_id;\n\tconst char *con_id;\n};\n\nstruct reset_control_ops {\n\tint (*reset)(struct reset_controller_dev *, long unsigned int);\n\tint (*assert)(struct reset_controller_dev *, long unsigned int);\n\tint (*deassert)(struct reset_controller_dev *, long unsigned int);\n\tint (*status)(struct reset_controller_dev *, long unsigned int);\n};\n\nstruct reset_controller_dev {\n\tconst struct reset_control_ops *ops;\n\tstruct module *owner;\n\tstruct list_head list;\n\tstruct list_head reset_control_head;\n\tstruct device *dev;\n\tstruct device_node *of_node;\n\tconst struct of_phandle_args *of_args;\n\tint of_reset_n_cells;\n\tint (*of_xlate)(struct reset_controller_dev *, const struct of_phandle_args *);\n\tunsigned int nr_resets;\n};\n\nstruct reset_gpio_lookup {\n\tstruct of_phandle_args of_args;\n\tstruct list_head list;\n};\n\nstruct reset_simple_data {\n\tspinlock_t lock;\n\tvoid *membase;\n\tstruct reset_controller_dev rcdev;\n\tbool active_low;\n\tbool status_active_low;\n\tunsigned int reset_us;\n};\n\nstruct reset_simple_devdata {\n\tu32 reg_offset;\n\tu32 nr_resets;\n\tbool active_low;\n\tbool status_active_low;\n};\n\nstruct residency_counts {\n\tu64 miss_before;\n\tu64 hits_before;\n\tu64 miss_after;\n\tu64 hits_after;\n};\n\ntypedef resource_size_t (*resource_alignf)(void *, const struct resource *, resource_size_t, resource_size_t);\n\nstruct resource_constraint {\n\tresource_size_t min;\n\tresource_size_t max;\n\tresource_size_t align;\n\tresource_alignf alignf;\n\tvoid *alignf_data;\n};\n\nstruct resource_entry {\n\tstruct list_head node;\n\tstruct resource *res;\n\tresource_size_t offset;\n\tstruct resource __res;\n};\n\nstruct resource_table {\n\tu32 ver;\n\tu32 num;\n\tu32 reserved[2];\n\tu32 offset[0];\n};\n\nstruct resource_win {\n\tstruct resource res;\n\tresource_size_t offset;\n};\n\nstruct restart_block {\n\tlong unsigned int arch_data;\n\tlong int (*fn)(struct restart_block *);\n\tunion {\n\t\tstruct {\n\t\t\tu32 *uaddr;\n\t\t\tu32 val;\n\t\t\tu32 flags;\n\t\t\tu32 bitset;\n\t\t\tu64 time;\n\t\t\tu32 *uaddr2;\n\t\t} futex;\n\t\tstruct {\n\t\t\tclockid_t clockid;\n\t\t\tenum timespec_type type;\n\t\t\tunion {\n\t\t\t\tstruct __kernel_timespec *rmtp;\n\t\t\t\tstruct old_timespec32 *compat_rmtp;\n\t\t\t};\n\t\t\tu64 expires;\n\t\t} nanosleep;\n\t\tstruct {\n\t\t\tstruct pollfd *ufds;\n\t\t\tint nfds;\n\t\t\tint has_timeout;\n\t\t\tlong unsigned int tv_sec;\n\t\t\tlong unsigned int tv_nsec;\n\t\t} poll;\n\t};\n};\n\nstruct restore_data_record {\n\tlong unsigned int jump_address;\n\tlong unsigned int jump_address_phys;\n\tlong unsigned int cr3;\n\tlong unsigned int magic;\n\tlong unsigned int e820_checksum;\n};\n\nstruct resume_performance_record {\n\tstruct fpdt_record_header header;\n\tu32 resume_count;\n\tu64 resume_prev;\n\tu64 resume_avg;\n};\n\nstruct resume_swap_area {\n\t__kernel_loff_t offset;\n\t__u32 dev;\n} __attribute__((packed));\n\nstruct resv_map {\n\tstruct kref refs;\n\tspinlock_t lock;\n\tstruct list_head regions;\n\tlong int adds_in_progress;\n\tstruct list_head region_cache;\n\tlong int region_cache_count;\n\tstruct rw_semaphore rw_sema;\n\tstruct page_counter *reservation_counter;\n\tlong unsigned int pages_per_hpage;\n\tstruct cgroup_subsys_state *css;\n};\n\nstruct rethook {\n\tvoid *data;\n\tvoid (*handler)(struct rethook_node *, void *, long unsigned int, struct pt_regs *);\n\tstruct objpool_head pool;\n\tstruct callback_head rcu;\n};\n\nstruct return_instance {\n\tstruct uprobe *uprobe;\n\tlong unsigned int func;\n\tlong unsigned int stack;\n\tlong unsigned int orig_ret_vaddr;\n\tbool chained;\n\tstruct return_instance *next;\n};\n\nstruct reuseport_array {\n\tstruct bpf_map map;\n\tstruct sock *ptrs[0];\n};\n\nstruct rfkill_ops;\n\nstruct rfkill {\n\tspinlock_t lock;\n\tenum rfkill_type type;\n\tlong unsigned int state;\n\tlong unsigned int hard_block_reasons;\n\tu32 idx;\n\tbool registered;\n\tbool persistent;\n\tbool polling_paused;\n\tbool suspended;\n\tbool need_sync;\n\tconst struct rfkill_ops *ops;\n\tvoid *data;\n\tstruct led_trigger led_trigger;\n\tconst char *ledtrigname;\n\tstruct device dev;\n\tstruct list_head node;\n\tstruct delayed_work poll_work;\n\tstruct work_struct uevent_work;\n\tstruct work_struct sync_work;\n\tchar name[0];\n};\n\nstruct rfkill_data {\n\tstruct list_head list;\n\tstruct list_head events;\n\tstruct mutex mtx;\n\twait_queue_head_t read_wait;\n\tbool input_handler;\n};\n\nstruct rfkill_event_ext {\n\t__u32 idx;\n\t__u8 type;\n\t__u8 op;\n\t__u8 soft;\n\t__u8 hard;\n\t__u8 hard_block_reasons;\n} __attribute__((packed));\n\nstruct rfkill_int_event {\n\tstruct list_head list;\n\tstruct rfkill_event_ext ev;\n};\n\nstruct rfkill_ops {\n\tvoid (*poll)(struct rfkill *, void *);\n\tvoid (*query)(struct rfkill *, void *);\n\tint (*set_block)(void *, bool);\n};\n\nstruct rftype {\n\tchar *name;\n\tumode_t mode;\n\tconst struct kernfs_ops *kf_ops;\n\tlong unsigned int flags;\n\tlong unsigned int fflags;\n\tint (*seq_show)(struct kernfs_open_file *, struct seq_file *, void *);\n\tssize_t (*write)(struct kernfs_open_file *, char *, size_t, loff_t);\n};\n\nstruct rgb {\n\tu8 r;\n\tu8 g;\n\tu8 b;\n};\n\nstruct rhash_lock_head {};\n\nstruct rhashtable_compare_arg {\n\tstruct rhashtable *ht;\n\tconst void *key;\n};\n\nstruct rid_data {\n\tstruct pci_dev *bridge;\n\tu32 rid;\n};\n\nstruct ring_buffer_event {\n\tu32 type_len: 5;\n\tu32 time_delta: 27;\n\tu32 array[0];\n};\n\nstruct ring_buffer_per_cpu;\n\nstruct ring_buffer_iter {\n\tstruct ring_buffer_per_cpu *cpu_buffer;\n\tlong unsigned int head;\n\tlong unsigned int next_event;\n\tstruct buffer_page *head_page;\n\tstruct buffer_page *cache_reader_page;\n\tlong unsigned int cache_read;\n\tlong unsigned int cache_pages_removed;\n\tu64 read_stamp;\n\tu64 page_stamp;\n\tstruct ring_buffer_event *event;\n\tsize_t event_size;\n\tint missed_events;\n};\n\nstruct trace_buffer_meta;\n\nstruct ring_buffer_per_cpu {\n\tint cpu;\n\tatomic_t record_disabled;\n\tatomic_t resize_disabled;\n\tstruct trace_buffer *buffer;\n\traw_spinlock_t reader_lock;\n\tarch_spinlock_t lock;\n\tstruct lock_class_key lock_key;\n\tstruct buffer_data_page *free_page;\n\tlong unsigned int nr_pages;\n\tunsigned int current_context;\n\tstruct list_head *pages;\n\tlong unsigned int cnt;\n\tstruct buffer_page *head_page;\n\tstruct buffer_page *tail_page;\n\tstruct buffer_page *commit_page;\n\tstruct buffer_page *reader_page;\n\tlong unsigned int lost_events;\n\tlong unsigned int last_overrun;\n\tlong unsigned int nest;\n\tlocal_t entries_bytes;\n\tlocal_t entries;\n\tlocal_t overrun;\n\tlocal_t commit_overrun;\n\tlocal_t dropped_events;\n\tlocal_t committing;\n\tlocal_t commits;\n\tlocal_t pages_touched;\n\tlocal_t pages_lost;\n\tlocal_t pages_read;\n\tlong int last_pages_touch;\n\tsize_t shortest_full;\n\tlong unsigned int read;\n\tlong unsigned int read_bytes;\n\trb_time_t write_stamp;\n\trb_time_t before_stamp;\n\tu64 event_stamp[5];\n\tu64 read_stamp;\n\tlong unsigned int pages_removed;\n\tunsigned int mapped;\n\tstruct mutex mapping_lock;\n\tlong unsigned int *subbuf_ids;\n\tstruct trace_buffer_meta *meta_page;\n\tlong int nr_pages_to_update;\n\tstruct list_head new_pages;\n\tstruct work_struct update_pages_work;\n\tstruct completion update_done;\n\tstruct rb_irq_work irq_work;\n};\n\nstruct rings_reply_data {\n\tstruct ethnl_reply_data base;\n\tstruct ethtool_ringparam ringparam;\n\tstruct kernel_ethtool_ringparam kernel_ringparam;\n\tu32 supported_ring_params;\n};\n\nstruct rio_mport;\n\nstruct rio_dbell {\n\tstruct list_head node;\n\tstruct resource *res;\n\tvoid (*dinb)(struct rio_mport *, void *, u16, u16, u16);\n\tvoid *dev_id;\n};\n\nstruct rio_switch_ops;\n\nstruct rio_dev;\n\nstruct rio_switch {\n\tstruct list_head node;\n\tu8 *route_table;\n\tu32 port_ok;\n\tstruct rio_switch_ops *ops;\n\tspinlock_t lock;\n\tstruct rio_dev *nextdev[0];\n};\n\nstruct rio_net;\n\nstruct rio_driver;\n\nunion rio_pw_msg;\n\nstruct rio_dev {\n\tstruct list_head global_list;\n\tstruct list_head net_list;\n\tstruct rio_net *net;\n\tbool do_enum;\n\tu16 did;\n\tu16 vid;\n\tu32 device_rev;\n\tu16 asm_did;\n\tu16 asm_vid;\n\tu16 asm_rev;\n\tu16 efptr;\n\tu32 pef;\n\tu32 swpinfo;\n\tu32 src_ops;\n\tu32 dst_ops;\n\tu32 comp_tag;\n\tu32 phys_efptr;\n\tu32 phys_rmap;\n\tu32 em_efptr;\n\tu64 dma_mask;\n\tstruct rio_driver *driver;\n\tstruct device dev;\n\tstruct resource riores[16];\n\tint (*pwcback)(struct rio_dev *, union rio_pw_msg *, int);\n\tu16 destid;\n\tu8 hopcount;\n\tstruct rio_dev *prev;\n\tatomic_t state;\n\tstruct rio_switch rswitch[0];\n};\n\nstruct rio_device_id {\n\t__u16 did;\n\t__u16 vid;\n\t__u16 asm_did;\n\t__u16 asm_vid;\n};\n\nstruct rio_disc_work {\n\tstruct work_struct work;\n\tstruct rio_mport *mport;\n};\n\nstruct rio_dma_data {\n\tstruct scatterlist *sg;\n\tunsigned int sg_len;\n\tu64 rio_addr;\n\tu8 rio_addr_u;\n\tenum rio_write_type wr_type;\n};\n\nstruct rio_dma_ext {\n\tu16 destid;\n\tu64 rio_addr;\n\tu8 rio_addr_u;\n\tenum rio_write_type wr_type;\n};\n\nstruct rio_driver {\n\tstruct list_head node;\n\tchar *name;\n\tconst struct rio_device_id *id_table;\n\tint (*probe)(struct rio_dev *, const struct rio_device_id *);\n\tvoid (*remove)(struct rio_dev *);\n\tvoid (*shutdown)(struct rio_dev *);\n\tint (*suspend)(struct rio_dev *, u32);\n\tint (*resume)(struct rio_dev *);\n\tint (*enable_wake)(struct rio_dev *, u32, int);\n\tstruct device_driver driver;\n};\n\nstruct rio_msg {\n\tstruct resource *res;\n\tvoid (*mcback)(struct rio_mport *, void *, int, int);\n};\n\nstruct rio_ops;\n\nstruct rio_scan;\n\nstruct rio_mport {\n\tstruct list_head dbells;\n\tstruct list_head pwrites;\n\tstruct list_head node;\n\tstruct list_head nnode;\n\tstruct rio_net *net;\n\tstruct mutex lock;\n\tstruct resource iores;\n\tstruct resource riores[16];\n\tstruct rio_msg inb_msg[4];\n\tstruct rio_msg outb_msg[4];\n\tint host_deviceid;\n\tstruct rio_ops *ops;\n\tunsigned char id;\n\tunsigned char index;\n\tunsigned int sys_size;\n\tu32 phys_efptr;\n\tu32 phys_rmap;\n\tunsigned char name[40];\n\tstruct device dev;\n\tvoid *priv;\n\tstruct dma_device dma;\n\tstruct rio_scan *nscan;\n\tatomic_t state;\n\tunsigned int pwe_refcnt;\n};\n\nstruct rio_mport_attr {\n\tint flags;\n\tint link_speed;\n\tint link_width;\n\tint dma_max_sge;\n\tint dma_max_size;\n\tint dma_align;\n};\n\nstruct rio_net {\n\tstruct list_head node;\n\tstruct list_head devices;\n\tstruct list_head switches;\n\tstruct list_head mports;\n\tstruct rio_mport *hport;\n\tunsigned char id;\n\tstruct device dev;\n\tvoid *enum_data;\n\tvoid (*release)(struct rio_net *);\n};\n\nstruct rio_ops {\n\tint (*lcread)(struct rio_mport *, int, u32, int, u32 *);\n\tint (*lcwrite)(struct rio_mport *, int, u32, int, u32);\n\tint (*cread)(struct rio_mport *, int, u16, u8, u32, int, u32 *);\n\tint (*cwrite)(struct rio_mport *, int, u16, u8, u32, int, u32);\n\tint (*dsend)(struct rio_mport *, int, u16, u16);\n\tint (*pwenable)(struct rio_mport *, int);\n\tint (*open_outb_mbox)(struct rio_mport *, void *, int, int);\n\tvoid (*close_outb_mbox)(struct rio_mport *, int);\n\tint (*open_inb_mbox)(struct rio_mport *, void *, int, int);\n\tvoid (*close_inb_mbox)(struct rio_mport *, int);\n\tint (*add_outb_message)(struct rio_mport *, struct rio_dev *, int, void *, size_t);\n\tint (*add_inb_buffer)(struct rio_mport *, int, void *);\n\tvoid * (*get_inb_message)(struct rio_mport *, int);\n\tint (*map_inb)(struct rio_mport *, dma_addr_t, u64, u64, u32);\n\tvoid (*unmap_inb)(struct rio_mport *, dma_addr_t);\n\tint (*query_mport)(struct rio_mport *, struct rio_mport_attr *);\n\tint (*map_outb)(struct rio_mport *, u16, u64, u32, u32, dma_addr_t *);\n\tvoid (*unmap_outb)(struct rio_mport *, u16, u64);\n};\n\nunion rio_pw_msg {\n\tstruct {\n\t\tu32 comptag;\n\t\tu32 errdetect;\n\t\tu32 is_port;\n\t\tu32 ltlerrdet;\n\t\tu32 padding[12];\n\t} em;\n\tu32 raw[16];\n};\n\nstruct rio_pwrite {\n\tstruct list_head node;\n\tint (*pwcback)(struct rio_mport *, void *, union rio_pw_msg *, int);\n\tvoid *context;\n};\n\nstruct rio_scan {\n\tstruct module *owner;\n\tint (*enumerate)(struct rio_mport *, u32);\n\tint (*discover)(struct rio_mport *, u32);\n};\n\nstruct rio_scan_node {\n\tint mport_id;\n\tstruct list_head node;\n\tstruct rio_scan *ops;\n};\n\nstruct rio_switch_ops {\n\tstruct module *owner;\n\tint (*add_entry)(struct rio_mport *, u16, u8, u16, u16, u8);\n\tint (*get_entry)(struct rio_mport *, u16, u8, u16, u16, u8 *);\n\tint (*clr_table)(struct rio_mport *, u16, u8, u16);\n\tint (*set_domain)(struct rio_mport *, u16, u8, u8);\n\tint (*get_domain)(struct rio_mport *, u16, u8, u8 *);\n\tint (*em_init)(struct rio_dev *);\n\tint (*em_handle)(struct rio_dev *, u8);\n};\n\nstruct rlimit64 {\n\t__u64 rlim_cur;\n\t__u64 rlim_max;\n};\n\nstruct rm_feature_desc {\n\t__be16 feature_code;\n\t__u8 curr: 1;\n\t__u8 persistent: 1;\n\t__u8 feature_version: 4;\n\t__u8 reserved1: 2;\n\t__u8 add_len;\n\t__u8 lock: 1;\n\t__u8 dbml: 1;\n\t__u8 pvnt_jmpr: 1;\n\t__u8 eject: 1;\n\t__u8 load: 1;\n\t__u8 mech_type: 3;\n\t__u8 reserved2;\n\t__u8 reserved3;\n\t__u8 reserved4;\n};\n\nstruct rmap_walk_control {\n\tvoid *arg;\n\tbool try_lock;\n\tbool contended;\n\tbool (*rmap_one)(struct folio *, struct vm_area_struct *, long unsigned int, void *);\n\tint (*done)(struct folio *);\n\tstruct anon_vma * (*anon_lock)(struct folio *, struct rmap_walk_control *);\n\tbool (*invalid_vma)(struct vm_area_struct *, void *);\n};\n\nstruct rmid_entry {\n\tu32 closid;\n\tu32 rmid;\n\tint busy;\n\tstruct list_head list;\n};\n\nstruct rmid_read {\n\tstruct rdtgroup *rgrp;\n\tstruct rdt_resource *r;\n\tstruct rdt_mon_domain *d;\n\tenum resctrl_event_id evtid;\n\tbool first;\n\tstruct cacheinfo *ci;\n\tint err;\n\tu64 val;\n\tvoid *arch_mon_ctx;\n};\n\nstruct rmp_state {\n\tu64 gpa;\n\tu8 assigned;\n\tu8 pagesize;\n\tu8 immutable;\n\tu8 rsvd;\n\tu32 asid;\n};\n\nstruct rmpentry {\n\tunion {\n\t\tstruct {\n\t\t\tu64 assigned: 1;\n\t\t\tu64 pagesize: 1;\n\t\t\tu64 immutable: 1;\n\t\t\tu64 rsvd1: 9;\n\t\t\tu64 gpa: 39;\n\t\t\tu64 asid: 10;\n\t\t\tu64 vmsa: 1;\n\t\t\tu64 validated: 1;\n\t\t\tu64 rsvd2: 1;\n\t\t};\n\t\tu64 lo;\n\t};\n\tu64 hi;\n};\n\nstruct rnd_state {\n\t__u32 s1;\n\t__u32 s2;\n\t__u32 s3;\n\t__u32 s4;\n};\n\nstruct rng_alg {\n\tint (*generate)(struct crypto_rng *, const u8 *, unsigned int, u8 *, unsigned int);\n\tint (*seed)(struct crypto_rng *, const u8 *, unsigned int);\n\tvoid (*set_ent)(struct crypto_rng *, const u8 *, unsigned int);\n\tunsigned int seedsize;\n\tstruct crypto_alg base;\n};\n\nstruct robust_list {\n\tstruct robust_list *next;\n};\n\nstruct robust_list_head {\n\tstruct robust_list list;\n\tlong int futex_offset;\n\tstruct robust_list *list_op_pending;\n};\n\nstruct role_allow {\n\tu32 role;\n\tu32 new_role;\n\tstruct role_allow *next;\n};\n\nstruct role_datum {\n\tu32 value;\n\tu32 bounds;\n\tstruct ebitmap dominates;\n\tstruct ebitmap types;\n};\n\nstruct role_trans_datum {\n\tu32 new_role;\n};\n\nstruct role_trans_key {\n\tu32 role;\n\tu32 type;\n\tu32 tclass;\n};\n\nstruct root_device {\n\tstruct device dev;\n\tstruct module *owner;\n};\n\nstruct root_domain {\n\tatomic_t refcount;\n\tatomic_t rto_count;\n\tstruct callback_head rcu;\n\tcpumask_var_t span;\n\tcpumask_var_t online;\n\tbool overloaded;\n\tbool overutilized;\n\tcpumask_var_t dlo_mask;\n\tatomic_t dlo_count;\n\tstruct dl_bw dl_bw;\n\tstruct cpudl cpudl;\n\tu64 visit_gen;\n\tstruct irq_work rto_push_work;\n\traw_spinlock_t rto_lock;\n\tint rto_loop;\n\tint rto_cpu;\n\tatomic_t rto_loop_next;\n\tatomic_t rto_loop_start;\n\tcpumask_var_t rto_mask;\n\tstruct cpupri cpupri;\n\tstruct perf_domain *pd;\n};\n\nstruct root_entry {\n\tu64 lo;\n\tu64 hi;\n};\n\nstruct rootsector {\n\tchar unused[342];\n\tstruct partition_info icdpart[8];\n\tchar unused2[12];\n\tu32 hd_siz;\n\tstruct partition_info part[4];\n\tu32 bsl_st;\n\tu32 bsl_cnt;\n\tu16 checksum;\n} __attribute__((packed));\n\nstruct route_info {\n\t__u8 type;\n\t__u8 length;\n\t__u8 prefix_len;\n\t__u8 reserved_l: 3;\n\t__u8 route_pref: 2;\n\t__u8 reserved_h: 3;\n\t__be32 lifetime;\n\t__u8 prefix[0];\n};\n\nstruct rpc_cred_cache;\n\nstruct rpc_authops;\n\nstruct rpc_auth {\n\tunsigned int au_cslack;\n\tunsigned int au_rslack;\n\tunsigned int au_verfsize;\n\tunsigned int au_ralign;\n\tlong unsigned int au_flags;\n\tconst struct rpc_authops *au_ops;\n\trpc_authflavor_t au_flavor;\n\trefcount_t au_count;\n\tstruct rpc_cred_cache *au_credcache;\n};\n\nstruct rpc_auth_create_args {\n\trpc_authflavor_t pseudoflavor;\n\tconst char *target_name;\n};\n\nstruct rpcsec_gss_info;\n\nstruct rpc_authops {\n\tstruct module *owner;\n\trpc_authflavor_t au_flavor;\n\tchar *au_name;\n\tstruct rpc_auth * (*create)(const struct rpc_auth_create_args *, struct rpc_clnt *);\n\tvoid (*destroy)(struct rpc_auth *);\n\tint (*hash_cred)(struct auth_cred *, unsigned int);\n\tstruct rpc_cred * (*lookup_cred)(struct rpc_auth *, struct auth_cred *, int);\n\tstruct rpc_cred * (*crcreate)(struct rpc_auth *, struct auth_cred *, int, gfp_t);\n\trpc_authflavor_t (*info2flavor)(struct rpcsec_gss_info *);\n\tint (*flavor2info)(rpc_authflavor_t, struct rpcsec_gss_info *);\n\tint (*key_timeout)(struct rpc_auth *, struct rpc_cred *);\n\tint (*ping)(struct rpc_clnt *);\n};\n\nstruct rpc_call_ops {\n\tvoid (*rpc_call_prepare)(struct rpc_task *, void *);\n\tvoid (*rpc_call_done)(struct rpc_task *, void *);\n\tvoid (*rpc_count_stats)(struct rpc_task *, void *);\n\tvoid (*rpc_release)(void *);\n};\n\nstruct rpc_iostats;\n\nstruct rpc_pipe_dir_head {\n\tstruct list_head pdh_entries;\n\tstruct dentry *pdh_dentry;\n};\n\nstruct rpc_rtt {\n\tlong unsigned int timeo;\n\tlong unsigned int srtt[5];\n\tlong unsigned int sdrtt[5];\n\tint ntimeouts[5];\n};\n\nstruct rpc_timeout {\n\tlong unsigned int to_initval;\n\tlong unsigned int to_maxval;\n\tlong unsigned int to_increment;\n\tunsigned int to_retries;\n\tunsigned char to_exponential;\n};\n\nstruct rpc_xprt_switch;\n\nstruct rpc_xprt_iter_ops;\n\nstruct rpc_xprt_iter {\n\tstruct rpc_xprt_switch *xpi_xpswitch;\n\tstruct rpc_xprt *xpi_cursor;\n\tconst struct rpc_xprt_iter_ops *xpi_ops;\n};\n\nstruct rpc_stat;\n\nstruct rpc_program;\n\nstruct rpc_sysfs_client;\n\nstruct rpc_clnt {\n\trefcount_t cl_count;\n\tunsigned int cl_clid;\n\tstruct list_head cl_clients;\n\tstruct list_head cl_tasks;\n\tatomic_t cl_pid;\n\tspinlock_t cl_lock;\n\tstruct rpc_xprt *cl_xprt;\n\tconst struct rpc_procinfo *cl_procinfo;\n\tu32 cl_prog;\n\tu32 cl_vers;\n\tu32 cl_maxproc;\n\tstruct rpc_auth *cl_auth;\n\tstruct rpc_stat *cl_stats;\n\tstruct rpc_iostats *cl_metrics;\n\tunsigned int cl_softrtry: 1;\n\tunsigned int cl_softerr: 1;\n\tunsigned int cl_discrtry: 1;\n\tunsigned int cl_noretranstimeo: 1;\n\tunsigned int cl_autobind: 1;\n\tunsigned int cl_chatty: 1;\n\tunsigned int cl_shutdown: 1;\n\tstruct xprtsec_parms cl_xprtsec;\n\tstruct rpc_rtt *cl_rtt;\n\tconst struct rpc_timeout *cl_timeout;\n\tatomic_t cl_swapper;\n\tint cl_nodelen;\n\tchar cl_nodename[65];\n\tstruct rpc_pipe_dir_head cl_pipedir_objects;\n\tstruct rpc_clnt *cl_parent;\n\tstruct rpc_rtt cl_rtt_default;\n\tstruct rpc_timeout cl_timeout_default;\n\tconst struct rpc_program *cl_program;\n\tconst char *cl_principal;\n\tstruct dentry *cl_debugfs;\n\tstruct rpc_sysfs_client *cl_sysfs;\n\tunion {\n\t\tstruct rpc_xprt_iter cl_xpi;\n\t\tstruct work_struct cl_work;\n\t};\n\tconst struct cred *cl_cred;\n\tunsigned int cl_max_connect;\n\tstruct super_block *pipefs_sb;\n};\n\nstruct rpc_credops;\n\nstruct rpc_cred {\n\tstruct hlist_node cr_hash;\n\tstruct list_head cr_lru;\n\tstruct callback_head cr_rcu;\n\tstruct rpc_auth *cr_auth;\n\tconst struct rpc_credops *cr_ops;\n\tlong unsigned int cr_expire;\n\tlong unsigned int cr_flags;\n\trefcount_t cr_count;\n\tconst struct cred *cr_cred;\n};\n\nstruct rpc_credops {\n\tconst char *cr_name;\n\tint (*cr_init)(struct rpc_auth *, struct rpc_cred *);\n\tvoid (*crdestroy)(struct rpc_cred *);\n\tint (*crmatch)(struct auth_cred *, struct rpc_cred *, int);\n\tint (*crmarshal)(struct rpc_task *, struct xdr_stream *);\n\tint (*crrefresh)(struct rpc_task *);\n\tint (*crvalidate)(struct rpc_task *, struct xdr_stream *);\n\tint (*crwrap_req)(struct rpc_task *, struct xdr_stream *);\n\tint (*crunwrap_resp)(struct rpc_task *, struct xdr_stream *);\n\tint (*crkey_timeout)(struct rpc_cred *);\n\tchar * (*crstringify_acceptor)(struct rpc_cred *);\n\tbool (*crneed_reencode)(struct rpc_task *);\n};\n\ntypedef void (*kxdreproc_t)(struct rpc_rqst *, struct xdr_stream *, const void *);\n\ntypedef int (*kxdrdproc_t)(struct rpc_rqst *, struct xdr_stream *, void *);\n\nstruct rpc_procinfo {\n\tu32 p_proc;\n\tkxdreproc_t p_encode;\n\tkxdrdproc_t p_decode;\n\tunsigned int p_arglen;\n\tunsigned int p_replen;\n\tunsigned int p_timer;\n\tu32 p_statidx;\n\tconst char *p_name;\n};\n\nstruct rpc_version;\n\nstruct rpc_program {\n\tconst char *name;\n\tu32 number;\n\tunsigned int nrvers;\n\tconst struct rpc_version **version;\n\tstruct rpc_stat *stats;\n\tconst char *pipe_dir_name;\n};\n\nstruct xdr_buf {\n\tstruct kvec head[1];\n\tstruct kvec tail[1];\n\tstruct bio_vec *bvec;\n\tstruct page **pages;\n\tunsigned int page_base;\n\tunsigned int page_len;\n\tunsigned int flags;\n\tunsigned int buflen;\n\tunsigned int len;\n};\n\nstruct rpc_rqst {\n\tstruct rpc_xprt *rq_xprt;\n\tstruct xdr_buf rq_snd_buf;\n\tstruct xdr_buf rq_rcv_buf;\n\tstruct rpc_task *rq_task;\n\tstruct rpc_cred *rq_cred;\n\t__be32 rq_xid;\n\tint rq_cong;\n\tu32 rq_seqno;\n\tint rq_enc_pages_num;\n\tstruct page **rq_enc_pages;\n\tvoid (*rq_release_snd_buf)(struct rpc_rqst *);\n\tunion {\n\t\tstruct list_head rq_list;\n\t\tstruct rb_node rq_recv;\n\t};\n\tstruct list_head rq_xmit;\n\tstruct list_head rq_xmit2;\n\tvoid *rq_buffer;\n\tsize_t rq_callsize;\n\tvoid *rq_rbuffer;\n\tsize_t rq_rcvsize;\n\tsize_t rq_xmit_bytes_sent;\n\tsize_t rq_reply_bytes_recvd;\n\tstruct xdr_buf rq_private_buf;\n\tlong unsigned int rq_majortimeo;\n\tlong unsigned int rq_minortimeo;\n\tlong unsigned int rq_timeout;\n\tktime_t rq_rtt;\n\tunsigned int rq_retries;\n\tunsigned int rq_connect_cookie;\n\tatomic_t rq_pin;\n\tu32 rq_bytes_sent;\n\tktime_t rq_xtime;\n\tint rq_ntrans;\n\tstruct lwq_node rq_bc_list;\n\tlong unsigned int rq_bc_pa_state;\n\tstruct list_head rq_bc_pa_list;\n};\n\nstruct rpc_stat {\n\tconst struct rpc_program *program;\n\tunsigned int netcnt;\n\tunsigned int netudpcnt;\n\tunsigned int nettcpcnt;\n\tunsigned int nettcpconn;\n\tunsigned int netreconn;\n\tunsigned int rpccnt;\n\tunsigned int rpcretrans;\n\tunsigned int rpcauthrefresh;\n\tunsigned int rpcgarbage;\n};\n\nstruct rpc_sysfs_client {\n\tstruct kobject kobject;\n\tstruct net *net;\n\tstruct rpc_clnt *clnt;\n\tstruct rpc_xprt_switch *xprt_switch;\n};\n\nstruct rpc_version {\n\tu32 number;\n\tunsigned int nrprocs;\n\tconst struct rpc_procinfo *procs;\n\tunsigned int *counts;\n};\n\nstruct svc_xprt;\n\nstruct rpc_sysfs_xprt;\n\nstruct rpc_xprt_ops;\n\nstruct svc_serv;\n\nstruct xprt_class;\n\nstruct rpc_xprt {\n\tstruct kref kref;\n\tconst struct rpc_xprt_ops *ops;\n\tunsigned int id;\n\tconst struct rpc_timeout *timeout;\n\tstruct __kernel_sockaddr_storage addr;\n\tsize_t addrlen;\n\tint prot;\n\tlong unsigned int cong;\n\tlong unsigned int cwnd;\n\tsize_t max_payload;\n\tstruct rpc_wait_queue binding;\n\tstruct rpc_wait_queue sending;\n\tstruct rpc_wait_queue pending;\n\tstruct rpc_wait_queue backlog;\n\tstruct list_head free;\n\tunsigned int max_reqs;\n\tunsigned int min_reqs;\n\tunsigned int num_reqs;\n\tlong unsigned int state;\n\tunsigned char resvport: 1;\n\tunsigned char reuseport: 1;\n\tatomic_t swapper;\n\tunsigned int bind_index;\n\tstruct list_head xprt_switch;\n\tlong unsigned int bind_timeout;\n\tlong unsigned int reestablish_timeout;\n\tstruct xprtsec_parms xprtsec;\n\tunsigned int connect_cookie;\n\tstruct work_struct task_cleanup;\n\tstruct timer_list timer;\n\tlong unsigned int last_used;\n\tlong unsigned int idle_timeout;\n\tlong unsigned int connect_timeout;\n\tlong unsigned int max_reconnect_timeout;\n\tatomic_long_t queuelen;\n\tspinlock_t transport_lock;\n\tspinlock_t reserve_lock;\n\tspinlock_t queue_lock;\n\tu32 xid;\n\tstruct rpc_task *snd_task;\n\tstruct list_head xmit_queue;\n\tatomic_long_t xmit_queuelen;\n\tstruct svc_xprt *bc_xprt;\n\tstruct svc_serv *bc_serv;\n\tunsigned int bc_alloc_max;\n\tunsigned int bc_alloc_count;\n\tatomic_t bc_slot_count;\n\tspinlock_t bc_pa_lock;\n\tstruct list_head bc_pa_list;\n\tstruct rb_root recv_queue;\n\tstruct {\n\t\tlong unsigned int bind_count;\n\t\tlong unsigned int connect_count;\n\t\tlong unsigned int connect_start;\n\t\tlong unsigned int connect_time;\n\t\tlong unsigned int sends;\n\t\tlong unsigned int recvs;\n\t\tlong unsigned int bad_xids;\n\t\tlong unsigned int max_slots;\n\t\tlong long unsigned int req_u;\n\t\tlong long unsigned int bklog_u;\n\t\tlong long unsigned int sending_u;\n\t\tlong long unsigned int pending_u;\n\t} stat;\n\tstruct net *xprt_net;\n\tnetns_tracker ns_tracker;\n\tconst char *servername;\n\tconst char *address_strings[6];\n\tstruct dentry *debugfs;\n\tstruct callback_head rcu;\n\tconst struct xprt_class *xprt_class;\n\tstruct rpc_sysfs_xprt *xprt_sysfs;\n\tbool main;\n};\n\nstruct rpc_xprt_iter_ops {\n\tvoid (*xpi_rewind)(struct rpc_xprt_iter *);\n\tstruct rpc_xprt * (*xpi_xprt)(struct rpc_xprt_iter *);\n\tstruct rpc_xprt * (*xpi_next)(struct rpc_xprt_iter *);\n};\n\nstruct rpc_xprt_ops {\n\tvoid (*set_buffer_size)(struct rpc_xprt *, size_t, size_t);\n\tint (*reserve_xprt)(struct rpc_xprt *, struct rpc_task *);\n\tvoid (*release_xprt)(struct rpc_xprt *, struct rpc_task *);\n\tvoid (*alloc_slot)(struct rpc_xprt *, struct rpc_task *);\n\tvoid (*free_slot)(struct rpc_xprt *, struct rpc_rqst *);\n\tvoid (*rpcbind)(struct rpc_task *);\n\tvoid (*set_port)(struct rpc_xprt *, short unsigned int);\n\tvoid (*connect)(struct rpc_xprt *, struct rpc_task *);\n\tint (*get_srcaddr)(struct rpc_xprt *, char *, size_t);\n\tshort unsigned int (*get_srcport)(struct rpc_xprt *);\n\tint (*buf_alloc)(struct rpc_task *);\n\tvoid (*buf_free)(struct rpc_task *);\n\tint (*prepare_request)(struct rpc_rqst *, struct xdr_buf *);\n\tint (*send_request)(struct rpc_rqst *);\n\tvoid (*abort_send_request)(struct rpc_rqst *);\n\tvoid (*wait_for_reply_request)(struct rpc_task *);\n\tvoid (*timer)(struct rpc_xprt *, struct rpc_task *);\n\tvoid (*release_request)(struct rpc_task *);\n\tvoid (*close)(struct rpc_xprt *);\n\tvoid (*destroy)(struct rpc_xprt *);\n\tvoid (*set_connect_timeout)(struct rpc_xprt *, long unsigned int, long unsigned int);\n\tvoid (*print_stats)(struct rpc_xprt *, struct seq_file *);\n\tint (*enable_swap)(struct rpc_xprt *);\n\tvoid (*disable_swap)(struct rpc_xprt *);\n\tvoid (*inject_disconnect)(struct rpc_xprt *);\n\tint (*bc_setup)(struct rpc_xprt *, unsigned int);\n\tsize_t (*bc_maxpayload)(struct rpc_xprt *);\n\tunsigned int (*bc_num_slots)(struct rpc_xprt *);\n\tvoid (*bc_free_rqst)(struct rpc_rqst *);\n\tvoid (*bc_destroy)(struct rpc_xprt *, unsigned int);\n};\n\nstruct rpc_sysfs_xprt_switch;\n\nstruct rpc_xprt_switch {\n\tspinlock_t xps_lock;\n\tstruct kref xps_kref;\n\tunsigned int xps_id;\n\tunsigned int xps_nxprts;\n\tunsigned int xps_nactive;\n\tunsigned int xps_nunique_destaddr_xprts;\n\tatomic_long_t xps_queuelen;\n\tstruct list_head xps_xprt_list;\n\tstruct net *xps_net;\n\tconst struct rpc_xprt_iter_ops *xps_iter_ops;\n\tstruct rpc_sysfs_xprt_switch *xps_sysfs;\n\tstruct callback_head xps_rcu;\n};\n\nstruct rpcsec_gss_info {\n\tstruct rpcsec_gss_oid oid;\n\tu32 qop;\n\tu32 service;\n};\n\nstruct rproc_ops;\n\nstruct rproc {\n\tstruct list_head node;\n\tstruct iommu_domain *domain;\n\tconst char *name;\n\tconst char *firmware;\n\tvoid *priv;\n\tstruct rproc_ops *ops;\n\tstruct device dev;\n\tatomic_t power;\n\tunsigned int state;\n\tenum rproc_dump_mechanism dump_conf;\n\tstruct mutex lock;\n\tstruct dentry *dbg_dir;\n\tstruct list_head traces;\n\tint num_traces;\n\tstruct list_head carveouts;\n\tstruct list_head mappings;\n\tu64 bootaddr;\n\tstruct list_head rvdevs;\n\tstruct list_head subdevs;\n\tstruct idr notifyids;\n\tint index;\n\tstruct work_struct crash_handler;\n\tunsigned int crash_cnt;\n\tbool recovery_disabled;\n\tint max_notifyid;\n\tstruct resource_table *table_ptr;\n\tstruct resource_table *clean_table;\n\tstruct resource_table *cached_table;\n\tsize_t table_sz;\n\tbool has_iommu;\n\tbool auto_boot;\n\tbool sysfs_read_only;\n\tstruct list_head dump_segments;\n\tint nb_vdev;\n\tu8 elf_class;\n\tu16 elf_machine;\n\tstruct cdev cdev;\n\tbool cdev_put_on_release;\n\tlong unsigned int features[1];\n};\n\nstruct rproc_coredump_state {\n\tstruct rproc *rproc;\n\tvoid *header;\n\tstruct completion dump_done;\n};\n\nstruct rproc_mem_entry {\n\tvoid *va;\n\tbool is_iomem;\n\tdma_addr_t dma;\n\tsize_t len;\n\tu32 da;\n\tvoid *priv;\n\tchar name[32];\n\tstruct list_head node;\n\tu32 rsc_offset;\n\tu32 flags;\n\tu32 of_resm_idx;\n\tint (*alloc)(struct rproc *, struct rproc_mem_entry *);\n\tint (*release)(struct rproc *, struct rproc_mem_entry *);\n};\n\nstruct rproc_debug_trace {\n\tstruct rproc *rproc;\n\tstruct dentry *tfile;\n\tstruct list_head node;\n\tstruct rproc_mem_entry trace_mem;\n};\n\nstruct rproc_dump_segment {\n\tstruct list_head node;\n\tdma_addr_t da;\n\tsize_t size;\n\tvoid *priv;\n\tvoid (*dump)(struct rproc *, struct rproc_dump_segment *, void *, size_t, size_t);\n\tloff_t offset;\n};\n\nstruct rproc_ops {\n\tint (*prepare)(struct rproc *);\n\tint (*unprepare)(struct rproc *);\n\tint (*start)(struct rproc *);\n\tint (*stop)(struct rproc *);\n\tint (*attach)(struct rproc *);\n\tint (*detach)(struct rproc *);\n\tvoid (*kick)(struct rproc *, int);\n\tvoid * (*da_to_va)(struct rproc *, u64, size_t, bool *);\n\tint (*parse_fw)(struct rproc *, const struct firmware *);\n\tint (*handle_rsc)(struct rproc *, u32, void *, int, int);\n\tstruct resource_table * (*find_loaded_rsc_table)(struct rproc *, const struct firmware *);\n\tstruct resource_table * (*get_loaded_rsc_table)(struct rproc *, size_t *);\n\tint (*load)(struct rproc *, const struct firmware *);\n\tint (*sanity_check)(struct rproc *, const struct firmware *);\n\tu64 (*get_boot_addr)(struct rproc *, const struct firmware *);\n\tlong unsigned int (*panic)(struct rproc *);\n\tvoid (*coredump)(struct rproc *);\n};\n\nstruct rproc_subdev {\n\tstruct list_head node;\n\tint (*prepare)(struct rproc_subdev *);\n\tint (*start)(struct rproc_subdev *);\n\tvoid (*stop)(struct rproc_subdev *, bool);\n\tvoid (*unprepare)(struct rproc_subdev *);\n};\n\nstruct rproc_vdev;\n\nstruct rproc_vring {\n\tvoid *va;\n\tint num;\n\tu32 da;\n\tu32 align;\n\tint notifyid;\n\tstruct rproc_vdev *rvdev;\n\tstruct virtqueue *vq;\n};\n\nstruct rproc_vdev {\n\tstruct rproc_subdev subdev;\n\tstruct platform_device *pdev;\n\tunsigned int id;\n\tstruct list_head node;\n\tstruct rproc *rproc;\n\tstruct rproc_vring vring[2];\n\tu32 rsc_offset;\n\tu32 index;\n};\n\nstruct rproc_vdev_data {\n\tu32 rsc_offset;\n\tunsigned int id;\n\tu32 index;\n\tstruct fw_rsc_vdev *rsc;\n};\n\nstruct rps_dev_flow {\n\tu16 cpu;\n\tu16 filter;\n\tunsigned int last_qtail;\n};\n\nstruct rps_dev_flow_table {\n\tunsigned int mask;\n\tstruct callback_head rcu;\n\tstruct rps_dev_flow flows[0];\n};\n\nstruct rps_map {\n\tunsigned int len;\n\tstruct callback_head rcu;\n\tu16 cpus[0];\n};\n\nstruct rps_sock_flow_table {\n\tu32 mask;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tu32 ents[0];\n};\n\nstruct uclamp_bucket {\n\tlong unsigned int value: 11;\n\tlong unsigned int tasks: 53;\n};\n\nstruct uclamp_rq {\n\tunsigned int value;\n\tstruct uclamp_bucket bucket[5];\n};\n\nstruct rt_prio_array {\n\tlong unsigned int bitmap[2];\n\tstruct list_head queue[100];\n};\n\nstruct rt_rq {\n\tstruct rt_prio_array active;\n\tunsigned int rt_nr_running;\n\tunsigned int rr_nr_running;\n\tstruct {\n\t\tint curr;\n\t\tint next;\n\t} highest_prio;\n\tbool overloaded;\n\tstruct plist_head pushable_tasks;\n\tint rt_queued;\n\tint rt_throttled;\n\tu64 rt_time;\n\tu64 rt_runtime;\n\traw_spinlock_t rt_runtime_lock;\n};\n\nstruct sched_info {\n\tlong unsigned int pcount;\n\tlong long unsigned int run_delay;\n\tlong long unsigned int last_arrival;\n\tlong long unsigned int last_queued;\n};\n\nstruct rq {\n\traw_spinlock_t __lock;\n\tunsigned int nr_running;\n\tunsigned int nr_numa_running;\n\tunsigned int nr_preferred_running;\n\tunsigned int numa_migrate_on;\n\tlong unsigned int last_blocked_load_update_tick;\n\tunsigned int has_blocked_load;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tcall_single_data_t nohz_csd;\n\tunsigned int nohz_tick_stopped;\n\tatomic_t nohz_flags;\n\tunsigned int ttwu_pending;\n\tu64 nr_switches;\n\tlong: 64;\n\tstruct uclamp_rq uclamp[2];\n\tunsigned int uclamp_flags;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tstruct cfs_rq cfs;\n\tstruct rt_rq rt;\n\tstruct dl_rq dl;\n\tstruct list_head leaf_cfs_rq_list;\n\tstruct list_head *tmp_alone_branch;\n\tunsigned int nr_uninterruptible;\n\tstruct task_struct *curr;\n\tstruct task_struct *idle;\n\tstruct task_struct *stop;\n\tlong unsigned int next_balance;\n\tstruct mm_struct *prev_mm;\n\tunsigned int clock_update_flags;\n\tu64 clock;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tu64 clock_task;\n\tu64 clock_pelt;\n\tlong unsigned int lost_idle_time;\n\tu64 clock_pelt_idle;\n\tu64 clock_idle;\n\tatomic_t nr_iowait;\n\tu64 last_seen_need_resched_ns;\n\tint ticks_without_resched;\n\tint membarrier_state;\n\tstruct root_domain *rd;\n\tstruct sched_domain *sd;\n\tlong unsigned int cpu_capacity;\n\tstruct balance_callback *balance_callback;\n\tunsigned char nohz_idle_balance;\n\tunsigned char idle_balance;\n\tlong unsigned int misfit_task_load;\n\tint active_balance;\n\tint push_cpu;\n\tstruct cpu_stop_work active_balance_work;\n\tint cpu;\n\tint online;\n\tstruct list_head cfs_tasks;\n\tstruct sched_avg avg_rt;\n\tstruct sched_avg avg_dl;\n\tu64 idle_stamp;\n\tu64 avg_idle;\n\tu64 max_idle_balance_cost;\n\tstruct rcuwait hotplug_wait;\n\tu64 prev_steal_time;\n\tlong unsigned int calc_load_update;\n\tlong int calc_load_active;\n\tlong: 64;\n\tcall_single_data_t hrtick_csd;\n\tstruct hrtimer hrtick_timer;\n\tktime_t hrtick_time;\n\tstruct sched_info rq_sched_info;\n\tlong long unsigned int rq_cpu_time;\n\tunsigned int yld_count;\n\tunsigned int sched_count;\n\tunsigned int sched_goidle;\n\tunsigned int ttwu_count;\n\tunsigned int ttwu_local;\n\tstruct cpuidle_state *idle_state;\n\tunsigned int nr_pinned;\n\tunsigned int push_busy;\n\tstruct cpu_stop_work push_work;\n\tstruct rq *core;\n\tstruct task_struct *core_pick;\n\tunsigned int core_enabled;\n\tunsigned int core_sched_seq;\n\tstruct rb_root core_tree;\n\tunsigned int core_task_seq;\n\tunsigned int core_pick_seq;\n\tlong unsigned int core_cookie;\n\tunsigned int core_forceidle_count;\n\tunsigned int core_forceidle_seq;\n\tunsigned int core_forceidle_occupation;\n\tu64 core_forceidle_start;\n\tcpumask_var_t scratch_mask;\n\tlong: 64;\n\tcall_single_data_t cfsb_csd;\n\tstruct list_head cfsb_csd_list;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct rq_depth {\n\tunsigned int max_depth;\n\tint scale_step;\n\tbool scaled_max;\n\tunsigned int queue_depth;\n\tunsigned int default_depth;\n};\n\nstruct rq_iter_data {\n\tstruct blk_mq_hw_ctx *hctx;\n\tbool has_rq;\n};\n\nstruct rq_map_data {\n\tstruct page **pages;\n\tlong unsigned int offset;\n\tshort unsigned int page_order;\n\tshort unsigned int nr_entries;\n\tbool null_mapped;\n\tbool from_user;\n};\n\nstruct rq_qos_ops {\n\tvoid (*throttle)(struct rq_qos *, struct bio *);\n\tvoid (*track)(struct rq_qos *, struct request *, struct bio *);\n\tvoid (*merge)(struct rq_qos *, struct request *, struct bio *);\n\tvoid (*issue)(struct rq_qos *, struct request *);\n\tvoid (*requeue)(struct rq_qos *, struct request *);\n\tvoid (*done)(struct rq_qos *, struct request *);\n\tvoid (*done_bio)(struct rq_qos *, struct bio *);\n\tvoid (*cleanup)(struct rq_qos *, struct bio *);\n\tvoid (*queue_depth_changed)(struct rq_qos *);\n\tvoid (*exit)(struct rq_qos *);\n\tconst struct blk_mq_debugfs_attr *debugfs_attrs;\n};\n\nstruct rq_wait;\n\ntypedef bool acquire_inflight_cb_t(struct rq_wait *, void *);\n\nstruct rq_qos_wait_data {\n\tstruct wait_queue_entry wq;\n\tstruct task_struct *task;\n\tstruct rq_wait *rqw;\n\tacquire_inflight_cb_t *cb;\n\tvoid *private_data;\n\tbool got_token;\n};\n\nstruct rq_wait {\n\twait_queue_head_t wait;\n\tatomic_t inflight;\n};\n\nstruct rq_wb {\n\tunsigned int wb_background;\n\tunsigned int wb_normal;\n\tshort int enable_state;\n\tunsigned int unknown_cnt;\n\tu64 win_nsec;\n\tu64 cur_win_nsec;\n\tstruct blk_stat_callback *cb;\n\tu64 sync_issue;\n\tvoid *sync_cookie;\n\tlong unsigned int last_issue;\n\tlong unsigned int last_comp;\n\tlong unsigned int min_lat_nsec;\n\tstruct rq_qos rqos;\n\tstruct rq_wait rq_wait[3];\n\tstruct rq_depth rq_depth;\n};\n\nstruct rs_msg {\n\tstruct icmp6hdr icmph;\n\t__u8 opt[0];\n};\n\nstruct rsa_asn1_template {\n\tconst char *name;\n\tconst u8 *data;\n\tsize_t size;\n};\n\nstruct rsa_key {\n\tconst u8 *n;\n\tconst u8 *e;\n\tconst u8 *d;\n\tconst u8 *p;\n\tconst u8 *q;\n\tconst u8 *dp;\n\tconst u8 *dq;\n\tconst u8 *qinv;\n\tsize_t n_sz;\n\tsize_t e_sz;\n\tsize_t d_sz;\n\tsize_t p_sz;\n\tsize_t q_sz;\n\tsize_t dp_sz;\n\tsize_t dq_sz;\n\tsize_t qinv_sz;\n};\n\nstruct rsa_mpi_key {\n\tMPI n;\n\tMPI e;\n\tMPI d;\n\tMPI p;\n\tMPI q;\n\tMPI dp;\n\tMPI dq;\n\tMPI qinv;\n};\n\nstruct rseq {\n\t__u32 cpu_id_start;\n\t__u32 cpu_id;\n\t__u64 rseq_cs;\n\t__u32 flags;\n\t__u32 node_id;\n\t__u32 mm_cid;\n\tchar end[0];\n};\n\nstruct rseq_cs {\n\t__u32 version;\n\t__u32 flags;\n\t__u64 start_ip;\n\t__u64 post_commit_offset;\n\t__u64 abort_ip;\n};\n\nstruct rss_reply_data {\n\tstruct ethnl_reply_data base;\n\tu32 indir_size;\n\tu32 hkey_size;\n\tu32 hfunc;\n\tu32 input_xfrm;\n\tu32 *indir_table;\n\tu8 *hkey;\n};\n\nstruct rss_req_info {\n\tstruct ethnl_req_info base;\n\tu32 rss_context;\n};\n\nstruct rsvd_count {\n\tint ndelonly;\n\tbool first_do_lblk_found;\n\text4_lblk_t first_do_lblk;\n\text4_lblk_t last_do_lblk;\n\tstruct extent_status *left_es;\n\tbool partial;\n\text4_lblk_t lclu;\n};\n\nstruct rt0_hdr {\n\tstruct ipv6_rt_hdr rt_hdr;\n\t__u32 reserved;\n\tstruct in6_addr addr[0];\n};\n\nstruct rt6_exception {\n\tstruct hlist_node hlist;\n\tstruct rt6_info *rt6i;\n\tlong unsigned int stamp;\n\tstruct callback_head rcu;\n};\n\nstruct rt6_exception_bucket {\n\tstruct hlist_head chain;\n\tint depth;\n};\n\nstruct rt6_mtu_change_arg {\n\tstruct net_device *dev;\n\tunsigned int mtu;\n\tstruct fib6_info *f6i;\n};\n\nstruct rt6_nh {\n\tstruct fib6_info *fib6_info;\n\tstruct fib6_config r_cfg;\n\tstruct list_head next;\n};\n\nstruct rt6_rtnl_dump_arg {\n\tstruct sk_buff *skb;\n\tstruct netlink_callback *cb;\n\tstruct net *net;\n\tstruct fib_dump_filter filter;\n};\n\nstruct rt6_statistics {\n\t__u32 fib_nodes;\n\t__u32 fib_route_nodes;\n\t__u32 fib_rt_entries;\n\t__u32 fib_rt_cache;\n\t__u32 fib_discarded_routes;\n\tatomic_t fib_rt_alloc;\n};\n\nstruct rt_bandwidth {\n\traw_spinlock_t rt_runtime_lock;\n\tktime_t rt_period;\n\tu64 rt_runtime;\n\tstruct hrtimer rt_period_timer;\n\tunsigned int rt_period_active;\n};\n\nstruct rt_cache_stat {\n\tunsigned int in_slow_tot;\n\tunsigned int in_slow_mc;\n\tunsigned int in_no_route;\n\tunsigned int in_brd;\n\tunsigned int in_martian_dst;\n\tunsigned int in_martian_src;\n\tunsigned int out_slow_tot;\n\tunsigned int out_slow_mc;\n};\n\nstruct rt_waiter_node {\n\tstruct rb_node entry;\n\tint prio;\n\tu64 deadline;\n};\n\nstruct rt_mutex_waiter {\n\tstruct rt_waiter_node tree;\n\tstruct rt_waiter_node pi_tree;\n\tstruct task_struct *task;\n\tstruct rt_mutex_base *lock;\n\tunsigned int wake_state;\n\tstruct ww_acquire_ctx *ww_ctx;\n};\n\ntypedef struct rt_rq *rt_rq_iter_t;\n\nstruct sigaltstack {\n\tvoid *ss_sp;\n\tint ss_flags;\n\t__kernel_size_t ss_size;\n};\n\ntypedef struct sigaltstack stack_t;\n\nstruct sigcontext_64 {\n\t__u64 r8;\n\t__u64 r9;\n\t__u64 r10;\n\t__u64 r11;\n\t__u64 r12;\n\t__u64 r13;\n\t__u64 r14;\n\t__u64 r15;\n\t__u64 di;\n\t__u64 si;\n\t__u64 bp;\n\t__u64 bx;\n\t__u64 dx;\n\t__u64 ax;\n\t__u64 cx;\n\t__u64 sp;\n\t__u64 ip;\n\t__u64 flags;\n\t__u16 cs;\n\t__u16 gs;\n\t__u16 fs;\n\t__u16 ss;\n\t__u64 err;\n\t__u64 trapno;\n\t__u64 oldmask;\n\t__u64 cr2;\n\t__u64 fpstate;\n\t__u64 reserved1[8];\n};\n\nstruct ucontext {\n\tlong unsigned int uc_flags;\n\tstruct ucontext *uc_link;\n\tstack_t uc_stack;\n\tstruct sigcontext_64 uc_mcontext;\n\tsigset_t uc_sigmask;\n};\n\nstruct rt_sigframe {\n\tchar *pretcode;\n\tstruct ucontext uc;\n\tstruct siginfo info;\n};\n\nstruct sigcontext_32 {\n\t__u16 gs;\n\t__u16 __gsh;\n\t__u16 fs;\n\t__u16 __fsh;\n\t__u16 es;\n\t__u16 __esh;\n\t__u16 ds;\n\t__u16 __dsh;\n\t__u32 di;\n\t__u32 si;\n\t__u32 bp;\n\t__u32 sp;\n\t__u32 bx;\n\t__u32 dx;\n\t__u32 cx;\n\t__u32 ax;\n\t__u32 trapno;\n\t__u32 err;\n\t__u32 ip;\n\t__u16 cs;\n\t__u16 __csh;\n\t__u32 flags;\n\t__u32 sp_at_signal;\n\t__u16 ss;\n\t__u16 __ssh;\n\t__u32 fpstate;\n\t__u32 oldmask;\n\t__u32 cr2;\n};\n\nstruct ucontext_ia32 {\n\tunsigned int uc_flags;\n\tunsigned int uc_link;\n\tcompat_stack_t uc_stack;\n\tstruct sigcontext_32 uc_mcontext;\n\tcompat_sigset_t uc_sigmask;\n};\n\nstruct rt_sigframe_ia32 {\n\tu32 pretcode;\n\tint sig;\n\tu32 pinfo;\n\tu32 puc;\n\tcompat_siginfo_t info;\n\tstruct ucontext_ia32 uc;\n\tchar retcode[8];\n};\n\nstruct wake_q_node;\n\nstruct wake_q_head {\n\tstruct wake_q_node *first;\n\tstruct wake_q_node **lastp;\n};\n\nstruct rt_wake_q_head {\n\tstruct wake_q_head head;\n\tstruct task_struct *rtlock_task;\n};\n\nstruct rta_cacheinfo {\n\t__u32 rta_clntref;\n\t__u32 rta_lastuse;\n\t__s32 rta_expires;\n\t__u32 rta_error;\n\t__u32 rta_used;\n\t__u32 rta_id;\n\t__u32 rta_ts;\n\t__u32 rta_tsage;\n};\n\nstruct rta_mfc_stats {\n\t__u64 mfcs_packets;\n\t__u64 mfcs_bytes;\n\t__u64 mfcs_wrong_if;\n};\n\nstruct rtc_param;\n\nstruct rtc_class_ops {\n\tint (*ioctl)(struct device *, unsigned int, long unsigned int);\n\tint (*read_time)(struct device *, struct rtc_time *);\n\tint (*set_time)(struct device *, struct rtc_time *);\n\tint (*read_alarm)(struct device *, struct rtc_wkalrm *);\n\tint (*set_alarm)(struct device *, struct rtc_wkalrm *);\n\tint (*proc)(struct device *, struct seq_file *);\n\tint (*alarm_irq_enable)(struct device *, unsigned int);\n\tint (*read_offset)(struct device *, long int *);\n\tint (*set_offset)(struct device *, long int);\n\tint (*param_get)(struct device *, struct rtc_param *);\n\tint (*param_set)(struct device *, struct rtc_param *);\n};\n\nstruct rtc_timer {\n\tstruct timerqueue_node node;\n\tktime_t period;\n\tvoid (*func)(struct rtc_device *);\n\tstruct rtc_device *rtc;\n\tint enabled;\n};\n\nstruct rtc_device {\n\tstruct device dev;\n\tstruct module *owner;\n\tint id;\n\tconst struct rtc_class_ops *ops;\n\tstruct mutex ops_lock;\n\tstruct cdev char_dev;\n\tlong unsigned int flags;\n\tlong unsigned int irq_data;\n\tspinlock_t irq_lock;\n\twait_queue_head_t irq_queue;\n\tstruct fasync_struct *async_queue;\n\tint irq_freq;\n\tint max_user_freq;\n\tstruct timerqueue_head timerqueue;\n\tstruct rtc_timer aie_timer;\n\tstruct rtc_timer uie_rtctimer;\n\tstruct hrtimer pie_timer;\n\tint pie_enabled;\n\tstruct work_struct irqwork;\n\tlong unsigned int set_offset_nsec;\n\tlong unsigned int features[1];\n\ttime64_t range_min;\n\ttimeu64_t range_max;\n\ttimeu64_t alarm_offset_max;\n\ttime64_t start_secs;\n\ttime64_t offset_secs;\n\tbool set_start_time;\n};\n\nstruct rtc_param {\n\t__u64 param;\n\tunion {\n\t\t__u64 uvalue;\n\t\t__s64 svalue;\n\t\t__u64 ptr;\n\t};\n\t__u32 index;\n\t__u32 __pad;\n};\n\nstruct rtentry {\n\tlong unsigned int rt_pad1;\n\tstruct sockaddr rt_dst;\n\tstruct sockaddr rt_gateway;\n\tstruct sockaddr rt_genmask;\n\tshort unsigned int rt_flags;\n\tshort int rt_pad2;\n\tlong unsigned int rt_pad3;\n\tvoid *rt_pad4;\n\tshort int rt_metric;\n\tchar *rt_dev;\n\tlong unsigned int rt_mtu;\n\tlong unsigned int rt_window;\n\tshort unsigned int rt_irtt;\n};\n\nstruct rtgenmsg {\n\tunsigned char rtgen_family;\n};\n\nstruct rtm_dump_res_bucket_ctx;\n\nstruct rtm_dump_nexthop_bucket_data {\n\tstruct rtm_dump_res_bucket_ctx *ctx;\n\tstruct nh_dump_filter filter;\n};\n\nstruct rtm_dump_nh_ctx {\n\tu32 idx;\n};\n\nstruct rtm_dump_res_bucket_ctx {\n\tstruct rtm_dump_nh_ctx nh;\n\tu16 bucket_index;\n};\n\nstruct rtmsg {\n\tunsigned char rtm_family;\n\tunsigned char rtm_dst_len;\n\tunsigned char rtm_src_len;\n\tunsigned char rtm_tos;\n\tunsigned char rtm_table;\n\tunsigned char rtm_protocol;\n\tunsigned char rtm_scope;\n\tunsigned char rtm_type;\n\tunsigned int rtm_flags;\n};\n\nstruct rtnexthop {\n\tshort unsigned int rtnh_len;\n\tunsigned char rtnh_flags;\n\tunsigned char rtnh_hops;\n\tint rtnh_ifindex;\n};\n\nstruct rtnl_af_ops {\n\tstruct list_head list;\n\tint family;\n\tint (*fill_link_af)(struct sk_buff *, const struct net_device *, u32);\n\tsize_t (*get_link_af_size)(const struct net_device *, u32);\n\tint (*validate_link_af)(const struct net_device *, const struct nlattr *, struct netlink_ext_ack *);\n\tint (*set_link_af)(struct net_device *, const struct nlattr *, struct netlink_ext_ack *);\n\tint (*fill_stats_af)(struct sk_buff *, const struct net_device *);\n\tsize_t (*get_stats_af_size)(const struct net_device *);\n};\n\ntypedef int (*rtnl_doit_func)(struct sk_buff *, struct nlmsghdr *, struct netlink_ext_ack *);\n\ntypedef int (*rtnl_dumpit_func)(struct sk_buff *, struct netlink_callback *);\n\nstruct rtnl_link {\n\trtnl_doit_func doit;\n\trtnl_dumpit_func dumpit;\n\tstruct module *owner;\n\tunsigned int flags;\n\tstruct callback_head rcu;\n};\n\nstruct rtnl_link_ifmap {\n\t__u64 mem_start;\n\t__u64 mem_end;\n\t__u64 base_addr;\n\t__u16 irq;\n\t__u8 dma;\n\t__u8 port;\n};\n\nstruct rtnl_link_ops {\n\tstruct list_head list;\n\tconst char *kind;\n\tsize_t priv_size;\n\tstruct net_device * (*alloc)(struct nlattr **, const char *, unsigned char, unsigned int, unsigned int);\n\tvoid (*setup)(struct net_device *);\n\tbool netns_refund;\n\tunsigned int maxtype;\n\tconst struct nla_policy *policy;\n\tint (*validate)(struct nlattr **, struct nlattr **, struct netlink_ext_ack *);\n\tint (*newlink)(struct net *, struct net_device *, struct nlattr **, struct nlattr **, struct netlink_ext_ack *);\n\tint (*changelink)(struct net_device *, struct nlattr **, struct nlattr **, struct netlink_ext_ack *);\n\tvoid (*dellink)(struct net_device *, struct list_head *);\n\tsize_t (*get_size)(const struct net_device *);\n\tint (*fill_info)(struct sk_buff *, const struct net_device *);\n\tsize_t (*get_xstats_size)(const struct net_device *);\n\tint (*fill_xstats)(struct sk_buff *, const struct net_device *);\n\tunsigned int (*get_num_tx_queues)(void);\n\tunsigned int (*get_num_rx_queues)(void);\n\tunsigned int slave_maxtype;\n\tconst struct nla_policy *slave_policy;\n\tint (*slave_changelink)(struct net_device *, struct net_device *, struct nlattr **, struct nlattr **, struct netlink_ext_ack *);\n\tsize_t (*get_slave_size)(const struct net_device *, const struct net_device *);\n\tint (*fill_slave_info)(struct sk_buff *, const struct net_device *, const struct net_device *);\n\tstruct net * (*get_link_net)(const struct net_device *);\n\tsize_t (*get_linkxstats_size)(const struct net_device *, int);\n\tint (*fill_linkxstats)(struct sk_buff *, const struct net_device *, int *, int);\n};\n\nstruct rtnl_link_stats {\n\t__u32 rx_packets;\n\t__u32 tx_packets;\n\t__u32 rx_bytes;\n\t__u32 tx_bytes;\n\t__u32 rx_errors;\n\t__u32 tx_errors;\n\t__u32 rx_dropped;\n\t__u32 tx_dropped;\n\t__u32 multicast;\n\t__u32 collisions;\n\t__u32 rx_length_errors;\n\t__u32 rx_over_errors;\n\t__u32 rx_crc_errors;\n\t__u32 rx_frame_errors;\n\t__u32 rx_fifo_errors;\n\t__u32 rx_missed_errors;\n\t__u32 tx_aborted_errors;\n\t__u32 tx_carrier_errors;\n\t__u32 tx_fifo_errors;\n\t__u32 tx_heartbeat_errors;\n\t__u32 tx_window_errors;\n\t__u32 rx_compressed;\n\t__u32 tx_compressed;\n\t__u32 rx_nohandler;\n};\n\nstruct rtnl_mdb_dump_ctx {\n\tlong int idx;\n};\n\nstruct rtnl_msg_handler {\n\tstruct module *owner;\n\tint protocol;\n\tint msgtype;\n\trtnl_doit_func doit;\n\trtnl_dumpit_func dumpit;\n\tint flags;\n};\n\nstruct rtnl_net_dump_cb {\n\tstruct net *tgt_net;\n\tstruct net *ref_net;\n\tstruct sk_buff *skb;\n\tstruct net_fill_args fillargs;\n\tint idx;\n\tint s_idx;\n};\n\nstruct rtnl_newlink_tbs {\n\tstruct nlattr *tb[66];\n\tstruct nlattr *attr[51];\n\tstruct nlattr *slave_attr[45];\n};\n\nstruct rtnl_offload_xstats_request_used {\n\tbool request;\n\tbool used;\n};\n\nstruct rtnl_stats_dump_filters {\n\tu32 mask[6];\n};\n\nstruct rtree_node {\n\tstruct list_head list;\n\tlong unsigned int *data;\n};\n\nstruct rtvia {\n\t__kernel_sa_family_t rtvia_family;\n\t__u8 rtvia_addr[0];\n};\n\nstruct rusage {\n\tstruct __kernel_old_timeval ru_utime;\n\tstruct __kernel_old_timeval ru_stime;\n\t__kernel_long_t ru_maxrss;\n\t__kernel_long_t ru_ixrss;\n\t__kernel_long_t ru_idrss;\n\t__kernel_long_t ru_isrss;\n\t__kernel_long_t ru_minflt;\n\t__kernel_long_t ru_majflt;\n\t__kernel_long_t ru_nswap;\n\t__kernel_long_t ru_inblock;\n\t__kernel_long_t ru_oublock;\n\t__kernel_long_t ru_msgsnd;\n\t__kernel_long_t ru_msgrcv;\n\t__kernel_long_t ru_nsignals;\n\t__kernel_long_t ru_nvcsw;\n\t__kernel_long_t ru_nivcsw;\n};\n\nstruct rv_interface {\n\tstruct dentry *root_dir;\n\tstruct dentry *monitors_dir;\n};\n\nstruct rv_monitor {\n\tconst char *name;\n\tconst char *description;\n\tbool enabled;\n\tint (*enable)(void);\n\tvoid (*disable)(void);\n\tvoid (*reset)(void);\n\tvoid (*react)(char *);\n};\n\nstruct rv_reactor_def;\n\nstruct rv_monitor_def {\n\tstruct list_head list;\n\tstruct rv_monitor *monitor;\n\tstruct dentry *root_d;\n\tstruct rv_reactor_def *rdef;\n\tbool reacting;\n\tbool task_monitor;\n};\n\nstruct rv_reactor {\n\tconst char *name;\n\tconst char *description;\n\tvoid (*react)(char *);\n};\n\nstruct rv_reactor_def {\n\tstruct list_head list;\n\tstruct rv_reactor *reactor;\n\tint counter;\n};\n\nunion rv_task_monitor {\n\tstruct da_monitor da_mon;\n};\n\ntypedef struct rw_semaphore *class_rwsem_read_t;\n\nstruct rwrt_feature_desc {\n\t__be16 feature_code;\n\t__u8 curr: 1;\n\t__u8 persistent: 1;\n\t__u8 feature_version: 4;\n\t__u8 reserved1: 2;\n\t__u8 add_len;\n\t__u32 last_lba;\n\t__u32 block_size;\n\t__u16 blocking;\n\t__u8 page_present: 1;\n\t__u8 reserved2: 7;\n\t__u8 reserved3;\n};\n\nstruct rwsem_waiter {\n\tstruct list_head list;\n\tstruct task_struct *task;\n\tenum rwsem_waiter_type type;\n\tlong unsigned int timeout;\n\tbool handoff_set;\n};\n\nstruct rx_queue_attribute {\n\tstruct attribute attr;\n\tssize_t (*show)(struct netdev_rx_queue *, char *);\n\tssize_t (*store)(struct netdev_rx_queue *, const char *, size_t);\n};\n\nstruct s {\n\t__be32 conv;\n};\n\nstruct s3_save {\n\tu32 command;\n\tu32 dev_nt;\n\tu64 dcbaa_ptr;\n\tu32 config_reg;\n};\n\nstruct s_data {\n\tstruct sched_domain **sd;\n\tstruct root_domain *rd;\n};\n\nstruct value_name_pair;\n\nstruct sa_name_list {\n\tint opcode;\n\tconst struct value_name_pair *arr;\n\tint arr_sz;\n};\n\nstruct samsung_sdi_battery {\n\tchar *compatible;\n\tchar *name;\n\tstruct power_supply_battery_info info;\n};\n\nstruct saved_alias {\n\tstruct kmem_cache *s;\n\tconst char *name;\n\tstruct saved_alias *next;\n};\n\nstruct saved_cmdlines_buffer {\n\tunsigned int map_pid_to_cmdline[32769];\n\tunsigned int *map_cmdline_to_pid;\n\tunsigned int cmdline_num;\n\tint cmdline_idx;\n\tchar saved_cmdlines[0];\n};\n\nstruct saved_msr;\n\nstruct saved_msrs {\n\tunsigned int num;\n\tstruct saved_msr *array;\n};\n\nstruct saved_context {\n\tstruct pt_regs regs;\n\tu16 ds;\n\tu16 es;\n\tu16 fs;\n\tu16 gs;\n\tlong unsigned int kernelmode_gs_base;\n\tlong unsigned int usermode_gs_base;\n\tlong unsigned int fs_base;\n\tlong unsigned int cr0;\n\tlong unsigned int cr2;\n\tlong unsigned int cr3;\n\tlong unsigned int cr4;\n\tu64 misc_enable;\n\tstruct saved_msrs saved_msrs;\n\tlong unsigned int efer;\n\tu16 gdt_pad;\n\tstruct desc_ptr gdt_desc;\n\tu16 idt_pad;\n\tstruct desc_ptr idt;\n\tu16 ldt;\n\tu16 tss;\n\tlong unsigned int tr;\n\tlong unsigned int safety;\n\tlong unsigned int return_address;\n\tbool misc_enable_saved;\n} __attribute__((packed));\n\nstruct saved_msr {\n\tbool valid;\n\tstruct msr_info info;\n};\n\nstruct saved_syn {\n\tu32 mac_hdrlen;\n\tu32 network_hdrlen;\n\tu32 tcp_hdrlen;\n\tu8 data[0];\n};\n\nstruct sb_writers {\n\tshort unsigned int frozen;\n\tint freeze_kcount;\n\tint freeze_ucount;\n\tstruct percpu_rw_semaphore rw_sem[3];\n};\n\nstruct sbitmap_word {\n\tlong unsigned int word;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong unsigned int cleared;\n\traw_spinlock_t swap_lock;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct sbq_wait {\n\tstruct sbitmap_queue *sbq;\n\tstruct wait_queue_entry wait;\n};\n\nstruct sbq_wait_state {\n\twait_queue_head_t wait;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct scan_area {\n\tu64 addr;\n\tu64 size;\n};\n\nstruct scan_control {\n\tlong unsigned int nr_to_reclaim;\n\tnodemask_t *nodemask;\n\tstruct mem_cgroup *target_mem_cgroup;\n\tlong unsigned int anon_cost;\n\tlong unsigned int file_cost;\n\tint *proactive_swappiness;\n\tunsigned int may_deactivate: 2;\n\tunsigned int force_deactivate: 1;\n\tunsigned int skipped_deactivate: 1;\n\tunsigned int may_writepage: 1;\n\tunsigned int may_unmap: 1;\n\tunsigned int may_swap: 1;\n\tunsigned int no_cache_trim_mode: 1;\n\tunsigned int cache_trim_mode_failed: 1;\n\tunsigned int proactive: 1;\n\tunsigned int memcg_low_reclaim: 1;\n\tunsigned int memcg_low_skipped: 1;\n\tunsigned int memcg_full_walk: 1;\n\tunsigned int hibernation_mode: 1;\n\tunsigned int compaction_ready: 1;\n\tunsigned int cache_trim_mode: 1;\n\tunsigned int file_is_tiny: 1;\n\tunsigned int no_demotion: 1;\n\ts8 order;\n\ts8 priority;\n\ts8 reclaim_idx;\n\tgfp_t gfp_mask;\n\tlong unsigned int nr_scanned;\n\tlong unsigned int nr_reclaimed;\n\tstruct {\n\t\tunsigned int dirty;\n\t\tunsigned int unqueued_dirty;\n\t\tunsigned int congested;\n\t\tunsigned int writeback;\n\t\tunsigned int immediate;\n\t\tunsigned int file_taken;\n\t\tunsigned int taken;\n\t} nr;\n\tstruct reclaim_state reclaim_state;\n};\n\nstruct scatter_walk {\n\tstruct scatterlist *sg;\n\tunsigned int offset;\n};\n\nstruct sccnxp_chip {\n\tconst char *name;\n\tunsigned int nr;\n\tlong unsigned int freq_min;\n\tlong unsigned int freq_std;\n\tlong unsigned int freq_max;\n\tunsigned int flags;\n\tunsigned int fifosize;\n\tunsigned int trwd;\n};\n\nstruct sccnxp_pdata {\n\tconst u8 reg_shift;\n\tconst u32 mctrl_cfg[2];\n\tconst unsigned int poll_time_us;\n};\n\nstruct uart_driver {\n\tstruct module *owner;\n\tconst char *driver_name;\n\tconst char *dev_name;\n\tint major;\n\tint minor;\n\tint nr;\n\tstruct console *cons;\n\tstruct uart_state *state;\n\tstruct tty_driver *tty_driver;\n};\n\nstruct sccnxp_port {\n\tstruct uart_driver uart;\n\tstruct uart_port port[2];\n\tbool opened[2];\n\tint irq;\n\tu8 imr;\n\tstruct sccnxp_chip *chip;\n\tstruct console console;\n\tspinlock_t lock;\n\tbool poll;\n\tstruct timer_list timer;\n\tstruct sccnxp_pdata pdata;\n\tstruct regulator *regulator;\n};\n\nstruct sch_frag_data {\n\tlong unsigned int dst;\n\tstruct qdisc_skb_cb cb;\n\t__be16 inner_protocol;\n\tu16 vlan_tci;\n\t__be16 vlan_proto;\n\tunsigned int l2_len;\n\tu8 l2_data[18];\n\tint (*xmit)(struct sk_buff *);\n};\n\nstruct sched_attr {\n\t__u32 size;\n\t__u32 sched_policy;\n\t__u64 sched_flags;\n\t__s32 sched_nice;\n\t__u32 sched_priority;\n\t__u64 sched_runtime;\n\t__u64 sched_deadline;\n\t__u64 sched_period;\n\t__u32 sched_util_min;\n\t__u32 sched_util_max;\n};\n\nstruct sched_class {\n\tint uclamp_enabled;\n\tvoid (*enqueue_task)(struct rq *, struct task_struct *, int);\n\tvoid (*dequeue_task)(struct rq *, struct task_struct *, int);\n\tvoid (*yield_task)(struct rq *);\n\tbool (*yield_to_task)(struct rq *, struct task_struct *);\n\tvoid (*wakeup_preempt)(struct rq *, struct task_struct *, int);\n\tstruct task_struct * (*pick_next_task)(struct rq *);\n\tvoid (*put_prev_task)(struct rq *, struct task_struct *);\n\tvoid (*set_next_task)(struct rq *, struct task_struct *, bool);\n\tint (*balance)(struct rq *, struct task_struct *, struct rq_flags *);\n\tint (*select_task_rq)(struct task_struct *, int, int);\n\tstruct task_struct * (*pick_task)(struct rq *);\n\tvoid (*migrate_task_rq)(struct task_struct *, int);\n\tvoid (*task_woken)(struct rq *, struct task_struct *);\n\tvoid (*set_cpus_allowed)(struct task_struct *, struct affinity_context *);\n\tvoid (*rq_online)(struct rq *);\n\tvoid (*rq_offline)(struct rq *);\n\tstruct rq * (*find_lock_rq)(struct task_struct *, struct rq *);\n\tvoid (*task_tick)(struct rq *, struct task_struct *, int);\n\tvoid (*task_fork)(struct task_struct *);\n\tvoid (*task_dead)(struct task_struct *);\n\tvoid (*switched_from)(struct rq *, struct task_struct *);\n\tvoid (*switched_to)(struct rq *, struct task_struct *);\n\tvoid (*prio_changed)(struct rq *, struct task_struct *, int);\n\tunsigned int (*get_rr_interval)(struct rq *, struct task_struct *);\n\tvoid (*update_curr)(struct rq *);\n\tvoid (*task_change_group)(struct task_struct *);\n\tint (*task_is_throttled)(struct task_struct *, int);\n};\n\nstruct sched_clock_data {\n\tu64 tick_raw;\n\tu64 tick_gtod;\n\tu64 clock;\n};\n\nstruct sched_core_cookie {\n\trefcount_t refcnt;\n};\n\nstruct sched_dl_entity;\n\ntypedef bool (*dl_server_has_tasks_f)(struct sched_dl_entity *);\n\ntypedef struct task_struct * (*dl_server_pick_f)(struct sched_dl_entity *);\n\nstruct sched_dl_entity {\n\tstruct rb_node rb_node;\n\tu64 dl_runtime;\n\tu64 dl_deadline;\n\tu64 dl_period;\n\tu64 dl_bw;\n\tu64 dl_density;\n\ts64 runtime;\n\tu64 deadline;\n\tunsigned int flags;\n\tunsigned int dl_throttled: 1;\n\tunsigned int dl_yielded: 1;\n\tunsigned int dl_non_contending: 1;\n\tunsigned int dl_overrun: 1;\n\tunsigned int dl_server: 1;\n\tstruct hrtimer dl_timer;\n\tstruct hrtimer inactive_timer;\n\tstruct rq *rq;\n\tdl_server_has_tasks_f server_has_tasks;\n\tdl_server_pick_f server_pick;\n\tstruct sched_dl_entity *pi_se;\n};\n\nstruct sched_group;\n\nstruct sched_domain_shared;\n\nstruct sched_domain {\n\tstruct sched_domain *parent;\n\tstruct sched_domain *child;\n\tstruct sched_group *groups;\n\tlong unsigned int min_interval;\n\tlong unsigned int max_interval;\n\tunsigned int busy_factor;\n\tunsigned int imbalance_pct;\n\tunsigned int cache_nice_tries;\n\tunsigned int imb_numa_nr;\n\tint nohz_idle;\n\tint flags;\n\tint level;\n\tlong unsigned int last_balance;\n\tunsigned int balance_interval;\n\tunsigned int nr_balance_failed;\n\tu64 max_newidle_lb_cost;\n\tlong unsigned int last_decay_max_lb_cost;\n\tunsigned int lb_count[3];\n\tunsigned int lb_failed[3];\n\tunsigned int lb_balanced[3];\n\tunsigned int lb_imbalance[3];\n\tunsigned int lb_gained[3];\n\tunsigned int lb_hot_gained[3];\n\tunsigned int lb_nobusyg[3];\n\tunsigned int lb_nobusyq[3];\n\tunsigned int alb_count;\n\tunsigned int alb_failed;\n\tunsigned int alb_pushed;\n\tunsigned int sbe_count;\n\tunsigned int sbe_balanced;\n\tunsigned int sbe_pushed;\n\tunsigned int sbf_count;\n\tunsigned int sbf_balanced;\n\tunsigned int sbf_pushed;\n\tunsigned int ttwu_wake_remote;\n\tunsigned int ttwu_move_affine;\n\tunsigned int ttwu_move_balance;\n\tchar *name;\n\tunion {\n\t\tvoid *private;\n\t\tstruct callback_head rcu;\n\t};\n\tstruct sched_domain_shared *shared;\n\tunsigned int span_weight;\n\tlong unsigned int span[0];\n};\n\nstruct sched_domain_attr {\n\tint relax_domain_level;\n};\n\nstruct sched_domain_shared {\n\tatomic_t ref;\n\tatomic_t nr_busy_cpus;\n\tint has_idle_cores;\n\tint nr_idle_scan;\n};\n\ntypedef const struct cpumask * (*sched_domain_mask_f)(int);\n\ntypedef int (*sched_domain_flags_f)(void);\n\nstruct sched_group_capacity;\n\nstruct sd_data {\n\tstruct sched_domain **sd;\n\tstruct sched_domain_shared **sds;\n\tstruct sched_group **sg;\n\tstruct sched_group_capacity **sgc;\n};\n\nstruct sched_domain_topology_level {\n\tsched_domain_mask_f mask;\n\tsched_domain_flags_f sd_flags;\n\tint flags;\n\tint numa_level;\n\tstruct sd_data data;\n\tchar *name;\n};\n\nstruct sched_entity {\n\tstruct load_weight load;\n\tstruct rb_node run_node;\n\tu64 deadline;\n\tu64 min_vruntime;\n\tstruct list_head group_node;\n\tunsigned int on_rq;\n\tu64 exec_start;\n\tu64 sum_exec_runtime;\n\tu64 prev_sum_exec_runtime;\n\tu64 vruntime;\n\ts64 vlag;\n\tu64 slice;\n\tu64 nr_migrations;\n\tint depth;\n\tstruct sched_entity *parent;\n\tstruct cfs_rq *cfs_rq;\n\tstruct cfs_rq *my_q;\n\tlong unsigned int runnable_weight;\n\tlong: 64;\n\tlong: 64;\n\tstruct sched_avg avg;\n};\n\nstruct sched_statistics {\n\tu64 wait_start;\n\tu64 wait_max;\n\tu64 wait_count;\n\tu64 wait_sum;\n\tu64 iowait_count;\n\tu64 iowait_sum;\n\tu64 sleep_start;\n\tu64 sleep_max;\n\ts64 sum_sleep_runtime;\n\tu64 block_start;\n\tu64 block_max;\n\ts64 sum_block_runtime;\n\ts64 exec_max;\n\tu64 slice_max;\n\tu64 nr_migrations_cold;\n\tu64 nr_failed_migrations_affine;\n\tu64 nr_failed_migrations_running;\n\tu64 nr_failed_migrations_hot;\n\tu64 nr_forced_migrations;\n\tu64 nr_wakeups;\n\tu64 nr_wakeups_sync;\n\tu64 nr_wakeups_migrate;\n\tu64 nr_wakeups_local;\n\tu64 nr_wakeups_remote;\n\tu64 nr_wakeups_affine;\n\tu64 nr_wakeups_affine_attempts;\n\tu64 nr_wakeups_passive;\n\tu64 nr_wakeups_idle;\n\tu64 core_forceidle_sum;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct sched_entity_stats {\n\tstruct sched_entity se;\n\tstruct sched_statistics stats;\n};\n\nstruct sched_group {\n\tstruct sched_group *next;\n\tatomic_t ref;\n\tunsigned int group_weight;\n\tunsigned int cores;\n\tstruct sched_group_capacity *sgc;\n\tint asym_prefer_cpu;\n\tint flags;\n\tlong unsigned int cpumask[0];\n};\n\nstruct sched_group_capacity {\n\tatomic_t ref;\n\tlong unsigned int capacity;\n\tlong unsigned int min_capacity;\n\tlong unsigned int max_capacity;\n\tlong unsigned int next_update;\n\tint imbalance;\n\tint id;\n\tlong unsigned int cpumask[0];\n};\n\nstruct sched_param {\n\tint sched_priority;\n};\n\nstruct sched_pin_override {\n\tint32_t pcpu;\n};\n\nstruct sched_poll {\n\t__guest_handle_evtchn_port_t ports;\n\tunsigned int nr_ports;\n\tuint64_t timeout;\n};\n\nstruct sched_rt_entity {\n\tstruct list_head run_list;\n\tlong unsigned int timeout;\n\tlong unsigned int watchdog_stamp;\n\tunsigned int time_slice;\n\tshort unsigned int on_rq;\n\tshort unsigned int on_list;\n\tstruct sched_rt_entity *back;\n};\n\nstruct sched_shutdown {\n\tunsigned int reason;\n};\n\nstruct scm_fp_list;\n\nstruct scm_cookie {\n\tstruct pid *pid;\n\tstruct scm_fp_list *fp;\n\tstruct scm_creds creds;\n\tu32 secid;\n};\n\nstruct unix_edge;\n\nstruct scm_fp_list {\n\tshort int count;\n\tshort int count_unix;\n\tshort int max;\n\tbool inflight;\n\tbool dead;\n\tstruct list_head vertices;\n\tstruct unix_edge *edges;\n\tstruct user_struct *user;\n\tstruct file *fp[253];\n};\n\nstruct scm_stat {\n\tatomic_t nr_fds;\n\tlong unsigned int nr_unix_fds;\n};\n\nstruct scm_timestamping {\n\tstruct __kernel_old_timespec ts[3];\n};\n\nstruct scm_timestamping64 {\n\tstruct __kernel_timespec ts[3];\n};\n\nstruct scm_timestamping_internal {\n\tstruct timespec64 ts[3];\n};\n\nstruct scm_ts_pktinfo {\n\t__u32 if_index;\n\t__u32 pkt_length;\n\t__u32 reserved[2];\n};\n\nstruct scomp_alg {\n\tvoid * (*alloc_ctx)(struct crypto_scomp *);\n\tvoid (*free_ctx)(struct crypto_scomp *, void *);\n\tint (*compress)(struct crypto_scomp *, const u8 *, unsigned int, u8 *, unsigned int *, void *);\n\tint (*decompress)(struct crypto_scomp *, const u8 *, unsigned int, u8 *, unsigned int *, void *);\n\tunion {\n\t\tstruct {\n\t\t\tstruct crypto_alg base;\n\t\t};\n\t\tstruct comp_alg_common calg;\n\t};\n};\n\nstruct scomp_scratch {\n\tspinlock_t lock;\n\tvoid *src;\n\tvoid *dst;\n};\n\nstruct scratches_to_free {\n\tstruct callback_head rcu;\n\tunsigned int cnt;\n\tvoid *scratches[0];\n};\n\nstruct scsi_cd {\n\tunsigned int capacity;\n\tstruct scsi_device *device;\n\tunsigned int vendor;\n\tlong unsigned int ms_offset;\n\tunsigned int writeable: 1;\n\tunsigned int use: 1;\n\tunsigned int xa_flag: 1;\n\tunsigned int readcd_known: 1;\n\tunsigned int readcd_cdda: 1;\n\tunsigned int media_present: 1;\n\tint tur_mismatch;\n\tbool tur_changed: 1;\n\tbool get_event_changed: 1;\n\tbool ignore_get_event: 1;\n\tstruct cdrom_device_info cdi;\n\tstruct mutex lock;\n\tstruct gendisk *disk;\n};\n\ntypedef struct scsi_cd Scsi_CD;\n\nstruct scsi_data_buffer {\n\tstruct sg_table table;\n\tunsigned int length;\n};\n\nstruct scsi_cmnd {\n\tstruct scsi_device *device;\n\tstruct list_head eh_entry;\n\tstruct delayed_work abort_work;\n\tstruct callback_head rcu;\n\tint eh_eflags;\n\tint budget_token;\n\tlong unsigned int jiffies_at_alloc;\n\tint retries;\n\tint allowed;\n\tunsigned char prot_op;\n\tunsigned char prot_type;\n\tunsigned char prot_flags;\n\tenum scsi_cmnd_submitter submitter;\n\tshort unsigned int cmd_len;\n\tenum dma_data_direction sc_data_direction;\n\tunsigned char cmnd[32];\n\tstruct scsi_data_buffer sdb;\n\tstruct scsi_data_buffer *prot_sdb;\n\tunsigned int underflow;\n\tunsigned int transfersize;\n\tunsigned int resid_len;\n\tunsigned int sense_len;\n\tunsigned char *sense_buffer;\n\tint flags;\n\tlong unsigned int state;\n\tunsigned int extra_len;\n\tunsigned char *host_scribble;\n\tint result;\n};\n\nstruct scsi_dev_info_list {\n\tstruct list_head dev_info_list;\n\tchar vendor[8];\n\tchar model[16];\n\tblist_flags_t flags;\n\tunsigned int compatible;\n};\n\nstruct scsi_dev_info_list_table {\n\tstruct list_head node;\n\tstruct list_head scsi_dev_info_list;\n\tconst char *name;\n\tint key;\n};\n\nstruct scsi_vpd;\n\nstruct scsi_target;\n\nstruct scsi_device_handler;\n\nstruct scsi_device {\n\tstruct Scsi_Host *host;\n\tstruct request_queue *request_queue;\n\tstruct list_head siblings;\n\tstruct list_head same_target_siblings;\n\tstruct sbitmap budget_map;\n\tatomic_t device_blocked;\n\tatomic_t restarts;\n\tspinlock_t list_lock;\n\tstruct list_head starved_entry;\n\tshort unsigned int queue_depth;\n\tshort unsigned int max_queue_depth;\n\tshort unsigned int last_queue_full_depth;\n\tshort unsigned int last_queue_full_count;\n\tlong unsigned int last_queue_full_time;\n\tlong unsigned int queue_ramp_up_period;\n\tlong unsigned int last_queue_ramp_up;\n\tunsigned int id;\n\tunsigned int channel;\n\tu64 lun;\n\tunsigned int manufacturer;\n\tunsigned int sector_size;\n\tvoid *hostdata;\n\tunsigned char type;\n\tchar scsi_level;\n\tchar inq_periph_qual;\n\tstruct mutex inquiry_mutex;\n\tunsigned char inquiry_len;\n\tunsigned char *inquiry;\n\tconst char *vendor;\n\tconst char *model;\n\tconst char *rev;\n\tstruct scsi_vpd *vpd_pg0;\n\tstruct scsi_vpd *vpd_pg83;\n\tstruct scsi_vpd *vpd_pg80;\n\tstruct scsi_vpd *vpd_pg89;\n\tstruct scsi_vpd *vpd_pgb0;\n\tstruct scsi_vpd *vpd_pgb1;\n\tstruct scsi_vpd *vpd_pgb2;\n\tstruct scsi_vpd *vpd_pgb7;\n\tstruct scsi_target *sdev_target;\n\tblist_flags_t sdev_bflags;\n\tunsigned int eh_timeout;\n\tunsigned int manage_system_start_stop: 1;\n\tunsigned int manage_runtime_start_stop: 1;\n\tunsigned int manage_shutdown: 1;\n\tunsigned int force_runtime_start_on_system_start: 1;\n\tunsigned int removable: 1;\n\tunsigned int changed: 1;\n\tunsigned int busy: 1;\n\tunsigned int lockable: 1;\n\tunsigned int locked: 1;\n\tunsigned int borken: 1;\n\tunsigned int disconnect: 1;\n\tunsigned int soft_reset: 1;\n\tunsigned int sdtr: 1;\n\tunsigned int wdtr: 1;\n\tunsigned int ppr: 1;\n\tunsigned int tagged_supported: 1;\n\tunsigned int simple_tags: 1;\n\tunsigned int was_reset: 1;\n\tunsigned int expecting_cc_ua: 1;\n\tunsigned int use_10_for_rw: 1;\n\tunsigned int use_10_for_ms: 1;\n\tunsigned int set_dbd_for_ms: 1;\n\tunsigned int read_before_ms: 1;\n\tunsigned int no_report_opcodes: 1;\n\tunsigned int no_write_same: 1;\n\tunsigned int use_16_for_rw: 1;\n\tunsigned int use_16_for_sync: 1;\n\tunsigned int skip_ms_page_8: 1;\n\tunsigned int skip_ms_page_3f: 1;\n\tunsigned int skip_vpd_pages: 1;\n\tunsigned int try_vpd_pages: 1;\n\tunsigned int use_192_bytes_for_3f: 1;\n\tunsigned int no_start_on_add: 1;\n\tunsigned int allow_restart: 1;\n\tunsigned int start_stop_pwr_cond: 1;\n\tunsigned int no_uld_attach: 1;\n\tunsigned int select_no_atn: 1;\n\tunsigned int fix_capacity: 1;\n\tunsigned int guess_capacity: 1;\n\tunsigned int retry_hwerror: 1;\n\tunsigned int last_sector_bug: 1;\n\tunsigned int no_read_disc_info: 1;\n\tunsigned int no_read_capacity_16: 1;\n\tunsigned int try_rc_10_first: 1;\n\tunsigned int security_supported: 1;\n\tunsigned int is_visible: 1;\n\tunsigned int wce_default_on: 1;\n\tunsigned int no_dif: 1;\n\tunsigned int broken_fua: 1;\n\tunsigned int lun_in_cdb: 1;\n\tunsigned int unmap_limit_for_ws: 1;\n\tunsigned int rpm_autosuspend: 1;\n\tunsigned int ignore_media_change: 1;\n\tunsigned int silence_suspend: 1;\n\tunsigned int no_vpd_size: 1;\n\tunsigned int cdl_supported: 1;\n\tunsigned int cdl_enable: 1;\n\tunsigned int queue_stopped;\n\tbool offline_already;\n\tatomic_t disk_events_disable_depth;\n\tlong unsigned int supported_events[1];\n\tlong unsigned int pending_events[1];\n\tstruct list_head event_list;\n\tstruct work_struct event_work;\n\tunsigned int max_device_blocked;\n\tatomic_t iorequest_cnt;\n\tatomic_t iodone_cnt;\n\tatomic_t ioerr_cnt;\n\tatomic_t iotmo_cnt;\n\tstruct device sdev_gendev;\n\tstruct device sdev_dev;\n\tstruct work_struct requeue_work;\n\tstruct scsi_device_handler *handler;\n\tvoid *handler_data;\n\tsize_t dma_drain_len;\n\tvoid *dma_drain_buf;\n\tunsigned int sg_timeout;\n\tunsigned int sg_reserved_size;\n\tstruct bsg_device *bsg_dev;\n\tunsigned char access_state;\n\tstruct mutex state_mutex;\n\tenum scsi_device_state sdev_state;\n\tstruct task_struct *quiesced_by;\n\tlong unsigned int sdev_data[0];\n};\n\ntypedef void (*activate_complete)(void *, int);\n\nstruct scsi_device_handler {\n\tstruct list_head list;\n\tstruct module *module;\n\tconst char *name;\n\tenum scsi_disposition (*check_sense)(struct scsi_device *, struct scsi_sense_hdr *);\n\tint (*attach)(struct scsi_device *);\n\tvoid (*detach)(struct scsi_device *);\n\tint (*activate)(struct scsi_device *, activate_complete, void *);\n\tblk_status_t (*prep_fn)(struct scsi_device *, struct request *);\n\tint (*set_params)(struct scsi_device *, const char *);\n\tvoid (*rescan)(struct scsi_device *);\n};\n\nstruct scsi_dh_blist {\n\tconst char *vendor;\n\tconst char *model;\n\tconst char *driver;\n};\n\nstruct zoned_disk_info {\n\tu32 nr_zones;\n\tu32 zone_blocks;\n};\n\nstruct scsi_disk {\n\tstruct scsi_device *device;\n\tstruct device disk_dev;\n\tstruct gendisk *disk;\n\tstruct opal_dev *opal_dev;\n\tstruct zoned_disk_info early_zone_info;\n\tstruct zoned_disk_info zone_info;\n\tu32 zones_optimal_open;\n\tu32 zones_optimal_nonseq;\n\tu32 zones_max_open;\n\tu32 zone_starting_lba_gran;\n\tatomic_t openers;\n\tsector_t capacity;\n\tint max_retries;\n\tu32 min_xfer_blocks;\n\tu32 max_xfer_blocks;\n\tu32 opt_xfer_blocks;\n\tu32 max_ws_blocks;\n\tu32 max_unmap_blocks;\n\tu32 unmap_granularity;\n\tu32 unmap_alignment;\n\tu32 max_atomic;\n\tu32 atomic_alignment;\n\tu32 atomic_granularity;\n\tu32 max_atomic_with_boundary;\n\tu32 max_atomic_boundary;\n\tu32 index;\n\tunsigned int physical_block_size;\n\tunsigned int max_medium_access_timeouts;\n\tunsigned int medium_access_timed_out;\n\tu16 permanent_stream_count;\n\tu8 media_present;\n\tu8 write_prot;\n\tu8 protection_type;\n\tu8 provisioning_mode;\n\tu8 zeroing_mode;\n\tu8 nr_actuators;\n\tbool suspended;\n\tunsigned int ATO: 1;\n\tunsigned int cache_override: 1;\n\tunsigned int WCE: 1;\n\tunsigned int RCD: 1;\n\tunsigned int DPOFUA: 1;\n\tunsigned int first_scan: 1;\n\tunsigned int lbpme: 1;\n\tunsigned int lbprz: 1;\n\tunsigned int lbpu: 1;\n\tunsigned int lbpws: 1;\n\tunsigned int lbpws10: 1;\n\tunsigned int lbpvpd: 1;\n\tunsigned int ws10: 1;\n\tunsigned int ws16: 1;\n\tunsigned int rc_basis: 2;\n\tunsigned int zoned: 2;\n\tunsigned int urswrz: 1;\n\tunsigned int security: 1;\n\tunsigned int ignore_medium_access_errors: 1;\n\tunsigned int rscs: 1;\n\tunsigned int use_atomic_write_boundary: 1;\n};\n\nstruct scsi_driver {\n\tstruct device_driver gendrv;\n\tint (*resume)(struct device *);\n\tvoid (*rescan)(struct device *);\n\tblk_status_t (*init_command)(struct scsi_cmnd *);\n\tvoid (*uninit_command)(struct scsi_cmnd *);\n\tint (*done)(struct scsi_cmnd *);\n\tint (*eh_action)(struct scsi_cmnd *, int);\n\tvoid (*eh_reset)(struct scsi_cmnd *);\n};\n\nstruct scsi_eh_save {\n\tint result;\n\tunsigned int resid_len;\n\tint eh_eflags;\n\tenum dma_data_direction data_direction;\n\tunsigned int underflow;\n\tunsigned char cmd_len;\n\tunsigned char prot_op;\n\tunsigned char cmnd[32];\n\tstruct scsi_data_buffer sdb;\n\tstruct scatterlist sense_sgl;\n};\n\nstruct scsi_event {\n\tenum scsi_device_event evt_type;\n\tstruct list_head node;\n};\n\nstruct scsi_failures;\n\nstruct scsi_exec_args {\n\tunsigned char *sense;\n\tunsigned int sense_len;\n\tstruct scsi_sense_hdr *sshdr;\n\tblk_mq_req_flags_t req_flags;\n\tint scmd_flags;\n\tint *resid;\n\tstruct scsi_failures *failures;\n};\n\nstruct scsi_failure {\n\tint result;\n\tu8 sense;\n\tu8 asc;\n\tu8 ascq;\n\ts8 allowed;\n\ts8 retries;\n};\n\nstruct scsi_failures {\n\tint total_allowed;\n\tint total_retries;\n\tstruct scsi_failure *failure_definitions;\n};\n\nstruct scsi_host_busy_iter_data {\n\tbool (*fn)(struct scsi_cmnd *, void *);\n\tvoid *priv;\n};\n\nstruct scsi_host_template {\n\tunsigned int cmd_size;\n\tint (*queuecommand)(struct Scsi_Host *, struct scsi_cmnd *);\n\tvoid (*commit_rqs)(struct Scsi_Host *, u16);\n\tstruct module *module;\n\tconst char *name;\n\tconst char * (*info)(struct Scsi_Host *);\n\tint (*ioctl)(struct scsi_device *, unsigned int, void *);\n\tint (*compat_ioctl)(struct scsi_device *, unsigned int, void *);\n\tint (*init_cmd_priv)(struct Scsi_Host *, struct scsi_cmnd *);\n\tint (*exit_cmd_priv)(struct Scsi_Host *, struct scsi_cmnd *);\n\tint (*eh_abort_handler)(struct scsi_cmnd *);\n\tint (*eh_device_reset_handler)(struct scsi_cmnd *);\n\tint (*eh_target_reset_handler)(struct scsi_cmnd *);\n\tint (*eh_bus_reset_handler)(struct scsi_cmnd *);\n\tint (*eh_host_reset_handler)(struct scsi_cmnd *);\n\tint (*slave_alloc)(struct scsi_device *);\n\tint (*device_configure)(struct scsi_device *, struct queue_limits *);\n\tint (*slave_configure)(struct scsi_device *);\n\tvoid (*slave_destroy)(struct scsi_device *);\n\tint (*target_alloc)(struct scsi_target *);\n\tvoid (*target_destroy)(struct scsi_target *);\n\tint (*scan_finished)(struct Scsi_Host *, long unsigned int);\n\tvoid (*scan_start)(struct Scsi_Host *);\n\tint (*change_queue_depth)(struct scsi_device *, int);\n\tvoid (*map_queues)(struct Scsi_Host *);\n\tint (*mq_poll)(struct Scsi_Host *, unsigned int);\n\tbool (*dma_need_drain)(struct request *);\n\tint (*bios_param)(struct scsi_device *, struct block_device *, sector_t, int *);\n\tvoid (*unlock_native_capacity)(struct scsi_device *);\n\tint (*show_info)(struct seq_file *, struct Scsi_Host *);\n\tint (*write_info)(struct Scsi_Host *, char *, int);\n\tenum scsi_timeout_action (*eh_timed_out)(struct scsi_cmnd *);\n\tbool (*eh_should_retry_cmd)(struct scsi_cmnd *);\n\tint (*host_reset)(struct Scsi_Host *, int);\n\tconst char *proc_name;\n\tint can_queue;\n\tint this_id;\n\tshort unsigned int sg_tablesize;\n\tshort unsigned int sg_prot_tablesize;\n\tunsigned int max_sectors;\n\tunsigned int max_segment_size;\n\tunsigned int dma_alignment;\n\tlong unsigned int dma_boundary;\n\tlong unsigned int virt_boundary_mask;\n\tshort int cmd_per_lun;\n\tint tag_alloc_policy;\n\tunsigned int track_queue_depth: 1;\n\tunsigned int supported_mode: 2;\n\tunsigned int emulated: 1;\n\tunsigned int skip_settle_delay: 1;\n\tunsigned int no_write_same: 1;\n\tunsigned int host_tagset: 1;\n\tunsigned int queuecommand_may_block: 1;\n\tunsigned int max_host_blocked;\n\tconst struct attribute_group **shost_groups;\n\tconst struct attribute_group **sdev_groups;\n\tu64 vendor_id;\n};\n\nstruct scsi_idlun {\n\t__u32 dev_id;\n\t__u32 host_unique_id;\n};\n\nstruct scsi_io_group_descriptor {\n\tu8 ic_enable: 1;\n\tu8 cs_enble: 1;\n\tu8 st_enble: 1;\n\tu8 reserved1: 3;\n\tu8 io_advice_hints_mode: 2;\n\tu8 reserved2[3];\n\tu8 lbm_descriptor_type: 4;\n\tu8 rlbsr: 2;\n\tu8 reserved3: 1;\n\tu8 acdlu: 1;\n\tu8 params[2];\n\tu8 reserved4;\n\tu8 reserved5[8];\n};\n\nstruct scsi_ioctl_command {\n\tunsigned int inlen;\n\tunsigned int outlen;\n\tunsigned char data[0];\n};\n\nstruct scsi_lun {\n\t__u8 scsi_lun[8];\n};\n\nstruct scsi_mode_data {\n\t__u32 length;\n\t__u16 block_descriptor_length;\n\t__u8 medium_type;\n\t__u8 device_specific;\n\t__u8 header_length;\n\t__u8 longlba: 1;\n};\n\nstruct scsi_nl_hdr {\n\t__u8 version;\n\t__u8 transport;\n\t__u16 magic;\n\t__u16 msgtype;\n\t__u16 msglen;\n};\n\nstruct scsi_proc_entry {\n\tstruct list_head entry;\n\tconst struct scsi_host_template *sht;\n\tstruct proc_dir_entry *proc_dir;\n\tunsigned int present;\n};\n\nstruct scsi_sense_hdr {\n\tu8 response_code;\n\tu8 sense_key;\n\tu8 asc;\n\tu8 ascq;\n\tu8 byte4;\n\tu8 byte5;\n\tu8 byte6;\n\tu8 additional_length;\n};\n\nstruct scsi_stream_status {\n\tu8 reserved1: 7;\n\tu8 perm: 1;\n\tu8 reserved2;\n\t__be16 stream_identifier;\n\tu8 rel_lifetime: 6;\n\tu8 reserved3: 2;\n\tu8 reserved4[3];\n};\n\nstruct scsi_stream_status_header {\n\t__be32 len;\n\tu16 reserved;\n\t__be16 number_of_open_streams;\n\tstruct {\n\t\tstruct {} __empty_stream_status;\n\t\tstruct scsi_stream_status stream_status[0];\n\t};\n};\n\nstruct scsi_target {\n\tstruct scsi_device *starget_sdev_user;\n\tstruct list_head siblings;\n\tstruct list_head devices;\n\tstruct device dev;\n\tstruct kref reap_ref;\n\tunsigned int channel;\n\tunsigned int id;\n\tunsigned int create: 1;\n\tunsigned int single_lun: 1;\n\tunsigned int pdt_1f_for_no_lun: 1;\n\tunsigned int no_report_luns: 1;\n\tunsigned int expecting_lun_change: 1;\n\tatomic_t target_busy;\n\tatomic_t target_blocked;\n\tunsigned int can_queue;\n\tunsigned int max_target_blocked;\n\tchar scsi_level;\n\tenum scsi_target_state state;\n\tvoid *hostdata;\n\tlong unsigned int starget_data[0];\n};\n\nstruct scsi_varlen_cdb_hdr {\n\t__u8 opcode;\n\t__u8 control;\n\t__u8 misc[5];\n\t__u8 additional_cdb_length;\n\t__be16 service_action;\n};\n\nstruct scsi_vpd {\n\tstruct callback_head rcu;\n\tint len;\n\tunsigned char data[0];\n};\n\nstruct sctp_paramhdr {\n\t__be16 type;\n\t__be16 length;\n};\n\nstruct sctp_adaptation_ind_param {\n\tstruct sctp_paramhdr param_hdr;\n\t__be32 adaptation_ind;\n};\n\nstruct sctp_addip_param {\n\tstruct sctp_paramhdr param_hdr;\n\t__be32 crr_id;\n};\n\nstruct sctp_addiphdr {\n\t__be32 serial;\n};\n\nunion sctp_addr {\n\tstruct sockaddr_in v4;\n\tstruct sockaddr_in6 v6;\n\tstruct sockaddr sa;\n};\n\nstruct sctp_ipv4addr_param {\n\tstruct sctp_paramhdr param_hdr;\n\tstruct in_addr addr;\n};\n\nstruct sctp_ipv6addr_param {\n\tstruct sctp_paramhdr param_hdr;\n\tstruct in6_addr addr;\n};\n\nunion sctp_addr_param {\n\tstruct sctp_paramhdr p;\n\tstruct sctp_ipv4addr_param v4;\n\tstruct sctp_ipv6addr_param v6;\n};\n\nstruct sctp_transport;\n\nstruct sctp_sock;\n\nstruct sctp_af {\n\tint (*sctp_xmit)(struct sk_buff *, struct sctp_transport *);\n\tint (*setsockopt)(struct sock *, int, int, sockptr_t, unsigned int);\n\tint (*getsockopt)(struct sock *, int, int, char *, int *);\n\tvoid (*get_dst)(struct sctp_transport *, union sctp_addr *, struct flowi *, struct sock *);\n\tvoid (*get_saddr)(struct sctp_sock *, struct sctp_transport *, struct flowi *);\n\tvoid (*copy_addrlist)(struct list_head *, struct net_device *);\n\tint (*cmp_addr)(const union sctp_addr *, const union sctp_addr *);\n\tvoid (*addr_copy)(union sctp_addr *, union sctp_addr *);\n\tvoid (*from_skb)(union sctp_addr *, struct sk_buff *, int);\n\tvoid (*from_sk)(union sctp_addr *, struct sock *);\n\tbool (*from_addr_param)(union sctp_addr *, union sctp_addr_param *, __be16, int);\n\tint (*to_addr_param)(const union sctp_addr *, union sctp_addr_param *);\n\tint (*addr_valid)(union sctp_addr *, struct sctp_sock *, const struct sk_buff *);\n\tenum sctp_scope (*scope)(union sctp_addr *);\n\tvoid (*inaddr_any)(union sctp_addr *, __be16);\n\tint (*is_any)(const union sctp_addr *);\n\tint (*available)(union sctp_addr *, struct sctp_sock *);\n\tint (*skb_iif)(const struct sk_buff *);\n\tint (*skb_sdif)(const struct sk_buff *);\n\tint (*is_ce)(const struct sk_buff *);\n\tvoid (*seq_dump_addr)(struct seq_file *, union sctp_addr *);\n\tvoid (*ecn_capable)(struct sock *);\n\t__u16 net_header_len;\n\tint sockaddr_len;\n\tint (*ip_options_len)(struct sock *);\n\tsa_family_t sa_family;\n\tstruct list_head list;\n};\n\nstruct sctp_chunk;\n\nstruct sctp_inq {\n\tstruct list_head in_chunk_list;\n\tstruct sctp_chunk *in_progress;\n\tstruct work_struct immediate;\n};\n\nstruct sctp_bind_addr {\n\t__u16 port;\n\tstruct list_head address_list;\n};\n\nstruct sctp_ep_common {\n\tenum sctp_endpoint_type type;\n\trefcount_t refcnt;\n\tbool dead;\n\tstruct sock *sk;\n\tstruct net *net;\n\tstruct sctp_inq inqueue;\n\tstruct sctp_bind_addr bind_addr;\n};\n\nstruct sctp_cookie {\n\t__u32 my_vtag;\n\t__u32 peer_vtag;\n\t__u32 my_ttag;\n\t__u32 peer_ttag;\n\tktime_t expiration;\n\t__u16 sinit_num_ostreams;\n\t__u16 sinit_max_instreams;\n\t__u32 initial_tsn;\n\tunion sctp_addr peer_addr;\n\t__u16 my_port;\n\t__u8 prsctp_capable;\n\t__u8 padding;\n\t__u32 adaptation_ind;\n\t__u8 auth_random[36];\n\t__u8 auth_hmacs[10];\n\t__u8 auth_chunks[20];\n\t__u32 raw_addr_list_len;\n};\n\nstruct sctp_tsnmap {\n\tlong unsigned int *tsn_map;\n\t__u32 base_tsn;\n\t__u32 cumulative_tsn_ack_point;\n\t__u32 max_tsn_seen;\n\t__u16 len;\n\t__u16 pending_data;\n\t__u16 num_dup_tsns;\n\t__be32 dup_tsns[16];\n};\n\nstruct sctp_inithdr_host {\n\t__u32 init_tag;\n\t__u32 a_rwnd;\n\t__u16 num_outbound_streams;\n\t__u16 num_inbound_streams;\n\t__u32 initial_tsn;\n};\n\nstruct sctp_stream_out_ext;\n\nstruct sctp_stream_out {\n\tunion {\n\t\t__u32 mid;\n\t\t__u16 ssn;\n\t};\n\t__u32 mid_uo;\n\tstruct sctp_stream_out_ext *ext;\n\t__u8 state;\n};\n\nstruct sctp_stream_in {\n\tunion {\n\t\t__u32 mid;\n\t\t__u16 ssn;\n\t};\n\t__u32 mid_uo;\n\t__u32 fsn;\n\t__u32 fsn_uo;\n\tchar pd_mode;\n\tchar pd_mode_uo;\n};\n\nstruct sctp_stream_interleave;\n\nstruct sctp_stream {\n\tstruct {\n\t\tstruct __genradix tree;\n\t\tstruct sctp_stream_out type[0];\n\t} out;\n\tstruct {\n\t\tstruct __genradix tree;\n\t\tstruct sctp_stream_in type[0];\n\t} in;\n\t__u16 outcnt;\n\t__u16 incnt;\n\tstruct sctp_stream_out *out_curr;\n\tunion {\n\t\tstruct {\n\t\t\tstruct list_head prio_list;\n\t\t};\n\t\tstruct {\n\t\t\tstruct list_head rr_list;\n\t\t\tstruct sctp_stream_out_ext *rr_next;\n\t\t};\n\t\tstruct {\n\t\t\tstruct list_head fc_list;\n\t\t};\n\t};\n\tstruct sctp_stream_interleave *si;\n};\n\nstruct sctp_sched_ops;\n\nstruct sctp_association;\n\nstruct sctp_outq {\n\tstruct sctp_association *asoc;\n\tstruct list_head out_chunk_list;\n\tstruct sctp_sched_ops *sched;\n\tunsigned int out_qlen;\n\tunsigned int error;\n\tstruct list_head control_chunk_list;\n\tstruct list_head sacked;\n\tstruct list_head retransmit;\n\tstruct list_head abandoned;\n\t__u32 outstanding_bytes;\n\tchar fast_rtx;\n\tchar cork;\n};\n\nstruct sctp_ulpq {\n\tchar pd_mode;\n\tstruct sctp_association *asoc;\n\tstruct sk_buff_head reasm;\n\tstruct sk_buff_head reasm_uo;\n\tstruct sk_buff_head lobby;\n};\n\nstruct sctp_priv_assoc_stats {\n\tstruct __kernel_sockaddr_storage obs_rto_ipaddr;\n\t__u64 max_obs_rto;\n\t__u64 isacks;\n\t__u64 osacks;\n\t__u64 opackets;\n\t__u64 ipackets;\n\t__u64 rtxchunks;\n\t__u64 outofseqtsns;\n\t__u64 idupchunks;\n\t__u64 gapcnt;\n\t__u64 ouodchunks;\n\t__u64 iuodchunks;\n\t__u64 oodchunks;\n\t__u64 iodchunks;\n\t__u64 octrlchunks;\n\t__u64 ictrlchunks;\n};\n\nstruct sctp_endpoint;\n\nstruct sctp_random_param;\n\nstruct sctp_chunks_param;\n\nstruct sctp_hmac_algo_param;\n\nstruct sctp_auth_bytes;\n\nstruct sctp_shared_key;\n\nstruct sctp_association {\n\tstruct sctp_ep_common base;\n\tstruct list_head asocs;\n\tsctp_assoc_t assoc_id;\n\tstruct sctp_endpoint *ep;\n\tstruct sctp_cookie c;\n\tstruct {\n\t\tstruct list_head transport_addr_list;\n\t\t__u32 rwnd;\n\t\t__u16 transport_count;\n\t\t__u16 port;\n\t\tstruct sctp_transport *primary_path;\n\t\tunion sctp_addr primary_addr;\n\t\tstruct sctp_transport *active_path;\n\t\tstruct sctp_transport *retran_path;\n\t\tstruct sctp_transport *last_sent_to;\n\t\tstruct sctp_transport *last_data_from;\n\t\tstruct sctp_tsnmap tsn_map;\n\t\t__be16 addip_disabled_mask;\n\t\t__u16 ecn_capable: 1;\n\t\t__u16 ipv4_address: 1;\n\t\t__u16 ipv6_address: 1;\n\t\t__u16 asconf_capable: 1;\n\t\t__u16 prsctp_capable: 1;\n\t\t__u16 reconf_capable: 1;\n\t\t__u16 intl_capable: 1;\n\t\t__u16 auth_capable: 1;\n\t\t__u16 sack_needed: 1;\n\t\t__u16 sack_generation: 1;\n\t\t__u16 zero_window_announced: 1;\n\t\t__u32 sack_cnt;\n\t\t__u32 adaptation_ind;\n\t\tstruct sctp_inithdr_host i;\n\t\tvoid *cookie;\n\t\tint cookie_len;\n\t\t__u32 addip_serial;\n\t\tstruct sctp_random_param *peer_random;\n\t\tstruct sctp_chunks_param *peer_chunks;\n\t\tstruct sctp_hmac_algo_param *peer_hmacs;\n\t} peer;\n\tenum sctp_state state;\n\tint overall_error_count;\n\tktime_t cookie_life;\n\tlong unsigned int rto_initial;\n\tlong unsigned int rto_max;\n\tlong unsigned int rto_min;\n\tint max_burst;\n\tint max_retrans;\n\t__u16 pf_retrans;\n\t__u16 ps_retrans;\n\t__u16 max_init_attempts;\n\t__u16 init_retries;\n\tlong unsigned int max_init_timeo;\n\tlong unsigned int hbinterval;\n\tlong unsigned int probe_interval;\n\t__be16 encap_port;\n\t__u16 pathmaxrxt;\n\t__u32 flowlabel;\n\t__u8 dscp;\n\t__u8 pmtu_pending;\n\t__u32 pathmtu;\n\t__u32 param_flags;\n\t__u32 sackfreq;\n\tlong unsigned int sackdelay;\n\tlong unsigned int timeouts[12];\n\tstruct timer_list timers[12];\n\tstruct sctp_transport *shutdown_last_sent_to;\n\tstruct sctp_transport *init_last_sent_to;\n\tint shutdown_retries;\n\t__u32 next_tsn;\n\t__u32 ctsn_ack_point;\n\t__u32 adv_peer_ack_point;\n\t__u32 highest_sacked;\n\t__u32 fast_recovery_exit;\n\t__u8 fast_recovery;\n\t__u16 unack_data;\n\t__u32 rtx_data_chunks;\n\t__u32 rwnd;\n\t__u32 a_rwnd;\n\t__u32 rwnd_over;\n\t__u32 rwnd_press;\n\tint sndbuf_used;\n\tatomic_t rmem_alloc;\n\twait_queue_head_t wait;\n\t__u32 frag_point;\n\t__u32 user_frag;\n\tint init_err_counter;\n\tint init_cycle;\n\t__u16 default_stream;\n\t__u16 default_flags;\n\t__u32 default_ppid;\n\t__u32 default_context;\n\t__u32 default_timetolive;\n\t__u32 default_rcv_context;\n\tstruct sctp_stream stream;\n\tstruct sctp_outq outqueue;\n\tstruct sctp_ulpq ulpq;\n\t__u32 last_ecne_tsn;\n\t__u32 last_cwr_tsn;\n\tint numduptsns;\n\tstruct sctp_chunk *addip_last_asconf;\n\tstruct list_head asconf_ack_list;\n\tstruct list_head addip_chunk_list;\n\t__u32 addip_serial;\n\tint src_out_of_asoc_ok;\n\tunion sctp_addr *asconf_addr_del_pending;\n\tstruct sctp_transport *new_transport;\n\tstruct list_head endpoint_shared_keys;\n\tstruct sctp_auth_bytes *asoc_shared_key;\n\tstruct sctp_shared_key *shkey;\n\t__u16 default_hmac_id;\n\t__u16 active_key_id;\n\t__u8 need_ecne: 1;\n\t__u8 temp: 1;\n\t__u8 pf_expose: 2;\n\t__u8 force_delay: 1;\n\t__u8 strreset_enable;\n\t__u8 strreset_outstanding;\n\t__u32 strreset_outseq;\n\t__u32 strreset_inseq;\n\t__u32 strreset_result[2];\n\tstruct sctp_chunk *strreset_chunk;\n\tstruct sctp_priv_assoc_stats stats;\n\tint sent_cnt_removable;\n\t__u16 subscribe;\n\t__u64 abandoned_unsent[3];\n\t__u64 abandoned_sent[3];\n\tu32 secid;\n\tu32 peer_secid;\n\tstruct callback_head rcu;\n};\n\nstruct sctp_assocparams {\n\tsctp_assoc_t sasoc_assoc_id;\n\t__u16 sasoc_asocmaxrxt;\n\t__u16 sasoc_number_peer_destinations;\n\t__u32 sasoc_peer_rwnd;\n\t__u32 sasoc_local_rwnd;\n\t__u32 sasoc_cookie_life;\n};\n\nstruct sctp_auth_bytes {\n\trefcount_t refcnt;\n\t__u32 len;\n\t__u8 data[0];\n};\n\nstruct sctp_authhdr {\n\t__be16 shkey_id;\n\t__be16 hmac_id;\n};\n\nstruct sctp_bind_bucket {\n\tshort unsigned int port;\n\tsigned char fastreuse;\n\tsigned char fastreuseport;\n\tkuid_t fastuid;\n\tstruct hlist_node node;\n\tstruct hlist_head owner;\n\tstruct net *net;\n};\n\nstruct sctp_cookie_preserve_param;\n\nstruct sctp_hostname_param;\n\nstruct sctp_cookie_param;\n\nstruct sctp_supported_addrs_param;\n\nstruct sctp_supported_ext_param;\n\nunion sctp_params {\n\tvoid *v;\n\tstruct sctp_paramhdr *p;\n\tstruct sctp_cookie_preserve_param *life;\n\tstruct sctp_hostname_param *dns;\n\tstruct sctp_cookie_param *cookie;\n\tstruct sctp_supported_addrs_param *sat;\n\tstruct sctp_ipv4addr_param *v4;\n\tstruct sctp_ipv6addr_param *v6;\n\tunion sctp_addr_param *addr;\n\tstruct sctp_adaptation_ind_param *aind;\n\tstruct sctp_supported_ext_param *ext;\n\tstruct sctp_random_param *random;\n\tstruct sctp_chunks_param *chunks;\n\tstruct sctp_hmac_algo_param *hmac_algo;\n\tstruct sctp_addip_param *addip;\n};\n\nstruct sctp_sndrcvinfo {\n\t__u16 sinfo_stream;\n\t__u16 sinfo_ssn;\n\t__u16 sinfo_flags;\n\t__u32 sinfo_ppid;\n\t__u32 sinfo_context;\n\t__u32 sinfo_timetolive;\n\t__u32 sinfo_tsn;\n\t__u32 sinfo_cumtsn;\n\tsctp_assoc_t sinfo_assoc_id;\n};\n\nstruct sctp_datahdr;\n\nstruct sctp_inithdr;\n\nstruct sctp_sackhdr;\n\nstruct sctp_heartbeathdr;\n\nstruct sctp_sender_hb_info;\n\nstruct sctp_shutdownhdr;\n\nstruct sctp_signed_cookie;\n\nstruct sctp_ecnehdr;\n\nstruct sctp_cwrhdr;\n\nstruct sctp_errhdr;\n\nstruct sctp_fwdtsn_hdr;\n\nstruct sctp_idatahdr;\n\nstruct sctp_ifwdtsn_hdr;\n\nstruct sctp_chunkhdr;\n\nstruct sctphdr;\n\nstruct sctp_datamsg;\n\nstruct sctp_chunk {\n\tstruct list_head list;\n\trefcount_t refcnt;\n\tint sent_count;\n\tunion {\n\t\tstruct list_head transmitted_list;\n\t\tstruct list_head stream_list;\n\t};\n\tstruct list_head frag_list;\n\tstruct sk_buff *skb;\n\tunion {\n\t\tstruct sk_buff *head_skb;\n\t\tstruct sctp_shared_key *shkey;\n\t};\n\tunion sctp_params param_hdr;\n\tunion {\n\t\t__u8 *v;\n\t\tstruct sctp_datahdr *data_hdr;\n\t\tstruct sctp_inithdr *init_hdr;\n\t\tstruct sctp_sackhdr *sack_hdr;\n\t\tstruct sctp_heartbeathdr *hb_hdr;\n\t\tstruct sctp_sender_hb_info *hbs_hdr;\n\t\tstruct sctp_shutdownhdr *shutdown_hdr;\n\t\tstruct sctp_signed_cookie *cookie_hdr;\n\t\tstruct sctp_ecnehdr *ecne_hdr;\n\t\tstruct sctp_cwrhdr *ecn_cwr_hdr;\n\t\tstruct sctp_errhdr *err_hdr;\n\t\tstruct sctp_addiphdr *addip_hdr;\n\t\tstruct sctp_fwdtsn_hdr *fwdtsn_hdr;\n\t\tstruct sctp_authhdr *auth_hdr;\n\t\tstruct sctp_idatahdr *idata_hdr;\n\t\tstruct sctp_ifwdtsn_hdr *ifwdtsn_hdr;\n\t} subh;\n\t__u8 *chunk_end;\n\tstruct sctp_chunkhdr *chunk_hdr;\n\tstruct sctphdr *sctp_hdr;\n\tstruct sctp_sndrcvinfo sinfo;\n\tstruct sctp_association *asoc;\n\tstruct sctp_ep_common *rcvr;\n\tlong unsigned int sent_at;\n\tunion sctp_addr source;\n\tunion sctp_addr dest;\n\tstruct sctp_datamsg *msg;\n\tstruct sctp_transport *transport;\n\tstruct sk_buff *auth_chunk;\n\t__u16 rtt_in_progress: 1;\n\t__u16 has_tsn: 1;\n\t__u16 has_ssn: 1;\n\t__u16 singleton: 1;\n\t__u16 end_of_packet: 1;\n\t__u16 ecn_ce_done: 1;\n\t__u16 pdiscard: 1;\n\t__u16 tsn_gap_acked: 1;\n\t__u16 data_accepted: 1;\n\t__u16 auth: 1;\n\t__u16 has_asconf: 1;\n\t__u16 pmtu_probe: 1;\n\t__u16 tsn_missing_report: 2;\n\t__u16 fast_retransmit: 2;\n};\n\nstruct sctp_chunkhdr {\n\t__u8 type;\n\t__u8 flags;\n\t__be16 length;\n};\n\nstruct sctp_chunks_param {\n\tstruct sctp_paramhdr param_hdr;\n\t__u8 chunks[0];\n};\n\nstruct sctp_cookie_param {\n\tstruct sctp_paramhdr p;\n\t__u8 body[0];\n};\n\nstruct sctp_cookie_preserve_param {\n\tstruct sctp_paramhdr param_hdr;\n\t__be32 lifespan_increment;\n};\n\nstruct sctp_cwrhdr {\n\t__be32 lowest_tsn;\n};\n\nstruct sctp_datahdr {\n\t__be32 tsn;\n\t__be16 stream;\n\t__be16 ssn;\n\t__u32 ppid;\n};\n\nstruct sctp_datamsg {\n\tstruct list_head chunks;\n\trefcount_t refcnt;\n\tlong unsigned int expires_at;\n\tint send_error;\n\tu8 send_failed: 1;\n\tu8 can_delay: 1;\n\tu8 abandoned: 1;\n};\n\nstruct sctp_ecnehdr {\n\t__be32 lowest_tsn;\n};\n\nstruct sctp_endpoint {\n\tstruct sctp_ep_common base;\n\tstruct hlist_node node;\n\tint hashent;\n\tstruct list_head asocs;\n\t__u8 secret_key[32];\n\t__u8 *digest;\n\t__u32 sndbuf_policy;\n\t__u32 rcvbuf_policy;\n\tstruct crypto_shash **auth_hmacs;\n\tstruct sctp_hmac_algo_param *auth_hmacs_list;\n\tstruct sctp_chunks_param *auth_chunk_list;\n\tstruct list_head endpoint_shared_keys;\n\t__u16 active_key_id;\n\t__u8 ecn_enable: 1;\n\t__u8 auth_enable: 1;\n\t__u8 intl_enable: 1;\n\t__u8 prsctp_enable: 1;\n\t__u8 asconf_enable: 1;\n\t__u8 reconf_enable: 1;\n\t__u8 strreset_enable;\n\tstruct callback_head rcu;\n};\n\nstruct sctp_errhdr {\n\t__be16 cause;\n\t__be16 length;\n};\n\nstruct sctp_fwdtsn_hdr {\n\t__be32 new_cum_tsn;\n};\n\nstruct sctp_heartbeathdr {\n\tstruct sctp_paramhdr info;\n};\n\nstruct sctp_hmac_algo_param {\n\tstruct sctp_paramhdr param_hdr;\n\t__be16 hmac_ids[0];\n};\n\nstruct sctp_hostname_param {\n\tstruct sctp_paramhdr param_hdr;\n\tuint8_t hostname[0];\n};\n\nstruct sctp_idatahdr {\n\t__be32 tsn;\n\t__be16 stream;\n\t__be16 reserved;\n\t__be32 mid;\n\tunion {\n\t\t__u32 ppid;\n\t\t__be32 fsn;\n\t};\n\t__u8 payload[0];\n};\n\nstruct sctp_ifwdtsn_hdr {\n\t__be32 new_cum_tsn;\n};\n\nstruct sctp_inithdr {\n\t__be32 init_tag;\n\t__be32 a_rwnd;\n\t__be16 num_outbound_streams;\n\t__be16 num_inbound_streams;\n\t__be32 initial_tsn;\n};\n\nstruct sctp_initmsg {\n\t__u16 sinit_num_ostreams;\n\t__u16 sinit_max_instreams;\n\t__u16 sinit_max_attempts;\n\t__u16 sinit_max_init_timeo;\n};\n\nstruct sctp_packet {\n\t__u16 source_port;\n\t__u16 destination_port;\n\t__u32 vtag;\n\tstruct list_head chunk_list;\n\tsize_t overhead;\n\tsize_t size;\n\tsize_t max_size;\n\tstruct sctp_transport *transport;\n\tstruct sctp_chunk *auth;\n\tu8 has_cookie_echo: 1;\n\tu8 has_sack: 1;\n\tu8 has_auth: 1;\n\tu8 has_data: 1;\n\tu8 ipfragok: 1;\n};\n\nstruct sctp_paddrparams {\n\tsctp_assoc_t spp_assoc_id;\n\tstruct __kernel_sockaddr_storage spp_address;\n\t__u32 spp_hbinterval;\n\t__u16 spp_pathmaxrxt;\n\t__u32 spp_pathmtu;\n\t__u32 spp_sackdelay;\n\t__u32 spp_flags;\n\t__u32 spp_ipv6_flowlabel;\n\t__u8 spp_dscp;\n\tint: 0;\n} __attribute__((packed));\n\nstruct sctp_ulpevent;\n\nstruct sctp_pf {\n\tvoid (*event_msgname)(struct sctp_ulpevent *, char *, int *);\n\tvoid (*skb_msgname)(struct sk_buff *, char *, int *);\n\tint (*af_supported)(sa_family_t, struct sctp_sock *);\n\tint (*cmp_addr)(const union sctp_addr *, const union sctp_addr *, struct sctp_sock *);\n\tint (*bind_verify)(struct sctp_sock *, union sctp_addr *);\n\tint (*send_verify)(struct sctp_sock *, union sctp_addr *);\n\tint (*supported_addrs)(const struct sctp_sock *, __be16 *);\n\tstruct sock * (*create_accept_sk)(struct sock *, struct sctp_association *, bool);\n\tint (*addr_to_user)(struct sctp_sock *, union sctp_addr *);\n\tvoid (*to_sk_saddr)(union sctp_addr *, struct sock *);\n\tvoid (*to_sk_daddr)(union sctp_addr *, struct sock *);\n\tvoid (*copy_ip_options)(struct sock *, struct sock *);\n\tstruct sctp_af *af;\n};\n\nstruct sctp_random_param {\n\tstruct sctp_paramhdr param_hdr;\n\t__u8 random_val[0];\n};\n\nstruct sctp_rtoinfo {\n\tsctp_assoc_t srto_assoc_id;\n\t__u32 srto_initial;\n\t__u32 srto_max;\n\t__u32 srto_min;\n};\n\nstruct sctp_sackhdr {\n\t__be32 cum_tsn_ack;\n\t__be32 a_rwnd;\n\t__be16 num_gap_ack_blocks;\n\t__be16 num_dup_tsns;\n};\n\nstruct sctp_sender_hb_info {\n\tstruct sctp_paramhdr param_hdr;\n\tunion sctp_addr daddr;\n\tlong unsigned int sent_at;\n\t__u64 hb_nonce;\n\t__u32 probe_size;\n};\n\nstruct sctp_shared_key {\n\tstruct list_head key_list;\n\tstruct sctp_auth_bytes *key;\n\trefcount_t refcnt;\n\t__u16 key_id;\n\t__u8 deactivated;\n};\n\nstruct sctp_shutdownhdr {\n\t__be32 cum_tsn_ack;\n};\n\nstruct sctp_signed_cookie {\n\t__u8 signature[32];\n\t__u32 __pad;\n\tstruct sctp_cookie c;\n} __attribute__((packed));\n\nstruct sctp_sock {\n\tstruct inet_sock inet;\n\tenum sctp_socket_type type;\n\tstruct sctp_pf *pf;\n\tstruct crypto_shash *hmac;\n\tchar *sctp_hmac_alg;\n\tstruct sctp_endpoint *ep;\n\tstruct sctp_bind_bucket *bind_hash;\n\t__u16 default_stream;\n\t__u32 default_ppid;\n\t__u16 default_flags;\n\t__u32 default_context;\n\t__u32 default_timetolive;\n\t__u32 default_rcv_context;\n\tint max_burst;\n\t__u32 hbinterval;\n\t__u32 probe_interval;\n\t__be16 udp_port;\n\t__be16 encap_port;\n\t__u16 pathmaxrxt;\n\t__u32 flowlabel;\n\t__u8 dscp;\n\t__u16 pf_retrans;\n\t__u16 ps_retrans;\n\t__u32 pathmtu;\n\t__u32 sackdelay;\n\t__u32 sackfreq;\n\t__u32 param_flags;\n\t__u32 default_ss;\n\tstruct sctp_rtoinfo rtoinfo;\n\tstruct sctp_paddrparams paddrparam;\n\tstruct sctp_assocparams assocparams;\n\t__u16 subscribe;\n\tstruct sctp_initmsg initmsg;\n\tint user_frag;\n\t__u32 autoclose;\n\t__u32 adaptation_ind;\n\t__u32 pd_point;\n\t__u16 nodelay: 1;\n\t__u16 pf_expose: 2;\n\t__u16 reuse: 1;\n\t__u16 disable_fragments: 1;\n\t__u16 v4mapped: 1;\n\t__u16 frag_interleave: 1;\n\t__u16 recvrcvinfo: 1;\n\t__u16 recvnxtinfo: 1;\n\t__u16 data_ready_signalled: 1;\n\tatomic_t pd_mode;\n\tstruct sk_buff_head pd_lobby;\n\tstruct list_head auto_asconf_list;\n\tint do_auto_asconf;\n};\n\nstruct sctp_stream_interleave {\n\t__u16 data_chunk_len;\n\t__u16 ftsn_chunk_len;\n\tstruct sctp_chunk * (*make_datafrag)(const struct sctp_association *, const struct sctp_sndrcvinfo *, int, __u8, gfp_t);\n\tvoid (*assign_number)(struct sctp_chunk *);\n\tbool (*validate_data)(struct sctp_chunk *);\n\tint (*ulpevent_data)(struct sctp_ulpq *, struct sctp_chunk *, gfp_t);\n\tint (*enqueue_event)(struct sctp_ulpq *, struct sctp_ulpevent *);\n\tvoid (*renege_events)(struct sctp_ulpq *, struct sctp_chunk *, gfp_t);\n\tvoid (*start_pd)(struct sctp_ulpq *, gfp_t);\n\tvoid (*abort_pd)(struct sctp_ulpq *, gfp_t);\n\tvoid (*generate_ftsn)(struct sctp_outq *, __u32);\n\tbool (*validate_ftsn)(struct sctp_chunk *);\n\tvoid (*report_ftsn)(struct sctp_ulpq *, __u32);\n\tvoid (*handle_ftsn)(struct sctp_ulpq *, struct sctp_chunk *);\n};\n\nstruct sctp_stream_priorities;\n\nstruct sctp_stream_out_ext {\n\t__u64 abandoned_unsent[3];\n\t__u64 abandoned_sent[3];\n\tstruct list_head outq;\n\tunion {\n\t\tstruct {\n\t\t\tstruct list_head prio_list;\n\t\t\tstruct sctp_stream_priorities *prio_head;\n\t\t};\n\t\tstruct {\n\t\t\tstruct list_head rr_list;\n\t\t};\n\t\tstruct {\n\t\t\tstruct list_head fc_list;\n\t\t\t__u32 fc_length;\n\t\t\t__u16 fc_weight;\n\t\t};\n\t};\n};\n\nstruct sctp_stream_priorities {\n\tstruct list_head prio_sched;\n\tstruct list_head active;\n\tstruct sctp_stream_out_ext *next;\n\t__u16 prio;\n\t__u16 users;\n};\n\nstruct sctp_supported_addrs_param {\n\tstruct sctp_paramhdr param_hdr;\n\t__be16 types[0];\n};\n\nstruct sctp_supported_ext_param {\n\tstruct sctp_paramhdr param_hdr;\n\t__u8 chunks[0];\n};\n\nstruct sctp_transport {\n\tstruct list_head transports;\n\tstruct rhlist_head node;\n\trefcount_t refcnt;\n\t__u32 rto_pending: 1;\n\t__u32 hb_sent: 1;\n\t__u32 pmtu_pending: 1;\n\t__u32 dst_pending_confirm: 1;\n\t__u32 sack_generation: 1;\n\tu32 dst_cookie;\n\tstruct flowi fl;\n\tunion sctp_addr ipaddr;\n\tstruct sctp_af *af_specific;\n\tstruct sctp_association *asoc;\n\tlong unsigned int rto;\n\t__u32 rtt;\n\t__u32 rttvar;\n\t__u32 srtt;\n\t__u32 cwnd;\n\t__u32 ssthresh;\n\t__u32 partial_bytes_acked;\n\t__u32 flight_size;\n\t__u32 burst_limited;\n\tstruct dst_entry *dst;\n\tunion sctp_addr saddr;\n\tlong unsigned int hbinterval;\n\tlong unsigned int probe_interval;\n\tlong unsigned int sackdelay;\n\t__u32 sackfreq;\n\tatomic_t mtu_info;\n\tktime_t last_time_heard;\n\tlong unsigned int last_time_sent;\n\tlong unsigned int last_time_ecne_reduced;\n\t__be16 encap_port;\n\t__u16 pathmaxrxt;\n\t__u32 flowlabel;\n\t__u8 dscp;\n\t__u16 pf_retrans;\n\t__u16 ps_retrans;\n\t__u32 pathmtu;\n\t__u32 param_flags;\n\tint init_sent_count;\n\tint state;\n\tshort unsigned int error_count;\n\tstruct timer_list T3_rtx_timer;\n\tstruct timer_list hb_timer;\n\tstruct timer_list proto_unreach_timer;\n\tstruct timer_list reconf_timer;\n\tstruct timer_list probe_timer;\n\tstruct list_head transmitted;\n\tstruct sctp_packet packet;\n\tstruct list_head send_ready;\n\tstruct {\n\t\t__u32 next_tsn_at_change;\n\t\tchar changeover_active;\n\t\tchar cycling_changeover;\n\t\tchar cacc_saw_newack;\n\t} cacc;\n\tstruct {\n\t\t__u16 pmtu;\n\t\t__u16 probe_size;\n\t\t__u16 probe_high;\n\t\t__u8 probe_count;\n\t\t__u8 state;\n\t} pl;\n\t__u64 hb_nonce;\n\tstruct callback_head rcu;\n};\n\nstruct sctp_ulpevent {\n\tstruct sctp_association *asoc;\n\tstruct sctp_chunk *chunk;\n\tunsigned int rmem_len;\n\tunion {\n\t\t__u32 mid;\n\t\t__u16 ssn;\n\t};\n\tunion {\n\t\t__u32 ppid;\n\t\t__u32 fsn;\n\t};\n\t__u32 tsn;\n\t__u32 cumtsn;\n\t__u16 stream;\n\t__u16 flags;\n\t__u16 msg_flags;\n} __attribute__((packed));\n\nstruct sctphdr {\n\t__be16 source;\n\t__be16 dest;\n\t__be32 vtag;\n\t__le32 checksum;\n};\n\nstruct sd_app_op_cond_busy_data {\n\tstruct mmc_host *host;\n\tu32 ocr;\n\tstruct mmc_command *cmd;\n};\n\nstruct sd_busy_data {\n\tstruct mmc_card *card;\n\tu8 *reg_buf;\n};\n\nstruct sd_flag_debug {\n\tunsigned int meta_flags;\n\tchar *name;\n};\n\nstruct sd_flow_limit {\n\tu64 count;\n\tunsigned int num_buckets;\n\tunsigned int history_head;\n\tu16 history[128];\n\tu8 buckets[0];\n};\n\nstruct sg_lb_stats {\n\tlong unsigned int avg_load;\n\tlong unsigned int group_load;\n\tlong unsigned int group_capacity;\n\tlong unsigned int group_util;\n\tlong unsigned int group_runnable;\n\tunsigned int sum_nr_running;\n\tunsigned int sum_h_nr_running;\n\tunsigned int idle_cpus;\n\tunsigned int group_weight;\n\tenum group_type group_type;\n\tunsigned int group_asym_packing;\n\tunsigned int group_smt_balance;\n\tlong unsigned int group_misfit_task_load;\n\tunsigned int nr_numa_running;\n\tunsigned int nr_preferred_running;\n};\n\nstruct sd_lb_stats {\n\tstruct sched_group *busiest;\n\tstruct sched_group *local;\n\tlong unsigned int total_load;\n\tlong unsigned int total_capacity;\n\tlong unsigned int avg_load;\n\tunsigned int prefer_sibling;\n\tstruct sg_lb_stats busiest_stat;\n\tstruct sg_lb_stats local_stat;\n};\n\nstruct shash_desc {\n\tstruct crypto_shash *tfm;\n\tvoid *__ctx[0];\n};\n\nstruct sdesc {\n\tstruct shash_desc shash;\n\tchar ctx[0];\n};\n\nstruct sdio_device_id {\n\t__u8 class;\n\t__u16 vendor;\n\t__u16 device;\n\tkernel_ulong_t driver_data;\n};\n\nstruct sdio_driver {\n\tchar *name;\n\tconst struct sdio_device_id *id_table;\n\tint (*probe)(struct sdio_func *, const struct sdio_device_id *);\n\tvoid (*remove)(struct sdio_func *);\n\tstruct device_driver drv;\n};\n\ntypedef void sdio_irq_handler_t(struct sdio_func *);\n\nstruct sdio_func {\n\tstruct mmc_card *card;\n\tstruct device dev;\n\tsdio_irq_handler_t *irq_handler;\n\tunsigned int num;\n\tunsigned char class;\n\tshort unsigned int vendor;\n\tshort unsigned int device;\n\tunsigned int max_blksize;\n\tunsigned int cur_blksize;\n\tunsigned int enable_timeout;\n\tunsigned int state;\n\tu8 *tmpbuf;\n\tu8 major_rev;\n\tu8 minor_rev;\n\tunsigned int num_info;\n\tconst char **info;\n\tstruct sdio_func_tuple *tuples;\n};\n\nstruct sdio_func_tuple {\n\tstruct sdio_func_tuple *next;\n\tunsigned char code;\n\tunsigned char size;\n\tunsigned char data[0];\n};\n\nstruct xfrm_offload {\n\tstruct {\n\t\t__u32 low;\n\t\t__u32 hi;\n\t} seq;\n\t__u32 flags;\n\t__u32 status;\n\t__u32 orig_mac_len;\n\t__u8 proto;\n\t__u8 inner_ipproto;\n};\n\nstruct sec_path {\n\tint len;\n\tint olen;\n\tint verified_cnt;\n\tstruct xfrm_state *xvec[6];\n\tstruct xfrm_offload ovec[1];\n};\n\nstruct seccomp_filter;\n\nstruct seccomp {\n\tint mode;\n\tatomic_t filter_count;\n\tstruct seccomp_filter *filter;\n};\n\nstruct seccomp_data {\n\tint nr;\n\t__u32 arch;\n\t__u64 instruction_pointer;\n\t__u64 args[6];\n};\n\nstruct seccomp_filter {\n\trefcount_t refs;\n\trefcount_t users;\n\tbool log;\n\tbool wait_killable_recv;\n\tstruct action_cache cache;\n\tstruct seccomp_filter *prev;\n\tstruct bpf_prog *prog;\n\tstruct notification *notif;\n\tstruct mutex notify_lock;\n\twait_queue_head_t wqh;\n};\n\nstruct seccomp_kaddfd {\n\tstruct file *file;\n\tint fd;\n\tunsigned int flags;\n\t__u32 ioctl_flags;\n\tunion {\n\t\tbool setfd;\n\t\tint ret;\n\t};\n\tstruct completion completion;\n\tstruct list_head list;\n};\n\nstruct seccomp_knotif {\n\tstruct task_struct *task;\n\tu64 id;\n\tconst struct seccomp_data *data;\n\tenum notify_state state;\n\tint error;\n\tlong int val;\n\tu32 flags;\n\tstruct completion ready;\n\tstruct list_head list;\n\tstruct list_head addfd;\n};\n\nstruct seccomp_log_name {\n\tu32 log;\n\tconst char *name;\n};\n\nstruct seccomp_metadata {\n\t__u64 filter_off;\n\t__u64 flags;\n};\n\nstruct seccomp_notif {\n\t__u64 id;\n\t__u32 pid;\n\t__u32 flags;\n\tstruct seccomp_data data;\n};\n\nstruct seccomp_notif_addfd {\n\t__u64 id;\n\t__u32 flags;\n\t__u32 srcfd;\n\t__u32 newfd;\n\t__u32 newfd_flags;\n};\n\nstruct seccomp_notif_resp {\n\t__u64 id;\n\t__s64 val;\n\t__s32 error;\n\t__u32 flags;\n};\n\nstruct seccomp_notif_sizes {\n\t__u16 seccomp_notif;\n\t__u16 seccomp_notif_resp;\n\t__u16 seccomp_data;\n};\n\nstruct secrets_os_area {\n\tu32 msg_seqno_0;\n\tu32 msg_seqno_1;\n\tu32 msg_seqno_2;\n\tu32 msg_seqno_3;\n\tu64 ap_jump_table_pa;\n\tu8 rsvd[40];\n\tu8 guest_usage[32];\n};\n\nstruct section_header {\n\tchar name[8];\n\tuint32_t virtual_size;\n\tuint32_t virtual_address;\n\tuint32_t raw_data_size;\n\tuint32_t data_addr;\n\tuint32_t relocs;\n\tuint32_t line_numbers;\n\tuint16_t num_relocs;\n\tuint16_t num_lin_numbers;\n\tuint32_t flags;\n};\n\nstruct security_class_mapping {\n\tconst char *name;\n\tconst char *perms[33];\n};\n\nstruct security_hook_heads {\n\tstruct hlist_head binder_set_context_mgr;\n\tstruct hlist_head binder_transaction;\n\tstruct hlist_head binder_transfer_binder;\n\tstruct hlist_head binder_transfer_file;\n\tstruct hlist_head ptrace_access_check;\n\tstruct hlist_head ptrace_traceme;\n\tstruct hlist_head capget;\n\tstruct hlist_head capset;\n\tstruct hlist_head capable;\n\tstruct hlist_head quotactl;\n\tstruct hlist_head quota_on;\n\tstruct hlist_head syslog;\n\tstruct hlist_head settime;\n\tstruct hlist_head vm_enough_memory;\n\tstruct hlist_head bprm_creds_for_exec;\n\tstruct hlist_head bprm_creds_from_file;\n\tstruct hlist_head bprm_check_security;\n\tstruct hlist_head bprm_committing_creds;\n\tstruct hlist_head bprm_committed_creds;\n\tstruct hlist_head fs_context_submount;\n\tstruct hlist_head fs_context_dup;\n\tstruct hlist_head fs_context_parse_param;\n\tstruct hlist_head sb_alloc_security;\n\tstruct hlist_head sb_delete;\n\tstruct hlist_head sb_free_security;\n\tstruct hlist_head sb_free_mnt_opts;\n\tstruct hlist_head sb_eat_lsm_opts;\n\tstruct hlist_head sb_mnt_opts_compat;\n\tstruct hlist_head sb_remount;\n\tstruct hlist_head sb_kern_mount;\n\tstruct hlist_head sb_show_options;\n\tstruct hlist_head sb_statfs;\n\tstruct hlist_head sb_mount;\n\tstruct hlist_head sb_umount;\n\tstruct hlist_head sb_pivotroot;\n\tstruct hlist_head sb_set_mnt_opts;\n\tstruct hlist_head sb_clone_mnt_opts;\n\tstruct hlist_head move_mount;\n\tstruct hlist_head dentry_init_security;\n\tstruct hlist_head dentry_create_files_as;\n\tstruct hlist_head path_unlink;\n\tstruct hlist_head path_mkdir;\n\tstruct hlist_head path_rmdir;\n\tstruct hlist_head path_mknod;\n\tstruct hlist_head path_post_mknod;\n\tstruct hlist_head path_truncate;\n\tstruct hlist_head path_symlink;\n\tstruct hlist_head path_link;\n\tstruct hlist_head path_rename;\n\tstruct hlist_head path_chmod;\n\tstruct hlist_head path_chown;\n\tstruct hlist_head path_chroot;\n\tstruct hlist_head path_notify;\n\tstruct hlist_head inode_alloc_security;\n\tstruct hlist_head inode_free_security;\n\tstruct hlist_head inode_free_security_rcu;\n\tstruct hlist_head inode_init_security;\n\tstruct hlist_head inode_init_security_anon;\n\tstruct hlist_head inode_create;\n\tstruct hlist_head inode_post_create_tmpfile;\n\tstruct hlist_head inode_link;\n\tstruct hlist_head inode_unlink;\n\tstruct hlist_head inode_symlink;\n\tstruct hlist_head inode_mkdir;\n\tstruct hlist_head inode_rmdir;\n\tstruct hlist_head inode_mknod;\n\tstruct hlist_head inode_rename;\n\tstruct hlist_head inode_readlink;\n\tstruct hlist_head inode_follow_link;\n\tstruct hlist_head inode_permission;\n\tstruct hlist_head inode_setattr;\n\tstruct hlist_head inode_post_setattr;\n\tstruct hlist_head inode_getattr;\n\tstruct hlist_head inode_xattr_skipcap;\n\tstruct hlist_head inode_setxattr;\n\tstruct hlist_head inode_post_setxattr;\n\tstruct hlist_head inode_getxattr;\n\tstruct hlist_head inode_listxattr;\n\tstruct hlist_head inode_removexattr;\n\tstruct hlist_head inode_post_removexattr;\n\tstruct hlist_head inode_set_acl;\n\tstruct hlist_head inode_post_set_acl;\n\tstruct hlist_head inode_get_acl;\n\tstruct hlist_head inode_remove_acl;\n\tstruct hlist_head inode_post_remove_acl;\n\tstruct hlist_head inode_need_killpriv;\n\tstruct hlist_head inode_killpriv;\n\tstruct hlist_head inode_getsecurity;\n\tstruct hlist_head inode_setsecurity;\n\tstruct hlist_head inode_listsecurity;\n\tstruct hlist_head inode_getlsmblob;\n\tstruct hlist_head inode_copy_up;\n\tstruct hlist_head inode_copy_up_xattr;\n\tstruct hlist_head kernfs_init_security;\n\tstruct hlist_head file_permission;\n\tstruct hlist_head file_alloc_security;\n\tstruct hlist_head file_release;\n\tstruct hlist_head file_free_security;\n\tstruct hlist_head file_ioctl;\n\tstruct hlist_head file_ioctl_compat;\n\tstruct hlist_head mmap_addr;\n\tstruct hlist_head mmap_file;\n\tstruct hlist_head file_mprotect;\n\tstruct hlist_head file_lock;\n\tstruct hlist_head file_fcntl;\n\tstruct hlist_head file_set_fowner;\n\tstruct hlist_head file_send_sigiotask;\n\tstruct hlist_head file_receive;\n\tstruct hlist_head file_open;\n\tstruct hlist_head file_post_open;\n\tstruct hlist_head file_truncate;\n\tstruct hlist_head task_alloc;\n\tstruct hlist_head task_free;\n\tstruct hlist_head cred_alloc_blank;\n\tstruct hlist_head cred_free;\n\tstruct hlist_head cred_prepare;\n\tstruct hlist_head cred_transfer;\n\tstruct hlist_head cred_getsecid;\n\tstruct hlist_head cred_getlsmblob;\n\tstruct hlist_head kernel_act_as;\n\tstruct hlist_head kernel_create_files_as;\n\tstruct hlist_head kernel_module_request;\n\tstruct hlist_head kernel_load_data;\n\tstruct hlist_head kernel_post_load_data;\n\tstruct hlist_head kernel_read_file;\n\tstruct hlist_head kernel_post_read_file;\n\tstruct hlist_head task_fix_setuid;\n\tstruct hlist_head task_fix_setgid;\n\tstruct hlist_head task_fix_setgroups;\n\tstruct hlist_head task_setpgid;\n\tstruct hlist_head task_getpgid;\n\tstruct hlist_head task_getsid;\n\tstruct hlist_head current_getlsmblob_subj;\n\tstruct hlist_head task_getlsmblob_obj;\n\tstruct hlist_head task_setnice;\n\tstruct hlist_head task_setioprio;\n\tstruct hlist_head task_getioprio;\n\tstruct hlist_head task_prlimit;\n\tstruct hlist_head task_setrlimit;\n\tstruct hlist_head task_setscheduler;\n\tstruct hlist_head task_getscheduler;\n\tstruct hlist_head task_movememory;\n\tstruct hlist_head task_kill;\n\tstruct hlist_head task_prctl;\n\tstruct hlist_head task_to_inode;\n\tstruct hlist_head userns_create;\n\tstruct hlist_head ipc_permission;\n\tstruct hlist_head ipc_getlsmblob;\n\tstruct hlist_head msg_msg_alloc_security;\n\tstruct hlist_head msg_msg_free_security;\n\tstruct hlist_head msg_queue_alloc_security;\n\tstruct hlist_head msg_queue_free_security;\n\tstruct hlist_head msg_queue_associate;\n\tstruct hlist_head msg_queue_msgctl;\n\tstruct hlist_head msg_queue_msgsnd;\n\tstruct hlist_head msg_queue_msgrcv;\n\tstruct hlist_head shm_alloc_security;\n\tstruct hlist_head shm_free_security;\n\tstruct hlist_head shm_associate;\n\tstruct hlist_head shm_shmctl;\n\tstruct hlist_head shm_shmat;\n\tstruct hlist_head sem_alloc_security;\n\tstruct hlist_head sem_free_security;\n\tstruct hlist_head sem_associate;\n\tstruct hlist_head sem_semctl;\n\tstruct hlist_head sem_semop;\n\tstruct hlist_head netlink_send;\n\tstruct hlist_head d_instantiate;\n\tstruct hlist_head getselfattr;\n\tstruct hlist_head setselfattr;\n\tstruct hlist_head getprocattr;\n\tstruct hlist_head setprocattr;\n\tstruct hlist_head ismaclabel;\n\tstruct hlist_head secid_to_secctx;\n\tstruct hlist_head lsmblob_to_secctx;\n\tstruct hlist_head secctx_to_secid;\n\tstruct hlist_head release_secctx;\n\tstruct hlist_head inode_invalidate_secctx;\n\tstruct hlist_head inode_notifysecctx;\n\tstruct hlist_head inode_setsecctx;\n\tstruct hlist_head inode_getsecctx;\n\tstruct hlist_head post_notification;\n\tstruct hlist_head watch_key;\n\tstruct hlist_head unix_stream_connect;\n\tstruct hlist_head unix_may_send;\n\tstruct hlist_head socket_create;\n\tstruct hlist_head socket_post_create;\n\tstruct hlist_head socket_socketpair;\n\tstruct hlist_head socket_bind;\n\tstruct hlist_head socket_connect;\n\tstruct hlist_head socket_listen;\n\tstruct hlist_head socket_accept;\n\tstruct hlist_head socket_sendmsg;\n\tstruct hlist_head socket_recvmsg;\n\tstruct hlist_head socket_getsockname;\n\tstruct hlist_head socket_getpeername;\n\tstruct hlist_head socket_getsockopt;\n\tstruct hlist_head socket_setsockopt;\n\tstruct hlist_head socket_shutdown;\n\tstruct hlist_head socket_sock_rcv_skb;\n\tstruct hlist_head socket_getpeersec_stream;\n\tstruct hlist_head socket_getpeersec_dgram;\n\tstruct hlist_head sk_alloc_security;\n\tstruct hlist_head sk_free_security;\n\tstruct hlist_head sk_clone_security;\n\tstruct hlist_head sk_getsecid;\n\tstruct hlist_head sock_graft;\n\tstruct hlist_head inet_conn_request;\n\tstruct hlist_head inet_csk_clone;\n\tstruct hlist_head inet_conn_established;\n\tstruct hlist_head secmark_relabel_packet;\n\tstruct hlist_head secmark_refcount_inc;\n\tstruct hlist_head secmark_refcount_dec;\n\tstruct hlist_head req_classify_flow;\n\tstruct hlist_head tun_dev_alloc_security;\n\tstruct hlist_head tun_dev_free_security;\n\tstruct hlist_head tun_dev_create;\n\tstruct hlist_head tun_dev_attach_queue;\n\tstruct hlist_head tun_dev_attach;\n\tstruct hlist_head tun_dev_open;\n\tstruct hlist_head sctp_assoc_request;\n\tstruct hlist_head sctp_bind_connect;\n\tstruct hlist_head sctp_sk_clone;\n\tstruct hlist_head sctp_assoc_established;\n\tstruct hlist_head mptcp_add_subflow;\n\tstruct hlist_head ib_pkey_access;\n\tstruct hlist_head ib_endport_manage_subnet;\n\tstruct hlist_head ib_alloc_security;\n\tstruct hlist_head ib_free_security;\n\tstruct hlist_head xfrm_policy_alloc_security;\n\tstruct hlist_head xfrm_policy_clone_security;\n\tstruct hlist_head xfrm_policy_free_security;\n\tstruct hlist_head xfrm_policy_delete_security;\n\tstruct hlist_head xfrm_state_alloc;\n\tstruct hlist_head xfrm_state_alloc_acquire;\n\tstruct hlist_head xfrm_state_free_security;\n\tstruct hlist_head xfrm_state_delete_security;\n\tstruct hlist_head xfrm_policy_lookup;\n\tstruct hlist_head xfrm_state_pol_flow_match;\n\tstruct hlist_head xfrm_decode_session;\n\tstruct hlist_head key_alloc;\n\tstruct hlist_head key_free;\n\tstruct hlist_head key_permission;\n\tstruct hlist_head key_getsecurity;\n\tstruct hlist_head key_post_create_or_update;\n\tstruct hlist_head audit_rule_init;\n\tstruct hlist_head audit_rule_known;\n\tstruct hlist_head audit_rule_match;\n\tstruct hlist_head audit_rule_free;\n\tstruct hlist_head bpf;\n\tstruct hlist_head bpf_map;\n\tstruct hlist_head bpf_prog;\n\tstruct hlist_head bpf_map_create;\n\tstruct hlist_head bpf_map_free;\n\tstruct hlist_head bpf_prog_load;\n\tstruct hlist_head bpf_prog_free;\n\tstruct hlist_head bpf_token_create;\n\tstruct hlist_head bpf_token_free;\n\tstruct hlist_head bpf_token_cmd;\n\tstruct hlist_head bpf_token_capable;\n\tstruct hlist_head locked_down;\n\tstruct hlist_head lock_kernel_down;\n\tstruct hlist_head perf_event_open;\n\tstruct hlist_head perf_event_alloc;\n\tstruct hlist_head perf_event_free;\n\tstruct hlist_head perf_event_read;\n\tstruct hlist_head perf_event_write;\n\tstruct hlist_head uring_override_creds;\n\tstruct hlist_head uring_sqpoll;\n\tstruct hlist_head uring_cmd;\n};\n\nstruct timezone;\n\nstruct xattr;\n\nstruct sembuf;\n\nstruct xfrm_sec_ctx;\n\nstruct xfrm_user_sec_ctx;\n\nunion security_list_options {\n\tint (*binder_set_context_mgr)(const struct cred *);\n\tint (*binder_transaction)(const struct cred *, const struct cred *);\n\tint (*binder_transfer_binder)(const struct cred *, const struct cred *);\n\tint (*binder_transfer_file)(const struct cred *, const struct cred *, const struct file *);\n\tint (*ptrace_access_check)(struct task_struct *, unsigned int);\n\tint (*ptrace_traceme)(struct task_struct *);\n\tint (*capget)(const struct task_struct *, kernel_cap_t *, kernel_cap_t *, kernel_cap_t *);\n\tint (*capset)(struct cred *, const struct cred *, const kernel_cap_t *, const kernel_cap_t *, const kernel_cap_t *);\n\tint (*capable)(const struct cred *, struct user_namespace *, int, unsigned int);\n\tint (*quotactl)(int, int, int, const struct super_block *);\n\tint (*quota_on)(struct dentry *);\n\tint (*syslog)(int);\n\tint (*settime)(const struct timespec64 *, const struct timezone *);\n\tint (*vm_enough_memory)(struct mm_struct *, long int);\n\tint (*bprm_creds_for_exec)(struct linux_binprm *);\n\tint (*bprm_creds_from_file)(struct linux_binprm *, const struct file *);\n\tint (*bprm_check_security)(struct linux_binprm *);\n\tvoid (*bprm_committing_creds)(const struct linux_binprm *);\n\tvoid (*bprm_committed_creds)(const struct linux_binprm *);\n\tint (*fs_context_submount)(struct fs_context *, struct super_block *);\n\tint (*fs_context_dup)(struct fs_context *, struct fs_context *);\n\tint (*fs_context_parse_param)(struct fs_context *, struct fs_parameter *);\n\tint (*sb_alloc_security)(struct super_block *);\n\tvoid (*sb_delete)(struct super_block *);\n\tvoid (*sb_free_security)(struct super_block *);\n\tvoid (*sb_free_mnt_opts)(void *);\n\tint (*sb_eat_lsm_opts)(char *, void **);\n\tint (*sb_mnt_opts_compat)(struct super_block *, void *);\n\tint (*sb_remount)(struct super_block *, void *);\n\tint (*sb_kern_mount)(const struct super_block *);\n\tint (*sb_show_options)(struct seq_file *, struct super_block *);\n\tint (*sb_statfs)(struct dentry *);\n\tint (*sb_mount)(const char *, const struct path *, const char *, long unsigned int, void *);\n\tint (*sb_umount)(struct vfsmount *, int);\n\tint (*sb_pivotroot)(const struct path *, const struct path *);\n\tint (*sb_set_mnt_opts)(struct super_block *, void *, long unsigned int, long unsigned int *);\n\tint (*sb_clone_mnt_opts)(const struct super_block *, struct super_block *, long unsigned int, long unsigned int *);\n\tint (*move_mount)(const struct path *, const struct path *);\n\tint (*dentry_init_security)(struct dentry *, int, const struct qstr *, const char **, struct lsmcontext *);\n\tint (*dentry_create_files_as)(struct dentry *, int, struct qstr *, const struct cred *, struct cred *);\n\tint (*path_unlink)(const struct path *, struct dentry *);\n\tint (*path_mkdir)(const struct path *, struct dentry *, umode_t);\n\tint (*path_rmdir)(const struct path *, struct dentry *);\n\tint (*path_mknod)(const struct path *, struct dentry *, umode_t, unsigned int);\n\tvoid (*path_post_mknod)(struct mnt_idmap *, struct dentry *);\n\tint (*path_truncate)(const struct path *);\n\tint (*path_symlink)(const struct path *, struct dentry *, const char *);\n\tint (*path_link)(struct dentry *, const struct path *, struct dentry *);\n\tint (*path_rename)(const struct path *, struct dentry *, const struct path *, struct dentry *, unsigned int);\n\tint (*path_chmod)(const struct path *, umode_t);\n\tint (*path_chown)(const struct path *, kuid_t, kgid_t);\n\tint (*path_chroot)(const struct path *);\n\tint (*path_notify)(const struct path *, u64, unsigned int);\n\tint (*inode_alloc_security)(struct inode *);\n\tvoid (*inode_free_security)(struct inode *);\n\tvoid (*inode_free_security_rcu)(void *);\n\tint (*inode_init_security)(struct inode *, struct inode *, const struct qstr *, struct xattr *, int *);\n\tint (*inode_init_security_anon)(struct inode *, const struct qstr *, const struct inode *);\n\tint (*inode_create)(struct inode *, struct dentry *, umode_t);\n\tvoid (*inode_post_create_tmpfile)(struct mnt_idmap *, struct inode *);\n\tint (*inode_link)(struct dentry *, struct inode *, struct dentry *);\n\tint (*inode_unlink)(struct inode *, struct dentry *);\n\tint (*inode_symlink)(struct inode *, struct dentry *, const char *);\n\tint (*inode_mkdir)(struct inode *, struct dentry *, umode_t);\n\tint (*inode_rmdir)(struct inode *, struct dentry *);\n\tint (*inode_mknod)(struct inode *, struct dentry *, umode_t, dev_t);\n\tint (*inode_rename)(struct inode *, struct dentry *, struct inode *, struct dentry *);\n\tint (*inode_readlink)(struct dentry *);\n\tint (*inode_follow_link)(struct dentry *, struct inode *, bool);\n\tint (*inode_permission)(struct inode *, int);\n\tint (*inode_setattr)(struct mnt_idmap *, struct dentry *, struct iattr *);\n\tvoid (*inode_post_setattr)(struct mnt_idmap *, struct dentry *, int);\n\tint (*inode_getattr)(const struct path *);\n\tint (*inode_xattr_skipcap)(const char *);\n\tint (*inode_setxattr)(struct mnt_idmap *, struct dentry *, const char *, const void *, size_t, int);\n\tvoid (*inode_post_setxattr)(struct dentry *, const char *, const void *, size_t, int);\n\tint (*inode_getxattr)(struct dentry *, const char *);\n\tint (*inode_listxattr)(struct dentry *);\n\tint (*inode_removexattr)(struct mnt_idmap *, struct dentry *, const char *);\n\tvoid (*inode_post_removexattr)(struct dentry *, const char *);\n\tint (*inode_set_acl)(struct mnt_idmap *, struct dentry *, const char *, struct posix_acl *);\n\tvoid (*inode_post_set_acl)(struct dentry *, const char *, struct posix_acl *);\n\tint (*inode_get_acl)(struct mnt_idmap *, struct dentry *, const char *);\n\tint (*inode_remove_acl)(struct mnt_idmap *, struct dentry *, const char *);\n\tvoid (*inode_post_remove_acl)(struct mnt_idmap *, struct dentry *, const char *);\n\tint (*inode_need_killpriv)(struct dentry *);\n\tint (*inode_killpriv)(struct mnt_idmap *, struct dentry *);\n\tint (*inode_getsecurity)(struct mnt_idmap *, struct inode *, const char *, void **, bool);\n\tint (*inode_setsecurity)(struct inode *, const char *, const void *, size_t, int);\n\tint (*inode_listsecurity)(struct inode *, char *, size_t);\n\tvoid (*inode_getlsmblob)(struct inode *, struct lsmblob *);\n\tint (*inode_copy_up)(struct dentry *, struct cred **);\n\tint (*inode_copy_up_xattr)(struct dentry *, const char *);\n\tint (*kernfs_init_security)(struct kernfs_node *, struct kernfs_node *);\n\tint (*file_permission)(struct file *, int);\n\tint (*file_alloc_security)(struct file *);\n\tvoid (*file_release)(struct file *);\n\tvoid (*file_free_security)(struct file *);\n\tint (*file_ioctl)(struct file *, unsigned int, long unsigned int);\n\tint (*file_ioctl_compat)(struct file *, unsigned int, long unsigned int);\n\tint (*mmap_addr)(long unsigned int);\n\tint (*mmap_file)(struct file *, long unsigned int, long unsigned int, long unsigned int);\n\tint (*file_mprotect)(struct vm_area_struct *, long unsigned int, long unsigned int);\n\tint (*file_lock)(struct file *, unsigned int);\n\tint (*file_fcntl)(struct file *, unsigned int, long unsigned int);\n\tvoid (*file_set_fowner)(struct file *);\n\tint (*file_send_sigiotask)(struct task_struct *, struct fown_struct *, int);\n\tint (*file_receive)(struct file *);\n\tint (*file_open)(struct file *);\n\tint (*file_post_open)(struct file *, int);\n\tint (*file_truncate)(struct file *);\n\tint (*task_alloc)(struct task_struct *, long unsigned int);\n\tvoid (*task_free)(struct task_struct *);\n\tint (*cred_alloc_blank)(struct cred *, gfp_t);\n\tvoid (*cred_free)(struct cred *);\n\tint (*cred_prepare)(struct cred *, const struct cred *, gfp_t);\n\tvoid (*cred_transfer)(struct cred *, const struct cred *);\n\tvoid (*cred_getsecid)(const struct cred *, u32 *);\n\tvoid (*cred_getlsmblob)(const struct cred *, struct lsmblob *);\n\tint (*kernel_act_as)(struct cred *, u32);\n\tint (*kernel_create_files_as)(struct cred *, struct inode *);\n\tint (*kernel_module_request)(char *);\n\tint (*kernel_load_data)(enum kernel_load_data_id, bool);\n\tint (*kernel_post_load_data)(char *, loff_t, enum kernel_load_data_id, char *);\n\tint (*kernel_read_file)(struct file *, enum kernel_read_file_id, bool);\n\tint (*kernel_post_read_file)(struct file *, char *, loff_t, enum kernel_read_file_id);\n\tint (*task_fix_setuid)(struct cred *, const struct cred *, int);\n\tint (*task_fix_setgid)(struct cred *, const struct cred *, int);\n\tint (*task_fix_setgroups)(struct cred *, const struct cred *);\n\tint (*task_setpgid)(struct task_struct *, pid_t);\n\tint (*task_getpgid)(struct task_struct *);\n\tint (*task_getsid)(struct task_struct *);\n\tvoid (*current_getlsmblob_subj)(struct lsmblob *);\n\tvoid (*task_getlsmblob_obj)(struct task_struct *, struct lsmblob *);\n\tint (*task_setnice)(struct task_struct *, int);\n\tint (*task_setioprio)(struct task_struct *, int);\n\tint (*task_getioprio)(struct task_struct *);\n\tint (*task_prlimit)(const struct cred *, const struct cred *, unsigned int);\n\tint (*task_setrlimit)(struct task_struct *, unsigned int, struct rlimit *);\n\tint (*task_setscheduler)(struct task_struct *);\n\tint (*task_getscheduler)(struct task_struct *);\n\tint (*task_movememory)(struct task_struct *);\n\tint (*task_kill)(struct task_struct *, struct kernel_siginfo *, int, const struct cred *);\n\tint (*task_prctl)(int, long unsigned int, long unsigned int, long unsigned int, long unsigned int);\n\tvoid (*task_to_inode)(struct task_struct *, struct inode *);\n\tint (*userns_create)(const struct cred *);\n\tint (*ipc_permission)(struct kern_ipc_perm *, short int);\n\tvoid (*ipc_getlsmblob)(struct kern_ipc_perm *, struct lsmblob *);\n\tint (*msg_msg_alloc_security)(struct msg_msg *);\n\tvoid (*msg_msg_free_security)(struct msg_msg *);\n\tint (*msg_queue_alloc_security)(struct kern_ipc_perm *);\n\tvoid (*msg_queue_free_security)(struct kern_ipc_perm *);\n\tint (*msg_queue_associate)(struct kern_ipc_perm *, int);\n\tint (*msg_queue_msgctl)(struct kern_ipc_perm *, int);\n\tint (*msg_queue_msgsnd)(struct kern_ipc_perm *, struct msg_msg *, int);\n\tint (*msg_queue_msgrcv)(struct kern_ipc_perm *, struct msg_msg *, struct task_struct *, long int, int);\n\tint (*shm_alloc_security)(struct kern_ipc_perm *);\n\tvoid (*shm_free_security)(struct kern_ipc_perm *);\n\tint (*shm_associate)(struct kern_ipc_perm *, int);\n\tint (*shm_shmctl)(struct kern_ipc_perm *, int);\n\tint (*shm_shmat)(struct kern_ipc_perm *, char *, int);\n\tint (*sem_alloc_security)(struct kern_ipc_perm *);\n\tvoid (*sem_free_security)(struct kern_ipc_perm *);\n\tint (*sem_associate)(struct kern_ipc_perm *, int);\n\tint (*sem_semctl)(struct kern_ipc_perm *, int);\n\tint (*sem_semop)(struct kern_ipc_perm *, struct sembuf *, unsigned int, int);\n\tint (*netlink_send)(struct sock *, struct sk_buff *);\n\tvoid (*d_instantiate)(struct dentry *, struct inode *);\n\tint (*getselfattr)(unsigned int, struct lsm_ctx *, u32 *, u32);\n\tint (*setselfattr)(unsigned int, struct lsm_ctx *, u32, u32);\n\tint (*getprocattr)(struct task_struct *, const char *, char **);\n\tint (*setprocattr)(const char *, void *, size_t);\n\tint (*ismaclabel)(const char *);\n\tint (*secid_to_secctx)(u32, struct lsmcontext *);\n\tint (*lsmblob_to_secctx)(struct lsmblob *, struct lsmcontext *);\n\tint (*secctx_to_secid)(const char *, u32, u32 *);\n\tvoid (*release_secctx)(struct lsmcontext *);\n\tvoid (*inode_invalidate_secctx)(struct inode *);\n\tint (*inode_notifysecctx)(struct inode *, void *, u32);\n\tint (*inode_setsecctx)(struct dentry *, void *, u32);\n\tint (*inode_getsecctx)(struct inode *, struct lsmcontext *);\n\tint (*post_notification)(const struct cred *, const struct cred *, struct watch_notification *);\n\tint (*watch_key)(struct key *);\n\tint (*unix_stream_connect)(struct sock *, struct sock *, struct sock *);\n\tint (*unix_may_send)(struct socket *, struct socket *);\n\tint (*socket_create)(int, int, int, int);\n\tint (*socket_post_create)(struct socket *, int, int, int, int);\n\tint (*socket_socketpair)(struct socket *, struct socket *);\n\tint (*socket_bind)(struct socket *, struct sockaddr *, int);\n\tint (*socket_connect)(struct socket *, struct sockaddr *, int);\n\tint (*socket_listen)(struct socket *, int);\n\tint (*socket_accept)(struct socket *, struct socket *);\n\tint (*socket_sendmsg)(struct socket *, struct msghdr *, int);\n\tint (*socket_recvmsg)(struct socket *, struct msghdr *, int, int);\n\tint (*socket_getsockname)(struct socket *);\n\tint (*socket_getpeername)(struct socket *);\n\tint (*socket_getsockopt)(struct socket *, int, int);\n\tint (*socket_setsockopt)(struct socket *, int, int);\n\tint (*socket_shutdown)(struct socket *, int);\n\tint (*socket_sock_rcv_skb)(struct sock *, struct sk_buff *);\n\tint (*socket_getpeersec_stream)(struct socket *, sockptr_t, sockptr_t, unsigned int);\n\tint (*socket_getpeersec_dgram)(struct socket *, struct sk_buff *, u32 *);\n\tint (*sk_alloc_security)(struct sock *, int, gfp_t);\n\tvoid (*sk_free_security)(struct sock *);\n\tvoid (*sk_clone_security)(const struct sock *, struct sock *);\n\tvoid (*sk_getsecid)(const struct sock *, u32 *);\n\tvoid (*sock_graft)(struct sock *, struct socket *);\n\tint (*inet_conn_request)(const struct sock *, struct sk_buff *, struct request_sock *);\n\tvoid (*inet_csk_clone)(struct sock *, const struct request_sock *);\n\tvoid (*inet_conn_established)(struct sock *, struct sk_buff *);\n\tint (*secmark_relabel_packet)(u32);\n\tvoid (*secmark_refcount_inc)(void);\n\tvoid (*secmark_refcount_dec)(void);\n\tvoid (*req_classify_flow)(const struct request_sock *, struct flowi_common *);\n\tint (*tun_dev_alloc_security)(void **);\n\tvoid (*tun_dev_free_security)(void *);\n\tint (*tun_dev_create)(void);\n\tint (*tun_dev_attach_queue)(void *);\n\tint (*tun_dev_attach)(struct sock *, void *);\n\tint (*tun_dev_open)(void *);\n\tint (*sctp_assoc_request)(struct sctp_association *, struct sk_buff *);\n\tint (*sctp_bind_connect)(struct sock *, int, struct sockaddr *, int);\n\tvoid (*sctp_sk_clone)(struct sctp_association *, struct sock *, struct sock *);\n\tint (*sctp_assoc_established)(struct sctp_association *, struct sk_buff *);\n\tint (*mptcp_add_subflow)(struct sock *, struct sock *);\n\tint (*ib_pkey_access)(void *, u64, u16);\n\tint (*ib_endport_manage_subnet)(void *, const char *, u8);\n\tint (*ib_alloc_security)(void **);\n\tvoid (*ib_free_security)(void *);\n\tint (*xfrm_policy_alloc_security)(struct xfrm_sec_ctx **, struct xfrm_user_sec_ctx *, gfp_t);\n\tint (*xfrm_policy_clone_security)(struct xfrm_sec_ctx *, struct xfrm_sec_ctx **);\n\tvoid (*xfrm_policy_free_security)(struct xfrm_sec_ctx *);\n\tint (*xfrm_policy_delete_security)(struct xfrm_sec_ctx *);\n\tint (*xfrm_state_alloc)(struct xfrm_state *, struct xfrm_user_sec_ctx *);\n\tint (*xfrm_state_alloc_acquire)(struct xfrm_state *, struct xfrm_sec_ctx *, u32);\n\tvoid (*xfrm_state_free_security)(struct xfrm_state *);\n\tint (*xfrm_state_delete_security)(struct xfrm_state *);\n\tint (*xfrm_policy_lookup)(struct xfrm_sec_ctx *, u32);\n\tint (*xfrm_state_pol_flow_match)(struct xfrm_state *, struct xfrm_policy *, const struct flowi_common *);\n\tint (*xfrm_decode_session)(struct sk_buff *, u32 *, int);\n\tint (*key_alloc)(struct key *, const struct cred *, long unsigned int);\n\tvoid (*key_free)(struct key *);\n\tint (*key_permission)(key_ref_t, const struct cred *, enum key_need_perm);\n\tint (*key_getsecurity)(struct key *, char **);\n\tvoid (*key_post_create_or_update)(struct key *, struct key *, const void *, size_t, long unsigned int, bool);\n\tint (*audit_rule_init)(u32, u32, char *, void **, gfp_t);\n\tint (*audit_rule_known)(struct audit_krule *);\n\tint (*audit_rule_match)(struct lsmblob *, u32, u32, void *);\n\tvoid (*audit_rule_free)(void *);\n\tint (*bpf)(int, union bpf_attr *, unsigned int);\n\tint (*bpf_map)(struct bpf_map *, fmode_t);\n\tint (*bpf_prog)(struct bpf_prog *);\n\tint (*bpf_map_create)(struct bpf_map *, union bpf_attr *, struct bpf_token *);\n\tvoid (*bpf_map_free)(struct bpf_map *);\n\tint (*bpf_prog_load)(struct bpf_prog *, union bpf_attr *, struct bpf_token *);\n\tvoid (*bpf_prog_free)(struct bpf_prog *);\n\tint (*bpf_token_create)(struct bpf_token *, union bpf_attr *, struct path *);\n\tvoid (*bpf_token_free)(struct bpf_token *);\n\tint (*bpf_token_cmd)(const struct bpf_token *, enum bpf_cmd);\n\tint (*bpf_token_capable)(const struct bpf_token *, int);\n\tint (*locked_down)(enum lockdown_reason);\n\tint (*lock_kernel_down)(const char *, enum lockdown_reason);\n\tint (*perf_event_open)(struct perf_event_attr *, int);\n\tint (*perf_event_alloc)(struct perf_event *);\n\tvoid (*perf_event_free)(struct perf_event *);\n\tint (*perf_event_read)(struct perf_event *);\n\tint (*perf_event_write)(struct perf_event *);\n\tint (*uring_override_creds)(const struct cred *);\n\tint (*uring_sqpoll)(void);\n\tint (*uring_cmd)(struct io_uring_cmd *);\n};\n\nstruct security_hook_list {\n\tstruct hlist_node list;\n\tstruct hlist_head *head;\n\tunion security_list_options hook;\n\tconst struct lsm_id *lsmid;\n};\n\nstruct seg6_local_lwt;\n\nstruct seg6_local_lwtunnel_ops {\n\tint (*build_state)(struct seg6_local_lwt *, const void *, struct netlink_ext_ack *);\n\tvoid (*destroy_state)(struct seg6_local_lwt *);\n};\n\nstruct seg6_action_desc {\n\tint action;\n\tlong unsigned int attrs;\n\tlong unsigned int optattrs;\n\tint (*input)(struct sk_buff *, struct seg6_local_lwt *);\n\tint static_headroom;\n\tstruct seg6_local_lwtunnel_ops slwt_ops;\n};\n\nstruct seg6_action_param {\n\tint (*parse)(struct nlattr **, struct seg6_local_lwt *, struct netlink_ext_ack *);\n\tint (*put)(struct sk_buff *, struct seg6_local_lwt *);\n\tint (*cmp)(struct seg6_local_lwt *, struct seg6_local_lwt *);\n\tvoid (*destroy)(struct seg6_local_lwt *);\n};\n\nstruct seg6_bpf_srh_state {\n\tlocal_lock_t bh_lock;\n\tstruct ipv6_sr_hdr *srh;\n\tu16 hdrlen;\n\tbool valid;\n};\n\nstruct seg6_end_dt_info {\n\tenum seg6_end_dt_mode mode;\n\tstruct net *net;\n\tint vrf_ifindex;\n\tint vrf_table;\n\tu16 family;\n};\n\nstruct seg6_flavors_info {\n\t__u32 flv_ops;\n\t__u8 lcblock_bits;\n\t__u8 lcnode_func_bits;\n};\n\nstruct seg6_hmac_algo {\n\tu8 alg_id;\n\tchar name[64];\n\tstruct crypto_shash **tfms;\n\tstruct shash_desc **shashs;\n};\n\nstruct seg6_hmac_info {\n\tstruct rhash_head node;\n\tstruct callback_head rcu;\n\tu32 hmackeyid;\n\tchar secret[64];\n\tu8 slen;\n\tu8 alg_id;\n};\n\nstruct seg6_iptunnel_encap {\n\tint mode;\n\tstruct ipv6_sr_hdr srh[0];\n};\n\nstruct seg6_local_counters {\n\t__u64 packets;\n\t__u64 bytes;\n\t__u64 errors;\n};\n\nstruct seg6_local_lwt {\n\tint action;\n\tstruct ipv6_sr_hdr *srh;\n\tint table;\n\tstruct in_addr nh4;\n\tstruct in6_addr nh6;\n\tint iif;\n\tint oif;\n\tstruct bpf_lwt_prog bpf;\n\tstruct seg6_end_dt_info dt_info;\n\tstruct seg6_flavors_info flv_info;\n\tstruct pcpu_seg6_local_counters *pcpu_counters;\n\tint headroom;\n\tstruct seg6_action_desc *desc;\n\tlong unsigned int parsed_optattrs;\n};\n\nstruct seg6_lwt {\n\tstruct dst_cache cache;\n\tstruct seg6_iptunnel_encap tuninfo[0];\n};\n\nstruct seg6_pernet_data {\n\tstruct mutex lock;\n\tstruct in6_addr *tun_src;\n\tstruct rhashtable hmac_infos;\n};\n\nstruct sel_ib_pkey {\n\tstruct pkey_security_struct psec;\n\tstruct list_head list;\n\tstruct callback_head rcu;\n};\n\nstruct sel_ib_pkey_bkt {\n\tint size;\n\tstruct list_head list;\n};\n\nstruct sel_netif {\n\tstruct list_head list;\n\tstruct netif_security_struct nsec;\n\tstruct callback_head callback_head;\n};\n\nstruct sel_netnode {\n\tstruct netnode_security_struct nsec;\n\tstruct list_head list;\n\tstruct callback_head rcu;\n};\n\nstruct sel_netnode_bkt {\n\tunsigned int size;\n\tstruct list_head list;\n};\n\nstruct sel_netport {\n\tstruct netport_security_struct psec;\n\tstruct list_head list;\n\tstruct callback_head rcu;\n};\n\nstruct sel_netport_bkt {\n\tint size;\n\tstruct list_head list;\n};\n\nstruct select_data {\n\tstruct dentry *start;\n\tunion {\n\t\tlong int found;\n\t\tstruct dentry *victim;\n\t};\n\tstruct list_head dispose;\n};\n\nstruct selinux_audit_data {\n\tu32 ssid;\n\tu32 tsid;\n\tu16 tclass;\n\tu32 requested;\n\tu32 audited;\n\tu32 denied;\n\tint result;\n};\n\nstruct selinux_audit_rule {\n\tu32 au_seqno;\n\tstruct context___2 au_ctxt;\n};\n\nstruct selinux_avc {\n\tunsigned int avc_cache_threshold;\n\tstruct avc_cache avc_cache;\n};\n\nstruct selinux_fs_info {\n\tstruct dentry *bool_dir;\n\tunsigned int bool_num;\n\tchar **bool_pending_names;\n\tint *bool_pending_values;\n\tstruct dentry *class_dir;\n\tlong unsigned int last_class_ino;\n\tbool policy_opened;\n\tstruct dentry *policycap_dir;\n\tlong unsigned int last_ino;\n\tstruct super_block *sb;\n};\n\nstruct selinux_kernel_status {\n\tu32 version;\n\tu32 sequence;\n\tu32 enforcing;\n\tu32 policyload;\n\tu32 deny_unknown;\n};\n\nstruct selinux_policy;\n\nstruct selinux_policy_convert_data;\n\nstruct selinux_load_state {\n\tstruct selinux_policy *policy;\n\tstruct selinux_policy_convert_data *convert_data;\n};\n\nstruct selinux_mapping;\n\nstruct selinux_map {\n\tstruct selinux_mapping *mapping;\n\tu16 size;\n};\n\nstruct selinux_mapping {\n\tu16 value;\n\tu16 num_perms;\n\tu32 perms[32];\n};\n\nstruct selinux_mnt_opts {\n\tbool initialized;\n\tu32 fscontext_sid;\n\tu32 context_sid;\n\tu32 rootcontext_sid;\n\tu32 defcontext_sid;\n};\n\nstruct sidtab;\n\nstruct selinux_policy {\n\tstruct sidtab *sidtab;\n\tstruct policydb policydb;\n\tstruct selinux_map map;\n\tu32 latest_granting;\n};\n\nstruct sidtab_convert_params {\n\tstruct convert_context_args *args;\n\tstruct sidtab *target;\n};\n\nstruct selinux_policy_convert_data {\n\tstruct convert_context_args args;\n\tstruct sidtab_convert_params sidtab_params;\n};\n\nstruct selinux_state {\n\tbool enforcing;\n\tbool initialized;\n\tbool policycap[9];\n\tstruct page *status_page;\n\tstruct mutex status_lock;\n\tstruct selinux_policy *policy;\n\tstruct mutex policy_mutex;\n};\n\nstruct selnl_msg_policyload {\n\t__u32 seqno;\n};\n\nstruct selnl_msg_setenforce {\n\t__s32 val;\n};\n\nstruct sem {\n\tint semval;\n\tstruct pid *sempid;\n\tspinlock_t lock;\n\tstruct list_head pending_alter;\n\tstruct list_head pending_const;\n\ttime64_t sem_otime;\n};\n\nstruct sem_array {\n\tstruct kern_ipc_perm sem_perm;\n\ttime64_t sem_ctime;\n\tstruct list_head pending_alter;\n\tstruct list_head pending_const;\n\tstruct list_head list_id;\n\tint sem_nsems;\n\tint complex_count;\n\tunsigned int use_global_lock;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tstruct sem sems[0];\n};\n\nstruct sem_undo;\n\nstruct sem_queue {\n\tstruct list_head list;\n\tstruct task_struct *sleeper;\n\tstruct sem_undo *undo;\n\tstruct pid *pid;\n\tint status;\n\tstruct sembuf *sops;\n\tstruct sembuf *blocking;\n\tint nsops;\n\tbool alter;\n\tbool dupsop;\n};\n\nstruct sem_undo_list;\n\nstruct sem_undo {\n\tstruct list_head list_proc;\n\tstruct callback_head rcu;\n\tstruct sem_undo_list *ulp;\n\tstruct list_head list_id;\n\tint semid;\n\tshort int semadj[0];\n};\n\nstruct sem_undo_list {\n\trefcount_t refcnt;\n\tspinlock_t lock;\n\tstruct list_head list_proc;\n};\n\nstruct semaphore_waiter {\n\tstruct list_head list;\n\tstruct task_struct *task;\n\tbool up;\n};\n\nstruct sembuf {\n\tshort unsigned int sem_num;\n\tshort int sem_op;\n\tshort int sem_flg;\n};\n\nstruct semid64_ds {\n\tstruct ipc64_perm sem_perm;\n\t__kernel_long_t sem_otime;\n\t__kernel_ulong_t __unused1;\n\t__kernel_long_t sem_ctime;\n\t__kernel_ulong_t __unused2;\n\t__kernel_ulong_t sem_nsems;\n\t__kernel_ulong_t __unused3;\n\t__kernel_ulong_t __unused4;\n};\n\nstruct semid_ds {\n\tstruct ipc_perm sem_perm;\n\t__kernel_old_time_t sem_otime;\n\t__kernel_old_time_t sem_ctime;\n\tstruct sem *sem_base;\n\tstruct sem_queue *sem_pending;\n\tstruct sem_queue **sem_pending_last;\n\tstruct sem_undo *undo;\n\tshort unsigned int sem_nsems;\n};\n\nstruct seminfo {\n\tint semmap;\n\tint semmni;\n\tint semmns;\n\tint semmnu;\n\tint semmsl;\n\tint semopm;\n\tint semume;\n\tint semusz;\n\tint semvmx;\n\tint semaem;\n};\n\nstruct virtnet_sq_stats {\n\tstruct u64_stats_sync syncp;\n\tu64_stats_t packets;\n\tu64_stats_t bytes;\n\tu64_stats_t xdp_tx;\n\tu64_stats_t xdp_tx_drops;\n\tu64_stats_t kicks;\n\tu64_stats_t tx_timeouts;\n\tu64_stats_t stop;\n\tu64_stats_t wake;\n};\n\nstruct send_queue {\n\tstruct virtqueue *vq;\n\tstruct scatterlist sg[19];\n\tchar name[16];\n\tstruct virtnet_sq_stats stats;\n\tstruct virtnet_interrupt_coalesce intr_coal;\n\tstruct napi_struct napi;\n\tbool reset;\n};\n\nstruct send_signal_irq_work {\n\tstruct irq_work irq_work;\n\tstruct task_struct *task;\n\tu32 sig;\n\tenum pid_type type;\n};\n\nstruct seqDef_s {\n\tU32 offBase;\n\tU16 litLength;\n\tU16 mlBase;\n};\n\nstruct seq_operations {\n\tvoid * (*start)(struct seq_file *, loff_t *);\n\tvoid (*stop)(struct seq_file *, void *);\n\tvoid * (*next)(struct seq_file *, void *, loff_t *);\n\tint (*show)(struct seq_file *, void *);\n};\n\nstruct serdev_device;\n\nstruct serdev_controller_ops;\n\nstruct serdev_controller {\n\tstruct device dev;\n\tstruct device *host;\n\tunsigned int nr;\n\tstruct serdev_device *serdev;\n\tconst struct serdev_controller_ops *ops;\n};\n\nstruct serdev_controller_ops {\n\tssize_t (*write_buf)(struct serdev_controller *, const u8 *, size_t);\n\tvoid (*write_flush)(struct serdev_controller *);\n\tint (*write_room)(struct serdev_controller *);\n\tint (*open)(struct serdev_controller *);\n\tvoid (*close)(struct serdev_controller *);\n\tvoid (*set_flow_control)(struct serdev_controller *, bool);\n\tint (*set_parity)(struct serdev_controller *, enum serdev_parity);\n\tunsigned int (*set_baudrate)(struct serdev_controller *, unsigned int);\n\tvoid (*wait_until_sent)(struct serdev_controller *, long int);\n\tint (*get_tiocm)(struct serdev_controller *);\n\tint (*set_tiocm)(struct serdev_controller *, unsigned int, unsigned int);\n\tint (*break_ctl)(struct serdev_controller *, unsigned int);\n};\n\nstruct serdev_device_ops;\n\nstruct serdev_device {\n\tstruct device dev;\n\tint nr;\n\tstruct serdev_controller *ctrl;\n\tconst struct serdev_device_ops *ops;\n\tstruct completion write_comp;\n\tstruct mutex write_lock;\n};\n\nstruct serdev_device_driver {\n\tstruct device_driver driver;\n\tint (*probe)(struct serdev_device *);\n\tvoid (*remove)(struct serdev_device *);\n};\n\nstruct serdev_device_ops {\n\tsize_t (*receive_buf)(struct serdev_device *, const u8 *, size_t);\n\tvoid (*write_wakeup)(struct serdev_device *);\n};\n\nstruct serial8250_config {\n\tconst char *name;\n\tshort unsigned int fifo_size;\n\tshort unsigned int tx_loadsz;\n\tunsigned char fcr;\n\tunsigned char rxtrig_bytes[4];\n\tunsigned int flags;\n};\n\nstruct serial_ctrl_device {\n\tstruct device dev;\n\tstruct ida port_ida;\n};\n\nstruct serial_icounter_struct {\n\tint cts;\n\tint dsr;\n\tint rng;\n\tint dcd;\n\tint rx;\n\tint tx;\n\tint frame;\n\tint overrun;\n\tint parity;\n\tint brk;\n\tint buf_overrun;\n\tint reserved[9];\n};\n\nstruct serial_in_rdev {\n\tstruct rb_root_cached serial_rb;\n\tspinlock_t serial_lock;\n\twait_queue_head_t serial_io_wait;\n};\n\nstruct serial_port_device {\n\tstruct device dev;\n\tstruct uart_port *port;\n\tunsigned int tx_enabled: 1;\n};\n\nstruct serial_private {\n\tstruct pci_dev *dev;\n\tunsigned int nr;\n\tstruct pci_serial_quirk *quirk;\n\tconst struct pciserial_board *board;\n\tint line[0];\n};\n\nstruct serial_struct {\n\tint type;\n\tint line;\n\tunsigned int port;\n\tint irq;\n\tint flags;\n\tint xmit_fifo_size;\n\tint custom_divisor;\n\tint baud_base;\n\tshort unsigned int close_delay;\n\tchar io_type;\n\tchar reserved_char[1];\n\tint hub6;\n\tshort unsigned int closing_wait;\n\tshort unsigned int closing_wait2;\n\tunsigned char *iomem_base;\n\tshort unsigned int iomem_reg_shift;\n\tunsigned int port_high;\n\tlong unsigned int iomap_base;\n};\n\nstruct serial_struct32 {\n\tcompat_int_t type;\n\tcompat_int_t line;\n\tcompat_uint_t port;\n\tcompat_int_t irq;\n\tcompat_int_t flags;\n\tcompat_int_t xmit_fifo_size;\n\tcompat_int_t custom_divisor;\n\tcompat_int_t baud_base;\n\tshort unsigned int close_delay;\n\tchar io_type;\n\tchar reserved_char;\n\tcompat_int_t hub6;\n\tshort unsigned int closing_wait;\n\tshort unsigned int closing_wait2;\n\tcompat_uint_t iomem_base;\n\tshort unsigned int iomem_reg_shift;\n\tunsigned int port_high;\n\tcompat_int_t reserved;\n};\n\nstruct serio_device_id {\n\t__u8 type;\n\t__u8 extra;\n\t__u8 id;\n\t__u8 proto;\n};\n\nstruct serio_driver;\n\nstruct serio {\n\tvoid *port_data;\n\tchar name[32];\n\tchar phys[32];\n\tchar firmware_id[128];\n\tbool manual_bind;\n\tstruct serio_device_id id;\n\tspinlock_t lock;\n\tint (*write)(struct serio *, unsigned char);\n\tint (*open)(struct serio *);\n\tvoid (*close)(struct serio *);\n\tint (*start)(struct serio *);\n\tvoid (*stop)(struct serio *);\n\tstruct serio *parent;\n\tstruct list_head child_node;\n\tstruct list_head children;\n\tunsigned int depth;\n\tstruct serio_driver *drv;\n\tstruct mutex drv_mutex;\n\tstruct device dev;\n\tstruct list_head node;\n\tstruct mutex *ps2_cmd_mutex;\n};\n\nstruct serio_driver {\n\tconst char *description;\n\tconst struct serio_device_id *id_table;\n\tbool manual_bind;\n\tvoid (*write_wakeup)(struct serio *);\n\tirqreturn_t (*interrupt)(struct serio *, unsigned char, unsigned int);\n\tint (*connect)(struct serio *, struct serio_driver *);\n\tint (*reconnect)(struct serio *);\n\tint (*fast_reconnect)(struct serio *);\n\tvoid (*disconnect)(struct serio *);\n\tvoid (*cleanup)(struct serio *);\n\tstruct device_driver driver;\n};\n\nstruct serio_event {\n\tenum serio_event_type type;\n\tvoid *object;\n\tstruct module *owner;\n\tstruct list_head node;\n};\n\nstruct serport {\n\tstruct tty_port *port;\n\tstruct tty_struct *tty;\n\tstruct tty_driver *tty_drv;\n\tint tty_idx;\n\tlong unsigned int flags;\n};\n\nstruct set_affinity_pending {\n\trefcount_t refs;\n\tunsigned int stop_pending;\n\tstruct completion done;\n\tstruct cpu_stop_work stop_work;\n\tstruct migration_arg arg;\n};\n\nstruct set_config_request {\n\tstruct usb_device *udev;\n\tint config;\n\tstruct work_struct work;\n\tstruct list_head node;\n};\n\nstruct set_msi_sid_data {\n\tstruct pci_dev *pdev;\n\tu16 alias;\n\tint count;\n\tint busmatch_count;\n};\n\nstruct set_mtrr_data {\n\tlong unsigned int smp_base;\n\tlong unsigned int smp_size;\n\tunsigned int smp_reg;\n\tmtrr_type smp_type;\n};\n\nstruct setid_rule {\n\tstruct hlist_node next;\n\tkid_t src_id;\n\tkid_t dst_id;\n\tenum setid_type type;\n};\n\nstruct setid_ruleset {\n\tstruct hlist_head rules[256];\n\tchar *policy_str;\n\tstruct callback_head rcu;\n\tenum setid_type type;\n};\n\nstruct setup_indirect {\n\t__u32 type;\n\t__u32 reserved;\n\t__u64 len;\n\t__u64 addr;\n};\n\nstruct setup_rw_req {\n\tunsigned int grant_idx;\n\tstruct blkif_request_segment *segments;\n\tstruct blkfront_ring_info *rinfo;\n\tstruct blkif_request *ring_req;\n\tgrant_ref_t gref_head;\n\tunsigned int id;\n\tbool need_copy;\n\tunsigned int bvec_off;\n\tchar *bvec_data;\n\tbool require_extra_req;\n\tstruct blkif_request *extra_ring_req;\n};\n\nstruct sev_config {\n\t__u64 debug: 1;\n\t__u64 ghcbs_initialized: 1;\n\t__u64 use_cas: 1;\n\t__u64 __reserved: 61;\n};\n\nstruct sev_es_runtime_data {\n\tstruct ghcb ghcb_page;\n\tstruct ghcb backup_ghcb;\n\tbool ghcb_active;\n\tbool backup_ghcb_active;\n\tlong unsigned int dr7;\n};\n\nstruct vmcb_seg {\n\tu16 selector;\n\tu16 attrib;\n\tu32 limit;\n\tu64 base;\n};\n\nstruct sev_es_save_area {\n\tstruct vmcb_seg es;\n\tstruct vmcb_seg cs;\n\tstruct vmcb_seg ss;\n\tstruct vmcb_seg ds;\n\tstruct vmcb_seg fs;\n\tstruct vmcb_seg gs;\n\tstruct vmcb_seg gdtr;\n\tstruct vmcb_seg ldtr;\n\tstruct vmcb_seg idtr;\n\tstruct vmcb_seg tr;\n\tu64 pl0_ssp;\n\tu64 pl1_ssp;\n\tu64 pl2_ssp;\n\tu64 pl3_ssp;\n\tu64 u_cet;\n\tu8 reserved_0xc8[2];\n\tu8 vmpl;\n\tu8 cpl;\n\tu8 reserved_0xcc[4];\n\tu64 efer;\n\tu8 reserved_0xd8[104];\n\tu64 xss;\n\tu64 cr4;\n\tu64 cr3;\n\tu64 cr0;\n\tu64 dr7;\n\tu64 dr6;\n\tu64 rflags;\n\tu64 rip;\n\tu64 dr0;\n\tu64 dr1;\n\tu64 dr2;\n\tu64 dr3;\n\tu64 dr0_addr_mask;\n\tu64 dr1_addr_mask;\n\tu64 dr2_addr_mask;\n\tu64 dr3_addr_mask;\n\tu8 reserved_0x1c0[24];\n\tu64 rsp;\n\tu64 s_cet;\n\tu64 ssp;\n\tu64 isst_addr;\n\tu64 rax;\n\tu64 star;\n\tu64 lstar;\n\tu64 cstar;\n\tu64 sfmask;\n\tu64 kernel_gs_base;\n\tu64 sysenter_cs;\n\tu64 sysenter_esp;\n\tu64 sysenter_eip;\n\tu64 cr2;\n\tu8 reserved_0x248[32];\n\tu64 g_pat;\n\tu64 dbgctl;\n\tu64 br_from;\n\tu64 br_to;\n\tu64 last_excp_from;\n\tu64 last_excp_to;\n\tu8 reserved_0x298[80];\n\tu32 pkru;\n\tu32 tsc_aux;\n\tu8 reserved_0x2f0[24];\n\tu64 rcx;\n\tu64 rdx;\n\tu64 rbx;\n\tu64 reserved_0x320;\n\tu64 rbp;\n\tu64 rsi;\n\tu64 rdi;\n\tu64 r8;\n\tu64 r9;\n\tu64 r10;\n\tu64 r11;\n\tu64 r12;\n\tu64 r13;\n\tu64 r14;\n\tu64 r15;\n\tu8 reserved_0x380[16];\n\tu64 guest_exit_info_1;\n\tu64 guest_exit_info_2;\n\tu64 guest_exit_int_info;\n\tu64 guest_nrip;\n\tu64 sev_features;\n\tu64 vintr_ctrl;\n\tu64 guest_exit_code;\n\tu64 virtual_tom;\n\tu64 tlb_id;\n\tu64 pcpu_id;\n\tu64 event_inj;\n\tu64 xcr0;\n\tu8 reserved_0x3f0[16];\n\tu64 x87_dp;\n\tu32 mxcsr;\n\tu16 x87_ftw;\n\tu16 x87_fsw;\n\tu16 x87_fcw;\n\tu16 x87_fop;\n\tu16 x87_ds;\n\tu16 x87_cs;\n\tu64 x87_rip;\n\tu8 fpreg_x87[80];\n\tu8 fpreg_xmm[256];\n\tu8 fpreg_ymm[256];\n};\n\nstruct sev_guest_platform_data {\n\tu64 secrets_gpa;\n};\n\nstruct severity {\n\tu64 mask;\n\tu64 result;\n\tunsigned char sev;\n\tshort unsigned int mcgmask;\n\tshort unsigned int mcgres;\n\tunsigned char ser;\n\tunsigned char context;\n\tunsigned char excp;\n\tunsigned char covered;\n\tunsigned int cpu_vfm;\n\tunsigned char cpu_minstepping;\n\tunsigned char bank_lo;\n\tunsigned char bank_hi;\n\tchar *msg;\n};\n\nstruct sfp;\n\nstruct sfp_socket_ops;\n\nstruct sfp_quirk;\n\nstruct sfp_upstream_ops;\n\nstruct sfp_bus {\n\tstruct kref kref;\n\tstruct list_head node;\n\tconst struct fwnode_handle *fwnode;\n\tconst struct sfp_socket_ops *socket_ops;\n\tstruct device *sfp_dev;\n\tstruct sfp *sfp;\n\tconst struct sfp_quirk *sfp_quirk;\n\tconst struct sfp_upstream_ops *upstream_ops;\n\tvoid *upstream;\n\tstruct phy_device *phydev;\n\tbool registered;\n\tbool started;\n};\n\nstruct sfp_eeprom_base {\n\tu8 phys_id;\n\tu8 phys_ext_id;\n\tu8 connector;\n\tu8 if_1x_copper_passive: 1;\n\tu8 if_1x_copper_active: 1;\n\tu8 if_1x_lx: 1;\n\tu8 if_1x_sx: 1;\n\tu8 e10g_base_sr: 1;\n\tu8 e10g_base_lr: 1;\n\tu8 e10g_base_lrm: 1;\n\tu8 e10g_base_er: 1;\n\tu8 sonet_oc3_short_reach: 1;\n\tu8 sonet_oc3_smf_intermediate_reach: 1;\n\tu8 sonet_oc3_smf_long_reach: 1;\n\tu8 unallocated_5_3: 1;\n\tu8 sonet_oc12_short_reach: 1;\n\tu8 sonet_oc12_smf_intermediate_reach: 1;\n\tu8 sonet_oc12_smf_long_reach: 1;\n\tu8 unallocated_5_7: 1;\n\tu8 sonet_oc48_short_reach: 1;\n\tu8 sonet_oc48_intermediate_reach: 1;\n\tu8 sonet_oc48_long_reach: 1;\n\tu8 sonet_reach_bit2: 1;\n\tu8 sonet_reach_bit1: 1;\n\tu8 sonet_oc192_short_reach: 1;\n\tu8 escon_smf_1310_laser: 1;\n\tu8 escon_mmf_1310_led: 1;\n\tu8 e1000_base_sx: 1;\n\tu8 e1000_base_lx: 1;\n\tu8 e1000_base_cx: 1;\n\tu8 e1000_base_t: 1;\n\tu8 e100_base_lx: 1;\n\tu8 e100_base_fx: 1;\n\tu8 e_base_bx10: 1;\n\tu8 e_base_px: 1;\n\tu8 fc_tech_electrical_inter_enclosure: 1;\n\tu8 fc_tech_lc: 1;\n\tu8 fc_tech_sa: 1;\n\tu8 fc_ll_m: 1;\n\tu8 fc_ll_l: 1;\n\tu8 fc_ll_i: 1;\n\tu8 fc_ll_s: 1;\n\tu8 fc_ll_v: 1;\n\tu8 unallocated_8_0: 1;\n\tu8 unallocated_8_1: 1;\n\tu8 sfp_ct_passive: 1;\n\tu8 sfp_ct_active: 1;\n\tu8 fc_tech_ll: 1;\n\tu8 fc_tech_sl: 1;\n\tu8 fc_tech_sn: 1;\n\tu8 fc_tech_electrical_intra_enclosure: 1;\n\tu8 fc_media_sm: 1;\n\tu8 unallocated_9_1: 1;\n\tu8 fc_media_m5: 1;\n\tu8 fc_media_m6: 1;\n\tu8 fc_media_tv: 1;\n\tu8 fc_media_mi: 1;\n\tu8 fc_media_tp: 1;\n\tu8 fc_media_tw: 1;\n\tu8 fc_speed_100: 1;\n\tu8 unallocated_10_1: 1;\n\tu8 fc_speed_200: 1;\n\tu8 fc_speed_3200: 1;\n\tu8 fc_speed_400: 1;\n\tu8 fc_speed_1600: 1;\n\tu8 fc_speed_800: 1;\n\tu8 fc_speed_1200: 1;\n\tu8 encoding;\n\tu8 br_nominal;\n\tu8 rate_id;\n\tu8 link_len[6];\n\tchar vendor_name[16];\n\tu8 extended_cc;\n\tchar vendor_oui[3];\n\tchar vendor_pn[16];\n\tchar vendor_rev[4];\n\tunion {\n\t\t__be16 optical_wavelength;\n\t\t__be16 cable_compliance;\n\t\tstruct {\n\t\t\tu8 sff8431_app_e: 1;\n\t\t\tu8 fc_pi_4_app_h: 1;\n\t\t\tu8 reserved60_2: 6;\n\t\t\tu8 reserved61: 8;\n\t\t} passive;\n\t\tstruct {\n\t\t\tu8 sff8431_app_e: 1;\n\t\t\tu8 fc_pi_4_app_h: 1;\n\t\t\tu8 sff8431_lim: 1;\n\t\t\tu8 fc_pi_4_lim: 1;\n\t\t\tu8 reserved60_4: 4;\n\t\t\tu8 reserved61: 8;\n\t\t} active;\n\t};\n\tu8 reserved62;\n\tu8 cc_base;\n};\n\nstruct sfp_eeprom_ext {\n\t__be16 options;\n\tu8 br_max;\n\tu8 br_min;\n\tchar vendor_sn[16];\n\tchar datecode[8];\n\tu8 diagmon;\n\tu8 enhopts;\n\tu8 sff8472_compliance;\n\tu8 cc_ext;\n};\n\nstruct sfp_eeprom_id {\n\tstruct sfp_eeprom_base base;\n\tstruct sfp_eeprom_ext ext;\n};\n\nstruct sfp_quirk {\n\tconst char *vendor;\n\tconst char *part;\n\tvoid (*modes)(const struct sfp_eeprom_id *, long unsigned int *, long unsigned int *);\n\tvoid (*fixup)(struct sfp *);\n};\n\nstruct sfp_socket_ops {\n\tvoid (*attach)(struct sfp *);\n\tvoid (*detach)(struct sfp *);\n\tvoid (*start)(struct sfp *);\n\tvoid (*stop)(struct sfp *);\n\tvoid (*set_signal_rate)(struct sfp *, unsigned int);\n\tint (*module_info)(struct sfp *, struct ethtool_modinfo *);\n\tint (*module_eeprom)(struct sfp *, struct ethtool_eeprom *, u8 *);\n\tint (*module_eeprom_by_page)(struct sfp *, const struct ethtool_module_eeprom *, struct netlink_ext_ack *);\n};\n\nstruct sfp_upstream_ops {\n\tvoid (*attach)(void *, struct sfp_bus *);\n\tvoid (*detach)(void *, struct sfp_bus *);\n\tint (*module_insert)(void *, const struct sfp_eeprom_id *);\n\tvoid (*module_remove)(void *);\n\tint (*module_start)(void *);\n\tvoid (*module_stop)(void *);\n\tvoid (*link_down)(void *);\n\tvoid (*link_up)(void *);\n\tint (*connect_phy)(void *, struct phy_device *);\n\tvoid (*disconnect_phy)(void *);\n};\n\nstruct sg {\n\tstruct ext4_group_info info;\n\text4_grpblk_t counters[18];\n};\n\nstruct sg_append_table {\n\tstruct sg_table sgt;\n\tstruct scatterlist *prv;\n\tunsigned int total_nents;\n};\n\nstruct sg_device {\n\tstruct scsi_device *device;\n\twait_queue_head_t open_wait;\n\tstruct mutex open_rel_lock;\n\tint sg_tablesize;\n\tu32 index;\n\tstruct list_head sfds;\n\trwlock_t sfd_lock;\n\tatomic_t detaching;\n\tbool exclude;\n\tint open_cnt;\n\tchar sgdebug;\n\tchar name[32];\n\tstruct cdev *cdev;\n\tstruct kref d_ref;\n};\n\ntypedef struct sg_device Sg_device;\n\nstruct sg_page_iter {\n\tstruct scatterlist *sg;\n\tunsigned int sg_pgoffset;\n\tunsigned int __nents;\n\tint __pg_advance;\n};\n\nstruct sg_dma_page_iter {\n\tstruct sg_page_iter base;\n};\n\nstruct sg_scatter_hold {\n\tshort unsigned int k_use_sg;\n\tunsigned int sglist_len;\n\tunsigned int bufflen;\n\tstruct page **pages;\n\tint page_order;\n\tchar dio_in_use;\n\tunsigned char cmd_opcode;\n};\n\ntypedef struct sg_scatter_hold Sg_scatter_hold;\n\nstruct sg_io_hdr {\n\tint interface_id;\n\tint dxfer_direction;\n\tunsigned char cmd_len;\n\tunsigned char mx_sb_len;\n\tshort unsigned int iovec_count;\n\tunsigned int dxfer_len;\n\tvoid *dxferp;\n\tunsigned char *cmdp;\n\tvoid *sbp;\n\tunsigned int timeout;\n\tunsigned int flags;\n\tint pack_id;\n\tvoid *usr_ptr;\n\tunsigned char status;\n\tunsigned char masked_status;\n\tunsigned char msg_status;\n\tunsigned char sb_len_wr;\n\tshort unsigned int host_status;\n\tshort unsigned int driver_status;\n\tint resid;\n\tunsigned int duration;\n\tunsigned int info;\n};\n\ntypedef struct sg_io_hdr sg_io_hdr_t;\n\nstruct sg_fd;\n\nstruct sg_request {\n\tstruct list_head entry;\n\tstruct sg_fd *parentfp;\n\tSg_scatter_hold data;\n\tsg_io_hdr_t header;\n\tunsigned char sense_b[96];\n\tchar res_used;\n\tchar orphan;\n\tchar sg_io_owned;\n\tchar done;\n\tstruct request *rq;\n\tstruct bio *bio;\n\tstruct execute_work ew;\n};\n\ntypedef struct sg_request Sg_request;\n\nstruct sg_fd {\n\tstruct list_head sfd_siblings;\n\tstruct sg_device *parentdp;\n\twait_queue_head_t read_wait;\n\trwlock_t rq_list_lock;\n\tstruct mutex f_mutex;\n\tint timeout;\n\tint timeout_user;\n\tSg_scatter_hold reserve;\n\tstruct list_head rq_list;\n\tstruct fasync_struct *async_qp;\n\tSg_request req_arr[16];\n\tchar force_packid;\n\tchar cmd_q;\n\tunsigned char next_cmd_len;\n\tchar keep_orphan;\n\tchar mmap_called;\n\tchar res_in_use;\n\tstruct kref f_ref;\n\tstruct execute_work ew;\n};\n\ntypedef struct sg_fd Sg_fd;\n\nstruct sg_header {\n\tint pack_len;\n\tint reply_len;\n\tint pack_id;\n\tint result;\n\tunsigned int twelve_byte: 1;\n\tunsigned int target_status: 5;\n\tunsigned int host_status: 8;\n\tunsigned int driver_status: 8;\n\tunsigned int other_flags: 10;\n\tunsigned char sense_buffer[16];\n};\n\nstruct sg_io_v4 {\n\t__s32 guard;\n\t__u32 protocol;\n\t__u32 subprotocol;\n\t__u32 request_len;\n\t__u64 request;\n\t__u64 request_tag;\n\t__u32 request_attr;\n\t__u32 request_priority;\n\t__u32 request_extra;\n\t__u32 max_response_len;\n\t__u64 response;\n\t__u32 dout_iovec_count;\n\t__u32 dout_xfer_len;\n\t__u32 din_iovec_count;\n\t__u32 din_xfer_len;\n\t__u64 dout_xferp;\n\t__u64 din_xferp;\n\t__u32 timeout;\n\t__u32 flags;\n\t__u64 usr_ptr;\n\t__u32 spare_in;\n\t__u32 driver_status;\n\t__u32 transport_status;\n\t__u32 device_status;\n\t__u32 retry_delay;\n\t__u32 info;\n\t__u32 duration;\n\t__u32 response_len;\n\t__s32 din_resid;\n\t__s32 dout_resid;\n\t__u64 generated_tag;\n\t__u32 spare_out;\n\t__u32 padding;\n};\n\nstruct sg_list {\n\tunsigned int n;\n\tunsigned int size;\n\tsize_t len;\n\tstruct scatterlist *sg;\n};\n\nstruct sg_mapping_iter {\n\tstruct page *page;\n\tvoid *addr;\n\tsize_t length;\n\tsize_t consumed;\n\tstruct sg_page_iter piter;\n\tunsigned int __offset;\n\tunsigned int __remaining;\n\tunsigned int __flags;\n};\n\nstruct sg_pool {\n\tsize_t size;\n\tchar *name;\n\tstruct kmem_cache *slab;\n\tmempool_t *pool;\n};\n\nstruct sg_proc_deviter {\n\tloff_t index;\n\tsize_t max;\n};\n\nstruct sg_req_info {\n\tchar req_state;\n\tchar orphan;\n\tchar sg_io_owned;\n\tchar problem;\n\tint pack_id;\n\tvoid *usr_ptr;\n\tunsigned int duration;\n\tint unused;\n};\n\ntypedef struct sg_req_info sg_req_info_t;\n\nstruct sg_scsi_id {\n\tint host_no;\n\tint channel;\n\tint scsi_id;\n\tint lun;\n\tint scsi_type;\n\tshort int h_cmd_per_lun;\n\tshort int d_queue_depth;\n\tint unused[2];\n};\n\ntypedef struct sg_scsi_id sg_scsi_id_t;\n\nstruct sgi_volume {\n\ts8 name[8];\n\t__be32 block_num;\n\t__be32 num_bytes;\n};\n\nstruct sgi_partition {\n\t__be32 num_blocks;\n\t__be32 first_block;\n\t__be32 type;\n};\n\nstruct sgi_disklabel {\n\t__be32 magic_mushroom;\n\t__be16 root_part_num;\n\t__be16 swap_part_num;\n\ts8 boot_file[16];\n\tu8 _unused0[48];\n\tstruct sgi_volume volume[15];\n\tstruct sgi_partition partitions[16];\n\t__be32 csum;\n\t__be32 _unused1;\n};\n\nstruct sgx_backing {\n\tstruct page *contents;\n\tstruct page *pcmd;\n\tlong unsigned int pcmd_offset;\n};\n\nstruct sgx_epc_page;\n\nstruct sgx_encl;\n\nstruct sgx_va_page;\n\nstruct sgx_encl_page {\n\tlong unsigned int desc;\n\tlong unsigned int vm_max_prot_bits: 8;\n\tenum sgx_page_type type: 16;\n\tstruct sgx_epc_page *epc_page;\n\tstruct sgx_encl *encl;\n\tstruct sgx_va_page *va_page;\n};\n\nstruct sgx_encl {\n\tlong unsigned int base;\n\tlong unsigned int size;\n\tlong unsigned int flags;\n\tunsigned int page_cnt;\n\tunsigned int secs_child_cnt;\n\tstruct mutex lock;\n\tstruct xarray page_array;\n\tstruct sgx_encl_page secs;\n\tlong unsigned int attributes;\n\tlong unsigned int attributes_mask;\n\tcpumask_t cpumask;\n\tstruct file *backing;\n\tstruct kref refcount;\n\tstruct list_head va_pages;\n\tlong unsigned int mm_list_version;\n\tstruct list_head mm_list;\n\tspinlock_t mm_lock;\n\tstruct srcu_struct srcu;\n};\n\nstruct sgx_encl_mm {\n\tstruct sgx_encl *encl;\n\tstruct mm_struct *mm;\n\tstruct list_head list;\n\tstruct mmu_notifier mmu_notifier;\n};\n\nstruct sgx_enclave_add_pages {\n\t__u64 src;\n\t__u64 offset;\n\t__u64 length;\n\t__u64 secinfo;\n\t__u64 flags;\n\t__u64 count;\n};\n\nstruct sgx_enclave_create {\n\t__u64 src;\n};\n\nstruct sgx_enclave_init {\n\t__u64 sigstruct;\n};\n\nstruct sgx_enclave_modify_types {\n\t__u64 offset;\n\t__u64 length;\n\t__u64 page_type;\n\t__u64 result;\n\t__u64 count;\n};\n\nstruct sgx_enclave_provision {\n\t__u64 fd;\n};\n\nstruct sgx_enclave_remove_pages {\n\t__u64 offset;\n\t__u64 length;\n\t__u64 count;\n};\n\nstruct sgx_enclave_restrict_permissions {\n\t__u64 offset;\n\t__u64 length;\n\t__u64 permissions;\n\t__u64 result;\n\t__u64 count;\n};\n\nstruct sgx_epc_page {\n\tunsigned int section;\n\tu16 flags;\n\tu16 poison;\n\tstruct sgx_encl_page *owner;\n\tstruct list_head list;\n};\n\nstruct sgx_numa_node;\n\nstruct sgx_epc_section {\n\tlong unsigned int phys_addr;\n\tvoid *virt_addr;\n\tstruct sgx_epc_page *pages;\n\tstruct sgx_numa_node *node;\n};\n\nstruct sgx_numa_node {\n\tstruct list_head free_page_list;\n\tstruct list_head sgx_poison_page_list;\n\tlong unsigned int size;\n\tspinlock_t lock;\n};\n\nstruct sgx_pageinfo {\n\tu64 addr;\n\tu64 contents;\n\tu64 metadata;\n\tu64 secs;\n};\n\nstruct sgx_secinfo {\n\tu64 flags;\n\tu8 reserved[56];\n};\n\nstruct sgx_secs {\n\tu64 size;\n\tu64 base;\n\tu32 ssa_frame_size;\n\tu32 miscselect;\n\tu8 reserved1[24];\n\tu64 attributes;\n\tu64 xfrm;\n\tu32 mrenclave[8];\n\tu8 reserved2[32];\n\tu32 mrsigner[8];\n\tu8 reserved3[32];\n\tu32 config_id[16];\n\tu16 isv_prod_id;\n\tu16 isv_svn;\n\tu16 config_svn;\n\tu8 reserved4[3834];\n};\n\nstruct sgx_sigstruct_header {\n\tu64 header1[2];\n\tu32 vendor;\n\tu32 date;\n\tu64 header2[2];\n\tu32 swdefined;\n\tu8 reserved1[84];\n};\n\nstruct sgx_sigstruct_body {\n\tu32 miscselect;\n\tu32 misc_mask;\n\tu8 reserved2[20];\n\tu64 attributes;\n\tu64 xfrm;\n\tu64 attributes_mask;\n\tu64 xfrm_mask;\n\tu8 mrenclave[32];\n\tu8 reserved3[32];\n\tu16 isvprodid;\n\tu16 isvsvn;\n} __attribute__((packed));\n\nstruct sgx_sigstruct {\n\tstruct sgx_sigstruct_header header;\n\tu8 modulus[384];\n\tu32 exponent;\n\tu8 signature[384];\n\tstruct sgx_sigstruct_body body;\n\tu8 reserved4[12];\n\tu8 q1[384];\n\tu8 q2[384];\n};\n\nstruct sgx_va_page {\n\tstruct sgx_epc_page *epc_page;\n\tlong unsigned int slots[8];\n\tstruct list_head list;\n};\n\nstruct sgx_vepc {\n\tstruct xarray page_array;\n\tstruct mutex lock;\n};\n\nstruct sha1_hash {\n\tu8 hash[20];\n};\n\nstruct sha1_state {\n\tu32 state[5];\n\tu64 count;\n\tu8 buffer[64];\n};\n\nstruct sha256_state {\n\tu32 state[8];\n\tu64 count;\n\tu8 buf[64];\n};\n\nstruct sha3_state {\n\tu64 st[25];\n\tunsigned int rsiz;\n\tunsigned int rsizw;\n\tunsigned int partial;\n\tu8 buf[144];\n};\n\nstruct sha512_state {\n\tu64 state[8];\n\tu64 count[2];\n\tu8 buf[128];\n};\n\nstruct vcpu_info {\n\tuint8_t evtchn_upcall_pending;\n\tuint8_t evtchn_upcall_mask;\n\txen_ulong_t evtchn_pending_sel;\n\tstruct arch_vcpu_info arch;\n\tstruct pvclock_vcpu_time_info time;\n};\n\nstruct shared_info {\n\tstruct vcpu_info vcpu_info[32];\n\txen_ulong_t evtchn_pending[64];\n\txen_ulong_t evtchn_mask[64];\n\tstruct pvclock_wall_clock wc;\n\tuint32_t wc_sec_hi;\n\tstruct arch_shared_info arch;\n};\n\nstruct shared_policy {\n\tstruct rb_root root;\n\trwlock_t lock;\n};\n\nstruct shash_alg {\n\tint (*init)(struct shash_desc *);\n\tint (*update)(struct shash_desc *, const u8 *, unsigned int);\n\tint (*final)(struct shash_desc *, u8 *);\n\tint (*finup)(struct shash_desc *, const u8 *, unsigned int, u8 *);\n\tint (*digest)(struct shash_desc *, const u8 *, unsigned int, u8 *);\n\tint (*export)(struct shash_desc *, void *);\n\tint (*import)(struct shash_desc *, const void *);\n\tint (*setkey)(struct crypto_shash *, const u8 *, unsigned int);\n\tint (*init_tfm)(struct crypto_shash *);\n\tvoid (*exit_tfm)(struct crypto_shash *);\n\tint (*clone_tfm)(struct crypto_shash *, struct crypto_shash *);\n\tunsigned int descsize;\n\tunion {\n\t\tstruct {\n\t\t\tunsigned int digestsize;\n\t\t\tunsigned int statesize;\n\t\t\tstruct crypto_alg base;\n\t\t};\n\t\tstruct hash_alg_common halg;\n\t};\n};\n\nstruct shash_instance {\n\tvoid (*free)(struct shash_instance *);\n\tunion {\n\t\tstruct {\n\t\t\tchar head[104];\n\t\t\tstruct crypto_instance base;\n\t\t} s;\n\t\tstruct shash_alg alg;\n\t};\n};\n\nstruct shift_out_of_bounds_data {\n\tstruct source_location location;\n\tstruct type_descriptor *lhs_type;\n\tstruct type_descriptor *rhs_type;\n};\n\nstruct shm_file_data {\n\tint id;\n\tstruct ipc_namespace *ns;\n\tstruct file *file;\n\tconst struct vm_operations_struct *vm_ops;\n};\n\nstruct shm_info {\n\tint used_ids;\n\t__kernel_ulong_t shm_tot;\n\t__kernel_ulong_t shm_rss;\n\t__kernel_ulong_t shm_swp;\n\t__kernel_ulong_t swap_attempts;\n\t__kernel_ulong_t swap_successes;\n};\n\nstruct shmem_falloc {\n\twait_queue_head_t *waitq;\n\tlong unsigned int start;\n\tlong unsigned int next;\n\tlong unsigned int nr_falloced;\n\tlong unsigned int nr_unswapped;\n};\n\nstruct shmem_inode_info {\n\tspinlock_t lock;\n\tunsigned int seals;\n\tlong unsigned int flags;\n\tlong unsigned int alloced;\n\tlong unsigned int swapped;\n\tunion {\n\t\tstruct offset_ctx dir_offsets;\n\t\tstruct {\n\t\t\tstruct list_head shrinklist;\n\t\t\tstruct list_head swaplist;\n\t\t};\n\t};\n\tstruct timespec64 i_crtime;\n\tstruct shared_policy policy;\n\tstruct simple_xattrs xattrs;\n\tlong unsigned int fallocend;\n\tunsigned int fsflags;\n\tatomic_t stop_eviction;\n\tstruct dquot *i_dquot[3];\n\tstruct inode vfs_inode;\n};\n\nstruct shmem_quota_limits {\n\tqsize_t usrquota_bhardlimit;\n\tqsize_t usrquota_ihardlimit;\n\tqsize_t grpquota_bhardlimit;\n\tqsize_t grpquota_ihardlimit;\n};\n\nstruct shmem_options {\n\tlong long unsigned int blocks;\n\tlong long unsigned int inodes;\n\tstruct mempolicy *mpol;\n\tkuid_t uid;\n\tkgid_t gid;\n\tumode_t mode;\n\tbool full_inums;\n\tint huge;\n\tint seen;\n\tbool noswap;\n\tshort unsigned int quota_types;\n\tstruct shmem_quota_limits qlimits;\n};\n\nstruct shmem_sb_info {\n\tlong unsigned int max_blocks;\n\tstruct percpu_counter used_blocks;\n\tlong unsigned int max_inodes;\n\tlong unsigned int free_ispace;\n\traw_spinlock_t stat_lock;\n\tumode_t mode;\n\tunsigned char huge;\n\tkuid_t uid;\n\tkgid_t gid;\n\tbool full_inums;\n\tbool noswap;\n\tino_t next_ino;\n\tino_t *ino_batch;\n\tstruct mempolicy *mpol;\n\tspinlock_t shrinklist_lock;\n\tstruct list_head shrinklist;\n\tlong unsigned int shrinklist_len;\n\tstruct shmem_quota_limits qlimits;\n};\n\nstruct shmid64_ds {\n\tstruct ipc64_perm shm_perm;\n\t__kernel_size_t shm_segsz;\n\tlong int shm_atime;\n\tlong int shm_dtime;\n\tlong int shm_ctime;\n\t__kernel_pid_t shm_cpid;\n\t__kernel_pid_t shm_lpid;\n\tlong unsigned int shm_nattch;\n\tlong unsigned int __unused4;\n\tlong unsigned int __unused5;\n};\n\nstruct shmid_ds {\n\tstruct ipc_perm shm_perm;\n\tint shm_segsz;\n\t__kernel_old_time_t shm_atime;\n\t__kernel_old_time_t shm_dtime;\n\t__kernel_old_time_t shm_ctime;\n\t__kernel_ipc_pid_t shm_cpid;\n\t__kernel_ipc_pid_t shm_lpid;\n\tshort unsigned int shm_nattch;\n\tshort unsigned int shm_unused;\n\tvoid *shm_unused2;\n\tvoid *shm_unused3;\n};\n\nstruct shmid_kernel {\n\tstruct kern_ipc_perm shm_perm;\n\tstruct file *shm_file;\n\tlong unsigned int shm_nattch;\n\tlong unsigned int shm_segsz;\n\ttime64_t shm_atim;\n\ttime64_t shm_dtim;\n\ttime64_t shm_ctim;\n\tstruct pid *shm_cprid;\n\tstruct pid *shm_lprid;\n\tstruct ucounts *mlock_ucounts;\n\tstruct task_struct *shm_creator;\n\tstruct list_head shm_clist;\n\tstruct ipc_namespace *ns;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct shminfo {\n\tint shmmax;\n\tint shmmin;\n\tint shmmni;\n\tint shmseg;\n\tint shmall;\n};\n\nstruct shminfo64 {\n\tlong unsigned int shmmax;\n\tlong unsigned int shmmin;\n\tlong unsigned int shmmni;\n\tlong unsigned int shmseg;\n\tlong unsigned int shmall;\n\tlong unsigned int __unused1;\n\tlong unsigned int __unused2;\n\tlong unsigned int __unused3;\n\tlong unsigned int __unused4;\n};\n\nstruct shortname_info {\n\tunsigned char lower: 1;\n\tunsigned char upper: 1;\n\tunsigned char valid: 1;\n};\n\nstruct show_busy_params {\n\tstruct seq_file *m;\n\tstruct blk_mq_hw_ctx *hctx;\n};\n\nstruct shrink_control {\n\tgfp_t gfp_mask;\n\tint nid;\n\tlong unsigned int nr_to_scan;\n\tlong unsigned int nr_scanned;\n\tstruct mem_cgroup *memcg;\n};\n\nstruct shrinker {\n\tlong unsigned int (*count_objects)(struct shrinker *, struct shrink_control *);\n\tlong unsigned int (*scan_objects)(struct shrinker *, struct shrink_control *);\n\tlong int batch;\n\tint seeks;\n\tunsigned int flags;\n\trefcount_t refcount;\n\tstruct completion done;\n\tstruct callback_head rcu;\n\tvoid *private_data;\n\tstruct list_head list;\n\tint id;\n\tatomic_long_t *nr_deferred;\n};\n\nstruct shrinker_info_unit;\n\nstruct shrinker_info {\n\tstruct callback_head rcu;\n\tint map_nr_max;\n\tstruct shrinker_info_unit *unit[0];\n};\n\nstruct shrinker_info_unit {\n\tatomic_long_t nr_deferred[64];\n\tlong unsigned int map[1];\n};\n\nstruct shutdown_handler {\n\tconst char command[11];\n\tbool flag;\n\tvoid (*cb)(void);\n};\n\nstruct sidtab_node_inner;\n\nstruct sidtab_node_leaf;\n\nunion sidtab_entry_inner {\n\tstruct sidtab_node_inner *ptr_inner;\n\tstruct sidtab_node_leaf *ptr_leaf;\n};\n\nstruct sidtab_str_cache;\n\nstruct sidtab_entry {\n\tu32 sid;\n\tu32 hash;\n\tstruct context___2 context;\n\tstruct sidtab_str_cache *cache;\n\tstruct hlist_node list;\n};\n\nstruct sidtab_isid_entry {\n\tint set;\n\tstruct sidtab_entry entry;\n};\n\nstruct sidtab {\n\tunion sidtab_entry_inner roots[4];\n\tu32 count;\n\tstruct sidtab_convert_params *convert;\n\tbool frozen;\n\tspinlock_t lock;\n\tu32 cache_free_slots;\n\tstruct list_head cache_lru_list;\n\tspinlock_t cache_lock;\n\tstruct sidtab_isid_entry isids[27];\n\tstruct hlist_head context_to_sid[512];\n};\n\nstruct sidtab_node_inner {\n\tunion sidtab_entry_inner entries[512];\n};\n\nstruct sidtab_node_leaf {\n\tstruct sidtab_entry entries[39];\n};\n\nstruct sidtab_str_cache {\n\tstruct callback_head rcu_member;\n\tstruct list_head lru_member;\n\tstruct sidtab_entry *parent;\n\tu32 len;\n\tchar str[0];\n};\n\ntypedef struct sigevent sigevent_t;\n\nstruct sigframe_ia32 {\n\tu32 pretcode;\n\tint sig;\n\tstruct sigcontext_32 sc;\n\tstruct _fpstate_32 fpstate_unused;\n\tunsigned int extramask[1];\n\tchar retcode[8];\n};\n\nstruct sighand_struct {\n\tspinlock_t siglock;\n\trefcount_t count;\n\twait_queue_head_t signalfd_wqh;\n\tstruct k_sigaction action[64];\n};\n\nstruct sigpending {\n\tstruct list_head list;\n\tsigset_t signal;\n};\n\nstruct task_cputime_atomic {\n\tatomic64_t utime;\n\tatomic64_t stime;\n\tatomic64_t sum_exec_runtime;\n};\n\nstruct thread_group_cputimer {\n\tstruct task_cputime_atomic cputime_atomic;\n};\n\nstruct task_io_accounting {\n\tu64 rchar;\n\tu64 wchar;\n\tu64 syscr;\n\tu64 syscw;\n\tu64 read_bytes;\n\tu64 write_bytes;\n\tu64 cancelled_write_bytes;\n};\n\nstruct taskstats;\n\nstruct tty_audit_buf;\n\nstruct signal_struct {\n\trefcount_t sigcnt;\n\tatomic_t live;\n\tint nr_threads;\n\tint quick_threads;\n\tstruct list_head thread_head;\n\twait_queue_head_t wait_chldexit;\n\tstruct task_struct *curr_target;\n\tstruct sigpending shared_pending;\n\tstruct hlist_head multiprocess;\n\tint group_exit_code;\n\tint notify_count;\n\tstruct task_struct *group_exec_task;\n\tint group_stop_count;\n\tunsigned int flags;\n\tstruct core_state *core_state;\n\tunsigned int is_child_subreaper: 1;\n\tunsigned int has_child_subreaper: 1;\n\tunsigned int next_posix_timer_id;\n\tstruct list_head posix_timers;\n\tstruct hrtimer real_timer;\n\tktime_t it_real_incr;\n\tstruct cpu_itimer it[2];\n\tstruct thread_group_cputimer cputimer;\n\tstruct posix_cputimers posix_cputimers;\n\tstruct pid *pids[4];\n\tatomic_t tick_dep_mask;\n\tstruct pid *tty_old_pgrp;\n\tint leader;\n\tstruct tty_struct *tty;\n\tstruct autogroup *autogroup;\n\tseqlock_t stats_lock;\n\tu64 utime;\n\tu64 stime;\n\tu64 cutime;\n\tu64 cstime;\n\tu64 gtime;\n\tu64 cgtime;\n\tstruct prev_cputime prev_cputime;\n\tlong unsigned int nvcsw;\n\tlong unsigned int nivcsw;\n\tlong unsigned int cnvcsw;\n\tlong unsigned int cnivcsw;\n\tlong unsigned int min_flt;\n\tlong unsigned int maj_flt;\n\tlong unsigned int cmin_flt;\n\tlong unsigned int cmaj_flt;\n\tlong unsigned int inblock;\n\tlong unsigned int oublock;\n\tlong unsigned int cinblock;\n\tlong unsigned int coublock;\n\tlong unsigned int maxrss;\n\tlong unsigned int cmaxrss;\n\tstruct task_io_accounting ioac;\n\tlong long unsigned int sum_sched_runtime;\n\tstruct rlimit rlim[16];\n\tstruct pacct_struct pacct;\n\tstruct taskstats *stats;\n\tunsigned int audit_tty;\n\tstruct tty_audit_buf *tty_audit_buf;\n\tbool oom_flag_origin;\n\tshort int oom_score_adj;\n\tshort int oom_score_adj_min;\n\tstruct mm_struct *oom_mm;\n\tstruct mutex cred_guard_mutex;\n\tstruct rw_semaphore exec_update_lock;\n};\n\nstruct signalfd_ctx {\n\tsigset_t sigmask;\n};\n\nstruct signalfd_siginfo {\n\t__u32 ssi_signo;\n\t__s32 ssi_errno;\n\t__s32 ssi_code;\n\t__u32 ssi_pid;\n\t__u32 ssi_uid;\n\t__s32 ssi_fd;\n\t__u32 ssi_tid;\n\t__u32 ssi_band;\n\t__u32 ssi_overrun;\n\t__u32 ssi_trapno;\n\t__s32 ssi_status;\n\t__s32 ssi_int;\n\t__u64 ssi_ptr;\n\t__u64 ssi_utime;\n\t__u64 ssi_stime;\n\t__u64 ssi_addr;\n\t__u16 ssi_addr_lsb;\n\t__u16 __pad2;\n\t__s32 ssi_syscall;\n\t__u64 ssi_call_addr;\n\t__u32 ssi_arch;\n\t__u8 __pad[28];\n};\n\nstruct signature_hdr {\n\tuint8_t version;\n\tuint32_t timestamp;\n\tuint8_t algo;\n\tuint8_t hash;\n\tuint8_t keyid[8];\n\tuint8_t nmpi;\n\tchar mpi[0];\n} __attribute__((packed));\n\nstruct signature_v2_hdr {\n\tuint8_t type;\n\tuint8_t version;\n\tuint8_t hash_algo;\n\t__be32 keyid;\n\t__be16 sig_size;\n\tuint8_t sig[0];\n} __attribute__((packed));\n\nstruct sigpool_entry {\n\tstruct crypto_ahash *hash;\n\tconst char *alg;\n\tstruct kref kref;\n\tuint16_t needs_key: 1;\n\tuint16_t reserved: 15;\n};\n\nstruct sigpool_scratch {\n\tlocal_lock_t bh_lock;\n\tvoid *pad;\n};\n\nstruct sigqueue {\n\tstruct list_head list;\n\tint flags;\n\tkernel_siginfo_t info;\n\tstruct ucounts *ucounts;\n};\n\nstruct sigset_argpack {\n\tsigset_t *p;\n\tsize_t size;\n};\n\nstruct sih_irq_data {\n\tu8 isr_offset;\n\tu8 imr_offset;\n};\n\nstruct sih {\n\tchar name[8];\n\tu8 module;\n\tu8 control_offset;\n\tbool set_cor;\n\tu8 bits;\n\tu8 bytes_ixr;\n\tu8 edr_offset;\n\tu8 bytes_edr;\n\tu8 irq_lines;\n\tstruct sih_irq_data mask[2];\n};\n\nstruct sih_agent {\n\tint irq_base;\n\tconst struct sih *sih;\n\tu32 imr;\n\tbool imr_change_pending;\n\tu32 edge_change;\n\tstruct mutex irq_lock;\n\tchar *irq_name;\n};\n\nstruct simple_attr {\n\tint (*get)(void *, u64 *);\n\tint (*set)(void *, u64);\n\tchar get_buf[24];\n\tchar set_buf[24];\n\tvoid *data;\n\tconst char *fmt;\n\tstruct mutex mutex;\n};\n\nstruct simple_transaction_argresp {\n\tssize_t size;\n\tchar data[0];\n};\n\nstruct simple_xattr {\n\tstruct rb_node rb_node;\n\tchar *name;\n\tsize_t size;\n\tchar value[0];\n};\n\nstruct simpledrm_device {\n\tstruct drm_device dev;\n\tstruct drm_display_mode mode;\n\tconst struct drm_format_info *format;\n\tunsigned int pitch;\n\tstruct iosys_map screen_base;\n\tuint32_t formats[8];\n\tsize_t nformats;\n\tstruct drm_plane primary_plane;\n\tstruct drm_crtc crtc;\n\tstruct drm_encoder encoder;\n\tstruct drm_connector connector;\n};\n\nstruct simplefb_format {\n\tconst char *name;\n\tu32 bits_per_pixel;\n\tstruct fb_bitfield red;\n\tstruct fb_bitfield green;\n\tstruct fb_bitfield blue;\n\tstruct fb_bitfield transp;\n\tu32 fourcc;\n};\n\nstruct simplefb_platform_data {\n\tu32 width;\n\tu32 height;\n\tu32 stride;\n\tconst char *format;\n};\n\nstruct sinit_mle_data {\n\tu32 version;\n\tstruct sha1_hash bios_acm_id;\n\tu32 edx_senter_flags;\n\tu64 mseg_valid;\n\tstruct sha1_hash sinit_hash;\n\tstruct sha1_hash mle_hash;\n\tstruct sha1_hash stm_hash;\n\tstruct sha1_hash lcp_policy_hash;\n\tu32 lcp_policy_control;\n\tu32 rlp_wakeup_addr;\n\tu32 reserved;\n\tu32 num_mdrs;\n\tu32 mdrs_off;\n\tu32 num_vtd_dmars;\n\tu32 vtd_dmars_off;\n} __attribute__((packed));\n\nstruct sioc_mif_req6 {\n\tmifi_t mifi;\n\tlong unsigned int icount;\n\tlong unsigned int ocount;\n\tlong unsigned int ibytes;\n\tlong unsigned int obytes;\n};\n\nstruct sioc_sg_req {\n\tstruct in_addr src;\n\tstruct in_addr grp;\n\tlong unsigned int pktcnt;\n\tlong unsigned int bytecnt;\n\tlong unsigned int wrong_if;\n};\n\nstruct sioc_sg_req6 {\n\tstruct sockaddr_in6 src;\n\tstruct sockaddr_in6 grp;\n\tlong unsigned int pktcnt;\n\tlong unsigned int bytecnt;\n\tlong unsigned int wrong_if;\n};\n\nstruct sioc_vif_req {\n\tvifi_t vifi;\n\tlong unsigned int icount;\n\tlong unsigned int ocount;\n\tlong unsigned int ibytes;\n\tlong unsigned int obytes;\n};\n\nstruct sis_chipset {\n\tu16 device;\n\tconst struct ata_port_info *info;\n};\n\nstruct sis_laptop {\n\tu16 device;\n\tu16 subvendor;\n\tu16 subdevice;\n};\n\nstruct zs_size_stat {\n\tlong unsigned int objs[14];\n};\n\nstruct size_class {\n\tspinlock_t lock;\n\tstruct list_head fullness_list[12];\n\tint size;\n\tint objs_per_zspage;\n\tint pages_per_zspage;\n\tunsigned int index;\n\tstruct zs_size_stat stats;\n};\n\nstruct sk_buff__safe_rcu_or_null {\n\tstruct sock *sk;\n};\n\nstruct sk_buff_fclones {\n\tstruct sk_buff skb1;\n\tstruct sk_buff skb2;\n\trefcount_t fclone_ref;\n};\n\nstruct sk_filter {\n\trefcount_t refcnt;\n\tstruct callback_head rcu;\n\tstruct bpf_prog *prog;\n};\n\nstruct sk_psock_work_state {\n\tu32 len;\n\tu32 off;\n};\n\nstruct sk_psock {\n\tstruct sock *sk;\n\tstruct sock *sk_redir;\n\tu32 apply_bytes;\n\tu32 cork_bytes;\n\tu32 eval;\n\tbool redir_ingress;\n\tstruct sk_msg *cork;\n\tstruct sk_psock_progs progs;\n\tstruct strparser strp;\n\tstruct sk_buff_head ingress_skb;\n\tstruct list_head ingress_msg;\n\tspinlock_t ingress_lock;\n\tlong unsigned int state;\n\tstruct list_head link;\n\tspinlock_t link_lock;\n\trefcount_t refcnt;\n\tvoid (*saved_unhash)(struct sock *);\n\tvoid (*saved_destroy)(struct sock *);\n\tvoid (*saved_close)(struct sock *, long int);\n\tvoid (*saved_write_space)(struct sock *);\n\tvoid (*saved_data_ready)(struct sock *);\n\tint (*psock_update_sk_prot)(struct sock *, struct sk_psock *, bool);\n\tstruct proto *sk_proto;\n\tstruct mutex work_mutex;\n\tstruct sk_psock_work_state work_state;\n\tstruct delayed_work work;\n\tstruct sock *sk_pair;\n\tstruct rcu_work rwork;\n};\n\nstruct sk_psock_link {\n\tstruct list_head list;\n\tstruct bpf_map *map;\n\tvoid *link_raw;\n};\n\nstruct sk_security_struct {\n\tenum {\n\t\tNLBL_UNSET = 0,\n\t\tNLBL_REQUIRE = 1,\n\t\tNLBL_LABELED = 2,\n\t\tNLBL_REQSKB = 3,\n\t\tNLBL_CONNLABELED = 4,\n\t} nlbl_state;\n\tstruct netlbl_lsm_secattr *nlbl_secattr;\n\tu32 sid;\n\tu32 peer_sid;\n\tu16 sclass;\n\tenum {\n\t\tSCTP_ASSOC_UNSET = 0,\n\t\tSCTP_ASSOC_SET = 1,\n\t} sctp_assoc_state;\n};\n\nstruct tls_msg {\n\tu8 control;\n};\n\nstruct sk_skb_cb {\n\tunsigned char data[20];\n\tunsigned char pad[4];\n\tstruct _strp_msg strp;\n\tstruct tls_msg tls;\n\tu64 temp_reg;\n};\n\nstruct skb_checksum_ops {\n\t__wsum (*update)(const void *, int, __wsum);\n\t__wsum (*combine)(__wsum, __wsum, int, int);\n};\n\nstruct skb_ext {\n\trefcount_t refcnt;\n\tu8 offset[4];\n\tu8 chunks;\n\tlong: 0;\n\tchar data[0];\n};\n\nstruct skb_frag {\n\tnetmem_ref netmem;\n\tunsigned int len;\n\tunsigned int offset;\n};\n\ntypedef struct skb_frag skb_frag_t;\n\nstruct skb_free_array {\n\tunsigned int skb_count;\n\tvoid *skb_array[16];\n};\n\nstruct skb_gso_cb {\n\tunion {\n\t\tint mac_offset;\n\t\tint data_offset;\n\t};\n\tint encap_level;\n\t__wsum csum;\n\t__u16 csum_start;\n};\n\nstruct skb_seq_state {\n\t__u32 lower_offset;\n\t__u32 upper_offset;\n\t__u32 frag_idx;\n\t__u32 stepped_offset;\n\tstruct sk_buff *root_skb;\n\tstruct sk_buff *cur_skb;\n\t__u8 *frag_data;\n\t__u32 frag_off;\n};\n\nstruct skb_shared_hwtstamps {\n\tunion {\n\t\tktime_t hwtstamp;\n\t\tvoid *netdev_data;\n\t};\n};\n\nstruct xsk_tx_metadata_compl {\n\t__u64 *tx_timestamp;\n};\n\nstruct skb_shared_info {\n\t__u8 flags;\n\t__u8 meta_len;\n\t__u8 nr_frags;\n\t__u8 tx_flags;\n\tshort unsigned int gso_size;\n\tshort unsigned int gso_segs;\n\tstruct sk_buff *frag_list;\n\tunion {\n\t\tstruct skb_shared_hwtstamps hwtstamps;\n\t\tstruct xsk_tx_metadata_compl xsk_meta;\n\t};\n\tunsigned int gso_type;\n\tu32 tskey;\n\tatomic_t dataref;\n\tunsigned int xdp_frags_size;\n\tvoid *destructor_arg;\n\tskb_frag_t frags[17];\n};\n\nstruct skcipher_alg {\n\tint (*setkey)(struct crypto_skcipher *, const u8 *, unsigned int);\n\tint (*encrypt)(struct skcipher_request *);\n\tint (*decrypt)(struct skcipher_request *);\n\tint (*export)(struct skcipher_request *, void *);\n\tint (*import)(struct skcipher_request *, const void *);\n\tint (*init)(struct crypto_skcipher *);\n\tvoid (*exit)(struct crypto_skcipher *);\n\tunsigned int walksize;\n\tunion {\n\t\tstruct {\n\t\t\tunsigned int min_keysize;\n\t\t\tunsigned int max_keysize;\n\t\t\tunsigned int ivsize;\n\t\t\tunsigned int chunksize;\n\t\t\tunsigned int statesize;\n\t\t\tstruct crypto_alg base;\n\t\t};\n\t\tstruct skcipher_alg_common co;\n\t};\n};\n\nstruct skcipher_ctx_simple {\n\tstruct crypto_cipher *cipher;\n};\n\nstruct skcipher_instance {\n\tvoid (*free)(struct skcipher_instance *);\n\tunion {\n\t\tstruct {\n\t\t\tchar head[88];\n\t\t\tstruct crypto_instance base;\n\t\t} s;\n\t\tstruct skcipher_alg alg;\n\t};\n};\n\nstruct skcipher_walk {\n\tunion {\n\t\tstruct {\n\t\t\tstruct page *page;\n\t\t\tlong unsigned int offset;\n\t\t} phys;\n\t\tstruct {\n\t\t\tu8 *page;\n\t\t\tvoid *addr;\n\t\t} virt;\n\t} src;\n\tunion {\n\t\tstruct {\n\t\t\tstruct page *page;\n\t\t\tlong unsigned int offset;\n\t\t} phys;\n\t\tstruct {\n\t\t\tu8 *page;\n\t\t\tvoid *addr;\n\t\t} virt;\n\t} dst;\n\tstruct scatter_walk in;\n\tunsigned int nbytes;\n\tstruct scatter_walk out;\n\tunsigned int total;\n\tstruct list_head buffers;\n\tu8 *page;\n\tu8 *buffer;\n\tu8 *oiv;\n\tvoid *iv;\n\tunsigned int ivsize;\n\tint flags;\n\tunsigned int blocksize;\n\tunsigned int stride;\n\tunsigned int alignmask;\n};\n\nstruct skcipher_walk_buffer {\n\tstruct list_head entry;\n\tstruct scatter_walk dst;\n\tunsigned int len;\n\tu8 *data;\n\tu8 buffer[0];\n};\n\nstruct sku_microcode {\n\tu32 vfm;\n\tu8 stepping;\n\tu32 microcode;\n};\n\nstruct slab {\n\tlong unsigned int __page_flags;\n\tstruct kmem_cache *slab_cache;\n\tunion {\n\t\tstruct {\n\t\t\tunion {\n\t\t\t\tstruct list_head slab_list;\n\t\t\t\tstruct {\n\t\t\t\t\tstruct slab *next;\n\t\t\t\t\tint slabs;\n\t\t\t\t};\n\t\t\t};\n\t\t\tunion {\n\t\t\t\tstruct {\n\t\t\t\t\tvoid *freelist;\n\t\t\t\t\tunion {\n\t\t\t\t\t\tlong unsigned int counters;\n\t\t\t\t\t\tstruct {\n\t\t\t\t\t\t\tunsigned int inuse: 16;\n\t\t\t\t\t\t\tunsigned int objects: 15;\n\t\t\t\t\t\t\tunsigned int frozen: 1;\n\t\t\t\t\t\t};\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t\tfreelist_aba_t freelist_counter;\n\t\t\t};\n\t\t};\n\t\tstruct callback_head callback_head;\n\t};\n\tunsigned int __page_type;\n\tatomic_t __page_refcount;\n\tlong unsigned int obj_exts;\n};\n\nstruct slab_attribute {\n\tstruct attribute attr;\n\tssize_t (*show)(struct kmem_cache *, char *);\n\tssize_t (*store)(struct kmem_cache *, const char *, size_t);\n};\n\nstruct slabinfo {\n\tlong unsigned int active_objs;\n\tlong unsigned int num_objs;\n\tlong unsigned int active_slabs;\n\tlong unsigned int num_slabs;\n\tlong unsigned int shared_avail;\n\tunsigned int limit;\n\tunsigned int batchcount;\n\tunsigned int shared;\n\tunsigned int objects_per_slab;\n\tunsigned int cache_order;\n};\n\nstruct slcompress {\n\tstruct cstate *tstate;\n\tstruct cstate *rstate;\n\tbyte_t tslot_limit;\n\tbyte_t rslot_limit;\n\tbyte_t xmit_oldest;\n\tbyte_t xmit_current;\n\tbyte_t recv_current;\n\tbyte_t flags;\n\tint32 sls_o_nontcp;\n\tint32 sls_o_tcp;\n\tint32 sls_o_uncompressed;\n\tint32 sls_o_compressed;\n\tint32 sls_o_searches;\n\tint32 sls_o_misses;\n\tint32 sls_i_uncompressed;\n\tint32 sls_i_compressed;\n\tint32 sls_i_error;\n\tint32 sls_i_tossed;\n\tint32 sls_i_runt;\n\tint32 sls_i_badcheck;\n};\n\nstruct slice {\n\t__be32 nblocks;\n\t__be32 blkoff;\n};\n\nstruct slot___2 {\n\tu8 number;\n\tunsigned int devfn;\n\tstruct pci_bus *bus;\n\tstruct pci_dev *dev;\n\tunsigned int latch_status: 1;\n\tunsigned int adapter_status: 1;\n\tunsigned int extracting;\n\tstruct hotplug_slot hotplug_slot;\n\tstruct list_head slot_list;\n};\n\nstruct slot___3 {\n\tu8 bus;\n\tu8 device;\n\tu16 status;\n\tu32 number;\n\tu8 is_a_board;\n\tu8 state;\n\tu8 attention_save;\n\tu8 presence_save;\n\tu8 latch_save;\n\tu8 pwr_save;\n\tstruct controller___2 *ctrl;\n\tconst struct hpc_ops *hpc_ops;\n\tstruct hotplug_slot hotplug_slot;\n\tstruct list_head slot_list;\n\tstruct delayed_work work;\n\tstruct mutex lock;\n\tstruct workqueue_struct *wq;\n\tu8 hp_slot;\n};\n\nstruct slot {\n\tstruct hotplug_slot hotplug_slot;\n\tstruct acpiphp_slot *acpi_slot;\n\tunsigned int sun;\n};\n\nstruct slub_flush_work {\n\tstruct work_struct work;\n\tstruct kmem_cache *s;\n\tbool skip;\n};\n\nstruct smack_audit_data {\n\tconst char *function;\n\tchar *subject;\n\tchar *object;\n\tchar *request;\n\tint result;\n};\n\nstruct smack_known {\n\tstruct list_head list;\n\tstruct hlist_node smk_hashed;\n\tchar *smk_known;\n\tu32 smk_secid;\n\tstruct netlbl_lsm_secattr smk_netlabel;\n\tstruct list_head smk_rules;\n\tstruct mutex smk_rules_lock;\n};\n\nstruct smack_known_list_elem {\n\tstruct list_head list;\n\tstruct smack_known *smk_label;\n};\n\nstruct smack_mnt_opts {\n\tbool initialized;\n\tconst char *fsdefault;\n\tconst char *fsfloor;\n\tconst char *fshat;\n\tconst char *fsroot;\n\tconst char *fstransmute;\n};\n\nstruct smack_parsed_rule {\n\tstruct smack_known *smk_subject;\n\tstruct smack_known *smk_object;\n\tint smk_access1;\n\tint smk_access2;\n};\n\nstruct smack_rule {\n\tstruct list_head list;\n\tstruct smack_known *smk_subject;\n\tstruct smack_known *smk_object;\n\tint smk_access;\n};\n\nstruct smca_hwid;\n\nstruct smca_bank {\n\tconst struct smca_hwid *hwid;\n\tu32 id;\n\tu8 sysfs_id;\n};\n\nstruct smca_hwid {\n\tunsigned int bank_type;\n\tu32 hwid_mcatype;\n};\n\nstruct sme_populate_pgd_data {\n\tvoid *pgtable_area;\n\tpgd_t *pgd;\n\tpmdval_t pmd_flags;\n\tpteval_t pte_flags;\n\tlong unsigned int paddr;\n\tlong unsigned int vaddr;\n\tlong unsigned int vaddr_end;\n};\n\nstruct smk_audit_info {\n\tstruct common_audit_data a;\n\tstruct smack_audit_data sad;\n};\n\nstruct smk_net4addr {\n\tstruct list_head list;\n\tstruct in_addr smk_host;\n\tstruct in_addr smk_mask;\n\tint smk_masks;\n\tstruct smack_known *smk_label;\n};\n\nstruct smk_net6addr {\n\tstruct list_head list;\n\tstruct in6_addr smk_host;\n\tstruct in6_addr smk_mask;\n\tint smk_masks;\n\tstruct smack_known *smk_label;\n};\n\nstruct smp_alt_module {\n\tstruct module *mod;\n\tchar *name;\n\tconst s32 *locks;\n\tconst s32 *locks_end;\n\tu8 *text;\n\tu8 *text_end;\n\tstruct list_head next;\n};\n\nstruct smp_call_on_cpu_struct {\n\tstruct work_struct work;\n\tstruct completion done;\n\tint (*func)(void *);\n\tvoid *data;\n\tint ret;\n\tint cpu;\n};\n\nstruct smp_hotplug_thread {\n\tstruct task_struct **store;\n\tstruct list_head list;\n\tint (*thread_should_run)(unsigned int);\n\tvoid (*thread_fn)(unsigned int);\n\tvoid (*create)(unsigned int);\n\tvoid (*setup)(unsigned int);\n\tvoid (*cleanup)(unsigned int, bool);\n\tvoid (*park)(unsigned int);\n\tvoid (*unpark)(unsigned int);\n\tbool selfparking;\n\tconst char *thread_comm;\n};\n\nstruct smp_ops {\n\tvoid (*smp_prepare_boot_cpu)(void);\n\tvoid (*smp_prepare_cpus)(unsigned int);\n\tvoid (*smp_cpus_done)(unsigned int);\n\tvoid (*stop_other_cpus)(int);\n\tvoid (*crash_stop_other_cpus)(void);\n\tvoid (*smp_send_reschedule)(int);\n\tvoid (*cleanup_dead_cpu)(unsigned int);\n\tvoid (*poll_sync_state)(void);\n\tint (*kick_ap_alive)(unsigned int, struct task_struct *);\n\tint (*cpu_disable)(void);\n\tvoid (*cpu_die)(unsigned int);\n\tvoid (*play_dead)(void);\n\tvoid (*stop_this_cpu)(void);\n\tvoid (*send_call_func_ipi)(const struct cpumask *);\n\tvoid (*send_call_func_single_ipi)(int);\n};\n\nstruct smpboot_thread_data {\n\tunsigned int cpu;\n\tunsigned int status;\n\tstruct smp_hotplug_thread *ht;\n};\n\nstruct snapshot_context {\n\tstruct tracing_map_elt *elt;\n\tvoid *key;\n};\n\nstruct snapshot_handle {\n\tunsigned int cur;\n\tvoid *buffer;\n\tint sync_read;\n};\n\nstruct snapshot_data {\n\tstruct snapshot_handle handle;\n\tint swap;\n\tint mode;\n\tbool frozen;\n\tbool ready;\n\tbool platform_support;\n\tbool free_bitmaps;\n\tdev_t dev;\n};\n\nstruct snmp_mib {\n\tconst char *name;\n\tint entry;\n};\n\nstruct snp_cpuid_fn {\n\tu32 eax_in;\n\tu32 ecx_in;\n\tu64 xcr0_in;\n\tu64 xss_in;\n\tu32 eax;\n\tu32 ebx;\n\tu32 ecx;\n\tu32 edx;\n\tu64 __reserved;\n};\n\nstruct snp_cpuid_table {\n\tu32 count;\n\tu32 __reserved1;\n\tu64 __reserved2;\n\tstruct snp_cpuid_fn fn[64];\n};\n\nstruct snp_guest_request_ioctl {\n\t__u8 msg_version;\n\t__u64 req_data;\n\t__u64 resp_data;\n\tunion {\n\t\t__u64 exitinfo2;\n\t\tstruct {\n\t\t\t__u32 fw_error;\n\t\t\t__u32 vmm_error;\n\t\t};\n\t};\n};\n\nstruct snp_psc_desc {\n\tstruct psc_hdr hdr;\n\tstruct psc_entry entries[64];\n};\n\nstruct snp_req_data {\n\tlong unsigned int req_gpa;\n\tlong unsigned int resp_gpa;\n\tlong unsigned int data_gpa;\n\tunsigned int data_npages;\n};\n\nstruct snp_secrets_page {\n\tu32 version;\n\tu32 imien: 1;\n\tu32 rsvd1: 31;\n\tu32 fms;\n\tu32 rsvd2;\n\tu8 gosvw[16];\n\tu8 vmpck0[32];\n\tu8 vmpck1[32];\n\tu8 vmpck2[32];\n\tu8 vmpck3[32];\n\tstruct secrets_os_area os_area;\n\tu8 vmsa_tweak_bitmap[64];\n\tu64 svsm_base;\n\tu64 svsm_size;\n\tu64 svsm_caa;\n\tu32 svsm_max_version;\n\tu8 svsm_guest_vmpl;\n\tu8 rsvd3[3];\n\tu8 rsvd4[3744];\n};\n\nstruct so_timestamping {\n\tint flags;\n\tint bind_phc;\n};\n\nstruct soc_device_attribute;\n\nstruct soc_device {\n\tstruct device dev;\n\tstruct soc_device_attribute *attr;\n\tint soc_dev_num;\n};\n\nstruct soc_device_attribute {\n\tconst char *machine;\n\tconst char *family;\n\tconst char *revision;\n\tconst char *serial_number;\n\tconst char *soc_id;\n\tconst void *data;\n\tconst struct attribute_group *custom_attr_group;\n};\n\nstruct sock_bh_locked {\n\tstruct sock *sock;\n\tlocal_lock_t bh_lock;\n};\n\nstruct sock_diag_handler {\n\tstruct module *owner;\n\t__u8 family;\n\tint (*dump)(struct sk_buff *, struct nlmsghdr *);\n\tint (*get_info)(struct sk_buff *, struct sock *);\n\tint (*destroy)(struct sk_buff *, struct nlmsghdr *);\n};\n\nstruct sock_diag_inet_compat {\n\tstruct module *owner;\n\tint (*fn)(struct sk_buff *, struct nlmsghdr *);\n};\n\nstruct sock_diag_req {\n\t__u8 sdiag_family;\n\t__u8 sdiag_protocol;\n};\n\nstruct sock_ee_data_rfc4884 {\n\t__u16 len;\n\t__u8 flags;\n\t__u8 reserved;\n};\n\nstruct sock_extended_err {\n\t__u32 ee_errno;\n\t__u8 ee_origin;\n\t__u8 ee_type;\n\t__u8 ee_code;\n\t__u8 ee_pad;\n\t__u32 ee_info;\n\tunion {\n\t\t__u32 ee_data;\n\t\tstruct sock_ee_data_rfc4884 ee_rfc4884;\n\t};\n};\n\nstruct sock_exterr_skb {\n\tunion {\n\t\tstruct inet_skb_parm h4;\n\t\tstruct inet6_skb_parm h6;\n\t} header;\n\tstruct sock_extended_err ee;\n\tu16 addr_offset;\n\t__be16 port;\n\tu8 opt_stats: 1;\n\tu8 unused: 7;\n};\n\nstruct sock_fprog {\n\tshort unsigned int len;\n\tstruct sock_filter *filter;\n};\n\nstruct sock_fprog32 {\n\tshort unsigned int len;\n\tcompat_caddr_t filter;\n};\n\nstruct sock_fprog_kern {\n\tu16 len;\n\tstruct sock_filter *filter;\n};\n\nstruct sock_hash_seq_info {\n\tstruct bpf_map *map;\n\tstruct bpf_shtab *htab;\n\tu32 bucket_id;\n};\n\nstruct sock_map_seq_info {\n\tstruct bpf_map *map;\n\tstruct sock *sk;\n\tu32 index;\n};\n\nstruct sock_reuseport {\n\tstruct callback_head rcu;\n\tu16 max_socks;\n\tu16 num_socks;\n\tu16 num_closed_socks;\n\tu16 incoming_cpu;\n\tunsigned int synq_overflow_ts;\n\tunsigned int reuseport_id;\n\tunsigned int bind_inany: 1;\n\tunsigned int has_conns: 1;\n\tstruct bpf_prog *prog;\n\tstruct sock *socks[0];\n};\n\nstruct sock_skb_cb {\n\tu32 dropcount;\n};\n\nstruct sock_txtime {\n\t__kernel_clockid_t clockid;\n\t__u32 flags;\n};\n\nstruct sockaddr_mctp {\n\t__kernel_sa_family_t smctp_family;\n\t__u16 __smctp_pad0;\n\tunsigned int smctp_network;\n\tstruct mctp_addr smctp_addr;\n\t__u8 smctp_type;\n\t__u8 smctp_tag;\n\t__u8 __smctp_pad1;\n};\n\nstruct sockaddr_mctp_ext {\n\tstruct sockaddr_mctp smctp_base;\n\tint smctp_ifindex;\n\t__u8 smctp_halen;\n\t__u8 __smctp_pad0[3];\n\t__u8 smctp_haddr[32];\n};\n\nstruct sockaddr_nl {\n\t__kernel_sa_family_t nl_family;\n\tshort unsigned int nl_pad;\n\t__u32 nl_pid;\n\t__u32 nl_groups;\n};\n\nstruct sockaddr_un {\n\t__kernel_sa_family_t sun_family;\n\tchar sun_path[108];\n};\n\nstruct sockaddr_xdp {\n\t__u16 sxdp_family;\n\t__u16 sxdp_flags;\n\t__u32 sxdp_ifindex;\n\t__u32 sxdp_queue_id;\n\t__u32 sxdp_shared_umem_fd;\n};\n\nstruct socket_wq {\n\twait_queue_head_t wait;\n\tstruct fasync_struct *fasync_list;\n\tlong unsigned int flags;\n\tstruct callback_head rcu;\n\tlong: 64;\n};\n\nstruct socket {\n\tsocket_state state;\n\tshort int type;\n\tlong unsigned int flags;\n\tstruct file *file;\n\tstruct sock *sk;\n\tconst struct proto_ops *ops;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tstruct socket_wq wq;\n};\n\nstruct socket__safe_trusted_or_null {\n\tstruct sock *sk;\n};\n\nstruct socket_alloc {\n\tstruct socket socket;\n\tstruct inode vfs_inode;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct socket_smack {\n\tstruct smack_known *smk_out;\n\tstruct smack_known *smk_in;\n\tstruct smack_known *smk_packet;\n\tint smk_state;\n};\n\nstruct sockmap_link {\n\tstruct bpf_link link;\n\tstruct bpf_map *map;\n\tenum bpf_attach_type attach_type;\n};\n\nstruct softirq_action {\n\tvoid (*action)(struct softirq_action *);\n};\n\nstruct softnet_data {\n\tstruct list_head poll_list;\n\tstruct sk_buff_head process_queue;\n\tlocal_lock_t process_queue_bh_lock;\n\tunsigned int processed;\n\tunsigned int time_squeeze;\n\tstruct softnet_data *rps_ipi_list;\n\tunsigned int received_rps;\n\tbool in_net_rx_action;\n\tbool in_napi_threaded_poll;\n\tstruct sd_flow_limit *flow_limit;\n\tstruct Qdisc *output_queue;\n\tstruct Qdisc **output_queue_tailp;\n\tstruct sk_buff *completion_queue;\n\tstruct sk_buff_head xfrm_backlog;\n\tstruct netdev_xmit xmit;\n\tlong: 0;\n\tunsigned int input_queue_head;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tcall_single_data_t csd;\n\tstruct softnet_data *rps_ipi_next;\n\tunsigned int cpu;\n\tunsigned int input_queue_tail;\n\tstruct sk_buff_head input_pkt_queue;\n\tstruct napi_struct backlog;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tatomic_t dropped;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tspinlock_t defer_lock;\n\tint defer_count;\n\tint defer_ipi_scheduled;\n\tstruct sk_buff *defer_list;\n\tlong: 64;\n\tcall_single_data_t defer_csd;\n};\n\nstruct software_node {\n\tconst char *name;\n\tconst struct software_node *parent;\n\tconst struct property_entry *properties;\n};\n\nstruct solaris_x86_slice {\n\t__le16 s_tag;\n\t__le16 s_flag;\n\t__le32 s_start;\n\t__le32 s_size;\n};\n\nstruct solaris_x86_vtoc {\n\tunsigned int v_bootinfo[3];\n\t__le32 v_sanity;\n\t__le32 v_version;\n\tchar v_volume[8];\n\t__le16 v_sectorsz;\n\t__le16 v_nparts;\n\tunsigned int v_reserved[10];\n\tstruct solaris_x86_slice v_slice[16];\n\tunsigned int timestamp[16];\n\tchar v_asciilabel[128];\n};\n\nstruct sp_node {\n\tstruct rb_node nd;\n\tlong unsigned int start;\n\tlong unsigned int end;\n\tstruct mempolicy *policy;\n};\n\nstruct space_resv {\n\t__s16 l_type;\n\t__s16 l_whence;\n\t__s64 l_start;\n\t__s64 l_len;\n\t__s32 l_sysid;\n\t__u32 l_pid;\n\t__s32 l_pad[4];\n};\n\nstruct space_resv_32 {\n\t__s16 l_type;\n\t__s16 l_whence;\n\t__s64 l_start;\n\t__s64 l_len;\n\t__s32 l_sysid;\n\t__u32 l_pid;\n\t__s32 l_pad[4];\n} __attribute__((packed));\n\nstruct speed_down_verdict_arg {\n\tu64 since;\n\tint xfer_ok;\n\tint nr_errors[8];\n};\n\nstruct spi_controller_mem_ops;\n\nstruct spi_controller_mem_caps;\n\nstruct spi_statistics;\n\nstruct spi_controller {\n\tstruct device dev;\n\tstruct list_head list;\n\ts16 bus_num;\n\tu16 num_chipselect;\n\tu16 dma_alignment;\n\tu32 mode_bits;\n\tu32 buswidth_override_bits;\n\tu32 bits_per_word_mask;\n\tu32 min_speed_hz;\n\tu32 max_speed_hz;\n\tu16 flags;\n\tbool devm_allocated;\n\tunion {\n\t\tbool slave;\n\t\tbool target;\n\t};\n\tsize_t (*max_transfer_size)(struct spi_device *);\n\tsize_t (*max_message_size)(struct spi_device *);\n\tstruct mutex io_mutex;\n\tstruct mutex add_lock;\n\tspinlock_t bus_lock_spinlock;\n\tstruct mutex bus_lock_mutex;\n\tbool bus_lock_flag;\n\tint (*setup)(struct spi_device *);\n\tint (*set_cs_timing)(struct spi_device *);\n\tint (*transfer)(struct spi_device *, struct spi_message *);\n\tvoid (*cleanup)(struct spi_device *);\n\tbool (*can_dma)(struct spi_controller *, struct spi_device *, struct spi_transfer *);\n\tstruct device *dma_map_dev;\n\tstruct device *cur_rx_dma_dev;\n\tstruct device *cur_tx_dma_dev;\n\tbool queued;\n\tstruct kthread_worker *kworker;\n\tstruct kthread_work pump_messages;\n\tspinlock_t queue_lock;\n\tstruct list_head queue;\n\tstruct spi_message *cur_msg;\n\tstruct completion cur_msg_completion;\n\tbool cur_msg_incomplete;\n\tbool cur_msg_need_completion;\n\tbool busy;\n\tbool running;\n\tbool rt;\n\tbool auto_runtime_pm;\n\tbool fallback;\n\tbool last_cs_mode_high;\n\ts8 last_cs[16];\n\tu32 last_cs_index_mask: 16;\n\tstruct completion xfer_completion;\n\tsize_t max_dma_len;\n\tint (*optimize_message)(struct spi_message *);\n\tint (*unoptimize_message)(struct spi_message *);\n\tint (*prepare_transfer_hardware)(struct spi_controller *);\n\tint (*transfer_one_message)(struct spi_controller *, struct spi_message *);\n\tint (*unprepare_transfer_hardware)(struct spi_controller *);\n\tint (*prepare_message)(struct spi_controller *, struct spi_message *);\n\tint (*unprepare_message)(struct spi_controller *, struct spi_message *);\n\tunion {\n\t\tint (*slave_abort)(struct spi_controller *);\n\t\tint (*target_abort)(struct spi_controller *);\n\t};\n\tvoid (*set_cs)(struct spi_device *, bool);\n\tint (*transfer_one)(struct spi_controller *, struct spi_device *, struct spi_transfer *);\n\tvoid (*handle_err)(struct spi_controller *, struct spi_message *);\n\tconst struct spi_controller_mem_ops *mem_ops;\n\tconst struct spi_controller_mem_caps *mem_caps;\n\tstruct gpio_desc **cs_gpiods;\n\tbool use_gpio_descriptors;\n\ts8 unused_native_cs;\n\ts8 max_native_cs;\n\tstruct spi_statistics *pcpu_statistics;\n\tstruct dma_chan *dma_tx;\n\tstruct dma_chan *dma_rx;\n\tvoid *dummy_rx;\n\tvoid *dummy_tx;\n\tint (*fw_translate_cs)(struct spi_controller *, unsigned int);\n\tbool ptp_sts_supported;\n\tlong unsigned int irq_flags;\n\tbool queue_empty;\n\tbool must_async;\n\tbool defer_optimize_message;\n};\n\nstruct spi_controller_mem_caps {\n\tbool dtr;\n\tbool ecc;\n};\n\nstruct spi_mem;\n\nstruct spi_mem_op;\n\nstruct spi_mem_dirmap_desc;\n\nstruct spi_controller_mem_ops {\n\tint (*adjust_op_size)(struct spi_mem *, struct spi_mem_op *);\n\tbool (*supports_op)(struct spi_mem *, const struct spi_mem_op *);\n\tint (*exec_op)(struct spi_mem *, const struct spi_mem_op *);\n\tconst char * (*get_name)(struct spi_mem *);\n\tint (*dirmap_create)(struct spi_mem_dirmap_desc *);\n\tvoid (*dirmap_destroy)(struct spi_mem_dirmap_desc *);\n\tssize_t (*dirmap_read)(struct spi_mem_dirmap_desc *, u64, size_t, void *);\n\tssize_t (*dirmap_write)(struct spi_mem_dirmap_desc *, u64, size_t, const void *);\n\tint (*poll_status)(struct spi_mem *, const struct spi_mem_op *, u16, u16, long unsigned int, long unsigned int, long unsigned int);\n};\n\nstruct spi_device {\n\tstruct device dev;\n\tstruct spi_controller *controller;\n\tu32 max_speed_hz;\n\tu8 chip_select[16];\n\tu8 bits_per_word;\n\tbool rt;\n\tu32 mode;\n\tint irq;\n\tvoid *controller_state;\n\tvoid *controller_data;\n\tchar modalias[32];\n\tconst char *driver_override;\n\tstruct gpio_desc *cs_gpiod[16];\n\tstruct spi_delay word_delay;\n\tstruct spi_delay cs_setup;\n\tstruct spi_delay cs_hold;\n\tstruct spi_delay cs_inactive;\n\tstruct spi_statistics *pcpu_statistics;\n\tu32 cs_index_mask: 16;\n};\n\nstruct spi_device_id {\n\tchar name[32];\n\tkernel_ulong_t driver_data;\n};\n\nstruct spi_driver {\n\tconst struct spi_device_id *id_table;\n\tint (*probe)(struct spi_device *);\n\tvoid (*remove)(struct spi_device *);\n\tvoid (*shutdown)(struct spi_device *);\n\tstruct device_driver driver;\n};\n\nstruct spi_mem {\n\tstruct spi_device *spi;\n\tvoid *drvpriv;\n\tconst char *name;\n};\n\nstruct spi_mem_op {\n\tstruct {\n\t\tu8 nbytes;\n\t\tu8 buswidth;\n\t\tu8 dtr: 1;\n\t\tu8 __pad: 7;\n\t\tu16 opcode;\n\t} cmd;\n\tstruct {\n\t\tu8 nbytes;\n\t\tu8 buswidth;\n\t\tu8 dtr: 1;\n\t\tu8 __pad: 7;\n\t\tu64 val;\n\t} addr;\n\tstruct {\n\t\tu8 nbytes;\n\t\tu8 buswidth;\n\t\tu8 dtr: 1;\n\t\tu8 __pad: 7;\n\t} dummy;\n\tstruct {\n\t\tu8 buswidth;\n\t\tu8 dtr: 1;\n\t\tu8 ecc: 1;\n\t\tu8 __pad: 6;\n\t\tenum spi_mem_data_dir dir;\n\t\tunsigned int nbytes;\n\t\tunion {\n\t\t\tvoid *in;\n\t\t\tconst void *out;\n\t\t} buf;\n\t} data;\n};\n\nstruct spi_mem_dirmap_info {\n\tstruct spi_mem_op op_tmpl;\n\tu64 offset;\n\tu64 length;\n};\n\nstruct spi_mem_dirmap_desc {\n\tstruct spi_mem *mem;\n\tstruct spi_mem_dirmap_info info;\n\tunsigned int nodirmap;\n\tvoid *priv;\n};\n\nstruct spi_mem_driver {\n\tstruct spi_driver spidrv;\n\tint (*probe)(struct spi_mem *);\n\tint (*remove)(struct spi_mem *);\n\tvoid (*shutdown)(struct spi_mem *);\n};\n\nstruct spi_replaced_transfers;\n\ntypedef void (*spi_replaced_release_t)(struct spi_controller *, struct spi_message *, struct spi_replaced_transfers *);\n\nstruct spi_replaced_transfers {\n\tspi_replaced_release_t release;\n\tvoid *extradata;\n\tstruct list_head replaced_transfers;\n\tstruct list_head *replaced_after;\n\tsize_t inserted;\n\tstruct spi_transfer inserted_transfers[0];\n};\n\ntypedef void (*spi_res_release_t)(struct spi_controller *, struct spi_message *, void *);\n\nstruct spi_res {\n\tstruct list_head entry;\n\tspi_res_release_t release;\n\tlong long unsigned int data[0];\n};\n\nstruct spi_statistics {\n\tstruct u64_stats_sync syncp;\n\tu64_stats_t messages;\n\tu64_stats_t transfers;\n\tu64_stats_t errors;\n\tu64_stats_t timedout;\n\tu64_stats_t spi_sync;\n\tu64_stats_t spi_sync_immediate;\n\tu64_stats_t spi_async;\n\tu64_stats_t bytes;\n\tu64_stats_t bytes_rx;\n\tu64_stats_t bytes_tx;\n\tu64_stats_t transfer_bytes_histo[17];\n\tu64_stats_t transfers_split_maxsize;\n};\n\nstruct splice_desc {\n\tsize_t total_len;\n\tunsigned int len;\n\tunsigned int flags;\n\tunion {\n\t\tvoid *userptr;\n\t\tstruct file *file;\n\t\tvoid *data;\n\t} u;\n\tvoid (*splice_eof)(struct splice_desc *);\n\tloff_t pos;\n\tloff_t *opos;\n\tsize_t num_spliced;\n\tbool need_wakeup;\n};\n\nstruct splice_pipe_desc {\n\tstruct page **pages;\n\tstruct partial_page *partial;\n\tint nr_pages;\n\tunsigned int nr_pages_max;\n\tconst struct pipe_buf_operations *ops;\n\tvoid (*spd_release)(struct splice_pipe_desc *, unsigned int);\n};\n\nstruct squashfs_base_inode {\n\t__le16 inode_type;\n\t__le16 mode;\n\t__le16 uid;\n\t__le16 guid;\n\t__le32 mtime;\n\t__le32 inode_number;\n};\n\nstruct squashfs_cache_entry;\n\nstruct squashfs_cache {\n\tchar *name;\n\tint entries;\n\tint curr_blk;\n\tint next_blk;\n\tint num_waiters;\n\tint unused;\n\tint block_size;\n\tint pages;\n\tspinlock_t lock;\n\twait_queue_head_t wait_queue;\n\tstruct squashfs_cache_entry *entry;\n};\n\nstruct squashfs_page_actor;\n\nstruct squashfs_cache_entry {\n\tu64 block;\n\tint length;\n\tint refcount;\n\tu64 next_index;\n\tint pending;\n\tint error;\n\tint num_waiters;\n\twait_queue_head_t wait_queue;\n\tstruct squashfs_cache *cache;\n\tvoid **data;\n\tstruct squashfs_page_actor *actor;\n};\n\nstruct squashfs_sb_info;\n\nstruct squashfs_decompressor {\n\tvoid * (*init)(struct squashfs_sb_info *, void *);\n\tvoid * (*comp_opts)(struct squashfs_sb_info *, void *, int);\n\tvoid (*free)(void *);\n\tint (*decompress)(struct squashfs_sb_info *, void *, struct bio *, int, int, struct squashfs_page_actor *);\n\tint id;\n\tchar *name;\n\tint alloc_buffer;\n\tint supported;\n};\n\nstruct squashfs_decompressor_thread_ops {\n\tvoid * (*create)(struct squashfs_sb_info *, void *);\n\tvoid (*destroy)(struct squashfs_sb_info *);\n\tint (*decompress)(struct squashfs_sb_info *, struct bio *, int, int, struct squashfs_page_actor *);\n\tint (*max_decompressors)(void);\n};\n\nstruct squashfs_dev_inode {\n\t__le16 inode_type;\n\t__le16 mode;\n\t__le16 uid;\n\t__le16 guid;\n\t__le32 mtime;\n\t__le32 inode_number;\n\t__le32 nlink;\n\t__le32 rdev;\n};\n\nstruct squashfs_dir_entry {\n\t__le16 offset;\n\t__le16 inode_number;\n\t__le16 type;\n\t__le16 size;\n\tchar name[0];\n};\n\nstruct squashfs_dir_header {\n\t__le32 count;\n\t__le32 start_block;\n\t__le32 inode_number;\n};\n\nstruct squashfs_dir_index {\n\t__le32 index;\n\t__le32 start_block;\n\t__le32 size;\n\tunsigned char name[0];\n};\n\nstruct squashfs_dir_inode {\n\t__le16 inode_type;\n\t__le16 mode;\n\t__le16 uid;\n\t__le16 guid;\n\t__le32 mtime;\n\t__le32 inode_number;\n\t__le32 start_block;\n\t__le32 nlink;\n\t__le16 file_size;\n\t__le16 offset;\n\t__le32 parent_inode;\n};\n\nstruct squashfs_fragment_entry {\n\t__le64 start_block;\n\t__le32 size;\n\tunsigned int unused;\n};\n\nstruct squashfs_ldev_inode {\n\t__le16 inode_type;\n\t__le16 mode;\n\t__le16 uid;\n\t__le16 guid;\n\t__le32 mtime;\n\t__le32 inode_number;\n\t__le32 nlink;\n\t__le32 rdev;\n\t__le32 xattr;\n};\n\nstruct squashfs_symlink_inode {\n\t__le16 inode_type;\n\t__le16 mode;\n\t__le16 uid;\n\t__le16 guid;\n\t__le32 mtime;\n\t__le32 inode_number;\n\t__le32 nlink;\n\t__le32 symlink_size;\n\tchar symlink[0];\n};\n\nstruct squashfs_reg_inode {\n\t__le16 inode_type;\n\t__le16 mode;\n\t__le16 uid;\n\t__le16 guid;\n\t__le32 mtime;\n\t__le32 inode_number;\n\t__le32 start_block;\n\t__le32 fragment;\n\t__le32 offset;\n\t__le32 file_size;\n\t__le16 block_list[0];\n};\n\nstruct squashfs_lreg_inode {\n\t__le16 inode_type;\n\t__le16 mode;\n\t__le16 uid;\n\t__le16 guid;\n\t__le32 mtime;\n\t__le32 inode_number;\n\t__le64 start_block;\n\t__le64 file_size;\n\t__le64 sparse;\n\t__le32 nlink;\n\t__le32 fragment;\n\t__le32 offset;\n\t__le32 xattr;\n\t__le16 block_list[0];\n};\n\nstruct squashfs_ldir_inode {\n\t__le16 inode_type;\n\t__le16 mode;\n\t__le16 uid;\n\t__le16 guid;\n\t__le32 mtime;\n\t__le32 inode_number;\n\t__le32 nlink;\n\t__le32 file_size;\n\t__le32 start_block;\n\t__le32 parent_inode;\n\t__le16 i_count;\n\t__le16 offset;\n\t__le32 xattr;\n\tstruct squashfs_dir_index index[0];\n};\n\nstruct squashfs_ipc_inode {\n\t__le16 inode_type;\n\t__le16 mode;\n\t__le16 uid;\n\t__le16 guid;\n\t__le32 mtime;\n\t__le32 inode_number;\n\t__le32 nlink;\n};\n\nstruct squashfs_lipc_inode {\n\t__le16 inode_type;\n\t__le16 mode;\n\t__le16 uid;\n\t__le16 guid;\n\t__le32 mtime;\n\t__le32 inode_number;\n\t__le32 nlink;\n\t__le32 xattr;\n};\n\nunion squashfs_inode {\n\tstruct squashfs_base_inode base;\n\tstruct squashfs_dev_inode dev;\n\tstruct squashfs_ldev_inode ldev;\n\tstruct squashfs_symlink_inode symlink;\n\tstruct squashfs_reg_inode reg;\n\tstruct squashfs_lreg_inode lreg;\n\tstruct squashfs_dir_inode dir;\n\tstruct squashfs_ldir_inode ldir;\n\tstruct squashfs_ipc_inode ipc;\n\tstruct squashfs_lipc_inode lipc;\n};\n\nstruct squashfs_inode_info {\n\tu64 start;\n\tint offset;\n\tu64 xattr;\n\tunsigned int xattr_size;\n\tint xattr_count;\n\tunion {\n\t\tstruct {\n\t\t\tu64 fragment_block;\n\t\t\tint fragment_size;\n\t\t\tint fragment_offset;\n\t\t\tu64 block_list_start;\n\t\t};\n\t\tstruct {\n\t\t\tu64 dir_idx_start;\n\t\t\tint dir_idx_offset;\n\t\t\tint dir_idx_cnt;\n\t\t\tint parent;\n\t\t};\n\t};\n\tstruct inode vfs_inode;\n};\n\nstruct squashfs_lz4 {\n\tvoid *input;\n\tvoid *output;\n};\n\nstruct squashfs_lzo {\n\tvoid *input;\n\tvoid *output;\n};\n\nstruct squashfs_mount_opts {\n\tenum Opt_errors errors;\n\tconst struct squashfs_decompressor_thread_ops *thread_ops;\n\tint thread_num;\n};\n\nstruct squashfs_page_actor {\n\tunion {\n\t\tvoid **buffer;\n\t\tstruct page **page;\n\t};\n\tvoid *pageaddr;\n\tvoid *tmp_buffer;\n\tvoid * (*squashfs_first_page)(struct squashfs_page_actor *);\n\tvoid * (*squashfs_next_page)(struct squashfs_page_actor *);\n\tvoid (*squashfs_finish_page)(struct squashfs_page_actor *);\n\tstruct page *last_page;\n\tint pages;\n\tint length;\n\tint next_page;\n\tint alloc_buffer;\n\tint returned_pages;\n\tlong unsigned int next_index;\n};\n\nstruct squashfs_sb_info {\n\tconst struct squashfs_decompressor *decompressor;\n\tint devblksize;\n\tint devblksize_log2;\n\tstruct squashfs_cache *block_cache;\n\tstruct squashfs_cache *fragment_cache;\n\tstruct squashfs_cache *read_page;\n\tstruct address_space *cache_mapping;\n\tint next_meta_index;\n\t__le64 *id_table;\n\t__le64 *fragment_index;\n\t__le64 *xattr_id_table;\n\tstruct mutex meta_index_mutex;\n\tstruct meta_index *meta_index;\n\tvoid *stream;\n\t__le64 *inode_lookup_table;\n\tu64 inode_table;\n\tu64 directory_table;\n\tu64 xattr_table;\n\tunsigned int block_size;\n\tshort unsigned int block_log;\n\tlong long int bytes_used;\n\tunsigned int inodes;\n\tunsigned int fragments;\n\tunsigned int xattr_ids;\n\tunsigned int ids;\n\tbool panic_on_errors;\n\tconst struct squashfs_decompressor_thread_ops *thread_ops;\n\tint max_thread_num;\n};\n\nstruct squashfs_stream {\n\tvoid *comp_opts;\n\tstruct list_head strm_list;\n\tstruct mutex mutex;\n\tint avail_decomp;\n\twait_queue_head_t wait;\n};\n\nstruct squashfs_stream___2 {\n\tvoid *stream;\n\tlocal_lock_t lock;\n};\n\nstruct squashfs_stream___3 {\n\tvoid *stream;\n\tstruct mutex mutex;\n};\n\nstruct squashfs_super_block {\n\t__le32 s_magic;\n\t__le32 inodes;\n\t__le32 mkfs_time;\n\t__le32 block_size;\n\t__le32 fragments;\n\t__le16 compression;\n\t__le16 block_log;\n\t__le16 flags;\n\t__le16 no_ids;\n\t__le16 s_major;\n\t__le16 s_minor;\n\t__le64 root_inode;\n\t__le64 bytes_used;\n\t__le64 id_table_start;\n\t__le64 xattr_id_table_start;\n\t__le64 inode_table_start;\n\t__le64 directory_table_start;\n\t__le64 fragment_table_start;\n\t__le64 lookup_table_start;\n};\n\nstruct squashfs_xattr_entry {\n\t__le16 type;\n\t__le16 size;\n\tchar data[0];\n};\n\nstruct squashfs_xattr_id {\n\t__le64 xattr;\n\t__le32 count;\n\t__le32 size;\n};\n\nstruct squashfs_xattr_id_table {\n\t__le64 xattr_table_start;\n\t__le32 xattr_ids;\n\t__le32 unused;\n};\n\nstruct squashfs_xattr_val {\n\t__le32 vsize;\n\tchar value[0];\n};\n\nstruct xz_buf {\n\tconst uint8_t *in;\n\tsize_t in_pos;\n\tsize_t in_size;\n\tuint8_t *out;\n\tsize_t out_pos;\n\tsize_t out_size;\n};\n\nstruct xz_dec;\n\nstruct squashfs_xz {\n\tstruct xz_dec *state;\n\tstruct xz_buf buf;\n};\n\nstruct sr6_tlv {\n\t__u8 type;\n\t__u8 len;\n\t__u8 data[0];\n};\n\nstruct sr6_tlv_hmac {\n\tstruct sr6_tlv tlvhdr;\n\t__u16 reserved;\n\t__be32 hmackeyid;\n\t__u8 hmac[32];\n};\n\nstruct sram_config {\n\tint (*init)(void);\n\tbool map_only_reserved;\n};\n\nstruct sram_partition;\n\nstruct sram_dev {\n\tconst struct sram_config *config;\n\tstruct device *dev;\n\tvoid *virt_base;\n\tbool no_memory_wc;\n\tstruct gen_pool *pool;\n\tstruct sram_partition *partition;\n\tu32 partitions;\n};\n\nstruct sram_partition {\n\tvoid *base;\n\tstruct gen_pool *pool;\n\tstruct bin_attribute battr;\n\tstruct mutex lock;\n\tstruct list_head list;\n};\n\nstruct sram_reserve {\n\tstruct list_head list;\n\tu32 start;\n\tu32 size;\n\tstruct resource res;\n\tbool export;\n\tbool pool;\n\tbool protect_exec;\n\tconst char *label;\n};\n\nstruct srcu_data {\n\tatomic_long_t srcu_lock_count[2];\n\tatomic_long_t srcu_unlock_count[2];\n\tint srcu_nmi_safety;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tspinlock_t lock;\n\tstruct rcu_segcblist srcu_cblist;\n\tlong unsigned int srcu_gp_seq_needed;\n\tlong unsigned int srcu_gp_seq_needed_exp;\n\tbool srcu_cblist_invoking;\n\tstruct timer_list delay_work;\n\tstruct work_struct work;\n\tstruct callback_head srcu_barrier_head;\n\tstruct srcu_node *mynode;\n\tlong unsigned int grpmask;\n\tint cpu;\n\tstruct srcu_struct *ssp;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct srcu_node {\n\tspinlock_t lock;\n\tlong unsigned int srcu_have_cbs[4];\n\tlong unsigned int srcu_data_have_cbs[4];\n\tlong unsigned int srcu_gp_seq_needed_exp;\n\tstruct srcu_node *srcu_parent;\n\tint grplo;\n\tint grphi;\n};\n\nstruct ssb_state {\n\tstruct ssb_state *shared_state;\n\traw_spinlock_t lock;\n\tunsigned int disable_state;\n\tlong unsigned int local_state;\n};\n\nstruct stack_entry {\n\tstruct trace_entry ent;\n\tint size;\n\tlong unsigned int caller[0];\n};\n\nstruct stack_frame {\n\tstruct stack_frame *next_frame;\n\tlong unsigned int return_address;\n};\n\nstruct stack_frame_ia32 {\n\tu32 next_frame;\n\tu32 return_address;\n};\n\nstruct stack_frame_user {\n\tconst void *next_fp;\n\tlong unsigned int ret_addr;\n};\n\nstruct stack_info {\n\tenum stack_type type;\n\tlong unsigned int *begin;\n\tlong unsigned int *end;\n\tlong unsigned int *next_sp;\n};\n\nstruct stack_map_bucket {\n\tstruct pcpu_freelist_node fnode;\n\tu32 hash;\n\tu32 nr;\n\tu64 data[0];\n};\n\nstruct stack_record {\n\tstruct list_head hash_list;\n\tu32 hash;\n\tu32 size;\n\tunion handle_parts handle;\n\trefcount_t count;\n\tunion {\n\t\tlong unsigned int entries[64];\n\t\tstruct {\n\t\t\tstruct list_head free_list;\n\t\t\tlong unsigned int rcu_state;\n\t\t};\n\t};\n};\n\nstruct stacktrace_cookie {\n\tlong unsigned int *store;\n\tunsigned int size;\n\tunsigned int skip;\n\tunsigned int len;\n};\n\nstruct start_info {\n\tchar magic[32];\n\tlong unsigned int nr_pages;\n\tlong unsigned int shared_info;\n\tuint32_t flags;\n\txen_pfn_t store_mfn;\n\tuint32_t store_evtchn;\n\tunion {\n\t\tstruct {\n\t\t\txen_pfn_t mfn;\n\t\t\tuint32_t evtchn;\n\t\t} domU;\n\t\tstruct {\n\t\t\tuint32_t info_off;\n\t\t\tuint32_t info_size;\n\t\t} dom0;\n\t} console;\n\tlong unsigned int pt_base;\n\tlong unsigned int nr_pt_frames;\n\tlong unsigned int mfn_list;\n\tlong unsigned int mod_start;\n\tlong unsigned int mod_len;\n\tint8_t cmd_line[1024];\n\tlong unsigned int first_p2m_pfn;\n\tlong unsigned int nr_p2m_frames;\n};\n\nstruct stashed_operations {\n\tvoid (*put_data)(void *);\n\tint (*init_inode)(struct inode *, void *);\n};\n\nstruct stat {\n\t__kernel_ulong_t st_dev;\n\t__kernel_ulong_t st_ino;\n\t__kernel_ulong_t st_nlink;\n\tunsigned int st_mode;\n\tunsigned int st_uid;\n\tunsigned int st_gid;\n\tunsigned int __pad0;\n\t__kernel_ulong_t st_rdev;\n\t__kernel_long_t st_size;\n\t__kernel_long_t st_blksize;\n\t__kernel_long_t st_blocks;\n\t__kernel_ulong_t st_atime;\n\t__kernel_ulong_t st_atime_nsec;\n\t__kernel_ulong_t st_mtime;\n\t__kernel_ulong_t st_mtime_nsec;\n\t__kernel_ulong_t st_ctime;\n\t__kernel_ulong_t st_ctime_nsec;\n\t__kernel_long_t __unused[3];\n};\n\nstruct stat64 {\n\tlong long unsigned int st_dev;\n\tunsigned char __pad0[4];\n\tunsigned int __st_ino;\n\tunsigned int st_mode;\n\tunsigned int st_nlink;\n\tunsigned int st_uid;\n\tunsigned int st_gid;\n\tlong long unsigned int st_rdev;\n\tunsigned char __pad3[4];\n\tlong long int st_size;\n\tunsigned int st_blksize;\n\tlong long int st_blocks;\n\tunsigned int st_atime;\n\tunsigned int st_atime_nsec;\n\tunsigned int st_mtime;\n\tunsigned int st_mtime_nsec;\n\tunsigned int st_ctime;\n\tunsigned int st_ctime_nsec;\n\tlong long unsigned int st_ino;\n} __attribute__((packed));\n\nstruct stat_node {\n\tstruct rb_node node;\n\tvoid *stat;\n};\n\nstruct stat_session {\n\tstruct list_head session_list;\n\tstruct tracer_stat *ts;\n\tstruct rb_root stat_root;\n\tstruct mutex stat_mutex;\n\tstruct dentry *file;\n};\n\nstruct statfs {\n\t__kernel_long_t f_type;\n\t__kernel_long_t f_bsize;\n\t__kernel_long_t f_blocks;\n\t__kernel_long_t f_bfree;\n\t__kernel_long_t f_bavail;\n\t__kernel_long_t f_files;\n\t__kernel_long_t f_ffree;\n\t__kernel_fsid_t f_fsid;\n\t__kernel_long_t f_namelen;\n\t__kernel_long_t f_frsize;\n\t__kernel_long_t f_flags;\n\t__kernel_long_t f_spare[4];\n};\n\nstruct statfs64 {\n\t__kernel_long_t f_type;\n\t__kernel_long_t f_bsize;\n\t__u64 f_blocks;\n\t__u64 f_bfree;\n\t__u64 f_bavail;\n\t__u64 f_files;\n\t__u64 f_ffree;\n\t__kernel_fsid_t f_fsid;\n\t__kernel_long_t f_namelen;\n\t__kernel_long_t f_frsize;\n\t__kernel_long_t f_flags;\n\t__kernel_long_t f_spare[4];\n};\n\nstruct static_call_mod;\n\nstruct static_call_key {\n\tvoid *func;\n\tunion {\n\t\tlong unsigned int type;\n\t\tstruct static_call_mod *mods;\n\t\tstruct static_call_site *sites;\n\t};\n};\n\nstruct static_call_mod {\n\tstruct static_call_mod *next;\n\tstruct module *mod;\n\tstruct static_call_site *sites;\n};\n\nstruct static_call_site {\n\ts32 addr;\n\ts32 key;\n};\n\nstruct static_call_tramp_key {\n\ts32 tramp;\n\ts32 key;\n};\n\nstruct static_key_deferred {\n\tstruct static_key key;\n\tlong unsigned int timeout;\n\tstruct delayed_work work;\n};\n\nstruct static_key_false_deferred {\n\tstruct static_key_false key;\n\tlong unsigned int timeout;\n\tstruct delayed_work work;\n};\n\nstruct static_key_mod {\n\tstruct static_key_mod *next;\n\tstruct jump_entry *entries;\n\tstruct module *mod;\n};\n\nstruct static_tree_desc_s {\n\tconst ct_data *static_tree;\n\tconst int *extra_bits;\n\tint extra_base;\n\tint elems;\n\tint max_length;\n};\n\nstruct stats_reply_data {\n\tstruct ethnl_reply_data base;\n\tunion {\n\t\tstruct {\n\t\t\tstruct ethtool_eth_phy_stats phy_stats;\n\t\t\tstruct ethtool_eth_mac_stats mac_stats;\n\t\t\tstruct ethtool_eth_ctrl_stats ctrl_stats;\n\t\t\tstruct ethtool_rmon_stats rmon_stats;\n\t\t};\n\t\tstruct {\n\t\t\tstruct ethtool_eth_phy_stats phy_stats;\n\t\t\tstruct ethtool_eth_mac_stats mac_stats;\n\t\t\tstruct ethtool_eth_ctrl_stats ctrl_stats;\n\t\t\tstruct ethtool_rmon_stats rmon_stats;\n\t\t} stats;\n\t};\n\tconst struct ethtool_rmon_hist_range *rmon_ranges;\n};\n\nstruct stats_req_info {\n\tstruct ethnl_req_info base;\n\tlong unsigned int stat_mask[1];\n\tenum ethtool_mac_stats_src src;\n};\n\nstruct statx_timestamp {\n\t__s64 tv_sec;\n\t__u32 tv_nsec;\n\t__s32 __reserved;\n};\n\nstruct statx {\n\t__u32 stx_mask;\n\t__u32 stx_blksize;\n\t__u64 stx_attributes;\n\t__u32 stx_nlink;\n\t__u32 stx_uid;\n\t__u32 stx_gid;\n\t__u16 stx_mode;\n\t__u16 __spare0[1];\n\t__u64 stx_ino;\n\t__u64 stx_size;\n\t__u64 stx_blocks;\n\t__u64 stx_attributes_mask;\n\tstruct statx_timestamp stx_atime;\n\tstruct statx_timestamp stx_btime;\n\tstruct statx_timestamp stx_ctime;\n\tstruct statx_timestamp stx_mtime;\n\t__u32 stx_rdev_major;\n\t__u32 stx_rdev_minor;\n\t__u32 stx_dev_major;\n\t__u32 stx_dev_minor;\n\t__u64 stx_mnt_id;\n\t__u32 stx_dio_mem_align;\n\t__u32 stx_dio_offset_align;\n\t__u64 stx_subvol;\n\t__u32 stx_atomic_write_unit_min;\n\t__u32 stx_atomic_write_unit_max;\n\t__u32 stx_atomic_write_segments_max;\n\t__u32 __spare1[1];\n\t__u64 __spare3[9];\n};\n\nstruct stereo_mandatory_mode {\n\tint width;\n\tint height;\n\tint vrefresh;\n\tunsigned int flags;\n};\n\nstruct stop_event_data {\n\tstruct perf_event *event;\n\tunsigned int restart;\n};\n\nstruct stored_match_addr {\n\tunion {\n\t\tstruct sockaddr addr;\n\t\tstruct sockaddr_in addr4;\n\t\tstruct sockaddr_in6 addr6;\n\t};\n\tint addrlen;\n\tstruct match_addr maddr;\n};\n\nstruct strarray {\n\tchar **array;\n\tsize_t n;\n};\n\nstruct stripe {\n\tstruct dm_dev *dev;\n\tsector_t physical_start;\n\tatomic_t error_count;\n};\n\nstruct stripe_c {\n\tuint32_t stripes;\n\tint stripes_shift;\n\tsector_t stripe_width;\n\tuint32_t chunk_size;\n\tint chunk_size_shift;\n\tstruct dm_target *ti;\n\tstruct work_struct trigger_event;\n\tstruct stripe stripe[0];\n};\n\nstruct strset_info {\n\tbool per_dev;\n\tbool free_strings;\n\tunsigned int count;\n\tconst char (*strings)[32];\n};\n\nstruct strset_reply_data {\n\tstruct ethnl_reply_data base;\n\tstruct strset_info sets[21];\n};\n\nstruct strset_req_info {\n\tstruct ethnl_req_info base;\n\tu32 req_ids;\n\tbool counts_only;\n};\n\nstruct subflow_send_info {\n\tstruct sock *ssk;\n\tu64 linger_time;\n};\n\nstruct subprocess_info {\n\tstruct work_struct work;\n\tstruct completion *complete;\n\tconst char *path;\n\tchar **argv;\n\tchar **envp;\n\tint wait;\n\tint retval;\n\tint (*init)(struct subprocess_info *, struct cred *);\n\tvoid (*cleanup)(struct subprocess_info *);\n\tvoid *data;\n};\n\nstruct subsys_dev_iter {\n\tstruct klist_iter ki;\n\tconst struct device_type *type;\n};\n\nstruct subsys_interface {\n\tconst char *name;\n\tconst struct bus_type *subsys;\n\tstruct list_head node;\n\tint (*add_dev)(struct device *, struct subsys_interface *);\n\tvoid (*remove_dev)(struct device *, struct subsys_interface *);\n};\n\nstruct subsys_private {\n\tstruct kset subsys;\n\tstruct kset *devices_kset;\n\tstruct list_head interfaces;\n\tstruct mutex mutex;\n\tstruct kset *drivers_kset;\n\tstruct klist klist_devices;\n\tstruct klist klist_drivers;\n\tstruct blocking_notifier_head bus_notifier;\n\tunsigned int drivers_autoprobe: 1;\n\tconst struct bus_type *bus;\n\tstruct device *dev_root;\n\tstruct kset glue_dirs;\n\tconst struct class *class;\n\tstruct lock_class_key lock_key;\n};\n\nstruct sugov_policy;\n\nstruct sugov_cpu {\n\tstruct update_util_data update_util;\n\tstruct sugov_policy *sg_policy;\n\tunsigned int cpu;\n\tbool iowait_boost_pending;\n\tunsigned int iowait_boost;\n\tu64 last_update;\n\tlong unsigned int util;\n\tlong unsigned int bw_min;\n\tlong unsigned int saved_idle_calls;\n};\n\nstruct sugov_tunables;\n\nstruct sugov_policy {\n\tstruct cpufreq_policy *policy;\n\tstruct sugov_tunables *tunables;\n\tstruct list_head tunables_hook;\n\traw_spinlock_t update_lock;\n\tu64 last_freq_update_time;\n\ts64 freq_update_delay_ns;\n\tunsigned int next_freq;\n\tunsigned int cached_raw_freq;\n\tstruct irq_work irq_work;\n\tstruct kthread_work work;\n\tstruct mutex work_lock;\n\tstruct kthread_worker worker;\n\tstruct task_struct *thread;\n\tbool work_in_progress;\n\tbool limits_changed;\n\tbool need_freq_update;\n};\n\nstruct sugov_tunables {\n\tstruct gov_attr_set attr_set;\n\tunsigned int rate_limit_us;\n};\n\nstruct summary_data {\n\tstruct seq_file *s;\n\tstruct regulator_dev *parent;\n\tint level;\n};\n\nstruct summary_lock_data {\n\tstruct ww_acquire_ctx *ww_ctx;\n\tstruct regulator_dev **new_contended_rdev;\n\tstruct regulator_dev **old_contended_rdev;\n};\n\nstruct sun_info {\n\t__be16 id;\n\t__be16 flags;\n};\n\nstruct sun_vtoc {\n\t__be32 version;\n\tchar volume[8];\n\t__be16 nparts;\n\tstruct sun_info infos[8];\n\t__be16 padding;\n\t__be32 bootinfo[3];\n\t__be32 sanity;\n\t__be32 reserved[10];\n\t__be32 timestamp[8];\n};\n\nstruct sun_partition {\n\t__be32 start_cylinder;\n\t__be32 num_sectors;\n};\n\nstruct sun_disklabel {\n\tunsigned char info[128];\n\tstruct sun_vtoc vtoc;\n\t__be32 write_reinstruct;\n\t__be32 read_reinstruct;\n\tunsigned char spare[148];\n\t__be16 rspeed;\n\t__be16 pcylcount;\n\t__be16 sparecyl;\n\t__be16 obs1;\n\t__be16 obs2;\n\t__be16 ilfact;\n\t__be16 ncyl;\n\t__be16 nacyl;\n\t__be16 ntrks;\n\t__be16 nsect;\n\t__be16 obs3;\n\t__be16 obs4;\n\tstruct sun_partition partitions[8];\n\t__be16 magic;\n\t__be16 csum;\n};\n\nstruct mtd_info;\n\nstruct unicode_map;\n\nstruct super_block {\n\tstruct list_head s_list;\n\tdev_t s_dev;\n\tunsigned char s_blocksize_bits;\n\tlong unsigned int s_blocksize;\n\tloff_t s_maxbytes;\n\tstruct file_system_type *s_type;\n\tconst struct super_operations *s_op;\n\tconst struct dquot_operations *dq_op;\n\tconst struct quotactl_ops *s_qcop;\n\tconst struct export_operations *s_export_op;\n\tlong unsigned int s_flags;\n\tlong unsigned int s_iflags;\n\tlong unsigned int s_magic;\n\tstruct dentry *s_root;\n\tstruct rw_semaphore s_umount;\n\tint s_count;\n\tatomic_t s_active;\n\tvoid *s_security;\n\tconst struct xattr_handler * const *s_xattr;\n\tconst struct fscrypt_operations *s_cop;\n\tstruct fscrypt_keyring *s_master_keys;\n\tconst struct fsverity_operations *s_vop;\n\tstruct unicode_map *s_encoding;\n\t__u16 s_encoding_flags;\n\tstruct hlist_bl_head s_roots;\n\tstruct list_head s_mounts;\n\tstruct block_device *s_bdev;\n\tstruct file *s_bdev_file;\n\tstruct backing_dev_info *s_bdi;\n\tstruct mtd_info *s_mtd;\n\tstruct hlist_node s_instances;\n\tunsigned int s_quota_types;\n\tstruct quota_info s_dquot;\n\tstruct sb_writers s_writers;\n\tvoid *s_fs_info;\n\tu32 s_time_gran;\n\ttime64_t s_time_min;\n\ttime64_t s_time_max;\n\t__u32 s_fsnotify_mask;\n\tstruct fsnotify_sb_info *s_fsnotify_info;\n\tchar s_id[32];\n\tuuid_t s_uuid;\n\tu8 s_uuid_len;\n\tchar s_sysfs_name[37];\n\tunsigned int s_max_links;\n\tstruct mutex s_vfs_rename_mutex;\n\tconst char *s_subtype;\n\tconst struct dentry_operations *s_d_op;\n\tstruct shrinker *s_shrink;\n\tatomic_long_t s_remove_count;\n\tint s_readonly_remount;\n\terrseq_t s_wb_err;\n\tstruct workqueue_struct *s_dio_done_wq;\n\tstruct hlist_head s_pins;\n\tstruct user_namespace *s_user_ns;\n\tstruct list_lru s_dentry_lru;\n\tstruct list_lru s_inode_lru;\n\tstruct callback_head rcu;\n\tstruct work_struct destroy_work;\n\tstruct mutex s_sync_lock;\n\tint s_stack_depth;\n\tlong: 64;\n\tspinlock_t s_inode_list_lock;\n\tstruct list_head s_inodes;\n\tspinlock_t s_inode_wblist_lock;\n\tstruct list_head s_inodes_wb;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct super_operations {\n\tstruct inode * (*alloc_inode)(struct super_block *);\n\tvoid (*destroy_inode)(struct inode *);\n\tvoid (*free_inode)(struct inode *);\n\tvoid (*dirty_inode)(struct inode *, int);\n\tint (*write_inode)(struct inode *, struct writeback_control *);\n\tint (*drop_inode)(struct inode *);\n\tvoid (*evict_inode)(struct inode *);\n\tvoid (*put_super)(struct super_block *);\n\tint (*sync_fs)(struct super_block *, int);\n\tint (*freeze_super)(struct super_block *, enum freeze_holder);\n\tint (*freeze_fs)(struct super_block *);\n\tint (*thaw_super)(struct super_block *, enum freeze_holder);\n\tint (*unfreeze_fs)(struct super_block *);\n\tint (*statfs)(struct dentry *, struct kstatfs *);\n\tint (*remount_fs)(struct super_block *, int *, char *);\n\tvoid (*umount_begin)(struct super_block *);\n\tint (*show_options)(struct seq_file *, struct dentry *);\n\tint (*show_devname)(struct seq_file *, struct dentry *);\n\tint (*show_path)(struct seq_file *, struct dentry *);\n\tint (*show_stats)(struct seq_file *, struct dentry *);\n\tssize_t (*quota_read)(struct super_block *, int, char *, size_t, loff_t);\n\tssize_t (*quota_write)(struct super_block *, int, const char *, size_t, loff_t);\n\tstruct dquot ** (*get_dquots)(struct inode *);\n\tlong int (*nr_cached_objects)(struct super_block *, struct shrink_control *);\n\tlong int (*free_cached_objects)(struct super_block *, struct shrink_control *);\n\tvoid (*shutdown)(struct super_block *);\n};\n\nstruct super_type {\n\tchar *name;\n\tstruct module *owner;\n\tint (*load_super)(struct md_rdev *, struct md_rdev *, int);\n\tint (*validate_super)(struct mddev *, struct md_rdev *, struct md_rdev *);\n\tvoid (*sync_super)(struct mddev *, struct md_rdev *);\n\tlong long unsigned int (*rdev_size_change)(struct md_rdev *, sector_t);\n\tint (*allow_new_offset)(struct md_rdev *, long long unsigned int);\n};\n\nstruct superblock_security_struct {\n\tu32 sid;\n\tu32 def_sid;\n\tu32 mntpoint_sid;\n\tshort unsigned int behavior;\n\tshort unsigned int flags;\n\tstruct mutex lock;\n\tstruct list_head isec_head;\n\tspinlock_t isec_lock;\n};\n\nstruct superblock_smack {\n\tstruct smack_known *smk_root;\n\tstruct smack_known *smk_floor;\n\tstruct smack_known *smk_hat;\n\tstruct smack_known *smk_default;\n\tint smk_flags;\n};\n\nstruct suspend_info {\n\tint cancelled;\n};\n\nstruct suspend_performance_record {\n\tstruct fpdt_record_header header;\n\tu64 suspend_start;\n\tu64 suspend_end;\n} __attribute__((packed));\n\nstruct suspend_stats {\n\tunsigned int step_failures[8];\n\tunsigned int success;\n\tunsigned int fail;\n\tint last_failed_dev;\n\tchar failed_devs[80];\n\tint last_failed_errno;\n\tint errno[2];\n\tint last_failed_step;\n\tu64 last_hw_sleep;\n\tu64 total_hw_sleep;\n\tu64 max_hw_sleep;\n\tenum suspend_stat_step failed_steps[2];\n};\n\nstruct svc_cred {\n\tkuid_t cr_uid;\n\tkgid_t cr_gid;\n\tstruct group_info *cr_group_info;\n\tu32 cr_flavor;\n\tchar *cr_raw_principal;\n\tchar *cr_principal;\n\tchar *cr_targ_princ;\n\tstruct gss_api_mech *cr_gss_mech;\n};\n\nstruct svc_deferred_req {\n\tu32 prot;\n\tstruct svc_xprt *xprt;\n\tstruct __kernel_sockaddr_storage addr;\n\tsize_t addrlen;\n\tstruct __kernel_sockaddr_storage daddr;\n\tsize_t daddrlen;\n\tvoid *xprt_ctxt;\n\tstruct cache_deferred_req handle;\n\tint argslen;\n\t__be32 args[0];\n};\n\nstruct svc_pool {\n\tunsigned int sp_id;\n\tstruct lwq sp_xprts;\n\tunsigned int sp_nrthreads;\n\tstruct list_head sp_all_threads;\n\tstruct llist_head sp_idle_threads;\n\tstruct percpu_counter sp_messages_arrived;\n\tstruct percpu_counter sp_sockets_queued;\n\tstruct percpu_counter sp_threads_woken;\n\tlong unsigned int sp_flags;\n};\n\nstruct svc_procedure {\n\t__be32 (*pc_func)(struct svc_rqst *);\n\tbool (*pc_decode)(struct svc_rqst *, struct xdr_stream *);\n\tbool (*pc_encode)(struct svc_rqst *, struct xdr_stream *);\n\tvoid (*pc_release)(struct svc_rqst *);\n\tunsigned int pc_argsize;\n\tunsigned int pc_argzero;\n\tunsigned int pc_ressize;\n\tunsigned int pc_cachetype;\n\tunsigned int pc_xdrressize;\n\tconst char *pc_name;\n};\n\nstruct svc_process_info {\n\tunion {\n\t\tint (*dispatch)(struct svc_rqst *);\n\t\tstruct {\n\t\t\tunsigned int lovers;\n\t\t\tunsigned int hivers;\n\t\t} mismatch;\n\t};\n};\n\nstruct svc_version;\n\nstruct svc_program {\n\tstruct svc_program *pg_next;\n\tu32 pg_prog;\n\tunsigned int pg_lovers;\n\tunsigned int pg_hivers;\n\tunsigned int pg_nvers;\n\tconst struct svc_version **pg_vers;\n\tchar *pg_name;\n\tchar *pg_class;\n\tenum svc_auth_status (*pg_authenticate)(struct svc_rqst *);\n\t__be32 (*pg_init_request)(struct svc_rqst *, const struct svc_program *, struct svc_process_info *);\n\tint (*pg_rpcbind_set)(struct net *, const struct svc_program *, u32, int, short unsigned int, short unsigned int);\n};\n\nstruct xdr_stream {\n\t__be32 *p;\n\tstruct xdr_buf *buf;\n\t__be32 *end;\n\tstruct kvec *iov;\n\tstruct kvec scratch;\n\tstruct page **page_ptr;\n\tvoid *page_kaddr;\n\tunsigned int nwords;\n\tstruct rpc_rqst *rqst;\n};\n\nstruct svc_rqst {\n\tstruct list_head rq_all;\n\tstruct llist_node rq_idle;\n\tstruct callback_head rq_rcu_head;\n\tstruct svc_xprt *rq_xprt;\n\tstruct __kernel_sockaddr_storage rq_addr;\n\tsize_t rq_addrlen;\n\tstruct __kernel_sockaddr_storage rq_daddr;\n\tsize_t rq_daddrlen;\n\tstruct svc_serv *rq_server;\n\tstruct svc_pool *rq_pool;\n\tconst struct svc_procedure *rq_procinfo;\n\tstruct auth_ops *rq_authop;\n\tstruct svc_cred rq_cred;\n\tvoid *rq_xprt_ctxt;\n\tstruct svc_deferred_req *rq_deferred;\n\tstruct xdr_buf rq_arg;\n\tstruct xdr_stream rq_arg_stream;\n\tstruct xdr_stream rq_res_stream;\n\tstruct page *rq_scratch_page;\n\tstruct xdr_buf rq_res;\n\tstruct page *rq_pages[260];\n\tstruct page **rq_respages;\n\tstruct page **rq_next_page;\n\tstruct page **rq_page_end;\n\tstruct folio_batch rq_fbatch;\n\tstruct kvec rq_vec[259];\n\tstruct bio_vec rq_bvec[259];\n\t__be32 rq_xid;\n\tu32 rq_prog;\n\tu32 rq_vers;\n\tu32 rq_proc;\n\tu32 rq_prot;\n\tint rq_cachetype;\n\tlong unsigned int rq_flags;\n\tktime_t rq_qtime;\n\tvoid *rq_argp;\n\tvoid *rq_resp;\n\t__be32 *rq_accept_statp;\n\tvoid *rq_auth_data;\n\t__be32 rq_auth_stat;\n\tint rq_auth_slack;\n\tint rq_reserved;\n\tktime_t rq_stime;\n\tstruct cache_req rq_chandle;\n\tstruct auth_domain *rq_client;\n\tstruct auth_domain *rq_gssclient;\n\tstruct task_struct *rq_task;\n\tstruct net *rq_bc_net;\n\tlong unsigned int bc_to_initval;\n\tunsigned int bc_to_retries;\n\tvoid **rq_lease_breaker;\n\tunsigned int rq_status_counter;\n};\n\nstruct svc_stat;\n\nstruct svc_serv {\n\tstruct svc_program *sv_program;\n\tstruct svc_stat *sv_stats;\n\tspinlock_t sv_lock;\n\tunsigned int sv_nrthreads;\n\tunsigned int sv_maxconn;\n\tunsigned int sv_max_payload;\n\tunsigned int sv_max_mesg;\n\tunsigned int sv_xdrsize;\n\tstruct list_head sv_permsocks;\n\tstruct list_head sv_tempsocks;\n\tint sv_tmpcnt;\n\tstruct timer_list sv_temptimer;\n\tchar *sv_name;\n\tunsigned int sv_nrpools;\n\tbool sv_is_pooled;\n\tstruct svc_pool *sv_pools;\n\tint (*sv_threadfn)(void *);\n\tstruct lwq sv_cb_list;\n\tbool sv_bc_enabled;\n};\n\nstruct svc_stat {\n\tstruct svc_program *program;\n\tunsigned int netcnt;\n\tunsigned int netudpcnt;\n\tunsigned int nettcpcnt;\n\tunsigned int nettcpconn;\n\tunsigned int rpccnt;\n\tunsigned int rpcbadfmt;\n\tunsigned int rpcbadauth;\n\tunsigned int rpcbadclnt;\n};\n\nstruct svc_version {\n\tu32 vs_vers;\n\tu32 vs_nproc;\n\tconst struct svc_procedure *vs_proc;\n\tlong unsigned int *vs_count;\n\tu32 vs_xdrsize;\n\tbool vs_hidden;\n\tbool vs_rpcb_optnl;\n\tbool vs_need_cong_ctrl;\n\tint (*vs_dispatch)(struct svc_rqst *);\n};\n\nstruct svsm_loc_entry {\n\tu64 pa;\n\tu32 len;\n\tu8 rsvd[4];\n};\n\nstruct svsm_attest_call {\n\tstruct svsm_loc_entry report_buf;\n\tstruct svsm_loc_entry nonce;\n\tstruct svsm_loc_entry manifest_buf;\n\tstruct svsm_loc_entry certificates_buf;\n\tu8 service_guid[16];\n\tu32 service_manifest_ver;\n\tu8 rsvd[4];\n};\n\nstruct svsm_ca {\n\tu8 call_pending;\n\tu8 mem_available;\n\tu8 rsvd1[6];\n\tu8 svsm_buffer[4088];\n};\n\nstruct svsm_call {\n\tstruct svsm_ca *caa;\n\tu64 rax;\n\tu64 rcx;\n\tu64 rdx;\n\tu64 r8;\n\tu64 r9;\n\tu64 rax_out;\n\tu64 rcx_out;\n\tu64 rdx_out;\n\tu64 r8_out;\n\tu64 r9_out;\n};\n\nstruct svsm_pvalidate_entry {\n\tu64 page_size: 2;\n\tu64 action: 1;\n\tu64 ignore_cf: 1;\n\tu64 rsvd: 8;\n\tu64 pfn: 52;\n};\n\nstruct svsm_pvalidate_call {\n\tu16 num_entries;\n\tu16 cur_index;\n\tu8 rsvd1[4];\n\tstruct svsm_pvalidate_entry entry[0];\n};\n\nstruct sw_sync_create_fence_data {\n\t__u32 value;\n\tchar name[32];\n\t__s32 fence;\n};\n\nstruct sw_sync_get_deadline {\n\t__u64 deadline_ns;\n\t__u32 pad;\n\t__s32 fence_fd;\n};\n\nstruct swait_queue {\n\tstruct task_struct *task;\n\tstruct list_head task_list;\n};\n\nstruct swap_cgroup {\n\tshort unsigned int id;\n};\n\nstruct swap_cgroup_ctrl {\n\tstruct page **map;\n\tlong unsigned int length;\n\tspinlock_t lock;\n};\n\nstruct swap_cluster_info {\n\tspinlock_t lock;\n\tunsigned int data: 24;\n\tunsigned int flags: 8;\n};\n\nstruct swap_cluster_list {\n\tstruct swap_cluster_info head;\n\tstruct swap_cluster_info tail;\n};\n\nstruct swap_extent {\n\tstruct rb_node rb_node;\n\tlong unsigned int start_page;\n\tlong unsigned int nr_pages;\n\tsector_t start_block;\n};\n\nunion swap_header {\n\tstruct {\n\t\tchar reserved[4086];\n\t\tchar magic[10];\n\t} magic;\n\tstruct {\n\t\tchar bootbits[1024];\n\t\t__u32 version;\n\t\t__u32 last_page;\n\t\t__u32 nr_badpages;\n\t\tunsigned char sws_uuid[16];\n\t\tunsigned char sws_volume[16];\n\t\t__u32 padding[117];\n\t\t__u32 badpages[1];\n\t} info;\n};\n\nstruct swap_info_struct {\n\tstruct percpu_ref users;\n\tlong unsigned int flags;\n\tshort int prio;\n\tstruct plist_node list;\n\tsigned char type;\n\tunsigned int max;\n\tunsigned char *swap_map;\n\tstruct swap_cluster_info *cluster_info;\n\tstruct swap_cluster_list free_clusters;\n\tunsigned int lowest_bit;\n\tunsigned int highest_bit;\n\tunsigned int pages;\n\tunsigned int inuse_pages;\n\tunsigned int cluster_next;\n\tunsigned int cluster_nr;\n\tunsigned int *cluster_next_cpu;\n\tstruct percpu_cluster *percpu_cluster;\n\tstruct rb_root swap_extent_root;\n\tstruct block_device *bdev;\n\tstruct file *swap_file;\n\tstruct completion comp;\n\tspinlock_t lock;\n\tspinlock_t cont_lock;\n\tstruct work_struct discard_work;\n\tstruct swap_cluster_list discard_clusters;\n\tstruct plist_node avail_lists[0];\n};\n\nstruct swap_iocb {\n\tstruct kiocb iocb;\n\tstruct bio_vec bvec[32];\n\tint pages;\n\tint len;\n};\n\nstruct swap_map_page;\n\nstruct swap_map_page_list;\n\nstruct swap_map_handle {\n\tstruct swap_map_page *cur;\n\tstruct swap_map_page_list *maps;\n\tsector_t cur_swap;\n\tsector_t first_sector;\n\tunsigned int k;\n\tlong unsigned int reqd_free_pages;\n\tu32 crc32;\n};\n\nstruct swap_map_page {\n\tsector_t entries[511];\n\tsector_t next_swap;\n};\n\nstruct swap_map_page_list {\n\tstruct swap_map_page *map;\n\tstruct swap_map_page_list *next;\n};\n\nstruct swap_slots_cache {\n\tbool lock_initialized;\n\tstruct mutex alloc_lock;\n\tswp_entry_t *slots;\n\tint nr;\n\tint cur;\n\tspinlock_t free_lock;\n\tswp_entry_t *slots_ret;\n\tint n_ret;\n};\n\nstruct swevent_hlist {\n\tstruct hlist_head heads[256];\n\tstruct callback_head callback_head;\n};\n\nstruct swevent_htable {\n\tstruct swevent_hlist *swevent_hlist;\n\tstruct mutex hlist_mutex;\n\tint hlist_refcount;\n};\n\nstruct switchdev_mst_state {\n\tu16 msti;\n\tu8 state;\n};\n\nstruct switchdev_brport_flags {\n\tlong unsigned int val;\n\tlong unsigned int mask;\n};\n\nstruct switchdev_vlan_msti {\n\tu16 vid;\n\tu16 msti;\n};\n\nstruct switchdev_attr {\n\tstruct net_device *orig_dev;\n\tenum switchdev_attr_id id;\n\tu32 flags;\n\tvoid *complete_priv;\n\tvoid (*complete)(struct net_device *, int, void *);\n\tunion {\n\t\tu8 stp_state;\n\t\tstruct switchdev_mst_state mst_state;\n\t\tstruct switchdev_brport_flags brport_flags;\n\t\tbool mrouter;\n\t\tclock_t ageing_time;\n\t\tbool vlan_filtering;\n\t\tu16 vlan_protocol;\n\t\tbool mst;\n\t\tbool mc_disabled;\n\t\tu8 mrp_port_role;\n\t\tstruct switchdev_vlan_msti vlan_msti;\n\t} u;\n};\n\nstruct switchdev_brport {\n\tstruct net_device *dev;\n\tconst void *ctx;\n\tstruct notifier_block *atomic_nb;\n\tstruct notifier_block *blocking_nb;\n\tbool tx_fwd_offload;\n};\n\ntypedef void switchdev_deferred_func_t(struct net_device *, const void *);\n\nstruct switchdev_deferred_item {\n\tstruct list_head list;\n\tstruct net_device *dev;\n\tnetdevice_tracker dev_tracker;\n\tswitchdev_deferred_func_t *func;\n\tlong unsigned int data[0];\n};\n\nstruct switchdev_nested_priv {\n\tbool (*check_cb)(const struct net_device *);\n\tbool (*foreign_dev_check_cb)(const struct net_device *, const struct net_device *);\n\tconst struct net_device *dev;\n\tstruct net_device *lower_dev;\n};\n\nstruct switchdev_notifier_info {\n\tstruct net_device *dev;\n\tstruct netlink_ext_ack *extack;\n\tconst void *ctx;\n};\n\nstruct switchdev_notifier_brport_info {\n\tstruct switchdev_notifier_info info;\n\tconst struct switchdev_brport brport;\n};\n\nstruct switchdev_notifier_fdb_info {\n\tstruct switchdev_notifier_info info;\n\tconst unsigned char *addr;\n\tu16 vid;\n\tu8 added_by_user: 1;\n\tu8 is_local: 1;\n\tu8 locked: 1;\n\tu8 offloaded: 1;\n};\n\nstruct switchdev_notifier_port_attr_info {\n\tstruct switchdev_notifier_info info;\n\tconst struct switchdev_attr *attr;\n\tbool handled;\n};\n\nstruct switchdev_obj;\n\nstruct switchdev_notifier_port_obj_info {\n\tstruct switchdev_notifier_info info;\n\tconst struct switchdev_obj *obj;\n\tbool handled;\n};\n\nstruct switchdev_obj {\n\tstruct list_head list;\n\tstruct net_device *orig_dev;\n\tenum switchdev_obj_id id;\n\tu32 flags;\n\tvoid *complete_priv;\n\tvoid (*complete)(struct net_device *, int, void *);\n};\n\nstruct switchdev_obj_mrp {\n\tstruct switchdev_obj obj;\n\tstruct net_device *p_port;\n\tstruct net_device *s_port;\n\tu32 ring_id;\n\tu16 prio;\n};\n\nstruct switchdev_obj_port_mdb {\n\tstruct switchdev_obj obj;\n\tunsigned char addr[6];\n\tu16 vid;\n};\n\nstruct switchdev_obj_port_vlan {\n\tstruct switchdev_obj obj;\n\tu16 flags;\n\tu16 vid;\n\tbool changed;\n};\n\nstruct switchdev_obj_ring_role_mrp {\n\tstruct switchdev_obj obj;\n\tu8 ring_role;\n\tu32 ring_id;\n\tu8 sw_backup;\n};\n\nstruct swmii_regs {\n\tu16 bmsr;\n\tu16 lpa;\n\tu16 lpagb;\n\tu16 estat;\n};\n\nstruct swnode {\n\tstruct kobject kobj;\n\tstruct fwnode_handle fwnode;\n\tconst struct software_node *node;\n\tint id;\n\tstruct ida child_ids;\n\tstruct list_head entry;\n\tstruct list_head children;\n\tstruct swnode *parent;\n\tunsigned int allocated: 1;\n\tunsigned int managed: 1;\n};\n\nstruct swsusp_extent {\n\tstruct rb_node node;\n\tlong unsigned int start;\n\tlong unsigned int end;\n};\n\nstruct swsusp_header {\n\tchar reserved[4056];\n\tu32 hw_sig;\n\tu32 crc32;\n\tsector_t image;\n\tunsigned int flags;\n\tchar orig_sig[10];\n\tchar sig[10];\n};\n\nstruct swsusp_info {\n\tstruct new_utsname uts;\n\tu32 version_code;\n\tlong unsigned int num_physpages;\n\tint cpus;\n\tlong unsigned int image_pages;\n\tlong unsigned int pages;\n\tlong unsigned int size;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct sx150x_123_pri {\n\tu8 reg_pld_mode;\n\tu8 reg_pld_table0;\n\tu8 reg_pld_table1;\n\tu8 reg_pld_table2;\n\tu8 reg_pld_table3;\n\tu8 reg_pld_table4;\n\tu8 reg_advanced;\n};\n\nstruct sx150x_456_pri {\n\tu8 reg_pld_mode;\n\tu8 reg_pld_table0;\n\tu8 reg_pld_table1;\n\tu8 reg_pld_table2;\n\tu8 reg_pld_table3;\n\tu8 reg_pld_table4;\n\tu8 reg_advanced;\n};\n\nstruct sx150x_789_pri {\n\tu8 reg_drain;\n\tu8 reg_polarity;\n\tu8 reg_clock;\n\tu8 reg_misc;\n\tu8 reg_reset;\n\tu8 ngpios;\n};\n\nstruct sx150x_device_data {\n\tu8 model;\n\tu8 reg_pullup;\n\tu8 reg_pulldn;\n\tu8 reg_dir;\n\tu8 reg_data;\n\tu8 reg_irq_mask;\n\tu8 reg_irq_src;\n\tu8 reg_sense;\n\tu8 ngpios;\n\tunion {\n\t\tstruct sx150x_123_pri x123;\n\t\tstruct sx150x_456_pri x456;\n\t\tstruct sx150x_789_pri x789;\n\t} pri;\n\tconst struct pinctrl_pin_desc *pins;\n\tunsigned int npins;\n};\n\nstruct sx150x_pinctrl {\n\tstruct device *dev;\n\tstruct i2c_client *client;\n\tstruct pinctrl_dev *pctldev;\n\tstruct pinctrl_desc pinctrl_desc;\n\tstruct gpio_chip gpio;\n\tstruct regmap *regmap;\n\tstruct {\n\t\tu32 sense;\n\t\tu32 masked;\n\t} irq;\n\tstruct mutex lock;\n\tconst struct sx150x_device_data *data;\n};\n\nstruct sym_count_ctx {\n\tunsigned int count;\n\tconst char *name;\n};\n\nstruct symsearch {\n\tconst struct kernel_symbol *start;\n\tconst struct kernel_symbol *stop;\n\tconst s32 *crcs;\n\tenum mod_license license;\n};\n\nstruct sync_fence_info {\n\tchar obj_name[32];\n\tchar driver_name[32];\n\t__s32 status;\n\t__u32 flags;\n\t__u64 timestamp_ns;\n};\n\nstruct sync_file {\n\tstruct file *file;\n\tchar user_name[32];\n\tstruct list_head sync_file_list;\n\twait_queue_head_t wq;\n\tlong unsigned int flags;\n\tstruct dma_fence *fence;\n\tstruct dma_fence_cb cb;\n};\n\nstruct sync_file_info {\n\tchar name[32];\n\t__s32 status;\n\t__u32 flags;\n\t__u32 num_fences;\n\t__u32 pad;\n\t__u64 sync_fence_info;\n};\n\nstruct sync_io {\n\tlong unsigned int error_bits;\n\tstruct completion wait;\n};\n\nstruct sync_merge_data {\n\tchar name[32];\n\t__s32 fd2;\n\t__s32 fence;\n\t__u32 flags;\n\t__u32 pad;\n};\n\nstruct sync_pt {\n\tstruct dma_fence base;\n\tstruct list_head link;\n\tstruct rb_node node;\n\tktime_t deadline;\n};\n\nstruct sync_set_deadline {\n\t__u64 deadline_ns;\n\t__u64 pad;\n};\n\nstruct sync_timeline {\n\tstruct kref kref;\n\tchar name[32];\n\tu64 context;\n\tint value;\n\tstruct rb_root pt_tree;\n\tstruct list_head pt_list;\n\tspinlock_t lock;\n\tstruct list_head sync_timeline_list;\n};\n\nstruct syncobj_eventfd_entry {\n\tstruct list_head node;\n\tstruct dma_fence *fence;\n\tstruct dma_fence_cb fence_cb;\n\tstruct drm_syncobj *syncobj;\n\tstruct eventfd_ctx *ev_fd_ctx;\n\tu64 point;\n\tu32 flags;\n};\n\nstruct syncobj_wait_entry {\n\tstruct list_head node;\n\tstruct task_struct *task;\n\tstruct dma_fence *fence;\n\tstruct dma_fence_cb fence_cb;\n\tu64 point;\n};\n\nstruct trace_event_fields;\n\nstruct trace_event_class {\n\tconst char *system;\n\tvoid *probe;\n\tvoid *perf_probe;\n\tint (*reg)(struct trace_event_call *, enum trace_reg, void *);\n\tstruct trace_event_fields *fields_array;\n\tstruct list_head * (*get_fields)(struct trace_event_call *);\n\tstruct list_head fields;\n\tint (*raw_init)(struct trace_event_call *);\n};\n\nstruct trace_event_functions;\n\nstruct trace_event {\n\tstruct hlist_node node;\n\tint type;\n\tstruct trace_event_functions *funcs;\n};\n\nstruct trace_event_call {\n\tstruct list_head list;\n\tstruct trace_event_class *class;\n\tunion {\n\t\tconst char *name;\n\t\tstruct tracepoint *tp;\n\t};\n\tstruct trace_event event;\n\tchar *print_fmt;\n\tstruct event_filter *filter;\n\tunion {\n\t\tvoid *module;\n\t\tatomic_t refcnt;\n\t};\n\tvoid *data;\n\tint flags;\n\tint perf_refcount;\n\tstruct hlist_head *perf_events;\n\tstruct bpf_prog_array *prog_array;\n\tint (*perf_perm)(struct trace_event_call *, struct perf_event *);\n};\n\nstruct synth_field;\n\nstruct synth_event {\n\tstruct dyn_event devent;\n\tint ref;\n\tchar *name;\n\tstruct synth_field **fields;\n\tunsigned int n_fields;\n\tstruct synth_field **dynamic_fields;\n\tunsigned int n_dynamic_fields;\n\tunsigned int n_u64;\n\tstruct trace_event_class class;\n\tstruct trace_event_call call;\n\tstruct tracepoint *tp;\n\tstruct module *mod;\n};\n\nstruct trace_event_buffer {\n\tstruct trace_buffer *buffer;\n\tstruct ring_buffer_event *event;\n\tstruct trace_event_file *trace_file;\n\tvoid *entry;\n\tunsigned int trace_ctx;\n\tstruct pt_regs *regs;\n};\n\nstruct synth_trace_event;\n\nstruct synth_event_trace_state {\n\tstruct trace_event_buffer fbuffer;\n\tstruct synth_trace_event *entry;\n\tstruct trace_buffer *buffer;\n\tstruct synth_event *event;\n\tunsigned int cur_field;\n\tunsigned int n_u64;\n\tbool disabled;\n\tbool add_next;\n\tbool add_name;\n};\n\nstruct synth_field {\n\tchar *type;\n\tchar *name;\n\tsize_t size;\n\tunsigned int offset;\n\tunsigned int field_pos;\n\tbool is_signed;\n\tbool is_string;\n\tbool is_dynamic;\n\tbool is_stack;\n};\n\nstruct synth_field_desc {\n\tconst char *type;\n\tconst char *name;\n};\n\nstruct trace_dynamic_info {\n\tu16 offset;\n\tu16 len;\n};\n\nunion trace_synth_field {\n\tu8 as_u8;\n\tu16 as_u16;\n\tu32 as_u32;\n\tu64 as_u64;\n\tstruct trace_dynamic_info as_dynamic;\n};\n\nstruct synth_trace_event {\n\tstruct trace_entry ent;\n\tunion trace_synth_field fields[0];\n};\n\nstruct sys_off_data {\n\tint mode;\n\tvoid *cb_data;\n\tconst char *cmd;\n\tstruct device *dev;\n};\n\nstruct sys_off_handler {\n\tstruct notifier_block nb;\n\tint (*sys_off_cb)(struct sys_off_data *);\n\tvoid *cb_data;\n\tenum sys_off_mode mode;\n\tbool blocking;\n\tvoid *list;\n\tstruct device *dev;\n};\n\nstruct syscall_info {\n\t__u64 sp;\n\tstruct seccomp_data data;\n};\n\nstruct syscall_metadata {\n\tconst char *name;\n\tint syscall_nr;\n\tint nb_args;\n\tconst char **types;\n\tconst char **args;\n\tstruct list_head enter_fields;\n\tstruct trace_event_call *enter_event;\n\tstruct trace_event_call *exit_event;\n};\n\nstruct syscall_tp_t {\n\tstruct trace_entry ent;\n\tint syscall_nr;\n\tlong unsigned int ret;\n};\n\nstruct syscall_tp_t___2 {\n\tstruct trace_entry ent;\n\tint syscall_nr;\n\tlong unsigned int args[6];\n};\n\nstruct syscall_trace_enter {\n\tstruct trace_entry ent;\n\tint nr;\n\tlong unsigned int args[0];\n};\n\nstruct syscall_trace_exit {\n\tstruct trace_entry ent;\n\tint nr;\n\tlong int ret;\n};\n\nstruct syscall_user_dispatch {\n\tchar *selector;\n\tlong unsigned int offset;\n\tlong unsigned int len;\n\tbool on_dispatch;\n};\n\nstruct syscon {\n\tstruct device_node *np;\n\tstruct regmap *regmap;\n\tstruct reset_control *reset;\n\tstruct list_head list;\n};\n\nstruct syscon_platform_data {\n\tconst char *label;\n};\n\nstruct syscore_ops {\n\tstruct list_head node;\n\tint (*suspend)(void);\n\tvoid (*resume)(void);\n\tvoid (*shutdown)(void);\n};\n\nstruct sysctl_alias {\n\tconst char *kernel_param;\n\tconst char *sysctl_param;\n};\n\nstruct sysfs_ops {\n\tssize_t (*show)(struct kobject *, struct attribute *, char *);\n\tssize_t (*store)(struct kobject *, struct attribute *, const char *, size_t);\n};\n\nstruct sysinfo {\n\t__kernel_long_t uptime;\n\t__kernel_ulong_t loads[3];\n\t__kernel_ulong_t totalram;\n\t__kernel_ulong_t freeram;\n\t__kernel_ulong_t sharedram;\n\t__kernel_ulong_t bufferram;\n\t__kernel_ulong_t totalswap;\n\t__kernel_ulong_t freeswap;\n\t__u16 procs;\n\t__u16 pad;\n\t__kernel_ulong_t totalhigh;\n\t__kernel_ulong_t freehigh;\n\t__u32 mem_unit;\n\tchar _f[0];\n};\n\nstruct sysrq_key_op {\n\tvoid (* const handler)(u8);\n\tconst char * const help_msg;\n\tconst char * const action_msg;\n\tconst int enable_mask;\n};\n\nstruct sysrq_state {\n\tstruct input_handle handle;\n\tstruct work_struct reinject_work;\n\tlong unsigned int key_down[12];\n\tunsigned int alt;\n\tunsigned int alt_use;\n\tunsigned int shift;\n\tunsigned int shift_use;\n\tbool active;\n\tbool need_reinject;\n\tbool reinjecting;\n\tbool reset_canceled;\n\tbool reset_requested;\n\tlong unsigned int reset_keybit[12];\n\tint reset_seq_len;\n\tint reset_seq_cnt;\n\tint reset_seq_version;\n\tstruct timer_list keyreset_timer;\n};\n\nstruct system_counterval_t {\n\tu64 cycles;\n\tenum clocksource_ids cs_id;\n\tbool use_nsecs;\n};\n\nstruct system_device_crosststamp {\n\tktime_t device;\n\tktime_t sys_realtime;\n\tktime_t sys_monoraw;\n};\n\nstruct system_heap_buffer {\n\tstruct dma_heap *heap;\n\tstruct list_head attachments;\n\tstruct mutex lock;\n\tlong unsigned int len;\n\tstruct sg_table sg_table;\n\tint vmap_cnt;\n\tvoid *vaddr;\n};\n\nstruct system_time_snapshot {\n\tu64 cycles;\n\tktime_t real;\n\tktime_t raw;\n\tenum clocksource_ids cs_id;\n\tunsigned int clock_was_set_seq;\n\tu8 cs_was_changed_seq;\n};\n\nstruct sysv_sem {\n\tstruct sem_undo_list *undo_list;\n};\n\nstruct sysv_shm {\n\tstruct list_head shm_clist;\n};\n\nstruct t10_pi_tuple {\n\t__be16 guard_tag;\n\t__be16 app_tag;\n\t__be32 ref_tag;\n};\n\nstruct table_device {\n\tstruct list_head list;\n\trefcount_t count;\n\tstruct dm_dev dm_dev;\n};\n\nstruct table_header {\n\tu16 td_id;\n\tu16 td_flags;\n\tu32 td_hilen;\n\tu32 td_lolen;\n\tchar td_data[0];\n};\n\nstruct taint_flag {\n\tchar c_true;\n\tchar c_false;\n\tbool module;\n\tconst char *desc;\n};\n\nstruct tap_filter {\n\tunsigned int count;\n\tu32 mask[2];\n\tunsigned char addr[48];\n};\n\nstruct target_cache {\n\tstruct list_head node;\n\tstruct node_cache_attrs cache_attrs;\n};\n\ntypedef int (*dm_ctr_fn)(struct dm_target *, unsigned int, char **);\n\ntypedef void (*dm_dtr_fn)(struct dm_target *);\n\ntypedef int (*dm_map_fn)(struct dm_target *, struct bio *);\n\ntypedef int (*dm_clone_and_map_request_fn)(struct dm_target *, struct request *, union map_info *, struct request **);\n\ntypedef void (*dm_release_clone_request_fn)(struct request *, union map_info *);\n\ntypedef int (*dm_endio_fn)(struct dm_target *, struct bio *, blk_status_t *);\n\ntypedef int (*dm_request_endio_fn)(struct dm_target *, struct request *, blk_status_t, union map_info *);\n\ntypedef void (*dm_presuspend_fn)(struct dm_target *);\n\ntypedef void (*dm_presuspend_undo_fn)(struct dm_target *);\n\ntypedef void (*dm_postsuspend_fn)(struct dm_target *);\n\ntypedef int (*dm_preresume_fn)(struct dm_target *);\n\ntypedef void (*dm_resume_fn)(struct dm_target *);\n\ntypedef void (*dm_status_fn)(struct dm_target *, status_type_t, unsigned int, char *, unsigned int);\n\ntypedef int (*dm_message_fn)(struct dm_target *, unsigned int, char **, char *, unsigned int);\n\ntypedef int (*dm_prepare_ioctl_fn)(struct dm_target *, struct block_device **);\n\ntypedef int (*dm_report_zones_fn)(struct dm_target *, struct dm_report_zones_args *, unsigned int);\n\ntypedef int (*dm_busy_fn)(struct dm_target *);\n\ntypedef int (*iterate_devices_callout_fn)(struct dm_target *, struct dm_dev *, sector_t, sector_t, void *);\n\ntypedef int (*dm_iterate_devices_fn)(struct dm_target *, iterate_devices_callout_fn, void *);\n\ntypedef void (*dm_io_hints_fn)(struct dm_target *, struct queue_limits *);\n\ntypedef long int (*dm_dax_direct_access_fn)(struct dm_target *, long unsigned int, long int, enum dax_access_mode, void **, pfn_t *);\n\ntypedef int (*dm_dax_zero_page_range_fn)(struct dm_target *, long unsigned int, size_t);\n\ntypedef size_t (*dm_dax_recovery_write_fn)(struct dm_target *, long unsigned int, void *, size_t, struct iov_iter *);\n\nstruct target_type {\n\tuint64_t features;\n\tconst char *name;\n\tstruct module *module;\n\tunsigned int version[3];\n\tdm_ctr_fn ctr;\n\tdm_dtr_fn dtr;\n\tdm_map_fn map;\n\tdm_clone_and_map_request_fn clone_and_map_rq;\n\tdm_release_clone_request_fn release_clone_rq;\n\tdm_endio_fn end_io;\n\tdm_request_endio_fn rq_end_io;\n\tdm_presuspend_fn presuspend;\n\tdm_presuspend_undo_fn presuspend_undo;\n\tdm_postsuspend_fn postsuspend;\n\tdm_preresume_fn preresume;\n\tdm_resume_fn resume;\n\tdm_status_fn status;\n\tdm_message_fn message;\n\tdm_prepare_ioctl_fn prepare_ioctl;\n\tdm_report_zones_fn report_zones;\n\tdm_busy_fn busy;\n\tdm_iterate_devices_fn iterate_devices;\n\tdm_io_hints_fn io_hints;\n\tdm_dax_direct_access_fn direct_access;\n\tdm_dax_zero_page_range_fn dax_zero_page_range;\n\tdm_dax_recovery_write_fn dax_recovery_write;\n\tstruct list_head list;\n};\n\nstruct task_delay_info {\n\traw_spinlock_t lock;\n\tu64 blkio_start;\n\tu64 blkio_delay;\n\tu64 swapin_start;\n\tu64 swapin_delay;\n\tu32 blkio_count;\n\tu32 swapin_count;\n\tu64 freepages_start;\n\tu64 freepages_delay;\n\tu64 thrashing_start;\n\tu64 thrashing_delay;\n\tu64 compact_start;\n\tu64 compact_delay;\n\tu64 wpcopy_start;\n\tu64 wpcopy_delay;\n\tu64 irq_delay;\n\tu32 freepages_count;\n\tu32 thrashing_count;\n\tu32 compact_count;\n\tu32 wpcopy_count;\n\tu32 irq_count;\n};\n\nstruct uclamp_se {\n\tunsigned int value: 11;\n\tunsigned int bucket_id: 3;\n\tunsigned int active: 1;\n\tunsigned int user_defined: 1;\n};\n\nstruct task_group {\n\tstruct cgroup_subsys_state css;\n\tstruct sched_entity **se;\n\tstruct cfs_rq **cfs_rq;\n\tlong unsigned int shares;\n\tint idle;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tatomic_long_t load_avg;\n\tstruct callback_head rcu;\n\tstruct list_head list;\n\tstruct task_group *parent;\n\tstruct list_head siblings;\n\tstruct list_head children;\n\tstruct autogroup *autogroup;\n\tstruct cfs_bandwidth cfs_bandwidth;\n\tunsigned int uclamp_pct[2];\n\tstruct uclamp_se uclamp_req[2];\n\tstruct uclamp_se uclamp[2];\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct task_numa_env {\n\tstruct task_struct *p;\n\tint src_cpu;\n\tint src_nid;\n\tint dst_cpu;\n\tint dst_nid;\n\tint imb_numa_nr;\n\tstruct numa_stats src_stats;\n\tstruct numa_stats dst_stats;\n\tint imbalance_pct;\n\tint dist;\n\tstruct task_struct *best_task;\n\tlong int best_imp;\n\tint best_cpu;\n};\n\nstruct task_security_struct {\n\tu32 osid;\n\tu32 sid;\n\tu32 exec_sid;\n\tu32 create_sid;\n\tu32 keycreate_sid;\n\tu32 sockcreate_sid;\n};\n\nstruct task_smack {\n\tstruct smack_known *smk_task;\n\tstruct smack_known *smk_forked;\n\tstruct smack_known *smk_transmuted;\n\tstruct list_head smk_rules;\n\tstruct mutex smk_rules_lock;\n\tstruct list_head smk_relabel;\n};\n\ntypedef struct task_struct *class_find_get_task_t;\n\ntypedef struct task_struct *class_task_lock_t;\n\nstruct thread_info {\n\tlong unsigned int flags;\n\tlong unsigned int syscall_work;\n\tu32 status;\n\tu32 cpu;\n};\n\nstruct vtime {\n\tseqcount_t seqcount;\n\tlong long unsigned int starttime;\n\tenum vtime_state state;\n\tunsigned int cpu;\n\tu64 utime;\n\tu64 stime;\n\tu64 gtime;\n};\n\nstruct wake_q_node {\n\tstruct wake_q_node *next;\n};\n\nstruct tlbflush_unmap_batch {\n\tstruct arch_tlbflush_unmap_batch arch;\n\tbool flush_required;\n\tbool writable;\n};\n\nstruct thread_shstk {\n\tu64 base;\n\tu64 size;\n};\n\nstruct thread_struct {\n\tstruct desc_struct tls_array[3];\n\tlong unsigned int sp;\n\tshort unsigned int es;\n\tshort unsigned int ds;\n\tshort unsigned int fsindex;\n\tshort unsigned int gsindex;\n\tlong unsigned int fsbase;\n\tlong unsigned int gsbase;\n\tstruct perf_event *ptrace_bps[4];\n\tlong unsigned int virtual_dr6;\n\tlong unsigned int ptrace_dr7;\n\tlong unsigned int cr2;\n\tlong unsigned int trap_nr;\n\tlong unsigned int error_code;\n\tstruct io_bitmap *io_bitmap;\n\tlong unsigned int iopl_emul;\n\tunsigned int iopl_warn: 1;\n\tu32 pkru;\n\tlong unsigned int features;\n\tlong unsigned int features_locked;\n\tstruct thread_shstk shstk;\n\tlong: 64;\n\tstruct fpu fpu;\n};\n\nstruct uprobe_task;\n\nstruct user_event_mm;\n\nstruct task_struct {\n\tstruct thread_info thread_info;\n\tunsigned int __state;\n\tunsigned int saved_state;\n\tvoid *stack;\n\trefcount_t usage;\n\tunsigned int flags;\n\tunsigned int ptrace;\n\tint on_cpu;\n\tstruct __call_single_node wake_entry;\n\tunsigned int wakee_flips;\n\tlong unsigned int wakee_flip_decay_ts;\n\tstruct task_struct *last_wakee;\n\tint recent_used_cpu;\n\tint wake_cpu;\n\tint on_rq;\n\tint prio;\n\tint static_prio;\n\tint normal_prio;\n\tunsigned int rt_priority;\n\tstruct sched_entity se;\n\tstruct sched_rt_entity rt;\n\tstruct sched_dl_entity dl;\n\tstruct sched_dl_entity *dl_server;\n\tconst struct sched_class *sched_class;\n\tstruct rb_node core_node;\n\tlong unsigned int core_cookie;\n\tunsigned int core_occupation;\n\tstruct task_group *sched_task_group;\n\tstruct uclamp_se uclamp_req[2];\n\tstruct uclamp_se uclamp[2];\n\tlong: 64;\n\tstruct sched_statistics stats;\n\tstruct hlist_head preempt_notifiers;\n\tunsigned int btrace_seq;\n\tunsigned int policy;\n\tlong unsigned int max_allowed_capacity;\n\tint nr_cpus_allowed;\n\tconst cpumask_t *cpus_ptr;\n\tcpumask_t *user_cpus_ptr;\n\tcpumask_t cpus_mask;\n\tvoid *migration_pending;\n\tshort unsigned int migration_disabled;\n\tshort unsigned int migration_flags;\n\tint rcu_read_lock_nesting;\n\tunion rcu_special rcu_read_unlock_special;\n\tstruct list_head rcu_node_entry;\n\tstruct rcu_node *rcu_blocked_node;\n\tlong unsigned int rcu_tasks_nvcsw;\n\tu8 rcu_tasks_holdout;\n\tu8 rcu_tasks_idx;\n\tint rcu_tasks_idle_cpu;\n\tstruct list_head rcu_tasks_holdout_list;\n\tint rcu_tasks_exit_cpu;\n\tstruct list_head rcu_tasks_exit_list;\n\tint trc_reader_nesting;\n\tint trc_ipi_to_cpu;\n\tunion rcu_special trc_reader_special;\n\tstruct list_head trc_holdout_list;\n\tstruct list_head trc_blkd_node;\n\tint trc_blkd_cpu;\n\tstruct sched_info sched_info;\n\tstruct list_head tasks;\n\tstruct plist_node pushable_tasks;\n\tstruct rb_node pushable_dl_tasks;\n\tstruct mm_struct *mm;\n\tstruct mm_struct *active_mm;\n\tstruct address_space *faults_disabled_mapping;\n\tint exit_state;\n\tint exit_code;\n\tint exit_signal;\n\tint pdeath_signal;\n\tlong unsigned int jobctl;\n\tunsigned int personality;\n\tunsigned int sched_reset_on_fork: 1;\n\tunsigned int sched_contributes_to_load: 1;\n\tunsigned int sched_migrated: 1;\n\tlong: 29;\n\tunsigned int sched_remote_wakeup: 1;\n\tunsigned int sched_rt_mutex: 1;\n\tunsigned int in_execve: 1;\n\tunsigned int in_iowait: 1;\n\tunsigned int restore_sigmask: 1;\n\tunsigned int in_lru_fault: 1;\n\tunsigned int no_cgroup_migration: 1;\n\tunsigned int frozen: 1;\n\tunsigned int use_memdelay: 1;\n\tunsigned int in_memstall: 1;\n\tunsigned int in_eventfd: 1;\n\tunsigned int pasid_activated: 1;\n\tunsigned int reported_split_lock: 1;\n\tunsigned int in_thrashing: 1;\n\tlong unsigned int atomic_flags;\n\tstruct restart_block restart_block;\n\tpid_t pid;\n\tpid_t tgid;\n\tlong unsigned int stack_canary;\n\tstruct task_struct *real_parent;\n\tstruct task_struct *parent;\n\tstruct list_head children;\n\tstruct list_head sibling;\n\tstruct task_struct *group_leader;\n\tstruct list_head ptraced;\n\tstruct list_head ptrace_entry;\n\tstruct pid *thread_pid;\n\tstruct hlist_node pid_links[4];\n\tstruct list_head thread_node;\n\tstruct completion *vfork_done;\n\tint *set_child_tid;\n\tint *clear_child_tid;\n\tvoid *worker_private;\n\tu64 utime;\n\tu64 stime;\n\tu64 gtime;\n\tstruct prev_cputime prev_cputime;\n\tstruct vtime vtime;\n\tatomic_t tick_dep_mask;\n\tlong unsigned int nvcsw;\n\tlong unsigned int nivcsw;\n\tu64 start_time;\n\tu64 start_boottime;\n\tlong unsigned int min_flt;\n\tlong unsigned int maj_flt;\n\tstruct posix_cputimers posix_cputimers;\n\tstruct posix_cputimers_work posix_cputimers_work;\n\tconst struct cred *ptracer_cred;\n\tconst struct cred *real_cred;\n\tconst struct cred *cred;\n\tstruct key *cached_requested_key;\n\tchar comm[16];\n\tstruct nameidata *nameidata;\n\tstruct sysv_sem sysvsem;\n\tstruct sysv_shm sysvshm;\n\tlong unsigned int last_switch_count;\n\tlong unsigned int last_switch_time;\n\tstruct fs_struct *fs;\n\tstruct files_struct *files;\n\tstruct io_uring_task *io_uring;\n\tstruct nsproxy *nsproxy;\n\tstruct signal_struct *signal;\n\tstruct sighand_struct *sighand;\n\tsigset_t blocked;\n\tsigset_t real_blocked;\n\tsigset_t saved_sigmask;\n\tstruct sigpending pending;\n\tlong unsigned int sas_ss_sp;\n\tsize_t sas_ss_size;\n\tunsigned int sas_ss_flags;\n\tstruct callback_head *task_works;\n\tstruct audit_context *audit_context;\n\tkuid_t loginuid;\n\tunsigned int sessionid;\n\tstruct seccomp seccomp;\n\tstruct syscall_user_dispatch syscall_dispatch;\n\tu64 parent_exec_id;\n\tu64 self_exec_id;\n\tspinlock_t alloc_lock;\n\traw_spinlock_t pi_lock;\n\tstruct wake_q_node wake_q;\n\tstruct rb_root_cached pi_waiters;\n\tstruct task_struct *pi_top_task;\n\tstruct rt_mutex_waiter *pi_blocked_on;\n\tunsigned int in_ubsan;\n\tvoid *journal_info;\n\tstruct bio_list *bio_list;\n\tstruct blk_plug *plug;\n\tstruct reclaim_state *reclaim_state;\n\tstruct io_context *io_context;\n\tstruct capture_control *capture_control;\n\tlong unsigned int ptrace_message;\n\tkernel_siginfo_t *last_siginfo;\n\tstruct task_io_accounting ioac;\n\tunsigned int psi_flags;\n\tu64 acct_rss_mem1;\n\tu64 acct_vm_mem1;\n\tu64 acct_timexpd;\n\tnodemask_t mems_allowed;\n\tseqcount_spinlock_t mems_allowed_seq;\n\tint cpuset_mem_spread_rotor;\n\tint cpuset_slab_spread_rotor;\n\tstruct css_set *cgroups;\n\tstruct list_head cg_list;\n\tu32 closid;\n\tu32 rmid;\n\tstruct robust_list_head *robust_list;\n\tstruct compat_robust_list_head *compat_robust_list;\n\tstruct list_head pi_state_list;\n\tstruct futex_pi_state *pi_state_cache;\n\tstruct mutex futex_exit_mutex;\n\tunsigned int futex_state;\n\tu8 perf_recursion[4];\n\tstruct perf_event_context *perf_event_ctxp;\n\tstruct mutex perf_event_mutex;\n\tstruct list_head perf_event_list;\n\tstruct mempolicy *mempolicy;\n\tshort int il_prev;\n\tu8 il_weight;\n\tshort int pref_node_fork;\n\tint numa_scan_seq;\n\tunsigned int numa_scan_period;\n\tunsigned int numa_scan_period_max;\n\tint numa_preferred_nid;\n\tlong unsigned int numa_migrate_retry;\n\tu64 node_stamp;\n\tu64 last_task_numa_placement;\n\tu64 last_sum_exec_runtime;\n\tstruct callback_head numa_work;\n\tstruct numa_group *numa_group;\n\tlong unsigned int *numa_faults;\n\tlong unsigned int total_numa_faults;\n\tlong unsigned int numa_faults_locality[3];\n\tlong unsigned int numa_pages_migrated;\n\tstruct rseq *rseq;\n\tu32 rseq_len;\n\tu32 rseq_sig;\n\tlong unsigned int rseq_event_mask;\n\tint mm_cid;\n\tint last_mm_cid;\n\tint migrate_from_cpu;\n\tint mm_cid_active;\n\tstruct callback_head cid_work;\n\tstruct tlbflush_unmap_batch tlb_ubc;\n\tstruct pipe_inode_info *splice_pipe;\n\tstruct page_frag task_frag;\n\tstruct task_delay_info *delays;\n\tint nr_dirtied;\n\tint nr_dirtied_pause;\n\tlong unsigned int dirty_paused_when;\n\tint latency_record_count;\n\tstruct latency_record latency_record[32];\n\tu64 timer_slack_ns;\n\tu64 default_timer_slack_ns;\n\tint curr_ret_stack;\n\tint curr_ret_depth;\n\tlong unsigned int *ret_stack;\n\tlong long unsigned int ftrace_timestamp;\n\tatomic_t trace_overrun;\n\tatomic_t tracing_graph_pause;\n\tlong unsigned int trace_recursion;\n\tunsigned int memcg_nr_pages_over_high;\n\tstruct mem_cgroup *active_memcg;\n\tstruct obj_cgroup *objcg;\n\tstruct gendisk *throttle_disk;\n\tstruct uprobe_task *utask;\n\tunsigned int sequential_io;\n\tunsigned int sequential_io_avg;\n\tstruct kmap_ctrl kmap_ctrl;\n\tstruct callback_head rcu;\n\trefcount_t rcu_users;\n\tint pagefault_disabled;\n\tstruct task_struct *oom_reaper_list;\n\tstruct timer_list oom_reaper_timer;\n\tstruct vm_struct *stack_vm_area;\n\trefcount_t stack_refcount;\n\tint patch_state;\n\tvoid *security;\n\tstruct bpf_local_storage *bpf_storage;\n\tstruct bpf_run_ctx *bpf_ctx;\n\tstruct bpf_net_context *bpf_net_context;\n\tvoid *mce_vaddr;\n\t__u64 mce_kflags;\n\tu64 mce_addr;\n\t__u64 mce_ripv: 1;\n\t__u64 mce_whole_page: 1;\n\t__u64 __mce_reserved: 62;\n\tstruct callback_head mce_kill_me;\n\tint mce_count;\n\tstruct llist_head kretprobe_instances;\n\tstruct llist_head rethooks;\n\tstruct callback_head l1d_flush_kill;\n\tunion rv_task_monitor rv[1];\n\tstruct user_event_mm *user_event_mm;\n\tstruct thread_struct thread;\n};\n\nstruct task_struct__safe_rcu {\n\tconst cpumask_t *cpus_ptr;\n\tstruct css_set *cgroups;\n\tstruct task_struct *real_parent;\n\tstruct task_struct *group_leader;\n};\n\nstruct tasklet_head {\n\tstruct tasklet_struct *head;\n\tstruct tasklet_struct **tail;\n};\n\nstruct taskstats {\n\t__u16 version;\n\t__u32 ac_exitcode;\n\t__u8 ac_flag;\n\t__u8 ac_nice;\n\t__u64 cpu_count;\n\t__u64 cpu_delay_total;\n\t__u64 blkio_count;\n\t__u64 blkio_delay_total;\n\t__u64 swapin_count;\n\t__u64 swapin_delay_total;\n\t__u64 cpu_run_real_total;\n\t__u64 cpu_run_virtual_total;\n\tchar ac_comm[32];\n\t__u8 ac_sched;\n\t__u8 ac_pad[3];\n\tlong: 0;\n\t__u32 ac_uid;\n\t__u32 ac_gid;\n\t__u32 ac_pid;\n\t__u32 ac_ppid;\n\t__u32 ac_btime;\n\t__u64 ac_etime;\n\t__u64 ac_utime;\n\t__u64 ac_stime;\n\t__u64 ac_minflt;\n\t__u64 ac_majflt;\n\t__u64 coremem;\n\t__u64 virtmem;\n\t__u64 hiwater_rss;\n\t__u64 hiwater_vm;\n\t__u64 read_char;\n\t__u64 write_char;\n\t__u64 read_syscalls;\n\t__u64 write_syscalls;\n\t__u64 read_bytes;\n\t__u64 write_bytes;\n\t__u64 cancelled_write_bytes;\n\t__u64 nvcsw;\n\t__u64 nivcsw;\n\t__u64 ac_utimescaled;\n\t__u64 ac_stimescaled;\n\t__u64 cpu_scaled_run_real_total;\n\t__u64 freepages_count;\n\t__u64 freepages_delay_total;\n\t__u64 thrashing_count;\n\t__u64 thrashing_delay_total;\n\t__u64 ac_btime64;\n\t__u64 compact_count;\n\t__u64 compact_delay_total;\n\t__u32 ac_tgid;\n\t__u64 ac_tgetime;\n\t__u64 ac_exe_dev;\n\t__u64 ac_exe_inode;\n\t__u64 wpcopy_count;\n\t__u64 wpcopy_delay_total;\n\t__u64 irq_count;\n\t__u64 irq_delay_total;\n};\n\nstruct tboot_acpi_generic_address {\n\tu8 space_id;\n\tu8 bit_width;\n\tu8 bit_offset;\n\tu8 access_width;\n\tu64 address;\n} __attribute__((packed));\n\nstruct tboot_acpi_sleep_info {\n\tstruct tboot_acpi_generic_address pm1a_cnt_blk;\n\tstruct tboot_acpi_generic_address pm1b_cnt_blk;\n\tstruct tboot_acpi_generic_address pm1a_evt_blk;\n\tstruct tboot_acpi_generic_address pm1b_evt_blk;\n\tu16 pm1a_cnt_val;\n\tu16 pm1b_cnt_val;\n\tu64 wakeup_vector;\n\tu32 vector_width;\n\tu64 kernel_s3_resume_vector;\n} __attribute__((packed));\n\nstruct tboot_mac_region {\n\tu64 start;\n\tu32 size;\n} __attribute__((packed));\n\nstruct tboot {\n\tu8 uuid[16];\n\tu32 version;\n\tu32 log_addr;\n\tu32 shutdown_entry;\n\tu32 shutdown_type;\n\tstruct tboot_acpi_sleep_info acpi_sinfo;\n\tu32 tboot_base;\n\tu32 tboot_size;\n\tu8 num_mac_regions;\n\tstruct tboot_mac_region mac_regions[32];\n\tu8 s3_key[64];\n\tu8 reserved_align[3];\n\tu32 num_in_wfs;\n};\n\nstruct tc_act_pernet_id {\n\tstruct list_head list;\n\tunsigned int id;\n};\n\nstruct tcf_t {\n\t__u64 install;\n\t__u64 lastuse;\n\t__u64 expires;\n\t__u64 firstuse;\n};\n\nstruct tc_action_ops;\n\nstruct tcf_idrinfo;\n\nstruct tc_cookie;\n\nstruct tcf_chain;\n\nstruct tc_action {\n\tconst struct tc_action_ops *ops;\n\t__u32 type;\n\tstruct tcf_idrinfo *idrinfo;\n\tu32 tcfa_index;\n\trefcount_t tcfa_refcnt;\n\tatomic_t tcfa_bindcnt;\n\tint tcfa_action;\n\tstruct tcf_t tcfa_tm;\n\tlong: 64;\n\tstruct gnet_stats_basic_sync tcfa_bstats;\n\tstruct gnet_stats_basic_sync tcfa_bstats_hw;\n\tstruct gnet_stats_queue tcfa_qstats;\n\tstruct net_rate_estimator *tcfa_rate_est;\n\tspinlock_t tcfa_lock;\n\tstruct gnet_stats_basic_sync *cpu_bstats;\n\tstruct gnet_stats_basic_sync *cpu_bstats_hw;\n\tstruct gnet_stats_queue *cpu_qstats;\n\tstruct tc_cookie *user_cookie;\n\tstruct tcf_chain *goto_chain;\n\tu32 tcfa_flags;\n\tu8 hw_stats;\n\tu8 used_hw_stats;\n\tbool used_hw_stats_valid;\n\tu32 in_hw_count;\n};\n\nstruct tc_action_net {\n\tstruct tcf_idrinfo *idrinfo;\n\tconst struct tc_action_ops *ops;\n};\n\ntypedef void (*tc_action_priv_destructor)(void *);\n\nstruct tcf_result;\n\nstruct tc_action_ops {\n\tstruct list_head head;\n\tchar kind[16];\n\tenum tca_id id;\n\tunsigned int net_id;\n\tsize_t size;\n\tstruct module *owner;\n\tint (*act)(struct sk_buff *, const struct tc_action *, struct tcf_result *);\n\tint (*dump)(struct sk_buff *, struct tc_action *, int, int);\n\tvoid (*cleanup)(struct tc_action *);\n\tint (*lookup)(struct net *, struct tc_action **, u32);\n\tint (*init)(struct net *, struct nlattr *, struct nlattr *, struct tc_action **, struct tcf_proto *, u32, struct netlink_ext_ack *);\n\tint (*walk)(struct net *, struct sk_buff *, struct netlink_callback *, int, const struct tc_action_ops *, struct netlink_ext_ack *);\n\tvoid (*stats_update)(struct tc_action *, u64, u64, u64, u64, bool);\n\tsize_t (*get_fill_size)(const struct tc_action *);\n\tstruct net_device * (*get_dev)(const struct tc_action *, tc_action_priv_destructor *);\n\tstruct psample_group * (*get_psample_group)(const struct tc_action *, tc_action_priv_destructor *);\n\tint (*offload_act_setup)(struct tc_action *, void *, u32 *, bool, struct netlink_ext_ack *);\n};\n\nstruct tc_bind_class_args {\n\tstruct qdisc_walker w;\n\tlong unsigned int new_cl;\n\tu32 portid;\n\tu32 clid;\n};\n\nstruct tc_cookie {\n\tu8 *data;\n\tu32 len;\n\tstruct callback_head rcu;\n};\n\nstruct tc_fifo_qopt {\n\t__u32 limit;\n};\n\nstruct tc_qopt_offload_stats {\n\tstruct gnet_stats_basic_sync *bstats;\n\tstruct gnet_stats_queue *qstats;\n};\n\nstruct tc_fifo_qopt_offload {\n\tenum tc_fifo_command command;\n\tu32 handle;\n\tu32 parent;\n\tunion {\n\t\tstruct tc_qopt_offload_stats stats;\n\t};\n};\n\nstruct tc_mq_opt_offload_graft_params {\n\tlong unsigned int queue;\n\tu32 child_handle;\n};\n\nstruct tc_mq_qopt_offload {\n\tenum tc_mq_command command;\n\tu32 handle;\n\tunion {\n\t\tstruct tc_qopt_offload_stats stats;\n\t\tstruct tc_mq_opt_offload_graft_params graft_params;\n\t};\n};\n\nstruct tc_pedit_key {\n\t__u32 mask;\n\t__u32 val;\n\t__u32 off;\n\t__u32 at;\n\t__u32 offmask;\n\t__u32 shift;\n};\n\nstruct tc_prio_qopt {\n\tint bands;\n\t__u8 priomap[16];\n};\n\nstruct tc_query_caps_base {\n\tenum tc_setup_type type;\n\tvoid *caps;\n};\n\nstruct tc_root_qopt_offload {\n\tenum tc_root_command command;\n\tu32 handle;\n\tbool ingress;\n};\n\nstruct tc_skb_cb {\n\tstruct qdisc_skb_cb qdisc_cb;\n\tu32 drop_reason;\n\tu16 zone;\n\tu16 mru;\n\tu8 post_ct: 1;\n\tu8 post_ct_snat: 1;\n\tu8 post_ct_dnat: 1;\n};\n\nstruct tc_skb_ext {\n\tunion {\n\t\tu64 act_miss_cookie;\n\t\t__u32 chain;\n\t};\n\t__u16 mru;\n\t__u16 zone;\n\tu8 post_ct: 1;\n\tu8 post_ct_snat: 1;\n\tu8 post_ct_dnat: 1;\n\tu8 act_miss: 1;\n\tu8 l2_miss: 1;\n};\n\nstruct tcamsg {\n\tunsigned char tca_family;\n\tunsigned char tca__pad1;\n\tshort unsigned int tca__pad2;\n};\n\nstruct tcf_walker {\n\tint stop;\n\tint skip;\n\tint count;\n\tbool nonempty;\n\tlong unsigned int cookie;\n\tint (*fn)(struct tcf_proto *, void *, struct tcf_walker *);\n};\n\nstruct tcf_bind_args {\n\tstruct tcf_walker w;\n\tlong unsigned int base;\n\tlong unsigned int cl;\n\tu32 classid;\n};\n\nstruct tcf_block {\n\tstruct xarray ports;\n\tstruct mutex lock;\n\tstruct list_head chain_list;\n\tu32 index;\n\tu32 classid;\n\trefcount_t refcnt;\n\tstruct net *net;\n\tstruct Qdisc *q;\n\tstruct rw_semaphore cb_lock;\n\tstruct flow_block flow_block;\n\tstruct list_head owner_list;\n\tbool keep_dst;\n\tbool bypass_wanted;\n\tatomic_t filtercnt;\n\tatomic_t skipswcnt;\n\tatomic_t offloadcnt;\n\tunsigned int nooffloaddevcnt;\n\tunsigned int lockeddevcnt;\n\tstruct {\n\t\tstruct tcf_chain *chain;\n\t\tstruct list_head filter_chain_list;\n\t} chain0;\n\tstruct callback_head rcu;\n\tstruct hlist_head proto_destroy_ht[128];\n\tstruct mutex proto_destroy_lock;\n};\n\ntypedef void tcf_chain_head_change_t(struct tcf_proto *, void *);\n\nstruct tcf_block_ext_info {\n\tenum flow_block_binder_type binder_type;\n\ttcf_chain_head_change_t *chain_head_change;\n\tvoid *chain_head_change_priv;\n\tu32 block_index;\n};\n\nstruct tcf_block_owner_item {\n\tstruct list_head list;\n\tstruct Qdisc *q;\n\tenum flow_block_binder_type binder_type;\n};\n\nstruct tcf_proto_ops;\n\nstruct tcf_chain {\n\tstruct mutex filter_chain_lock;\n\tstruct tcf_proto *filter_chain;\n\tstruct list_head list;\n\tstruct tcf_block *block;\n\tu32 index;\n\tunsigned int refcnt;\n\tunsigned int action_refcnt;\n\tbool explicitly_created;\n\tbool flushing;\n\tconst struct tcf_proto_ops *tmplt_ops;\n\tvoid *tmplt_priv;\n\tstruct callback_head rcu;\n};\n\nstruct tcf_chain_info {\n\tstruct tcf_proto **pprev;\n\tstruct tcf_proto *next;\n};\n\nstruct tcf_dump_args {\n\tstruct tcf_walker w;\n\tstruct sk_buff *skb;\n\tstruct netlink_callback *cb;\n\tstruct tcf_block *block;\n\tstruct Qdisc *q;\n\tu32 parent;\n\tbool terse_dump;\n};\n\nstruct tcf_ematch_ops;\n\nstruct tcf_ematch {\n\tstruct tcf_ematch_ops *ops;\n\tlong unsigned int data;\n\tunsigned int datalen;\n\tu16 matchid;\n\tu16 flags;\n\tstruct net *net;\n};\n\nstruct tcf_ematch_hdr {\n\t__u16 matchid;\n\t__u16 kind;\n\t__u16 flags;\n\t__u16 pad;\n};\n\nstruct tcf_pkt_info;\n\nstruct tcf_ematch_ops {\n\tint kind;\n\tint datalen;\n\tint (*change)(struct net *, void *, int, struct tcf_ematch *);\n\tint (*match)(struct sk_buff *, struct tcf_ematch *, struct tcf_pkt_info *);\n\tvoid (*destroy)(struct tcf_ematch *);\n\tint (*dump)(struct sk_buff *, struct tcf_ematch *);\n\tstruct module *owner;\n\tstruct list_head link;\n};\n\nstruct tcf_ematch_tree_hdr {\n\t__u16 nmatches;\n\t__u16 progid;\n};\n\nstruct tcf_ematch_tree {\n\tstruct tcf_ematch_tree_hdr hdr;\n\tstruct tcf_ematch *matches;\n};\n\nstruct tcf_exts_miss_cookie_node;\n\nstruct tcf_exts {\n\t__u32 type;\n\tint nr_actions;\n\tstruct tc_action **actions;\n\tstruct net *net;\n\tnetns_tracker ns_tracker;\n\tstruct tcf_exts_miss_cookie_node *miss_cookie_node;\n\tint action;\n\tint police;\n};\n\nunion tcf_exts_miss_cookie {\n\tstruct {\n\t\tu32 miss_cookie_base;\n\t\tu32 act_index;\n\t};\n\tu64 miss_cookie;\n};\n\nstruct tcf_exts_miss_cookie_node {\n\tconst struct tcf_chain *chain;\n\tconst struct tcf_proto *tp;\n\tconst struct tcf_exts *exts;\n\tu32 chain_index;\n\tu32 tp_prio;\n\tu32 handle;\n\tu32 miss_cookie_base;\n\tstruct callback_head rcu;\n};\n\nstruct tcf_filter_chain_list_item {\n\tstruct list_head list;\n\ttcf_chain_head_change_t *chain_head_change;\n\tvoid *chain_head_change_priv;\n};\n\nstruct tcf_idrinfo {\n\tstruct mutex lock;\n\tstruct idr action_idr;\n\tstruct net *net;\n};\n\nstruct tcf_net {\n\tspinlock_t idr_lock;\n\tstruct idr idr;\n};\n\nstruct tcf_pedit_parms;\n\nstruct tcf_pedit {\n\tstruct tc_action common;\n\tstruct tcf_pedit_parms *parms;\n\tlong: 64;\n};\n\nstruct tcf_pedit_key_ex {\n\tenum pedit_header_type htype;\n\tenum pedit_cmd cmd;\n};\n\nstruct tcf_pedit_parms {\n\tstruct tc_pedit_key *tcfp_keys;\n\tstruct tcf_pedit_key_ex *tcfp_keys_ex;\n\tu32 tcfp_off_max_hint;\n\tunsigned char tcfp_nkeys;\n\tunsigned char tcfp_flags;\n\tstruct callback_head rcu;\n};\n\nstruct tcf_pkt_info {\n\tunsigned char *ptr;\n\tint nexthdr;\n};\n\nstruct tcf_proto {\n\tstruct tcf_proto *next;\n\tvoid *root;\n\tint (*classify)(struct sk_buff *, const struct tcf_proto *, struct tcf_result *);\n\t__be16 protocol;\n\tu32 prio;\n\tvoid *data;\n\tconst struct tcf_proto_ops *ops;\n\tstruct tcf_chain *chain;\n\tspinlock_t lock;\n\tbool deleting;\n\tbool counted;\n\trefcount_t refcnt;\n\tstruct callback_head rcu;\n\tstruct hlist_node destroy_ht_node;\n};\n\nstruct tcf_proto_ops {\n\tstruct list_head head;\n\tchar kind[16];\n\tint (*classify)(struct sk_buff *, const struct tcf_proto *, struct tcf_result *);\n\tint (*init)(struct tcf_proto *);\n\tvoid (*destroy)(struct tcf_proto *, bool, struct netlink_ext_ack *);\n\tvoid * (*get)(struct tcf_proto *, u32);\n\tvoid (*put)(struct tcf_proto *, void *);\n\tint (*change)(struct net *, struct sk_buff *, struct tcf_proto *, long unsigned int, u32, struct nlattr **, void **, u32, struct netlink_ext_ack *);\n\tint (*delete)(struct tcf_proto *, void *, bool *, bool, struct netlink_ext_ack *);\n\tbool (*delete_empty)(struct tcf_proto *);\n\tvoid (*walk)(struct tcf_proto *, struct tcf_walker *, bool);\n\tint (*reoffload)(struct tcf_proto *, bool, flow_setup_cb_t *, void *, struct netlink_ext_ack *);\n\tvoid (*hw_add)(struct tcf_proto *, void *);\n\tvoid (*hw_del)(struct tcf_proto *, void *);\n\tvoid (*bind_class)(void *, u32, long unsigned int, void *, long unsigned int);\n\tvoid * (*tmplt_create)(struct net *, struct tcf_chain *, struct nlattr **, struct netlink_ext_ack *);\n\tvoid (*tmplt_destroy)(void *);\n\tvoid (*tmplt_reoffload)(struct tcf_chain *, bool, flow_setup_cb_t *, void *);\n\tstruct tcf_exts * (*get_exts)(const struct tcf_proto *, u32);\n\tint (*dump)(struct net *, struct tcf_proto *, void *, struct sk_buff *, struct tcmsg *, bool);\n\tint (*terse_dump)(struct net *, struct tcf_proto *, void *, struct sk_buff *, struct tcmsg *, bool);\n\tint (*tmplt_dump)(struct sk_buff *, struct net *, void *);\n\tstruct module *owner;\n\tint flags;\n};\n\nstruct tcf_qevent {\n\tstruct tcf_block *block;\n\tstruct tcf_block_ext_info info;\n\tstruct tcf_proto *filter_chain;\n};\n\nstruct tcf_result {\n\tunion {\n\t\tstruct {\n\t\t\tlong unsigned int class;\n\t\t\tu32 classid;\n\t\t};\n\t\tconst struct tcf_proto *goto_tp;\n\t};\n};\n\nstruct tcg_efi_specid_event_algs {\n\tu16 alg_id;\n\tu16 digest_size;\n};\n\nstruct tcg_efi_specid_event_head {\n\tu8 signature[16];\n\tu32 platform_class;\n\tu8 spec_version_minor;\n\tu8 spec_version_major;\n\tu8 spec_errata;\n\tu8 uintnsize;\n\tu32 num_algs;\n\tstruct tcg_efi_specid_event_algs digest_sizes[0];\n};\n\nstruct tcg_event_field {\n\tu32 event_size;\n\tu8 event[0];\n};\n\nstruct tcg_pcr_event {\n\tu32 pcr_idx;\n\tu32 event_type;\n\tu8 digest[20];\n\tu32 event_size;\n\tu8 event[0];\n};\n\nstruct tpm_digest {\n\tu16 alg_id;\n\tu8 digest[64];\n};\n\nstruct tcg_pcr_event2_head {\n\tu32 pcr_idx;\n\tu32 event_type;\n\tu32 count;\n\tstruct tpm_digest digests[0];\n};\n\nstruct tcmsg {\n\tunsigned char tcm_family;\n\tunsigned char tcm__pad1;\n\tshort unsigned int tcm__pad2;\n\tint tcm_ifindex;\n\t__u32 tcm_handle;\n\t__u32 tcm_parent;\n\t__u32 tcm_info;\n};\n\nstruct tcp4_pseudohdr {\n\t__be32 saddr;\n\t__be32 daddr;\n\t__u8 pad;\n\t__u8 protocol;\n\t__be16 len;\n};\n\nstruct tcp6_pseudohdr {\n\tstruct in6_addr saddr;\n\tstruct in6_addr daddr;\n\t__be32 len;\n\t__be32 protocol;\n};\n\nstruct tcp_options_received {\n\tint ts_recent_stamp;\n\tu32 ts_recent;\n\tu32 rcv_tsval;\n\tu32 rcv_tsecr;\n\tu16 saw_tstamp: 1;\n\tu16 tstamp_ok: 1;\n\tu16 dsack: 1;\n\tu16 wscale_ok: 1;\n\tu16 sack_ok: 3;\n\tu16 smc_ok: 1;\n\tu16 snd_wscale: 4;\n\tu16 rcv_wscale: 4;\n\tu8 saw_unknown: 1;\n\tu8 unused: 7;\n\tu8 num_sacks;\n\tu16 user_mss;\n\tu16 mss_clamp;\n};\n\nstruct tcp_rack {\n\tu64 mstamp;\n\tu32 rtt_us;\n\tu32 end_seq;\n\tu32 last_delivered;\n\tu8 reo_wnd_steps;\n\tu8 reo_wnd_persist: 5;\n\tu8 dsack_seen: 1;\n\tu8 advanced: 1;\n};\n\nstruct tcp_sack_block {\n\tu32 start_seq;\n\tu32 end_seq;\n};\n\nstruct tcp_sock_af_ops;\n\nstruct tcp_md5sig_info;\n\nstruct tcp_ao_info;\n\nstruct tcp_fastopen_request;\n\nstruct tcp_sock {\n\tstruct inet_connection_sock inet_conn;\n\t__u8 __cacheline_group_begin__tcp_sock_read_tx[0];\n\tu32 max_window;\n\tu32 rcv_ssthresh;\n\tu32 reordering;\n\tu32 notsent_lowat;\n\tu16 gso_segs;\n\tstruct sk_buff *lost_skb_hint;\n\tstruct sk_buff *retransmit_skb_hint;\n\t__u8 __cacheline_group_end__tcp_sock_read_tx[0];\n\t__u8 __cacheline_group_begin__tcp_sock_read_txrx[0];\n\tu32 tsoffset;\n\tu32 snd_wnd;\n\tu32 mss_cache;\n\tu32 snd_cwnd;\n\tu32 prr_out;\n\tu32 lost_out;\n\tu32 sacked_out;\n\tu16 tcp_header_len;\n\tu8 scaling_ratio;\n\tu8 chrono_type: 2;\n\tu8 repair: 1;\n\tu8 tcp_usec_ts: 1;\n\tu8 is_sack_reneg: 1;\n\tu8 is_cwnd_limited: 1;\n\t__u8 __cacheline_group_end__tcp_sock_read_txrx[0];\n\t__u8 __cacheline_group_begin__tcp_sock_read_rx[0];\n\tu32 copied_seq;\n\tu32 rcv_tstamp;\n\tu32 snd_wl1;\n\tu32 tlp_high_seq;\n\tu32 rttvar_us;\n\tu32 retrans_out;\n\tu16 advmss;\n\tu16 urg_data;\n\tu32 lost;\n\tstruct minmax rtt_min;\n\tstruct rb_root out_of_order_queue;\n\tu32 snd_ssthresh;\n\tu8 recvmsg_inq: 1;\n\t__u8 __cacheline_group_end__tcp_sock_read_rx[0];\n\tlong: 64;\n\t__u8 __cacheline_group_begin__tcp_sock_write_tx[0];\n\tu32 segs_out;\n\tu32 data_segs_out;\n\tu64 bytes_sent;\n\tu32 snd_sml;\n\tu32 chrono_start;\n\tu32 chrono_stat[3];\n\tu32 write_seq;\n\tu32 pushed_seq;\n\tu32 lsndtime;\n\tu32 mdev_us;\n\tu32 rtt_seq;\n\tu64 tcp_wstamp_ns;\n\tstruct list_head tsorted_sent_queue;\n\tstruct sk_buff *highest_sack;\n\tu8 ecn_flags;\n\t__u8 __cacheline_group_end__tcp_sock_write_tx[0];\n\t__u8 __cacheline_group_begin__tcp_sock_write_txrx[0];\n\t__be32 pred_flags;\n\tu64 tcp_clock_cache;\n\tu64 tcp_mstamp;\n\tu32 rcv_nxt;\n\tu32 snd_nxt;\n\tu32 snd_una;\n\tu32 window_clamp;\n\tu32 srtt_us;\n\tu32 packets_out;\n\tu32 snd_up;\n\tu32 delivered;\n\tu32 delivered_ce;\n\tu32 app_limited;\n\tu32 rcv_wnd;\n\tstruct tcp_options_received rx_opt;\n\tu8 nonagle: 4;\n\tu8 rate_app_limited: 1;\n\t__u8 __cacheline_group_end__tcp_sock_write_txrx[0];\n\tlong: 0;\n\t__u8 __cacheline_group_begin__tcp_sock_write_rx[0];\n\tu64 bytes_received;\n\tu32 segs_in;\n\tu32 data_segs_in;\n\tu32 rcv_wup;\n\tu32 max_packets_out;\n\tu32 cwnd_usage_seq;\n\tu32 rate_delivered;\n\tu32 rate_interval_us;\n\tu32 rcv_rtt_last_tsecr;\n\tu64 first_tx_mstamp;\n\tu64 delivered_mstamp;\n\tu64 bytes_acked;\n\tstruct {\n\t\tu32 rtt_us;\n\t\tu32 seq;\n\t\tu64 time;\n\t} rcv_rtt_est;\n\tstruct {\n\t\tu32 space;\n\t\tu32 seq;\n\t\tu64 time;\n\t} rcvq_space;\n\t__u8 __cacheline_group_end__tcp_sock_write_rx[0];\n\tu32 dsack_dups;\n\tu32 compressed_ack_rcv_nxt;\n\tstruct list_head tsq_node;\n\tstruct tcp_rack rack;\n\tu8 compressed_ack;\n\tu8 dup_ack_counter: 2;\n\tu8 tlp_retrans: 1;\n\tu8 unused: 5;\n\tu8 thin_lto: 1;\n\tu8 fastopen_connect: 1;\n\tu8 fastopen_no_cookie: 1;\n\tu8 fastopen_client_fail: 2;\n\tu8 frto: 1;\n\tu8 repair_queue;\n\tu8 save_syn: 2;\n\tu8 syn_data: 1;\n\tu8 syn_fastopen: 1;\n\tu8 syn_fastopen_exp: 1;\n\tu8 syn_fastopen_ch: 1;\n\tu8 syn_data_acked: 1;\n\tu8 keepalive_probes;\n\tu32 tcp_tx_delay;\n\tu32 mdev_max_us;\n\tu32 reord_seen;\n\tu32 snd_cwnd_cnt;\n\tu32 snd_cwnd_clamp;\n\tu32 snd_cwnd_used;\n\tu32 snd_cwnd_stamp;\n\tu32 prior_cwnd;\n\tu32 prr_delivered;\n\tu32 last_oow_ack_time;\n\tstruct hrtimer pacing_timer;\n\tstruct hrtimer compressed_ack_timer;\n\tstruct sk_buff *ooo_last_skb;\n\tstruct tcp_sack_block duplicate_sack[1];\n\tstruct tcp_sack_block selective_acks[4];\n\tstruct tcp_sack_block recv_sack_cache[4];\n\tint lost_cnt_hint;\n\tu32 prior_ssthresh;\n\tu32 high_seq;\n\tu32 retrans_stamp;\n\tu32 undo_marker;\n\tint undo_retrans;\n\tu64 bytes_retrans;\n\tu32 total_retrans;\n\tu32 rto_stamp;\n\tu16 total_rto;\n\tu16 total_rto_recoveries;\n\tu32 total_rto_time;\n\tu32 urg_seq;\n\tunsigned int keepalive_time;\n\tunsigned int keepalive_intvl;\n\tint linger2;\n\tu8 bpf_sock_ops_cb_flags;\n\tu8 bpf_chg_cc_inprogress: 1;\n\tu16 timeout_rehash;\n\tu32 rcv_ooopack;\n\tstruct {\n\t\tu32 probe_seq_start;\n\t\tu32 probe_seq_end;\n\t} mtu_probe;\n\tu32 plb_rehash;\n\tu32 mtu_info;\n\tbool is_mptcp;\n\tbool syn_smc;\n\tbool (*smc_hs_congested)(const struct sock *);\n\tconst struct tcp_sock_af_ops *af_specific;\n\tstruct tcp_md5sig_info *md5sig_info;\n\tstruct tcp_ao_info *ao_info;\n\tstruct tcp_fastopen_request *fastopen_req;\n\tstruct request_sock *fastopen_rsk;\n\tstruct saved_syn *saved_syn;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct tcp6_sock {\n\tstruct tcp_sock tcp;\n\tstruct ipv6_pinfo inet6;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct tcp_ao_add {\n\tstruct __kernel_sockaddr_storage addr;\n\tchar alg_name[64];\n\t__s32 ifindex;\n\t__u32 set_current: 1;\n\t__u32 set_rnext: 1;\n\t__u32 reserved: 30;\n\t__u16 reserved2;\n\t__u8 prefix;\n\t__u8 sndid;\n\t__u8 rcvid;\n\t__u8 maclen;\n\t__u8 keyflags;\n\t__u8 keylen;\n\t__u8 key[80];\n};\n\nunion tcp_ao_addr {\n\tstruct in_addr a4;\n\tstruct in6_addr a6;\n};\n\nstruct tcp_ao_counters {\n\tatomic64_t pkt_good;\n\tatomic64_t pkt_bad;\n\tatomic64_t key_not_found;\n\tatomic64_t ao_required;\n\tatomic64_t dropped_icmp;\n};\n\nstruct tcp_ao_del {\n\tstruct __kernel_sockaddr_storage addr;\n\t__s32 ifindex;\n\t__u32 set_current: 1;\n\t__u32 set_rnext: 1;\n\t__u32 del_async: 1;\n\t__u32 reserved: 29;\n\t__u16 reserved2;\n\t__u8 prefix;\n\t__u8 sndid;\n\t__u8 rcvid;\n\t__u8 current_key;\n\t__u8 rnext;\n\t__u8 keyflags;\n};\n\nstruct tcp_ao_getsockopt {\n\tstruct __kernel_sockaddr_storage addr;\n\tchar alg_name[64];\n\t__u8 key[80];\n\t__u32 nkeys;\n\t__u16 is_current: 1;\n\t__u16 is_rnext: 1;\n\t__u16 get_all: 1;\n\t__u16 reserved: 13;\n\t__u8 sndid;\n\t__u8 rcvid;\n\t__u8 prefix;\n\t__u8 maclen;\n\t__u8 keyflags;\n\t__u8 keylen;\n\t__s32 ifindex;\n\t__u64 pkt_good;\n\t__u64 pkt_bad;\n};\n\nstruct tcp_ao_hdr {\n\tu8 kind;\n\tu8 length;\n\tu8 keyid;\n\tu8 rnext_keyid;\n};\n\nstruct tcp_ao_key;\n\nstruct tcp_ao_info {\n\tstruct hlist_head head;\n\tstruct tcp_ao_key *current_key;\n\tstruct tcp_ao_key *rnext_key;\n\tstruct tcp_ao_counters counters;\n\tu32 ao_required: 1;\n\tu32 accept_icmps: 1;\n\tu32 __unused: 30;\n\t__be32 lisn;\n\t__be32 risn;\n\tu32 snd_sne;\n\tu32 rcv_sne;\n\trefcount_t refcnt;\n\tstruct callback_head rcu;\n};\n\nstruct tcp_ao_info_opt {\n\t__u32 set_current: 1;\n\t__u32 set_rnext: 1;\n\t__u32 ao_required: 1;\n\t__u32 set_counters: 1;\n\t__u32 accept_icmps: 1;\n\t__u32 reserved: 27;\n\t__u16 reserved2;\n\t__u8 current_key;\n\t__u8 rnext;\n\t__u64 pkt_good;\n\t__u64 pkt_bad;\n\t__u64 pkt_key_not_found;\n\t__u64 pkt_ao_required;\n\t__u64 pkt_dropped_icmp;\n};\n\nstruct tcp_ao_key {\n\tstruct hlist_node node;\n\tunion tcp_ao_addr addr;\n\tu8 key[80];\n\tunsigned int tcp_sigpool_id;\n\tunsigned int digest_size;\n\tint l3index;\n\tu8 prefixlen;\n\tu8 family;\n\tu8 keylen;\n\tu8 keyflags;\n\tu8 sndid;\n\tu8 rcvid;\n\tu8 maclen;\n\tstruct callback_head rcu;\n\tatomic64_t pkt_good;\n\tatomic64_t pkt_bad;\n\tu8 traffic_keys[0];\n};\n\nstruct tcp_ao_repair {\n\t__be32 snt_isn;\n\t__be32 rcv_isn;\n\t__u32 snd_sne;\n\t__u32 rcv_sne;\n};\n\nstruct tcp_bbr_info {\n\t__u32 bbr_bw_lo;\n\t__u32 bbr_bw_hi;\n\t__u32 bbr_min_rtt;\n\t__u32 bbr_pacing_gain;\n\t__u32 bbr_cwnd_gain;\n};\n\nstruct tcpvegas_info {\n\t__u32 tcpv_enabled;\n\t__u32 tcpv_rttcnt;\n\t__u32 tcpv_rtt;\n\t__u32 tcpv_minrtt;\n};\n\nstruct tcp_dctcp_info {\n\t__u16 dctcp_enabled;\n\t__u16 dctcp_ce_state;\n\t__u32 dctcp_alpha;\n\t__u32 dctcp_ab_ecn;\n\t__u32 dctcp_ab_tot;\n};\n\nunion tcp_cc_info {\n\tstruct tcpvegas_info vegas;\n\tstruct tcp_dctcp_info dctcp;\n\tstruct tcp_bbr_info bbr;\n};\n\nstruct tcp_fastopen_context {\n\tsiphash_key_t key[2];\n\tint num;\n\tstruct callback_head rcu;\n};\n\nstruct tcp_fastopen_cookie {\n\t__le64 val[2];\n\ts8 len;\n\tbool exp;\n};\n\nstruct tcp_fastopen_metrics {\n\tu16 mss;\n\tu16 syn_loss: 10;\n\tu16 try_exp: 2;\n\tlong unsigned int last_syn_loss;\n\tstruct tcp_fastopen_cookie cookie;\n};\n\nstruct tcp_fastopen_request {\n\tstruct tcp_fastopen_cookie cookie;\n\tstruct msghdr *data;\n\tsize_t size;\n\tint copied;\n\tstruct ubuf_info *uarg;\n};\n\nstruct tcp_info {\n\t__u8 tcpi_state;\n\t__u8 tcpi_ca_state;\n\t__u8 tcpi_retransmits;\n\t__u8 tcpi_probes;\n\t__u8 tcpi_backoff;\n\t__u8 tcpi_options;\n\t__u8 tcpi_snd_wscale: 4;\n\t__u8 tcpi_rcv_wscale: 4;\n\t__u8 tcpi_delivery_rate_app_limited: 1;\n\t__u8 tcpi_fastopen_client_fail: 2;\n\t__u32 tcpi_rto;\n\t__u32 tcpi_ato;\n\t__u32 tcpi_snd_mss;\n\t__u32 tcpi_rcv_mss;\n\t__u32 tcpi_unacked;\n\t__u32 tcpi_sacked;\n\t__u32 tcpi_lost;\n\t__u32 tcpi_retrans;\n\t__u32 tcpi_fackets;\n\t__u32 tcpi_last_data_sent;\n\t__u32 tcpi_last_ack_sent;\n\t__u32 tcpi_last_data_recv;\n\t__u32 tcpi_last_ack_recv;\n\t__u32 tcpi_pmtu;\n\t__u32 tcpi_rcv_ssthresh;\n\t__u32 tcpi_rtt;\n\t__u32 tcpi_rttvar;\n\t__u32 tcpi_snd_ssthresh;\n\t__u32 tcpi_snd_cwnd;\n\t__u32 tcpi_advmss;\n\t__u32 tcpi_reordering;\n\t__u32 tcpi_rcv_rtt;\n\t__u32 tcpi_rcv_space;\n\t__u32 tcpi_total_retrans;\n\t__u64 tcpi_pacing_rate;\n\t__u64 tcpi_max_pacing_rate;\n\t__u64 tcpi_bytes_acked;\n\t__u64 tcpi_bytes_received;\n\t__u32 tcpi_segs_out;\n\t__u32 tcpi_segs_in;\n\t__u32 tcpi_notsent_bytes;\n\t__u32 tcpi_min_rtt;\n\t__u32 tcpi_data_segs_in;\n\t__u32 tcpi_data_segs_out;\n\t__u64 tcpi_delivery_rate;\n\t__u64 tcpi_busy_time;\n\t__u64 tcpi_rwnd_limited;\n\t__u64 tcpi_sndbuf_limited;\n\t__u32 tcpi_delivered;\n\t__u32 tcpi_delivered_ce;\n\t__u64 tcpi_bytes_sent;\n\t__u64 tcpi_bytes_retrans;\n\t__u32 tcpi_dsack_dups;\n\t__u32 tcpi_reord_seen;\n\t__u32 tcpi_rcv_ooopack;\n\t__u32 tcpi_snd_wnd;\n\t__u32 tcpi_rcv_wnd;\n\t__u32 tcpi_rehash;\n\t__u16 tcpi_total_rto;\n\t__u16 tcpi_total_rto_recoveries;\n\t__u32 tcpi_total_rto_time;\n};\n\nstruct tcp_md5sig_key;\n\nstruct tcp_key {\n\tunion {\n\t\tstruct {\n\t\t\tstruct tcp_ao_key *ao_key;\n\t\t\tchar *traffic_key;\n\t\t\tu32 sne;\n\t\t\tu8 rcv_next;\n\t\t};\n\t\tstruct tcp_md5sig_key *md5_key;\n\t};\n\tenum {\n\t\tTCP_KEY_NONE = 0,\n\t\tTCP_KEY_MD5 = 1,\n\t\tTCP_KEY_AO = 2,\n\t} type;\n};\n\nstruct tcp_md5sig {\n\tstruct __kernel_sockaddr_storage tcpm_addr;\n\t__u8 tcpm_flags;\n\t__u8 tcpm_prefixlen;\n\t__u16 tcpm_keylen;\n\tint tcpm_ifindex;\n\t__u8 tcpm_key[80];\n};\n\nstruct tcp_md5sig_info {\n\tstruct hlist_head head;\n\tstruct callback_head rcu;\n};\n\nstruct tcp_md5sig_key {\n\tstruct hlist_node node;\n\tu8 keylen;\n\tu8 family;\n\tu8 prefixlen;\n\tu8 flags;\n\tunion tcp_ao_addr addr;\n\tint l3index;\n\tu8 key[80];\n\tstruct callback_head rcu;\n};\n\nstruct tcp_metrics_block {\n\tstruct tcp_metrics_block *tcpm_next;\n\tstruct net *tcpm_net;\n\tstruct inetpeer_addr tcpm_saddr;\n\tstruct inetpeer_addr tcpm_daddr;\n\tlong unsigned int tcpm_stamp;\n\tu32 tcpm_lock;\n\tu32 tcpm_vals[5];\n\tstruct tcp_fastopen_metrics tcpm_fastopen;\n\tstruct callback_head callback_head;\n};\n\nstruct tcp_mib {\n\tlong unsigned int mibs[16];\n};\n\nstruct tcp_out_options {\n\tu16 options;\n\tu16 mss;\n\tu8 ws;\n\tu8 num_sack_blocks;\n\tu8 hash_size;\n\tu8 bpf_opt_len;\n\t__u8 *hash_location;\n\t__u32 tsval;\n\t__u32 tsecr;\n\tstruct tcp_fastopen_cookie *fastopen_cookie;\n\tstruct mptcp_out_options mptcp;\n};\n\nstruct tcp_plb_state {\n\tu8 consec_cong_rounds: 5;\n\tu8 unused: 3;\n\tu32 pause_until;\n};\n\nstruct tcp_repair_opt {\n\t__u32 opt_code;\n\t__u32 opt_val;\n};\n\nstruct tcp_repair_window {\n\t__u32 snd_wl1;\n\t__u32 snd_wnd;\n\t__u32 max_window;\n\t__u32 rcv_wnd;\n\t__u32 rcv_wup;\n};\n\nstruct tcp_request_sock_ops {\n\tu16 mss_clamp;\n\tstruct tcp_md5sig_key * (*req_md5_lookup)(const struct sock *, const struct sock *);\n\tint (*calc_md5_hash)(char *, const struct tcp_md5sig_key *, const struct sock *, const struct sk_buff *);\n\tstruct tcp_ao_key * (*ao_lookup)(const struct sock *, struct request_sock *, int, int);\n\tint (*ao_calc_key)(struct tcp_ao_key *, u8 *, struct request_sock *);\n\tint (*ao_synack_hash)(char *, struct tcp_ao_key *, struct request_sock *, const struct sk_buff *, int, u32);\n\t__u32 (*cookie_init_seq)(const struct sk_buff *, __u16 *);\n\tstruct dst_entry * (*route_req)(const struct sock *, struct sk_buff *, struct flowi *, struct request_sock *, u32);\n\tu32 (*init_seq)(const struct sk_buff *);\n\tu32 (*init_ts_off)(const struct net *, const struct sk_buff *);\n\tint (*send_synack)(const struct sock *, struct dst_entry *, struct flowi *, struct request_sock *, struct tcp_fastopen_cookie *, enum tcp_synack_type, struct sk_buff *);\n};\n\nstruct tcp_sack_block_wire {\n\t__be32 start_seq;\n\t__be32 end_seq;\n};\n\nstruct tcp_sacktag_state {\n\tu64 first_sackt;\n\tu64 last_sackt;\n\tu32 reord;\n\tu32 sack_delivered;\n\tint flag;\n\tunsigned int mss_now;\n\tstruct rate_sample *rate;\n};\n\nstruct tcp_seq_afinfo {\n\tsa_family_t family;\n};\n\nstruct tcp_sigpool {\n\tvoid *scratch;\n\tstruct ahash_request *req;\n};\n\nstruct tcp_skb_cb {\n\t__u32 seq;\n\t__u32 end_seq;\n\tunion {\n\t\tstruct {\n\t\t\tu16 tcp_gso_segs;\n\t\t\tu16 tcp_gso_size;\n\t\t};\n\t};\n\t__u8 tcp_flags;\n\t__u8 sacked;\n\t__u8 ip_dsfield;\n\t__u8 txstamp_ack: 1;\n\t__u8 eor: 1;\n\t__u8 has_rxtstamp: 1;\n\t__u8 unused: 5;\n\t__u32 ack_seq;\n\tunion {\n\t\tstruct {\n\t\t\t__u32 is_app_limited: 1;\n\t\t\t__u32 delivered_ce: 20;\n\t\t\t__u32 unused: 11;\n\t\t\t__u32 delivered;\n\t\t\tu64 first_tx_mstamp;\n\t\t\tu64 delivered_mstamp;\n\t\t} tx;\n\t\tunion {\n\t\t\tstruct inet_skb_parm h4;\n\t\t\tstruct inet6_skb_parm h6;\n\t\t} header;\n\t};\n};\n\nstruct tcp_sock_af_ops {\n\tstruct tcp_md5sig_key * (*md5_lookup)(const struct sock *, const struct sock *);\n\tint (*calc_md5_hash)(char *, const struct tcp_md5sig_key *, const struct sock *, const struct sk_buff *);\n\tint (*md5_parse)(struct sock *, int, sockptr_t, int);\n\tint (*ao_parse)(struct sock *, int, sockptr_t, int);\n\tstruct tcp_ao_key * (*ao_lookup)(const struct sock *, struct sock *, int, int);\n\tint (*ao_calc_key_sk)(struct tcp_ao_key *, u8 *, const struct sock *, __be32, __be32, bool);\n\tint (*calc_ao_hash)(char *, struct tcp_ao_key *, const struct sock *, const struct sk_buff *, const u8 *, int, u32);\n};\n\nstruct tcp_splice_state {\n\tstruct pipe_inode_info *pipe;\n\tsize_t len;\n\tunsigned int flags;\n};\n\nstruct tcp_timewait_sock {\n\tstruct inet_timewait_sock tw_sk;\n\tu32 tw_rcv_wnd;\n\tu32 tw_ts_offset;\n\tu32 tw_ts_recent;\n\tu32 tw_last_oow_ack_time;\n\tint tw_ts_recent_stamp;\n\tu32 tw_tx_delay;\n\tstruct tcp_md5sig_key *tw_md5_key;\n\tstruct tcp_ao_info *ao_info;\n};\n\nstruct tcp_ulp_ops {\n\tstruct list_head list;\n\tint (*init)(struct sock *);\n\tvoid (*update)(struct sock *, struct proto *, void (*)(struct sock *));\n\tvoid (*release)(struct sock *);\n\tint (*get_info)(struct sock *, struct sk_buff *);\n\tsize_t (*get_info_size)(const struct sock *);\n\tvoid (*clone)(const struct request_sock *, struct sock *, const gfp_t);\n\tchar name[16];\n\tstruct module *owner;\n};\n\nunion tcp_word_hdr {\n\tstruct tcphdr hdr;\n\t__be32 words[5];\n};\n\nstruct tcp_zerocopy_receive {\n\t__u64 address;\n\t__u32 length;\n\t__u32 recv_skip_hint;\n\t__u32 inq;\n\t__s32 err;\n\t__u64 copybuf_address;\n\t__s32 copybuf_len;\n\t__u32 flags;\n\t__u64 msg_control;\n\t__u64 msg_controllen;\n\t__u32 msg_flags;\n\t__u32 reserved;\n};\n\nstruct tcpa_event {\n\tu32 pcr_index;\n\tu32 event_type;\n\tu8 pcr_value[20];\n\tu32 event_size;\n\tu8 event_data[0];\n};\n\nstruct tcpa_pc_event {\n\tu32 event_id;\n\tu32 event_size;\n\tu8 event_data[0];\n};\n\nstruct tcpm_hash_bucket {\n\tstruct tcp_metrics_block *chain;\n};\n\nstruct tcx_entry {\n\tstruct mini_Qdisc *miniq;\n\tstruct bpf_mprog_bundle bundle;\n\tu32 miniq_active;\n\tstruct callback_head rcu;\n};\n\nstruct tcx_link {\n\tstruct bpf_link link;\n\tstruct net_device *dev;\n\tu32 location;\n};\n\nstruct td {\n\t__hc32 hwINFO;\n\t__hc32 hwCBP;\n\t__hc32 hwNextTD;\n\t__hc32 hwBE;\n\t__hc16 hwPSW[2];\n\t__u8 index;\n\tstruct ed *ed;\n\tstruct td *td_hash;\n\tstruct td *next_dl_td;\n\tstruct urb *urb;\n\tdma_addr_t td_dma;\n\tdma_addr_t data_dma;\n\tstruct list_head td_list;\n\tlong: 64;\n};\n\nstruct tdx_module_args {\n\tu64 rcx;\n\tu64 rdx;\n\tu64 r8;\n\tu64 r9;\n\tu64 r10;\n\tu64 r11;\n\tu64 r12;\n\tu64 r13;\n\tu64 r14;\n\tu64 r15;\n\tu64 rbx;\n\tu64 rdi;\n\tu64 rsi;\n};\n\nstruct temp_masks {\n\tu32 tcc_offset;\n\tu32 digital_readout;\n\tu32 pkg_digital_readout;\n};\n\nstruct teo_bin {\n\tunsigned int intercepts;\n\tunsigned int hits;\n};\n\nstruct teo_cpu {\n\ts64 time_span_ns;\n\ts64 sleep_length_ns;\n\tstruct teo_bin state_bins[10];\n\tunsigned int total;\n\tunsigned int tick_hits;\n};\n\nstruct termio {\n\tshort unsigned int c_iflag;\n\tshort unsigned int c_oflag;\n\tshort unsigned int c_cflag;\n\tshort unsigned int c_lflag;\n\tunsigned char c_line;\n\tunsigned char c_cc[8];\n};\n\nstruct termios {\n\ttcflag_t c_iflag;\n\ttcflag_t c_oflag;\n\ttcflag_t c_cflag;\n\ttcflag_t c_lflag;\n\tcc_t c_line;\n\tcc_t c_cc[19];\n};\n\nstruct termios2 {\n\ttcflag_t c_iflag;\n\ttcflag_t c_oflag;\n\ttcflag_t c_cflag;\n\ttcflag_t c_lflag;\n\tcc_t c_line;\n\tcc_t c_cc[19];\n\tspeed_t c_ispeed;\n\tspeed_t c_ospeed;\n};\n\nunion text_poke_insn {\n\tu8 text[5];\n\tstruct {\n\t\tu8 opcode;\n\t\ts32 disp;\n\t} __attribute__((packed));\n};\n\nstruct text_poke_loc {\n\ts32 rel_addr;\n\ts32 disp;\n\tu8 len;\n\tu8 opcode;\n\tconst u8 text[5];\n\tu8 old;\n};\n\nstruct tgid_iter {\n\tunsigned int tgid;\n\tstruct task_struct *task;\n};\n\nstruct thermal_attr {\n\tstruct device_attribute attr;\n\tchar name[20];\n};\n\nstruct thermal_cooling_device {\n\tint id;\n\tconst char *type;\n\tlong unsigned int max_state;\n\tstruct device device;\n\tstruct device_node *np;\n\tvoid *devdata;\n\tvoid *stats;\n\tconst struct thermal_cooling_device_ops *ops;\n\tbool updated;\n\tstruct mutex lock;\n\tstruct list_head thermal_instances;\n\tstruct list_head node;\n};\n\nstruct thermal_genl_cpu_caps {\n\tint cpu;\n\tint performance;\n\tint efficiency;\n};\n\nstruct thermal_genl_notify {\n\tint mcgrp;\n};\n\nstruct thermal_governor {\n\tconst char *name;\n\tint (*bind_to_tz)(struct thermal_zone_device *);\n\tvoid (*unbind_from_tz)(struct thermal_zone_device *);\n\tvoid (*trip_crossed)(struct thermal_zone_device *, const struct thermal_trip *, bool);\n\tvoid (*manage)(struct thermal_zone_device *);\n\tvoid (*update_tz)(struct thermal_zone_device *, enum thermal_notify_event);\n\tstruct list_head governor_list;\n};\n\nstruct thermal_hwmon_attr {\n\tstruct device_attribute attr;\n\tchar name[16];\n};\n\nstruct thermal_hwmon_device {\n\tchar type[20];\n\tstruct device *device;\n\tint count;\n\tstruct list_head tz_list;\n\tstruct list_head node;\n};\n\nstruct thermal_hwmon_temp {\n\tstruct list_head hwmon_node;\n\tstruct thermal_zone_device *tz;\n\tstruct thermal_hwmon_attr temp_input;\n\tstruct thermal_hwmon_attr temp_crit;\n};\n\nstruct thermal_instance {\n\tint id;\n\tchar name[20];\n\tstruct thermal_zone_device *tz;\n\tstruct thermal_cooling_device *cdev;\n\tconst struct thermal_trip *trip;\n\tbool initialized;\n\tlong unsigned int upper;\n\tlong unsigned int lower;\n\tlong unsigned int target;\n\tchar attr_name[20];\n\tstruct device_attribute attr;\n\tchar weight_attr_name[20];\n\tstruct device_attribute weight_attr;\n\tstruct list_head tz_node;\n\tstruct list_head cdev_node;\n\tunsigned int weight;\n\tbool upper_no_limit;\n};\n\nstruct thermal_state {\n\tstruct _thermal_state core_throttle;\n\tstruct _thermal_state core_power_limit;\n\tstruct _thermal_state package_throttle;\n\tstruct _thermal_state package_power_limit;\n\tstruct _thermal_state core_thresh0;\n\tstruct _thermal_state core_thresh1;\n\tstruct _thermal_state pkg_thresh0;\n\tstruct _thermal_state pkg_thresh1;\n};\n\nstruct thermal_trip {\n\tint temperature;\n\tint hysteresis;\n\tenum thermal_trip_type type;\n\tu8 flags;\n\tvoid *priv;\n};\n\nstruct thermal_trip_attrs {\n\tstruct thermal_attr type;\n\tstruct thermal_attr temp;\n\tstruct thermal_attr hyst;\n};\n\nstruct thermal_trip_desc {\n\tstruct thermal_trip trip;\n\tstruct thermal_trip_attrs trip_attrs;\n\tstruct list_head notify_list_node;\n\tint notify_temp;\n\tint threshold;\n};\n\ntypedef struct thermal_zone_device *class_thermal_zone_get_by_id_t;\n\nstruct thermal_zone_device_ops {\n\tint (*bind)(struct thermal_zone_device *, struct thermal_cooling_device *);\n\tint (*unbind)(struct thermal_zone_device *, struct thermal_cooling_device *);\n\tint (*get_temp)(struct thermal_zone_device *, int *);\n\tint (*set_trips)(struct thermal_zone_device *, int, int);\n\tint (*change_mode)(struct thermal_zone_device *, enum thermal_device_mode);\n\tint (*set_trip_temp)(struct thermal_zone_device *, const struct thermal_trip *, int);\n\tint (*get_crit_temp)(struct thermal_zone_device *, int *);\n\tint (*set_emul_temp)(struct thermal_zone_device *, int);\n\tint (*get_trend)(struct thermal_zone_device *, const struct thermal_trip *, enum thermal_trend *);\n\tvoid (*hot)(struct thermal_zone_device *);\n\tvoid (*critical)(struct thermal_zone_device *);\n};\n\nstruct thermal_zone_params;\n\nstruct thermal_zone_device {\n\tint id;\n\tchar type[20];\n\tstruct device device;\n\tstruct completion removal;\n\tstruct completion resume;\n\tstruct attribute_group trips_attribute_group;\n\tenum thermal_device_mode mode;\n\tvoid *devdata;\n\tint num_trips;\n\tlong unsigned int passive_delay_jiffies;\n\tlong unsigned int polling_delay_jiffies;\n\tlong unsigned int recheck_delay_jiffies;\n\tint temperature;\n\tint last_temperature;\n\tint emul_temperature;\n\tint passive;\n\tint prev_low_trip;\n\tint prev_high_trip;\n\tatomic_t need_update;\n\tstruct thermal_zone_device_ops ops;\n\tstruct thermal_zone_params *tzp;\n\tstruct thermal_governor *governor;\n\tvoid *governor_data;\n\tstruct list_head thermal_instances;\n\tstruct ida ida;\n\tstruct mutex lock;\n\tstruct list_head node;\n\tstruct delayed_work poll_queue;\n\tenum thermal_notify_event notify_event;\n\tu8 state;\n\tstruct thermal_trip_desc trips[0];\n};\n\nstruct thermal_zone_params {\n\tconst char *governor_name;\n\tbool no_hwmon;\n\tu32 sustainable_power;\n\ts32 k_po;\n\ts32 k_pu;\n\ts32 k_i;\n\ts32 k_d;\n\ts32 integral_cutoff;\n\tint slope;\n\tint offset;\n};\n\nstruct thpsize {\n\tstruct kobject kobj;\n\tstruct list_head node;\n\tint order;\n};\n\nstruct threshold_block;\n\nstruct thresh_restart {\n\tstruct threshold_block *b;\n\tint reset;\n\tint set_lvt_off;\n\tint lvt_off;\n\tu16 old_limit;\n};\n\nstruct threshold_attr {\n\tstruct attribute attr;\n\tssize_t (*show)(struct threshold_block *, char *);\n\tssize_t (*store)(struct threshold_block *, const char *, size_t);\n};\n\nstruct threshold_bank {\n\tstruct kobject *kobj;\n\tstruct threshold_block *blocks;\n\trefcount_t cpus;\n\tunsigned int shared;\n};\n\nstruct threshold_block {\n\tunsigned int block;\n\tunsigned int bank;\n\tunsigned int cpu;\n\tu32 address;\n\tu16 interrupt_enable;\n\tbool interrupt_capable;\n\tu16 threshold_limit;\n\tstruct kobject kobj;\n\tstruct list_head miscj;\n};\n\nstruct throtl_service_queue {\n\tstruct throtl_service_queue *parent_sq;\n\tstruct list_head queued[2];\n\tunsigned int nr_queued[2];\n\tstruct rb_root_cached pending_tree;\n\tunsigned int nr_pending;\n\tlong unsigned int first_pending_disptime;\n\tstruct timer_list pending_timer;\n};\n\nstruct throtl_data {\n\tstruct throtl_service_queue service_queue;\n\tstruct request_queue *queue;\n\tunsigned int nr_queued[2];\n\tunsigned int throtl_slice;\n\tstruct work_struct dispatch_work;\n\tbool track_bio_latency;\n};\n\nstruct throtl_grp;\n\nstruct throtl_qnode {\n\tstruct list_head node;\n\tstruct bio_list bios;\n\tstruct throtl_grp *tg;\n};\n\nstruct throtl_grp {\n\tstruct blkg_policy_data pd;\n\tstruct rb_node rb_node;\n\tstruct throtl_data *td;\n\tstruct throtl_service_queue service_queue;\n\tstruct throtl_qnode qnode_on_self[2];\n\tstruct throtl_qnode qnode_on_parent[2];\n\tlong unsigned int disptime;\n\tunsigned int flags;\n\tbool has_rules_bps[2];\n\tbool has_rules_iops[2];\n\tuint64_t bps[2];\n\tunsigned int iops[2];\n\tuint64_t bytes_disp[2];\n\tunsigned int io_disp[2];\n\tlong unsigned int last_low_overflow_time[2];\n\tuint64_t last_bytes_disp[2];\n\tunsigned int last_io_disp[2];\n\tlong long int carryover_bytes[2];\n\tint carryover_ios[2];\n\tlong unsigned int last_check_time;\n\tlong unsigned int slice_start[2];\n\tlong unsigned int slice_end[2];\n\tstruct blkg_rwstat stat_bytes;\n\tstruct blkg_rwstat stat_ios;\n};\n\nstruct throttling_tstate {\n\tunsigned int cpu;\n\tint target_state;\n};\n\nstruct tick_device {\n\tstruct clock_event_device *evtdev;\n\tenum tick_device_mode mode;\n};\n\nstruct tick_sched {\n\tlong unsigned int flags;\n\tunsigned int stalled_jiffies;\n\tlong unsigned int last_tick_jiffies;\n\tstruct hrtimer sched_timer;\n\tktime_t last_tick;\n\tktime_t next_tick;\n\tlong unsigned int idle_jiffies;\n\tktime_t idle_waketime;\n\tunsigned int got_idle_tick;\n\tseqcount_t idle_sleeptime_seq;\n\tktime_t idle_entrytime;\n\tlong unsigned int last_jiffies;\n\tu64 timer_expires_base;\n\tu64 timer_expires;\n\tu64 next_timer;\n\tktime_t idle_expires;\n\tlong unsigned int idle_calls;\n\tlong unsigned int idle_sleeps;\n\tktime_t idle_exittime;\n\tktime_t idle_sleeptime;\n\tktime_t iowait_sleeptime;\n\tatomic_t tick_dep_mask;\n\tlong unsigned int check_clocks;\n};\n\nstruct tick_work {\n\tint cpu;\n\tatomic_t state;\n\tstruct delayed_work work;\n};\n\nstruct timens_offsets {\n\tstruct timespec64 monotonic;\n\tstruct timespec64 boottime;\n};\n\nstruct time_namespace {\n\tstruct user_namespace *user_ns;\n\tstruct ucounts *ucounts;\n\tstruct ns_common ns;\n\tstruct timens_offsets offsets;\n\tstruct page *vvar_page;\n\tbool frozen_offsets;\n};\n\nstruct timedia_struct {\n\tint num;\n\tconst short unsigned int *ids;\n};\n\nstruct tk_read_base {\n\tstruct clocksource *clock;\n\tu64 mask;\n\tu64 cycle_last;\n\tu32 mult;\n\tu32 shift;\n\tu64 xtime_nsec;\n\tktime_t base;\n\tu64 base_real;\n};\n\nstruct timekeeper {\n\tstruct tk_read_base tkr_mono;\n\tstruct tk_read_base tkr_raw;\n\tu64 xtime_sec;\n\tlong unsigned int ktime_sec;\n\tstruct timespec64 wall_to_monotonic;\n\tktime_t offs_real;\n\tktime_t offs_boot;\n\tktime_t offs_tai;\n\ts32 tai_offset;\n\tunsigned int clock_was_set_seq;\n\tu8 cs_was_changed_seq;\n\tktime_t next_leap_ktime;\n\tu64 raw_sec;\n\tstruct timespec64 monotonic_to_boot;\n\tu64 cycle_interval;\n\tu64 xtime_interval;\n\ts64 xtime_remainder;\n\tu64 raw_interval;\n\tu64 ntp_tick;\n\ts64 ntp_error;\n\tu32 ntp_error_shift;\n\tu32 ntp_err_mult;\n\tu32 skip_second_overflow;\n};\n\nstruct timens_offset {\n\ts64 sec;\n\tu64 nsec;\n};\n\nstruct timer_base {\n\traw_spinlock_t lock;\n\tstruct timer_list *running_timer;\n\tlong unsigned int clk;\n\tlong unsigned int next_expiry;\n\tunsigned int cpu;\n\tbool next_expiry_recalc;\n\tbool is_idle;\n\tbool timers_pending;\n\tlong unsigned int pending_map[9];\n\tstruct hlist_head vectors[576];\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct timer_events {\n\tu64 local;\n\tu64 global;\n};\n\nstruct timer_list_iter {\n\tint cpu;\n\tbool second_pass;\n\tu64 now;\n};\n\nstruct timer_rand_state {\n\tlong unsigned int last_time;\n\tlong int last_delta;\n\tlong int last_delta2;\n};\n\nstruct timerfd_ctx {\n\tunion {\n\t\tstruct hrtimer tmr;\n\t\tstruct alarm alarm;\n\t} t;\n\tktime_t tintv;\n\tktime_t moffs;\n\twait_queue_head_t wqh;\n\tu64 ticks;\n\tint clockid;\n\tshort unsigned int expired;\n\tshort unsigned int settime_flags;\n\tstruct callback_head rcu;\n\tstruct list_head clist;\n\tspinlock_t cancel_lock;\n\tbool might_cancel;\n};\n\nstruct timerlat_entry {\n\tstruct trace_entry ent;\n\tunsigned int seqnum;\n\tint context;\n\tu64 timer_latency;\n};\n\nstruct timerlat_sample {\n\tu64 timer_latency;\n\tunsigned int seqnum;\n\tint context;\n};\n\nstruct timerlat_variables {\n\tstruct task_struct *kthread;\n\tstruct hrtimer timer;\n\tu64 rel_period;\n\tu64 abs_period;\n\tbool tracing_thread;\n\tu64 count;\n\tbool uthread_migrate;\n};\n\nstruct timers_private {\n\tstruct pid *pid;\n\tstruct task_struct *task;\n\tstruct sighand_struct *sighand;\n\tstruct pid_namespace *ns;\n\tlong unsigned int flags;\n};\n\nstruct timestamp_event_queue {\n\tstruct ptp_extts_event buf[128];\n\tint head;\n\tint tail;\n\tspinlock_t lock;\n\tstruct list_head qlist;\n\tlong unsigned int *mask;\n\tstruct dentry *debugfs_instance;\n\tstruct debugfs_u32_array dfs_bitmap;\n};\n\nstruct timewait_sock_ops {\n\tstruct kmem_cache *twsk_slab;\n\tchar *twsk_slab_name;\n\tunsigned int twsk_obj_size;\n\tvoid (*twsk_destructor)(struct sock *);\n};\n\nstruct timezone {\n\tint tz_minuteswest;\n\tint tz_dsttime;\n};\n\nstruct tiocl_selection {\n\tshort unsigned int xs;\n\tshort unsigned int ys;\n\tshort unsigned int xe;\n\tshort unsigned int ye;\n\tshort unsigned int sel_mode;\n};\n\nstruct tipc_basic_hdr {\n\t__be32 w[4];\n};\n\nstruct tis_vendor_durations_override {\n\tu32 did_vid;\n\tstruct tpm1_version version;\n\tlong unsigned int durations[3];\n};\n\nstruct tis_vendor_timeout_override {\n\tu32 did_vid;\n\tlong unsigned int timeout_us[4];\n};\n\nstruct tk_fast {\n\tseqcount_latch_t seq;\n\tstruct tk_read_base base[2];\n};\n\nstruct tlb_context {\n\tu64 ctx_id;\n\tu64 tlb_gen;\n};\n\nstruct tlb_state {\n\tstruct mm_struct *loaded_mm;\n\tunion {\n\t\tstruct mm_struct *last_user_mm;\n\t\tlong unsigned int last_user_mm_spec;\n\t};\n\tu16 loaded_mm_asid;\n\tu16 next_asid;\n\tbool invalidate_other;\n\tshort unsigned int user_pcid_flush_mask;\n\tlong unsigned int cr4;\n\tstruct tlb_context ctxs[6];\n};\n\nstruct tlb_state_shared {\n\tbool is_lazy;\n};\n\nstruct tls_crypto_info {\n\t__u16 version;\n\t__u16 cipher_type;\n};\n\nstruct tls12_crypto_info_aes_gcm_128 {\n\tstruct tls_crypto_info info;\n\tunsigned char iv[8];\n\tunsigned char key[16];\n\tunsigned char salt[4];\n\tunsigned char rec_seq[8];\n};\n\nstruct tls12_crypto_info_aes_gcm_256 {\n\tstruct tls_crypto_info info;\n\tunsigned char iv[8];\n\tunsigned char key[32];\n\tunsigned char salt[4];\n\tunsigned char rec_seq[8];\n};\n\nstruct tls12_crypto_info_chacha20_poly1305 {\n\tstruct tls_crypto_info info;\n\tunsigned char iv[12];\n\tunsigned char key[32];\n\tunsigned char salt[0];\n\tunsigned char rec_seq[8];\n};\n\nstruct tls12_crypto_info_sm4_ccm {\n\tstruct tls_crypto_info info;\n\tunsigned char iv[8];\n\tunsigned char key[16];\n\tunsigned char salt[4];\n\tunsigned char rec_seq[8];\n};\n\nstruct tls12_crypto_info_sm4_gcm {\n\tstruct tls_crypto_info info;\n\tunsigned char iv[8];\n\tunsigned char key[16];\n\tunsigned char salt[4];\n\tunsigned char rec_seq[8];\n};\n\nstruct tls_prot_info {\n\tu16 version;\n\tu16 cipher_type;\n\tu16 prepend_size;\n\tu16 tag_size;\n\tu16 overhead_size;\n\tu16 iv_size;\n\tu16 salt_size;\n\tu16 rec_seq_size;\n\tu16 aad_size;\n\tu16 tail_size;\n};\n\nunion tls_crypto_context {\n\tstruct tls_crypto_info info;\n\tunion {\n\t\tstruct tls12_crypto_info_aes_gcm_128 aes_gcm_128;\n\t\tstruct tls12_crypto_info_aes_gcm_256 aes_gcm_256;\n\t\tstruct tls12_crypto_info_chacha20_poly1305 chacha20_poly1305;\n\t\tstruct tls12_crypto_info_sm4_gcm sm4_gcm;\n\t\tstruct tls12_crypto_info_sm4_ccm sm4_ccm;\n\t};\n};\n\nstruct tls_context {\n\tstruct tls_prot_info prot_info;\n\tu8 tx_conf: 3;\n\tu8 rx_conf: 3;\n\tu8 zerocopy_sendfile: 1;\n\tu8 rx_no_pad: 1;\n\tint (*push_pending_record)(struct sock *, int);\n\tvoid (*sk_write_space)(struct sock *);\n\tvoid *priv_ctx_tx;\n\tvoid *priv_ctx_rx;\n\tstruct net_device *netdev;\n\tstruct cipher_context tx;\n\tstruct cipher_context rx;\n\tstruct scatterlist *partially_sent_record;\n\tu16 partially_sent_offset;\n\tbool splicing_pages;\n\tbool pending_open_record_frags;\n\tstruct mutex tx_lock;\n\tlong unsigned int flags;\n\tstruct proto *sk_proto;\n\tstruct sock *sk;\n\tvoid (*sk_destruct)(struct sock *);\n\tunion tls_crypto_context crypto_send;\n\tunion tls_crypto_context crypto_recv;\n\tstruct list_head list;\n\trefcount_t refcount;\n\tstruct callback_head rcu;\n};\n\nstruct tls_descs {\n\tstruct desc_struct desc[3];\n};\n\ntypedef void (*tls_done_func_t)(void *, int, key_serial_t);\n\nstruct tls_handshake_args {\n\tstruct socket *ta_sock;\n\ttls_done_func_t ta_done;\n\tvoid *ta_data;\n\tconst char *ta_peername;\n\tunsigned int ta_timeout_ms;\n\tkey_serial_t ta_keyring;\n\tkey_serial_t ta_my_cert;\n\tkey_serial_t ta_my_privkey;\n\tunsigned int ta_num_peerids;\n\tkey_serial_t ta_my_peerids[5];\n};\n\nstruct tls_handshake_req {\n\tvoid (*th_consumer_done)(void *, int, key_serial_t);\n\tvoid *th_consumer_data;\n\tint th_type;\n\tunsigned int th_timeout_ms;\n\tint th_auth_mode;\n\tconst char *th_peername;\n\tkey_serial_t th_keyring;\n\tkey_serial_t th_certificate;\n\tkey_serial_t th_privkey;\n\tunsigned int th_num_peerids;\n\tkey_serial_t th_peerid[5];\n};\n\nstruct tls_strparser {\n\tstruct sock *sk;\n\tu32 mark: 8;\n\tu32 stopped: 1;\n\tu32 copy_mode: 1;\n\tu32 mixed_decrypted: 1;\n\tbool msg_ready;\n\tstruct strp_msg stm;\n\tstruct sk_buff *anchor;\n\tstruct work_struct work;\n};\n\nstruct tls_sw_context_rx {\n\tstruct crypto_aead *aead_recv;\n\tstruct crypto_wait async_wait;\n\tstruct sk_buff_head rx_list;\n\tvoid (*saved_data_ready)(struct sock *);\n\tu8 reader_present;\n\tu8 async_capable: 1;\n\tu8 zc_capable: 1;\n\tu8 reader_contended: 1;\n\tstruct tls_strparser strp;\n\tatomic_t decrypt_pending;\n\tstruct sk_buff_head async_hold;\n\tstruct wait_queue_head wq;\n};\n\nstruct tx_work {\n\tstruct delayed_work work;\n\tstruct sock *sk;\n};\n\nstruct tls_rec;\n\nstruct tls_sw_context_tx {\n\tstruct crypto_aead *aead_send;\n\tstruct crypto_wait async_wait;\n\tstruct tx_work tx_work;\n\tstruct tls_rec *open_rec;\n\tstruct list_head tx_list;\n\tatomic_t encrypt_pending;\n\tu8 async_capable: 1;\n\tlong unsigned int tx_bitmask;\n};\n\nstruct tlsdev_ops {\n\tint (*tls_dev_add)(struct net_device *, struct sock *, enum tls_offload_ctx_dir, struct tls_crypto_info *, u32);\n\tvoid (*tls_dev_del)(struct net_device *, struct tls_context *, enum tls_offload_ctx_dir);\n\tint (*tls_dev_resync)(struct net_device *, struct sock *, u32, u8 *, enum tls_offload_ctx_dir);\n};\n\nstruct tm {\n\tint tm_sec;\n\tint tm_min;\n\tint tm_hour;\n\tint tm_mday;\n\tint tm_mon;\n\tlong int tm_year;\n\tint tm_wday;\n\tint tm_yday;\n};\n\nstruct tmigr_event {\n\tstruct timerqueue_node nextevt;\n\tunsigned int cpu;\n\tbool ignore;\n};\n\nstruct tmigr_group;\n\nstruct tmigr_cpu {\n\traw_spinlock_t lock;\n\tbool online;\n\tbool idle;\n\tbool remote;\n\tstruct tmigr_group *tmgroup;\n\tu8 groupmask;\n\tu64 wakeup;\n\tstruct tmigr_event cpuevt;\n};\n\nstruct tmigr_group {\n\traw_spinlock_t lock;\n\tstruct tmigr_group *parent;\n\tstruct tmigr_event groupevt;\n\tu64 next_expiry;\n\tstruct timerqueue_head events;\n\tatomic_t migr_state;\n\tunsigned int level;\n\tint numa_node;\n\tunsigned int num_children;\n\tu8 groupmask;\n\tstruct list_head list;\n};\n\nunion tmigr_state {\n\tu32 state;\n\tstruct {\n\t\tu8 active;\n\t\tu8 migrator;\n\t\tu16 seq;\n\t};\n};\n\nstruct tmigr_walk {\n\tu64 nextexp;\n\tu64 firstexp;\n\tstruct tmigr_event *evt;\n\tu8 childmask;\n\tbool remote;\n\tlong unsigned int basej;\n\tu64 now;\n\tbool check;\n\tbool tmc_active;\n};\n\nstruct tmpmasks {\n\tcpumask_var_t addmask;\n\tcpumask_var_t delmask;\n\tcpumask_var_t new_cpus;\n};\n\nstruct tms {\n\t__kernel_clock_t tms_utime;\n\t__kernel_clock_t tms_stime;\n\t__kernel_clock_t tms_cutime;\n\t__kernel_clock_t tms_cstime;\n};\n\nstruct tnode {\n\tstruct callback_head rcu;\n\tt_key empty_children;\n\tt_key full_children;\n\tstruct key_vector *parent;\n\tstruct key_vector kv[1];\n};\n\nstruct token_bucket {\n\tspinlock_t lock;\n\tint chain_len;\n\tstruct hlist_nulls_head req_chain;\n\tstruct hlist_nulls_head msk_chain;\n};\n\nstruct tomoyo_acl_head {\n\tstruct list_head list;\n\ts8 is_deleted;\n} __attribute__((packed));\n\nstruct tomoyo_condition;\n\nstruct tomoyo_acl_info {\n\tstruct list_head list;\n\tstruct tomoyo_condition *cond;\n\ts8 is_deleted;\n\tu8 type;\n} __attribute__((packed));\n\nstruct tomoyo_policy_namespace;\n\nstruct tomoyo_acl_param {\n\tchar *data;\n\tstruct list_head *list;\n\tstruct tomoyo_policy_namespace *ns;\n\tbool is_delete;\n};\n\nstruct tomoyo_inet_addr_info {\n\t__be16 port;\n\tconst __be32 *address;\n\tbool is_ipv6;\n};\n\nstruct tomoyo_unix_addr_info {\n\tu8 *addr;\n\tunsigned int addr_len;\n};\n\nstruct tomoyo_addr_info {\n\tu8 protocol;\n\tu8 operation;\n\tstruct tomoyo_inet_addr_info inet;\n\tstruct tomoyo_unix_addr_info unix0;\n};\n\nstruct tomoyo_group;\n\nstruct tomoyo_ipaddr_union {\n\tstruct in6_addr ip[2];\n\tstruct tomoyo_group *group;\n\tbool is_ipv6;\n};\n\nstruct tomoyo_address_group {\n\tstruct tomoyo_acl_head head;\n\tstruct tomoyo_ipaddr_union address;\n};\n\nstruct tomoyo_path_info;\n\nstruct tomoyo_aggregator {\n\tstruct tomoyo_acl_head head;\n\tconst struct tomoyo_path_info *original_name;\n\tconst struct tomoyo_path_info *aggregated_name;\n};\n\nstruct tomoyo_argv {\n\tlong unsigned int index;\n\tconst struct tomoyo_path_info *value;\n\tbool is_not;\n};\n\nstruct tomoyo_shared_acl_head {\n\tstruct list_head list;\n\tatomic_t users;\n} __attribute__((packed));\n\nstruct tomoyo_condition {\n\tstruct tomoyo_shared_acl_head head;\n\tu32 size;\n\tu16 condc;\n\tu16 numbers_count;\n\tu16 names_count;\n\tu16 argc;\n\tu16 envc;\n\tu8 grant_log;\n\tconst struct tomoyo_path_info *transit;\n};\n\nstruct tomoyo_condition_element {\n\tu8 left;\n\tu8 right;\n\tbool equals;\n};\n\nstruct tomoyo_domain_info {\n\tstruct list_head list;\n\tstruct list_head acl_info_list;\n\tconst struct tomoyo_path_info *domainname;\n\tstruct tomoyo_policy_namespace *ns;\n\tlong unsigned int group[4];\n\tu8 profile;\n\tbool is_deleted;\n\tbool flags[2];\n\tatomic_t users;\n};\n\nstruct tomoyo_env_acl {\n\tstruct tomoyo_acl_info head;\n\tconst struct tomoyo_path_info *env;\n};\n\nstruct tomoyo_envp {\n\tconst struct tomoyo_path_info *name;\n\tconst struct tomoyo_path_info *value;\n\tbool is_not;\n};\n\nstruct tomoyo_obj_info;\n\nstruct tomoyo_execve;\n\nstruct tomoyo_request_info {\n\tstruct tomoyo_obj_info *obj;\n\tstruct tomoyo_execve *ee;\n\tstruct tomoyo_domain_info *domain;\n\tunion {\n\t\tstruct {\n\t\t\tconst struct tomoyo_path_info *filename;\n\t\t\tconst struct tomoyo_path_info *matched_path;\n\t\t\tu8 operation;\n\t\t} path;\n\t\tstruct {\n\t\t\tconst struct tomoyo_path_info *filename1;\n\t\t\tconst struct tomoyo_path_info *filename2;\n\t\t\tu8 operation;\n\t\t} path2;\n\t\tstruct {\n\t\t\tconst struct tomoyo_path_info *filename;\n\t\t\tunsigned int mode;\n\t\t\tunsigned int major;\n\t\t\tunsigned int minor;\n\t\t\tu8 operation;\n\t\t} mkdev;\n\t\tstruct {\n\t\t\tconst struct tomoyo_path_info *filename;\n\t\t\tlong unsigned int number;\n\t\t\tu8 operation;\n\t\t} path_number;\n\t\tstruct {\n\t\t\tconst struct tomoyo_path_info *name;\n\t\t} environ;\n\t\tstruct {\n\t\t\tconst __be32 *address;\n\t\t\tu16 port;\n\t\t\tu8 protocol;\n\t\t\tu8 operation;\n\t\t\tbool is_ipv6;\n\t\t} inet_network;\n\t\tstruct {\n\t\t\tconst struct tomoyo_path_info *address;\n\t\t\tu8 protocol;\n\t\t\tu8 operation;\n\t\t} unix_network;\n\t\tstruct {\n\t\t\tconst struct tomoyo_path_info *type;\n\t\t\tconst struct tomoyo_path_info *dir;\n\t\t\tconst struct tomoyo_path_info *dev;\n\t\t\tlong unsigned int flags;\n\t\t\tint need_dev;\n\t\t} mount;\n\t\tstruct {\n\t\t\tconst struct tomoyo_path_info *domainname;\n\t\t} task;\n\t} param;\n\tstruct tomoyo_acl_info *matched_acl;\n\tu8 param_type;\n\tbool granted;\n\tu8 retry;\n\tu8 profile;\n\tu8 mode;\n\tu8 type;\n};\n\nstruct tomoyo_mini_stat {\n\tkuid_t uid;\n\tkgid_t gid;\n\tino_t ino;\n\tumode_t mode;\n\tdev_t dev;\n\tdev_t rdev;\n};\n\nstruct tomoyo_obj_info {\n\tbool validate_done;\n\tbool stat_valid[4];\n\tstruct path path1;\n\tstruct path path2;\n\tstruct tomoyo_mini_stat stat[4];\n\tstruct tomoyo_path_info *symlink_target;\n};\n\nstruct tomoyo_page_dump {\n\tstruct page *page;\n\tchar *data;\n};\n\nstruct tomoyo_execve {\n\tstruct tomoyo_request_info r;\n\tstruct tomoyo_obj_info obj;\n\tstruct linux_binprm *bprm;\n\tconst struct tomoyo_path_info *transition;\n\tstruct tomoyo_page_dump dump;\n\tchar *tmp;\n};\n\nstruct tomoyo_group {\n\tstruct tomoyo_shared_acl_head head;\n\tconst struct tomoyo_path_info *group_name;\n\tstruct list_head member_list;\n};\n\nstruct tomoyo_number_union {\n\tlong unsigned int values[2];\n\tstruct tomoyo_group *group;\n\tu8 value_type[2];\n};\n\nstruct tomoyo_inet_acl {\n\tstruct tomoyo_acl_info head;\n\tu8 protocol;\n\tu8 perm;\n\tstruct tomoyo_ipaddr_union address;\n\tstruct tomoyo_number_union port;\n};\n\nstruct tomoyo_io_buffer {\n\tvoid (*read)(struct tomoyo_io_buffer *);\n\tint (*write)(struct tomoyo_io_buffer *);\n\t__poll_t (*poll)(struct file *, poll_table *);\n\tstruct mutex io_sem;\n\tchar *read_user_buf;\n\tsize_t read_user_buf_avail;\n\tstruct {\n\t\tstruct list_head *ns;\n\t\tstruct list_head *domain;\n\t\tstruct list_head *group;\n\t\tstruct list_head *acl;\n\t\tsize_t avail;\n\t\tunsigned int step;\n\t\tunsigned int query_index;\n\t\tu16 index;\n\t\tu16 cond_index;\n\t\tu8 acl_group_index;\n\t\tu8 cond_step;\n\t\tu8 bit;\n\t\tu8 w_pos;\n\t\tbool eof;\n\t\tbool print_this_domain_only;\n\t\tbool print_transition_related_only;\n\t\tbool print_cond_part;\n\t\tconst char *w[64];\n\t} r;\n\tstruct {\n\t\tstruct tomoyo_policy_namespace *ns;\n\t\tstruct tomoyo_domain_info *domain;\n\t\tsize_t avail;\n\t\tbool is_delete;\n\t} w;\n\tchar *read_buf;\n\tsize_t readbuf_size;\n\tchar *write_buf;\n\tsize_t writebuf_size;\n\tenum tomoyo_securityfs_interface_index type;\n\tu8 users;\n\tstruct list_head list;\n};\n\nstruct tomoyo_log {\n\tstruct list_head list;\n\tchar *log;\n\tint size;\n};\n\nstruct tomoyo_manager {\n\tstruct tomoyo_acl_head head;\n\tconst struct tomoyo_path_info *manager;\n};\n\nstruct tomoyo_name_union {\n\tconst struct tomoyo_path_info *filename;\n\tstruct tomoyo_group *group;\n};\n\nstruct tomoyo_mkdev_acl {\n\tstruct tomoyo_acl_info head;\n\tu8 perm;\n\tstruct tomoyo_name_union name;\n\tstruct tomoyo_number_union mode;\n\tstruct tomoyo_number_union major;\n\tstruct tomoyo_number_union minor;\n};\n\nstruct tomoyo_mount_acl {\n\tstruct tomoyo_acl_info head;\n\tstruct tomoyo_name_union dev_name;\n\tstruct tomoyo_name_union dir_name;\n\tstruct tomoyo_name_union fs_type;\n\tstruct tomoyo_number_union flags;\n};\n\nstruct tomoyo_path_info {\n\tconst char *name;\n\tu32 hash;\n\tu16 const_len;\n\tbool is_dir;\n\tbool is_patterned;\n};\n\nstruct tomoyo_name {\n\tstruct tomoyo_shared_acl_head head;\n\tstruct tomoyo_path_info entry;\n};\n\nstruct tomoyo_number_group {\n\tstruct tomoyo_acl_head head;\n\tstruct tomoyo_number_union number;\n};\n\nstruct tomoyo_path2_acl {\n\tstruct tomoyo_acl_info head;\n\tu8 perm;\n\tstruct tomoyo_name_union name1;\n\tstruct tomoyo_name_union name2;\n};\n\nstruct tomoyo_path_acl {\n\tstruct tomoyo_acl_info head;\n\tu16 perm;\n\tstruct tomoyo_name_union name;\n};\n\nstruct tomoyo_path_group {\n\tstruct tomoyo_acl_head head;\n\tconst struct tomoyo_path_info *member_name;\n};\n\nstruct tomoyo_path_number_acl {\n\tstruct tomoyo_acl_info head;\n\tu8 perm;\n\tstruct tomoyo_name_union name;\n\tstruct tomoyo_number_union number;\n};\n\nstruct tomoyo_profile;\n\nstruct tomoyo_policy_namespace {\n\tstruct tomoyo_profile *profile_ptr[256];\n\tstruct list_head group_list[3];\n\tstruct list_head policy_list[11];\n\tstruct list_head acl_group[256];\n\tstruct list_head namespace_list;\n\tunsigned int profile_version;\n\tconst char *name;\n};\n\nstruct tomoyo_preference {\n\tunsigned int learning_max_entry;\n\tbool enforcing_verbose;\n\tbool learning_verbose;\n\tbool permissive_verbose;\n};\n\nstruct tomoyo_profile {\n\tconst struct tomoyo_path_info *comment;\n\tstruct tomoyo_preference *learning;\n\tstruct tomoyo_preference *permissive;\n\tstruct tomoyo_preference *enforcing;\n\tstruct tomoyo_preference preference;\n\tu8 default_config;\n\tu8 config[42];\n\tunsigned int pref[2];\n};\n\nstruct tomoyo_query {\n\tstruct list_head list;\n\tstruct tomoyo_domain_info *domain;\n\tchar *query;\n\tsize_t query_len;\n\tunsigned int serial;\n\tu8 timer;\n\tu8 answer;\n\tu8 retry;\n};\n\nstruct tomoyo_task {\n\tstruct tomoyo_domain_info *domain_info;\n\tstruct tomoyo_domain_info *old_domain_info;\n};\n\nstruct tomoyo_task_acl {\n\tstruct tomoyo_acl_info head;\n\tconst struct tomoyo_path_info *domainname;\n};\n\nstruct tomoyo_time {\n\tu16 year;\n\tu8 month;\n\tu8 day;\n\tu8 hour;\n\tu8 min;\n\tu8 sec;\n};\n\nstruct tomoyo_transition_control {\n\tstruct tomoyo_acl_head head;\n\tu8 type;\n\tbool is_last_name;\n\tconst struct tomoyo_path_info *domainname;\n\tconst struct tomoyo_path_info *program;\n};\n\nstruct tomoyo_unix_acl {\n\tstruct tomoyo_acl_info head;\n\tu8 protocol;\n\tu8 perm;\n\tstruct tomoyo_name_union name;\n};\n\nstruct topa {\n\tstruct list_head list;\n\tu64 offset;\n\tsize_t size;\n\tint last;\n\tunsigned int z_count;\n};\n\nstruct topa_entry {\n\tu64 end: 1;\n\tu64 rsvd0: 1;\n\tu64 intr: 1;\n\tu64 rsvd1: 1;\n\tu64 stop: 1;\n\tu64 rsvd2: 1;\n\tu64 size: 4;\n\tu64 rsvd3: 2;\n\tu64 base: 40;\n\tu64 rsvd4: 12;\n};\n\nstruct topa_page {\n\tstruct topa_entry table[507];\n\tstruct topa topa;\n};\n\nstruct topo_scan {\n\tstruct cpuinfo_x86 *c;\n\tunsigned int dom_shifts[7];\n\tunsigned int dom_ncpus[7];\n\tunsigned int ebx1_nproc_shift;\n\tu16 amd_nodes_per_pkg;\n\tu16 amd_node_id;\n};\n\nstruct tp_module {\n\tstruct list_head list;\n\tstruct module *mod;\n};\n\nstruct tracepoint_func {\n\tvoid *func;\n\tvoid *data;\n\tint prio;\n};\n\nstruct tp_probes {\n\tstruct callback_head rcu;\n\tstruct tracepoint_func probes[0];\n};\n\nstruct tp_transition_snapshot {\n\tlong unsigned int rcu;\n\tlong unsigned int srcu;\n\tbool ongoing;\n};\n\nstruct tpacket2_hdr {\n\t__u32 tp_status;\n\t__u32 tp_len;\n\t__u32 tp_snaplen;\n\t__u16 tp_mac;\n\t__u16 tp_net;\n\t__u32 tp_sec;\n\t__u32 tp_nsec;\n\t__u16 tp_vlan_tci;\n\t__u16 tp_vlan_tpid;\n\t__u8 tp_padding[4];\n};\n\nstruct tpacket_hdr_variant1 {\n\t__u32 tp_rxhash;\n\t__u32 tp_vlan_tci;\n\t__u16 tp_vlan_tpid;\n\t__u16 tp_padding;\n};\n\nstruct tpacket3_hdr {\n\t__u32 tp_next_offset;\n\t__u32 tp_sec;\n\t__u32 tp_nsec;\n\t__u32 tp_snaplen;\n\t__u32 tp_len;\n\t__u32 tp_status;\n\t__u16 tp_mac;\n\t__u16 tp_net;\n\tunion {\n\t\tstruct tpacket_hdr_variant1 hv1;\n\t};\n\t__u8 tp_padding[8];\n};\n\nstruct tpacket_auxdata {\n\t__u32 tp_status;\n\t__u32 tp_len;\n\t__u32 tp_snaplen;\n\t__u16 tp_mac;\n\t__u16 tp_net;\n\t__u16 tp_vlan_tci;\n\t__u16 tp_vlan_tpid;\n};\n\nstruct tpacket_bd_ts {\n\tunsigned int ts_sec;\n\tunion {\n\t\tunsigned int ts_usec;\n\t\tunsigned int ts_nsec;\n\t};\n};\n\nstruct tpacket_hdr_v1 {\n\t__u32 block_status;\n\t__u32 num_pkts;\n\t__u32 offset_to_first_pkt;\n\t__u32 blk_len;\n\t__u64 seq_num;\n\tstruct tpacket_bd_ts ts_first_pkt;\n\tstruct tpacket_bd_ts ts_last_pkt;\n};\n\nunion tpacket_bd_header_u {\n\tstruct tpacket_hdr_v1 bh1;\n};\n\nstruct tpacket_block_desc {\n\t__u32 version;\n\t__u32 offset_to_priv;\n\tunion tpacket_bd_header_u hdr;\n};\n\nstruct tpacket_hdr {\n\tlong unsigned int tp_status;\n\tunsigned int tp_len;\n\tunsigned int tp_snaplen;\n\tshort unsigned int tp_mac;\n\tshort unsigned int tp_net;\n\tunsigned int tp_sec;\n\tunsigned int tp_usec;\n};\n\nstruct tpacket_req {\n\tunsigned int tp_block_size;\n\tunsigned int tp_block_nr;\n\tunsigned int tp_frame_size;\n\tunsigned int tp_frame_nr;\n};\n\nstruct tpacket_req3 {\n\tunsigned int tp_block_size;\n\tunsigned int tp_block_nr;\n\tunsigned int tp_frame_size;\n\tunsigned int tp_frame_nr;\n\tunsigned int tp_retire_blk_tov;\n\tunsigned int tp_sizeof_priv;\n\tunsigned int tp_feature_req_word;\n};\n\nunion tpacket_req_u {\n\tstruct tpacket_req req;\n\tstruct tpacket_req3 req3;\n};\n\nstruct tpacket_rollover_stats {\n\t__u64 tp_all;\n\t__u64 tp_huge;\n\t__u64 tp_failed;\n};\n\nunion tpacket_uhdr {\n\tstruct tpacket_hdr *h1;\n\tstruct tpacket2_hdr *h2;\n\tstruct tpacket3_hdr *h3;\n\tvoid *raw;\n};\n\nstruct tpm1_get_random_out {\n\t__be32 rng_data_len;\n\tu8 rng_data[128];\n};\n\nstruct tpm2_auth {\n\tu32 handle;\n\tu32 session;\n\tu8 our_nonce[32];\n\tu8 tpm_nonce[32];\n\tunion {\n\t\tu8 salt[32];\n\t\tu8 scratch[32];\n\t};\n\tu8 session_key[32];\n\tu8 passphrase[32];\n\tint passphrase_len;\n\tstruct crypto_aes_ctx aes_ctx;\n\tu8 attrs;\n\t__be32 ordinal;\n\tu32 name_h[3];\n\tu8 name[198];\n};\n\nstruct tpm2_cap_handles {\n\tu8 more_data;\n\t__be32 capability;\n\t__be32 count;\n\t__be32 handles[0];\n} __attribute__((packed));\n\nstruct tpm2_context {\n\t__be64 sequence;\n\t__be32 saved_handle;\n\t__be32 hierarchy;\n\t__be16 blob_size;\n} __attribute__((packed));\n\nstruct tpm2_crb_pluton {\n\tu64 start_addr;\n\tu64 reply_addr;\n};\n\nstruct tpm2_crb_smc {\n\tu32 interrupt;\n\tu8 interrupt_flags;\n\tu8 op_flags;\n\tu16 reserved2;\n\tu32 smc_func_id;\n};\n\nstruct tpm2_get_cap_out {\n\tu8 more_data;\n\t__be32 subcap_id;\n\t__be32 property_cnt;\n\t__be32 property_id;\n\t__be32 value;\n} __attribute__((packed));\n\nstruct tpm2_get_random_out {\n\t__be16 size;\n\tu8 buffer[128];\n};\n\nstruct tpm2_hash {\n\tunsigned int crypto_id;\n\tunsigned int tpm_id;\n};\n\nstruct tpm2_key_context {\n\tu32 parent;\n\tconst u8 *pub;\n\tu32 pub_len;\n\tconst u8 *priv;\n\tu32 priv_len;\n};\n\nstruct tpm2_pcr_read_out {\n\t__be32 update_cnt;\n\t__be32 pcr_selects_cnt;\n\t__be16 hash_alg;\n\tu8 pcr_select_size;\n\tu8 pcr_select[3];\n\t__be32 digests_cnt;\n\t__be16 digest_size;\n\tu8 digest[0];\n} __attribute__((packed));\n\nstruct tpm2_pcr_selection {\n\t__be16 hash_alg;\n\tu8 size_of_select;\n\tu8 pcr_select[3];\n};\n\nstruct tpm_bank_info {\n\tu16 alg_id;\n\tu16 digest_size;\n\tu16 crypto_id;\n};\n\nstruct tpm_bios_log {\n\tvoid *bios_event_log;\n\tvoid *bios_event_log_end;\n};\n\nstruct tpm_buf {\n\tu32 flags;\n\tu32 length;\n\tu8 *data;\n\tu8 handles;\n};\n\nstruct tpm_chip_seqops {\n\tstruct tpm_chip *chip;\n\tconst struct seq_operations *seqops;\n};\n\nstruct tpm_space {\n\tu32 context_tbl[3];\n\tu8 *context_buf;\n\tu32 session_tbl[3];\n\tu8 *session_buf;\n\tu32 buf_size;\n};\n\nstruct tpm_class_ops;\n\nstruct tpm_chip {\n\tstruct device dev;\n\tstruct device devs;\n\tstruct cdev cdev;\n\tstruct cdev cdevs;\n\tstruct rw_semaphore ops_sem;\n\tconst struct tpm_class_ops *ops;\n\tstruct tpm_bios_log log;\n\tstruct tpm_chip_seqops bin_log_seqops;\n\tstruct tpm_chip_seqops ascii_log_seqops;\n\tunsigned int flags;\n\tint dev_num;\n\tlong unsigned int is_open;\n\tchar hwrng_name[64];\n\tstruct hwrng hwrng;\n\tstruct mutex tpm_mutex;\n\tlong unsigned int timeout_a;\n\tlong unsigned int timeout_b;\n\tlong unsigned int timeout_c;\n\tlong unsigned int timeout_d;\n\tbool timeout_adjusted;\n\tlong unsigned int duration[4];\n\tbool duration_adjusted;\n\tstruct dentry *bios_dir[3];\n\tconst struct attribute_group *groups[8];\n\tunsigned int groups_cnt;\n\tu32 nr_allocated_banks;\n\tstruct tpm_bank_info *allocated_banks;\n\tacpi_handle acpi_dev_handle;\n\tchar ppi_version[4];\n\tstruct tpm_space work_space;\n\tu32 last_cc;\n\tu32 nr_commands;\n\tu32 *cc_attrs_tbl;\n\tint locality;\n};\n\nstruct tpm_class_ops {\n\tunsigned int flags;\n\tconst u8 req_complete_mask;\n\tconst u8 req_complete_val;\n\tbool (*req_canceled)(struct tpm_chip *, u8);\n\tint (*recv)(struct tpm_chip *, u8 *, size_t);\n\tint (*send)(struct tpm_chip *, u8 *, size_t);\n\tvoid (*cancel)(struct tpm_chip *);\n\tu8 (*status)(struct tpm_chip *);\n\tvoid (*update_timeouts)(struct tpm_chip *, long unsigned int *);\n\tvoid (*update_durations)(struct tpm_chip *, long unsigned int *);\n\tint (*go_idle)(struct tpm_chip *);\n\tint (*cmd_ready)(struct tpm_chip *);\n\tint (*request_locality)(struct tpm_chip *, int);\n\tint (*relinquish_locality)(struct tpm_chip *, int);\n\tvoid (*clk_enable)(struct tpm_chip *, bool);\n};\n\nstruct tpm_digests {\n\tunsigned char encauth[20];\n\tunsigned char pubauth[20];\n\tunsigned char xorwork[40];\n\tunsigned char xorhash[20];\n\tunsigned char nonceodd[20];\n};\n\nstruct tpm_header {\n\t__be16 tag;\n\t__be32 length;\n\tunion {\n\t\t__be32 ordinal;\n\t\t__be32 return_code;\n\t};\n} __attribute__((packed));\n\nstruct tpm_info {\n\tstruct resource res;\n\tint irq;\n};\n\nstruct tpm_pcr_attr {\n\tint alg_id;\n\tint pcr;\n\tstruct device_attribute attr;\n};\n\nstruct tpm_readpubek_out {\n\tu8 algorithm[4];\n\tu8 encscheme[2];\n\tu8 sigscheme[2];\n\t__be32 paramsize;\n\tu8 parameters[12];\n\t__be32 keysize;\n\tu8 modulus[256];\n\tu8 checksum[20];\n};\n\nstruct tpm_tis_phy_ops;\n\nstruct tpm_tis_data {\n\tstruct tpm_chip *chip;\n\tu16 manufacturer_id;\n\tstruct mutex locality_count_mutex;\n\tunsigned int locality_count;\n\tint locality;\n\tint irq;\n\tstruct work_struct free_irq_work;\n\tlong unsigned int last_unhandled_irq;\n\tunsigned int unhandled_irqs;\n\tunsigned int int_mask;\n\tlong unsigned int flags;\n\tvoid *ilb_base_addr;\n\tu16 clkrun_enabled;\n\twait_queue_head_t int_queue;\n\twait_queue_head_t read_queue;\n\tconst struct tpm_tis_phy_ops *phy_ops;\n\tshort unsigned int rng_quality;\n\tunsigned int timeout_min;\n\tunsigned int timeout_max;\n};\n\nstruct tpm_tis_phy_ops {\n\tint (*read_bytes)(struct tpm_tis_data *, u32, u16, u8 *, enum tpm_tis_io_mode);\n\tint (*write_bytes)(struct tpm_tis_data *, u32, u16, const u8 *, enum tpm_tis_io_mode);\n\tint (*verify_crc)(struct tpm_tis_data *, size_t, const u8 *);\n};\n\nstruct tpm_tis_tcg_phy {\n\tstruct tpm_tis_data priv;\n\tvoid *iobase;\n};\n\nstruct tpmrm_priv {\n\tstruct file_priv priv;\n\tstruct tpm_space space;\n};\n\nstruct tps65086_regulator_config;\n\nstruct tps65086 {\n\tstruct device *dev;\n\tstruct regmap *regmap;\n\tunsigned int chip_id;\n\tconst struct tps65086_regulator_config *reg_config;\n\tint irq;\n\tstruct regmap_irq_chip_data *irq_data;\n};\n\nstruct tps65090 {\n\tstruct device *dev;\n\tstruct regmap *rmap;\n\tstruct regmap_irq_chip_data *irq_data;\n};\n\nstruct tps65090_regulator_plat_data;\n\nstruct tps65090_platform_data {\n\tint irq_base;\n\tchar **supplied_to;\n\tsize_t num_supplicants;\n\tint enable_low_current_chrg;\n\tstruct tps65090_regulator_plat_data *reg_pdata[12];\n};\n\nstruct tps65090_regulator_plat_data {\n\tstruct regulator_init_data *reg_init_data;\n\tbool enable_ext_control;\n\tstruct gpio_desc *gpiod;\n\tbool overcurrent_wait_valid;\n\tint overcurrent_wait;\n};\n\nstruct tps6586x {\n\tstruct device *dev;\n\tstruct i2c_client *client;\n\tstruct regmap *regmap;\n\tint version;\n\tint irq;\n\tstruct irq_chip irq_chip;\n\tstruct mutex irq_lock;\n\tint irq_base;\n\tu32 irq_en;\n\tu8 mask_reg[5];\n\tstruct irq_domain *irq_domain;\n};\n\nstruct tps6586x_gpio {\n\tstruct gpio_chip gpio_chip;\n\tstruct device *parent;\n};\n\nstruct tps6586x_irq_data {\n\tu8 mask_reg;\n\tu8 mask_mask;\n};\n\nstruct tps6586x_subdev_info;\n\nstruct tps6586x_platform_data {\n\tint num_subdevs;\n\tstruct tps6586x_subdev_info *subdevs;\n\tint gpio_base;\n\tint irq_base;\n\tbool pm_off;\n\tstruct regulator_init_data *reg_init_data[15];\n};\n\nstruct tps6586x_subdev_info {\n\tint id;\n\tconst char *name;\n\tvoid *platform_data;\n\tstruct device_node *of_node;\n};\n\nstruct tps65910_board;\n\nstruct tps65910 {\n\tstruct device *dev;\n\tstruct i2c_client *i2c_client;\n\tstruct regmap *regmap;\n\tlong unsigned int id;\n\tstruct tps65910_board *of_plat_data;\n\tint chip_irq;\n\tstruct regmap_irq_chip_data *irq_data;\n};\n\nstruct tps65910_sleep_keepon_data {\n\tunsigned int therm_keepon: 1;\n\tunsigned int clkout32k_keepon: 1;\n\tunsigned int i2chs_keepon: 1;\n};\n\nstruct tps65910_board {\n\tint gpio_base;\n\tint irq;\n\tint irq_base;\n\tint vmbch_threshold;\n\tint vmbch2_threshold;\n\tbool en_ck32k_xtal;\n\tbool en_dev_slp;\n\tbool pm_off;\n\tstruct tps65910_sleep_keepon_data slp_keepon;\n\tbool en_gpio_sleep[9];\n\tlong unsigned int regulator_ext_sleep_control[14];\n\tstruct regulator_init_data *tps65910_pmic_init_data[14];\n};\n\nstruct tps65910_gpio {\n\tstruct gpio_chip gpio_chip;\n\tstruct tps65910 *tps65910;\n};\n\nstruct tps65910_platform_data {\n\tint irq;\n\tint irq_base;\n};\n\nstruct tps65912 {\n\tstruct device *dev;\n\tstruct regmap *regmap;\n\tint irq;\n\tstruct regmap_irq_chip_data *irq_data;\n};\n\nstruct tps68470_pmic_opregion {\n\tstruct mutex lock;\n\tstruct regmap *regmap;\n};\n\nstruct tps68470_pmic_table {\n\tu32 address;\n\tu32 reg;\n\tu32 bitmask;\n};\n\nstruct trace_pid_list;\n\nstruct trace_options;\n\nstruct trace_func_repeats;\n\nstruct trace_array {\n\tstruct list_head list;\n\tchar *name;\n\tstruct array_buffer array_buffer;\n\tstruct array_buffer max_buffer;\n\tbool allocated_snapshot;\n\tspinlock_t snapshot_trigger_lock;\n\tunsigned int snapshot;\n\tunsigned int mapped;\n\tlong unsigned int max_latency;\n\tstruct dentry *d_max_latency;\n\tstruct work_struct fsnotify_work;\n\tstruct irq_work fsnotify_irqwork;\n\tstruct trace_pid_list *filtered_pids;\n\tstruct trace_pid_list *filtered_no_pids;\n\tarch_spinlock_t max_lock;\n\tint buffer_disabled;\n\tint sys_refcount_enter;\n\tint sys_refcount_exit;\n\tstruct trace_event_file *enter_syscall_files[463];\n\tstruct trace_event_file *exit_syscall_files[463];\n\tint stop_count;\n\tint clock_id;\n\tint nr_topts;\n\tbool clear_trace;\n\tint buffer_percent;\n\tunsigned int n_err_log_entries;\n\tstruct tracer *current_trace;\n\tunsigned int trace_flags;\n\tunsigned char trace_flags_index[32];\n\tunsigned int flags;\n\traw_spinlock_t start_lock;\n\tconst char *system_names;\n\tstruct list_head err_log;\n\tstruct dentry *dir;\n\tstruct dentry *options;\n\tstruct dentry *percpu_dir;\n\tstruct eventfs_inode *event_dir;\n\tstruct trace_options *topts;\n\tstruct list_head systems;\n\tstruct list_head events;\n\tstruct trace_event_file *trace_marker_file;\n\tcpumask_var_t tracing_cpumask;\n\tcpumask_var_t pipe_cpumask;\n\tint ref;\n\tint trace_ref;\n\tstruct ftrace_ops *ops;\n\tstruct trace_pid_list *function_pids;\n\tstruct trace_pid_list *function_no_pids;\n\tstruct fgraph_ops *gops;\n\tstruct list_head func_probes;\n\tstruct list_head mod_trace;\n\tstruct list_head mod_notrace;\n\tint function_enabled;\n\tint no_filter_buffering_ref;\n\tstruct list_head hist_vars;\n\tstruct cond_snapshot *cond_snapshot;\n\tstruct trace_func_repeats *last_func_repeats;\n\tbool ring_buffer_expanded;\n};\n\nstruct trace_array_cpu {\n\tatomic_t disabled;\n\tvoid *buffer_page;\n\tlong unsigned int entries;\n\tlong unsigned int saved_latency;\n\tlong unsigned int critical_start;\n\tlong unsigned int critical_end;\n\tlong unsigned int critical_sequence;\n\tlong unsigned int nice;\n\tlong unsigned int policy;\n\tlong unsigned int rt_priority;\n\tlong unsigned int skipped_entries;\n\tu64 preempt_timestamp;\n\tpid_t pid;\n\tkuid_t uid;\n\tchar comm[16];\n\tint ftrace_ignore_pid;\n\tbool ignore_pid;\n};\n\nstruct trace_bprintk_fmt {\n\tstruct list_head list;\n\tconst char *fmt;\n};\n\nstruct trace_buffer {\n\tunsigned int flags;\n\tint cpus;\n\tatomic_t record_disabled;\n\tatomic_t resizing;\n\tcpumask_var_t cpumask;\n\tstruct lock_class_key *reader_lock_key;\n\tstruct mutex mutex;\n\tstruct ring_buffer_per_cpu **buffers;\n\tstruct hlist_node node;\n\tu64 (*clock)(void);\n\tstruct rb_irq_work irq_work;\n\tbool time_stamp_abs;\n\tunsigned int subbuf_size;\n\tunsigned int subbuf_order;\n\tunsigned int max_data_size;\n};\n\nstruct trace_buffer_meta {\n\t__u32 meta_page_size;\n\t__u32 meta_struct_len;\n\t__u32 subbuf_size;\n\t__u32 nr_subbufs;\n\tstruct {\n\t\t__u64 lost_events;\n\t\t__u32 id;\n\t\t__u32 read;\n\t} reader;\n\t__u64 flags;\n\t__u64 entries;\n\t__u64 overrun;\n\t__u64 read;\n\t__u64 Reserved1;\n\t__u64 Reserved2;\n};\n\nstruct trace_buffer_struct {\n\tint nesting;\n\tchar buffer[4096];\n};\n\nstruct trace_probe_event;\n\nstruct trace_probe {\n\tstruct list_head list;\n\tstruct trace_probe_event *event;\n\tssize_t size;\n\tunsigned int nr_args;\n\tstruct probe_entry_arg *entry_arg;\n\tstruct probe_arg args[0];\n};\n\nstruct trace_eprobe {\n\tconst char *event_system;\n\tconst char *event_name;\n\tchar *filter_str;\n\tstruct trace_event_call *event;\n\tstruct dyn_event devent;\n\tstruct trace_probe tp;\n};\n\nstruct trace_eval_map {\n\tconst char *system;\n\tconst char *eval_string;\n\tlong unsigned int eval_value;\n};\n\nstruct trace_event_data_offsets_ack_update_msk {};\n\nstruct trace_event_data_offsets_aer_event {\n\tu32 dev_name;\n\tconst void *dev_name_ptr_;\n};\n\nstruct trace_event_data_offsets_alarm_class {};\n\nstruct trace_event_data_offsets_alarmtimer_suspend {};\n\nstruct trace_event_data_offsets_alloc_vmap_area {};\n\nstruct trace_event_data_offsets_amd_pstate_perf {};\n\nstruct trace_event_data_offsets_arm_event {};\n\nstruct trace_event_data_offsets_ata_bmdma_status {};\n\nstruct trace_event_data_offsets_ata_eh_action_template {};\n\nstruct trace_event_data_offsets_ata_eh_link_autopsy {};\n\nstruct trace_event_data_offsets_ata_eh_link_autopsy_qc {};\n\nstruct trace_event_data_offsets_ata_exec_command_template {};\n\nstruct trace_event_data_offsets_ata_link_reset_begin_template {};\n\nstruct trace_event_data_offsets_ata_link_reset_end_template {};\n\nstruct trace_event_data_offsets_ata_port_eh_begin_template {};\n\nstruct trace_event_data_offsets_ata_qc_complete_template {};\n\nstruct trace_event_data_offsets_ata_qc_issue_template {};\n\nstruct trace_event_data_offsets_ata_sff_hsm_template {};\n\nstruct trace_event_data_offsets_ata_sff_template {};\n\nstruct trace_event_data_offsets_ata_tf_load {};\n\nstruct trace_event_data_offsets_ata_transfer_data_template {};\n\nstruct trace_event_data_offsets_balance_dirty_pages {};\n\nstruct trace_event_data_offsets_bdi_dirty_ratelimit {};\n\nstruct trace_event_data_offsets_block_bio {};\n\nstruct trace_event_data_offsets_block_bio_complete {};\n\nstruct trace_event_data_offsets_block_bio_remap {};\n\nstruct trace_event_data_offsets_block_buffer {};\n\nstruct trace_event_data_offsets_block_plug {};\n\nstruct trace_event_data_offsets_block_rq {\n\tu32 cmd;\n\tconst void *cmd_ptr_;\n};\n\nstruct trace_event_data_offsets_block_rq_completion {\n\tu32 cmd;\n\tconst void *cmd_ptr_;\n};\n\nstruct trace_event_data_offsets_block_rq_remap {};\n\nstruct trace_event_data_offsets_block_rq_requeue {\n\tu32 cmd;\n\tconst void *cmd_ptr_;\n};\n\nstruct trace_event_data_offsets_block_split {};\n\nstruct trace_event_data_offsets_block_unplug {};\n\nstruct trace_event_data_offsets_bpf_test_finish {};\n\nstruct trace_event_data_offsets_bpf_trace_printk {\n\tu32 bpf_string;\n\tconst void *bpf_string_ptr_;\n};\n\nstruct trace_event_data_offsets_bpf_trigger_tp {};\n\nstruct trace_event_data_offsets_bpf_xdp_link_attach_failed {\n\tu32 msg;\n\tconst void *msg_ptr_;\n};\n\nstruct trace_event_data_offsets_br_fdb_add {\n\tu32 dev;\n\tconst void *dev_ptr_;\n};\n\nstruct trace_event_data_offsets_br_fdb_external_learn_add {\n\tu32 br_dev;\n\tconst void *br_dev_ptr_;\n\tu32 dev;\n\tconst void *dev_ptr_;\n};\n\nstruct trace_event_data_offsets_br_fdb_update {\n\tu32 br_dev;\n\tconst void *br_dev_ptr_;\n\tu32 dev;\n\tconst void *dev_ptr_;\n};\n\nstruct trace_event_data_offsets_br_mdb_full {\n\tu32 dev;\n\tconst void *dev_ptr_;\n};\n\nstruct trace_event_data_offsets_cache_tag_flush {\n\tu32 iommu;\n\tconst void *iommu_ptr_;\n\tu32 dev;\n\tconst void *dev_ptr_;\n};\n\nstruct trace_event_data_offsets_cache_tag_log {\n\tu32 iommu;\n\tconst void *iommu_ptr_;\n\tu32 dev;\n\tconst void *dev_ptr_;\n};\n\nstruct trace_event_data_offsets_cdev_update {\n\tu32 type;\n\tconst void *type_ptr_;\n};\n\nstruct trace_event_data_offsets_cgroup {\n\tu32 path;\n\tconst void *path_ptr_;\n};\n\nstruct trace_event_data_offsets_cgroup_event {\n\tu32 path;\n\tconst void *path_ptr_;\n};\n\nstruct trace_event_data_offsets_cgroup_migrate {\n\tu32 dst_path;\n\tconst void *dst_path_ptr_;\n\tu32 comm;\n\tconst void *comm_ptr_;\n};\n\nstruct trace_event_data_offsets_cgroup_root {\n\tu32 name;\n\tconst void *name_ptr_;\n};\n\nstruct trace_event_data_offsets_cgroup_rstat {};\n\nstruct trace_event_data_offsets_clk {\n\tu32 name;\n\tconst void *name_ptr_;\n};\n\nstruct trace_event_data_offsets_clk_duty_cycle {\n\tu32 name;\n\tconst void *name_ptr_;\n};\n\nstruct trace_event_data_offsets_clk_parent {\n\tu32 name;\n\tconst void *name_ptr_;\n\tu32 pname;\n\tconst void *pname_ptr_;\n};\n\nstruct trace_event_data_offsets_clk_phase {\n\tu32 name;\n\tconst void *name_ptr_;\n};\n\nstruct trace_event_data_offsets_clk_rate {\n\tu32 name;\n\tconst void *name_ptr_;\n};\n\nstruct trace_event_data_offsets_clk_rate_range {\n\tu32 name;\n\tconst void *name_ptr_;\n};\n\nstruct trace_event_data_offsets_clk_rate_request {\n\tu32 name;\n\tconst void *name_ptr_;\n\tu32 pname;\n\tconst void *pname_ptr_;\n};\n\nstruct trace_event_data_offsets_clock {\n\tu32 name;\n\tconst void *name_ptr_;\n};\n\nstruct trace_event_data_offsets_compact_retry {};\n\nstruct trace_event_data_offsets_console {\n\tu32 msg;\n\tconst void *msg_ptr_;\n};\n\nstruct trace_event_data_offsets_consume_skb {};\n\nstruct trace_event_data_offsets_contention_begin {};\n\nstruct trace_event_data_offsets_contention_end {};\n\nstruct trace_event_data_offsets_context_tracking_user {};\n\nstruct trace_event_data_offsets_cpu {};\n\nstruct trace_event_data_offsets_cpu_frequency_limits {};\n\nstruct trace_event_data_offsets_cpu_idle_miss {};\n\nstruct trace_event_data_offsets_cpu_latency_qos_request {};\n\nstruct trace_event_data_offsets_cpuhp_enter {};\n\nstruct trace_event_data_offsets_cpuhp_exit {};\n\nstruct trace_event_data_offsets_cpuhp_multi_enter {};\n\nstruct trace_event_data_offsets_cros_ec_request_done {};\n\nstruct trace_event_data_offsets_cros_ec_request_start {};\n\nstruct trace_event_data_offsets_csd_function {};\n\nstruct trace_event_data_offsets_csd_queue_cpu {};\n\nstruct trace_event_data_offsets_dax_insert_mapping {};\n\nstruct trace_event_data_offsets_dax_pmd_fault_class {};\n\nstruct trace_event_data_offsets_dax_pmd_insert_mapping_class {};\n\nstruct trace_event_data_offsets_dax_pmd_load_hole_class {};\n\nstruct trace_event_data_offsets_dax_pte_fault_class {};\n\nstruct trace_event_data_offsets_dax_writeback_one {};\n\nstruct trace_event_data_offsets_dax_writeback_range_class {};\n\nstruct trace_event_data_offsets_dev_pm_qos_request {\n\tu32 name;\n\tconst void *name_ptr_;\n};\n\nstruct trace_event_data_offsets_devfreq_frequency {\n\tu32 dev_name;\n\tconst void *dev_name_ptr_;\n};\n\nstruct trace_event_data_offsets_devfreq_monitor {\n\tu32 dev_name;\n\tconst void *dev_name_ptr_;\n};\n\nstruct trace_event_data_offsets_device_pm_callback_end {\n\tu32 device;\n\tconst void *device_ptr_;\n\tu32 driver;\n\tconst void *driver_ptr_;\n};\n\nstruct trace_event_data_offsets_device_pm_callback_start {\n\tu32 device;\n\tconst void *device_ptr_;\n\tu32 driver;\n\tconst void *driver_ptr_;\n\tu32 parent;\n\tconst void *parent_ptr_;\n\tu32 pm_ops;\n\tconst void *pm_ops_ptr_;\n};\n\nstruct trace_event_data_offsets_devlink_health_recover_aborted {\n\tu32 bus_name;\n\tconst void *bus_name_ptr_;\n\tu32 dev_name;\n\tconst void *dev_name_ptr_;\n\tu32 driver_name;\n\tconst void *driver_name_ptr_;\n\tu32 reporter_name;\n\tconst void *reporter_name_ptr_;\n};\n\nstruct trace_event_data_offsets_devlink_health_report {\n\tu32 bus_name;\n\tconst void *bus_name_ptr_;\n\tu32 dev_name;\n\tconst void *dev_name_ptr_;\n\tu32 driver_name;\n\tconst void *driver_name_ptr_;\n\tu32 reporter_name;\n\tconst void *reporter_name_ptr_;\n\tu32 msg;\n\tconst void *msg_ptr_;\n};\n\nstruct trace_event_data_offsets_devlink_health_reporter_state_update {\n\tu32 bus_name;\n\tconst void *bus_name_ptr_;\n\tu32 dev_name;\n\tconst void *dev_name_ptr_;\n\tu32 driver_name;\n\tconst void *driver_name_ptr_;\n\tu32 reporter_name;\n\tconst void *reporter_name_ptr_;\n};\n\nstruct trace_event_data_offsets_devlink_hwerr {\n\tu32 bus_name;\n\tconst void *bus_name_ptr_;\n\tu32 dev_name;\n\tconst void *dev_name_ptr_;\n\tu32 driver_name;\n\tconst void *driver_name_ptr_;\n\tu32 msg;\n\tconst void *msg_ptr_;\n};\n\nstruct trace_event_data_offsets_devlink_hwmsg {\n\tu32 bus_name;\n\tconst void *bus_name_ptr_;\n\tu32 dev_name;\n\tconst void *dev_name_ptr_;\n\tu32 driver_name;\n\tconst void *driver_name_ptr_;\n\tu32 buf;\n\tconst void *buf_ptr_;\n};\n\nstruct trace_event_data_offsets_devlink_trap_report {\n\tu32 bus_name;\n\tconst void *bus_name_ptr_;\n\tu32 dev_name;\n\tconst void *dev_name_ptr_;\n\tu32 driver_name;\n\tconst void *driver_name_ptr_;\n\tu32 trap_name;\n\tconst void *trap_name_ptr_;\n\tu32 trap_group_name;\n\tconst void *trap_group_name_ptr_;\n};\n\nstruct trace_event_data_offsets_devres {\n\tu32 devname;\n\tconst void *devname_ptr_;\n\tu32 name;\n\tconst void *name_ptr_;\n};\n\nstruct trace_event_data_offsets_dma_fence {\n\tu32 driver;\n\tconst void *driver_ptr_;\n\tu32 timeline;\n\tconst void *timeline_ptr_;\n};\n\nstruct trace_event_data_offsets_dql_stall_detected {};\n\nstruct trace_event_data_offsets_drm_vblank_event {};\n\nstruct trace_event_data_offsets_drm_vblank_event_delivered {};\n\nstruct trace_event_data_offsets_drm_vblank_event_queued {};\n\nstruct trace_event_data_offsets_emulate_vsyscall {};\n\nstruct trace_event_data_offsets_error_da_monitor_id {};\n\nstruct trace_event_data_offsets_error_report_template {};\n\nstruct trace_event_data_offsets_event_da_monitor_id {};\n\nstruct trace_event_data_offsets_exit_mmap {};\n\nstruct trace_event_data_offsets_ext4__bitmap_load {};\n\nstruct trace_event_data_offsets_ext4__es_extent {};\n\nstruct trace_event_data_offsets_ext4__es_shrink_enter {};\n\nstruct trace_event_data_offsets_ext4__fallocate_mode {};\n\nstruct trace_event_data_offsets_ext4__folio_op {};\n\nstruct trace_event_data_offsets_ext4__map_blocks_enter {};\n\nstruct trace_event_data_offsets_ext4__map_blocks_exit {};\n\nstruct trace_event_data_offsets_ext4__mb_new_pa {};\n\nstruct trace_event_data_offsets_ext4__mballoc {};\n\nstruct trace_event_data_offsets_ext4__trim {};\n\nstruct trace_event_data_offsets_ext4__truncate {};\n\nstruct trace_event_data_offsets_ext4__write_begin {};\n\nstruct trace_event_data_offsets_ext4__write_end {};\n\nstruct trace_event_data_offsets_ext4_alloc_da_blocks {};\n\nstruct trace_event_data_offsets_ext4_allocate_blocks {};\n\nstruct trace_event_data_offsets_ext4_allocate_inode {};\n\nstruct trace_event_data_offsets_ext4_begin_ordered_truncate {};\n\nstruct trace_event_data_offsets_ext4_collapse_range {};\n\nstruct trace_event_data_offsets_ext4_da_release_space {};\n\nstruct trace_event_data_offsets_ext4_da_reserve_space {};\n\nstruct trace_event_data_offsets_ext4_da_update_reserve_space {};\n\nstruct trace_event_data_offsets_ext4_da_write_pages {};\n\nstruct trace_event_data_offsets_ext4_da_write_pages_extent {};\n\nstruct trace_event_data_offsets_ext4_discard_blocks {};\n\nstruct trace_event_data_offsets_ext4_discard_preallocations {};\n\nstruct trace_event_data_offsets_ext4_drop_inode {};\n\nstruct trace_event_data_offsets_ext4_error {};\n\nstruct trace_event_data_offsets_ext4_es_find_extent_range_enter {};\n\nstruct trace_event_data_offsets_ext4_es_find_extent_range_exit {};\n\nstruct trace_event_data_offsets_ext4_es_insert_delayed_extent {};\n\nstruct trace_event_data_offsets_ext4_es_lookup_extent_enter {};\n\nstruct trace_event_data_offsets_ext4_es_lookup_extent_exit {};\n\nstruct trace_event_data_offsets_ext4_es_remove_extent {};\n\nstruct trace_event_data_offsets_ext4_es_shrink {};\n\nstruct trace_event_data_offsets_ext4_es_shrink_scan_exit {};\n\nstruct trace_event_data_offsets_ext4_evict_inode {};\n\nstruct trace_event_data_offsets_ext4_ext_convert_to_initialized_enter {};\n\nstruct trace_event_data_offsets_ext4_ext_convert_to_initialized_fastpath {};\n\nstruct trace_event_data_offsets_ext4_ext_handle_unwritten_extents {};\n\nstruct trace_event_data_offsets_ext4_ext_load_extent {};\n\nstruct trace_event_data_offsets_ext4_ext_remove_space {};\n\nstruct trace_event_data_offsets_ext4_ext_remove_space_done {};\n\nstruct trace_event_data_offsets_ext4_ext_rm_idx {};\n\nstruct trace_event_data_offsets_ext4_ext_rm_leaf {};\n\nstruct trace_event_data_offsets_ext4_ext_show_extent {};\n\nstruct trace_event_data_offsets_ext4_fallocate_exit {};\n\nstruct trace_event_data_offsets_ext4_fc_cleanup {};\n\nstruct trace_event_data_offsets_ext4_fc_commit_start {};\n\nstruct trace_event_data_offsets_ext4_fc_commit_stop {};\n\nstruct trace_event_data_offsets_ext4_fc_replay {};\n\nstruct trace_event_data_offsets_ext4_fc_replay_scan {};\n\nstruct trace_event_data_offsets_ext4_fc_stats {};\n\nstruct trace_event_data_offsets_ext4_fc_track_dentry {};\n\nstruct trace_event_data_offsets_ext4_fc_track_inode {};\n\nstruct trace_event_data_offsets_ext4_fc_track_range {};\n\nstruct trace_event_data_offsets_ext4_forget {};\n\nstruct trace_event_data_offsets_ext4_free_blocks {};\n\nstruct trace_event_data_offsets_ext4_free_inode {};\n\nstruct trace_event_data_offsets_ext4_fsmap_class {};\n\nstruct trace_event_data_offsets_ext4_get_implied_cluster_alloc_exit {};\n\nstruct trace_event_data_offsets_ext4_getfsmap_class {};\n\nstruct trace_event_data_offsets_ext4_insert_range {};\n\nstruct trace_event_data_offsets_ext4_invalidate_folio_op {};\n\nstruct trace_event_data_offsets_ext4_journal_start_inode {};\n\nstruct trace_event_data_offsets_ext4_journal_start_reserved {};\n\nstruct trace_event_data_offsets_ext4_journal_start_sb {};\n\nstruct trace_event_data_offsets_ext4_lazy_itable_init {};\n\nstruct trace_event_data_offsets_ext4_load_inode {};\n\nstruct trace_event_data_offsets_ext4_mark_inode_dirty {};\n\nstruct trace_event_data_offsets_ext4_mb_discard_preallocations {};\n\nstruct trace_event_data_offsets_ext4_mb_release_group_pa {};\n\nstruct trace_event_data_offsets_ext4_mb_release_inode_pa {};\n\nstruct trace_event_data_offsets_ext4_mballoc_alloc {};\n\nstruct trace_event_data_offsets_ext4_mballoc_prealloc {};\n\nstruct trace_event_data_offsets_ext4_nfs_commit_metadata {};\n\nstruct trace_event_data_offsets_ext4_other_inode_update_time {};\n\nstruct trace_event_data_offsets_ext4_prefetch_bitmaps {};\n\nstruct trace_event_data_offsets_ext4_read_block_bitmap_load {};\n\nstruct trace_event_data_offsets_ext4_remove_blocks {};\n\nstruct trace_event_data_offsets_ext4_request_blocks {};\n\nstruct trace_event_data_offsets_ext4_request_inode {};\n\nstruct trace_event_data_offsets_ext4_shutdown {};\n\nstruct trace_event_data_offsets_ext4_sync_file_enter {};\n\nstruct trace_event_data_offsets_ext4_sync_file_exit {};\n\nstruct trace_event_data_offsets_ext4_sync_fs {};\n\nstruct trace_event_data_offsets_ext4_unlink_enter {};\n\nstruct trace_event_data_offsets_ext4_unlink_exit {};\n\nstruct trace_event_data_offsets_ext4_update_sb {};\n\nstruct trace_event_data_offsets_ext4_writepages {};\n\nstruct trace_event_data_offsets_ext4_writepages_result {};\n\nstruct trace_event_data_offsets_extlog_mem_event {\n\tu32 fru_text;\n\tconst void *fru_text_ptr_;\n};\n\nstruct trace_event_data_offsets_fdb_delete {\n\tu32 br_dev;\n\tconst void *br_dev_ptr_;\n\tu32 dev;\n\tconst void *dev_ptr_;\n};\n\nstruct trace_event_data_offsets_fib6_table_lookup {};\n\nstruct trace_event_data_offsets_fib_table_lookup {};\n\nstruct trace_event_data_offsets_file_check_and_advance_wb_err {};\n\nstruct trace_event_data_offsets_filelock_lease {};\n\nstruct trace_event_data_offsets_filelock_lock {};\n\nstruct trace_event_data_offsets_filemap_set_wb_err {};\n\nstruct trace_event_data_offsets_finish_task_reaping {};\n\nstruct trace_event_data_offsets_flush_foreign {};\n\nstruct trace_event_data_offsets_free_vmap_area_noflush {};\n\nstruct trace_event_data_offsets_generic_add_lease {};\n\nstruct trace_event_data_offsets_global_dirty_state {};\n\nstruct trace_event_data_offsets_gpio_direction {};\n\nstruct trace_event_data_offsets_gpio_value {};\n\nstruct trace_event_data_offsets_guest_halt_poll_ns {};\n\nstruct trace_event_data_offsets_handshake_alert_class {};\n\nstruct trace_event_data_offsets_handshake_complete {};\n\nstruct trace_event_data_offsets_handshake_error_class {};\n\nstruct trace_event_data_offsets_handshake_event_class {};\n\nstruct trace_event_data_offsets_handshake_fd_class {};\n\nstruct trace_event_data_offsets_hrtimer_class {};\n\nstruct trace_event_data_offsets_hrtimer_expire_entry {};\n\nstruct trace_event_data_offsets_hrtimer_init {};\n\nstruct trace_event_data_offsets_hrtimer_start {};\n\nstruct trace_event_data_offsets_hugepage_set {};\n\nstruct trace_event_data_offsets_hugepage_update {};\n\nstruct trace_event_data_offsets_hwmon_attr_class {\n\tu32 attr_name;\n\tconst void *attr_name_ptr_;\n};\n\nstruct trace_event_data_offsets_hwmon_attr_show_string {\n\tu32 attr_name;\n\tconst void *attr_name_ptr_;\n\tu32 label;\n\tconst void *label_ptr_;\n};\n\nstruct trace_event_data_offsets_hyperv_mmu_flush_tlb_multi {};\n\nstruct trace_event_data_offsets_hyperv_nested_flush_guest_mapping {};\n\nstruct trace_event_data_offsets_hyperv_nested_flush_guest_mapping_range {};\n\nstruct trace_event_data_offsets_hyperv_send_ipi_mask {};\n\nstruct trace_event_data_offsets_hyperv_send_ipi_one {};\n\nstruct trace_event_data_offsets_i2c_read {};\n\nstruct trace_event_data_offsets_i2c_reply {\n\tu32 buf;\n\tconst void *buf_ptr_;\n};\n\nstruct trace_event_data_offsets_i2c_result {};\n\nstruct trace_event_data_offsets_i2c_write {\n\tu32 buf;\n\tconst void *buf_ptr_;\n};\n\nstruct trace_event_data_offsets_icc_set_bw {\n\tu32 path_name;\n\tconst void *path_name_ptr_;\n\tu32 dev;\n\tconst void *dev_ptr_;\n\tu32 node_name;\n\tconst void *node_name_ptr_;\n};\n\nstruct trace_event_data_offsets_icc_set_bw_end {\n\tu32 path_name;\n\tconst void *path_name_ptr_;\n\tu32 dev;\n\tconst void *dev_ptr_;\n};\n\nstruct trace_event_data_offsets_icmp_send {};\n\nstruct trace_event_data_offsets_inet_sk_error_report {};\n\nstruct trace_event_data_offsets_inet_sock_set_state {};\n\nstruct trace_event_data_offsets_initcall_finish {};\n\nstruct trace_event_data_offsets_initcall_level {\n\tu32 level;\n\tconst void *level_ptr_;\n};\n\nstruct trace_event_data_offsets_initcall_start {};\n\nstruct trace_event_data_offsets_inode_foreign_history {};\n\nstruct trace_event_data_offsets_inode_switch_wbs {};\n\nstruct trace_event_data_offsets_io_uring_complete {};\n\nstruct trace_event_data_offsets_io_uring_cqe_overflow {};\n\nstruct trace_event_data_offsets_io_uring_cqring_wait {};\n\nstruct trace_event_data_offsets_io_uring_create {};\n\nstruct trace_event_data_offsets_io_uring_defer {\n\tu32 op_str;\n\tconst void *op_str_ptr_;\n};\n\nstruct trace_event_data_offsets_io_uring_fail_link {\n\tu32 op_str;\n\tconst void *op_str_ptr_;\n};\n\nstruct trace_event_data_offsets_io_uring_file_get {};\n\nstruct trace_event_data_offsets_io_uring_link {};\n\nstruct trace_event_data_offsets_io_uring_local_work_run {};\n\nstruct trace_event_data_offsets_io_uring_poll_arm {\n\tu32 op_str;\n\tconst void *op_str_ptr_;\n};\n\nstruct trace_event_data_offsets_io_uring_queue_async_work {\n\tu32 op_str;\n\tconst void *op_str_ptr_;\n};\n\nstruct trace_event_data_offsets_io_uring_register {};\n\nstruct trace_event_data_offsets_io_uring_req_failed {\n\tu32 op_str;\n\tconst void *op_str_ptr_;\n};\n\nstruct trace_event_data_offsets_io_uring_short_write {};\n\nstruct trace_event_data_offsets_io_uring_submit_req {\n\tu32 op_str;\n\tconst void *op_str_ptr_;\n};\n\nstruct trace_event_data_offsets_io_uring_task_add {\n\tu32 op_str;\n\tconst void *op_str_ptr_;\n};\n\nstruct trace_event_data_offsets_io_uring_task_work_run {};\n\nstruct trace_event_data_offsets_iocg_inuse_update {\n\tu32 devname;\n\tconst void *devname_ptr_;\n\tu32 cgroup;\n\tconst void *cgroup_ptr_;\n};\n\nstruct trace_event_data_offsets_iocost_ioc_vrate_adj {\n\tu32 devname;\n\tconst void *devname_ptr_;\n};\n\nstruct trace_event_data_offsets_iocost_iocg_forgive_debt {\n\tu32 devname;\n\tconst void *devname_ptr_;\n\tu32 cgroup;\n\tconst void *cgroup_ptr_;\n};\n\nstruct trace_event_data_offsets_iocost_iocg_state {\n\tu32 devname;\n\tconst void *devname_ptr_;\n\tu32 cgroup;\n\tconst void *cgroup_ptr_;\n};\n\nstruct trace_event_data_offsets_iomap_class {};\n\nstruct trace_event_data_offsets_iomap_dio_complete {};\n\nstruct trace_event_data_offsets_iomap_dio_rw_begin {};\n\nstruct trace_event_data_offsets_iomap_iter {};\n\nstruct trace_event_data_offsets_iomap_range_class {};\n\nstruct trace_event_data_offsets_iomap_readpage_class {};\n\nstruct trace_event_data_offsets_iomap_writepage_map {};\n\nstruct trace_event_data_offsets_iommu_device_event {\n\tu32 device;\n\tconst void *device_ptr_;\n};\n\nstruct trace_event_data_offsets_iommu_error {\n\tu32 device;\n\tconst void *device_ptr_;\n\tu32 driver;\n\tconst void *driver_ptr_;\n};\n\nstruct trace_event_data_offsets_iommu_group_event {\n\tu32 device;\n\tconst void *device_ptr_;\n};\n\nstruct trace_event_data_offsets_ipi_handler {};\n\nstruct trace_event_data_offsets_ipi_raise {\n\tu32 target_cpus;\n\tconst void *target_cpus_ptr_;\n};\n\nstruct trace_event_data_offsets_ipi_send_cpu {};\n\nstruct trace_event_data_offsets_ipi_send_cpumask {\n\tu32 cpumask;\n\tconst void *cpumask_ptr_;\n};\n\nstruct trace_event_data_offsets_irq_handler_entry {\n\tu32 name;\n\tconst void *name_ptr_;\n};\n\nstruct trace_event_data_offsets_irq_handler_exit {};\n\nstruct trace_event_data_offsets_irq_matrix_cpu {};\n\nstruct trace_event_data_offsets_irq_matrix_global {};\n\nstruct trace_event_data_offsets_irq_matrix_global_update {};\n\nstruct trace_event_data_offsets_irq_noise {\n\tu32 desc;\n\tconst void *desc_ptr_;\n};\n\nstruct trace_event_data_offsets_itimer_expire {};\n\nstruct trace_event_data_offsets_itimer_state {};\n\nstruct trace_event_data_offsets_jbd2_checkpoint {};\n\nstruct trace_event_data_offsets_jbd2_checkpoint_stats {};\n\nstruct trace_event_data_offsets_jbd2_commit {};\n\nstruct trace_event_data_offsets_jbd2_end_commit {};\n\nstruct trace_event_data_offsets_jbd2_handle_extend {};\n\nstruct trace_event_data_offsets_jbd2_handle_start_class {};\n\nstruct trace_event_data_offsets_jbd2_handle_stats {};\n\nstruct trace_event_data_offsets_jbd2_journal_shrink {};\n\nstruct trace_event_data_offsets_jbd2_lock_buffer_stall {};\n\nstruct trace_event_data_offsets_jbd2_run_stats {};\n\nstruct trace_event_data_offsets_jbd2_shrink_checkpoint_list {};\n\nstruct trace_event_data_offsets_jbd2_shrink_scan_exit {};\n\nstruct trace_event_data_offsets_jbd2_submit_inode_data {};\n\nstruct trace_event_data_offsets_jbd2_update_log_tail {};\n\nstruct trace_event_data_offsets_jbd2_write_superblock {};\n\nstruct trace_event_data_offsets_kcompactd_wake_template {};\n\nstruct trace_event_data_offsets_kfree {};\n\nstruct trace_event_data_offsets_kfree_skb {};\n\nstruct trace_event_data_offsets_kmalloc {};\n\nstruct trace_event_data_offsets_kmem_cache_alloc {};\n\nstruct trace_event_data_offsets_kmem_cache_free {\n\tu32 name;\n\tconst void *name_ptr_;\n};\n\nstruct trace_event_data_offsets_ksm_advisor {};\n\nstruct trace_event_data_offsets_ksm_enter_exit_template {};\n\nstruct trace_event_data_offsets_ksm_merge_one_page {};\n\nstruct trace_event_data_offsets_ksm_merge_with_ksm_page {};\n\nstruct trace_event_data_offsets_ksm_remove_ksm_page {};\n\nstruct trace_event_data_offsets_ksm_remove_rmap_item {};\n\nstruct trace_event_data_offsets_ksm_scan_template {};\n\nstruct trace_event_data_offsets_leases_conflict {};\n\nstruct trace_event_data_offsets_locks_get_lock_context {};\n\nstruct trace_event_data_offsets_ma_op {};\n\nstruct trace_event_data_offsets_ma_read {};\n\nstruct trace_event_data_offsets_ma_write {};\n\nstruct trace_event_data_offsets_map {};\n\nstruct trace_event_data_offsets_mark_victim {\n\tu32 comm;\n\tconst void *comm_ptr_;\n};\n\nstruct trace_event_data_offsets_mc_event {\n\tu32 msg;\n\tconst void *msg_ptr_;\n\tu32 label;\n\tconst void *label_ptr_;\n\tu32 driver_detail;\n\tconst void *driver_detail_ptr_;\n};\n\nstruct trace_event_data_offsets_mce_record {};\n\nstruct trace_event_data_offsets_mctp_key_acquire {};\n\nstruct trace_event_data_offsets_mctp_key_release {};\n\nstruct trace_event_data_offsets_mdio_access {};\n\nstruct trace_event_data_offsets_mem_connect {};\n\nstruct trace_event_data_offsets_mem_disconnect {};\n\nstruct trace_event_data_offsets_mem_return_failed {};\n\nstruct trace_event_data_offsets_memory_failure_event {};\n\nstruct trace_event_data_offsets_migration_pmd {};\n\nstruct trace_event_data_offsets_migration_pte {};\n\nstruct trace_event_data_offsets_mm_alloc_contig_migrate_range_info {};\n\nstruct trace_event_data_offsets_mm_collapse_huge_page {};\n\nstruct trace_event_data_offsets_mm_collapse_huge_page_isolate {};\n\nstruct trace_event_data_offsets_mm_collapse_huge_page_swapin {};\n\nstruct trace_event_data_offsets_mm_compaction_begin {};\n\nstruct trace_event_data_offsets_mm_compaction_defer_template {};\n\nstruct trace_event_data_offsets_mm_compaction_end {};\n\nstruct trace_event_data_offsets_mm_compaction_isolate_template {};\n\nstruct trace_event_data_offsets_mm_compaction_kcompactd_sleep {};\n\nstruct trace_event_data_offsets_mm_compaction_migratepages {};\n\nstruct trace_event_data_offsets_mm_compaction_suitable_template {};\n\nstruct trace_event_data_offsets_mm_compaction_try_to_compact_pages {};\n\nstruct trace_event_data_offsets_mm_filemap_op_page_cache {};\n\nstruct trace_event_data_offsets_mm_khugepaged_collapse_file {\n\tu32 filename;\n\tconst void *filename_ptr_;\n};\n\nstruct trace_event_data_offsets_mm_khugepaged_scan_file {\n\tu32 filename;\n\tconst void *filename_ptr_;\n};\n\nstruct trace_event_data_offsets_mm_khugepaged_scan_pmd {};\n\nstruct trace_event_data_offsets_mm_lru_activate {};\n\nstruct trace_event_data_offsets_mm_lru_insertion {};\n\nstruct trace_event_data_offsets_mm_migrate_pages {};\n\nstruct trace_event_data_offsets_mm_migrate_pages_start {};\n\nstruct trace_event_data_offsets_mm_page {};\n\nstruct trace_event_data_offsets_mm_page_alloc {};\n\nstruct trace_event_data_offsets_mm_page_alloc_extfrag {};\n\nstruct trace_event_data_offsets_mm_page_free {};\n\nstruct trace_event_data_offsets_mm_page_free_batched {};\n\nstruct trace_event_data_offsets_mm_page_pcpu_drain {};\n\nstruct trace_event_data_offsets_mm_shrink_slab_end {};\n\nstruct trace_event_data_offsets_mm_shrink_slab_start {};\n\nstruct trace_event_data_offsets_mm_vmscan_direct_reclaim_begin_template {};\n\nstruct trace_event_data_offsets_mm_vmscan_direct_reclaim_end_template {};\n\nstruct trace_event_data_offsets_mm_vmscan_kswapd_sleep {};\n\nstruct trace_event_data_offsets_mm_vmscan_kswapd_wake {};\n\nstruct trace_event_data_offsets_mm_vmscan_lru_isolate {};\n\nstruct trace_event_data_offsets_mm_vmscan_lru_shrink_active {};\n\nstruct trace_event_data_offsets_mm_vmscan_lru_shrink_inactive {};\n\nstruct trace_event_data_offsets_mm_vmscan_node_reclaim_begin {};\n\nstruct trace_event_data_offsets_mm_vmscan_throttled {};\n\nstruct trace_event_data_offsets_mm_vmscan_wakeup_kswapd {};\n\nstruct trace_event_data_offsets_mm_vmscan_write_folio {};\n\nstruct trace_event_data_offsets_mmap_lock {\n\tu32 memcg_path;\n\tconst void *memcg_path_ptr_;\n};\n\nstruct trace_event_data_offsets_mmap_lock_acquire_returned {\n\tu32 memcg_path;\n\tconst void *memcg_path_ptr_;\n};\n\nstruct trace_event_data_offsets_mmc_request_done {\n\tu32 name;\n\tconst void *name_ptr_;\n};\n\nstruct trace_event_data_offsets_mmc_request_start {\n\tu32 name;\n\tconst void *name_ptr_;\n};\n\nstruct trace_event_data_offsets_module_free {\n\tu32 name;\n\tconst void *name_ptr_;\n};\n\nstruct trace_event_data_offsets_module_load {\n\tu32 name;\n\tconst void *name_ptr_;\n};\n\nstruct trace_event_data_offsets_module_refcnt {\n\tu32 name;\n\tconst void *name_ptr_;\n};\n\nstruct trace_event_data_offsets_module_request {\n\tu32 name;\n\tconst void *name_ptr_;\n};\n\nstruct trace_event_data_offsets_mon_llc_occupancy_limbo {};\n\nstruct trace_event_data_offsets_mptcp_dump_mpext {};\n\nstruct trace_event_data_offsets_mptcp_subflow_get_send {};\n\nstruct trace_event_data_offsets_msr_trace_class {};\n\nstruct trace_event_data_offsets_napi_poll {\n\tu32 dev_name;\n\tconst void *dev_name_ptr_;\n};\n\nstruct trace_event_data_offsets_neigh__update {\n\tu32 dev;\n\tconst void *dev_ptr_;\n};\n\nstruct trace_event_data_offsets_neigh_create {\n\tu32 dev;\n\tconst void *dev_ptr_;\n};\n\nstruct trace_event_data_offsets_neigh_update {\n\tu32 dev;\n\tconst void *dev_ptr_;\n};\n\nstruct trace_event_data_offsets_net_dev_rx_exit_template {};\n\nstruct trace_event_data_offsets_net_dev_rx_verbose_template {\n\tu32 name;\n\tconst void *name_ptr_;\n};\n\nstruct trace_event_data_offsets_net_dev_start_xmit {\n\tu32 name;\n\tconst void *name_ptr_;\n};\n\nstruct trace_event_data_offsets_net_dev_template {\n\tu32 name;\n\tconst void *name_ptr_;\n};\n\nstruct trace_event_data_offsets_net_dev_xmit {\n\tu32 name;\n\tconst void *name_ptr_;\n};\n\nstruct trace_event_data_offsets_net_dev_xmit_timeout {\n\tu32 name;\n\tconst void *name_ptr_;\n\tu32 driver;\n\tconst void *driver_ptr_;\n};\n\nstruct trace_event_data_offsets_netlink_extack {\n\tu32 msg;\n\tconst void *msg_ptr_;\n};\n\nstruct trace_event_data_offsets_nmi_handler {};\n\nstruct trace_event_data_offsets_nmi_noise {};\n\nstruct trace_event_data_offsets_non_standard_event {\n\tu32 fru_text;\n\tconst void *fru_text_ptr_;\n\tu32 buf;\n\tconst void *buf_ptr_;\n};\n\nstruct trace_event_data_offsets_notifier_info {};\n\nstruct trace_event_data_offsets_oom_score_adj_update {};\n\nstruct trace_event_data_offsets_page_pool_release {};\n\nstruct trace_event_data_offsets_page_pool_state_hold {};\n\nstruct trace_event_data_offsets_page_pool_state_release {};\n\nstruct trace_event_data_offsets_page_pool_update_nid {};\n\nstruct trace_event_data_offsets_percpu_alloc_percpu {};\n\nstruct trace_event_data_offsets_percpu_alloc_percpu_fail {};\n\nstruct trace_event_data_offsets_percpu_create_chunk {};\n\nstruct trace_event_data_offsets_percpu_destroy_chunk {};\n\nstruct trace_event_data_offsets_percpu_free_percpu {};\n\nstruct trace_event_data_offsets_pm_qos_update {};\n\nstruct trace_event_data_offsets_power_domain {\n\tu32 name;\n\tconst void *name_ptr_;\n};\n\nstruct trace_event_data_offsets_powernv_throttle {\n\tu32 reason;\n\tconst void *reason_ptr_;\n};\n\nstruct trace_event_data_offsets_prq_report {\n\tu32 iommu;\n\tconst void *iommu_ptr_;\n\tu32 dev;\n\tconst void *dev_ptr_;\n\tu32 buff;\n\tconst void *buff_ptr_;\n};\n\nstruct trace_event_data_offsets_pseudo_lock_l2 {};\n\nstruct trace_event_data_offsets_pseudo_lock_l3 {};\n\nstruct trace_event_data_offsets_pseudo_lock_mem_latency {};\n\nstruct trace_event_data_offsets_pstate_sample {};\n\nstruct trace_event_data_offsets_purge_vmap_area_lazy {};\n\nstruct trace_event_data_offsets_pwm {};\n\nstruct trace_event_data_offsets_qdisc_create {\n\tu32 dev;\n\tconst void *dev_ptr_;\n\tu32 kind;\n\tconst void *kind_ptr_;\n};\n\nstruct trace_event_data_offsets_qdisc_dequeue {};\n\nstruct trace_event_data_offsets_qdisc_destroy {\n\tu32 dev;\n\tconst void *dev_ptr_;\n\tu32 kind;\n\tconst void *kind_ptr_;\n};\n\nstruct trace_event_data_offsets_qdisc_enqueue {};\n\nstruct trace_event_data_offsets_qdisc_reset {\n\tu32 dev;\n\tconst void *dev_ptr_;\n\tu32 kind;\n\tconst void *kind_ptr_;\n};\n\nstruct trace_event_data_offsets_qi_submit {\n\tu32 iommu;\n\tconst void *iommu_ptr_;\n};\n\nstruct trace_event_data_offsets_rcu_stall_warning {};\n\nstruct trace_event_data_offsets_rcu_utilization {};\n\nstruct trace_event_data_offsets_reclaim_retry_zone {};\n\nstruct trace_event_data_offsets_regcache_drop_region {\n\tu32 name;\n\tconst void *name_ptr_;\n};\n\nstruct trace_event_data_offsets_regcache_sync {\n\tu32 name;\n\tconst void *name_ptr_;\n\tu32 status;\n\tconst void *status_ptr_;\n\tu32 type;\n\tconst void *type_ptr_;\n};\n\nstruct trace_event_data_offsets_regmap_async {\n\tu32 name;\n\tconst void *name_ptr_;\n};\n\nstruct trace_event_data_offsets_regmap_block {\n\tu32 name;\n\tconst void *name_ptr_;\n};\n\nstruct trace_event_data_offsets_regmap_bool {\n\tu32 name;\n\tconst void *name_ptr_;\n};\n\nstruct trace_event_data_offsets_regmap_bulk {\n\tu32 name;\n\tconst void *name_ptr_;\n\tu32 buf;\n\tconst void *buf_ptr_;\n};\n\nstruct trace_event_data_offsets_regmap_reg {\n\tu32 name;\n\tconst void *name_ptr_;\n};\n\nstruct trace_event_data_offsets_regulator_basic {\n\tu32 name;\n\tconst void *name_ptr_;\n};\n\nstruct trace_event_data_offsets_regulator_range {\n\tu32 name;\n\tconst void *name_ptr_;\n};\n\nstruct trace_event_data_offsets_regulator_value {\n\tu32 name;\n\tconst void *name_ptr_;\n};\n\nstruct trace_event_data_offsets_rpm_internal {\n\tu32 name;\n\tconst void *name_ptr_;\n};\n\nstruct trace_event_data_offsets_rpm_return_int {\n\tu32 name;\n\tconst void *name_ptr_;\n};\n\nstruct trace_event_data_offsets_rpm_status {\n\tu32 name;\n\tconst void *name_ptr_;\n};\n\nstruct trace_event_data_offsets_rseq_ip_fixup {};\n\nstruct trace_event_data_offsets_rseq_update {};\n\nstruct trace_event_data_offsets_rss_stat {};\n\nstruct trace_event_data_offsets_rtc_alarm_irq_enable {};\n\nstruct trace_event_data_offsets_rtc_irq_set_freq {};\n\nstruct trace_event_data_offsets_rtc_irq_set_state {};\n\nstruct trace_event_data_offsets_rtc_offset_class {};\n\nstruct trace_event_data_offsets_rtc_time_alarm_class {};\n\nstruct trace_event_data_offsets_rtc_timer_class {};\n\nstruct trace_event_data_offsets_sample_threshold {};\n\nstruct trace_event_data_offsets_sched_kthread_stop {};\n\nstruct trace_event_data_offsets_sched_kthread_stop_ret {};\n\nstruct trace_event_data_offsets_sched_kthread_work_execute_end {};\n\nstruct trace_event_data_offsets_sched_kthread_work_execute_start {};\n\nstruct trace_event_data_offsets_sched_kthread_work_queue_work {};\n\nstruct trace_event_data_offsets_sched_migrate_task {};\n\nstruct trace_event_data_offsets_sched_move_numa {};\n\nstruct trace_event_data_offsets_sched_numa_pair_template {};\n\nstruct trace_event_data_offsets_sched_pi_setprio {};\n\nstruct trace_event_data_offsets_sched_prepare_exec {\n\tu32 interp;\n\tconst void *interp_ptr_;\n\tu32 filename;\n\tconst void *filename_ptr_;\n\tu32 comm;\n\tconst void *comm_ptr_;\n};\n\nstruct trace_event_data_offsets_sched_process_exec {\n\tu32 filename;\n\tconst void *filename_ptr_;\n};\n\nstruct trace_event_data_offsets_sched_process_fork {};\n\nstruct trace_event_data_offsets_sched_process_hang {};\n\nstruct trace_event_data_offsets_sched_process_template {};\n\nstruct trace_event_data_offsets_sched_process_wait {};\n\nstruct trace_event_data_offsets_sched_skip_vma_numa {};\n\nstruct trace_event_data_offsets_sched_stat_runtime {};\n\nstruct trace_event_data_offsets_sched_stat_template {};\n\nstruct trace_event_data_offsets_sched_switch {};\n\nstruct trace_event_data_offsets_sched_wake_idle_without_ipi {};\n\nstruct trace_event_data_offsets_sched_wakeup_template {};\n\nstruct trace_event_data_offsets_scsi_cmd_done_timeout_template {\n\tu32 cmnd;\n\tconst void *cmnd_ptr_;\n};\n\nstruct trace_event_data_offsets_scsi_dispatch_cmd_error {\n\tu32 cmnd;\n\tconst void *cmnd_ptr_;\n};\n\nstruct trace_event_data_offsets_scsi_dispatch_cmd_start {\n\tu32 cmnd;\n\tconst void *cmnd_ptr_;\n};\n\nstruct trace_event_data_offsets_scsi_eh_wakeup {};\n\nstruct trace_event_data_offsets_scsi_prepare_zone_append {};\n\nstruct trace_event_data_offsets_scsi_zone_wp_update {};\n\nstruct trace_event_data_offsets_selinux_audited {\n\tu32 scontext;\n\tconst void *scontext_ptr_;\n\tu32 tcontext;\n\tconst void *tcontext_ptr_;\n\tu32 tclass;\n\tconst void *tclass_ptr_;\n};\n\nstruct trace_event_data_offsets_signal_deliver {};\n\nstruct trace_event_data_offsets_signal_generate {};\n\nstruct trace_event_data_offsets_sk_data_ready {};\n\nstruct trace_event_data_offsets_skb_copy_datagram_iovec {};\n\nstruct trace_event_data_offsets_skip_task_reaping {};\n\nstruct trace_event_data_offsets_smbus_read {};\n\nstruct trace_event_data_offsets_smbus_reply {};\n\nstruct trace_event_data_offsets_smbus_result {};\n\nstruct trace_event_data_offsets_smbus_write {};\n\nstruct trace_event_data_offsets_sock_exceed_buf_limit {};\n\nstruct trace_event_data_offsets_sock_msg_length {};\n\nstruct trace_event_data_offsets_sock_rcvqueue_full {};\n\nstruct trace_event_data_offsets_softirq {};\n\nstruct trace_event_data_offsets_softirq_noise {};\n\nstruct trace_event_data_offsets_spi_controller {};\n\nstruct trace_event_data_offsets_spi_message {};\n\nstruct trace_event_data_offsets_spi_message_done {};\n\nstruct trace_event_data_offsets_spi_set_cs {};\n\nstruct trace_event_data_offsets_spi_setup {};\n\nstruct trace_event_data_offsets_spi_transfer {\n\tu32 rx_buf;\n\tconst void *rx_buf_ptr_;\n\tu32 tx_buf;\n\tconst void *tx_buf_ptr_;\n};\n\nstruct trace_event_data_offsets_start_task_reaping {};\n\nstruct trace_event_data_offsets_subflow_check_data_avail {};\n\nstruct trace_event_data_offsets_suspend_resume {};\n\nstruct trace_event_data_offsets_swiotlb_bounced {\n\tu32 dev_name;\n\tconst void *dev_name_ptr_;\n};\n\nstruct trace_event_data_offsets_sync_timeline {\n\tu32 name;\n\tconst void *name_ptr_;\n};\n\nstruct trace_event_data_offsets_sys_enter {};\n\nstruct trace_event_data_offsets_sys_exit {};\n\nstruct trace_event_data_offsets_task_newtask {};\n\nstruct trace_event_data_offsets_task_rename {};\n\nstruct trace_event_data_offsets_tasklet {};\n\nstruct trace_event_data_offsets_tcp_ao_event {};\n\nstruct trace_event_data_offsets_tcp_ao_event_sk {};\n\nstruct trace_event_data_offsets_tcp_ao_event_sne {};\n\nstruct trace_event_data_offsets_tcp_cong_state_set {};\n\nstruct trace_event_data_offsets_tcp_event_sk {};\n\nstruct trace_event_data_offsets_tcp_event_sk_skb {};\n\nstruct trace_event_data_offsets_tcp_event_skb {};\n\nstruct trace_event_data_offsets_tcp_hash_event {};\n\nstruct trace_event_data_offsets_tcp_probe {};\n\nstruct trace_event_data_offsets_tcp_retransmit_synack {};\n\nstruct trace_event_data_offsets_tcp_send_reset {};\n\nstruct trace_event_data_offsets_test_pages_isolated {};\n\nstruct trace_event_data_offsets_thermal_power_actor {};\n\nstruct trace_event_data_offsets_thermal_power_allocator {};\n\nstruct trace_event_data_offsets_thermal_power_allocator_pid {};\n\nstruct trace_event_data_offsets_thermal_power_devfreq_get_power {\n\tu32 type;\n\tconst void *type_ptr_;\n};\n\nstruct trace_event_data_offsets_thermal_power_devfreq_limit {\n\tu32 type;\n\tconst void *type_ptr_;\n};\n\nstruct trace_event_data_offsets_thermal_temperature {\n\tu32 thermal_zone;\n\tconst void *thermal_zone_ptr_;\n};\n\nstruct trace_event_data_offsets_thermal_zone_trip {\n\tu32 thermal_zone;\n\tconst void *thermal_zone_ptr_;\n};\n\nstruct trace_event_data_offsets_thread_noise {};\n\nstruct trace_event_data_offsets_tick_stop {};\n\nstruct trace_event_data_offsets_timer_base_idle {};\n\nstruct trace_event_data_offsets_timer_class {};\n\nstruct trace_event_data_offsets_timer_expire_entry {};\n\nstruct trace_event_data_offsets_timer_start {};\n\nstruct trace_event_data_offsets_tlb_flush {};\n\nstruct trace_event_data_offsets_tls_contenttype {};\n\nstruct trace_event_data_offsets_tmigr_connect_child_parent {};\n\nstruct trace_event_data_offsets_tmigr_connect_cpu_parent {};\n\nstruct trace_event_data_offsets_tmigr_cpugroup {};\n\nstruct trace_event_data_offsets_tmigr_group_and_cpu {};\n\nstruct trace_event_data_offsets_tmigr_group_set {};\n\nstruct trace_event_data_offsets_tmigr_handle_remote {};\n\nstruct trace_event_data_offsets_tmigr_idle {};\n\nstruct trace_event_data_offsets_tmigr_update_events {};\n\nstruct trace_event_data_offsets_track_foreign_dirty {};\n\nstruct trace_event_data_offsets_udp_fail_queue_rcv_skb {};\n\nstruct trace_event_data_offsets_unmap {};\n\nstruct trace_event_data_offsets_vector_activate {};\n\nstruct trace_event_data_offsets_vector_alloc {};\n\nstruct trace_event_data_offsets_vector_alloc_managed {};\n\nstruct trace_event_data_offsets_vector_config {};\n\nstruct trace_event_data_offsets_vector_free_moved {};\n\nstruct trace_event_data_offsets_vector_mod {};\n\nstruct trace_event_data_offsets_vector_reserve {};\n\nstruct trace_event_data_offsets_vector_setup {};\n\nstruct trace_event_data_offsets_vector_teardown {};\n\nstruct trace_event_data_offsets_vm_unmapped_area {};\n\nstruct trace_event_data_offsets_vma_mas_szero {};\n\nstruct trace_event_data_offsets_vma_store {};\n\nstruct trace_event_data_offsets_wake_reaper {};\n\nstruct trace_event_data_offsets_wakeup_source {\n\tu32 name;\n\tconst void *name_ptr_;\n};\n\nstruct trace_event_data_offsets_watchdog_set_timeout {};\n\nstruct trace_event_data_offsets_watchdog_template {};\n\nstruct trace_event_data_offsets_wbc_class {};\n\nstruct trace_event_data_offsets_wbt_lat {};\n\nstruct trace_event_data_offsets_wbt_stat {};\n\nstruct trace_event_data_offsets_wbt_step {};\n\nstruct trace_event_data_offsets_wbt_timer {};\n\nstruct trace_event_data_offsets_workqueue_activate_work {};\n\nstruct trace_event_data_offsets_workqueue_execute_end {};\n\nstruct trace_event_data_offsets_workqueue_execute_start {};\n\nstruct trace_event_data_offsets_workqueue_queue_work {\n\tu32 workqueue;\n\tconst void *workqueue_ptr_;\n};\n\nstruct trace_event_data_offsets_writeback_bdi_register {};\n\nstruct trace_event_data_offsets_writeback_class {};\n\nstruct trace_event_data_offsets_writeback_dirty_inode_template {};\n\nstruct trace_event_data_offsets_writeback_folio_template {};\n\nstruct trace_event_data_offsets_writeback_inode_template {};\n\nstruct trace_event_data_offsets_writeback_pages_written {};\n\nstruct trace_event_data_offsets_writeback_queue_io {};\n\nstruct trace_event_data_offsets_writeback_sb_inodes_requeue {};\n\nstruct trace_event_data_offsets_writeback_single_inode_template {};\n\nstruct trace_event_data_offsets_writeback_work_class {};\n\nstruct trace_event_data_offsets_writeback_write_inode_template {};\n\nstruct trace_event_data_offsets_x86_exceptions {};\n\nstruct trace_event_data_offsets_x86_fpu {};\n\nstruct trace_event_data_offsets_x86_irq_vector {};\n\nstruct trace_event_data_offsets_xdp_bulk_tx {};\n\nstruct trace_event_data_offsets_xdp_cpumap_enqueue {};\n\nstruct trace_event_data_offsets_xdp_cpumap_kthread {};\n\nstruct trace_event_data_offsets_xdp_devmap_xmit {};\n\nstruct trace_event_data_offsets_xdp_exception {};\n\nstruct trace_event_data_offsets_xdp_redirect_template {};\n\nstruct trace_event_data_offsets_xen_cpu_load_idt {};\n\nstruct trace_event_data_offsets_xen_cpu_set_ldt {};\n\nstruct trace_event_data_offsets_xen_cpu_write_gdt_entry {};\n\nstruct trace_event_data_offsets_xen_cpu_write_idt_entry {};\n\nstruct trace_event_data_offsets_xen_cpu_write_ldt_entry {};\n\nstruct trace_event_data_offsets_xen_mc__batch {};\n\nstruct trace_event_data_offsets_xen_mc_callback {};\n\nstruct trace_event_data_offsets_xen_mc_entry {};\n\nstruct trace_event_data_offsets_xen_mc_entry_alloc {};\n\nstruct trace_event_data_offsets_xen_mc_extend_args {};\n\nstruct trace_event_data_offsets_xen_mc_flush {};\n\nstruct trace_event_data_offsets_xen_mc_flush_reason {};\n\nstruct trace_event_data_offsets_xen_mmu__set_pte {};\n\nstruct trace_event_data_offsets_xen_mmu_alloc_ptpage {};\n\nstruct trace_event_data_offsets_xen_mmu_flush_tlb_multi {};\n\nstruct trace_event_data_offsets_xen_mmu_flush_tlb_one_user {};\n\nstruct trace_event_data_offsets_xen_mmu_pgd {};\n\nstruct trace_event_data_offsets_xen_mmu_ptep_modify_prot {};\n\nstruct trace_event_data_offsets_xen_mmu_release_ptpage {};\n\nstruct trace_event_data_offsets_xen_mmu_set_p4d {};\n\nstruct trace_event_data_offsets_xen_mmu_set_pmd {};\n\nstruct trace_event_data_offsets_xen_mmu_set_pud {};\n\nstruct trace_event_data_offsets_xen_mmu_write_cr3 {};\n\nstruct trace_event_data_offsets_xhci_dbc_log_request {};\n\nstruct trace_event_data_offsets_xhci_log_ctrl_ctx {};\n\nstruct trace_event_data_offsets_xhci_log_ctx {\n\tu32 ctx_data;\n\tconst void *ctx_data_ptr_;\n};\n\nstruct trace_event_data_offsets_xhci_log_doorbell {};\n\nstruct trace_event_data_offsets_xhci_log_ep_ctx {};\n\nstruct trace_event_data_offsets_xhci_log_free_virt_dev {};\n\nstruct trace_event_data_offsets_xhci_log_msg {\n\tu32 msg;\n\tconst void *msg_ptr_;\n};\n\nstruct trace_event_data_offsets_xhci_log_portsc {};\n\nstruct trace_event_data_offsets_xhci_log_ring {};\n\nstruct trace_event_data_offsets_xhci_log_slot_ctx {};\n\nstruct trace_event_data_offsets_xhci_log_trb {};\n\nstruct trace_event_data_offsets_xhci_log_urb {\n\tu32 devname;\n\tconst void *devname_ptr_;\n};\n\nstruct trace_event_data_offsets_xhci_log_virt_dev {};\n\nstruct trace_event_fields {\n\tconst char *type;\n\tunion {\n\t\tstruct {\n\t\t\tconst char *name;\n\t\t\tconst int size;\n\t\t\tconst int align;\n\t\t\tconst unsigned int is_signed: 1;\n\t\t\tunsigned int needs_test: 1;\n\t\t\tconst int filter_type;\n\t\t\tconst int len;\n\t\t};\n\t\tint (*define_fields)(struct trace_event_call *);\n\t};\n};\n\nstruct trace_subsystem_dir;\n\nstruct trace_event_file {\n\tstruct list_head list;\n\tstruct trace_event_call *event_call;\n\tstruct event_filter *filter;\n\tstruct eventfs_inode *ei;\n\tstruct trace_array *tr;\n\tstruct trace_subsystem_dir *system;\n\tstruct list_head triggers;\n\tlong unsigned int flags;\n\trefcount_t ref;\n\tatomic_t sm_ref;\n\tatomic_t tm_ref;\n};\n\ntypedef enum print_line_t (*trace_print_func)(struct trace_iterator *, int, struct trace_event *);\n\nstruct trace_event_functions {\n\ttrace_print_func trace;\n\ttrace_print_func raw;\n\ttrace_print_func hex;\n\ttrace_print_func binary;\n};\n\nstruct trace_event_raw_ack_update_msk {\n\tstruct trace_entry ent;\n\tu64 data_ack;\n\tu64 old_snd_una;\n\tu64 new_snd_una;\n\tu64 new_wnd_end;\n\tu64 msk_wnd_end;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_aer_event {\n\tstruct trace_entry ent;\n\tu32 __data_loc_dev_name;\n\tu32 status;\n\tu8 severity;\n\tu8 tlp_header_valid;\n\tu32 tlp_header[4];\n\tchar __data[0];\n};\n\nstruct trace_event_raw_alarm_class {\n\tstruct trace_entry ent;\n\tvoid *alarm;\n\tunsigned char alarm_type;\n\ts64 expires;\n\ts64 now;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_alarmtimer_suspend {\n\tstruct trace_entry ent;\n\ts64 expires;\n\tunsigned char alarm_type;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_alloc_vmap_area {\n\tstruct trace_entry ent;\n\tlong unsigned int addr;\n\tlong unsigned int size;\n\tlong unsigned int align;\n\tlong unsigned int vstart;\n\tlong unsigned int vend;\n\tint failed;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_amd_pstate_perf {\n\tstruct trace_entry ent;\n\tlong unsigned int min_perf;\n\tlong unsigned int target_perf;\n\tlong unsigned int capacity;\n\tlong long unsigned int freq;\n\tlong long unsigned int mperf;\n\tlong long unsigned int aperf;\n\tlong long unsigned int tsc;\n\tunsigned int cpu_id;\n\tbool changed;\n\tbool fast_switch;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_arm_event {\n\tstruct trace_entry ent;\n\tu64 mpidr;\n\tu64 midr;\n\tu32 running_state;\n\tu32 psci_state;\n\tu8 affinity;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ata_bmdma_status {\n\tstruct trace_entry ent;\n\tunsigned int ata_port;\n\tunsigned int tag;\n\tunsigned char host_stat;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ata_eh_action_template {\n\tstruct trace_entry ent;\n\tunsigned int ata_port;\n\tunsigned int ata_dev;\n\tunsigned int eh_action;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ata_eh_link_autopsy {\n\tstruct trace_entry ent;\n\tunsigned int ata_port;\n\tunsigned int ata_dev;\n\tunsigned int eh_action;\n\tunsigned int eh_err_mask;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ata_eh_link_autopsy_qc {\n\tstruct trace_entry ent;\n\tunsigned int ata_port;\n\tunsigned int ata_dev;\n\tunsigned int tag;\n\tunsigned int qc_flags;\n\tunsigned int eh_err_mask;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ata_exec_command_template {\n\tstruct trace_entry ent;\n\tunsigned int ata_port;\n\tunsigned int tag;\n\tunsigned char cmd;\n\tunsigned char feature;\n\tunsigned char hob_nsect;\n\tunsigned char proto;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ata_link_reset_begin_template {\n\tstruct trace_entry ent;\n\tunsigned int ata_port;\n\tunsigned int class[2];\n\tlong unsigned int deadline;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ata_link_reset_end_template {\n\tstruct trace_entry ent;\n\tunsigned int ata_port;\n\tunsigned int class[2];\n\tint rc;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ata_port_eh_begin_template {\n\tstruct trace_entry ent;\n\tunsigned int ata_port;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ata_qc_complete_template {\n\tstruct trace_entry ent;\n\tunsigned int ata_port;\n\tunsigned int ata_dev;\n\tunsigned int tag;\n\tunsigned char status;\n\tunsigned char dev;\n\tunsigned char lbal;\n\tunsigned char lbam;\n\tunsigned char lbah;\n\tunsigned char nsect;\n\tunsigned char error;\n\tunsigned char hob_lbal;\n\tunsigned char hob_lbam;\n\tunsigned char hob_lbah;\n\tunsigned char hob_nsect;\n\tunsigned char hob_feature;\n\tunsigned char ctl;\n\tlong unsigned int flags;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ata_qc_issue_template {\n\tstruct trace_entry ent;\n\tunsigned int ata_port;\n\tunsigned int ata_dev;\n\tunsigned int tag;\n\tunsigned char cmd;\n\tunsigned char dev;\n\tunsigned char lbal;\n\tunsigned char lbam;\n\tunsigned char lbah;\n\tunsigned char nsect;\n\tunsigned char feature;\n\tunsigned char hob_lbal;\n\tunsigned char hob_lbam;\n\tunsigned char hob_lbah;\n\tunsigned char hob_nsect;\n\tunsigned char hob_feature;\n\tunsigned char ctl;\n\tunsigned char proto;\n\tlong unsigned int flags;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ata_sff_hsm_template {\n\tstruct trace_entry ent;\n\tunsigned int ata_port;\n\tunsigned int ata_dev;\n\tunsigned int tag;\n\tunsigned int qc_flags;\n\tunsigned int protocol;\n\tunsigned int hsm_state;\n\tunsigned char dev_state;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ata_sff_template {\n\tstruct trace_entry ent;\n\tunsigned int ata_port;\n\tunsigned char hsm_state;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ata_tf_load {\n\tstruct trace_entry ent;\n\tunsigned int ata_port;\n\tunsigned char cmd;\n\tunsigned char dev;\n\tunsigned char lbal;\n\tunsigned char lbam;\n\tunsigned char lbah;\n\tunsigned char nsect;\n\tunsigned char feature;\n\tunsigned char hob_lbal;\n\tunsigned char hob_lbam;\n\tunsigned char hob_lbah;\n\tunsigned char hob_nsect;\n\tunsigned char hob_feature;\n\tunsigned char proto;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ata_transfer_data_template {\n\tstruct trace_entry ent;\n\tunsigned int ata_port;\n\tunsigned int ata_dev;\n\tunsigned int tag;\n\tunsigned int flags;\n\tunsigned int offset;\n\tunsigned int bytes;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_balance_dirty_pages {\n\tstruct trace_entry ent;\n\tchar bdi[32];\n\tlong unsigned int limit;\n\tlong unsigned int setpoint;\n\tlong unsigned int dirty;\n\tlong unsigned int bdi_setpoint;\n\tlong unsigned int bdi_dirty;\n\tlong unsigned int dirty_ratelimit;\n\tlong unsigned int task_ratelimit;\n\tunsigned int dirtied;\n\tunsigned int dirtied_pause;\n\tlong unsigned int paused;\n\tlong int pause;\n\tlong unsigned int period;\n\tlong int think;\n\tino_t cgroup_ino;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_bdi_dirty_ratelimit {\n\tstruct trace_entry ent;\n\tchar bdi[32];\n\tlong unsigned int write_bw;\n\tlong unsigned int avg_write_bw;\n\tlong unsigned int dirty_rate;\n\tlong unsigned int dirty_ratelimit;\n\tlong unsigned int task_ratelimit;\n\tlong unsigned int balanced_dirty_ratelimit;\n\tino_t cgroup_ino;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_block_bio {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tsector_t sector;\n\tunsigned int nr_sector;\n\tchar rwbs[8];\n\tchar comm[16];\n\tchar __data[0];\n};\n\nstruct trace_event_raw_block_bio_complete {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tsector_t sector;\n\tunsigned int nr_sector;\n\tint error;\n\tchar rwbs[8];\n\tchar __data[0];\n};\n\nstruct trace_event_raw_block_bio_remap {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tsector_t sector;\n\tunsigned int nr_sector;\n\tdev_t old_dev;\n\tsector_t old_sector;\n\tchar rwbs[8];\n\tchar __data[0];\n};\n\nstruct trace_event_raw_block_buffer {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tsector_t sector;\n\tsize_t size;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_block_plug {\n\tstruct trace_entry ent;\n\tchar comm[16];\n\tchar __data[0];\n};\n\nstruct trace_event_raw_block_rq {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tsector_t sector;\n\tunsigned int nr_sector;\n\tunsigned int bytes;\n\tshort unsigned int ioprio;\n\tchar rwbs[8];\n\tchar comm[16];\n\tu32 __data_loc_cmd;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_block_rq_completion {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tsector_t sector;\n\tunsigned int nr_sector;\n\tint error;\n\tshort unsigned int ioprio;\n\tchar rwbs[8];\n\tu32 __data_loc_cmd;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_block_rq_remap {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tsector_t sector;\n\tunsigned int nr_sector;\n\tdev_t old_dev;\n\tsector_t old_sector;\n\tunsigned int nr_bios;\n\tchar rwbs[8];\n\tchar __data[0];\n};\n\nstruct trace_event_raw_block_rq_requeue {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tsector_t sector;\n\tunsigned int nr_sector;\n\tshort unsigned int ioprio;\n\tchar rwbs[8];\n\tu32 __data_loc_cmd;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_block_split {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tsector_t sector;\n\tsector_t new_sector;\n\tchar rwbs[8];\n\tchar comm[16];\n\tchar __data[0];\n};\n\nstruct trace_event_raw_block_unplug {\n\tstruct trace_entry ent;\n\tint nr_rq;\n\tchar comm[16];\n\tchar __data[0];\n};\n\nstruct trace_event_raw_bpf_test_finish {\n\tstruct trace_entry ent;\n\tint err;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_bpf_trace_printk {\n\tstruct trace_entry ent;\n\tu32 __data_loc_bpf_string;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_bpf_trigger_tp {\n\tstruct trace_entry ent;\n\tint nonce;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_bpf_xdp_link_attach_failed {\n\tstruct trace_entry ent;\n\tu32 __data_loc_msg;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_br_fdb_add {\n\tstruct trace_entry ent;\n\tu8 ndm_flags;\n\tu32 __data_loc_dev;\n\tunsigned char addr[6];\n\tu16 vid;\n\tu16 nlh_flags;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_br_fdb_external_learn_add {\n\tstruct trace_entry ent;\n\tu32 __data_loc_br_dev;\n\tu32 __data_loc_dev;\n\tunsigned char addr[6];\n\tu16 vid;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_br_fdb_update {\n\tstruct trace_entry ent;\n\tu32 __data_loc_br_dev;\n\tu32 __data_loc_dev;\n\tunsigned char addr[6];\n\tu16 vid;\n\tlong unsigned int flags;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_br_mdb_full {\n\tstruct trace_entry ent;\n\tu32 __data_loc_dev;\n\tint af;\n\tu16 vid;\n\t__u8 src[16];\n\t__u8 grp[16];\n\t__u8 grpmac[6];\n\tchar __data[0];\n};\n\nstruct trace_event_raw_cache_tag_flush {\n\tstruct trace_entry ent;\n\tu32 __data_loc_iommu;\n\tu32 __data_loc_dev;\n\tu16 type;\n\tu16 domain_id;\n\tu32 pasid;\n\tlong unsigned int start;\n\tlong unsigned int end;\n\tlong unsigned int addr;\n\tlong unsigned int pages;\n\tlong unsigned int mask;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_cache_tag_log {\n\tstruct trace_entry ent;\n\tu32 __data_loc_iommu;\n\tu32 __data_loc_dev;\n\tu16 type;\n\tu16 domain_id;\n\tu32 pasid;\n\tu32 users;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_cdev_update {\n\tstruct trace_entry ent;\n\tu32 __data_loc_type;\n\tlong unsigned int target;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_cgroup {\n\tstruct trace_entry ent;\n\tint root;\n\tint level;\n\tu64 id;\n\tu32 __data_loc_path;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_cgroup_event {\n\tstruct trace_entry ent;\n\tint root;\n\tint level;\n\tu64 id;\n\tu32 __data_loc_path;\n\tint val;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_cgroup_migrate {\n\tstruct trace_entry ent;\n\tint dst_root;\n\tint dst_level;\n\tu64 dst_id;\n\tint pid;\n\tu32 __data_loc_dst_path;\n\tu32 __data_loc_comm;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_cgroup_root {\n\tstruct trace_entry ent;\n\tint root;\n\tu16 ss_mask;\n\tu32 __data_loc_name;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_cgroup_rstat {\n\tstruct trace_entry ent;\n\tint root;\n\tint level;\n\tu64 id;\n\tint cpu;\n\tbool contended;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_clk {\n\tstruct trace_entry ent;\n\tu32 __data_loc_name;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_clk_duty_cycle {\n\tstruct trace_entry ent;\n\tu32 __data_loc_name;\n\tunsigned int num;\n\tunsigned int den;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_clk_parent {\n\tstruct trace_entry ent;\n\tu32 __data_loc_name;\n\tu32 __data_loc_pname;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_clk_phase {\n\tstruct trace_entry ent;\n\tu32 __data_loc_name;\n\tint phase;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_clk_rate {\n\tstruct trace_entry ent;\n\tu32 __data_loc_name;\n\tlong unsigned int rate;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_clk_rate_range {\n\tstruct trace_entry ent;\n\tu32 __data_loc_name;\n\tlong unsigned int min;\n\tlong unsigned int max;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_clk_rate_request {\n\tstruct trace_entry ent;\n\tu32 __data_loc_name;\n\tu32 __data_loc_pname;\n\tlong unsigned int min;\n\tlong unsigned int max;\n\tlong unsigned int prate;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_clock {\n\tstruct trace_entry ent;\n\tu32 __data_loc_name;\n\tu64 state;\n\tu64 cpu_id;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_compact_retry {\n\tstruct trace_entry ent;\n\tint order;\n\tint priority;\n\tint result;\n\tint retries;\n\tint max_retries;\n\tbool ret;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_console {\n\tstruct trace_entry ent;\n\tu32 __data_loc_msg;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_consume_skb {\n\tstruct trace_entry ent;\n\tvoid *skbaddr;\n\tvoid *location;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_contention_begin {\n\tstruct trace_entry ent;\n\tvoid *lock_addr;\n\tunsigned int flags;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_contention_end {\n\tstruct trace_entry ent;\n\tvoid *lock_addr;\n\tint ret;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_context_tracking_user {\n\tstruct trace_entry ent;\n\tint dummy;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_cpu {\n\tstruct trace_entry ent;\n\tu32 state;\n\tu32 cpu_id;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_cpu_frequency_limits {\n\tstruct trace_entry ent;\n\tu32 min_freq;\n\tu32 max_freq;\n\tu32 cpu_id;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_cpu_idle_miss {\n\tstruct trace_entry ent;\n\tu32 cpu_id;\n\tu32 state;\n\tbool below;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_cpu_latency_qos_request {\n\tstruct trace_entry ent;\n\ts32 value;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_cpuhp_enter {\n\tstruct trace_entry ent;\n\tunsigned int cpu;\n\tint target;\n\tint idx;\n\tvoid *fun;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_cpuhp_exit {\n\tstruct trace_entry ent;\n\tunsigned int cpu;\n\tint state;\n\tint idx;\n\tint ret;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_cpuhp_multi_enter {\n\tstruct trace_entry ent;\n\tunsigned int cpu;\n\tint target;\n\tint idx;\n\tvoid *fun;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_cros_ec_request_done {\n\tstruct trace_entry ent;\n\tuint32_t version;\n\tuint32_t offset;\n\tuint32_t command;\n\tuint32_t outsize;\n\tuint32_t insize;\n\tuint32_t result;\n\tint retval;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_cros_ec_request_start {\n\tstruct trace_entry ent;\n\tuint32_t version;\n\tuint32_t offset;\n\tuint32_t command;\n\tuint32_t outsize;\n\tuint32_t insize;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_csd_function {\n\tstruct trace_entry ent;\n\tvoid *func;\n\tvoid *csd;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_csd_queue_cpu {\n\tstruct trace_entry ent;\n\tunsigned int cpu;\n\tvoid *callsite;\n\tvoid *func;\n\tvoid *csd;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_dax_insert_mapping {\n\tstruct trace_entry ent;\n\tlong unsigned int ino;\n\tlong unsigned int vm_flags;\n\tlong unsigned int address;\n\tvoid *radix_entry;\n\tdev_t dev;\n\tint write;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_dax_pmd_fault_class {\n\tstruct trace_entry ent;\n\tlong unsigned int ino;\n\tlong unsigned int vm_start;\n\tlong unsigned int vm_end;\n\tlong unsigned int vm_flags;\n\tlong unsigned int address;\n\tlong unsigned int pgoff;\n\tlong unsigned int max_pgoff;\n\tdev_t dev;\n\tunsigned int flags;\n\tint result;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_dax_pmd_insert_mapping_class {\n\tstruct trace_entry ent;\n\tlong unsigned int ino;\n\tlong unsigned int vm_flags;\n\tlong unsigned int address;\n\tlong int length;\n\tu64 pfn_val;\n\tvoid *radix_entry;\n\tdev_t dev;\n\tint write;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_dax_pmd_load_hole_class {\n\tstruct trace_entry ent;\n\tlong unsigned int ino;\n\tlong unsigned int vm_flags;\n\tlong unsigned int address;\n\tstruct folio *zero_folio;\n\tvoid *radix_entry;\n\tdev_t dev;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_dax_pte_fault_class {\n\tstruct trace_entry ent;\n\tlong unsigned int ino;\n\tlong unsigned int vm_flags;\n\tlong unsigned int address;\n\tlong unsigned int pgoff;\n\tdev_t dev;\n\tunsigned int flags;\n\tint result;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_dax_writeback_one {\n\tstruct trace_entry ent;\n\tlong unsigned int ino;\n\tlong unsigned int pgoff;\n\tlong unsigned int pglen;\n\tdev_t dev;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_dax_writeback_range_class {\n\tstruct trace_entry ent;\n\tlong unsigned int ino;\n\tlong unsigned int start_index;\n\tlong unsigned int end_index;\n\tdev_t dev;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_dev_pm_qos_request {\n\tstruct trace_entry ent;\n\tu32 __data_loc_name;\n\tenum dev_pm_qos_req_type type;\n\ts32 new_value;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_devfreq_frequency {\n\tstruct trace_entry ent;\n\tu32 __data_loc_dev_name;\n\tlong unsigned int freq;\n\tlong unsigned int prev_freq;\n\tlong unsigned int busy_time;\n\tlong unsigned int total_time;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_devfreq_monitor {\n\tstruct trace_entry ent;\n\tlong unsigned int freq;\n\tlong unsigned int busy_time;\n\tlong unsigned int total_time;\n\tunsigned int polling_ms;\n\tu32 __data_loc_dev_name;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_device_pm_callback_end {\n\tstruct trace_entry ent;\n\tu32 __data_loc_device;\n\tu32 __data_loc_driver;\n\tint error;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_device_pm_callback_start {\n\tstruct trace_entry ent;\n\tu32 __data_loc_device;\n\tu32 __data_loc_driver;\n\tu32 __data_loc_parent;\n\tu32 __data_loc_pm_ops;\n\tint event;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_devlink_health_recover_aborted {\n\tstruct trace_entry ent;\n\tu32 __data_loc_bus_name;\n\tu32 __data_loc_dev_name;\n\tu32 __data_loc_driver_name;\n\tu32 __data_loc_reporter_name;\n\tbool health_state;\n\tu64 time_since_last_recover;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_devlink_health_report {\n\tstruct trace_entry ent;\n\tu32 __data_loc_bus_name;\n\tu32 __data_loc_dev_name;\n\tu32 __data_loc_driver_name;\n\tu32 __data_loc_reporter_name;\n\tu32 __data_loc_msg;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_devlink_health_reporter_state_update {\n\tstruct trace_entry ent;\n\tu32 __data_loc_bus_name;\n\tu32 __data_loc_dev_name;\n\tu32 __data_loc_driver_name;\n\tu32 __data_loc_reporter_name;\n\tu8 new_state;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_devlink_hwerr {\n\tstruct trace_entry ent;\n\tu32 __data_loc_bus_name;\n\tu32 __data_loc_dev_name;\n\tu32 __data_loc_driver_name;\n\tint err;\n\tu32 __data_loc_msg;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_devlink_hwmsg {\n\tstruct trace_entry ent;\n\tu32 __data_loc_bus_name;\n\tu32 __data_loc_dev_name;\n\tu32 __data_loc_driver_name;\n\tbool incoming;\n\tlong unsigned int type;\n\tu32 __data_loc_buf;\n\tsize_t len;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_devlink_trap_report {\n\tstruct trace_entry ent;\n\tu32 __data_loc_bus_name;\n\tu32 __data_loc_dev_name;\n\tu32 __data_loc_driver_name;\n\tu32 __data_loc_trap_name;\n\tu32 __data_loc_trap_group_name;\n\tchar input_dev_name[16];\n\tchar __data[0];\n};\n\nstruct trace_event_raw_devres {\n\tstruct trace_entry ent;\n\tu32 __data_loc_devname;\n\tstruct device *dev;\n\tconst char *op;\n\tvoid *node;\n\tu32 __data_loc_name;\n\tsize_t size;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_dma_fence {\n\tstruct trace_entry ent;\n\tu32 __data_loc_driver;\n\tu32 __data_loc_timeline;\n\tunsigned int context;\n\tunsigned int seqno;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_dql_stall_detected {\n\tstruct trace_entry ent;\n\tshort unsigned int thrs;\n\tunsigned int len;\n\tlong unsigned int last_reap;\n\tlong unsigned int hist_head;\n\tlong unsigned int now;\n\tlong unsigned int hist[4];\n\tchar __data[0];\n};\n\nstruct trace_event_raw_drm_vblank_event {\n\tstruct trace_entry ent;\n\tint crtc;\n\tunsigned int seq;\n\tktime_t time;\n\tbool high_prec;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_drm_vblank_event_delivered {\n\tstruct trace_entry ent;\n\tstruct drm_file *file;\n\tint crtc;\n\tunsigned int seq;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_drm_vblank_event_queued {\n\tstruct trace_entry ent;\n\tstruct drm_file *file;\n\tint crtc;\n\tunsigned int seq;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_emulate_vsyscall {\n\tstruct trace_entry ent;\n\tint nr;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_error_da_monitor_id {\n\tstruct trace_entry ent;\n\tint id;\n\tchar state[24];\n\tchar event[24];\n\tchar __data[0];\n};\n\nstruct trace_event_raw_error_report_template {\n\tstruct trace_entry ent;\n\tenum error_detector error_detector;\n\tlong unsigned int id;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_event_da_monitor_id {\n\tstruct trace_entry ent;\n\tint id;\n\tchar state[24];\n\tchar event[24];\n\tchar next_state[24];\n\tbool final_state;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_exit_mmap {\n\tstruct trace_entry ent;\n\tstruct mm_struct *mm;\n\tstruct maple_tree *mt;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4__bitmap_load {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\t__u32 group;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4__es_extent {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tino_t ino;\n\text4_lblk_t lblk;\n\text4_lblk_t len;\n\text4_fsblk_t pblk;\n\tchar status;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4__es_shrink_enter {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tint nr_to_scan;\n\tint cache_cnt;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4__fallocate_mode {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tino_t ino;\n\tloff_t offset;\n\tloff_t len;\n\tint mode;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4__folio_op {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tino_t ino;\n\tlong unsigned int index;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4__map_blocks_enter {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tino_t ino;\n\text4_lblk_t lblk;\n\tunsigned int len;\n\tunsigned int flags;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4__map_blocks_exit {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tino_t ino;\n\tunsigned int flags;\n\text4_fsblk_t pblk;\n\text4_lblk_t lblk;\n\tunsigned int len;\n\tunsigned int mflags;\n\tint ret;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4__mb_new_pa {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tino_t ino;\n\t__u64 pa_pstart;\n\t__u64 pa_lstart;\n\t__u32 pa_len;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4__mballoc {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tino_t ino;\n\tint result_start;\n\t__u32 result_group;\n\tint result_len;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4__trim {\n\tstruct trace_entry ent;\n\tint dev_major;\n\tint dev_minor;\n\t__u32 group;\n\tint start;\n\tint len;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4__truncate {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tino_t ino;\n\t__u64 blocks;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4__write_begin {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tino_t ino;\n\tloff_t pos;\n\tunsigned int len;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4__write_end {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tino_t ino;\n\tloff_t pos;\n\tunsigned int len;\n\tunsigned int copied;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4_alloc_da_blocks {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tino_t ino;\n\tunsigned int data_blocks;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4_allocate_blocks {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tino_t ino;\n\t__u64 block;\n\tunsigned int len;\n\t__u32 logical;\n\t__u32 lleft;\n\t__u32 lright;\n\t__u64 goal;\n\t__u64 pleft;\n\t__u64 pright;\n\tunsigned int flags;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4_allocate_inode {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tino_t ino;\n\tino_t dir;\n\t__u16 mode;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4_begin_ordered_truncate {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tino_t ino;\n\tloff_t new_size;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4_collapse_range {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tino_t ino;\n\tloff_t offset;\n\tloff_t len;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4_da_release_space {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tino_t ino;\n\t__u64 i_blocks;\n\tint freed_blocks;\n\tint reserved_data_blocks;\n\t__u16 mode;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4_da_reserve_space {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tino_t ino;\n\t__u64 i_blocks;\n\tint reserve_blocks;\n\tint reserved_data_blocks;\n\t__u16 mode;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4_da_update_reserve_space {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tino_t ino;\n\t__u64 i_blocks;\n\tint used_blocks;\n\tint reserved_data_blocks;\n\tint quota_claim;\n\t__u16 mode;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4_da_write_pages {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tino_t ino;\n\tlong unsigned int first_page;\n\tlong int nr_to_write;\n\tint sync_mode;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4_da_write_pages_extent {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tino_t ino;\n\t__u64 lblk;\n\t__u32 len;\n\t__u32 flags;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4_discard_blocks {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\t__u64 blk;\n\t__u64 count;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4_discard_preallocations {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tino_t ino;\n\tunsigned int len;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4_drop_inode {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tino_t ino;\n\tint drop;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4_error {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tconst char *function;\n\tunsigned int line;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4_es_find_extent_range_enter {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tino_t ino;\n\text4_lblk_t lblk;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4_es_find_extent_range_exit {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tino_t ino;\n\text4_lblk_t lblk;\n\text4_lblk_t len;\n\text4_fsblk_t pblk;\n\tchar status;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4_es_insert_delayed_extent {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tino_t ino;\n\text4_lblk_t lblk;\n\text4_lblk_t len;\n\text4_fsblk_t pblk;\n\tchar status;\n\tbool lclu_allocated;\n\tbool end_allocated;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4_es_lookup_extent_enter {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tino_t ino;\n\text4_lblk_t lblk;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4_es_lookup_extent_exit {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tino_t ino;\n\text4_lblk_t lblk;\n\text4_lblk_t len;\n\text4_fsblk_t pblk;\n\tchar status;\n\tint found;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4_es_remove_extent {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tino_t ino;\n\tloff_t lblk;\n\tloff_t len;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4_es_shrink {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tint nr_shrunk;\n\tlong long unsigned int scan_time;\n\tint nr_skipped;\n\tint retried;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4_es_shrink_scan_exit {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tint nr_shrunk;\n\tint cache_cnt;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4_evict_inode {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tino_t ino;\n\tint nlink;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4_ext_convert_to_initialized_enter {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tino_t ino;\n\text4_lblk_t m_lblk;\n\tunsigned int m_len;\n\text4_lblk_t u_lblk;\n\tunsigned int u_len;\n\text4_fsblk_t u_pblk;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4_ext_convert_to_initialized_fastpath {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tino_t ino;\n\text4_lblk_t m_lblk;\n\tunsigned int m_len;\n\text4_lblk_t u_lblk;\n\tunsigned int u_len;\n\text4_fsblk_t u_pblk;\n\text4_lblk_t i_lblk;\n\tunsigned int i_len;\n\text4_fsblk_t i_pblk;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4_ext_handle_unwritten_extents {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tino_t ino;\n\tint flags;\n\text4_lblk_t lblk;\n\text4_fsblk_t pblk;\n\tunsigned int len;\n\tunsigned int allocated;\n\text4_fsblk_t newblk;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4_ext_load_extent {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tino_t ino;\n\text4_fsblk_t pblk;\n\text4_lblk_t lblk;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4_ext_remove_space {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tino_t ino;\n\text4_lblk_t start;\n\text4_lblk_t end;\n\tint depth;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4_ext_remove_space_done {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tino_t ino;\n\text4_lblk_t start;\n\text4_lblk_t end;\n\tint depth;\n\text4_fsblk_t pc_pclu;\n\text4_lblk_t pc_lblk;\n\tint pc_state;\n\tshort unsigned int eh_entries;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4_ext_rm_idx {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tino_t ino;\n\text4_fsblk_t pblk;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4_ext_rm_leaf {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tino_t ino;\n\text4_lblk_t start;\n\text4_lblk_t ee_lblk;\n\text4_fsblk_t ee_pblk;\n\tshort int ee_len;\n\text4_fsblk_t pc_pclu;\n\text4_lblk_t pc_lblk;\n\tint pc_state;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4_ext_show_extent {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tino_t ino;\n\text4_fsblk_t pblk;\n\text4_lblk_t lblk;\n\tshort unsigned int len;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4_fallocate_exit {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tino_t ino;\n\tloff_t pos;\n\tunsigned int blocks;\n\tint ret;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4_fc_cleanup {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tint j_fc_off;\n\tint full;\n\ttid_t tid;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4_fc_commit_start {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\ttid_t tid;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4_fc_commit_stop {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tint nblks;\n\tint reason;\n\tint num_fc;\n\tint num_fc_ineligible;\n\tint nblks_agg;\n\ttid_t tid;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4_fc_replay {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tint tag;\n\tint ino;\n\tint priv1;\n\tint priv2;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4_fc_replay_scan {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tint error;\n\tint off;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4_fc_stats {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tunsigned int fc_ineligible_rc[10];\n\tlong unsigned int fc_commits;\n\tlong unsigned int fc_ineligible_commits;\n\tlong unsigned int fc_numblks;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4_fc_track_dentry {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\ttid_t t_tid;\n\tino_t i_ino;\n\ttid_t i_sync_tid;\n\tint error;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4_fc_track_inode {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\ttid_t t_tid;\n\tino_t i_ino;\n\ttid_t i_sync_tid;\n\tint error;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4_fc_track_range {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\ttid_t t_tid;\n\tino_t i_ino;\n\ttid_t i_sync_tid;\n\tlong int start;\n\tlong int end;\n\tint error;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4_forget {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tino_t ino;\n\t__u64 block;\n\tint is_metadata;\n\t__u16 mode;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4_free_blocks {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tino_t ino;\n\t__u64 block;\n\tlong unsigned int count;\n\tint flags;\n\t__u16 mode;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4_free_inode {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tino_t ino;\n\tuid_t uid;\n\tgid_t gid;\n\t__u64 blocks;\n\t__u16 mode;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4_fsmap_class {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tdev_t keydev;\n\tu32 agno;\n\tu64 bno;\n\tu64 len;\n\tu64 owner;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4_get_implied_cluster_alloc_exit {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tunsigned int flags;\n\text4_lblk_t lblk;\n\text4_fsblk_t pblk;\n\tunsigned int len;\n\tint ret;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4_getfsmap_class {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tdev_t keydev;\n\tu64 block;\n\tu64 len;\n\tu64 owner;\n\tu64 flags;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4_insert_range {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tino_t ino;\n\tloff_t offset;\n\tloff_t len;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4_invalidate_folio_op {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tino_t ino;\n\tlong unsigned int index;\n\tsize_t offset;\n\tsize_t length;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4_journal_start_inode {\n\tstruct trace_entry ent;\n\tlong unsigned int ino;\n\tdev_t dev;\n\tlong unsigned int ip;\n\tint blocks;\n\tint rsv_blocks;\n\tint revoke_creds;\n\tint type;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4_journal_start_reserved {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tlong unsigned int ip;\n\tint blocks;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4_journal_start_sb {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tlong unsigned int ip;\n\tint blocks;\n\tint rsv_blocks;\n\tint revoke_creds;\n\tint type;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4_lazy_itable_init {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\t__u32 group;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4_load_inode {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tino_t ino;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4_mark_inode_dirty {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tino_t ino;\n\tlong unsigned int ip;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4_mb_discard_preallocations {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tint needed;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4_mb_release_group_pa {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\t__u64 pa_pstart;\n\t__u32 pa_len;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4_mb_release_inode_pa {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tino_t ino;\n\t__u64 block;\n\t__u32 count;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4_mballoc_alloc {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tino_t ino;\n\t__u32 orig_logical;\n\tint orig_start;\n\t__u32 orig_group;\n\tint orig_len;\n\t__u32 goal_logical;\n\tint goal_start;\n\t__u32 goal_group;\n\tint goal_len;\n\t__u32 result_logical;\n\tint result_start;\n\t__u32 result_group;\n\tint result_len;\n\t__u16 found;\n\t__u16 groups;\n\t__u16 buddy;\n\t__u16 flags;\n\t__u16 tail;\n\t__u8 cr;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4_mballoc_prealloc {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tino_t ino;\n\t__u32 orig_logical;\n\tint orig_start;\n\t__u32 orig_group;\n\tint orig_len;\n\t__u32 result_logical;\n\tint result_start;\n\t__u32 result_group;\n\tint result_len;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4_nfs_commit_metadata {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tino_t ino;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4_other_inode_update_time {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tino_t ino;\n\tino_t orig_ino;\n\tuid_t uid;\n\tgid_t gid;\n\t__u16 mode;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4_prefetch_bitmaps {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\t__u32 group;\n\t__u32 next;\n\t__u32 ios;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4_read_block_bitmap_load {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\t__u32 group;\n\tbool prefetch;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4_remove_blocks {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tino_t ino;\n\text4_lblk_t from;\n\text4_lblk_t to;\n\text4_fsblk_t ee_pblk;\n\text4_lblk_t ee_lblk;\n\tshort unsigned int ee_len;\n\text4_fsblk_t pc_pclu;\n\text4_lblk_t pc_lblk;\n\tint pc_state;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4_request_blocks {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tino_t ino;\n\tunsigned int len;\n\t__u32 logical;\n\t__u32 lleft;\n\t__u32 lright;\n\t__u64 goal;\n\t__u64 pleft;\n\t__u64 pright;\n\tunsigned int flags;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4_request_inode {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tino_t dir;\n\t__u16 mode;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4_shutdown {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tunsigned int flags;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4_sync_file_enter {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tino_t ino;\n\tino_t parent;\n\tint datasync;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4_sync_file_exit {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tino_t ino;\n\tint ret;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4_sync_fs {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tint wait;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4_unlink_enter {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tino_t ino;\n\tino_t parent;\n\tloff_t size;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4_unlink_exit {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tino_t ino;\n\tint ret;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4_update_sb {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\text4_fsblk_t fsblk;\n\tunsigned int flags;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4_writepages {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tino_t ino;\n\tlong int nr_to_write;\n\tlong int pages_skipped;\n\tloff_t range_start;\n\tloff_t range_end;\n\tlong unsigned int writeback_index;\n\tint sync_mode;\n\tchar for_kupdate;\n\tchar range_cyclic;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ext4_writepages_result {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tino_t ino;\n\tint ret;\n\tint pages_written;\n\tlong int pages_skipped;\n\tlong unsigned int writeback_index;\n\tint sync_mode;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_extlog_mem_event {\n\tstruct trace_entry ent;\n\tu32 err_seq;\n\tu8 etype;\n\tu8 sev;\n\tu64 pa;\n\tu8 pa_mask_lsb;\n\tguid_t fru_id;\n\tu32 __data_loc_fru_text;\n\tstruct cper_mem_err_compact data;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_fdb_delete {\n\tstruct trace_entry ent;\n\tu32 __data_loc_br_dev;\n\tu32 __data_loc_dev;\n\tunsigned char addr[6];\n\tu16 vid;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_fib6_table_lookup {\n\tstruct trace_entry ent;\n\tu32 tb_id;\n\tint err;\n\tint oif;\n\tint iif;\n\t__u8 tos;\n\t__u8 scope;\n\t__u8 flags;\n\t__u8 src[16];\n\t__u8 dst[16];\n\tu16 sport;\n\tu16 dport;\n\tu8 proto;\n\tu8 rt_type;\n\tchar name[16];\n\t__u8 gw[16];\n\tchar __data[0];\n};\n\nstruct trace_event_raw_fib_table_lookup {\n\tstruct trace_entry ent;\n\tu32 tb_id;\n\tint err;\n\tint oif;\n\tint iif;\n\tu8 proto;\n\t__u8 tos;\n\t__u8 scope;\n\t__u8 flags;\n\t__u8 src[4];\n\t__u8 dst[4];\n\t__u8 gw4[4];\n\t__u8 gw6[16];\n\tu16 sport;\n\tu16 dport;\n\tchar name[16];\n\tchar __data[0];\n};\n\nstruct trace_event_raw_file_check_and_advance_wb_err {\n\tstruct trace_entry ent;\n\tstruct file *file;\n\tlong unsigned int i_ino;\n\tdev_t s_dev;\n\terrseq_t old;\n\terrseq_t new;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_filelock_lease {\n\tstruct trace_entry ent;\n\tstruct file_lease *fl;\n\tlong unsigned int i_ino;\n\tdev_t s_dev;\n\tstruct file_lock_core *blocker;\n\tfl_owner_t owner;\n\tunsigned int flags;\n\tunsigned char type;\n\tlong unsigned int break_time;\n\tlong unsigned int downgrade_time;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_filelock_lock {\n\tstruct trace_entry ent;\n\tstruct file_lock *fl;\n\tlong unsigned int i_ino;\n\tdev_t s_dev;\n\tstruct file_lock_core *blocker;\n\tfl_owner_t owner;\n\tunsigned int pid;\n\tunsigned int flags;\n\tunsigned char type;\n\tloff_t fl_start;\n\tloff_t fl_end;\n\tint ret;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_filemap_set_wb_err {\n\tstruct trace_entry ent;\n\tlong unsigned int i_ino;\n\tdev_t s_dev;\n\terrseq_t errseq;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_finish_task_reaping {\n\tstruct trace_entry ent;\n\tint pid;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_flush_foreign {\n\tstruct trace_entry ent;\n\tchar name[32];\n\tino_t cgroup_ino;\n\tunsigned int frn_bdi_id;\n\tunsigned int frn_memcg_id;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_free_vmap_area_noflush {\n\tstruct trace_entry ent;\n\tlong unsigned int va_start;\n\tlong unsigned int nr_lazy;\n\tlong unsigned int nr_lazy_max;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_generic_add_lease {\n\tstruct trace_entry ent;\n\tlong unsigned int i_ino;\n\tint wcount;\n\tint rcount;\n\tint icount;\n\tdev_t s_dev;\n\tfl_owner_t owner;\n\tunsigned int flags;\n\tunsigned char type;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_global_dirty_state {\n\tstruct trace_entry ent;\n\tlong unsigned int nr_dirty;\n\tlong unsigned int nr_writeback;\n\tlong unsigned int background_thresh;\n\tlong unsigned int dirty_thresh;\n\tlong unsigned int dirty_limit;\n\tlong unsigned int nr_dirtied;\n\tlong unsigned int nr_written;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_gpio_direction {\n\tstruct trace_entry ent;\n\tunsigned int gpio;\n\tint in;\n\tint err;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_gpio_value {\n\tstruct trace_entry ent;\n\tunsigned int gpio;\n\tint get;\n\tint value;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_guest_halt_poll_ns {\n\tstruct trace_entry ent;\n\tbool grow;\n\tunsigned int new;\n\tunsigned int old;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_handshake_alert_class {\n\tstruct trace_entry ent;\n\t__u8 saddr[28];\n\t__u8 daddr[28];\n\tunsigned int netns_ino;\n\tlong unsigned int level;\n\tlong unsigned int description;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_handshake_complete {\n\tstruct trace_entry ent;\n\tconst void *req;\n\tconst void *sk;\n\tint status;\n\tunsigned int netns_ino;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_handshake_error_class {\n\tstruct trace_entry ent;\n\tconst void *req;\n\tconst void *sk;\n\tint err;\n\tunsigned int netns_ino;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_handshake_event_class {\n\tstruct trace_entry ent;\n\tconst void *req;\n\tconst void *sk;\n\tunsigned int netns_ino;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_handshake_fd_class {\n\tstruct trace_entry ent;\n\tconst void *req;\n\tconst void *sk;\n\tint fd;\n\tunsigned int netns_ino;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_hrtimer_class {\n\tstruct trace_entry ent;\n\tvoid *hrtimer;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_hrtimer_expire_entry {\n\tstruct trace_entry ent;\n\tvoid *hrtimer;\n\ts64 now;\n\tvoid *function;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_hrtimer_init {\n\tstruct trace_entry ent;\n\tvoid *hrtimer;\n\tclockid_t clockid;\n\tenum hrtimer_mode mode;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_hrtimer_start {\n\tstruct trace_entry ent;\n\tvoid *hrtimer;\n\tvoid *function;\n\ts64 expires;\n\ts64 softexpires;\n\tenum hrtimer_mode mode;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_hugepage_set {\n\tstruct trace_entry ent;\n\tlong unsigned int addr;\n\tlong unsigned int pte;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_hugepage_update {\n\tstruct trace_entry ent;\n\tlong unsigned int addr;\n\tlong unsigned int pte;\n\tlong unsigned int clr;\n\tlong unsigned int set;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_hwmon_attr_class {\n\tstruct trace_entry ent;\n\tint index;\n\tu32 __data_loc_attr_name;\n\tlong int val;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_hwmon_attr_show_string {\n\tstruct trace_entry ent;\n\tint index;\n\tu32 __data_loc_attr_name;\n\tu32 __data_loc_label;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_hyperv_mmu_flush_tlb_multi {\n\tstruct trace_entry ent;\n\tunsigned int ncpus;\n\tstruct mm_struct *mm;\n\tlong unsigned int addr;\n\tlong unsigned int end;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_hyperv_nested_flush_guest_mapping {\n\tstruct trace_entry ent;\n\tu64 as;\n\tint ret;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_hyperv_nested_flush_guest_mapping_range {\n\tstruct trace_entry ent;\n\tu64 as;\n\tint ret;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_hyperv_send_ipi_mask {\n\tstruct trace_entry ent;\n\tunsigned int ncpus;\n\tint vector;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_hyperv_send_ipi_one {\n\tstruct trace_entry ent;\n\tint cpu;\n\tint vector;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_i2c_read {\n\tstruct trace_entry ent;\n\tint adapter_nr;\n\t__u16 msg_nr;\n\t__u16 addr;\n\t__u16 flags;\n\t__u16 len;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_i2c_reply {\n\tstruct trace_entry ent;\n\tint adapter_nr;\n\t__u16 msg_nr;\n\t__u16 addr;\n\t__u16 flags;\n\t__u16 len;\n\tu32 __data_loc_buf;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_i2c_result {\n\tstruct trace_entry ent;\n\tint adapter_nr;\n\t__u16 nr_msgs;\n\t__s16 ret;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_i2c_write {\n\tstruct trace_entry ent;\n\tint adapter_nr;\n\t__u16 msg_nr;\n\t__u16 addr;\n\t__u16 flags;\n\t__u16 len;\n\tu32 __data_loc_buf;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_icc_set_bw {\n\tstruct trace_entry ent;\n\tu32 __data_loc_path_name;\n\tu32 __data_loc_dev;\n\tu32 __data_loc_node_name;\n\tu32 avg_bw;\n\tu32 peak_bw;\n\tu32 node_avg_bw;\n\tu32 node_peak_bw;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_icc_set_bw_end {\n\tstruct trace_entry ent;\n\tu32 __data_loc_path_name;\n\tu32 __data_loc_dev;\n\tint ret;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_icmp_send {\n\tstruct trace_entry ent;\n\tconst void *skbaddr;\n\tint type;\n\tint code;\n\t__u8 saddr[4];\n\t__u8 daddr[4];\n\t__u16 sport;\n\t__u16 dport;\n\tshort unsigned int ulen;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_inet_sk_error_report {\n\tstruct trace_entry ent;\n\tint error;\n\t__u16 sport;\n\t__u16 dport;\n\t__u16 family;\n\t__u16 protocol;\n\t__u8 saddr[4];\n\t__u8 daddr[4];\n\t__u8 saddr_v6[16];\n\t__u8 daddr_v6[16];\n\tchar __data[0];\n};\n\nstruct trace_event_raw_inet_sock_set_state {\n\tstruct trace_entry ent;\n\tconst void *skaddr;\n\tint oldstate;\n\tint newstate;\n\t__u16 sport;\n\t__u16 dport;\n\t__u16 family;\n\t__u16 protocol;\n\t__u8 saddr[4];\n\t__u8 daddr[4];\n\t__u8 saddr_v6[16];\n\t__u8 daddr_v6[16];\n\tchar __data[0];\n};\n\ntypedef int (*initcall_t)(void);\n\nstruct trace_event_raw_initcall_finish {\n\tstruct trace_entry ent;\n\tinitcall_t func;\n\tint ret;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_initcall_level {\n\tstruct trace_entry ent;\n\tu32 __data_loc_level;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_initcall_start {\n\tstruct trace_entry ent;\n\tinitcall_t func;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_inode_foreign_history {\n\tstruct trace_entry ent;\n\tchar name[32];\n\tino_t ino;\n\tino_t cgroup_ino;\n\tunsigned int history;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_inode_switch_wbs {\n\tstruct trace_entry ent;\n\tchar name[32];\n\tino_t ino;\n\tino_t old_cgroup_ino;\n\tino_t new_cgroup_ino;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_io_uring_complete {\n\tstruct trace_entry ent;\n\tvoid *ctx;\n\tvoid *req;\n\tu64 user_data;\n\tint res;\n\tunsigned int cflags;\n\tu64 extra1;\n\tu64 extra2;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_io_uring_cqe_overflow {\n\tstruct trace_entry ent;\n\tvoid *ctx;\n\tlong long unsigned int user_data;\n\ts32 res;\n\tu32 cflags;\n\tvoid *ocqe;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_io_uring_cqring_wait {\n\tstruct trace_entry ent;\n\tvoid *ctx;\n\tint min_events;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_io_uring_create {\n\tstruct trace_entry ent;\n\tint fd;\n\tvoid *ctx;\n\tu32 sq_entries;\n\tu32 cq_entries;\n\tu32 flags;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_io_uring_defer {\n\tstruct trace_entry ent;\n\tvoid *ctx;\n\tvoid *req;\n\tlong long unsigned int data;\n\tu8 opcode;\n\tu32 __data_loc_op_str;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_io_uring_fail_link {\n\tstruct trace_entry ent;\n\tvoid *ctx;\n\tvoid *req;\n\tlong long unsigned int user_data;\n\tu8 opcode;\n\tvoid *link;\n\tu32 __data_loc_op_str;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_io_uring_file_get {\n\tstruct trace_entry ent;\n\tvoid *ctx;\n\tvoid *req;\n\tu64 user_data;\n\tint fd;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_io_uring_link {\n\tstruct trace_entry ent;\n\tvoid *ctx;\n\tvoid *req;\n\tvoid *target_req;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_io_uring_local_work_run {\n\tstruct trace_entry ent;\n\tvoid *ctx;\n\tint count;\n\tunsigned int loops;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_io_uring_poll_arm {\n\tstruct trace_entry ent;\n\tvoid *ctx;\n\tvoid *req;\n\tlong long unsigned int user_data;\n\tu8 opcode;\n\tint mask;\n\tint events;\n\tu32 __data_loc_op_str;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_io_uring_queue_async_work {\n\tstruct trace_entry ent;\n\tvoid *ctx;\n\tvoid *req;\n\tu64 user_data;\n\tu8 opcode;\n\tlong long unsigned int flags;\n\tstruct io_wq_work *work;\n\tint rw;\n\tu32 __data_loc_op_str;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_io_uring_register {\n\tstruct trace_entry ent;\n\tvoid *ctx;\n\tunsigned int opcode;\n\tunsigned int nr_files;\n\tunsigned int nr_bufs;\n\tlong int ret;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_io_uring_req_failed {\n\tstruct trace_entry ent;\n\tvoid *ctx;\n\tvoid *req;\n\tlong long unsigned int user_data;\n\tu8 opcode;\n\tu8 flags;\n\tu8 ioprio;\n\tu64 off;\n\tu64 addr;\n\tu32 len;\n\tu32 op_flags;\n\tu16 buf_index;\n\tu16 personality;\n\tu32 file_index;\n\tu64 pad1;\n\tu64 addr3;\n\tint error;\n\tu32 __data_loc_op_str;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_io_uring_short_write {\n\tstruct trace_entry ent;\n\tvoid *ctx;\n\tu64 fpos;\n\tu64 wanted;\n\tu64 got;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_io_uring_submit_req {\n\tstruct trace_entry ent;\n\tvoid *ctx;\n\tvoid *req;\n\tlong long unsigned int user_data;\n\tu8 opcode;\n\tlong long unsigned int flags;\n\tbool sq_thread;\n\tu32 __data_loc_op_str;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_io_uring_task_add {\n\tstruct trace_entry ent;\n\tvoid *ctx;\n\tvoid *req;\n\tlong long unsigned int user_data;\n\tu8 opcode;\n\tint mask;\n\tu32 __data_loc_op_str;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_io_uring_task_work_run {\n\tstruct trace_entry ent;\n\tvoid *tctx;\n\tunsigned int count;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_iocg_inuse_update {\n\tstruct trace_entry ent;\n\tu32 __data_loc_devname;\n\tu32 __data_loc_cgroup;\n\tu64 now;\n\tu32 old_inuse;\n\tu32 new_inuse;\n\tu64 old_hweight_inuse;\n\tu64 new_hweight_inuse;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_iocost_ioc_vrate_adj {\n\tstruct trace_entry ent;\n\tu32 __data_loc_devname;\n\tu64 old_vrate;\n\tu64 new_vrate;\n\tint busy_level;\n\tu32 read_missed_ppm;\n\tu32 write_missed_ppm;\n\tu32 rq_wait_pct;\n\tint nr_lagging;\n\tint nr_shortages;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_iocost_iocg_forgive_debt {\n\tstruct trace_entry ent;\n\tu32 __data_loc_devname;\n\tu32 __data_loc_cgroup;\n\tu64 now;\n\tu64 vnow;\n\tu32 usage_pct;\n\tu64 old_debt;\n\tu64 new_debt;\n\tu64 old_delay;\n\tu64 new_delay;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_iocost_iocg_state {\n\tstruct trace_entry ent;\n\tu32 __data_loc_devname;\n\tu32 __data_loc_cgroup;\n\tu64 now;\n\tu64 vnow;\n\tu64 vrate;\n\tu64 last_period;\n\tu64 cur_period;\n\tu64 vtime;\n\tu32 weight;\n\tu32 inuse;\n\tu64 hweight_active;\n\tu64 hweight_inuse;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_iomap_class {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tu64 ino;\n\tu64 addr;\n\tloff_t offset;\n\tu64 length;\n\tu16 type;\n\tu16 flags;\n\tdev_t bdev;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_iomap_dio_complete {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tino_t ino;\n\tloff_t isize;\n\tloff_t pos;\n\tint ki_flags;\n\tbool aio;\n\tint error;\n\tssize_t ret;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_iomap_dio_rw_begin {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tino_t ino;\n\tloff_t isize;\n\tloff_t pos;\n\tsize_t count;\n\tsize_t done_before;\n\tint ki_flags;\n\tunsigned int dio_flags;\n\tbool aio;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_iomap_iter {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tu64 ino;\n\tloff_t pos;\n\tu64 length;\n\ts64 processed;\n\tunsigned int flags;\n\tconst void *ops;\n\tlong unsigned int caller;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_iomap_range_class {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tu64 ino;\n\tloff_t size;\n\tloff_t offset;\n\tu64 length;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_iomap_readpage_class {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tu64 ino;\n\tint nr_pages;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_iomap_writepage_map {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tu64 ino;\n\tu64 pos;\n\tu64 dirty_len;\n\tu64 addr;\n\tloff_t offset;\n\tu64 length;\n\tu16 type;\n\tu16 flags;\n\tdev_t bdev;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_iommu_device_event {\n\tstruct trace_entry ent;\n\tu32 __data_loc_device;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_iommu_error {\n\tstruct trace_entry ent;\n\tu32 __data_loc_device;\n\tu32 __data_loc_driver;\n\tu64 iova;\n\tint flags;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_iommu_group_event {\n\tstruct trace_entry ent;\n\tint gid;\n\tu32 __data_loc_device;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ipi_handler {\n\tstruct trace_entry ent;\n\tconst char *reason;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ipi_raise {\n\tstruct trace_entry ent;\n\tu32 __data_loc_target_cpus;\n\tconst char *reason;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ipi_send_cpu {\n\tstruct trace_entry ent;\n\tunsigned int cpu;\n\tvoid *callsite;\n\tvoid *callback;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ipi_send_cpumask {\n\tstruct trace_entry ent;\n\tu32 __data_loc_cpumask;\n\tvoid *callsite;\n\tvoid *callback;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_irq_handler_entry {\n\tstruct trace_entry ent;\n\tint irq;\n\tu32 __data_loc_name;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_irq_handler_exit {\n\tstruct trace_entry ent;\n\tint irq;\n\tint ret;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_irq_matrix_cpu {\n\tstruct trace_entry ent;\n\tint bit;\n\tunsigned int cpu;\n\tbool online;\n\tunsigned int available;\n\tunsigned int allocated;\n\tunsigned int managed;\n\tunsigned int online_maps;\n\tunsigned int global_available;\n\tunsigned int global_reserved;\n\tunsigned int total_allocated;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_irq_matrix_global {\n\tstruct trace_entry ent;\n\tunsigned int online_maps;\n\tunsigned int global_available;\n\tunsigned int global_reserved;\n\tunsigned int total_allocated;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_irq_matrix_global_update {\n\tstruct trace_entry ent;\n\tint bit;\n\tunsigned int online_maps;\n\tunsigned int global_available;\n\tunsigned int global_reserved;\n\tunsigned int total_allocated;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_irq_noise {\n\tstruct trace_entry ent;\n\tu64 start;\n\tu64 duration;\n\tu32 __data_loc_desc;\n\tint vector;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_itimer_expire {\n\tstruct trace_entry ent;\n\tint which;\n\tpid_t pid;\n\tlong long unsigned int now;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_itimer_state {\n\tstruct trace_entry ent;\n\tint which;\n\tlong long unsigned int expires;\n\tlong int value_sec;\n\tlong int value_nsec;\n\tlong int interval_sec;\n\tlong int interval_nsec;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_jbd2_checkpoint {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tint result;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_jbd2_checkpoint_stats {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\ttid_t tid;\n\tlong unsigned int chp_time;\n\t__u32 forced_to_close;\n\t__u32 written;\n\t__u32 dropped;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_jbd2_commit {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tchar sync_commit;\n\ttid_t transaction;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_jbd2_end_commit {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tchar sync_commit;\n\ttid_t transaction;\n\ttid_t head;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_jbd2_handle_extend {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\ttid_t tid;\n\tunsigned int type;\n\tunsigned int line_no;\n\tint buffer_credits;\n\tint requested_blocks;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_jbd2_handle_start_class {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\ttid_t tid;\n\tunsigned int type;\n\tunsigned int line_no;\n\tint requested_blocks;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_jbd2_handle_stats {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\ttid_t tid;\n\tunsigned int type;\n\tunsigned int line_no;\n\tint interval;\n\tint sync;\n\tint requested_blocks;\n\tint dirtied_blocks;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_jbd2_journal_shrink {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tlong unsigned int nr_to_scan;\n\tlong unsigned int count;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_jbd2_lock_buffer_stall {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tlong unsigned int stall_ms;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_jbd2_run_stats {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\ttid_t tid;\n\tlong unsigned int wait;\n\tlong unsigned int request_delay;\n\tlong unsigned int running;\n\tlong unsigned int locked;\n\tlong unsigned int flushing;\n\tlong unsigned int logging;\n\t__u32 handle_count;\n\t__u32 blocks;\n\t__u32 blocks_logged;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_jbd2_shrink_checkpoint_list {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\ttid_t first_tid;\n\ttid_t tid;\n\ttid_t last_tid;\n\tlong unsigned int nr_freed;\n\ttid_t next_tid;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_jbd2_shrink_scan_exit {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tlong unsigned int nr_to_scan;\n\tlong unsigned int nr_shrunk;\n\tlong unsigned int count;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_jbd2_submit_inode_data {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tino_t ino;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_jbd2_update_log_tail {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\ttid_t tail_sequence;\n\ttid_t first_tid;\n\tlong unsigned int block_nr;\n\tlong unsigned int freed;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_jbd2_write_superblock {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tblk_opf_t write_flags;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_kcompactd_wake_template {\n\tstruct trace_entry ent;\n\tint nid;\n\tint order;\n\tenum zone_type highest_zoneidx;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_kfree {\n\tstruct trace_entry ent;\n\tlong unsigned int call_site;\n\tconst void *ptr;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_kfree_skb {\n\tstruct trace_entry ent;\n\tvoid *skbaddr;\n\tvoid *location;\n\tvoid *rx_sk;\n\tshort unsigned int protocol;\n\tenum skb_drop_reason reason;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_kmalloc {\n\tstruct trace_entry ent;\n\tlong unsigned int call_site;\n\tconst void *ptr;\n\tsize_t bytes_req;\n\tsize_t bytes_alloc;\n\tlong unsigned int gfp_flags;\n\tint node;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_kmem_cache_alloc {\n\tstruct trace_entry ent;\n\tlong unsigned int call_site;\n\tconst void *ptr;\n\tsize_t bytes_req;\n\tsize_t bytes_alloc;\n\tlong unsigned int gfp_flags;\n\tint node;\n\tbool accounted;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_kmem_cache_free {\n\tstruct trace_entry ent;\n\tlong unsigned int call_site;\n\tconst void *ptr;\n\tu32 __data_loc_name;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ksm_advisor {\n\tstruct trace_entry ent;\n\ts64 scan_time;\n\tlong unsigned int pages_to_scan;\n\tunsigned int cpu_percent;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ksm_enter_exit_template {\n\tstruct trace_entry ent;\n\tvoid *mm;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ksm_merge_one_page {\n\tstruct trace_entry ent;\n\tlong unsigned int pfn;\n\tvoid *rmap_item;\n\tvoid *mm;\n\tint err;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ksm_merge_with_ksm_page {\n\tstruct trace_entry ent;\n\tvoid *ksm_page;\n\tlong unsigned int pfn;\n\tvoid *rmap_item;\n\tvoid *mm;\n\tint err;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ksm_remove_ksm_page {\n\tstruct trace_entry ent;\n\tlong unsigned int pfn;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ksm_remove_rmap_item {\n\tstruct trace_entry ent;\n\tlong unsigned int pfn;\n\tvoid *rmap_item;\n\tvoid *mm;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ksm_scan_template {\n\tstruct trace_entry ent;\n\tint seq;\n\tu32 rmap_entries;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_leases_conflict {\n\tstruct trace_entry ent;\n\tvoid *lease;\n\tvoid *breaker;\n\tunsigned int l_fl_flags;\n\tunsigned int b_fl_flags;\n\tunsigned char l_fl_type;\n\tunsigned char b_fl_type;\n\tbool conflict;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_locks_get_lock_context {\n\tstruct trace_entry ent;\n\tlong unsigned int i_ino;\n\tdev_t s_dev;\n\tunsigned char type;\n\tstruct file_lock_context *ctx;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ma_op {\n\tstruct trace_entry ent;\n\tconst char *fn;\n\tlong unsigned int min;\n\tlong unsigned int max;\n\tlong unsigned int index;\n\tlong unsigned int last;\n\tvoid *node;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ma_read {\n\tstruct trace_entry ent;\n\tconst char *fn;\n\tlong unsigned int min;\n\tlong unsigned int max;\n\tlong unsigned int index;\n\tlong unsigned int last;\n\tvoid *node;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_ma_write {\n\tstruct trace_entry ent;\n\tconst char *fn;\n\tlong unsigned int min;\n\tlong unsigned int max;\n\tlong unsigned int index;\n\tlong unsigned int last;\n\tlong unsigned int piv;\n\tvoid *val;\n\tvoid *node;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_map {\n\tstruct trace_entry ent;\n\tu64 iova;\n\tu64 paddr;\n\tsize_t size;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_mark_victim {\n\tstruct trace_entry ent;\n\tint pid;\n\tu32 __data_loc_comm;\n\tlong unsigned int total_vm;\n\tlong unsigned int anon_rss;\n\tlong unsigned int file_rss;\n\tlong unsigned int shmem_rss;\n\tuid_t uid;\n\tlong unsigned int pgtables;\n\tshort int oom_score_adj;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_mc_event {\n\tstruct trace_entry ent;\n\tunsigned int error_type;\n\tu32 __data_loc_msg;\n\tu32 __data_loc_label;\n\tu16 error_count;\n\tu8 mc_index;\n\ts8 top_layer;\n\ts8 middle_layer;\n\ts8 lower_layer;\n\tlong int address;\n\tu8 grain_bits;\n\tlong int syndrome;\n\tu32 __data_loc_driver_detail;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_mce_record {\n\tstruct trace_entry ent;\n\tu64 mcgcap;\n\tu64 mcgstatus;\n\tu64 status;\n\tu64 addr;\n\tu64 misc;\n\tu64 synd;\n\tu64 ipid;\n\tu64 ip;\n\tu64 tsc;\n\tu64 ppin;\n\tu64 walltime;\n\tu32 cpu;\n\tu32 cpuid;\n\tu32 apicid;\n\tu32 socketid;\n\tu8 cs;\n\tu8 bank;\n\tu8 cpuvendor;\n\tu32 microcode;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_mctp_key_acquire {\n\tstruct trace_entry ent;\n\t__u8 paddr;\n\t__u8 laddr;\n\t__u8 tag;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_mctp_key_release {\n\tstruct trace_entry ent;\n\t__u8 paddr;\n\t__u8 laddr;\n\t__u8 tag;\n\tint reason;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_mdio_access {\n\tstruct trace_entry ent;\n\tchar busid[61];\n\tchar read;\n\tu8 addr;\n\tu16 val;\n\tunsigned int regnum;\n\tchar __data[0];\n};\n\nstruct xdp_mem_allocator;\n\nstruct trace_event_raw_mem_connect {\n\tstruct trace_entry ent;\n\tconst struct xdp_mem_allocator *xa;\n\tu32 mem_id;\n\tu32 mem_type;\n\tconst void *allocator;\n\tconst struct xdp_rxq_info *rxq;\n\tint ifindex;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_mem_disconnect {\n\tstruct trace_entry ent;\n\tconst struct xdp_mem_allocator *xa;\n\tu32 mem_id;\n\tu32 mem_type;\n\tconst void *allocator;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_mem_return_failed {\n\tstruct trace_entry ent;\n\tconst struct page *page;\n\tu32 mem_id;\n\tu32 mem_type;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_memory_failure_event {\n\tstruct trace_entry ent;\n\tlong unsigned int pfn;\n\tint type;\n\tint result;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_migration_pmd {\n\tstruct trace_entry ent;\n\tlong unsigned int addr;\n\tlong unsigned int pmd;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_migration_pte {\n\tstruct trace_entry ent;\n\tlong unsigned int addr;\n\tlong unsigned int pte;\n\tint order;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_mm_alloc_contig_migrate_range_info {\n\tstruct trace_entry ent;\n\tlong unsigned int start;\n\tlong unsigned int end;\n\tlong unsigned int nr_migrated;\n\tlong unsigned int nr_reclaimed;\n\tlong unsigned int nr_mapped;\n\tint migratetype;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_mm_collapse_huge_page {\n\tstruct trace_entry ent;\n\tstruct mm_struct *mm;\n\tint isolated;\n\tint status;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_mm_collapse_huge_page_isolate {\n\tstruct trace_entry ent;\n\tlong unsigned int pfn;\n\tint none_or_zero;\n\tint referenced;\n\tbool writable;\n\tint status;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_mm_collapse_huge_page_swapin {\n\tstruct trace_entry ent;\n\tstruct mm_struct *mm;\n\tint swapped_in;\n\tint referenced;\n\tint ret;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_mm_compaction_begin {\n\tstruct trace_entry ent;\n\tlong unsigned int zone_start;\n\tlong unsigned int migrate_pfn;\n\tlong unsigned int free_pfn;\n\tlong unsigned int zone_end;\n\tbool sync;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_mm_compaction_defer_template {\n\tstruct trace_entry ent;\n\tint nid;\n\tenum zone_type idx;\n\tint order;\n\tunsigned int considered;\n\tunsigned int defer_shift;\n\tint order_failed;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_mm_compaction_end {\n\tstruct trace_entry ent;\n\tlong unsigned int zone_start;\n\tlong unsigned int migrate_pfn;\n\tlong unsigned int free_pfn;\n\tlong unsigned int zone_end;\n\tbool sync;\n\tint status;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_mm_compaction_isolate_template {\n\tstruct trace_entry ent;\n\tlong unsigned int start_pfn;\n\tlong unsigned int end_pfn;\n\tlong unsigned int nr_scanned;\n\tlong unsigned int nr_taken;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_mm_compaction_kcompactd_sleep {\n\tstruct trace_entry ent;\n\tint nid;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_mm_compaction_migratepages {\n\tstruct trace_entry ent;\n\tlong unsigned int nr_migrated;\n\tlong unsigned int nr_failed;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_mm_compaction_suitable_template {\n\tstruct trace_entry ent;\n\tint nid;\n\tenum zone_type idx;\n\tint order;\n\tint ret;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_mm_compaction_try_to_compact_pages {\n\tstruct trace_entry ent;\n\tint order;\n\tlong unsigned int gfp_mask;\n\tint prio;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_mm_filemap_op_page_cache {\n\tstruct trace_entry ent;\n\tlong unsigned int pfn;\n\tlong unsigned int i_ino;\n\tlong unsigned int index;\n\tdev_t s_dev;\n\tunsigned char order;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_mm_khugepaged_collapse_file {\n\tstruct trace_entry ent;\n\tstruct mm_struct *mm;\n\tlong unsigned int hpfn;\n\tlong unsigned int index;\n\tlong unsigned int addr;\n\tbool is_shmem;\n\tu32 __data_loc_filename;\n\tint nr;\n\tint result;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_mm_khugepaged_scan_file {\n\tstruct trace_entry ent;\n\tstruct mm_struct *mm;\n\tlong unsigned int pfn;\n\tu32 __data_loc_filename;\n\tint present;\n\tint swap;\n\tint result;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_mm_khugepaged_scan_pmd {\n\tstruct trace_entry ent;\n\tstruct mm_struct *mm;\n\tlong unsigned int pfn;\n\tbool writable;\n\tint referenced;\n\tint none_or_zero;\n\tint status;\n\tint unmapped;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_mm_lru_activate {\n\tstruct trace_entry ent;\n\tstruct folio *folio;\n\tlong unsigned int pfn;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_mm_lru_insertion {\n\tstruct trace_entry ent;\n\tstruct folio *folio;\n\tlong unsigned int pfn;\n\tenum lru_list lru;\n\tlong unsigned int flags;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_mm_migrate_pages {\n\tstruct trace_entry ent;\n\tlong unsigned int succeeded;\n\tlong unsigned int failed;\n\tlong unsigned int thp_succeeded;\n\tlong unsigned int thp_failed;\n\tlong unsigned int thp_split;\n\tlong unsigned int large_folio_split;\n\tenum migrate_mode mode;\n\tint reason;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_mm_migrate_pages_start {\n\tstruct trace_entry ent;\n\tenum migrate_mode mode;\n\tint reason;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_mm_page {\n\tstruct trace_entry ent;\n\tlong unsigned int pfn;\n\tunsigned int order;\n\tint migratetype;\n\tint percpu_refill;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_mm_page_alloc {\n\tstruct trace_entry ent;\n\tlong unsigned int pfn;\n\tunsigned int order;\n\tlong unsigned int gfp_flags;\n\tint migratetype;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_mm_page_alloc_extfrag {\n\tstruct trace_entry ent;\n\tlong unsigned int pfn;\n\tint alloc_order;\n\tint fallback_order;\n\tint alloc_migratetype;\n\tint fallback_migratetype;\n\tint change_ownership;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_mm_page_free {\n\tstruct trace_entry ent;\n\tlong unsigned int pfn;\n\tunsigned int order;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_mm_page_free_batched {\n\tstruct trace_entry ent;\n\tlong unsigned int pfn;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_mm_page_pcpu_drain {\n\tstruct trace_entry ent;\n\tlong unsigned int pfn;\n\tunsigned int order;\n\tint migratetype;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_mm_shrink_slab_end {\n\tstruct trace_entry ent;\n\tstruct shrinker *shr;\n\tint nid;\n\tvoid *shrink;\n\tlong int unused_scan;\n\tlong int new_scan;\n\tint retval;\n\tlong int total_scan;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_mm_shrink_slab_start {\n\tstruct trace_entry ent;\n\tstruct shrinker *shr;\n\tvoid *shrink;\n\tint nid;\n\tlong int nr_objects_to_shrink;\n\tlong unsigned int gfp_flags;\n\tlong unsigned int cache_items;\n\tlong long unsigned int delta;\n\tlong unsigned int total_scan;\n\tint priority;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_mm_vmscan_direct_reclaim_begin_template {\n\tstruct trace_entry ent;\n\tint order;\n\tlong unsigned int gfp_flags;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_mm_vmscan_direct_reclaim_end_template {\n\tstruct trace_entry ent;\n\tlong unsigned int nr_reclaimed;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_mm_vmscan_kswapd_sleep {\n\tstruct trace_entry ent;\n\tint nid;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_mm_vmscan_kswapd_wake {\n\tstruct trace_entry ent;\n\tint nid;\n\tint zid;\n\tint order;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_mm_vmscan_lru_isolate {\n\tstruct trace_entry ent;\n\tint highest_zoneidx;\n\tint order;\n\tlong unsigned int nr_requested;\n\tlong unsigned int nr_scanned;\n\tlong unsigned int nr_skipped;\n\tlong unsigned int nr_taken;\n\tint lru;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_mm_vmscan_lru_shrink_active {\n\tstruct trace_entry ent;\n\tint nid;\n\tlong unsigned int nr_taken;\n\tlong unsigned int nr_active;\n\tlong unsigned int nr_deactivated;\n\tlong unsigned int nr_referenced;\n\tint priority;\n\tint reclaim_flags;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_mm_vmscan_lru_shrink_inactive {\n\tstruct trace_entry ent;\n\tint nid;\n\tlong unsigned int nr_scanned;\n\tlong unsigned int nr_reclaimed;\n\tlong unsigned int nr_dirty;\n\tlong unsigned int nr_writeback;\n\tlong unsigned int nr_congested;\n\tlong unsigned int nr_immediate;\n\tunsigned int nr_activate0;\n\tunsigned int nr_activate1;\n\tlong unsigned int nr_ref_keep;\n\tlong unsigned int nr_unmap_fail;\n\tint priority;\n\tint reclaim_flags;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_mm_vmscan_node_reclaim_begin {\n\tstruct trace_entry ent;\n\tint nid;\n\tint order;\n\tlong unsigned int gfp_flags;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_mm_vmscan_throttled {\n\tstruct trace_entry ent;\n\tint nid;\n\tint usec_timeout;\n\tint usec_delayed;\n\tint reason;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_mm_vmscan_wakeup_kswapd {\n\tstruct trace_entry ent;\n\tint nid;\n\tint zid;\n\tint order;\n\tlong unsigned int gfp_flags;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_mm_vmscan_write_folio {\n\tstruct trace_entry ent;\n\tlong unsigned int pfn;\n\tint reclaim_flags;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_mmap_lock {\n\tstruct trace_entry ent;\n\tstruct mm_struct *mm;\n\tu32 __data_loc_memcg_path;\n\tbool write;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_mmap_lock_acquire_returned {\n\tstruct trace_entry ent;\n\tstruct mm_struct *mm;\n\tu32 __data_loc_memcg_path;\n\tbool write;\n\tbool success;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_mmc_request_done {\n\tstruct trace_entry ent;\n\tu32 cmd_opcode;\n\tint cmd_err;\n\tu32 cmd_resp[4];\n\tunsigned int cmd_retries;\n\tu32 stop_opcode;\n\tint stop_err;\n\tu32 stop_resp[4];\n\tunsigned int stop_retries;\n\tu32 sbc_opcode;\n\tint sbc_err;\n\tu32 sbc_resp[4];\n\tunsigned int sbc_retries;\n\tunsigned int bytes_xfered;\n\tint data_err;\n\tint tag;\n\tunsigned int can_retune;\n\tunsigned int doing_retune;\n\tunsigned int retune_now;\n\tint need_retune;\n\tint hold_retune;\n\tunsigned int retune_period;\n\tstruct mmc_request *mrq;\n\tu32 __data_loc_name;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_mmc_request_start {\n\tstruct trace_entry ent;\n\tu32 cmd_opcode;\n\tu32 cmd_arg;\n\tunsigned int cmd_flags;\n\tunsigned int cmd_retries;\n\tu32 stop_opcode;\n\tu32 stop_arg;\n\tunsigned int stop_flags;\n\tunsigned int stop_retries;\n\tu32 sbc_opcode;\n\tu32 sbc_arg;\n\tunsigned int sbc_flags;\n\tunsigned int sbc_retries;\n\tunsigned int blocks;\n\tunsigned int blk_addr;\n\tunsigned int blksz;\n\tunsigned int data_flags;\n\tint tag;\n\tunsigned int can_retune;\n\tunsigned int doing_retune;\n\tunsigned int retune_now;\n\tint need_retune;\n\tint hold_retune;\n\tunsigned int retune_period;\n\tstruct mmc_request *mrq;\n\tu32 __data_loc_name;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_module_free {\n\tstruct trace_entry ent;\n\tu32 __data_loc_name;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_module_load {\n\tstruct trace_entry ent;\n\tunsigned int taints;\n\tu32 __data_loc_name;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_module_refcnt {\n\tstruct trace_entry ent;\n\tlong unsigned int ip;\n\tint refcnt;\n\tu32 __data_loc_name;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_module_request {\n\tstruct trace_entry ent;\n\tlong unsigned int ip;\n\tbool wait;\n\tu32 __data_loc_name;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_mon_llc_occupancy_limbo {\n\tstruct trace_entry ent;\n\tu32 ctrl_hw_id;\n\tu32 mon_hw_id;\n\tint domain_id;\n\tu64 llc_occupancy_bytes;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_mptcp_dump_mpext {\n\tstruct trace_entry ent;\n\tu64 data_ack;\n\tu64 data_seq;\n\tu32 subflow_seq;\n\tu16 data_len;\n\tu16 csum;\n\tu8 use_map;\n\tu8 dsn64;\n\tu8 data_fin;\n\tu8 use_ack;\n\tu8 ack64;\n\tu8 mpc_map;\n\tu8 frozen;\n\tu8 reset_transient;\n\tu8 reset_reason;\n\tu8 csum_reqd;\n\tu8 infinite_map;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_mptcp_subflow_get_send {\n\tstruct trace_entry ent;\n\tbool active;\n\tbool free;\n\tu32 snd_wnd;\n\tu32 pace;\n\tu8 backup;\n\tu64 ratio;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_msr_trace_class {\n\tstruct trace_entry ent;\n\tunsigned int msr;\n\tu64 val;\n\tint failed;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_napi_poll {\n\tstruct trace_entry ent;\n\tstruct napi_struct *napi;\n\tu32 __data_loc_dev_name;\n\tint work;\n\tint budget;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_neigh__update {\n\tstruct trace_entry ent;\n\tu32 family;\n\tu32 __data_loc_dev;\n\tu8 lladdr[32];\n\tu8 lladdr_len;\n\tu8 flags;\n\tu8 nud_state;\n\tu8 type;\n\tu8 dead;\n\tint refcnt;\n\t__u8 primary_key4[4];\n\t__u8 primary_key6[16];\n\tlong unsigned int confirmed;\n\tlong unsigned int updated;\n\tlong unsigned int used;\n\tu32 err;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_neigh_create {\n\tstruct trace_entry ent;\n\tu32 family;\n\tu32 __data_loc_dev;\n\tint entries;\n\tu8 created;\n\tu8 gc_exempt;\n\tu8 primary_key4[4];\n\tu8 primary_key6[16];\n\tchar __data[0];\n};\n\nstruct trace_event_raw_neigh_update {\n\tstruct trace_entry ent;\n\tu32 family;\n\tu32 __data_loc_dev;\n\tu8 lladdr[32];\n\tu8 lladdr_len;\n\tu8 flags;\n\tu8 nud_state;\n\tu8 type;\n\tu8 dead;\n\tint refcnt;\n\t__u8 primary_key4[4];\n\t__u8 primary_key6[16];\n\tlong unsigned int confirmed;\n\tlong unsigned int updated;\n\tlong unsigned int used;\n\tu8 new_lladdr[32];\n\tu8 new_state;\n\tu32 update_flags;\n\tu32 pid;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_net_dev_rx_exit_template {\n\tstruct trace_entry ent;\n\tint ret;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_net_dev_rx_verbose_template {\n\tstruct trace_entry ent;\n\tu32 __data_loc_name;\n\tunsigned int napi_id;\n\tu16 queue_mapping;\n\tconst void *skbaddr;\n\tbool vlan_tagged;\n\tu16 vlan_proto;\n\tu16 vlan_tci;\n\tu16 protocol;\n\tu8 ip_summed;\n\tu32 hash;\n\tbool l4_hash;\n\tunsigned int len;\n\tunsigned int data_len;\n\tunsigned int truesize;\n\tbool mac_header_valid;\n\tint mac_header;\n\tunsigned char nr_frags;\n\tu16 gso_size;\n\tu16 gso_type;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_net_dev_start_xmit {\n\tstruct trace_entry ent;\n\tu32 __data_loc_name;\n\tu16 queue_mapping;\n\tconst void *skbaddr;\n\tbool vlan_tagged;\n\tu16 vlan_proto;\n\tu16 vlan_tci;\n\tu16 protocol;\n\tu8 ip_summed;\n\tunsigned int len;\n\tunsigned int data_len;\n\tint network_offset;\n\tbool transport_offset_valid;\n\tint transport_offset;\n\tu8 tx_flags;\n\tu16 gso_size;\n\tu16 gso_segs;\n\tu16 gso_type;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_net_dev_template {\n\tstruct trace_entry ent;\n\tvoid *skbaddr;\n\tunsigned int len;\n\tu32 __data_loc_name;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_net_dev_xmit {\n\tstruct trace_entry ent;\n\tvoid *skbaddr;\n\tunsigned int len;\n\tint rc;\n\tu32 __data_loc_name;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_net_dev_xmit_timeout {\n\tstruct trace_entry ent;\n\tu32 __data_loc_name;\n\tu32 __data_loc_driver;\n\tint queue_index;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_netlink_extack {\n\tstruct trace_entry ent;\n\tu32 __data_loc_msg;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_nmi_handler {\n\tstruct trace_entry ent;\n\tvoid *handler;\n\ts64 delta_ns;\n\tint handled;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_nmi_noise {\n\tstruct trace_entry ent;\n\tu64 start;\n\tu64 duration;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_non_standard_event {\n\tstruct trace_entry ent;\n\tchar sec_type[16];\n\tchar fru_id[16];\n\tu32 __data_loc_fru_text;\n\tu8 sev;\n\tu32 len;\n\tu32 __data_loc_buf;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_notifier_info {\n\tstruct trace_entry ent;\n\tvoid *cb;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_oom_score_adj_update {\n\tstruct trace_entry ent;\n\tpid_t pid;\n\tchar comm[16];\n\tshort int oom_score_adj;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_page_pool_release {\n\tstruct trace_entry ent;\n\tconst struct page_pool *pool;\n\ts32 inflight;\n\tu32 hold;\n\tu32 release;\n\tu64 cnt;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_page_pool_state_hold {\n\tstruct trace_entry ent;\n\tconst struct page_pool *pool;\n\tlong unsigned int netmem;\n\tu32 hold;\n\tlong unsigned int pfn;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_page_pool_state_release {\n\tstruct trace_entry ent;\n\tconst struct page_pool *pool;\n\tlong unsigned int netmem;\n\tu32 release;\n\tlong unsigned int pfn;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_page_pool_update_nid {\n\tstruct trace_entry ent;\n\tconst struct page_pool *pool;\n\tint pool_nid;\n\tint new_nid;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_percpu_alloc_percpu {\n\tstruct trace_entry ent;\n\tlong unsigned int call_site;\n\tbool reserved;\n\tbool is_atomic;\n\tsize_t size;\n\tsize_t align;\n\tvoid *base_addr;\n\tint off;\n\tvoid *ptr;\n\tsize_t bytes_alloc;\n\tlong unsigned int gfp_flags;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_percpu_alloc_percpu_fail {\n\tstruct trace_entry ent;\n\tbool reserved;\n\tbool is_atomic;\n\tsize_t size;\n\tsize_t align;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_percpu_create_chunk {\n\tstruct trace_entry ent;\n\tvoid *base_addr;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_percpu_destroy_chunk {\n\tstruct trace_entry ent;\n\tvoid *base_addr;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_percpu_free_percpu {\n\tstruct trace_entry ent;\n\tvoid *base_addr;\n\tint off;\n\tvoid *ptr;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_pm_qos_update {\n\tstruct trace_entry ent;\n\tenum pm_qos_req_action action;\n\tint prev_value;\n\tint curr_value;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_power_domain {\n\tstruct trace_entry ent;\n\tu32 __data_loc_name;\n\tu64 state;\n\tu64 cpu_id;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_powernv_throttle {\n\tstruct trace_entry ent;\n\tint chip_id;\n\tu32 __data_loc_reason;\n\tint pmax;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_prq_report {\n\tstruct trace_entry ent;\n\tu64 dw0;\n\tu64 dw1;\n\tu64 dw2;\n\tu64 dw3;\n\tlong unsigned int seq;\n\tu32 __data_loc_iommu;\n\tu32 __data_loc_dev;\n\tu32 __data_loc_buff;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_pseudo_lock_l2 {\n\tstruct trace_entry ent;\n\tu64 l2_hits;\n\tu64 l2_miss;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_pseudo_lock_l3 {\n\tstruct trace_entry ent;\n\tu64 l3_hits;\n\tu64 l3_miss;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_pseudo_lock_mem_latency {\n\tstruct trace_entry ent;\n\tu32 latency;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_pstate_sample {\n\tstruct trace_entry ent;\n\tu32 core_busy;\n\tu32 scaled_busy;\n\tu32 from;\n\tu32 to;\n\tu64 mperf;\n\tu64 aperf;\n\tu64 tsc;\n\tu32 freq;\n\tu32 io_boost;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_purge_vmap_area_lazy {\n\tstruct trace_entry ent;\n\tlong unsigned int start;\n\tlong unsigned int end;\n\tunsigned int npurged;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_pwm {\n\tstruct trace_entry ent;\n\tstruct pwm_device *pwm;\n\tu64 period;\n\tu64 duty_cycle;\n\tenum pwm_polarity polarity;\n\tbool enabled;\n\tint err;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_qdisc_create {\n\tstruct trace_entry ent;\n\tu32 __data_loc_dev;\n\tu32 __data_loc_kind;\n\tu32 parent;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_qdisc_dequeue {\n\tstruct trace_entry ent;\n\tstruct Qdisc *qdisc;\n\tconst struct netdev_queue *txq;\n\tint packets;\n\tvoid *skbaddr;\n\tint ifindex;\n\tu32 handle;\n\tu32 parent;\n\tlong unsigned int txq_state;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_qdisc_destroy {\n\tstruct trace_entry ent;\n\tu32 __data_loc_dev;\n\tu32 __data_loc_kind;\n\tu32 parent;\n\tu32 handle;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_qdisc_enqueue {\n\tstruct trace_entry ent;\n\tstruct Qdisc *qdisc;\n\tconst struct netdev_queue *txq;\n\tvoid *skbaddr;\n\tint ifindex;\n\tu32 handle;\n\tu32 parent;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_qdisc_reset {\n\tstruct trace_entry ent;\n\tu32 __data_loc_dev;\n\tu32 __data_loc_kind;\n\tu32 parent;\n\tu32 handle;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_qi_submit {\n\tstruct trace_entry ent;\n\tu64 qw0;\n\tu64 qw1;\n\tu64 qw2;\n\tu64 qw3;\n\tu32 __data_loc_iommu;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_rcu_stall_warning {\n\tstruct trace_entry ent;\n\tconst char *rcuname;\n\tconst char *msg;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_rcu_utilization {\n\tstruct trace_entry ent;\n\tconst char *s;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_reclaim_retry_zone {\n\tstruct trace_entry ent;\n\tint node;\n\tint zone_idx;\n\tint order;\n\tlong unsigned int reclaimable;\n\tlong unsigned int available;\n\tlong unsigned int min_wmark;\n\tint no_progress_loops;\n\tbool wmark_check;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_regcache_drop_region {\n\tstruct trace_entry ent;\n\tu32 __data_loc_name;\n\tunsigned int from;\n\tunsigned int to;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_regcache_sync {\n\tstruct trace_entry ent;\n\tu32 __data_loc_name;\n\tu32 __data_loc_status;\n\tu32 __data_loc_type;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_regmap_async {\n\tstruct trace_entry ent;\n\tu32 __data_loc_name;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_regmap_block {\n\tstruct trace_entry ent;\n\tu32 __data_loc_name;\n\tunsigned int reg;\n\tint count;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_regmap_bool {\n\tstruct trace_entry ent;\n\tu32 __data_loc_name;\n\tint flag;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_regmap_bulk {\n\tstruct trace_entry ent;\n\tu32 __data_loc_name;\n\tunsigned int reg;\n\tu32 __data_loc_buf;\n\tint val_len;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_regmap_reg {\n\tstruct trace_entry ent;\n\tu32 __data_loc_name;\n\tunsigned int reg;\n\tunsigned int val;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_regulator_basic {\n\tstruct trace_entry ent;\n\tu32 __data_loc_name;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_regulator_range {\n\tstruct trace_entry ent;\n\tu32 __data_loc_name;\n\tint min;\n\tint max;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_regulator_value {\n\tstruct trace_entry ent;\n\tu32 __data_loc_name;\n\tunsigned int val;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_rpm_internal {\n\tstruct trace_entry ent;\n\tu32 __data_loc_name;\n\tint flags;\n\tint usage_count;\n\tint disable_depth;\n\tint runtime_auto;\n\tint request_pending;\n\tint irq_safe;\n\tint child_count;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_rpm_return_int {\n\tstruct trace_entry ent;\n\tu32 __data_loc_name;\n\tlong unsigned int ip;\n\tint ret;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_rpm_status {\n\tstruct trace_entry ent;\n\tu32 __data_loc_name;\n\tint status;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_rseq_ip_fixup {\n\tstruct trace_entry ent;\n\tlong unsigned int regs_ip;\n\tlong unsigned int start_ip;\n\tlong unsigned int post_commit_offset;\n\tlong unsigned int abort_ip;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_rseq_update {\n\tstruct trace_entry ent;\n\ts32 cpu_id;\n\ts32 node_id;\n\ts32 mm_cid;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_rss_stat {\n\tstruct trace_entry ent;\n\tunsigned int mm_id;\n\tunsigned int curr;\n\tint member;\n\tlong int size;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_rtc_alarm_irq_enable {\n\tstruct trace_entry ent;\n\tunsigned int enabled;\n\tint err;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_rtc_irq_set_freq {\n\tstruct trace_entry ent;\n\tint freq;\n\tint err;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_rtc_irq_set_state {\n\tstruct trace_entry ent;\n\tint enabled;\n\tint err;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_rtc_offset_class {\n\tstruct trace_entry ent;\n\tlong int offset;\n\tint err;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_rtc_time_alarm_class {\n\tstruct trace_entry ent;\n\ttime64_t secs;\n\tint err;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_rtc_timer_class {\n\tstruct trace_entry ent;\n\tstruct rtc_timer *timer;\n\tktime_t expires;\n\tktime_t period;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_sample_threshold {\n\tstruct trace_entry ent;\n\tu64 start;\n\tu64 duration;\n\tu64 interference;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_sched_kthread_stop {\n\tstruct trace_entry ent;\n\tchar comm[16];\n\tpid_t pid;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_sched_kthread_stop_ret {\n\tstruct trace_entry ent;\n\tint ret;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_sched_kthread_work_execute_end {\n\tstruct trace_entry ent;\n\tvoid *work;\n\tvoid *function;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_sched_kthread_work_execute_start {\n\tstruct trace_entry ent;\n\tvoid *work;\n\tvoid *function;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_sched_kthread_work_queue_work {\n\tstruct trace_entry ent;\n\tvoid *work;\n\tvoid *function;\n\tvoid *worker;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_sched_migrate_task {\n\tstruct trace_entry ent;\n\tchar comm[16];\n\tpid_t pid;\n\tint prio;\n\tint orig_cpu;\n\tint dest_cpu;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_sched_move_numa {\n\tstruct trace_entry ent;\n\tpid_t pid;\n\tpid_t tgid;\n\tpid_t ngid;\n\tint src_cpu;\n\tint src_nid;\n\tint dst_cpu;\n\tint dst_nid;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_sched_numa_pair_template {\n\tstruct trace_entry ent;\n\tpid_t src_pid;\n\tpid_t src_tgid;\n\tpid_t src_ngid;\n\tint src_cpu;\n\tint src_nid;\n\tpid_t dst_pid;\n\tpid_t dst_tgid;\n\tpid_t dst_ngid;\n\tint dst_cpu;\n\tint dst_nid;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_sched_pi_setprio {\n\tstruct trace_entry ent;\n\tchar comm[16];\n\tpid_t pid;\n\tint oldprio;\n\tint newprio;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_sched_prepare_exec {\n\tstruct trace_entry ent;\n\tu32 __data_loc_interp;\n\tu32 __data_loc_filename;\n\tpid_t pid;\n\tu32 __data_loc_comm;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_sched_process_exec {\n\tstruct trace_entry ent;\n\tu32 __data_loc_filename;\n\tpid_t pid;\n\tpid_t old_pid;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_sched_process_fork {\n\tstruct trace_entry ent;\n\tchar parent_comm[16];\n\tpid_t parent_pid;\n\tchar child_comm[16];\n\tpid_t child_pid;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_sched_process_hang {\n\tstruct trace_entry ent;\n\tchar comm[16];\n\tpid_t pid;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_sched_process_template {\n\tstruct trace_entry ent;\n\tchar comm[16];\n\tpid_t pid;\n\tint prio;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_sched_process_wait {\n\tstruct trace_entry ent;\n\tchar comm[16];\n\tpid_t pid;\n\tint prio;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_sched_skip_vma_numa {\n\tstruct trace_entry ent;\n\tlong unsigned int numa_scan_offset;\n\tlong unsigned int vm_start;\n\tlong unsigned int vm_end;\n\tenum numa_vmaskip_reason reason;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_sched_stat_runtime {\n\tstruct trace_entry ent;\n\tchar comm[16];\n\tpid_t pid;\n\tu64 runtime;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_sched_stat_template {\n\tstruct trace_entry ent;\n\tchar comm[16];\n\tpid_t pid;\n\tu64 delay;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_sched_switch {\n\tstruct trace_entry ent;\n\tchar prev_comm[16];\n\tpid_t prev_pid;\n\tint prev_prio;\n\tlong int prev_state;\n\tchar next_comm[16];\n\tpid_t next_pid;\n\tint next_prio;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_sched_wake_idle_without_ipi {\n\tstruct trace_entry ent;\n\tint cpu;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_sched_wakeup_template {\n\tstruct trace_entry ent;\n\tchar comm[16];\n\tpid_t pid;\n\tint prio;\n\tint target_cpu;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_scsi_cmd_done_timeout_template {\n\tstruct trace_entry ent;\n\tunsigned int host_no;\n\tunsigned int channel;\n\tunsigned int id;\n\tunsigned int lun;\n\tint result;\n\tunsigned int opcode;\n\tunsigned int cmd_len;\n\tint driver_tag;\n\tint scheduler_tag;\n\tunsigned int data_sglen;\n\tunsigned int prot_sglen;\n\tunsigned char prot_op;\n\tu32 __data_loc_cmnd;\n\tu8 sense_key;\n\tu8 asc;\n\tu8 ascq;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_scsi_dispatch_cmd_error {\n\tstruct trace_entry ent;\n\tunsigned int host_no;\n\tunsigned int channel;\n\tunsigned int id;\n\tunsigned int lun;\n\tint rtn;\n\tunsigned int opcode;\n\tunsigned int cmd_len;\n\tint driver_tag;\n\tint scheduler_tag;\n\tunsigned int data_sglen;\n\tunsigned int prot_sglen;\n\tunsigned char prot_op;\n\tu32 __data_loc_cmnd;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_scsi_dispatch_cmd_start {\n\tstruct trace_entry ent;\n\tunsigned int host_no;\n\tunsigned int channel;\n\tunsigned int id;\n\tunsigned int lun;\n\tunsigned int opcode;\n\tunsigned int cmd_len;\n\tint driver_tag;\n\tint scheduler_tag;\n\tunsigned int data_sglen;\n\tunsigned int prot_sglen;\n\tunsigned char prot_op;\n\tu32 __data_loc_cmnd;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_scsi_eh_wakeup {\n\tstruct trace_entry ent;\n\tunsigned int host_no;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_scsi_prepare_zone_append {\n\tstruct trace_entry ent;\n\tunsigned int host_no;\n\tunsigned int channel;\n\tunsigned int id;\n\tunsigned int lun;\n\tsector_t lba;\n\tunsigned int wp_offset;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_scsi_zone_wp_update {\n\tstruct trace_entry ent;\n\tunsigned int host_no;\n\tunsigned int channel;\n\tunsigned int id;\n\tunsigned int lun;\n\tsector_t rq_sector;\n\tunsigned int wp_offset;\n\tunsigned int good_bytes;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_selinux_audited {\n\tstruct trace_entry ent;\n\tu32 requested;\n\tu32 denied;\n\tu32 audited;\n\tint result;\n\tu32 __data_loc_scontext;\n\tu32 __data_loc_tcontext;\n\tu32 __data_loc_tclass;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_signal_deliver {\n\tstruct trace_entry ent;\n\tint sig;\n\tint errno;\n\tint code;\n\tlong unsigned int sa_handler;\n\tlong unsigned int sa_flags;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_signal_generate {\n\tstruct trace_entry ent;\n\tint sig;\n\tint errno;\n\tint code;\n\tchar comm[16];\n\tpid_t pid;\n\tint group;\n\tint result;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_sk_data_ready {\n\tstruct trace_entry ent;\n\tconst void *skaddr;\n\t__u16 family;\n\t__u16 protocol;\n\tlong unsigned int ip;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_skb_copy_datagram_iovec {\n\tstruct trace_entry ent;\n\tconst void *skbaddr;\n\tint len;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_skip_task_reaping {\n\tstruct trace_entry ent;\n\tint pid;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_smbus_read {\n\tstruct trace_entry ent;\n\tint adapter_nr;\n\t__u16 flags;\n\t__u16 addr;\n\t__u8 command;\n\t__u32 protocol;\n\t__u8 buf[34];\n\tchar __data[0];\n};\n\nstruct trace_event_raw_smbus_reply {\n\tstruct trace_entry ent;\n\tint adapter_nr;\n\t__u16 addr;\n\t__u16 flags;\n\t__u8 command;\n\t__u8 len;\n\t__u32 protocol;\n\t__u8 buf[34];\n\tchar __data[0];\n};\n\nstruct trace_event_raw_smbus_result {\n\tstruct trace_entry ent;\n\tint adapter_nr;\n\t__u16 addr;\n\t__u16 flags;\n\t__u8 read_write;\n\t__u8 command;\n\t__s16 res;\n\t__u32 protocol;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_smbus_write {\n\tstruct trace_entry ent;\n\tint adapter_nr;\n\t__u16 addr;\n\t__u16 flags;\n\t__u8 command;\n\t__u8 len;\n\t__u32 protocol;\n\t__u8 buf[34];\n\tchar __data[0];\n};\n\nstruct trace_event_raw_sock_exceed_buf_limit {\n\tstruct trace_entry ent;\n\tchar name[32];\n\tlong int sysctl_mem[3];\n\tlong int allocated;\n\tint sysctl_rmem;\n\tint rmem_alloc;\n\tint sysctl_wmem;\n\tint wmem_alloc;\n\tint wmem_queued;\n\tint kind;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_sock_msg_length {\n\tstruct trace_entry ent;\n\tvoid *sk;\n\t__u16 family;\n\t__u16 protocol;\n\tint ret;\n\tint flags;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_sock_rcvqueue_full {\n\tstruct trace_entry ent;\n\tint rmem_alloc;\n\tunsigned int truesize;\n\tint sk_rcvbuf;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_softirq {\n\tstruct trace_entry ent;\n\tunsigned int vec;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_softirq_noise {\n\tstruct trace_entry ent;\n\tu64 start;\n\tu64 duration;\n\tint vector;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_spi_controller {\n\tstruct trace_entry ent;\n\tint bus_num;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_spi_message {\n\tstruct trace_entry ent;\n\tint bus_num;\n\tint chip_select;\n\tstruct spi_message *msg;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_spi_message_done {\n\tstruct trace_entry ent;\n\tint bus_num;\n\tint chip_select;\n\tstruct spi_message *msg;\n\tunsigned int frame;\n\tunsigned int actual;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_spi_set_cs {\n\tstruct trace_entry ent;\n\tint bus_num;\n\tint chip_select;\n\tlong unsigned int mode;\n\tbool enable;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_spi_setup {\n\tstruct trace_entry ent;\n\tint bus_num;\n\tint chip_select;\n\tlong unsigned int mode;\n\tunsigned int bits_per_word;\n\tunsigned int max_speed_hz;\n\tint status;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_spi_transfer {\n\tstruct trace_entry ent;\n\tint bus_num;\n\tint chip_select;\n\tstruct spi_transfer *xfer;\n\tint len;\n\tu32 __data_loc_rx_buf;\n\tu32 __data_loc_tx_buf;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_start_task_reaping {\n\tstruct trace_entry ent;\n\tint pid;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_subflow_check_data_avail {\n\tstruct trace_entry ent;\n\tu8 status;\n\tconst void *skb;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_suspend_resume {\n\tstruct trace_entry ent;\n\tconst char *action;\n\tint val;\n\tbool start;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_swiotlb_bounced {\n\tstruct trace_entry ent;\n\tu32 __data_loc_dev_name;\n\tu64 dma_mask;\n\tdma_addr_t dev_addr;\n\tsize_t size;\n\tbool force;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_sync_timeline {\n\tstruct trace_entry ent;\n\tu32 __data_loc_name;\n\tu32 value;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_sys_enter {\n\tstruct trace_entry ent;\n\tlong int id;\n\tlong unsigned int args[6];\n\tchar __data[0];\n};\n\nstruct trace_event_raw_sys_exit {\n\tstruct trace_entry ent;\n\tlong int id;\n\tlong int ret;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_task_newtask {\n\tstruct trace_entry ent;\n\tpid_t pid;\n\tchar comm[16];\n\tlong unsigned int clone_flags;\n\tshort int oom_score_adj;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_task_rename {\n\tstruct trace_entry ent;\n\tpid_t pid;\n\tchar oldcomm[16];\n\tchar newcomm[16];\n\tshort int oom_score_adj;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_tasklet {\n\tstruct trace_entry ent;\n\tvoid *tasklet;\n\tvoid *func;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_tcp_ao_event {\n\tstruct trace_entry ent;\n\t__u64 net_cookie;\n\tconst void *skbaddr;\n\tconst void *skaddr;\n\tint state;\n\t__u8 saddr[28];\n\t__u8 daddr[28];\n\tint l3index;\n\t__u16 sport;\n\t__u16 dport;\n\t__u16 family;\n\tbool fin;\n\tbool syn;\n\tbool rst;\n\tbool psh;\n\tbool ack;\n\t__u8 keyid;\n\t__u8 rnext;\n\t__u8 maclen;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_tcp_ao_event_sk {\n\tstruct trace_entry ent;\n\t__u64 net_cookie;\n\tconst void *skaddr;\n\tint state;\n\t__u8 saddr[28];\n\t__u8 daddr[28];\n\t__u16 sport;\n\t__u16 dport;\n\t__u16 family;\n\t__u8 keyid;\n\t__u8 rnext;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_tcp_ao_event_sne {\n\tstruct trace_entry ent;\n\t__u64 net_cookie;\n\tconst void *skaddr;\n\tint state;\n\t__u8 saddr[28];\n\t__u8 daddr[28];\n\t__u16 sport;\n\t__u16 dport;\n\t__u16 family;\n\t__u32 new_sne;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_tcp_cong_state_set {\n\tstruct trace_entry ent;\n\tconst void *skaddr;\n\t__u16 sport;\n\t__u16 dport;\n\t__u16 family;\n\t__u8 saddr[4];\n\t__u8 daddr[4];\n\t__u8 saddr_v6[16];\n\t__u8 daddr_v6[16];\n\t__u8 cong_state;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_tcp_event_sk {\n\tstruct trace_entry ent;\n\tconst void *skaddr;\n\t__u16 sport;\n\t__u16 dport;\n\t__u16 family;\n\t__u8 saddr[4];\n\t__u8 daddr[4];\n\t__u8 saddr_v6[16];\n\t__u8 daddr_v6[16];\n\t__u64 sock_cookie;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_tcp_event_sk_skb {\n\tstruct trace_entry ent;\n\tconst void *skbaddr;\n\tconst void *skaddr;\n\tint state;\n\t__u16 sport;\n\t__u16 dport;\n\t__u16 family;\n\t__u8 saddr[4];\n\t__u8 daddr[4];\n\t__u8 saddr_v6[16];\n\t__u8 daddr_v6[16];\n\tchar __data[0];\n};\n\nstruct trace_event_raw_tcp_event_skb {\n\tstruct trace_entry ent;\n\tconst void *skbaddr;\n\t__u8 saddr[28];\n\t__u8 daddr[28];\n\tchar __data[0];\n};\n\nstruct trace_event_raw_tcp_hash_event {\n\tstruct trace_entry ent;\n\t__u64 net_cookie;\n\tconst void *skbaddr;\n\tconst void *skaddr;\n\tint state;\n\t__u8 saddr[28];\n\t__u8 daddr[28];\n\tint l3index;\n\t__u16 sport;\n\t__u16 dport;\n\t__u16 family;\n\tbool fin;\n\tbool syn;\n\tbool rst;\n\tbool psh;\n\tbool ack;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_tcp_probe {\n\tstruct trace_entry ent;\n\t__u8 saddr[28];\n\t__u8 daddr[28];\n\t__u16 sport;\n\t__u16 dport;\n\t__u16 family;\n\t__u32 mark;\n\t__u16 data_len;\n\t__u32 snd_nxt;\n\t__u32 snd_una;\n\t__u32 snd_cwnd;\n\t__u32 ssthresh;\n\t__u32 snd_wnd;\n\t__u32 srtt;\n\t__u32 rcv_wnd;\n\t__u64 sock_cookie;\n\tconst void *skbaddr;\n\tconst void *skaddr;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_tcp_retransmit_synack {\n\tstruct trace_entry ent;\n\tconst void *skaddr;\n\tconst void *req;\n\t__u16 sport;\n\t__u16 dport;\n\t__u16 family;\n\t__u8 saddr[4];\n\t__u8 daddr[4];\n\t__u8 saddr_v6[16];\n\t__u8 daddr_v6[16];\n\tchar __data[0];\n};\n\nstruct trace_event_raw_tcp_send_reset {\n\tstruct trace_entry ent;\n\tconst void *skbaddr;\n\tconst void *skaddr;\n\tint state;\n\tenum sk_rst_reason reason;\n\t__u8 saddr[28];\n\t__u8 daddr[28];\n\tchar __data[0];\n};\n\nstruct trace_event_raw_test_pages_isolated {\n\tstruct trace_entry ent;\n\tlong unsigned int start_pfn;\n\tlong unsigned int end_pfn;\n\tlong unsigned int fin_pfn;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_thermal_power_actor {\n\tstruct trace_entry ent;\n\tint tz_id;\n\tint actor_id;\n\tu32 req_power;\n\tu32 granted_power;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_thermal_power_allocator {\n\tstruct trace_entry ent;\n\tint tz_id;\n\tu32 total_req_power;\n\tu32 total_granted_power;\n\tsize_t num_actors;\n\tu32 power_range;\n\tu32 max_allocatable_power;\n\tint current_temp;\n\ts32 delta_temp;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_thermal_power_allocator_pid {\n\tstruct trace_entry ent;\n\tint tz_id;\n\ts32 err;\n\ts32 err_integral;\n\ts64 p;\n\ts64 i;\n\ts64 d;\n\ts32 output;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_thermal_power_devfreq_get_power {\n\tstruct trace_entry ent;\n\tu32 __data_loc_type;\n\tlong unsigned int freq;\n\tu32 busy_time;\n\tu32 total_time;\n\tu32 power;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_thermal_power_devfreq_limit {\n\tstruct trace_entry ent;\n\tu32 __data_loc_type;\n\tunsigned int freq;\n\tlong unsigned int cdev_state;\n\tu32 power;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_thermal_temperature {\n\tstruct trace_entry ent;\n\tu32 __data_loc_thermal_zone;\n\tint id;\n\tint temp_prev;\n\tint temp;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_thermal_zone_trip {\n\tstruct trace_entry ent;\n\tu32 __data_loc_thermal_zone;\n\tint id;\n\tint trip;\n\tenum thermal_trip_type trip_type;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_thread_noise {\n\tstruct trace_entry ent;\n\tchar comm[16];\n\tu64 start;\n\tu64 duration;\n\tpid_t pid;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_tick_stop {\n\tstruct trace_entry ent;\n\tint success;\n\tint dependency;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_timer_base_idle {\n\tstruct trace_entry ent;\n\tbool is_idle;\n\tunsigned int cpu;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_timer_class {\n\tstruct trace_entry ent;\n\tvoid *timer;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_timer_expire_entry {\n\tstruct trace_entry ent;\n\tvoid *timer;\n\tlong unsigned int now;\n\tvoid *function;\n\tlong unsigned int baseclk;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_timer_start {\n\tstruct trace_entry ent;\n\tvoid *timer;\n\tvoid *function;\n\tlong unsigned int expires;\n\tlong unsigned int bucket_expiry;\n\tlong unsigned int now;\n\tunsigned int flags;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_tlb_flush {\n\tstruct trace_entry ent;\n\tint reason;\n\tlong unsigned int pages;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_tls_contenttype {\n\tstruct trace_entry ent;\n\t__u8 saddr[28];\n\t__u8 daddr[28];\n\tunsigned int netns_ino;\n\tlong unsigned int type;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_tmigr_connect_child_parent {\n\tstruct trace_entry ent;\n\tvoid *child;\n\tvoid *parent;\n\tunsigned int lvl;\n\tunsigned int numa_node;\n\tunsigned int num_children;\n\tu32 groupmask;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_tmigr_connect_cpu_parent {\n\tstruct trace_entry ent;\n\tvoid *parent;\n\tunsigned int cpu;\n\tunsigned int lvl;\n\tunsigned int numa_node;\n\tunsigned int num_children;\n\tu32 groupmask;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_tmigr_cpugroup {\n\tstruct trace_entry ent;\n\tu64 wakeup;\n\tvoid *parent;\n\tunsigned int cpu;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_tmigr_group_and_cpu {\n\tstruct trace_entry ent;\n\tvoid *group;\n\tvoid *parent;\n\tunsigned int lvl;\n\tunsigned int numa_node;\n\tu32 childmask;\n\tu8 active;\n\tu8 migrator;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_tmigr_group_set {\n\tstruct trace_entry ent;\n\tvoid *group;\n\tunsigned int lvl;\n\tunsigned int numa_node;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_tmigr_handle_remote {\n\tstruct trace_entry ent;\n\tvoid *group;\n\tunsigned int lvl;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_tmigr_idle {\n\tstruct trace_entry ent;\n\tu64 nextevt;\n\tu64 wakeup;\n\tvoid *parent;\n\tunsigned int cpu;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_tmigr_update_events {\n\tstruct trace_entry ent;\n\tvoid *child;\n\tvoid *group;\n\tu64 nextevt;\n\tu64 group_next_expiry;\n\tu64 child_evt_expiry;\n\tunsigned int group_lvl;\n\tunsigned int child_evtcpu;\n\tu8 child_active;\n\tu8 group_active;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_track_foreign_dirty {\n\tstruct trace_entry ent;\n\tchar name[32];\n\tu64 bdi_id;\n\tino_t ino;\n\tunsigned int memcg_id;\n\tino_t cgroup_ino;\n\tino_t page_cgroup_ino;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_udp_fail_queue_rcv_skb {\n\tstruct trace_entry ent;\n\tint rc;\n\t__u16 sport;\n\t__u16 dport;\n\t__u16 family;\n\t__u8 saddr[28];\n\t__u8 daddr[28];\n\tchar __data[0];\n};\n\nstruct trace_event_raw_unmap {\n\tstruct trace_entry ent;\n\tu64 iova;\n\tsize_t size;\n\tsize_t unmapped_size;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_vector_activate {\n\tstruct trace_entry ent;\n\tunsigned int irq;\n\tbool is_managed;\n\tbool can_reserve;\n\tbool reserve;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_vector_alloc {\n\tstruct trace_entry ent;\n\tunsigned int irq;\n\tunsigned int vector;\n\tbool reserved;\n\tint ret;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_vector_alloc_managed {\n\tstruct trace_entry ent;\n\tunsigned int irq;\n\tunsigned int vector;\n\tint ret;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_vector_config {\n\tstruct trace_entry ent;\n\tunsigned int irq;\n\tunsigned int vector;\n\tunsigned int cpu;\n\tunsigned int apicdest;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_vector_free_moved {\n\tstruct trace_entry ent;\n\tunsigned int irq;\n\tunsigned int cpu;\n\tunsigned int vector;\n\tbool is_managed;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_vector_mod {\n\tstruct trace_entry ent;\n\tunsigned int irq;\n\tunsigned int vector;\n\tunsigned int cpu;\n\tunsigned int prev_vector;\n\tunsigned int prev_cpu;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_vector_reserve {\n\tstruct trace_entry ent;\n\tunsigned int irq;\n\tint ret;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_vector_setup {\n\tstruct trace_entry ent;\n\tunsigned int irq;\n\tbool is_legacy;\n\tint ret;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_vector_teardown {\n\tstruct trace_entry ent;\n\tunsigned int irq;\n\tbool is_managed;\n\tbool has_reserved;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_vm_unmapped_area {\n\tstruct trace_entry ent;\n\tlong unsigned int addr;\n\tlong unsigned int total_vm;\n\tlong unsigned int flags;\n\tlong unsigned int length;\n\tlong unsigned int low_limit;\n\tlong unsigned int high_limit;\n\tlong unsigned int align_mask;\n\tlong unsigned int align_offset;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_vma_mas_szero {\n\tstruct trace_entry ent;\n\tstruct maple_tree *mt;\n\tlong unsigned int start;\n\tlong unsigned int end;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_vma_store {\n\tstruct trace_entry ent;\n\tstruct maple_tree *mt;\n\tstruct vm_area_struct *vma;\n\tlong unsigned int vm_start;\n\tlong unsigned int vm_end;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_wake_reaper {\n\tstruct trace_entry ent;\n\tint pid;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_wakeup_source {\n\tstruct trace_entry ent;\n\tu32 __data_loc_name;\n\tu64 state;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_watchdog_set_timeout {\n\tstruct trace_entry ent;\n\tint id;\n\tunsigned int timeout;\n\tint err;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_watchdog_template {\n\tstruct trace_entry ent;\n\tint id;\n\tint err;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_wbc_class {\n\tstruct trace_entry ent;\n\tchar name[32];\n\tlong int nr_to_write;\n\tlong int pages_skipped;\n\tint sync_mode;\n\tint for_kupdate;\n\tint for_background;\n\tint for_reclaim;\n\tint range_cyclic;\n\tlong int range_start;\n\tlong int range_end;\n\tino_t cgroup_ino;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_wbt_lat {\n\tstruct trace_entry ent;\n\tchar name[32];\n\tlong unsigned int lat;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_wbt_stat {\n\tstruct trace_entry ent;\n\tchar name[32];\n\ts64 rmean;\n\tu64 rmin;\n\tu64 rmax;\n\ts64 rnr_samples;\n\ts64 rtime;\n\ts64 wmean;\n\tu64 wmin;\n\tu64 wmax;\n\ts64 wnr_samples;\n\ts64 wtime;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_wbt_step {\n\tstruct trace_entry ent;\n\tchar name[32];\n\tconst char *msg;\n\tint step;\n\tlong unsigned int window;\n\tunsigned int bg;\n\tunsigned int normal;\n\tunsigned int max;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_wbt_timer {\n\tstruct trace_entry ent;\n\tchar name[32];\n\tunsigned int status;\n\tint step;\n\tunsigned int inflight;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_workqueue_activate_work {\n\tstruct trace_entry ent;\n\tvoid *work;\n\tvoid *function;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_workqueue_execute_end {\n\tstruct trace_entry ent;\n\tvoid *work;\n\tvoid *function;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_workqueue_execute_start {\n\tstruct trace_entry ent;\n\tvoid *work;\n\tvoid *function;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_workqueue_queue_work {\n\tstruct trace_entry ent;\n\tvoid *work;\n\tvoid *function;\n\tu32 __data_loc_workqueue;\n\tint req_cpu;\n\tint cpu;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_writeback_bdi_register {\n\tstruct trace_entry ent;\n\tchar name[32];\n\tchar __data[0];\n};\n\nstruct trace_event_raw_writeback_class {\n\tstruct trace_entry ent;\n\tchar name[32];\n\tino_t cgroup_ino;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_writeback_dirty_inode_template {\n\tstruct trace_entry ent;\n\tchar name[32];\n\tino_t ino;\n\tlong unsigned int state;\n\tlong unsigned int flags;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_writeback_folio_template {\n\tstruct trace_entry ent;\n\tchar name[32];\n\tino_t ino;\n\tlong unsigned int index;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_writeback_inode_template {\n\tstruct trace_entry ent;\n\tdev_t dev;\n\tino_t ino;\n\tlong unsigned int state;\n\t__u16 mode;\n\tlong unsigned int dirtied_when;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_writeback_pages_written {\n\tstruct trace_entry ent;\n\tlong int pages;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_writeback_queue_io {\n\tstruct trace_entry ent;\n\tchar name[32];\n\tlong unsigned int older;\n\tlong int age;\n\tint moved;\n\tint reason;\n\tino_t cgroup_ino;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_writeback_sb_inodes_requeue {\n\tstruct trace_entry ent;\n\tchar name[32];\n\tino_t ino;\n\tlong unsigned int state;\n\tlong unsigned int dirtied_when;\n\tino_t cgroup_ino;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_writeback_single_inode_template {\n\tstruct trace_entry ent;\n\tchar name[32];\n\tino_t ino;\n\tlong unsigned int state;\n\tlong unsigned int dirtied_when;\n\tlong unsigned int writeback_index;\n\tlong int nr_to_write;\n\tlong unsigned int wrote;\n\tino_t cgroup_ino;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_writeback_work_class {\n\tstruct trace_entry ent;\n\tchar name[32];\n\tlong int nr_pages;\n\tdev_t sb_dev;\n\tint sync_mode;\n\tint for_kupdate;\n\tint range_cyclic;\n\tint for_background;\n\tint reason;\n\tino_t cgroup_ino;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_writeback_write_inode_template {\n\tstruct trace_entry ent;\n\tchar name[32];\n\tino_t ino;\n\tint sync_mode;\n\tino_t cgroup_ino;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_x86_exceptions {\n\tstruct trace_entry ent;\n\tlong unsigned int address;\n\tlong unsigned int ip;\n\tlong unsigned int error_code;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_x86_fpu {\n\tstruct trace_entry ent;\n\tstruct fpu *fpu;\n\tbool load_fpu;\n\tu64 xfeatures;\n\tu64 xcomp_bv;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_x86_irq_vector {\n\tstruct trace_entry ent;\n\tint vector;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_xdp_bulk_tx {\n\tstruct trace_entry ent;\n\tint ifindex;\n\tu32 act;\n\tint drops;\n\tint sent;\n\tint err;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_xdp_cpumap_enqueue {\n\tstruct trace_entry ent;\n\tint map_id;\n\tu32 act;\n\tint cpu;\n\tunsigned int drops;\n\tunsigned int processed;\n\tint to_cpu;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_xdp_cpumap_kthread {\n\tstruct trace_entry ent;\n\tint map_id;\n\tu32 act;\n\tint cpu;\n\tunsigned int drops;\n\tunsigned int processed;\n\tint sched;\n\tunsigned int xdp_pass;\n\tunsigned int xdp_drop;\n\tunsigned int xdp_redirect;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_xdp_devmap_xmit {\n\tstruct trace_entry ent;\n\tint from_ifindex;\n\tu32 act;\n\tint to_ifindex;\n\tint drops;\n\tint sent;\n\tint err;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_xdp_exception {\n\tstruct trace_entry ent;\n\tint prog_id;\n\tu32 act;\n\tint ifindex;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_xdp_redirect_template {\n\tstruct trace_entry ent;\n\tint prog_id;\n\tu32 act;\n\tint ifindex;\n\tint err;\n\tint to_ifindex;\n\tu32 map_id;\n\tint map_index;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_xen_cpu_load_idt {\n\tstruct trace_entry ent;\n\tlong unsigned int addr;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_xen_cpu_set_ldt {\n\tstruct trace_entry ent;\n\tconst void *addr;\n\tunsigned int entries;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_xen_cpu_write_gdt_entry {\n\tstruct trace_entry ent;\n\tu64 desc;\n\tstruct desc_struct *dt;\n\tint entrynum;\n\tint type;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_xen_cpu_write_idt_entry {\n\tstruct trace_entry ent;\n\tgate_desc *dt;\n\tint entrynum;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_xen_cpu_write_ldt_entry {\n\tstruct trace_entry ent;\n\tstruct desc_struct *dt;\n\tint entrynum;\n\tu64 desc;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_xen_mc__batch {\n\tstruct trace_entry ent;\n\tenum xen_lazy_mode mode;\n\tchar __data[0];\n};\n\ntypedef void (*xen_mc_callback_fn_t)(void *);\n\nstruct trace_event_raw_xen_mc_callback {\n\tstruct trace_entry ent;\n\txen_mc_callback_fn_t fn;\n\tvoid *data;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_xen_mc_entry {\n\tstruct trace_entry ent;\n\tunsigned int op;\n\tunsigned int nargs;\n\tlong unsigned int args[6];\n\tchar __data[0];\n};\n\nstruct trace_event_raw_xen_mc_entry_alloc {\n\tstruct trace_entry ent;\n\tsize_t args;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_xen_mc_extend_args {\n\tstruct trace_entry ent;\n\tunsigned int op;\n\tsize_t args;\n\tenum xen_mc_extend_args res;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_xen_mc_flush {\n\tstruct trace_entry ent;\n\tunsigned int mcidx;\n\tunsigned int argidx;\n\tunsigned int cbidx;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_xen_mc_flush_reason {\n\tstruct trace_entry ent;\n\tenum xen_mc_flush_reason reason;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_xen_mmu__set_pte {\n\tstruct trace_entry ent;\n\tpte_t *ptep;\n\tpteval_t pteval;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_xen_mmu_alloc_ptpage {\n\tstruct trace_entry ent;\n\tstruct mm_struct *mm;\n\tlong unsigned int pfn;\n\tunsigned int level;\n\tbool pinned;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_xen_mmu_flush_tlb_multi {\n\tstruct trace_entry ent;\n\tunsigned int ncpus;\n\tstruct mm_struct *mm;\n\tlong unsigned int addr;\n\tlong unsigned int end;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_xen_mmu_flush_tlb_one_user {\n\tstruct trace_entry ent;\n\tlong unsigned int addr;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_xen_mmu_pgd {\n\tstruct trace_entry ent;\n\tstruct mm_struct *mm;\n\tpgd_t *pgd;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_xen_mmu_ptep_modify_prot {\n\tstruct trace_entry ent;\n\tstruct mm_struct *mm;\n\tlong unsigned int addr;\n\tpte_t *ptep;\n\tpteval_t pteval;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_xen_mmu_release_ptpage {\n\tstruct trace_entry ent;\n\tlong unsigned int pfn;\n\tunsigned int level;\n\tbool pinned;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_xen_mmu_set_p4d {\n\tstruct trace_entry ent;\n\tp4d_t *p4dp;\n\tp4d_t *user_p4dp;\n\tp4dval_t p4dval;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_xen_mmu_set_pmd {\n\tstruct trace_entry ent;\n\tpmd_t *pmdp;\n\tpmdval_t pmdval;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_xen_mmu_set_pud {\n\tstruct trace_entry ent;\n\tpud_t *pudp;\n\tpudval_t pudval;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_xen_mmu_write_cr3 {\n\tstruct trace_entry ent;\n\tbool kernel;\n\tlong unsigned int cr3;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_xhci_dbc_log_request {\n\tstruct trace_entry ent;\n\tstruct dbc_request *req;\n\tbool dir;\n\tunsigned int actual;\n\tunsigned int length;\n\tint status;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_xhci_log_ctrl_ctx {\n\tstruct trace_entry ent;\n\tu32 drop;\n\tu32 add;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_xhci_log_ctx {\n\tstruct trace_entry ent;\n\tint ctx_64;\n\tunsigned int ctx_type;\n\tdma_addr_t ctx_dma;\n\tu8 *ctx_va;\n\tunsigned int ctx_ep_num;\n\tu32 __data_loc_ctx_data;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_xhci_log_doorbell {\n\tstruct trace_entry ent;\n\tu32 slot;\n\tu32 doorbell;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_xhci_log_ep_ctx {\n\tstruct trace_entry ent;\n\tu32 info;\n\tu32 info2;\n\tu64 deq;\n\tu32 tx_info;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_xhci_log_free_virt_dev {\n\tstruct trace_entry ent;\n\tvoid *vdev;\n\tlong long unsigned int out_ctx;\n\tlong long unsigned int in_ctx;\n\tint slot_id;\n\tu16 current_mel;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_xhci_log_msg {\n\tstruct trace_entry ent;\n\tu32 __data_loc_msg;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_xhci_log_portsc {\n\tstruct trace_entry ent;\n\tu32 busnum;\n\tu32 portnum;\n\tu32 portsc;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_xhci_log_ring {\n\tstruct trace_entry ent;\n\tu32 type;\n\tvoid *ring;\n\tdma_addr_t enq;\n\tdma_addr_t deq;\n\tdma_addr_t enq_seg;\n\tdma_addr_t deq_seg;\n\tunsigned int num_segs;\n\tunsigned int stream_id;\n\tunsigned int cycle_state;\n\tunsigned int bounce_buf_len;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_xhci_log_slot_ctx {\n\tstruct trace_entry ent;\n\tu32 info;\n\tu32 info2;\n\tu32 tt_info;\n\tu32 state;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_xhci_log_trb {\n\tstruct trace_entry ent;\n\tu32 type;\n\tu32 field0;\n\tu32 field1;\n\tu32 field2;\n\tu32 field3;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_xhci_log_urb {\n\tstruct trace_entry ent;\n\tu32 __data_loc_devname;\n\tvoid *urb;\n\tunsigned int pipe;\n\tunsigned int stream;\n\tint status;\n\tunsigned int flags;\n\tint num_mapped_sgs;\n\tint num_sgs;\n\tint length;\n\tint actual;\n\tint epnum;\n\tint dir_in;\n\tint type;\n\tint slot_id;\n\tchar __data[0];\n};\n\nstruct trace_event_raw_xhci_log_virt_dev {\n\tstruct trace_entry ent;\n\tvoid *vdev;\n\tlong long unsigned int out_ctx;\n\tlong long unsigned int in_ctx;\n\tint devnum;\n\tint state;\n\tint speed;\n\tu8 portnum;\n\tu8 level;\n\tint slot_id;\n\tchar __data[0];\n};\n\nstruct trace_export {\n\tstruct trace_export *next;\n\tvoid (*write)(struct trace_export *, const void *, unsigned int);\n\tint flags;\n};\n\nstruct trace_fprobe {\n\tstruct dyn_event devent;\n\tstruct fprobe fp;\n\tconst char *symbol;\n\tstruct tracepoint *tpoint;\n\tstruct module *mod;\n\tstruct trace_probe tp;\n};\n\nstruct trace_func_repeats {\n\tlong unsigned int ip;\n\tlong unsigned int parent_ip;\n\tlong unsigned int count;\n\tu64 ts_last_call;\n};\n\nstruct trace_kprobe {\n\tstruct dyn_event devent;\n\tstruct kretprobe rp;\n\tlong unsigned int *nhit;\n\tconst char *symbol;\n\tstruct trace_probe tp;\n};\n\nstruct trace_mark {\n\tlong long unsigned int val;\n\tchar sym;\n};\n\nstruct trace_min_max_param {\n\tstruct mutex *lock;\n\tu64 *val;\n\tu64 *min;\n\tu64 *max;\n};\n\nstruct trace_mmiotrace_map {\n\tstruct trace_entry ent;\n\tstruct mmiotrace_map map;\n};\n\nstruct trace_mmiotrace_rw {\n\tstruct trace_entry ent;\n\tstruct mmiotrace_rw rw;\n};\n\nstruct tracer_opt;\n\nstruct tracer_flags;\n\nstruct trace_option_dentry {\n\tstruct tracer_opt *opt;\n\tstruct tracer_flags *flags;\n\tstruct trace_array *tr;\n\tstruct dentry *entry;\n};\n\nstruct trace_options {\n\tstruct tracer *tracer;\n\tstruct trace_option_dentry *topts;\n};\n\nunion upper_chunk;\n\nstruct trace_pid_list {\n\traw_spinlock_t lock;\n\tstruct irq_work refill_irqwork;\n\tunion upper_chunk *upper[256];\n\tunion upper_chunk *upper_list;\n\tunion lower_chunk *lower_list;\n\tint free_upper_chunks;\n\tint free_lower_chunks;\n};\n\nstruct trace_print_flags {\n\tlong unsigned int mask;\n\tconst char *name;\n};\n\nstruct trace_uprobe_filter {\n\trwlock_t rwlock;\n\tint nr_systemwide;\n\tstruct list_head perf_events;\n};\n\nstruct trace_probe_event {\n\tunsigned int flags;\n\tstruct trace_event_class class;\n\tstruct trace_event_call call;\n\tstruct list_head files;\n\tstruct list_head probes;\n\tstruct trace_uprobe_filter filter[0];\n};\n\nstruct trace_probe_log {\n\tconst char *subsystem;\n\tconst char **argv;\n\tint argc;\n\tint index;\n};\n\nstruct trace_stack {\n\tint stack_size;\n\tint nr_entries;\n\tlong unsigned int calls[256];\n};\n\nstruct trace_subsystem_dir {\n\tstruct list_head list;\n\tstruct event_subsystem *subsystem;\n\tstruct trace_array *tr;\n\tstruct eventfs_inode *ei;\n\tint ref_count;\n\tint nr_events;\n};\n\nstruct trace_uprobe {\n\tstruct dyn_event devent;\n\tstruct uprobe_consumer consumer;\n\tstruct path path;\n\tstruct inode *inode;\n\tchar *filename;\n\tlong unsigned int offset;\n\tlong unsigned int ref_ctr_offset;\n\tlong unsigned int nhit;\n\tstruct trace_probe tp;\n};\n\nstruct tracefs_dir_ops {\n\tint (*mkdir)(const char *);\n\tint (*rmdir)(const char *);\n};\n\nstruct tracefs_fs_info {\n\tkuid_t uid;\n\tkgid_t gid;\n\tumode_t mode;\n\tunsigned int opts;\n};\n\nstruct tracefs_inode {\n\tstruct inode vfs_inode;\n\tstruct list_head list;\n\tlong unsigned int flags;\n\tvoid *private;\n};\n\nstruct tracepoint {\n\tconst char *name;\n\tstruct static_key key;\n\tstruct static_call_key *static_call_key;\n\tvoid *static_call_tramp;\n\tvoid *iterator;\n\tvoid *probestub;\n\tint (*regfunc)(void);\n\tvoid (*unregfunc)(void);\n\tstruct tracepoint_func *funcs;\n};\n\nstruct traceprobe_parse_context {\n\tstruct trace_event_call *event;\n\tconst char *funcname;\n\tconst struct btf_type *proto;\n\tconst struct btf_param *params;\n\ts32 nr_params;\n\tstruct btf *btf;\n\tconst struct btf_type *last_type;\n\tu32 last_bitoffs;\n\tu32 last_bitsize;\n\tstruct trace_probe *tp;\n\tunsigned int flags;\n\tint offset;\n};\n\nstruct tracer {\n\tconst char *name;\n\tint (*init)(struct trace_array *);\n\tvoid (*reset)(struct trace_array *);\n\tvoid (*start)(struct trace_array *);\n\tvoid (*stop)(struct trace_array *);\n\tint (*update_thresh)(struct trace_array *);\n\tvoid (*open)(struct trace_iterator *);\n\tvoid (*pipe_open)(struct trace_iterator *);\n\tvoid (*close)(struct trace_iterator *);\n\tvoid (*pipe_close)(struct trace_iterator *);\n\tssize_t (*read)(struct trace_iterator *, struct file *, char *, size_t, loff_t *);\n\tssize_t (*splice_read)(struct trace_iterator *, struct file *, loff_t *, struct pipe_inode_info *, size_t, unsigned int);\n\tvoid (*print_header)(struct seq_file *);\n\tenum print_line_t (*print_line)(struct trace_iterator *);\n\tint (*set_flag)(struct trace_array *, u32, u32, int);\n\tint (*flag_changed)(struct trace_array *, u32, int);\n\tstruct tracer *next;\n\tstruct tracer_flags *flags;\n\tint enabled;\n\tbool print_max;\n\tbool allow_instances;\n\tbool use_max_tr;\n\tbool noboot;\n};\n\nstruct tracer_flags {\n\tu32 val;\n\tstruct tracer_opt *opts;\n\tstruct tracer *trace;\n};\n\nstruct tracer_opt {\n\tconst char *name;\n\tu32 bit;\n};\n\nstruct tracing_log_err {\n\tstruct list_head list;\n\tstruct err_info info;\n\tchar loc[128];\n\tchar *cmd;\n};\n\ntypedef int (*tracing_map_cmp_fn_t)(void *, void *);\n\nstruct tracing_map_field {\n\ttracing_map_cmp_fn_t cmp_fn;\n\tunion {\n\t\tatomic64_t sum;\n\t\tunsigned int offset;\n\t};\n};\n\nstruct tracing_map_array;\n\nstruct tracing_map_ops;\n\nstruct tracing_map {\n\tunsigned int key_size;\n\tunsigned int map_bits;\n\tunsigned int map_size;\n\tunsigned int max_elts;\n\tatomic_t next_elt;\n\tstruct tracing_map_array *elts;\n\tstruct tracing_map_array *map;\n\tconst struct tracing_map_ops *ops;\n\tvoid *private_data;\n\tstruct tracing_map_field fields[6];\n\tunsigned int n_fields;\n\tint key_idx[3];\n\tunsigned int n_keys;\n\tstruct tracing_map_sort_key sort_key;\n\tunsigned int n_vars;\n\tatomic64_t hits;\n\tatomic64_t drops;\n};\n\nstruct tracing_map_array {\n\tunsigned int entries_per_page;\n\tunsigned int entry_size_shift;\n\tunsigned int entry_shift;\n\tunsigned int entry_mask;\n\tunsigned int n_pages;\n\tvoid **pages;\n};\n\nstruct tracing_map_elt {\n\tstruct tracing_map *map;\n\tstruct tracing_map_field *fields;\n\tatomic64_t *vars;\n\tbool *var_set;\n\tvoid *key;\n\tvoid *private_data;\n};\n\nstruct tracing_map_entry {\n\tu32 key;\n\tstruct tracing_map_elt *val;\n};\n\nstruct tracing_map_ops {\n\tint (*elt_alloc)(struct tracing_map_elt *);\n\tvoid (*elt_free)(struct tracing_map_elt *);\n\tvoid (*elt_clear)(struct tracing_map_elt *);\n\tvoid (*elt_init)(struct tracing_map_elt *);\n};\n\nstruct tracing_map_sort_entry {\n\tvoid *key;\n\tstruct tracing_map_elt *elt;\n\tbool elt_copied;\n\tbool dup;\n};\n\nstruct track {\n\tlong unsigned int addr;\n\tdepot_stack_handle_t handle;\n\tint cpu;\n\tint pid;\n\tlong unsigned int when;\n};\n\nstruct track_data {\n\tu64 track_val;\n\tbool updated;\n\tunsigned int key_len;\n\tvoid *key;\n\tstruct tracing_map_elt elt;\n\tstruct action_data *action_data;\n\tstruct hist_trigger_data *hist_data;\n};\n\nstruct trampoline_header {\n\tu64 start;\n\tu64 efer;\n\tu32 cr4;\n\tu32 flags;\n\tu32 lock;\n};\n\nstruct transaction_chp_stats_s {\n\tlong unsigned int cs_chp_time;\n\t__u32 cs_forced_to_close;\n\t__u32 cs_written;\n\t__u32 cs_dropped;\n};\n\nstruct transaction_s {\n\tjournal_t *t_journal;\n\ttid_t t_tid;\n\tenum {\n\t\tT_RUNNING = 0,\n\t\tT_LOCKED = 1,\n\t\tT_SWITCH = 2,\n\t\tT_FLUSH = 3,\n\t\tT_COMMIT = 4,\n\t\tT_COMMIT_DFLUSH = 5,\n\t\tT_COMMIT_JFLUSH = 6,\n\t\tT_COMMIT_CALLBACK = 7,\n\t\tT_FINISHED = 8,\n\t} t_state;\n\tlong unsigned int t_log_start;\n\tint t_nr_buffers;\n\tstruct journal_head *t_reserved_list;\n\tstruct journal_head *t_buffers;\n\tstruct journal_head *t_forget;\n\tstruct journal_head *t_checkpoint_list;\n\tstruct journal_head *t_shadow_list;\n\tstruct list_head t_inode_list;\n\tlong unsigned int t_max_wait;\n\tlong unsigned int t_start;\n\tlong unsigned int t_requested;\n\tstruct transaction_chp_stats_s t_chp_stats;\n\tatomic_t t_updates;\n\tatomic_t t_outstanding_credits;\n\tatomic_t t_outstanding_revokes;\n\tatomic_t t_handle_count;\n\ttransaction_t *t_cpnext;\n\ttransaction_t *t_cpprev;\n\tlong unsigned int t_expires;\n\tktime_t t_start_time;\n\tunsigned int t_synchronous_commit: 1;\n\tint t_need_data_flush;\n\tstruct list_head t_private_list;\n};\n\nstruct trap_array_entry {\n\tvoid (*orig)(void);\n\tvoid (*xen)(void);\n\tbool ist_okay;\n};\n\nstruct trap_info {\n\tuint8_t vector;\n\tuint8_t flags;\n\tuint16_t cs;\n\tlong unsigned int address;\n};\n\nstruct trap_reason {\n\tlong unsigned int addr;\n\tlong unsigned int ip;\n\tenum reason_type type;\n\tint active_traces;\n};\n\nstruct trc_stall_chk_rdr {\n\tint nesting;\n\tint ipi_to_cpu;\n\tu8 needqs;\n};\n\ntypedef struct tree_desc_s tree_desc;\n\nstruct tree_descr {\n\tconst char *name;\n\tconst struct file_operations *ops;\n\tint mode;\n};\n\nstruct trie_use_stats;\n\nstruct trie {\n\tstruct key_vector kv[1];\n\tstruct trie_use_stats *stats;\n};\n\nstruct trie_stat {\n\tunsigned int totdepth;\n\tunsigned int maxdepth;\n\tunsigned int tnodes;\n\tunsigned int leaves;\n\tunsigned int nullpointers;\n\tunsigned int prefixes;\n\tunsigned int nodesizes[32];\n};\n\nstruct trie_use_stats {\n\tunsigned int gets;\n\tunsigned int backtrack;\n\tunsigned int semantic_match_passed;\n\tunsigned int semantic_match_miss;\n\tunsigned int null_node_hit;\n\tunsigned int resize_node_skipped;\n};\n\nstruct trusted_key_payload;\n\nstruct trusted_key_ops {\n\tunsigned char migratable;\n\tint (*init)(void);\n\tint (*seal)(struct trusted_key_payload *, char *);\n\tint (*unseal)(struct trusted_key_payload *, char *);\n\tint (*get_random)(unsigned char *, size_t);\n\tvoid (*exit)(void);\n};\n\nstruct trusted_key_options {\n\tuint16_t keytype;\n\tuint32_t keyhandle;\n\tunsigned char keyauth[20];\n\tuint32_t blobauth_len;\n\tunsigned char blobauth[20];\n\tuint32_t pcrinfo_len;\n\tunsigned char pcrinfo[64];\n\tint pcrlock;\n\tuint32_t hash;\n\tuint32_t policydigest_len;\n\tunsigned char policydigest[64];\n\tuint32_t policyhandle;\n};\n\nstruct trusted_key_payload {\n\tstruct callback_head rcu;\n\tunsigned int key_len;\n\tunsigned int blob_len;\n\tunsigned char migratable;\n\tunsigned char old_format;\n\tunsigned char key[129];\n\tunsigned char blob[512];\n};\n\nstruct trusted_key_source {\n\tchar *name;\n\tstruct trusted_key_ops *ops;\n};\n\nstruct ts_ops;\n\nstruct ts_state;\n\nstruct ts_config {\n\tstruct ts_ops *ops;\n\tint flags;\n\tunsigned int (*get_next_block)(unsigned int, const u8 **, struct ts_config *, struct ts_state *);\n\tvoid (*finish)(struct ts_config *, struct ts_state *);\n};\n\nstruct ts_dmi_data {\n\tstruct efi_embedded_fw_desc embedded_fw;\n\tconst char *acpi_name;\n\tconst struct property_entry *properties;\n};\n\nstruct ts_linear_state {\n\tunsigned int len;\n\tconst void *data;\n};\n\nstruct ts_ops {\n\tconst char *name;\n\tstruct ts_config * (*init)(const void *, unsigned int, gfp_t, int);\n\tunsigned int (*find)(struct ts_config *, struct ts_state *);\n\tvoid (*destroy)(struct ts_config *);\n\tvoid * (*get_pattern)(struct ts_config *);\n\tunsigned int (*get_pattern_len)(struct ts_config *);\n\tstruct module *owner;\n\tstruct list_head list;\n};\n\nstruct ts_state {\n\tunsigned int offset;\n\tchar cb[48];\n};\n\nstruct tsc_adjust {\n\ts64 bootval;\n\ts64 adjusted;\n\tlong unsigned int nextcheck;\n\tbool warned;\n};\n\nstruct tsinfo_reply_data {\n\tstruct ethnl_reply_data base;\n\tstruct kernel_ethtool_ts_info ts_info;\n\tstruct ethtool_ts_stats stats;\n};\n\nstruct tso_t {\n\tint next_frag_idx;\n\tint size;\n\tvoid *data;\n\tu16 ip_id;\n\tu8 tlen;\n\tbool ipv6;\n\tu32 tcp_seq;\n};\n\nstruct tsq_tasklet {\n\tstruct tasklet_struct tasklet;\n\tstruct list_head head;\n};\n\nstruct tty_audit_buf {\n\tstruct mutex mutex;\n\tdev_t dev;\n\tbool icanon;\n\tsize_t valid;\n\tu8 *data;\n};\n\nstruct tty_operations;\n\nstruct tty_driver {\n\tstruct kref kref;\n\tstruct cdev **cdevs;\n\tstruct module *owner;\n\tconst char *driver_name;\n\tconst char *name;\n\tint name_base;\n\tint major;\n\tint minor_start;\n\tunsigned int num;\n\tshort int type;\n\tshort int subtype;\n\tstruct ktermios init_termios;\n\tlong unsigned int flags;\n\tstruct proc_dir_entry *proc_entry;\n\tstruct tty_driver *other;\n\tstruct tty_struct **ttys;\n\tstruct tty_port **ports;\n\tstruct ktermios **termios;\n\tvoid *driver_state;\n\tconst struct tty_operations *ops;\n\tstruct list_head tty_drivers;\n};\n\nstruct tty_file_private {\n\tstruct tty_struct *tty;\n\tstruct file *file;\n\tstruct list_head list;\n};\n\nstruct tty_ldisc_ops;\n\nstruct tty_ldisc {\n\tstruct tty_ldisc_ops *ops;\n\tstruct tty_struct *tty;\n};\n\nstruct tty_ldisc_ops {\n\tchar *name;\n\tint num;\n\tint (*open)(struct tty_struct *);\n\tvoid (*close)(struct tty_struct *);\n\tvoid (*flush_buffer)(struct tty_struct *);\n\tssize_t (*read)(struct tty_struct *, struct file *, u8 *, size_t, void **, long unsigned int);\n\tssize_t (*write)(struct tty_struct *, struct file *, const u8 *, size_t);\n\tint (*ioctl)(struct tty_struct *, unsigned int, long unsigned int);\n\tint (*compat_ioctl)(struct tty_struct *, unsigned int, long unsigned int);\n\tvoid (*set_termios)(struct tty_struct *, const struct ktermios *);\n\t__poll_t (*poll)(struct tty_struct *, struct file *, struct poll_table_struct *);\n\tvoid (*hangup)(struct tty_struct *);\n\tvoid (*receive_buf)(struct tty_struct *, const u8 *, const u8 *, size_t);\n\tvoid (*write_wakeup)(struct tty_struct *);\n\tvoid (*dcd_change)(struct tty_struct *, bool);\n\tsize_t (*receive_buf2)(struct tty_struct *, const u8 *, const u8 *, size_t);\n\tvoid (*lookahead_buf)(struct tty_struct *, const u8 *, const u8 *, size_t);\n\tstruct module *owner;\n};\n\nstruct tty_operations {\n\tstruct tty_struct * (*lookup)(struct tty_driver *, struct file *, int);\n\tint (*install)(struct tty_driver *, struct tty_struct *);\n\tvoid (*remove)(struct tty_driver *, struct tty_struct *);\n\tint (*open)(struct tty_struct *, struct file *);\n\tvoid (*close)(struct tty_struct *, struct file *);\n\tvoid (*shutdown)(struct tty_struct *);\n\tvoid (*cleanup)(struct tty_struct *);\n\tssize_t (*write)(struct tty_struct *, const u8 *, size_t);\n\tint (*put_char)(struct tty_struct *, u8);\n\tvoid (*flush_chars)(struct tty_struct *);\n\tunsigned int (*write_room)(struct tty_struct *);\n\tunsigned int (*chars_in_buffer)(struct tty_struct *);\n\tint (*ioctl)(struct tty_struct *, unsigned int, long unsigned int);\n\tlong int (*compat_ioctl)(struct tty_struct *, unsigned int, long unsigned int);\n\tvoid (*set_termios)(struct tty_struct *, const struct ktermios *);\n\tvoid (*throttle)(struct tty_struct *);\n\tvoid (*unthrottle)(struct tty_struct *);\n\tvoid (*stop)(struct tty_struct *);\n\tvoid (*start)(struct tty_struct *);\n\tvoid (*hangup)(struct tty_struct *);\n\tint (*break_ctl)(struct tty_struct *, int);\n\tvoid (*flush_buffer)(struct tty_struct *);\n\tint (*ldisc_ok)(struct tty_struct *, int);\n\tvoid (*set_ldisc)(struct tty_struct *);\n\tvoid (*wait_until_sent)(struct tty_struct *, int);\n\tvoid (*send_xchar)(struct tty_struct *, u8);\n\tint (*tiocmget)(struct tty_struct *);\n\tint (*tiocmset)(struct tty_struct *, unsigned int, unsigned int);\n\tint (*resize)(struct tty_struct *, struct winsize *);\n\tint (*get_icount)(struct tty_struct *, struct serial_icounter_struct *);\n\tint (*get_serial)(struct tty_struct *, struct serial_struct *);\n\tint (*set_serial)(struct tty_struct *, struct serial_struct *);\n\tvoid (*show_fdinfo)(struct tty_struct *, struct seq_file *);\n\tint (*poll_init)(struct tty_driver *, int, char *);\n\tint (*poll_get_char)(struct tty_driver *, int);\n\tvoid (*poll_put_char)(struct tty_driver *, int, char);\n\tint (*proc_show)(struct seq_file *, void *);\n};\n\nstruct tty_port_client_operations {\n\tsize_t (*receive_buf)(struct tty_port *, const u8 *, const u8 *, size_t);\n\tvoid (*lookahead_buf)(struct tty_port *, const u8 *, const u8 *, size_t);\n\tvoid (*write_wakeup)(struct tty_port *);\n};\n\nstruct tty_port_operations {\n\tbool (*carrier_raised)(struct tty_port *);\n\tvoid (*dtr_rts)(struct tty_port *, bool);\n\tvoid (*shutdown)(struct tty_port *);\n\tint (*activate)(struct tty_port *, struct tty_struct *);\n\tvoid (*destruct)(struct tty_port *);\n};\n\nstruct tty_struct {\n\tstruct kref kref;\n\tint index;\n\tstruct device *dev;\n\tstruct tty_driver *driver;\n\tstruct tty_port *port;\n\tconst struct tty_operations *ops;\n\tstruct tty_ldisc *ldisc;\n\tstruct ld_semaphore ldisc_sem;\n\tstruct mutex atomic_write_lock;\n\tstruct mutex legacy_mutex;\n\tstruct mutex throttle_mutex;\n\tstruct rw_semaphore termios_rwsem;\n\tstruct mutex winsize_mutex;\n\tstruct ktermios termios;\n\tstruct ktermios termios_locked;\n\tchar name[64];\n\tlong unsigned int flags;\n\tint count;\n\tunsigned int receive_room;\n\tstruct winsize winsize;\n\tstruct {\n\t\tspinlock_t lock;\n\t\tbool stopped;\n\t\tbool tco_stopped;\n\t} flow;\n\tstruct {\n\t\tstruct pid *pgrp;\n\t\tstruct pid *session;\n\t\tspinlock_t lock;\n\t\tunsigned char pktstatus;\n\t\tbool packet;\n\t} ctrl;\n\tbool hw_stopped;\n\tbool closing;\n\tint flow_change;\n\tstruct tty_struct *link;\n\tstruct fasync_struct *fasync;\n\twait_queue_head_t write_wait;\n\twait_queue_head_t read_wait;\n\tstruct work_struct hangup_work;\n\tvoid *disc_data;\n\tvoid *driver_data;\n\tspinlock_t files_lock;\n\tint write_cnt;\n\tu8 *write_buf;\n\tstruct list_head tty_files;\n\tstruct work_struct SAK_work;\n};\n\nstruct ttyprintk_port {\n\tstruct tty_port port;\n\tspinlock_t spinlock;\n};\n\nstruct tun_struct;\n\nstruct tun_file {\n\tstruct sock sk;\n\tlong: 64;\n\tstruct socket socket;\n\tstruct tun_struct *tun;\n\tstruct fasync_struct *fasync;\n\tunsigned int flags;\n\tunion {\n\t\tu16 queue_index;\n\t\tunsigned int ifindex;\n\t};\n\tstruct napi_struct napi;\n\tbool napi_enabled;\n\tbool napi_frags_enabled;\n\tstruct mutex napi_mutex;\n\tstruct list_head next;\n\tstruct tun_struct *detached;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tstruct ptr_ring tx_ring;\n\tstruct xdp_rxq_info xdp_rxq;\n};\n\nstruct tun_filter {\n\t__u16 flags;\n\t__u16 count;\n\t__u8 addr[0];\n};\n\nstruct tun_flow_entry {\n\tstruct hlist_node hash_link;\n\tstruct callback_head rcu;\n\tstruct tun_struct *tun;\n\tu32 rxhash;\n\tu32 rps_rxhash;\n\tint queue_index;\n\tlong: 64;\n\tlong unsigned int updated;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct tun_msg_ctl {\n\tshort unsigned int type;\n\tshort unsigned int num;\n\tvoid *ptr;\n};\n\nstruct tun_page {\n\tstruct page *page;\n\tint count;\n};\n\nstruct tun_pi {\n\t__u16 flags;\n\t__be16 proto;\n};\n\nstruct tun_prog {\n\tstruct callback_head rcu;\n\tstruct bpf_prog *prog;\n};\n\nstruct tun_security_struct {\n\tu32 sid;\n};\n\nstruct tun_struct {\n\tstruct tun_file *tfiles[256];\n\tunsigned int numqueues;\n\tunsigned int flags;\n\tkuid_t owner;\n\tkgid_t group;\n\tstruct net_device *dev;\n\tnetdev_features_t set_features;\n\tint align;\n\tint vnet_hdr_sz;\n\tint sndbuf;\n\tstruct tap_filter txflt;\n\tstruct sock_fprog fprog;\n\tbool filter_attached;\n\tu32 msg_enable;\n\tspinlock_t lock;\n\tstruct hlist_head flows[1024];\n\tstruct timer_list flow_gc_timer;\n\tlong unsigned int ageing_time;\n\tunsigned int numdisabled;\n\tstruct list_head disabled;\n\tvoid *security;\n\tu32 flow_count;\n\tu32 rx_batched;\n\tatomic_long_t rx_frame_errors;\n\tstruct bpf_prog *xdp_prog;\n\tstruct tun_prog *steering_prog;\n\tstruct tun_prog *filter_prog;\n\tstruct ethtool_link_ksettings link_ksettings;\n\tstruct file *file;\n\tstruct ifreq *ifr;\n};\n\nstruct virtio_net_hdr {\n\t__u8 flags;\n\t__u8 gso_type;\n\t__virtio16 hdr_len;\n\t__virtio16 gso_size;\n\t__virtio16 csum_start;\n\t__virtio16 csum_offset;\n};\n\nstruct tun_xdp_hdr {\n\tint buflen;\n\tstruct virtio_net_hdr gso;\n};\n\nstruct twl4030_audio_resource {\n\tint request_count;\n\tu8 reg;\n\tu8 mask;\n};\n\nstruct twl4030_audio {\n\tunsigned int audio_mclk;\n\tstruct mutex mutex;\n\tstruct twl4030_audio_resource resource[2];\n\tstruct mfd_cell cells[2];\n};\n\nstruct twl4030_codec_data;\n\nstruct twl4030_vibra_data;\n\nstruct twl4030_audio_data {\n\tunsigned int audio_mclk;\n\tstruct twl4030_codec_data *codec;\n\tstruct twl4030_vibra_data *vibra;\n\tint audpwron_gpio;\n\tint naudint_irq;\n\tunsigned int irq_base;\n};\n\nstruct twl4030_codec_data {\n\tunsigned int digimic_delay;\n\tunsigned int ramp_delay_value;\n\tunsigned int offset_cncl_path;\n\tunsigned int hs_extmute: 1;\n\tint hs_extmute_gpio;\n};\n\nstruct twl4030_vibra_data {\n\tunsigned int coexist;\n};\n\nstruct twl6030_irq {\n\tunsigned int irq_base;\n\tint twl_irq;\n\tbool irq_wake_enabled;\n\tatomic_t wakeirqs;\n\tstruct notifier_block pm_nb;\n\tstruct irq_chip irq_chip;\n\tstruct irq_domain *irq_domain;\n\tconst int *irq_mapping_tbl;\n};\n\nstruct twl6040 {\n\tstruct device *dev;\n\tstruct regmap *regmap;\n\tstruct regmap_irq_chip_data *irq_data;\n\tstruct regulator_bulk_data supplies[2];\n\tstruct clk *clk32k;\n\tstruct clk *mclk;\n\tstruct mutex mutex;\n\tstruct mutex irq_mutex;\n\tstruct mfd_cell cells[4];\n\tstruct completion ready;\n\tstruct gpio_desc *audpwron;\n\tint power_count;\n\tint rev;\n\tint pll;\n\tunsigned int sysclk_rate;\n\tunsigned int mclk_rate;\n\tunsigned int irq;\n\tunsigned int irq_ready;\n\tunsigned int irq_th;\n};\n\nstruct twl_client {\n\tstruct i2c_client *client;\n\tstruct regmap *regmap;\n};\n\nstruct twl_mapping {\n\tunsigned char sid;\n\tunsigned char base;\n};\n\nstruct twl_private {\n\tbool ready;\n\tu32 twl_idcode;\n\tunsigned int twl_id;\n\tstruct twl_mapping *twl_map;\n\tstruct twl_client *twl_modules;\n};\n\nstruct type_datum {\n\tu32 value;\n\tu32 bounds;\n\tunsigned char primary;\n\tunsigned char attribute;\n};\n\nstruct type_descriptor {\n\tu16 type_kind;\n\tu16 type_info;\n\tchar type_name[0];\n};\n\nstruct type_mismatch_data {\n\tstruct source_location location;\n\tstruct type_descriptor *type;\n\tlong unsigned int alignment;\n\tunsigned char type_check_kind;\n};\n\nstruct type_mismatch_data_common {\n\tstruct source_location *location;\n\tstruct type_descriptor *type;\n\tlong unsigned int alignment;\n\tunsigned char type_check_kind;\n};\n\nstruct type_mismatch_data_v1 {\n\tstruct source_location location;\n\tstruct type_descriptor *type;\n\tunsigned char log_alignment;\n\tunsigned char type_check_kind;\n};\n\nstruct type_set {\n\tstruct ebitmap types;\n\tstruct ebitmap negset;\n\tu32 flags;\n};\n\nstruct typec_connector {\n\tvoid (*attach)(struct typec_connector *, struct device *);\n\tvoid (*deattach)(struct typec_connector *, struct device *);\n};\n\nstruct u32_fract {\n\t__u32 numerator;\n\t__u32 denominator;\n};\n\nstruct uart_8250_em485 {\n\tstruct hrtimer start_tx_timer;\n\tstruct hrtimer stop_tx_timer;\n\tstruct hrtimer *active_timer;\n\tstruct uart_8250_port *port;\n\tunsigned int tx_stopped: 1;\n};\n\nstruct uart_8250_ops {\n\tint (*setup_irq)(struct uart_8250_port *);\n\tvoid (*release_irq)(struct uart_8250_port *);\n\tvoid (*setup_timer)(struct uart_8250_port *);\n};\n\nstruct uart_8250_port {\n\tstruct uart_port port;\n\tstruct timer_list timer;\n\tstruct list_head list;\n\tu32 capabilities;\n\tu16 bugs;\n\tunsigned int tx_loadsz;\n\tunsigned char acr;\n\tunsigned char fcr;\n\tunsigned char ier;\n\tunsigned char lcr;\n\tunsigned char mcr;\n\tunsigned char cur_iotype;\n\tunsigned int rpm_tx_active;\n\tunsigned char canary;\n\tunsigned char probe;\n\tstruct mctrl_gpios *gpios;\n\tu16 lsr_saved_flags;\n\tu16 lsr_save_mask;\n\tunsigned char msr_saved_flags;\n\tstruct uart_8250_dma *dma;\n\tconst struct uart_8250_ops *ops;\n\tu32 (*dl_read)(struct uart_8250_port *);\n\tvoid (*dl_write)(struct uart_8250_port *, u32);\n\tstruct uart_8250_em485 *em485;\n\tvoid (*rs485_start_tx)(struct uart_8250_port *);\n\tvoid (*rs485_stop_tx)(struct uart_8250_port *);\n\tstruct delayed_work overrun_backoff;\n\tu32 overrun_backoff_time_ms;\n};\n\nstruct uart_match {\n\tstruct uart_port *port;\n\tstruct uart_driver *driver;\n};\n\nstruct uart_ops {\n\tunsigned int (*tx_empty)(struct uart_port *);\n\tvoid (*set_mctrl)(struct uart_port *, unsigned int);\n\tunsigned int (*get_mctrl)(struct uart_port *);\n\tvoid (*stop_tx)(struct uart_port *);\n\tvoid (*start_tx)(struct uart_port *);\n\tvoid (*throttle)(struct uart_port *);\n\tvoid (*unthrottle)(struct uart_port *);\n\tvoid (*send_xchar)(struct uart_port *, char);\n\tvoid (*stop_rx)(struct uart_port *);\n\tvoid (*start_rx)(struct uart_port *);\n\tvoid (*enable_ms)(struct uart_port *);\n\tvoid (*break_ctl)(struct uart_port *, int);\n\tint (*startup)(struct uart_port *);\n\tvoid (*shutdown)(struct uart_port *);\n\tvoid (*flush_buffer)(struct uart_port *);\n\tvoid (*set_termios)(struct uart_port *, struct ktermios *, const struct ktermios *);\n\tvoid (*set_ldisc)(struct uart_port *, struct ktermios *);\n\tvoid (*pm)(struct uart_port *, unsigned int, unsigned int);\n\tconst char * (*type)(struct uart_port *);\n\tvoid (*release_port)(struct uart_port *);\n\tint (*request_port)(struct uart_port *);\n\tvoid (*config_port)(struct uart_port *, int);\n\tint (*verify_port)(struct uart_port *, struct serial_struct *);\n\tint (*ioctl)(struct uart_port *, unsigned int, long unsigned int);\n\tint (*poll_init)(struct uart_port *);\n\tvoid (*poll_put_char)(struct uart_port *, unsigned char);\n\tint (*poll_get_char)(struct uart_port *);\n};\n\nstruct uart_state {\n\tstruct tty_port port;\n\tenum uart_pm_state pm_state;\n\tatomic_t refcount;\n\twait_queue_head_t remove_wait;\n\tstruct uart_port *uart_port;\n};\n\nstruct ubuf_info_msgzc {\n\tstruct ubuf_info ubuf;\n\tunion {\n\t\tstruct {\n\t\t\tlong unsigned int desc;\n\t\t\tvoid *ctx;\n\t\t};\n\t\tstruct {\n\t\t\tu32 id;\n\t\t\tu16 len;\n\t\t\tu16 zerocopy: 1;\n\t\t\tu32 bytelen;\n\t\t};\n\t};\n\tstruct mmpin mmp;\n};\n\nstruct ubuf_info_ops {\n\tvoid (*complete)(struct sk_buff *, struct ubuf_info *, bool);\n\tint (*link_skb)(struct sk_buff *, struct ubuf_info *);\n};\n\nstruct uclamp_request {\n\ts64 percent;\n\tu64 util;\n\tint ret;\n};\n\nstruct ucode_cpu_info {\n\tstruct cpu_signature cpu_sig;\n\tvoid *mc;\n};\n\nstruct ucode_patch {\n\tstruct list_head plist;\n\tvoid *data;\n\tunsigned int size;\n\tu32 patch_id;\n\tu16 equiv_cpu;\n};\n\nstruct ucounts {\n\tstruct hlist_node node;\n\tstruct user_namespace *ns;\n\tkuid_t uid;\n\tatomic_t count;\n\tatomic_long_t ucount[12];\n\tatomic_long_t rlimit[4];\n};\n\nstruct ucred {\n\t__u32 pid;\n\t__u32 uid;\n\t__u32 gid;\n};\n\nstruct udmabuf {\n\tlong unsigned int pagecount;\n\tstruct folio **folios;\n\tstruct sg_table *sg;\n\tstruct miscdevice *device;\n\tlong unsigned int *offsets;\n\tstruct list_head unpin_list;\n};\n\nstruct udmabuf_create {\n\t__u32 memfd;\n\t__u32 flags;\n\t__u64 offset;\n\t__u64 size;\n};\n\nstruct udmabuf_create_item {\n\t__u32 memfd;\n\t__u32 __pad;\n\t__u64 offset;\n\t__u64 size;\n};\n\nstruct udmabuf_create_list {\n\t__u32 flags;\n\t__u32 count;\n\tstruct udmabuf_create_item list[0];\n};\n\nstruct udmabuf_folio {\n\tstruct folio *folio;\n\tstruct list_head list;\n};\n\nstruct udp_sock {\n\tstruct inet_sock inet;\n\tlong unsigned int udp_flags;\n\tint pending;\n\t__u8 encap_type;\n\t__u16 len;\n\t__u16 gso_size;\n\t__u16 pcslen;\n\t__u16 pcrlen;\n\tint (*encap_rcv)(struct sock *, struct sk_buff *);\n\tvoid (*encap_err_rcv)(struct sock *, struct sk_buff *, int, __be16, u32, u8 *);\n\tint (*encap_err_lookup)(struct sock *, struct sk_buff *);\n\tvoid (*encap_destroy)(struct sock *);\n\tstruct sk_buff * (*gro_receive)(struct sock *, struct list_head *, struct sk_buff *);\n\tint (*gro_complete)(struct sock *, struct sk_buff *, int);\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tstruct sk_buff_head reader_queue;\n\tint forward_deficit;\n\tint forward_threshold;\n\tbool peeking_with_offset;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct udp6_sock {\n\tstruct udp_sock udp;\n\tstruct ipv6_pinfo inet6;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct udp_dev_scratch {\n\tu32 _tsize_state;\n\tu16 len;\n\tbool is_linear;\n\tbool csum_unnecessary;\n};\n\nstruct udp_hslot {\n\tstruct hlist_head head;\n\tint count;\n\tspinlock_t lock;\n};\n\nstruct udp_mib {\n\tlong unsigned int mibs[10];\n};\n\nstruct udp_seq_afinfo {\n\tsa_family_t family;\n\tstruct udp_table *udp_table;\n};\n\nstruct udp_skb_cb {\n\tunion {\n\t\tstruct inet_skb_parm h4;\n\t\tstruct inet6_skb_parm h6;\n\t} header;\n\t__u16 cscov;\n\t__u8 partial_cov;\n};\n\nstruct udp_table {\n\tstruct udp_hslot *hash;\n\tstruct udp_hslot *hash2;\n\tunsigned int mask;\n\tunsigned int log;\n};\n\nstruct udp_tunnel_info {\n\tshort unsigned int type;\n\tsa_family_t sa_family;\n\t__be16 port;\n\tu8 hw_priv;\n};\n\nstruct udp_tunnel_nic_table_info {\n\tunsigned int n_entries;\n\tunsigned int tunnel_types;\n};\n\nstruct udp_tunnel_nic_shared;\n\nstruct udp_tunnel_nic_info {\n\tint (*set_port)(struct net_device *, unsigned int, unsigned int, struct udp_tunnel_info *);\n\tint (*unset_port)(struct net_device *, unsigned int, unsigned int, struct udp_tunnel_info *);\n\tint (*sync_table)(struct net_device *, unsigned int);\n\tstruct udp_tunnel_nic_shared *shared;\n\tunsigned int flags;\n\tstruct udp_tunnel_nic_table_info tables[4];\n};\n\nstruct udp_tunnel_nic_ops {\n\tvoid (*get_port)(struct net_device *, unsigned int, unsigned int, struct udp_tunnel_info *);\n\tvoid (*set_port_priv)(struct net_device *, unsigned int, unsigned int, u8);\n\tvoid (*add_port)(struct net_device *, struct udp_tunnel_info *);\n\tvoid (*del_port)(struct net_device *, struct udp_tunnel_info *);\n\tvoid (*reset_ntf)(struct net_device *);\n\tsize_t (*dump_size)(struct net_device *, unsigned int);\n\tint (*dump_write)(struct net_device *, unsigned int, struct sk_buff *);\n};\n\nstruct udp_tunnel_nic_shared {\n\tstruct udp_tunnel_nic *udp_tunnel_nic_info;\n\tstruct list_head devices;\n};\n\nstruct udphdr {\n\t__be16 source;\n\t__be16 dest;\n\t__be16 len;\n\t__sum16 check;\n};\n\nstruct uevent_sock {\n\tstruct list_head list;\n\tstruct sock *sk;\n};\n\nstruct uffd_msg {\n\t__u8 event;\n\t__u8 reserved1;\n\t__u16 reserved2;\n\t__u32 reserved3;\n\tunion {\n\t\tstruct {\n\t\t\t__u64 flags;\n\t\t\t__u64 address;\n\t\t\tunion {\n\t\t\t\t__u32 ptid;\n\t\t\t} feat;\n\t\t} pagefault;\n\t\tstruct {\n\t\t\t__u32 ufd;\n\t\t} fork;\n\t\tstruct {\n\t\t\t__u64 from;\n\t\t\t__u64 to;\n\t\t\t__u64 len;\n\t\t} remap;\n\t\tstruct {\n\t\t\t__u64 start;\n\t\t\t__u64 end;\n\t\t} remove;\n\t\tstruct {\n\t\t\t__u64 reserved1;\n\t\t\t__u64 reserved2;\n\t\t\t__u64 reserved3;\n\t\t} reserved;\n\t} arg;\n};\n\nstruct uffdio_api {\n\t__u64 api;\n\t__u64 features;\n\t__u64 ioctls;\n};\n\nstruct uffdio_range {\n\t__u64 start;\n\t__u64 len;\n};\n\nstruct uffdio_continue {\n\tstruct uffdio_range range;\n\t__u64 mode;\n\t__s64 mapped;\n};\n\nstruct uffdio_copy {\n\t__u64 dst;\n\t__u64 src;\n\t__u64 len;\n\t__u64 mode;\n\t__s64 copy;\n};\n\nstruct uffdio_move {\n\t__u64 dst;\n\t__u64 src;\n\t__u64 len;\n\t__u64 mode;\n\t__s64 move;\n};\n\nstruct uffdio_poison {\n\tstruct uffdio_range range;\n\t__u64 mode;\n\t__s64 updated;\n};\n\nstruct uffdio_register {\n\tstruct uffdio_range range;\n\t__u64 mode;\n\t__u64 ioctls;\n};\n\nstruct uffdio_writeprotect {\n\tstruct uffdio_range range;\n\t__u64 mode;\n};\n\nstruct uffdio_zeropage {\n\tstruct uffdio_range range;\n\t__u64 mode;\n\t__s64 zeropage;\n};\n\nstruct uhci_debug {\n\tint size;\n\tchar *data;\n};\n\nstruct uhci_td;\n\nstruct uhci_qh;\n\nstruct uhci_hcd {\n\tlong unsigned int io_addr;\n\tvoid *regs;\n\tstruct dma_pool *qh_pool;\n\tstruct dma_pool *td_pool;\n\tstruct uhci_td *term_td;\n\tstruct uhci_qh *skelqh[11];\n\tstruct uhci_qh *next_qh;\n\tspinlock_t lock;\n\tdma_addr_t frame_dma_handle;\n\t__le32 *frame;\n\tvoid **frame_cpu;\n\tenum uhci_rh_state rh_state;\n\tlong unsigned int auto_stop_time;\n\tunsigned int frame_number;\n\tunsigned int is_stopped;\n\tunsigned int last_iso_frame;\n\tunsigned int cur_iso_frame;\n\tunsigned int scan_in_progress: 1;\n\tunsigned int need_rescan: 1;\n\tunsigned int dead: 1;\n\tunsigned int RD_enable: 1;\n\tunsigned int is_initialized: 1;\n\tunsigned int fsbr_is_on: 1;\n\tunsigned int fsbr_is_wanted: 1;\n\tunsigned int fsbr_expiring: 1;\n\tstruct timer_list fsbr_timer;\n\tunsigned int oc_low: 1;\n\tunsigned int wait_for_hp: 1;\n\tunsigned int big_endian_mmio: 1;\n\tunsigned int big_endian_desc: 1;\n\tunsigned int is_aspeed: 1;\n\tlong unsigned int port_c_suspend;\n\tlong unsigned int resuming_ports;\n\tlong unsigned int ports_timeout;\n\tstruct list_head idle_qh_list;\n\tint rh_numports;\n\twait_queue_head_t waitqh;\n\tint num_waiting;\n\tint total_load;\n\tshort int load[32];\n\tstruct clk *clk;\n\tvoid (*reset_hc)(struct uhci_hcd *);\n\tint (*check_and_reset_hc)(struct uhci_hcd *);\n\tvoid (*configure_hc)(struct uhci_hcd *);\n\tint (*resume_detect_interrupts_are_broken)(struct uhci_hcd *);\n\tint (*global_suspend_mode_is_broken)(struct uhci_hcd *);\n};\n\nstruct usb_iso_packet_descriptor;\n\nstruct uhci_qh {\n\t__le32 link;\n\t__le32 element;\n\tdma_addr_t dma_handle;\n\tstruct list_head node;\n\tstruct usb_host_endpoint *hep;\n\tstruct usb_device *udev;\n\tstruct list_head queue;\n\tstruct uhci_td *dummy_td;\n\tstruct uhci_td *post_td;\n\tstruct usb_iso_packet_descriptor *iso_packet_desc;\n\tlong unsigned int advance_jiffies;\n\tunsigned int unlink_frame;\n\tunsigned int period;\n\tshort int phase;\n\tshort int load;\n\tunsigned int iso_frame;\n\tint state;\n\tint type;\n\tint skel;\n\tunsigned int initial_toggle: 1;\n\tunsigned int needs_fixup: 1;\n\tunsigned int is_stopped: 1;\n\tunsigned int wait_expired: 1;\n\tunsigned int bandwidth_reserved: 1;\n};\n\nstruct uhci_td {\n\t__le32 link;\n\t__le32 status;\n\t__le32 token;\n\t__le32 buffer;\n\tdma_addr_t dma_handle;\n\tstruct list_head list;\n\tint frame;\n\tstruct list_head fl_list;\n};\n\nstruct uinput_abs_setup {\n\t__u16 code;\n\tstruct input_absinfo absinfo;\n};\n\nstruct uinput_request;\n\nstruct uinput_device {\n\tstruct input_dev *dev;\n\tstruct mutex mutex;\n\tenum uinput_state state;\n\twait_queue_head_t waitq;\n\tunsigned char ready;\n\tunsigned char head;\n\tunsigned char tail;\n\tstruct input_event buff[16];\n\tunsigned int ff_effects_max;\n\tstruct uinput_request *requests[16];\n\twait_queue_head_t requests_waitq;\n\tspinlock_t requests_lock;\n};\n\nstruct uinput_ff_erase {\n\t__u32 request_id;\n\t__s32 retval;\n\t__u32 effect_id;\n};\n\nstruct uinput_ff_upload {\n\t__u32 request_id;\n\t__s32 retval;\n\tstruct ff_effect effect;\n\tstruct ff_effect old;\n};\n\nstruct uinput_ff_upload_compat {\n\t__u32 request_id;\n\t__s32 retval;\n\tstruct ff_effect_compat effect;\n\tstruct ff_effect_compat old;\n};\n\nstruct uinput_request {\n\tunsigned int id;\n\tunsigned int code;\n\tint retval;\n\tstruct completion done;\n\tunion {\n\t\tunsigned int effect_id;\n\t\tstruct {\n\t\t\tstruct ff_effect *effect;\n\t\t\tstruct ff_effect *old;\n\t\t} upload;\n\t} u;\n};\n\nstruct uinput_setup {\n\tstruct input_id id;\n\tchar name[80];\n\t__u32 ff_effects_max;\n};\n\nstruct uinput_user_dev {\n\tchar name[80];\n\tstruct input_id id;\n\t__u32 ff_effects_max;\n\t__s32 absmax[64];\n\t__s32 absmin[64];\n\t__s32 absfuzz[64];\n\t__s32 absflat[64];\n};\n\nstruct ultrix_disklabel {\n\ts32 pt_magic;\n\ts32 pt_valid;\n\tstruct pt_info pt_part[8];\n};\n\nstruct uncached_list {\n\tspinlock_t lock;\n\tstruct list_head head;\n};\n\nstruct uncharge_gather {\n\tstruct mem_cgroup *memcg;\n\tlong unsigned int nr_memory;\n\tlong unsigned int pgpgout;\n\tlong unsigned int nr_kmem;\n\tint nid;\n};\n\nstruct uncore_event_desc {\n\tstruct device_attribute attr;\n\tconst char *config;\n};\n\nstruct uncore_global_discovery {\n\tunion {\n\t\tu64 table1;\n\t\tstruct {\n\t\t\tu64 type: 8;\n\t\t\tu64 stride: 8;\n\t\t\tu64 max_units: 10;\n\t\t\tu64 __reserved_1: 36;\n\t\t\tu64 access_type: 2;\n\t\t};\n\t};\n\tu64 ctl;\n\tunion {\n\t\tu64 table3;\n\t\tstruct {\n\t\t\tu64 status_offset: 8;\n\t\t\tu64 num_status: 16;\n\t\t\tu64 __reserved_2: 40;\n\t\t};\n\t};\n};\n\nstruct uncore_iio_topology {\n\tint pci_bus_no;\n\tint segment;\n};\n\nstruct uncore_unit_discovery {\n\tunion {\n\t\tu64 table1;\n\t\tstruct {\n\t\t\tu64 num_regs: 8;\n\t\t\tu64 ctl_offset: 8;\n\t\t\tu64 bit_width: 8;\n\t\t\tu64 ctr_offset: 8;\n\t\t\tu64 status_offset: 8;\n\t\t\tu64 __reserved_1: 22;\n\t\t\tu64 access_type: 2;\n\t\t};\n\t};\n\tu64 ctl;\n\tunion {\n\t\tu64 table3;\n\t\tstruct {\n\t\t\tu64 box_type: 16;\n\t\t\tu64 box_id: 16;\n\t\t\tu64 __reserved_2: 32;\n\t\t};\n\t};\n};\n\nstruct uncore_upi_topology {\n\tint die_to;\n\tint pmu_idx_to;\n\tint enabled;\n};\n\nstruct uni_pagedict {\n\tu16 **uni_pgdir[32];\n\tlong unsigned int refcount;\n\tlong unsigned int sum;\n\tunsigned char *inverse_translations[4];\n\tu16 *inverse_trans_unicode;\n};\n\nstruct utf8data;\n\nstruct utf8data_table;\n\nstruct unicode_map {\n\tunsigned int version;\n\tconst struct utf8data *ntab[2];\n\tconst struct utf8data_table *tables;\n};\n\nstruct unipair;\n\nstruct unimapdesc {\n\tshort unsigned int entry_ct;\n\tstruct unipair *entries;\n};\n\nstruct unipair {\n\tshort unsigned int unicode;\n\tshort unsigned int fontpos;\n};\n\nstruct unity_map_entry {\n\tstruct list_head list;\n\tu16 devid_start;\n\tu16 devid_end;\n\tu64 address_start;\n\tu64 address_end;\n\tint prot;\n};\n\nstruct unix_address {\n\trefcount_t refcnt;\n\tint len;\n\tstruct sockaddr_un name[0];\n};\n\nstruct unix_edge {\n\tstruct unix_sock *predecessor;\n\tstruct unix_sock *successor;\n\tstruct list_head vertex_entry;\n\tstruct list_head stack_entry;\n};\n\nstruct unix_skb_parms {\n\tstruct pid *pid;\n\tkuid_t uid;\n\tkgid_t gid;\n\tstruct scm_fp_list *fp;\n\tu32 secid;\n\tu32 consumed;\n};\n\nstruct unix_vertex;\n\nstruct unix_sock {\n\tstruct sock sk;\n\tstruct unix_address *addr;\n\tstruct path path;\n\tstruct mutex iolock;\n\tstruct mutex bindlock;\n\tstruct sock *peer;\n\tstruct sock *listener;\n\tstruct unix_vertex *vertex;\n\tspinlock_t lock;\n\tlong: 64;\n\tlong: 64;\n\tstruct socket_wq peer_wq;\n\twait_queue_entry_t peer_wake;\n\tstruct scm_stat scm_stat;\n\tstruct sk_buff *oob_skb;\n};\n\nstruct unix_stream_read_state {\n\tint (*recv_actor)(struct sk_buff *, int, int, struct unix_stream_read_state *);\n\tstruct socket *socket;\n\tstruct msghdr *msg;\n\tstruct pipe_inode_info *pipe;\n\tsize_t size;\n\tint flags;\n\tunsigned int splice_flags;\n};\n\nstruct unix_vertex {\n\tstruct list_head edges;\n\tstruct list_head entry;\n\tstruct list_head scc_entry;\n\tlong unsigned int out_degree;\n\tlong unsigned int index;\n\tlong unsigned int scc_index;\n};\n\nstruct unixware_slice {\n\t__le16 s_label;\n\t__le16 s_flags;\n\t__le32 start_sect;\n\t__le32 nr_sects;\n};\n\nstruct unixware_vtoc {\n\t__le32 v_magic;\n\t__le32 v_version;\n\tchar v_name[8];\n\t__le16 v_nslices;\n\t__le16 v_unknown1;\n\t__le32 v_reserved[10];\n\tstruct unixware_slice v_slice[16];\n};\n\nstruct unixware_disklabel {\n\t__le32 d_type;\n\t__le32 d_magic;\n\t__le32 d_version;\n\tchar d_serial[12];\n\t__le32 d_ncylinders;\n\t__le32 d_ntracks;\n\t__le32 d_nsectors;\n\t__le32 d_secsize;\n\t__le32 d_part_start;\n\t__le32 d_unknown1[12];\n\t__le32 d_alt_tbl;\n\t__le32 d_alt_len;\n\t__le32 d_phys_cyl;\n\t__le32 d_phys_trk;\n\t__le32 d_phys_sec;\n\t__le32 d_phys_bytes;\n\t__le32 d_unknown2;\n\t__le32 d_unknown3;\n\t__le32 d_pad[8];\n\tstruct unixware_vtoc vtoc;\n};\n\nstruct unlink_vma_file_batch {\n\tint count;\n\tstruct vm_area_struct *vmas[8];\n};\n\nstruct unmap_refs_callback_data {\n\tstruct completion completion;\n\tint result;\n};\n\nstruct unmap_ring_hvm {\n\tunsigned int idx;\n\tlong unsigned int addrs[16];\n};\n\nstruct unreachable_data {\n\tstruct source_location location;\n};\n\nstruct unwind_state {\n\tstruct stack_info stack_info;\n\tlong unsigned int stack_mask;\n\tstruct task_struct *task;\n\tint graph_idx;\n\tstruct llist_node *kr_cur;\n\tbool error;\n\tbool got_irq;\n\tlong unsigned int *bp;\n\tlong unsigned int *orig_sp;\n\tlong unsigned int ip;\n\tlong unsigned int *next_bp;\n\tstruct pt_regs *regs;\n};\n\nstruct update_classid_context {\n\tu32 classid;\n\tunsigned int batch;\n};\n\nunion upper_chunk {\n\tunion upper_chunk *next;\n\tunion lower_chunk *data[256];\n};\n\nstruct uprobe {\n\tstruct rb_node rb_node;\n\trefcount_t ref;\n\tstruct rw_semaphore register_rwsem;\n\tstruct rw_semaphore consumer_rwsem;\n\tstruct list_head pending_list;\n\tstruct uprobe_consumer *consumers;\n\tstruct inode *inode;\n\tloff_t offset;\n\tloff_t ref_ctr_offset;\n\tlong unsigned int flags;\n\tstruct arch_uprobe arch;\n};\n\nstruct uprobe_cpu_buffer {\n\tstruct mutex mutex;\n\tvoid *buf;\n\tint dsize;\n};\n\nstruct uprobe_dispatch_data {\n\tstruct trace_uprobe *tu;\n\tlong unsigned int bp_addr;\n};\n\nstruct uprobe_task {\n\tenum uprobe_task_state state;\n\tunion {\n\t\tstruct {\n\t\t\tstruct arch_uprobe_task autask;\n\t\t\tlong unsigned int vaddr;\n\t\t};\n\t\tstruct {\n\t\t\tstruct callback_head dup_xol_work;\n\t\t\tlong unsigned int dup_xol_addr;\n\t\t};\n\t};\n\tstruct uprobe *active_uprobe;\n\tlong unsigned int xol_vaddr;\n\tstruct arch_uprobe *auprobe;\n\tstruct return_instance *return_instances;\n\tunsigned int depth;\n};\n\nstruct uprobe_trace_entry_head {\n\tstruct trace_entry ent;\n\tlong unsigned int vaddr[0];\n};\n\nstruct uprobe_xol_ops {\n\tbool (*emulate)(struct arch_uprobe *, struct pt_regs *);\n\tint (*pre_xol)(struct arch_uprobe *, struct pt_regs *);\n\tint (*post_xol)(struct arch_uprobe *, struct pt_regs *);\n\tvoid (*abort)(struct arch_uprobe *, struct pt_regs *);\n};\n\ntypedef void (*usb_complete_t)(struct urb *);\n\nstruct usb_iso_packet_descriptor {\n\tunsigned int offset;\n\tunsigned int length;\n\tunsigned int actual_length;\n\tint status;\n};\n\nstruct usb_anchor;\n\nstruct urb {\n\tstruct kref kref;\n\tint unlinked;\n\tvoid *hcpriv;\n\tatomic_t use_count;\n\tatomic_t reject;\n\tstruct list_head urb_list;\n\tstruct list_head anchor_list;\n\tstruct usb_anchor *anchor;\n\tstruct usb_device *dev;\n\tstruct usb_host_endpoint *ep;\n\tunsigned int pipe;\n\tunsigned int stream_id;\n\tint status;\n\tunsigned int transfer_flags;\n\tvoid *transfer_buffer;\n\tdma_addr_t transfer_dma;\n\tstruct scatterlist *sg;\n\tint num_mapped_sgs;\n\tint num_sgs;\n\tu32 transfer_buffer_length;\n\tu32 actual_length;\n\tunsigned char *setup_packet;\n\tdma_addr_t setup_dma;\n\tint start_frame;\n\tint number_of_packets;\n\tint interval;\n\tint error_count;\n\tvoid *context;\n\tusb_complete_t complete;\n\tstruct usb_iso_packet_descriptor iso_frame_desc[0];\n};\n\nstruct urb_priv {\n\tstruct list_head node;\n\tstruct urb *urb;\n\tstruct uhci_qh *qh;\n\tstruct list_head td_list;\n\tunsigned int fsbr: 1;\n};\n\nstruct xhci_segment;\n\nstruct xhci_td {\n\tstruct list_head td_list;\n\tstruct list_head cancelled_td_list;\n\tint status;\n\tenum xhci_cancelled_td_status cancel_status;\n\tstruct urb *urb;\n\tstruct xhci_segment *start_seg;\n\tunion xhci_trb *first_trb;\n\tunion xhci_trb *last_trb;\n\tstruct xhci_segment *last_trb_seg;\n\tstruct xhci_segment *bounce_seg;\n\tbool urb_length_set;\n\tbool error_mid_td;\n};\n\nstruct urb_priv___2 {\n\tint num_tds;\n\tint num_tds_done;\n\tstruct xhci_td td[0];\n};\n\nstruct urb_priv___3 {\n\tstruct ed *ed;\n\tu16 length;\n\tu16 td_cnt;\n\tstruct list_head pending;\n\tstruct td *td[0];\n};\n\ntypedef struct urb_priv___3 urb_priv_t;\n\nstruct uring_cache {\n\tstruct io_uring_sqe sqes[2];\n};\n\nstruct usb2_lpm_parameters {\n\tunsigned int besl;\n\tint timeout;\n};\n\nstruct usb3_lpm_parameters {\n\tunsigned int mel;\n\tunsigned int pel;\n\tunsigned int sel;\n\tint timeout;\n};\n\nstruct usb_anchor {\n\tstruct list_head urb_list;\n\twait_queue_head_t wait;\n\tspinlock_t lock;\n\tatomic_t suspend_wakeups;\n\tunsigned int poisoned: 1;\n};\n\nstruct usb_bos_descriptor {\n\t__u8 bLength;\n\t__u8 bDescriptorType;\n\t__le16 wTotalLength;\n\t__u8 bNumDeviceCaps;\n} __attribute__((packed));\n\nstruct mon_bus;\n\nstruct usb_bus {\n\tstruct device *controller;\n\tstruct device *sysdev;\n\tint busnum;\n\tconst char *bus_name;\n\tu8 uses_pio_for_control;\n\tu8 otg_port;\n\tunsigned int is_b_host: 1;\n\tunsigned int b_hnp_enable: 1;\n\tunsigned int no_stop_on_short: 1;\n\tunsigned int no_sg_constraint: 1;\n\tunsigned int sg_tablesize;\n\tint devnum_next;\n\tstruct mutex devnum_next_mutex;\n\tlong unsigned int devmap[2];\n\tstruct usb_device *root_hub;\n\tstruct usb_bus *hs_companion;\n\tint bandwidth_allocated;\n\tint bandwidth_int_reqs;\n\tint bandwidth_isoc_reqs;\n\tunsigned int resuming_ports;\n\tstruct mon_bus *mon_bus;\n\tint monitored;\n};\n\nstruct usb_cdc_acm_descriptor {\n\t__u8 bLength;\n\t__u8 bDescriptorType;\n\t__u8 bDescriptorSubType;\n\t__u8 bmCapabilities;\n};\n\nstruct usb_cdc_call_mgmt_descriptor {\n\t__u8 bLength;\n\t__u8 bDescriptorType;\n\t__u8 bDescriptorSubType;\n\t__u8 bmCapabilities;\n\t__u8 bDataInterface;\n};\n\nstruct usb_cdc_country_functional_desc {\n\t__u8 bLength;\n\t__u8 bDescriptorType;\n\t__u8 bDescriptorSubType;\n\t__u8 iCountryCodeRelDate;\n\t__le16 wCountyCode0;\n};\n\nstruct usb_cdc_dmm_desc {\n\t__u8 bFunctionLength;\n\t__u8 bDescriptorType;\n\t__u8 bDescriptorSubtype;\n\t__u16 bcdVersion;\n\t__le16 wMaxCommand;\n} __attribute__((packed));\n\nstruct usb_cdc_ether_desc {\n\t__u8 bLength;\n\t__u8 bDescriptorType;\n\t__u8 bDescriptorSubType;\n\t__u8 iMACAddress;\n\t__le32 bmEthernetStatistics;\n\t__le16 wMaxSegmentSize;\n\t__le16 wNumberMCFilters;\n\t__u8 bNumberPowerFilters;\n} __attribute__((packed));\n\nstruct usb_cdc_header_desc {\n\t__u8 bLength;\n\t__u8 bDescriptorType;\n\t__u8 bDescriptorSubType;\n\t__le16 bcdCDC;\n} __attribute__((packed));\n\nstruct usb_cdc_mbim_desc {\n\t__u8 bLength;\n\t__u8 bDescriptorType;\n\t__u8 bDescriptorSubType;\n\t__le16 bcdMBIMVersion;\n\t__le16 wMaxControlMessage;\n\t__u8 bNumberFilters;\n\t__u8 bMaxFilterSize;\n\t__le16 wMaxSegmentSize;\n\t__u8 bmNetworkCapabilities;\n} __attribute__((packed));\n\nstruct usb_cdc_mbim_extended_desc {\n\t__u8 bLength;\n\t__u8 bDescriptorType;\n\t__u8 bDescriptorSubType;\n\t__le16 bcdMBIMExtendedVersion;\n\t__u8 bMaxOutstandingCommandMessages;\n\t__le16 wMTU;\n} __attribute__((packed));\n\nstruct usb_cdc_mdlm_desc {\n\t__u8 bLength;\n\t__u8 bDescriptorType;\n\t__u8 bDescriptorSubType;\n\t__le16 bcdVersion;\n\t__u8 bGUID[16];\n} __attribute__((packed));\n\nstruct usb_cdc_mdlm_detail_desc {\n\t__u8 bLength;\n\t__u8 bDescriptorType;\n\t__u8 bDescriptorSubType;\n\t__u8 bGuidDescriptorType;\n\t__u8 bDetailData[0];\n};\n\nstruct usb_cdc_ncm_desc {\n\t__u8 bLength;\n\t__u8 bDescriptorType;\n\t__u8 bDescriptorSubType;\n\t__le16 bcdNcmVersion;\n\t__u8 bmNetworkCapabilities;\n} __attribute__((packed));\n\nstruct usb_cdc_network_terminal_desc {\n\t__u8 bLength;\n\t__u8 bDescriptorType;\n\t__u8 bDescriptorSubType;\n\t__u8 bEntityId;\n\t__u8 iName;\n\t__u8 bChannelIndex;\n\t__u8 bPhysicalInterface;\n};\n\nstruct usb_cdc_obex_desc {\n\t__u8 bLength;\n\t__u8 bDescriptorType;\n\t__u8 bDescriptorSubType;\n\t__le16 bcdVersion;\n} __attribute__((packed));\n\nstruct usb_cdc_union_desc;\n\nstruct usb_cdc_parsed_header {\n\tstruct usb_cdc_union_desc *usb_cdc_union_desc;\n\tstruct usb_cdc_header_desc *usb_cdc_header_desc;\n\tstruct usb_cdc_call_mgmt_descriptor *usb_cdc_call_mgmt_descriptor;\n\tstruct usb_cdc_acm_descriptor *usb_cdc_acm_descriptor;\n\tstruct usb_cdc_country_functional_desc *usb_cdc_country_functional_desc;\n\tstruct usb_cdc_network_terminal_desc *usb_cdc_network_terminal_desc;\n\tstruct usb_cdc_ether_desc *usb_cdc_ether_desc;\n\tstruct usb_cdc_dmm_desc *usb_cdc_dmm_desc;\n\tstruct usb_cdc_mdlm_desc *usb_cdc_mdlm_desc;\n\tstruct usb_cdc_mdlm_detail_desc *usb_cdc_mdlm_detail_desc;\n\tstruct usb_cdc_obex_desc *usb_cdc_obex_desc;\n\tstruct usb_cdc_ncm_desc *usb_cdc_ncm_desc;\n\tstruct usb_cdc_mbim_desc *usb_cdc_mbim_desc;\n\tstruct usb_cdc_mbim_extended_desc *usb_cdc_mbim_extended_desc;\n\tbool phonet_magic_present;\n};\n\nstruct usb_cdc_union_desc {\n\t__u8 bLength;\n\t__u8 bDescriptorType;\n\t__u8 bDescriptorSubType;\n\t__u8 bMasterInterface0;\n\t__u8 bSlaveInterface0;\n};\n\nstruct usb_charger_current {\n\tunsigned int sdp_min;\n\tunsigned int sdp_max;\n\tunsigned int dcp_min;\n\tunsigned int dcp_max;\n\tunsigned int cdp_min;\n\tunsigned int cdp_max;\n\tunsigned int aca_min;\n\tunsigned int aca_max;\n};\n\nstruct usb_class_driver {\n\tchar *name;\n\tchar * (*devnode)(const struct device *, umode_t *);\n\tconst struct file_operations *fops;\n\tint minor_base;\n};\n\nstruct usb_config_descriptor {\n\t__u8 bLength;\n\t__u8 bDescriptorType;\n\t__le16 wTotalLength;\n\t__u8 bNumInterfaces;\n\t__u8 bConfigurationValue;\n\t__u8 iConfiguration;\n\t__u8 bmAttributes;\n\t__u8 bMaxPower;\n} __attribute__((packed));\n\nstruct usb_ctrlrequest {\n\t__u8 bRequestType;\n\t__u8 bRequest;\n\t__le16 wValue;\n\t__le16 wIndex;\n\t__le16 wLength;\n};\n\nstruct usb_dcd_config_params {\n\t__u8 bU1devExitLat;\n\t__le16 bU2DevExitLat;\n\t__u8 besl_baseline;\n\t__u8 besl_deep;\n};\n\nstruct usb_debug_descriptor {\n\t__u8 bLength;\n\t__u8 bDescriptorType;\n\t__u8 bDebugInEndpoint;\n\t__u8 bDebugOutEndpoint;\n};\n\nstruct usb_descriptor_header {\n\t__u8 bLength;\n\t__u8 bDescriptorType;\n};\n\nstruct usb_dev_cap_header {\n\t__u8 bLength;\n\t__u8 bDescriptorType;\n\t__u8 bDevCapabilityType;\n};\n\nstruct usb_dev_state {\n\tstruct list_head list;\n\tstruct usb_device *dev;\n\tstruct file *file;\n\tspinlock_t lock;\n\tstruct list_head async_pending;\n\tstruct list_head async_completed;\n\tstruct list_head memory_list;\n\twait_queue_head_t wait;\n\twait_queue_head_t wait_for_resume;\n\tunsigned int discsignr;\n\tstruct pid *disc_pid;\n\tconst struct cred *cred;\n\tsigval_t disccontext;\n\tlong unsigned int ifclaimed;\n\tu32 disabled_bulk_eps;\n\tlong unsigned int interface_allowed_mask;\n\tint not_yet_resumed;\n\tbool suspend_allowed;\n\tbool privileges_dropped;\n};\n\nstruct usb_endpoint_descriptor {\n\t__u8 bLength;\n\t__u8 bDescriptorType;\n\t__u8 bEndpointAddress;\n\t__u8 bmAttributes;\n\t__le16 wMaxPacketSize;\n\t__u8 bInterval;\n\t__u8 bRefresh;\n\t__u8 bSynchAddress;\n} __attribute__((packed));\n\nstruct usb_ss_ep_comp_descriptor {\n\t__u8 bLength;\n\t__u8 bDescriptorType;\n\t__u8 bMaxBurst;\n\t__u8 bmAttributes;\n\t__le16 wBytesPerInterval;\n};\n\nstruct usb_ssp_isoc_ep_comp_descriptor {\n\t__u8 bLength;\n\t__u8 bDescriptorType;\n\t__le16 wReseved;\n\t__le32 dwBytesPerInterval;\n};\n\nstruct usb_host_endpoint {\n\tstruct usb_endpoint_descriptor desc;\n\tstruct usb_ss_ep_comp_descriptor ss_ep_comp;\n\tstruct usb_ssp_isoc_ep_comp_descriptor ssp_isoc_ep_comp;\n\tlong: 0;\n\tstruct list_head urb_list;\n\tvoid *hcpriv;\n\tstruct ep_device *ep_dev;\n\tunsigned char *extra;\n\tint extralen;\n\tint enabled;\n\tint streams;\n\tlong: 0;\n} __attribute__((packed));\n\nstruct usb_device_descriptor {\n\t__u8 bLength;\n\t__u8 bDescriptorType;\n\t__le16 bcdUSB;\n\t__u8 bDeviceClass;\n\t__u8 bDeviceSubClass;\n\t__u8 bDeviceProtocol;\n\t__u8 bMaxPacketSize0;\n\t__le16 idVendor;\n\t__le16 idProduct;\n\t__le16 bcdDevice;\n\t__u8 iManufacturer;\n\t__u8 iProduct;\n\t__u8 iSerialNumber;\n\t__u8 bNumConfigurations;\n};\n\nstruct usb_host_bos;\n\nstruct usb_host_config;\n\nstruct usb_device {\n\tint devnum;\n\tchar devpath[16];\n\tu32 route;\n\tenum usb_device_state state;\n\tenum usb_device_speed speed;\n\tunsigned int rx_lanes;\n\tunsigned int tx_lanes;\n\tenum usb_ssp_rate ssp_rate;\n\tstruct usb_tt *tt;\n\tint ttport;\n\tunsigned int toggle[2];\n\tstruct usb_device *parent;\n\tstruct usb_bus *bus;\n\tstruct usb_host_endpoint ep0;\n\tstruct device dev;\n\tstruct usb_device_descriptor descriptor;\n\tstruct usb_host_bos *bos;\n\tstruct usb_host_config *config;\n\tstruct usb_host_config *actconfig;\n\tstruct usb_host_endpoint *ep_in[16];\n\tstruct usb_host_endpoint *ep_out[16];\n\tchar **rawdescriptors;\n\tshort unsigned int bus_mA;\n\tu8 portnum;\n\tu8 level;\n\tu8 devaddr;\n\tunsigned int can_submit: 1;\n\tunsigned int persist_enabled: 1;\n\tunsigned int reset_in_progress: 1;\n\tunsigned int have_langid: 1;\n\tunsigned int authorized: 1;\n\tunsigned int authenticated: 1;\n\tunsigned int lpm_capable: 1;\n\tunsigned int lpm_devinit_allow: 1;\n\tunsigned int usb2_hw_lpm_capable: 1;\n\tunsigned int usb2_hw_lpm_besl_capable: 1;\n\tunsigned int usb2_hw_lpm_enabled: 1;\n\tunsigned int usb2_hw_lpm_allowed: 1;\n\tunsigned int usb3_lpm_u1_enabled: 1;\n\tunsigned int usb3_lpm_u2_enabled: 1;\n\tint string_langid;\n\tchar *product;\n\tchar *manufacturer;\n\tchar *serial;\n\tstruct list_head filelist;\n\tint maxchild;\n\tu32 quirks;\n\tatomic_t urbnum;\n\tlong unsigned int active_duration;\n\tlong unsigned int connect_time;\n\tunsigned int do_remote_wakeup: 1;\n\tunsigned int reset_resume: 1;\n\tunsigned int port_is_suspended: 1;\n\tint slot_id;\n\tstruct usb2_lpm_parameters l1_params;\n\tstruct usb3_lpm_parameters u1_params;\n\tstruct usb3_lpm_parameters u2_params;\n\tunsigned int lpm_disable_count;\n\tu16 hub_delay;\n\tunsigned int use_generic_driver: 1;\n};\n\nstruct usb_device_id;\n\nstruct usb_device_driver {\n\tconst char *name;\n\tbool (*match)(struct usb_device *);\n\tint (*probe)(struct usb_device *);\n\tvoid (*disconnect)(struct usb_device *);\n\tint (*suspend)(struct usb_device *, pm_message_t);\n\tint (*resume)(struct usb_device *, pm_message_t);\n\tint (*choose_configuration)(struct usb_device *);\n\tconst struct attribute_group **dev_groups;\n\tstruct device_driver driver;\n\tconst struct usb_device_id *id_table;\n\tunsigned int supports_autosuspend: 1;\n\tunsigned int generic_subclass: 1;\n};\n\nstruct usb_device_id {\n\t__u16 match_flags;\n\t__u16 idVendor;\n\t__u16 idProduct;\n\t__u16 bcdDevice_lo;\n\t__u16 bcdDevice_hi;\n\t__u8 bDeviceClass;\n\t__u8 bDeviceSubClass;\n\t__u8 bDeviceProtocol;\n\t__u8 bInterfaceClass;\n\t__u8 bInterfaceSubClass;\n\t__u8 bInterfaceProtocol;\n\t__u8 bInterfaceNumber;\n\tkernel_ulong_t driver_info;\n};\n\nstruct usb_dynids {\n\tspinlock_t lock;\n\tstruct list_head list;\n};\n\nstruct usb_interface;\n\nstruct usb_driver {\n\tconst char *name;\n\tint (*probe)(struct usb_interface *, const struct usb_device_id *);\n\tvoid (*disconnect)(struct usb_interface *);\n\tint (*unlocked_ioctl)(struct usb_interface *, unsigned int, void *);\n\tint (*suspend)(struct usb_interface *, pm_message_t);\n\tint (*resume)(struct usb_interface *);\n\tint (*reset_resume)(struct usb_interface *);\n\tint (*pre_reset)(struct usb_interface *);\n\tint (*post_reset)(struct usb_interface *);\n\tvoid (*shutdown)(struct usb_interface *);\n\tconst struct usb_device_id *id_table;\n\tconst struct attribute_group **dev_groups;\n\tstruct usb_dynids dynids;\n\tstruct device_driver driver;\n\tunsigned int no_dynamic_id: 1;\n\tunsigned int supports_autosuspend: 1;\n\tunsigned int disable_hub_initiated_lpm: 1;\n\tunsigned int soft_unbind: 1;\n};\n\nstruct usb_dynid {\n\tstruct list_head node;\n\tstruct usb_device_id id;\n};\n\nstruct usb_ehci_pdata {\n\tint caps_offset;\n\tunsigned int has_tt: 1;\n\tunsigned int has_synopsys_hc_bug: 1;\n\tunsigned int big_endian_desc: 1;\n\tunsigned int big_endian_mmio: 1;\n\tunsigned int no_io_watchdog: 1;\n\tunsigned int reset_on_resume: 1;\n\tunsigned int dma_mask_64: 1;\n\tunsigned int spurious_oc: 1;\n\tint (*power_on)(struct platform_device *);\n\tvoid (*power_off)(struct platform_device *);\n\tvoid (*power_suspend)(struct platform_device *);\n\tint (*pre_setup)(struct usb_hcd *);\n};\n\nstruct usb_ep_caps {\n\tunsigned int type_control: 1;\n\tunsigned int type_iso: 1;\n\tunsigned int type_bulk: 1;\n\tunsigned int type_int: 1;\n\tunsigned int dir_in: 1;\n\tunsigned int dir_out: 1;\n};\n\nstruct usb_ep_ops;\n\nstruct usb_ep {\n\tvoid *driver_data;\n\tconst char *name;\n\tconst struct usb_ep_ops *ops;\n\tconst struct usb_endpoint_descriptor *desc;\n\tconst struct usb_ss_ep_comp_descriptor *comp_desc;\n\tstruct list_head ep_list;\n\tstruct usb_ep_caps caps;\n\tbool claimed;\n\tbool enabled;\n\tunsigned int mult: 2;\n\tunsigned int maxburst: 5;\n\tu8 address;\n\tu16 maxpacket;\n\tu16 maxpacket_limit;\n\tu16 max_streams;\n};\n\nstruct usb_request;\n\nstruct usb_ep_ops {\n\tint (*enable)(struct usb_ep *, const struct usb_endpoint_descriptor *);\n\tint (*disable)(struct usb_ep *);\n\tvoid (*dispose)(struct usb_ep *);\n\tstruct usb_request * (*alloc_request)(struct usb_ep *, gfp_t);\n\tvoid (*free_request)(struct usb_ep *, struct usb_request *);\n\tint (*queue)(struct usb_ep *, struct usb_request *, gfp_t);\n\tint (*dequeue)(struct usb_ep *, struct usb_request *);\n\tint (*set_halt)(struct usb_ep *, int);\n\tint (*set_wedge)(struct usb_ep *);\n\tint (*fifo_status)(struct usb_ep *);\n\tvoid (*fifo_flush)(struct usb_ep *);\n};\n\nstruct usb_ext_cap_descriptor {\n\t__u8 bLength;\n\t__u8 bDescriptorType;\n\t__u8 bDevCapabilityType;\n\t__le32 bmAttributes;\n} __attribute__((packed));\n\nstruct usb_udc;\n\nstruct usb_gadget_ops;\n\nstruct usb_gadget {\n\tstruct work_struct work;\n\tstruct usb_udc *udc;\n\tconst struct usb_gadget_ops *ops;\n\tstruct usb_ep *ep0;\n\tstruct list_head ep_list;\n\tenum usb_device_speed speed;\n\tenum usb_device_speed max_speed;\n\tenum usb_ssp_rate ssp_rate;\n\tenum usb_ssp_rate max_ssp_rate;\n\tenum usb_device_state state;\n\tconst char *name;\n\tstruct device dev;\n\tunsigned int isoch_delay;\n\tunsigned int out_epnum;\n\tunsigned int in_epnum;\n\tunsigned int mA;\n\tstruct usb_otg_caps *otg_caps;\n\tunsigned int sg_supported: 1;\n\tunsigned int is_otg: 1;\n\tunsigned int is_a_peripheral: 1;\n\tunsigned int b_hnp_enable: 1;\n\tunsigned int a_hnp_support: 1;\n\tunsigned int a_alt_hnp_support: 1;\n\tunsigned int hnp_polling_support: 1;\n\tunsigned int host_request_flag: 1;\n\tunsigned int quirk_ep_out_aligned_size: 1;\n\tunsigned int quirk_altset_not_supp: 1;\n\tunsigned int quirk_stall_not_supp: 1;\n\tunsigned int quirk_zlp_not_supp: 1;\n\tunsigned int quirk_avoids_skb_reserve: 1;\n\tunsigned int is_selfpowered: 1;\n\tunsigned int deactivated: 1;\n\tunsigned int connected: 1;\n\tunsigned int lpm_capable: 1;\n\tunsigned int wakeup_capable: 1;\n\tunsigned int wakeup_armed: 1;\n\tint irq;\n\tint id_number;\n};\n\nstruct usb_gadget_driver {\n\tchar *function;\n\tenum usb_device_speed max_speed;\n\tint (*bind)(struct usb_gadget *, struct usb_gadget_driver *);\n\tvoid (*unbind)(struct usb_gadget *);\n\tint (*setup)(struct usb_gadget *, const struct usb_ctrlrequest *);\n\tvoid (*disconnect)(struct usb_gadget *);\n\tvoid (*suspend)(struct usb_gadget *);\n\tvoid (*resume)(struct usb_gadget *);\n\tvoid (*reset)(struct usb_gadget *);\n\tstruct device_driver driver;\n\tchar *udc_name;\n\tunsigned int match_existing_only: 1;\n\tbool is_bound: 1;\n};\n\nstruct usb_gadget_ops {\n\tint (*get_frame)(struct usb_gadget *);\n\tint (*wakeup)(struct usb_gadget *);\n\tint (*func_wakeup)(struct usb_gadget *, int);\n\tint (*set_remote_wakeup)(struct usb_gadget *, int);\n\tint (*set_selfpowered)(struct usb_gadget *, int);\n\tint (*vbus_session)(struct usb_gadget *, int);\n\tint (*vbus_draw)(struct usb_gadget *, unsigned int);\n\tint (*pullup)(struct usb_gadget *, int);\n\tint (*ioctl)(struct usb_gadget *, unsigned int, long unsigned int);\n\tvoid (*get_config_params)(struct usb_gadget *, struct usb_dcd_config_params *);\n\tint (*udc_start)(struct usb_gadget *, struct usb_gadget_driver *);\n\tint (*udc_stop)(struct usb_gadget *);\n\tvoid (*udc_set_speed)(struct usb_gadget *, enum usb_device_speed);\n\tvoid (*udc_set_ssp_rate)(struct usb_gadget *, enum usb_ssp_rate);\n\tvoid (*udc_async_callbacks)(struct usb_gadget *, bool);\n\tstruct usb_ep * (*match_ep)(struct usb_gadget *, struct usb_endpoint_descriptor *, struct usb_ss_ep_comp_descriptor *);\n\tint (*check_config)(struct usb_gadget *);\n};\n\nstruct usb_phy_roothub;\n\nstruct usb_hcd {\n\tstruct usb_bus self;\n\tstruct kref kref;\n\tconst char *product_desc;\n\tint speed;\n\tchar irq_descr[24];\n\tstruct timer_list rh_timer;\n\tstruct urb *status_urb;\n\tstruct work_struct wakeup_work;\n\tstruct work_struct died_work;\n\tconst struct hc_driver *driver;\n\tstruct usb_phy *usb_phy;\n\tstruct usb_phy_roothub *phy_roothub;\n\tlong unsigned int flags;\n\tenum usb_dev_authorize_policy dev_policy;\n\tunsigned int rh_registered: 1;\n\tunsigned int rh_pollable: 1;\n\tunsigned int msix_enabled: 1;\n\tunsigned int msi_enabled: 1;\n\tunsigned int skip_phy_initialization: 1;\n\tunsigned int uses_new_polling: 1;\n\tunsigned int has_tt: 1;\n\tunsigned int amd_resume_bug: 1;\n\tunsigned int can_do_streams: 1;\n\tunsigned int tpl_support: 1;\n\tunsigned int cant_recv_wakeups: 1;\n\tunsigned int irq;\n\tvoid *regs;\n\tresource_size_t rsrc_start;\n\tresource_size_t rsrc_len;\n\tunsigned int power_budget;\n\tstruct giveback_urb_bh high_prio_bh;\n\tstruct giveback_urb_bh low_prio_bh;\n\tstruct mutex *address0_mutex;\n\tstruct mutex *bandwidth_mutex;\n\tstruct usb_hcd *shared_hcd;\n\tstruct usb_hcd *primary_hcd;\n\tstruct dma_pool *pool[4];\n\tint state;\n\tstruct gen_pool *localmem_pool;\n\tlong unsigned int hcd_priv[0];\n};\n\nstruct usb_ss_cap_descriptor;\n\nstruct usb_ssp_cap_descriptor;\n\nstruct usb_ss_container_id_descriptor;\n\nstruct usb_ptm_cap_descriptor;\n\nstruct usb_host_bos {\n\tstruct usb_bos_descriptor *desc;\n\tstruct usb_ext_cap_descriptor *ext_cap;\n\tstruct usb_ss_cap_descriptor *ss_cap;\n\tstruct usb_ssp_cap_descriptor *ssp_cap;\n\tstruct usb_ss_container_id_descriptor *ss_id;\n\tstruct usb_ptm_cap_descriptor *ptm_cap;\n};\n\nstruct usb_interface_assoc_descriptor;\n\nstruct usb_interface_cache;\n\nstruct usb_host_config {\n\tstruct usb_config_descriptor desc;\n\tchar *string;\n\tstruct usb_interface_assoc_descriptor *intf_assoc[16];\n\tstruct usb_interface *interface[32];\n\tstruct usb_interface_cache *intf_cache[32];\n\tunsigned char *extra;\n\tint extralen;\n};\n\nstruct usb_interface_descriptor {\n\t__u8 bLength;\n\t__u8 bDescriptorType;\n\t__u8 bInterfaceNumber;\n\t__u8 bAlternateSetting;\n\t__u8 bNumEndpoints;\n\t__u8 bInterfaceClass;\n\t__u8 bInterfaceSubClass;\n\t__u8 bInterfaceProtocol;\n\t__u8 iInterface;\n};\n\nstruct usb_host_interface {\n\tstruct usb_interface_descriptor desc;\n\tint extralen;\n\tunsigned char *extra;\n\tstruct usb_host_endpoint *endpoint;\n\tchar *string;\n};\n\nstruct usb_hub_status {\n\t__le16 wHubStatus;\n\t__le16 wHubChange;\n};\n\nstruct usb_port_status {\n\t__le16 wPortStatus;\n\t__le16 wPortChange;\n\t__le32 dwExtPortStatus;\n};\n\nstruct usb_tt {\n\tstruct usb_device *hub;\n\tint multi;\n\tunsigned int think_time;\n\tvoid *hcpriv;\n\tspinlock_t lock;\n\tstruct list_head clear_list;\n\tstruct work_struct clear_work;\n};\n\nstruct usb_hub_descriptor;\n\nstruct usb_port;\n\nstruct usb_hub {\n\tstruct device *intfdev;\n\tstruct usb_device *hdev;\n\tstruct kref kref;\n\tstruct urb *urb;\n\tu8 (*buffer)[8];\n\tunion {\n\t\tstruct usb_hub_status hub;\n\t\tstruct usb_port_status port;\n\t} *status;\n\tstruct mutex status_mutex;\n\tint error;\n\tint nerrors;\n\tlong unsigned int event_bits[1];\n\tlong unsigned int change_bits[1];\n\tlong unsigned int removed_bits[1];\n\tlong unsigned int wakeup_bits[1];\n\tlong unsigned int power_bits[1];\n\tlong unsigned int child_usage_bits[1];\n\tlong unsigned int warm_reset_bits[1];\n\tstruct usb_hub_descriptor *descriptor;\n\tstruct usb_tt tt;\n\tunsigned int mA_per_port;\n\tunsigned int wakeup_enabled_descendants;\n\tunsigned int limited_power: 1;\n\tunsigned int quiescing: 1;\n\tunsigned int disconnected: 1;\n\tunsigned int in_reset: 1;\n\tunsigned int quirk_disable_autosuspend: 1;\n\tunsigned int quirk_check_port_auto_suspend: 1;\n\tunsigned int has_indicators: 1;\n\tu8 indicator[31];\n\tstruct delayed_work leds;\n\tstruct delayed_work init_work;\n\tstruct work_struct events;\n\tspinlock_t irq_urb_lock;\n\tstruct timer_list irq_urb_retry;\n\tstruct usb_port **ports;\n\tstruct list_head onboard_devs;\n};\n\nstruct usb_hub_descriptor {\n\t__u8 bDescLength;\n\t__u8 bDescriptorType;\n\t__u8 bNbrPorts;\n\t__le16 wHubCharacteristics;\n\t__u8 bPwrOn2PwrGood;\n\t__u8 bHubContrCurrent;\n\tunion {\n\t\tstruct {\n\t\t\t__u8 DeviceRemovable[4];\n\t\t\t__u8 PortPwrCtrlMask[4];\n\t\t} hs;\n\t\tstruct {\n\t\t\t__u8 bHubHdrDecLat;\n\t\t\t__le16 wHubDelay;\n\t\t\t__le16 DeviceRemovable;\n\t\t} __attribute__((packed)) ss;\n\t} u;\n} __attribute__((packed));\n\nstruct usb_interface {\n\tstruct usb_host_interface *altsetting;\n\tstruct usb_host_interface *cur_altsetting;\n\tunsigned int num_altsetting;\n\tstruct usb_interface_assoc_descriptor *intf_assoc;\n\tint minor;\n\tenum usb_interface_condition condition;\n\tunsigned int sysfs_files_created: 1;\n\tunsigned int ep_devs_created: 1;\n\tunsigned int unregistering: 1;\n\tunsigned int needs_remote_wakeup: 1;\n\tunsigned int needs_altsetting0: 1;\n\tunsigned int needs_binding: 1;\n\tunsigned int resetting_device: 1;\n\tunsigned int authorized: 1;\n\tenum usb_wireless_status wireless_status;\n\tstruct work_struct wireless_status_work;\n\tstruct device dev;\n\tstruct device *usb_dev;\n\tstruct work_struct reset_ws;\n};\n\nstruct usb_interface_assoc_descriptor {\n\t__u8 bLength;\n\t__u8 bDescriptorType;\n\t__u8 bFirstInterface;\n\t__u8 bInterfaceCount;\n\t__u8 bFunctionClass;\n\t__u8 bFunctionSubClass;\n\t__u8 bFunctionProtocol;\n\t__u8 iFunction;\n};\n\nstruct usb_interface_cache {\n\tunsigned int num_altsetting;\n\tstruct kref ref;\n\tstruct usb_host_interface altsetting[0];\n};\n\nstruct usb_memory {\n\tstruct list_head memlist;\n\tint vma_use_count;\n\tint urb_use_count;\n\tu32 size;\n\tvoid *mem;\n\tdma_addr_t dma_handle;\n\tlong unsigned int vm_start;\n\tstruct usb_dev_state *ps;\n};\n\nstruct usb_mon_operations {\n\tvoid (*urb_submit)(struct usb_bus *, struct urb *);\n\tvoid (*urb_submit_error)(struct usb_bus *, struct urb *, int);\n\tvoid (*urb_complete)(struct usb_bus *, struct urb *, int);\n};\n\nstruct usb_ohci_pdata {\n\tunsigned int big_endian_desc: 1;\n\tunsigned int big_endian_mmio: 1;\n\tunsigned int no_big_frame_no: 1;\n\tunsigned int num_ports;\n\tint (*power_on)(struct platform_device *);\n\tvoid (*power_off)(struct platform_device *);\n\tvoid (*power_suspend)(struct platform_device *);\n};\n\nstruct usb_otg {\n\tu8 default_a;\n\tstruct phy *phy;\n\tstruct usb_phy *usb_phy;\n\tstruct usb_bus *host;\n\tstruct usb_gadget *gadget;\n\tenum usb_otg_state state;\n\tint (*set_host)(struct usb_otg *, struct usb_bus *);\n\tint (*set_peripheral)(struct usb_otg *, struct usb_gadget *);\n\tint (*set_vbus)(struct usb_otg *, bool);\n\tint (*start_srp)(struct usb_otg *);\n\tint (*start_hnp)(struct usb_otg *);\n};\n\nstruct usb_phy_io_ops;\n\nstruct usb_phy {\n\tstruct device *dev;\n\tconst char *label;\n\tunsigned int flags;\n\tenum usb_phy_type type;\n\tenum usb_phy_events last_event;\n\tstruct usb_otg *otg;\n\tstruct device *io_dev;\n\tstruct usb_phy_io_ops *io_ops;\n\tvoid *io_priv;\n\tstruct extcon_dev *edev;\n\tstruct extcon_dev *id_edev;\n\tstruct notifier_block vbus_nb;\n\tstruct notifier_block id_nb;\n\tstruct notifier_block type_nb;\n\tenum usb_charger_type chg_type;\n\tenum usb_charger_state chg_state;\n\tstruct usb_charger_current chg_cur;\n\tstruct work_struct chg_work;\n\tstruct atomic_notifier_head notifier;\n\tu16 port_status;\n\tu16 port_change;\n\tstruct list_head head;\n\tint (*init)(struct usb_phy *);\n\tvoid (*shutdown)(struct usb_phy *);\n\tint (*set_vbus)(struct usb_phy *, int);\n\tint (*set_power)(struct usb_phy *, unsigned int);\n\tint (*set_suspend)(struct usb_phy *, int);\n\tint (*set_wakeup)(struct usb_phy *, bool);\n\tint (*notify_connect)(struct usb_phy *, enum usb_device_speed);\n\tint (*notify_disconnect)(struct usb_phy *, enum usb_device_speed);\n\tenum usb_charger_type (*charger_detect)(struct usb_phy *);\n};\n\nstruct usb_phy_io_ops {\n\tint (*read)(struct usb_phy *, u32);\n\tint (*write)(struct usb_phy *, u32, u32);\n};\n\nstruct usb_phy_roothub {\n\tstruct phy *phy;\n\tstruct list_head list;\n};\n\nstruct usb_port {\n\tstruct usb_device *child;\n\tstruct device dev;\n\tstruct usb_dev_state *port_owner;\n\tstruct usb_port *peer;\n\tstruct typec_connector *connector;\n\tstruct dev_pm_qos_request *req;\n\tenum usb_port_connect_type connect_type;\n\tenum usb_device_state state;\n\tstruct kernfs_node *state_kn;\n\tusb_port_location_t location;\n\tstruct mutex status_lock;\n\tu32 over_current_count;\n\tu8 portnum;\n\tu32 quirks;\n\tunsigned int early_stop: 1;\n\tunsigned int ignore_event: 1;\n\tunsigned int is_superspeed: 1;\n\tunsigned int usb3_lpm_u1_permit: 1;\n\tunsigned int usb3_lpm_u2_permit: 1;\n};\n\nstruct usb_ptm_cap_descriptor {\n\t__u8 bLength;\n\t__u8 bDescriptorType;\n\t__u8 bDevCapabilityType;\n};\n\nstruct usb_qualifier_descriptor {\n\t__u8 bLength;\n\t__u8 bDescriptorType;\n\t__le16 bcdUSB;\n\t__u8 bDeviceClass;\n\t__u8 bDeviceSubClass;\n\t__u8 bDeviceProtocol;\n\t__u8 bMaxPacketSize0;\n\t__u8 bNumConfigurations;\n\t__u8 bRESERVED;\n};\n\nstruct usb_request {\n\tvoid *buf;\n\tunsigned int length;\n\tdma_addr_t dma;\n\tstruct scatterlist *sg;\n\tunsigned int num_sgs;\n\tunsigned int num_mapped_sgs;\n\tunsigned int stream_id: 16;\n\tunsigned int is_last: 1;\n\tunsigned int no_interrupt: 1;\n\tunsigned int zero: 1;\n\tunsigned int short_not_ok: 1;\n\tunsigned int dma_mapped: 1;\n\tunsigned int sg_was_mapped: 1;\n\tvoid (*complete)(struct usb_ep *, struct usb_request *);\n\tvoid *context;\n\tstruct list_head list;\n\tunsigned int frame_number;\n\tint status;\n\tunsigned int actual;\n};\n\ntypedef int (*usb_role_switch_set_t)(struct usb_role_switch *, enum usb_role);\n\ntypedef enum usb_role (*usb_role_switch_get_t)(struct usb_role_switch *);\n\nstruct usb_role_switch {\n\tstruct device dev;\n\tstruct mutex lock;\n\tstruct module *module;\n\tenum usb_role role;\n\tbool registered;\n\tstruct device *usb2_port;\n\tstruct device *usb3_port;\n\tstruct device *udc;\n\tusb_role_switch_set_t set;\n\tusb_role_switch_get_t get;\n\tbool allow_userspace_control;\n};\n\nstruct usb_role_switch_desc {\n\tstruct fwnode_handle *fwnode;\n\tstruct device *usb2_port;\n\tstruct device *usb3_port;\n\tstruct device *udc;\n\tusb_role_switch_set_t set;\n\tusb_role_switch_get_t get;\n\tbool allow_userspace_control;\n\tvoid *driver_data;\n\tconst char *name;\n};\n\nstruct usb_set_sel_req {\n\t__u8 u1_sel;\n\t__u8 u1_pel;\n\t__le16 u2_sel;\n\t__le16 u2_pel;\n};\n\nstruct usb_sg_request {\n\tint status;\n\tsize_t bytes;\n\tspinlock_t lock;\n\tstruct usb_device *dev;\n\tint pipe;\n\tint entries;\n\tstruct urb **urbs;\n\tint count;\n\tstruct completion complete;\n};\n\nstruct usb_ss_cap_descriptor {\n\t__u8 bLength;\n\t__u8 bDescriptorType;\n\t__u8 bDevCapabilityType;\n\t__u8 bmAttributes;\n\t__le16 wSpeedSupported;\n\t__u8 bFunctionalitySupport;\n\t__u8 bU1devExitLat;\n\t__le16 bU2DevExitLat;\n};\n\nstruct usb_ss_container_id_descriptor {\n\t__u8 bLength;\n\t__u8 bDescriptorType;\n\t__u8 bDevCapabilityType;\n\t__u8 bReserved;\n\t__u8 ContainerID[16];\n};\n\nstruct usb_ssp_cap_descriptor {\n\t__u8 bLength;\n\t__u8 bDescriptorType;\n\t__u8 bDevCapabilityType;\n\t__u8 bReserved;\n\t__le32 bmAttributes;\n\t__le16 wFunctionalitySupport;\n\t__le16 wReserved;\n\tunion {\n\t\t__le32 legacy_padding;\n\t\tstruct {\n\t\t\tstruct {} __empty_bmSublinkSpeedAttr;\n\t\t\t__le32 bmSublinkSpeedAttr[0];\n\t\t};\n\t};\n};\n\nstruct usb_string_descriptor {\n\t__u8 bLength;\n\t__u8 bDescriptorType;\n\tunion {\n\t\t__le16 legacy_padding;\n\t\tstruct {\n\t\t\tstruct {} __empty_wData;\n\t\t\t__le16 wData[0];\n\t\t};\n\t};\n};\n\nstruct usb_tt_clear {\n\tstruct list_head clear_list;\n\tunsigned int tt;\n\tu16 devinfo;\n\tstruct usb_hcd *hcd;\n\tstruct usb_host_endpoint *ep;\n};\n\nstruct usbdevfs_bulktransfer {\n\tunsigned int ep;\n\tunsigned int len;\n\tunsigned int timeout;\n\tvoid *data;\n};\n\nstruct usbdevfs_bulktransfer32 {\n\tcompat_uint_t ep;\n\tcompat_uint_t len;\n\tcompat_uint_t timeout;\n\tcompat_caddr_t data;\n};\n\nstruct usbdevfs_connectinfo {\n\tunsigned int devnum;\n\tunsigned char slow;\n};\n\nstruct usbdevfs_conninfo_ex {\n\t__u32 size;\n\t__u32 busnum;\n\t__u32 devnum;\n\t__u32 speed;\n\t__u8 num_ports;\n\t__u8 ports[7];\n};\n\nstruct usbdevfs_ctrltransfer {\n\t__u8 bRequestType;\n\t__u8 bRequest;\n\t__u16 wValue;\n\t__u16 wIndex;\n\t__u16 wLength;\n\t__u32 timeout;\n\tvoid *data;\n};\n\nstruct usbdevfs_ctrltransfer32 {\n\tu8 bRequestType;\n\tu8 bRequest;\n\tu16 wValue;\n\tu16 wIndex;\n\tu16 wLength;\n\tu32 timeout;\n\tcompat_caddr_t data;\n};\n\nstruct usbdevfs_disconnect_claim {\n\tunsigned int interface;\n\tunsigned int flags;\n\tchar driver[256];\n};\n\nstruct usbdevfs_disconnectsignal {\n\tunsigned int signr;\n\tvoid *context;\n};\n\nstruct usbdevfs_disconnectsignal32 {\n\tcompat_int_t signr;\n\tcompat_caddr_t context;\n};\n\nstruct usbdevfs_getdriver {\n\tunsigned int interface;\n\tchar driver[256];\n};\n\nstruct usbdevfs_hub_portinfo {\n\tchar nports;\n\tchar port[127];\n};\n\nstruct usbdevfs_ioctl {\n\tint ifno;\n\tint ioctl_code;\n\tvoid *data;\n};\n\nstruct usbdevfs_ioctl32 {\n\ts32 ifno;\n\ts32 ioctl_code;\n\tcompat_caddr_t data;\n};\n\nstruct usbdevfs_iso_packet_desc {\n\tunsigned int length;\n\tunsigned int actual_length;\n\tunsigned int status;\n};\n\nstruct usbdevfs_setinterface {\n\tunsigned int interface;\n\tunsigned int altsetting;\n};\n\nstruct usbdevfs_streams {\n\tunsigned int num_streams;\n\tunsigned int num_eps;\n\tunsigned char eps[0];\n};\n\nstruct usbdevfs_urb {\n\tunsigned char type;\n\tunsigned char endpoint;\n\tint status;\n\tunsigned int flags;\n\tvoid *buffer;\n\tint buffer_length;\n\tint actual_length;\n\tint start_frame;\n\tunion {\n\t\tint number_of_packets;\n\t\tunsigned int stream_id;\n\t};\n\tint error_count;\n\tunsigned int signr;\n\tvoid *usercontext;\n\tstruct usbdevfs_iso_packet_desc iso_frame_desc[0];\n};\n\nstruct usbdevfs_urb32 {\n\tunsigned char type;\n\tunsigned char endpoint;\n\tcompat_int_t status;\n\tcompat_uint_t flags;\n\tcompat_caddr_t buffer;\n\tcompat_int_t buffer_length;\n\tcompat_int_t actual_length;\n\tcompat_int_t start_frame;\n\tcompat_int_t number_of_packets;\n\tcompat_int_t error_count;\n\tcompat_uint_t signr;\n\tcompat_caddr_t usercontext;\n\tstruct usbdevfs_iso_packet_desc iso_frame_desc[0];\n};\n\nstruct used_address {\n\tstruct __kernel_sockaddr_storage name;\n\tunsigned int name_len;\n};\n\nstruct user_arg_ptr {\n\tbool is_compat;\n\tunion {\n\t\tconst char * const *native;\n\t\tconst compat_uptr_t *compat;\n\t} ptr;\n};\n\nstruct user_datum {\n\tu32 value;\n\tu32 bounds;\n\tstruct ebitmap roles;\n\tstruct mls_range range;\n\tstruct mls_level dfltlevel;\n};\n\nstruct user_desc {\n\tunsigned int entry_number;\n\tunsigned int base_addr;\n\tunsigned int limit;\n\tunsigned int seg_32bit: 1;\n\tunsigned int contents: 2;\n\tunsigned int read_exec_only: 1;\n\tunsigned int limit_in_pages: 1;\n\tunsigned int seg_not_present: 1;\n\tunsigned int useable: 1;\n\tunsigned int lm: 1;\n};\n\nstruct user_event_group;\n\nstruct user_event {\n\tstruct user_event_group *group;\n\tchar *reg_name;\n\tstruct tracepoint tracepoint;\n\tstruct trace_event_call call;\n\tstruct trace_event_class class;\n\tstruct dyn_event devent;\n\tstruct hlist_node node;\n\tstruct list_head fields;\n\tstruct list_head validators;\n\tstruct work_struct put_work;\n\trefcount_t refcnt;\n\tint min_size;\n\tint reg_flags;\n\tchar status;\n};\n\nstruct user_event_enabler {\n\tstruct list_head mm_enablers_link;\n\tstruct user_event *event;\n\tlong unsigned int addr;\n\tlong unsigned int values;\n};\n\nstruct user_event_enabler_fault {\n\tstruct work_struct work;\n\tstruct user_event_mm *mm;\n\tstruct user_event_enabler *enabler;\n\tint attempt;\n};\n\nstruct user_event_refs;\n\nstruct user_event_file_info {\n\tstruct user_event_group *group;\n\tstruct user_event_refs *refs;\n};\n\nstruct user_event_group {\n\tchar *system_name;\n\tchar *system_multi_name;\n\tstruct hlist_node node;\n\tstruct mutex reg_mutex;\n\tstruct hlist_head register_table[256];\n\tu64 multi_id;\n};\n\nstruct user_event_mm {\n\tstruct list_head mms_link;\n\tstruct list_head enablers;\n\tstruct mm_struct *mm;\n\tstruct user_event_mm *next;\n\trefcount_t refcnt;\n\trefcount_t tasks;\n\tstruct rcu_work put_rwork;\n};\n\nstruct user_event_refs {\n\tstruct callback_head rcu;\n\tint count;\n\tstruct user_event *events[0];\n};\n\nstruct user_event_validator {\n\tstruct list_head user_event_link;\n\tint offset;\n\tint flags;\n};\n\nstruct user_i387_ia32_struct {\n\tu32 cwd;\n\tu32 swd;\n\tu32 twd;\n\tu32 fip;\n\tu32 fcs;\n\tu32 foo;\n\tu32 fos;\n\tu32 st_space[20];\n};\n\nstruct user_key_payload {\n\tstruct callback_head rcu;\n\tshort unsigned int datalen;\n\tlong: 0;\n\tchar data[0];\n};\n\nstruct user_namespace {\n\tstruct uid_gid_map uid_map;\n\tstruct uid_gid_map gid_map;\n\tstruct uid_gid_map projid_map;\n\tstruct user_namespace *parent;\n\tint level;\n\tkuid_t owner;\n\tkgid_t group;\n\tstruct ns_common ns;\n\tlong unsigned int flags;\n\tbool parent_could_setfcap;\n\tstruct list_head keyring_name_list;\n\tstruct key *user_keyring_register;\n\tstruct rw_semaphore keyring_sem;\n\tstruct key *persistent_keyring_register;\n\tstruct work_struct work;\n\tstruct ctl_table_set set;\n\tstruct ctl_table_header *sysctls;\n\tstruct ucounts *ucounts;\n\tlong int ucount_max[12];\n\tlong int rlimit_max[4];\n\tstruct binfmt_misc *binfmt_misc;\n};\n\nstruct user_reg {\n\t__u32 size;\n\t__u8 enable_bit;\n\t__u8 enable_size;\n\t__u16 flags;\n\t__u64 enable_addr;\n\t__u64 name_args;\n\t__u32 write_index;\n} __attribute__((packed));\n\nstruct user_regset;\n\ntypedef int user_regset_get2_fn(struct task_struct *, const struct user_regset *, struct membuf);\n\ntypedef int user_regset_set_fn(struct task_struct *, const struct user_regset *, unsigned int, unsigned int, const void *, const void *);\n\ntypedef int user_regset_active_fn(struct task_struct *, const struct user_regset *);\n\ntypedef int user_regset_writeback_fn(struct task_struct *, const struct user_regset *, int);\n\nstruct user_regset {\n\tuser_regset_get2_fn *regset_get;\n\tuser_regset_set_fn *set;\n\tuser_regset_active_fn *active;\n\tuser_regset_writeback_fn *writeback;\n\tunsigned int n;\n\tunsigned int size;\n\tunsigned int align;\n\tunsigned int bias;\n\tunsigned int core_note_type;\n};\n\nstruct user_regset_view {\n\tconst char *name;\n\tconst struct user_regset *regsets;\n\tunsigned int n;\n\tu32 e_flags;\n\tu16 e_machine;\n\tu8 ei_osabi;\n};\n\nstruct user_return_notifier {\n\tvoid (*on_user_return)(struct user_return_notifier *);\n\tstruct hlist_node link;\n};\n\nstruct user_struct {\n\trefcount_t __count;\n\tstruct percpu_counter epoll_watches;\n\tlong unsigned int unix_inflight;\n\tatomic_long_t pipe_bufs;\n\tstruct hlist_node uidhash_node;\n\tkuid_t uid;\n\tatomic_long_t locked_vm;\n\tatomic_t nr_watches;\n\tstruct ratelimit_state ratelimit;\n};\n\nstruct user_syms {\n\tconst char **syms;\n\tchar *buf;\n};\n\nstruct user_unreg {\n\t__u32 size;\n\t__u8 disable_bit;\n\t__u8 __reserved;\n\t__u16 __reserved2;\n\t__u64 disable_addr;\n};\n\nstruct userfaultfd_ctx {\n\twait_queue_head_t fault_pending_wqh;\n\twait_queue_head_t fault_wqh;\n\twait_queue_head_t fd_wqh;\n\twait_queue_head_t event_wqh;\n\tseqcount_spinlock_t refile_seq;\n\trefcount_t refcount;\n\tunsigned int flags;\n\tunsigned int features;\n\tbool released;\n\tstruct rw_semaphore map_changing_lock;\n\tatomic_t mmap_changing;\n\tstruct mm_struct *mm;\n};\n\nstruct userfaultfd_fork_ctx {\n\tstruct userfaultfd_ctx *orig;\n\tstruct userfaultfd_ctx *new;\n\tstruct list_head list;\n};\n\nstruct userfaultfd_unmap_ctx {\n\tstruct userfaultfd_ctx *ctx;\n\tlong unsigned int start;\n\tlong unsigned int end;\n\tstruct list_head list;\n};\n\nstruct userfaultfd_wait_queue {\n\tstruct uffd_msg msg;\n\twait_queue_entry_t wq;\n\tstruct userfaultfd_ctx *ctx;\n\tbool waken;\n};\n\nstruct userfaultfd_wake_range {\n\tlong unsigned int start;\n\tlong unsigned int len;\n};\n\nstruct userspace_data {\n\tlong unsigned int user_frequency;\n\tbool valid;\n};\n\nstruct userspace_policy {\n\tunsigned int is_managed;\n\tunsigned int setspeed;\n\tstruct mutex mutex;\n};\n\nstruct userstack_entry {\n\tstruct trace_entry ent;\n\tunsigned int tgid;\n\tlong unsigned int caller[8];\n};\n\nstruct ustat {\n\t__kernel_daddr_t f_tfree;\n\tlong unsigned int f_tinode;\n\tchar f_fname[6];\n\tchar f_fpack[6];\n};\n\nstruct ustring_buffer {\n\tchar buffer[1024];\n};\n\nstruct utf8_table {\n\tint cmask;\n\tint cval;\n\tint shift;\n\tlong int lmask;\n\tlong int lval;\n};\n\nstruct utf8cursor {\n\tconst struct unicode_map *um;\n\tenum utf8_normalization n;\n\tconst char *s;\n\tconst char *p;\n\tconst char *ss;\n\tconst char *sp;\n\tunsigned int len;\n\tunsigned int slen;\n\tshort int ccc;\n\tshort int nccc;\n\tunsigned char hangul[12];\n};\n\nstruct utf8data {\n\tunsigned int maxage;\n\tunsigned int offset;\n};\n\nstruct utf8data_table {\n\tconst unsigned int *utf8agetab;\n\tint utf8agetab_size;\n\tconst struct utf8data *utf8nfdicfdata;\n\tint utf8nfdicfdata_size;\n\tconst struct utf8data *utf8nfdidata;\n\tint utf8nfdidata_size;\n\tconst unsigned char *utf8data;\n};\n\nstruct utimbuf {\n\t__kernel_old_time_t actime;\n\t__kernel_old_time_t modtime;\n};\n\nstruct uts_namespace {\n\tstruct new_utsname name;\n\tstruct user_namespace *user_ns;\n\tstruct ucounts *ucounts;\n\tstruct ns_common ns;\n};\n\nunion uu {\n\tshort unsigned int us;\n\tunsigned char b[2];\n};\n\nstruct uuidcmp {\n\tconst char *uuid;\n\tint len;\n};\n\nstruct uv2h_gr0_gam_gr_config_s {\n\tlong unsigned int n_gr: 4;\n\tlong unsigned int reserved: 60;\n};\n\nstruct uv2h_node_id_s {\n\tlong unsigned int force1: 1;\n\tlong unsigned int manufacturer: 11;\n\tlong unsigned int part_number: 16;\n\tlong unsigned int revision: 4;\n\tlong unsigned int node_id: 15;\n\tlong unsigned int rsvd_47_49: 3;\n\tlong unsigned int nodes_per_bit: 7;\n\tlong unsigned int ni_port: 5;\n\tlong unsigned int rsvd_62_63: 2;\n};\n\nstruct uv2h_rh_gam_addr_map_config_s {\n\tlong unsigned int m_skt: 6;\n\tlong unsigned int n_skt: 4;\n\tlong unsigned int rsvd_10_63: 54;\n};\n\nstruct uv2h_rh_gam_alias_2_overlay_config_s {\n\tlong unsigned int rsvd_0_23: 24;\n\tlong unsigned int base: 8;\n\tlong unsigned int rsvd_32_47: 16;\n\tlong unsigned int m_alias: 5;\n\tlong unsigned int rsvd_53_62: 10;\n\tlong unsigned int enable: 1;\n};\n\nstruct uv2h_rh_gam_alias_2_redirect_config_s {\n\tlong unsigned int rsvd_0_23: 24;\n\tlong unsigned int dest_base: 22;\n\tlong unsigned int rsvd_46_63: 18;\n};\n\nstruct uv2h_rh_gam_gru_overlay_config_s {\n\tlong unsigned int rsvd_0_27: 28;\n\tlong unsigned int base: 18;\n\tlong unsigned int rsvd_46_51: 6;\n\tlong unsigned int n_gru: 4;\n\tlong unsigned int rsvd_56_62: 7;\n\tlong unsigned int enable: 1;\n};\n\nstruct uv2h_rh_gam_mmioh_overlay_config_s {\n\tlong unsigned int rsvd_0_26: 27;\n\tlong unsigned int base: 19;\n\tlong unsigned int m_io: 6;\n\tlong unsigned int n_io: 4;\n\tlong unsigned int rsvd_56_62: 7;\n\tlong unsigned int enable: 1;\n};\n\nstruct uv2h_rh_gam_mmr_overlay_config_s {\n\tlong unsigned int rsvd_0_25: 26;\n\tlong unsigned int base: 20;\n\tlong unsigned int rsvd_46_62: 17;\n\tlong unsigned int enable: 1;\n};\n\nstruct uv3h_gr0_gam_gr_config_s {\n\tlong unsigned int m_skt: 6;\n\tlong unsigned int undef_6_9: 4;\n\tlong unsigned int subspace: 1;\n\tlong unsigned int reserved: 53;\n};\n\nstruct uv3h_node_id_s {\n\tlong unsigned int force1: 1;\n\tlong unsigned int manufacturer: 11;\n\tlong unsigned int part_number: 16;\n\tlong unsigned int revision: 4;\n\tlong unsigned int node_id: 15;\n\tlong unsigned int rsvd_47: 1;\n\tlong unsigned int router_select: 1;\n\tlong unsigned int rsvd_49: 1;\n\tlong unsigned int nodes_per_bit: 7;\n\tlong unsigned int ni_port: 5;\n\tlong unsigned int rsvd_62_63: 2;\n};\n\nstruct uv3h_rh_gam_addr_map_config_s {\n\tlong unsigned int m_skt: 6;\n\tlong unsigned int n_skt: 4;\n\tlong unsigned int rsvd_10_63: 54;\n};\n\nstruct uv3h_rh_gam_alias_2_overlay_config_s {\n\tlong unsigned int rsvd_0_23: 24;\n\tlong unsigned int base: 8;\n\tlong unsigned int rsvd_32_47: 16;\n\tlong unsigned int m_alias: 5;\n\tlong unsigned int rsvd_53_62: 10;\n\tlong unsigned int enable: 1;\n};\n\nstruct uv3h_rh_gam_alias_2_redirect_config_s {\n\tlong unsigned int rsvd_0_23: 24;\n\tlong unsigned int dest_base: 22;\n\tlong unsigned int rsvd_46_63: 18;\n};\n\nstruct uv3h_rh_gam_gru_overlay_config_s {\n\tlong unsigned int rsvd_0_27: 28;\n\tlong unsigned int base: 18;\n\tlong unsigned int rsvd_46_51: 6;\n\tlong unsigned int n_gru: 4;\n\tlong unsigned int rsvd_56_61: 6;\n\tlong unsigned int mode: 1;\n\tlong unsigned int enable: 1;\n};\n\nstruct uv3h_rh_gam_mmioh_overlay_config0_s {\n\tlong unsigned int rsvd_0_25: 26;\n\tlong unsigned int base: 20;\n\tlong unsigned int m_io: 6;\n\tlong unsigned int n_io: 4;\n\tlong unsigned int rsvd_56_62: 7;\n\tlong unsigned int enable: 1;\n};\n\nstruct uv3h_rh_gam_mmioh_overlay_config1_s {\n\tlong unsigned int rsvd_0_25: 26;\n\tlong unsigned int base: 20;\n\tlong unsigned int m_io: 6;\n\tlong unsigned int n_io: 4;\n\tlong unsigned int rsvd_56_62: 7;\n\tlong unsigned int enable: 1;\n};\n\nstruct uv3h_rh_gam_mmr_overlay_config_s {\n\tlong unsigned int rsvd_0_25: 26;\n\tlong unsigned int base: 20;\n\tlong unsigned int rsvd_46_62: 17;\n\tlong unsigned int enable: 1;\n};\n\nstruct uv4ah_rh_gam_gru_overlay_config_s {\n\tlong unsigned int rsvd_0_24: 25;\n\tlong unsigned int undef_25: 1;\n\tlong unsigned int base: 26;\n\tlong unsigned int n_gru: 4;\n\tlong unsigned int rsvd_56_62: 7;\n\tlong unsigned int enable: 1;\n};\n\nstruct uv4ah_rh_gam_mmioh_overlay_config0_mmr_s {\n\tlong unsigned int rsvd_0_25: 26;\n\tlong unsigned int base: 26;\n\tlong unsigned int m_io: 6;\n\tlong unsigned int n_io: 4;\n\tlong unsigned int undef_62: 1;\n\tlong unsigned int enable: 1;\n};\n\nstruct uv4ah_rh_gam_mmioh_overlay_config1_mmr_s {\n\tlong unsigned int rsvd_0_25: 26;\n\tlong unsigned int base: 26;\n\tlong unsigned int m_io: 6;\n\tlong unsigned int n_io: 4;\n\tlong unsigned int undef_62: 1;\n\tlong unsigned int enable: 1;\n};\n\nstruct uv4h_gr0_gam_gr_config_s {\n\tlong unsigned int rsvd_0_9: 10;\n\tlong unsigned int subspace: 1;\n\tlong unsigned int rsvd_11_63: 53;\n};\n\nstruct uv4h_node_id_s {\n\tlong unsigned int force1: 1;\n\tlong unsigned int manufacturer: 11;\n\tlong unsigned int part_number: 16;\n\tlong unsigned int revision: 4;\n\tlong unsigned int node_id: 15;\n\tlong unsigned int rsvd_47: 1;\n\tlong unsigned int router_select: 1;\n\tlong unsigned int rsvd_49: 1;\n\tlong unsigned int nodes_per_bit: 7;\n\tlong unsigned int ni_port: 5;\n\tlong unsigned int rsvd_62_63: 2;\n};\n\nstruct uv4h_rh_gam_addr_map_config_s {\n\tlong unsigned int rsvd_0_5: 6;\n\tlong unsigned int n_skt: 4;\n\tlong unsigned int rsvd_10_63: 54;\n};\n\nstruct uv4h_rh_gam_alias_2_overlay_config_s {\n\tlong unsigned int rsvd_0_23: 24;\n\tlong unsigned int base: 8;\n\tlong unsigned int rsvd_32_47: 16;\n\tlong unsigned int m_alias: 5;\n\tlong unsigned int rsvd_53_62: 10;\n\tlong unsigned int enable: 1;\n};\n\nstruct uv4h_rh_gam_alias_2_redirect_config_s {\n\tlong unsigned int rsvd_0_23: 24;\n\tlong unsigned int dest_base: 22;\n\tlong unsigned int rsvd_46_63: 18;\n};\n\nstruct uv4h_rh_gam_gru_overlay_config_s {\n\tlong unsigned int rsvd_0_24: 25;\n\tlong unsigned int undef_25: 1;\n\tlong unsigned int base: 20;\n\tlong unsigned int rsvd_46_51: 6;\n\tlong unsigned int n_gru: 4;\n\tlong unsigned int rsvd_56_62: 7;\n\tlong unsigned int enable: 1;\n};\n\nstruct uv4h_rh_gam_mmioh_overlay_config0_s {\n\tlong unsigned int rsvd_0_25: 26;\n\tlong unsigned int base: 20;\n\tlong unsigned int m_io: 6;\n\tlong unsigned int n_io: 4;\n\tlong unsigned int rsvd_56_62: 7;\n\tlong unsigned int enable: 1;\n};\n\nstruct uv4h_rh_gam_mmioh_overlay_config1_s {\n\tlong unsigned int rsvd_0_25: 26;\n\tlong unsigned int base: 20;\n\tlong unsigned int m_io: 6;\n\tlong unsigned int n_io: 4;\n\tlong unsigned int rsvd_56_62: 7;\n\tlong unsigned int enable: 1;\n};\n\nstruct uv4h_rh_gam_mmr_overlay_config_s {\n\tlong unsigned int rsvd_0_25: 26;\n\tlong unsigned int base: 20;\n\tlong unsigned int rsvd_46_62: 17;\n\tlong unsigned int enable: 1;\n};\n\nstruct uv5h_gr0_gam_gr_config_s {\n\tlong unsigned int rsvd_0_9: 10;\n\tlong unsigned int subspace: 1;\n\tlong unsigned int rsvd_11_63: 53;\n};\n\nstruct uv5h_node_id_s {\n\tlong unsigned int force1: 1;\n\tlong unsigned int manufacturer: 11;\n\tlong unsigned int part_number: 16;\n\tlong unsigned int revision: 4;\n\tlong unsigned int node_id: 7;\n\tlong unsigned int rsvd_39_56: 18;\n\tlong unsigned int ni_port: 6;\n\tlong unsigned int rsvd_63: 1;\n};\n\nstruct uv5h_rh10_gam_addr_map_config_s {\n\tlong unsigned int undef_0_5: 6;\n\tlong unsigned int n_skt: 3;\n\tlong unsigned int undef_9_11: 3;\n\tlong unsigned int ls_enable: 1;\n\tlong unsigned int undef_13_15: 3;\n\tlong unsigned int mk_tme_keyid_bits: 4;\n};\n\nstruct uv5h_rh10_gam_mmioh_overlay_config0_s {\n\tlong unsigned int rsvd_0_25: 26;\n\tlong unsigned int base: 26;\n\tlong unsigned int m_io: 6;\n\tlong unsigned int n_io: 4;\n\tlong unsigned int undef_62: 1;\n\tlong unsigned int enable: 1;\n};\n\nstruct uv5h_rh10_gam_mmioh_overlay_config1_s {\n\tlong unsigned int rsvd_0_25: 26;\n\tlong unsigned int base: 26;\n\tlong unsigned int m_io: 6;\n\tlong unsigned int n_io: 4;\n\tlong unsigned int undef_62: 1;\n\tlong unsigned int enable: 1;\n};\n\nstruct uv5h_rh10_gam_mmr_overlay_config_s {\n\tlong unsigned int undef_0_24: 25;\n\tlong unsigned int base: 27;\n\tlong unsigned int undef_52_62: 11;\n\tlong unsigned int enable: 1;\n};\n\nstruct uv_IO_APIC_route_entry {\n\t__u64 vector: 8;\n\t__u64 delivery_mode: 3;\n\t__u64 dest_mode: 1;\n\t__u64 delivery_status: 1;\n\t__u64 polarity: 1;\n\t__u64 __reserved_1: 1;\n\t__u64 trigger: 1;\n\t__u64 mask: 1;\n\t__u64 __reserved_2: 15;\n\t__u64 dest: 32;\n};\n\nstruct uv_arch_type_entry {\n\tchar archtype[8];\n};\n\nstruct uv_cpu_info_s {\n\tvoid *p_uv_hub_info;\n\tunsigned char blade_cpu_id;\n\tvoid *reserved;\n};\n\nstruct uv_hub_nmi_s;\n\nstruct uv_cpu_nmi_s {\n\tstruct uv_hub_nmi_s *hub;\n\tint state;\n\tint pinging;\n\tint queries;\n\tint pings;\n};\n\nstruct uv_gam_parameters {\n\tu64 mmr_base;\n\tu64 gru_base;\n\tu8 mmr_shift;\n\tu8 gru_shift;\n\tu8 gpa_shift;\n\tu8 unused1;\n};\n\nstruct uv_gam_range_entry {\n\tchar type;\n\tchar unused1;\n\tu16 nasid;\n\tu16 sockid;\n\tu16 pnode;\n\tu32 unused2;\n\tu32 limit;\n};\n\nstruct uv_gam_range_s {\n\tu32 limit;\n\tu16 nasid;\n\ts8 base;\n\tu8 reserved;\n};\n\nstruct uv_hub_info_s {\n\tunsigned int hub_type;\n\tunsigned char hub_revision;\n\tlong unsigned int global_mmr_base;\n\tlong unsigned int global_mmr_shift;\n\tlong unsigned int gpa_mask;\n\tshort unsigned int *socket_to_node;\n\tshort unsigned int *socket_to_pnode;\n\tshort unsigned int *pnode_to_socket;\n\tstruct uv_gam_range_s *gr_table;\n\tshort unsigned int min_socket;\n\tshort unsigned int min_pnode;\n\tunsigned char m_val;\n\tunsigned char n_val;\n\tunsigned char gr_table_len;\n\tunsigned char apic_pnode_shift;\n\tunsigned char gpa_shift;\n\tunsigned char nasid_shift;\n\tunsigned char m_shift;\n\tunsigned char n_lshift;\n\tunsigned int gnode_extra;\n\tlong unsigned int gnode_upper;\n\tlong unsigned int lowmem_remap_top;\n\tlong unsigned int lowmem_remap_base;\n\tlong unsigned int global_gru_base;\n\tlong unsigned int global_gru_shift;\n\tshort unsigned int pnode;\n\tshort unsigned int pnode_mask;\n\tshort unsigned int coherency_domain_number;\n\tshort unsigned int numa_blade_id;\n\tshort unsigned int nr_possible_cpus;\n\tshort unsigned int nr_online_cpus;\n\tshort int memory_nid;\n\tshort unsigned int *node_to_socket;\n};\n\nstruct uv_hub_nmi_s {\n\traw_spinlock_t nmi_lock;\n\tatomic_t in_nmi;\n\tatomic_t cpu_owner;\n\tatomic_t read_mmr_count;\n\tatomic_t nmi_count;\n\tlong unsigned int nmi_value;\n\tbool hub_present;\n\tbool pch_owner;\n};\n\nstruct uv_irq_2_mmr_pnode {\n\tlong unsigned int offset;\n\tint pnode;\n};\n\nstruct uv_rtc_timer_head {\n\tspinlock_t lock;\n\tint next_cpu;\n\tint ncpus;\n\tstruct {\n\t\tint lcpu;\n\t\tu64 expires;\n\t} cpu[0];\n};\n\nstruct uv_systab {\n\tchar signature[4];\n\tu32 revision;\n\tu64 (*function)(enum uv_bios_cmd, ...);\n\tu32 size;\n\tstruct {\n\t\tu32 type: 8;\n\t\tu32 offset: 24;\n\t} entry[1];\n};\n\nstruct uvh_apicid_s {\n\tlong unsigned int local_apic_mask: 24;\n\tlong unsigned int local_apic_shift: 5;\n\tlong unsigned int unused1: 3;\n\tlong unsigned int pnode_mask: 24;\n\tlong unsigned int pnode_shift: 5;\n\tlong unsigned int unused2: 3;\n};\n\nunion uvh_apicid {\n\tlong unsigned int v;\n\tstruct uvh_apicid_s s;\n};\n\nstruct uvh_node_id_s {\n\tlong unsigned int force1: 1;\n\tlong unsigned int manufacturer: 11;\n\tlong unsigned int part_number: 16;\n\tlong unsigned int revision: 4;\n\tlong unsigned int rsvd_32_63: 32;\n};\n\nstruct uvxh_node_id_s {\n\tlong unsigned int force1: 1;\n\tlong unsigned int manufacturer: 11;\n\tlong unsigned int part_number: 16;\n\tlong unsigned int revision: 4;\n\tlong unsigned int node_id: 15;\n\tlong unsigned int rsvd_47_49: 3;\n\tlong unsigned int nodes_per_bit: 7;\n\tlong unsigned int ni_port: 5;\n\tlong unsigned int rsvd_62_63: 2;\n};\n\nstruct uvyh_node_id_s {\n\tlong unsigned int force1: 1;\n\tlong unsigned int manufacturer: 11;\n\tlong unsigned int part_number: 16;\n\tlong unsigned int revision: 4;\n\tlong unsigned int node_id: 7;\n\tlong unsigned int rsvd_39_56: 18;\n\tlong unsigned int ni_port: 6;\n\tlong unsigned int rsvd_63: 1;\n};\n\nunion uvh_node_id_u {\n\tlong unsigned int v;\n\tstruct uvh_node_id_s s;\n\tstruct uvxh_node_id_s sx;\n\tstruct uvyh_node_id_s sy;\n\tstruct uv5h_node_id_s s5;\n\tstruct uv4h_node_id_s s4;\n\tstruct uv3h_node_id_s s3;\n\tstruct uv2h_node_id_s s2;\n};\n\nstruct uvh_rh10_gam_addr_map_config_s {\n\tlong unsigned int undef_0_5: 6;\n\tlong unsigned int n_skt: 3;\n\tlong unsigned int undef_9_11: 3;\n\tlong unsigned int ls_enable: 1;\n\tlong unsigned int undef_13_15: 3;\n\tlong unsigned int mk_tme_keyid_bits: 4;\n\tlong unsigned int rsvd_20_63: 44;\n};\n\nstruct uvyh_rh10_gam_addr_map_config_s {\n\tlong unsigned int undef_0_5: 6;\n\tlong unsigned int n_skt: 3;\n\tlong unsigned int undef_9_11: 3;\n\tlong unsigned int ls_enable: 1;\n\tlong unsigned int undef_13_15: 3;\n\tlong unsigned int mk_tme_keyid_bits: 4;\n\tlong unsigned int rsvd_20_63: 44;\n};\n\nunion uvh_rh10_gam_addr_map_config_u {\n\tlong unsigned int v;\n\tstruct uvh_rh10_gam_addr_map_config_s s;\n\tstruct uvyh_rh10_gam_addr_map_config_s sy;\n\tstruct uv5h_rh10_gam_addr_map_config_s s5;\n};\n\nstruct uvh_rh10_gam_mmioh_overlay_config0_s {\n\tlong unsigned int rsvd_0_25: 26;\n\tlong unsigned int base: 26;\n\tlong unsigned int m_io: 6;\n\tlong unsigned int n_io: 4;\n\tlong unsigned int undef_62: 1;\n\tlong unsigned int enable: 1;\n};\n\nstruct uvyh_rh10_gam_mmioh_overlay_config0_s {\n\tlong unsigned int rsvd_0_25: 26;\n\tlong unsigned int base: 26;\n\tlong unsigned int m_io: 6;\n\tlong unsigned int n_io: 4;\n\tlong unsigned int undef_62: 1;\n\tlong unsigned int enable: 1;\n};\n\nunion uvh_rh10_gam_mmioh_overlay_config0_u {\n\tlong unsigned int v;\n\tstruct uvh_rh10_gam_mmioh_overlay_config0_s s;\n\tstruct uvyh_rh10_gam_mmioh_overlay_config0_s sy;\n\tstruct uv5h_rh10_gam_mmioh_overlay_config0_s s5;\n};\n\nstruct uvh_rh10_gam_mmioh_overlay_config1_s {\n\tlong unsigned int rsvd_0_25: 26;\n\tlong unsigned int base: 26;\n\tlong unsigned int m_io: 6;\n\tlong unsigned int n_io: 4;\n\tlong unsigned int undef_62: 1;\n\tlong unsigned int enable: 1;\n};\n\nstruct uvyh_rh10_gam_mmioh_overlay_config1_s {\n\tlong unsigned int rsvd_0_25: 26;\n\tlong unsigned int base: 26;\n\tlong unsigned int m_io: 6;\n\tlong unsigned int n_io: 4;\n\tlong unsigned int undef_62: 1;\n\tlong unsigned int enable: 1;\n};\n\nunion uvh_rh10_gam_mmioh_overlay_config1_u {\n\tlong unsigned int v;\n\tstruct uvh_rh10_gam_mmioh_overlay_config1_s s;\n\tstruct uvyh_rh10_gam_mmioh_overlay_config1_s sy;\n\tstruct uv5h_rh10_gam_mmioh_overlay_config1_s s5;\n};\n\nstruct uvh_rh10_gam_mmr_overlay_config_s {\n\tlong unsigned int undef_0_24: 25;\n\tlong unsigned int base: 27;\n\tlong unsigned int undef_52_62: 11;\n\tlong unsigned int enable: 1;\n};\n\nstruct uvyh_rh10_gam_mmr_overlay_config_s {\n\tlong unsigned int undef_0_24: 25;\n\tlong unsigned int base: 27;\n\tlong unsigned int undef_52_62: 11;\n\tlong unsigned int enable: 1;\n};\n\nunion uvh_rh10_gam_mmr_overlay_config_u {\n\tlong unsigned int v;\n\tstruct uvh_rh10_gam_mmr_overlay_config_s s;\n\tstruct uvyh_rh10_gam_mmr_overlay_config_s sy;\n\tstruct uv5h_rh10_gam_mmr_overlay_config_s s5;\n};\n\nstruct uvh_rh_gam_addr_map_config_s {\n\tlong unsigned int rsvd_0_5: 6;\n\tlong unsigned int n_skt: 4;\n\tlong unsigned int rsvd_10_63: 54;\n};\n\nstruct uvxh_rh_gam_addr_map_config_s {\n\tlong unsigned int rsvd_0_5: 6;\n\tlong unsigned int n_skt: 4;\n\tlong unsigned int rsvd_10_63: 54;\n};\n\nunion uvh_rh_gam_addr_map_config_u {\n\tlong unsigned int v;\n\tstruct uvh_rh_gam_addr_map_config_s s;\n\tstruct uvxh_rh_gam_addr_map_config_s sx;\n\tstruct uv4h_rh_gam_addr_map_config_s s4;\n\tstruct uv3h_rh_gam_addr_map_config_s s3;\n\tstruct uv2h_rh_gam_addr_map_config_s s2;\n};\n\nstruct uvh_rh_gam_alias_2_overlay_config_s {\n\tlong unsigned int rsvd_0_23: 24;\n\tlong unsigned int base: 8;\n\tlong unsigned int rsvd_32_47: 16;\n\tlong unsigned int m_alias: 5;\n\tlong unsigned int rsvd_53_62: 10;\n\tlong unsigned int enable: 1;\n};\n\nstruct uvxh_rh_gam_alias_2_overlay_config_s {\n\tlong unsigned int rsvd_0_23: 24;\n\tlong unsigned int base: 8;\n\tlong unsigned int rsvd_32_47: 16;\n\tlong unsigned int m_alias: 5;\n\tlong unsigned int rsvd_53_62: 10;\n\tlong unsigned int enable: 1;\n};\n\nunion uvh_rh_gam_alias_2_overlay_config_u {\n\tlong unsigned int v;\n\tstruct uvh_rh_gam_alias_2_overlay_config_s s;\n\tstruct uvxh_rh_gam_alias_2_overlay_config_s sx;\n\tstruct uv4h_rh_gam_alias_2_overlay_config_s s4;\n\tstruct uv3h_rh_gam_alias_2_overlay_config_s s3;\n\tstruct uv2h_rh_gam_alias_2_overlay_config_s s2;\n};\n\nstruct uvh_rh_gam_alias_2_redirect_config_s {\n\tlong unsigned int rsvd_0_23: 24;\n\tlong unsigned int dest_base: 22;\n\tlong unsigned int rsvd_46_63: 18;\n};\n\nstruct uvxh_rh_gam_alias_2_redirect_config_s {\n\tlong unsigned int rsvd_0_23: 24;\n\tlong unsigned int dest_base: 22;\n\tlong unsigned int rsvd_46_63: 18;\n};\n\nunion uvh_rh_gam_alias_2_redirect_config_u {\n\tlong unsigned int v;\n\tstruct uvh_rh_gam_alias_2_redirect_config_s s;\n\tstruct uvxh_rh_gam_alias_2_redirect_config_s sx;\n\tstruct uv4h_rh_gam_alias_2_redirect_config_s s4;\n\tstruct uv3h_rh_gam_alias_2_redirect_config_s s3;\n\tstruct uv2h_rh_gam_alias_2_redirect_config_s s2;\n};\n\nstruct uvh_rh_gam_gru_overlay_config_s {\n\tlong unsigned int rsvd_0_45: 46;\n\tlong unsigned int rsvd_46_51: 6;\n\tlong unsigned int n_gru: 4;\n\tlong unsigned int rsvd_56_62: 7;\n\tlong unsigned int enable: 1;\n};\n\nstruct uvxh_rh_gam_gru_overlay_config_s {\n\tlong unsigned int rsvd_0_45: 46;\n\tlong unsigned int rsvd_46_51: 6;\n\tlong unsigned int n_gru: 4;\n\tlong unsigned int rsvd_56_62: 7;\n\tlong unsigned int enable: 1;\n};\n\nunion uvh_rh_gam_gru_overlay_config_u {\n\tlong unsigned int v;\n\tstruct uvh_rh_gam_gru_overlay_config_s s;\n\tstruct uvxh_rh_gam_gru_overlay_config_s sx;\n\tstruct uv4ah_rh_gam_gru_overlay_config_s s4a;\n\tstruct uv4h_rh_gam_gru_overlay_config_s s4;\n\tstruct uv3h_rh_gam_gru_overlay_config_s s3;\n\tstruct uv2h_rh_gam_gru_overlay_config_s s2;\n};\n\nstruct uvh_rh_gam_mmioh_overlay_config0_s {\n\tlong unsigned int rsvd_0_25: 26;\n\tlong unsigned int base: 20;\n\tlong unsigned int m_io: 6;\n\tlong unsigned int n_io: 4;\n\tlong unsigned int rsvd_56_62: 7;\n\tlong unsigned int enable: 1;\n};\n\nstruct uvxh_rh_gam_mmioh_overlay_config0_s {\n\tlong unsigned int rsvd_0_25: 26;\n\tlong unsigned int base: 20;\n\tlong unsigned int m_io: 6;\n\tlong unsigned int n_io: 4;\n\tlong unsigned int rsvd_56_62: 7;\n\tlong unsigned int enable: 1;\n};\n\nunion uvh_rh_gam_mmioh_overlay_config0_u {\n\tlong unsigned int v;\n\tstruct uvh_rh_gam_mmioh_overlay_config0_s s;\n\tstruct uvxh_rh_gam_mmioh_overlay_config0_s sx;\n\tstruct uv4ah_rh_gam_mmioh_overlay_config0_mmr_s s4a;\n\tstruct uv4h_rh_gam_mmioh_overlay_config0_s s4;\n\tstruct uv3h_rh_gam_mmioh_overlay_config0_s s3;\n};\n\nstruct uvh_rh_gam_mmioh_overlay_config1_s {\n\tlong unsigned int rsvd_0_25: 26;\n\tlong unsigned int base: 20;\n\tlong unsigned int m_io: 6;\n\tlong unsigned int n_io: 4;\n\tlong unsigned int rsvd_56_62: 7;\n\tlong unsigned int enable: 1;\n};\n\nstruct uvxh_rh_gam_mmioh_overlay_config1_s {\n\tlong unsigned int rsvd_0_25: 26;\n\tlong unsigned int base: 20;\n\tlong unsigned int m_io: 6;\n\tlong unsigned int n_io: 4;\n\tlong unsigned int rsvd_56_62: 7;\n\tlong unsigned int enable: 1;\n};\n\nunion uvh_rh_gam_mmioh_overlay_config1_u {\n\tlong unsigned int v;\n\tstruct uvh_rh_gam_mmioh_overlay_config1_s s;\n\tstruct uvxh_rh_gam_mmioh_overlay_config1_s sx;\n\tstruct uv4ah_rh_gam_mmioh_overlay_config1_mmr_s s4a;\n\tstruct uv4h_rh_gam_mmioh_overlay_config1_s s4;\n\tstruct uv3h_rh_gam_mmioh_overlay_config1_s s3;\n};\n\nstruct uvh_rh_gam_mmioh_overlay_config_s {\n\tlong unsigned int rsvd_0_26: 27;\n\tlong unsigned int base: 19;\n\tlong unsigned int m_io: 6;\n\tlong unsigned int n_io: 4;\n\tlong unsigned int rsvd_56_62: 7;\n\tlong unsigned int enable: 1;\n};\n\nstruct uvxh_rh_gam_mmioh_overlay_config_s {\n\tlong unsigned int rsvd_0_26: 27;\n\tlong unsigned int base: 19;\n\tlong unsigned int m_io: 6;\n\tlong unsigned int n_io: 4;\n\tlong unsigned int rsvd_56_62: 7;\n\tlong unsigned int enable: 1;\n};\n\nunion uvh_rh_gam_mmioh_overlay_config_u {\n\tlong unsigned int v;\n\tstruct uvh_rh_gam_mmioh_overlay_config_s s;\n\tstruct uvxh_rh_gam_mmioh_overlay_config_s sx;\n\tstruct uv2h_rh_gam_mmioh_overlay_config_s s2;\n};\n\nstruct uvh_rh_gam_mmr_overlay_config_s {\n\tlong unsigned int rsvd_0_25: 26;\n\tlong unsigned int base: 20;\n\tlong unsigned int rsvd_46_62: 17;\n\tlong unsigned int enable: 1;\n};\n\nstruct uvxh_rh_gam_mmr_overlay_config_s {\n\tlong unsigned int rsvd_0_25: 26;\n\tlong unsigned int base: 20;\n\tlong unsigned int rsvd_46_62: 17;\n\tlong unsigned int enable: 1;\n};\n\nunion uvh_rh_gam_mmr_overlay_config_u {\n\tlong unsigned int v;\n\tstruct uvh_rh_gam_mmr_overlay_config_s s;\n\tstruct uvxh_rh_gam_mmr_overlay_config_s sx;\n\tstruct uv4h_rh_gam_mmr_overlay_config_s s4;\n\tstruct uv3h_rh_gam_mmr_overlay_config_s s3;\n\tstruct uv2h_rh_gam_mmr_overlay_config_s s2;\n};\n\nstruct uvyh_gr0_gam_gr_config_s {\n\tlong unsigned int rsvd_0_9: 10;\n\tlong unsigned int subspace: 1;\n\tlong unsigned int rsvd_11_63: 53;\n};\n\nunion uvyh_gr0_gam_gr_config_u {\n\tlong unsigned int v;\n\tstruct uvyh_gr0_gam_gr_config_s sy;\n\tstruct uv5h_gr0_gam_gr_config_s s5;\n\tstruct uv4h_gr0_gam_gr_config_s s4;\n\tstruct uv3h_gr0_gam_gr_config_s s3;\n\tstruct uv2h_gr0_gam_gr_config_s s2;\n};\n\nstruct va_alignment {\n\tint flags;\n\tlong unsigned int mask;\n\tlong unsigned int bits;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct va_format {\n\tconst char *fmt;\n\tva_list *va;\n};\n\nstruct val_table_ent {\n\tconst char *str;\n\tint value;\n};\n\nstruct value_name_pair {\n\tint value;\n\tconst char *name;\n};\n\nstruct var_mtrr_range_state {\n\tlong unsigned int base_pfn;\n\tlong unsigned int size_pfn;\n\tmtrr_type type;\n};\n\nstruct var_mtrr_state {\n\tlong unsigned int range_startk;\n\tlong unsigned int range_sizek;\n\tlong unsigned int chunk_sizek;\n\tlong unsigned int gran_sizek;\n\tunsigned int reg;\n};\n\nstruct variable_validate {\n\tefi_guid_t vendor;\n\tchar *name;\n\tbool (*validate)(efi_char16_t *, int, u8 *, long unsigned int);\n};\n\nstruct vblk_comp {\n\tu8 state[16];\n\tu64 parent_id;\n\tu8 type;\n\tu8 children;\n\tu16 chunksize;\n};\n\nstruct vblk_dgrp {\n\tu8 disk_id[64];\n};\n\nstruct vblk_disk {\n\tuuid_t disk_id;\n\tu8 alt_name[128];\n};\n\nstruct vblk_part {\n\tu64 start;\n\tu64 size;\n\tu64 volume_offset;\n\tu64 parent_id;\n\tu64 disk_id;\n\tu8 partnum;\n};\n\nstruct vblk_volu {\n\tu8 volume_type[16];\n\tu8 volume_state[16];\n\tu8 guid[16];\n\tu8 drive_hint[4];\n\tu64 size;\n\tu8 partition_type;\n};\n\nstruct vblk {\n\tu8 name[64];\n\tu64 obj_id;\n\tu32 sequence;\n\tu8 flags;\n\tu8 type;\n\tunion {\n\t\tstruct vblk_comp comp;\n\t\tstruct vblk_dgrp dgrp;\n\t\tstruct vblk_disk disk;\n\t\tstruct vblk_part part;\n\t\tstruct vblk_volu volu;\n\t} vblk;\n\tstruct list_head list;\n};\n\nstruct vc {\n\tstruct vc_data *d;\n\tstruct work_struct SAK_work;\n};\n\nstruct vc_state {\n\tunsigned int x;\n\tunsigned int y;\n\tunsigned char color;\n\tunsigned char Gx_charset[2];\n\tunsigned int charset: 1;\n\tenum vc_intensity intensity;\n\tbool italic;\n\tbool underline;\n\tbool blink;\n\tbool reverse;\n};\n\nstruct vt_mode {\n\tchar mode;\n\tchar waitv;\n\tshort int relsig;\n\tshort int acqsig;\n\tshort int frsig;\n};\n\nstruct vc_data {\n\tstruct tty_port port;\n\tstruct vc_state state;\n\tstruct vc_state saved_state;\n\tshort unsigned int vc_num;\n\tunsigned int vc_cols;\n\tunsigned int vc_rows;\n\tunsigned int vc_size_row;\n\tunsigned int vc_scan_lines;\n\tunsigned int vc_cell_height;\n\tlong unsigned int vc_origin;\n\tlong unsigned int vc_scr_end;\n\tlong unsigned int vc_visible_origin;\n\tunsigned int vc_top;\n\tunsigned int vc_bottom;\n\tconst struct consw *vc_sw;\n\tshort unsigned int *vc_screenbuf;\n\tunsigned int vc_screenbuf_size;\n\tunsigned char vc_mode;\n\tunsigned char vc_attr;\n\tunsigned char vc_def_color;\n\tunsigned char vc_ulcolor;\n\tunsigned char vc_itcolor;\n\tunsigned char vc_halfcolor;\n\tunsigned int vc_cursor_type;\n\tshort unsigned int vc_complement_mask;\n\tshort unsigned int vc_s_complement_mask;\n\tlong unsigned int vc_pos;\n\tshort unsigned int vc_hi_font_mask;\n\tstruct console_font vc_font;\n\tshort unsigned int vc_video_erase_char;\n\tunsigned int vc_state;\n\tunsigned int vc_npar;\n\tunsigned int vc_par[16];\n\tstruct vt_mode vt_mode;\n\tstruct pid *vt_pid;\n\tint vt_newvt;\n\twait_queue_head_t paste_wait;\n\tunsigned int vc_disp_ctrl: 1;\n\tunsigned int vc_toggle_meta: 1;\n\tunsigned int vc_decscnm: 1;\n\tunsigned int vc_decom: 1;\n\tunsigned int vc_decawm: 1;\n\tunsigned int vc_deccm: 1;\n\tunsigned int vc_decim: 1;\n\tunsigned int vc_priv: 3;\n\tunsigned int vc_need_wrap: 1;\n\tunsigned int vc_can_do_color: 1;\n\tunsigned int vc_report_mouse: 2;\n\tunsigned char vc_utf: 1;\n\tunsigned char vc_utf_count;\n\tint vc_utf_char;\n\tlong unsigned int vc_tab_stop[4];\n\tunsigned char vc_palette[48];\n\tshort unsigned int *vc_translate;\n\tunsigned int vc_bell_pitch;\n\tunsigned int vc_bell_duration;\n\tshort unsigned int vc_cur_blink_ms;\n\tstruct vc_data **vc_display_fg;\n\tstruct uni_pagedict *uni_pagedict;\n\tstruct uni_pagedict **uni_pagedict_loc;\n\tu32 **vc_uni_lines;\n};\n\nstruct vc_draw_region {\n\tlong unsigned int from;\n\tlong unsigned int to;\n\tint x;\n};\n\nstruct vc_selection {\n\tstruct mutex lock;\n\tstruct vc_data *cons;\n\tchar *buffer;\n\tunsigned int buf_len;\n\tvolatile int start;\n\tint end;\n};\n\nstruct vcap_actionset_list {\n\tint max;\n\tint cnt;\n\tenum vcap_actionfield_set *actionsets;\n};\n\nstruct vcap_cache_data {\n\tu32 *keystream;\n\tu32 *maskstream;\n\tu32 *actionstream;\n\tu32 counter;\n\tbool sticky;\n};\n\nstruct vcap_admin {\n\tstruct list_head list;\n\tstruct list_head rules;\n\tstruct list_head enabled;\n\tstruct mutex lock;\n\tenum vcap_type vtype;\n\tint vinst;\n\tint first_cid;\n\tint last_cid;\n\tint tgt_inst;\n\tint lookups;\n\tint lookups_per_instance;\n\tint last_valid_addr;\n\tint first_valid_addr;\n\tint last_used_addr;\n\tbool w32be;\n\tbool ingress;\n\tstruct vcap_cache_data cache;\n};\n\nstruct vcap_control;\n\nstruct vcap_admin_debugfs_info {\n\tstruct vcap_control *vctrl;\n\tstruct vcap_admin *admin;\n};\n\nstruct vcap_client_actionfield_ctrl {\n\tstruct list_head list;\n\tenum vcap_action_field action;\n\tenum vcap_field_type type;\n};\n\nstruct vcap_u1_action {\n\tu8 value;\n};\n\nstruct vcap_u32_action {\n\tu32 value;\n};\n\nstruct vcap_u48_action {\n\tu8 value[6];\n};\n\nstruct vcap_u56_action {\n\tu8 value[7];\n};\n\nstruct vcap_u64_action {\n\tu8 value[8];\n};\n\nstruct vcap_u72_action {\n\tu8 value[9];\n};\n\nstruct vcap_u112_action {\n\tu8 value[14];\n};\n\nstruct vcap_u128_action {\n\tu8 value[16];\n};\n\nstruct vcap_client_actionfield_data {\n\tunion {\n\t\tstruct vcap_u1_action u1;\n\t\tstruct vcap_u32_action u32;\n\t\tstruct vcap_u48_action u48;\n\t\tstruct vcap_u56_action u56;\n\t\tstruct vcap_u64_action u64;\n\t\tstruct vcap_u72_action u72;\n\t\tstruct vcap_u112_action u112;\n\t\tstruct vcap_u128_action u128;\n\t};\n};\n\nstruct vcap_client_actionfield {\n\tstruct vcap_client_actionfield_ctrl ctrl;\n\tstruct vcap_client_actionfield_data data;\n};\n\nstruct vcap_client_keyfield_ctrl {\n\tstruct list_head list;\n\tenum vcap_key_field key;\n\tenum vcap_field_type type;\n};\n\nstruct vcap_u1_key {\n\tu8 value;\n\tu8 mask;\n};\n\nstruct vcap_u32_key {\n\tu32 value;\n\tu32 mask;\n};\n\nstruct vcap_u48_key {\n\tu8 value[6];\n\tu8 mask[6];\n};\n\nstruct vcap_u56_key {\n\tu8 value[7];\n\tu8 mask[7];\n};\n\nstruct vcap_u64_key {\n\tu8 value[8];\n\tu8 mask[8];\n};\n\nstruct vcap_u72_key {\n\tu8 value[9];\n\tu8 mask[9];\n};\n\nstruct vcap_u112_key {\n\tu8 value[14];\n\tu8 mask[14];\n};\n\nstruct vcap_u128_key {\n\tu8 value[16];\n\tu8 mask[16];\n};\n\nstruct vcap_client_keyfield_data {\n\tunion {\n\t\tstruct vcap_u1_key u1;\n\t\tstruct vcap_u32_key u32;\n\t\tstruct vcap_u48_key u48;\n\t\tstruct vcap_u56_key u56;\n\t\tstruct vcap_u64_key u64;\n\t\tstruct vcap_u72_key u72;\n\t\tstruct vcap_u112_key u112;\n\t\tstruct vcap_u128_key u128;\n\t};\n};\n\nstruct vcap_client_keyfield {\n\tstruct vcap_client_keyfield_ctrl ctrl;\n\tstruct vcap_client_keyfield_data data;\n};\n\nstruct vcap_operations;\n\nstruct vcap_info;\n\nstruct vcap_statistics;\n\nstruct vcap_control {\n\tconst struct vcap_operations *ops;\n\tconst struct vcap_info *vcaps;\n\tconst struct vcap_statistics *stats;\n\tstruct list_head list;\n};\n\nstruct vcap_counter {\n\tu32 value;\n\tbool sticky;\n};\n\nstruct vcap_enabled_port {\n\tstruct list_head list;\n\tstruct net_device *ndev;\n\tlong unsigned int cookie;\n\tint src_cid;\n\tint dst_cid;\n};\n\nstruct vcap_field {\n\tu16 type;\n\tu16 width;\n\tu16 offset;\n};\n\nstruct vcap_set;\n\nstruct vcap_typegroup;\n\nstruct vcap_info {\n\tchar *name;\n\tu16 rows;\n\tu16 sw_count;\n\tu16 sw_width;\n\tu16 sticky_width;\n\tu16 act_width;\n\tu16 default_cnt;\n\tu16 require_cnt_dis;\n\tu16 version;\n\tconst struct vcap_set *keyfield_set;\n\tint keyfield_set_size;\n\tconst struct vcap_set *actionfield_set;\n\tint actionfield_set_size;\n\tconst struct vcap_field **keyfield_set_map;\n\tint *keyfield_set_map_size;\n\tconst struct vcap_field **actionfield_set_map;\n\tint *actionfield_set_map_size;\n\tconst struct vcap_typegroup **keyfield_set_typegroups;\n\tconst struct vcap_typegroup **actionfield_set_typegroups;\n};\n\nstruct vcap_keyset_list {\n\tint max;\n\tint cnt;\n\tenum vcap_keyfield_set *keysets;\n};\n\nstruct vcap_rule;\n\nstruct vcap_output_print;\n\nstruct vcap_operations {\n\tenum vcap_keyfield_set (*validate_keyset)(struct net_device *, struct vcap_admin *, struct vcap_rule *, struct vcap_keyset_list *, u16);\n\tvoid (*add_default_fields)(struct net_device *, struct vcap_admin *, struct vcap_rule *);\n\tvoid (*cache_erase)(struct vcap_admin *);\n\tvoid (*cache_write)(struct net_device *, struct vcap_admin *, enum vcap_selection, u32, u32);\n\tvoid (*cache_read)(struct net_device *, struct vcap_admin *, enum vcap_selection, u32, u32);\n\tvoid (*init)(struct net_device *, struct vcap_admin *, u32, u32);\n\tvoid (*update)(struct net_device *, struct vcap_admin *, enum vcap_command, enum vcap_selection, u32);\n\tvoid (*move)(struct net_device *, struct vcap_admin *, u32, int, int);\n\tint (*port_info)(struct net_device *, struct vcap_admin *, struct vcap_output_print *);\n};\n\nstruct vcap_output_print {\n\tvoid (*prf)(void *, const char *, ...);\n\tvoid *dst;\n};\n\nstruct vcap_port_debugfs_info {\n\tstruct vcap_control *vctrl;\n\tstruct net_device *ndev;\n};\n\nstruct vcap_rule {\n\tint vcap_chain_id;\n\tenum vcap_user user;\n\tu16 priority;\n\tu32 id;\n\tu64 cookie;\n\tstruct list_head keyfields;\n\tstruct list_head actionfields;\n\tenum vcap_keyfield_set keyset;\n\tenum vcap_actionfield_set actionset;\n\tenum vcap_rule_error exterr;\n\tu64 client;\n};\n\nstruct vcap_rule_internal {\n\tstruct vcap_rule data;\n\tstruct list_head list;\n\tstruct vcap_admin *admin;\n\tstruct net_device *ndev;\n\tstruct vcap_control *vctrl;\n\tu32 sort_key;\n\tint keyset_sw;\n\tint actionset_sw;\n\tint keyset_sw_regs;\n\tint actionset_sw_regs;\n\tint size;\n\tu32 addr;\n\tu32 counter_id;\n\tstruct vcap_counter counter;\n\tenum vcap_rule_state state;\n};\n\nstruct vcap_rule_move {\n\tint addr;\n\tint offset;\n\tint count;\n};\n\nstruct vcap_set {\n\tu8 type_id;\n\tu8 sw_per_item;\n\tu8 sw_cnt;\n};\n\nstruct vcap_statistics {\n\tchar *name;\n\tint count;\n\tconst char * const *keyfield_set_names;\n\tconst char * const *actionfield_set_names;\n\tconst char * const *keyfield_names;\n\tconst char * const *actionfield_names;\n};\n\nstruct vcap_stream_iter {\n\tu32 offset;\n\tu32 sw_width;\n\tu32 regs_per_sw;\n\tu32 reg_idx;\n\tu32 reg_bitpos;\n\tconst struct vcap_typegroup *tg;\n};\n\nstruct vcap_tc_flower_parse_usage {\n\tstruct flow_cls_offload *fco;\n\tstruct flow_rule *frule;\n\tstruct vcap_rule *vrule;\n\tstruct vcap_admin *admin;\n\tu16 l3_proto;\n\tu8 l4_proto;\n\tu16 tpid;\n\tlong long unsigned int used_keys;\n};\n\nstruct vcap_typegroup {\n\tu16 offset;\n\tu16 width;\n\tu16 value;\n};\n\nstruct vcpu_data {\n\tu64 pi_desc_addr;\n\tu32 vector;\n};\n\nstruct vcpu_guest_context {\n\tstruct {\n\t\tchar x[512];\n\t} fpu_ctxt;\n\tlong unsigned int flags;\n\tstruct cpu_user_regs user_regs;\n\tstruct trap_info trap_ctxt[256];\n\tlong unsigned int ldt_base;\n\tlong unsigned int ldt_ents;\n\tlong unsigned int gdt_frames[16];\n\tlong unsigned int gdt_ents;\n\tlong unsigned int kernel_ss;\n\tlong unsigned int kernel_sp;\n\tlong unsigned int ctrlreg[8];\n\tlong unsigned int debugreg[8];\n\tlong unsigned int event_callback_eip;\n\tlong unsigned int failsafe_callback_eip;\n\tlong unsigned int syscall_callback_eip;\n\tlong unsigned int vm_assist;\n\tuint64_t fs_base;\n\tuint64_t gs_base_kernel;\n\tuint64_t gs_base_user;\n};\n\nstruct vcpu_runstate_info;\n\ntypedef struct vcpu_runstate_info *__guest_handle_vcpu_runstate_info;\n\nstruct vcpu_register_runstate_memory_area {\n\tunion {\n\t\t__guest_handle_vcpu_runstate_info h;\n\t\tstruct vcpu_runstate_info *v;\n\t\tuint64_t p;\n\t} addr;\n};\n\nstruct vcpu_time_info;\n\ntypedef struct vcpu_time_info *__guest_handle_vcpu_time_info;\n\nstruct vcpu_register_time_memory_area {\n\tunion {\n\t\t__guest_handle_vcpu_time_info h;\n\t\tstruct pvclock_vcpu_time_info *v;\n\t\tuint64_t p;\n\t} addr;\n};\n\nstruct vcpu_register_vcpu_info {\n\tuint64_t mfn;\n\tuint32_t offset;\n\tuint32_t rsvd;\n};\n\nstruct vcpu_runstate_info {\n\tint state;\n\tuint64_t state_entry_time;\n\tuint64_t time[4];\n};\n\nstruct vcpu_set_singleshot_timer {\n\tuint64_t timeout_abs_ns;\n\tuint32_t flags;\n};\n\nstruct vcpu_time_info {\n\tuint32_t version;\n\tuint32_t pad0;\n\tuint64_t tsc_timestamp;\n\tuint64_t system_time;\n\tuint32_t tsc_to_system_mul;\n\tint8_t tsc_shift;\n\tint8_t pad1[3];\n};\n\nstruct vcs_poll_data {\n\tstruct notifier_block notifier;\n\tunsigned int cons_num;\n\tint event;\n\twait_queue_head_t waitq;\n\tstruct fasync_struct *fasync;\n};\n\nstruct vdso_timestamp {\n\tu64 sec;\n\tu64 nsec;\n};\n\nstruct vdso_data {\n\tu32 seq;\n\ts32 clock_mode;\n\tu64 cycle_last;\n\tu64 max_cycles;\n\tu64 mask;\n\tu32 mult;\n\tu32 shift;\n\tunion {\n\t\tstruct vdso_timestamp basetime[12];\n\t\tstruct timens_offset offset[12];\n\t};\n\ts32 tz_minuteswest;\n\ts32 tz_dsttime;\n\tu32 hrtimer_res;\n\tu32 __unused;\n\tstruct arch_vdso_data arch_data;\n};\n\nstruct vdso_exception_table_entry {\n\tint insn;\n\tint fixup;\n};\n\nstruct vdso_image {\n\tvoid *data;\n\tlong unsigned int size;\n\tlong unsigned int alt;\n\tlong unsigned int alt_len;\n\tlong unsigned int extable_base;\n\tlong unsigned int extable_len;\n\tconst void *extable;\n\tlong int sym_vvar_start;\n\tlong int sym_vvar_page;\n\tlong int sym_pvclock_page;\n\tlong int sym_hvclock_page;\n\tlong int sym_timens_page;\n\tlong int sym_VDSO32_NOTE_MASK;\n\tlong int sym___kernel_sigreturn;\n\tlong int sym___kernel_rt_sigreturn;\n\tlong int sym___kernel_vsyscall;\n\tlong int sym_int80_landing_pad;\n\tlong int sym_vdso32_sigreturn_landing_pad;\n\tlong int sym_vdso32_rt_sigreturn_landing_pad;\n};\n\nstruct vdso_rng_data {\n\tu64 generation;\n\tu8 is_ready;\n};\n\nstruct ve_info {\n\tu64 exit_reason;\n\tu64 exit_qual;\n\tu64 gla;\n\tu64 gpa;\n\tu32 instr_len;\n\tu32 instr_info;\n};\n\nstruct vector_cleanup {\n\tstruct hlist_head head;\n\tstruct timer_list timer;\n};\n\nstruct vers_iter {\n\tsize_t param_size;\n\tstruct dm_target_versions *vers;\n\tstruct dm_target_versions *old_vers;\n\tchar *end;\n\tuint32_t flags;\n};\n\nstruct veth {\n\t__be16 h_vlan_proto;\n\t__be16 h_vlan_TCI;\n};\n\nstruct vfree_deferred {\n\tstruct llist_head list;\n\tstruct work_struct wq;\n};\n\nstruct vfs_cap_data {\n\t__le32 magic_etc;\n\tstruct {\n\t\t__le32 permitted;\n\t\t__le32 inheritable;\n\t} data[2];\n};\n\nstruct vfs_ns_cap_data {\n\t__le32 magic_etc;\n\tstruct {\n\t\t__le32 permitted;\n\t\t__le32 inheritable;\n\t} data[2];\n\t__le32 rootid;\n};\n\nstruct vga_arb_user_card {\n\tstruct pci_dev *pdev;\n\tunsigned int mem_cnt;\n\tunsigned int io_cnt;\n};\n\nstruct vga_arb_private {\n\tstruct list_head list;\n\tstruct pci_dev *target;\n\tstruct vga_arb_user_card cards[16];\n\tspinlock_t lock;\n};\n\nstruct vga_device {\n\tstruct list_head list;\n\tstruct pci_dev *pdev;\n\tunsigned int decodes;\n\tunsigned int owns;\n\tunsigned int locks;\n\tunsigned int io_lock_cnt;\n\tunsigned int mem_lock_cnt;\n\tunsigned int io_norm_cnt;\n\tunsigned int mem_norm_cnt;\n\tbool bridge_has_one_vga;\n\tbool is_firmware_default;\n\tunsigned int (*set_decode)(struct pci_dev *, bool);\n};\n\nstruct vga_switcheroo_client_ops;\n\nstruct vga_switcheroo_client {\n\tstruct pci_dev *pdev;\n\tstruct fb_info *fb_info;\n\tenum vga_switcheroo_state pwr_state;\n\tconst struct vga_switcheroo_client_ops *ops;\n\tenum vga_switcheroo_client_id id;\n\tbool active;\n\tbool driver_power_control;\n\tstruct list_head list;\n\tstruct pci_dev *vga_dev;\n};\n\nstruct vga_switcheroo_client_ops {\n\tvoid (*set_gpu_state)(struct pci_dev *, enum vga_switcheroo_state);\n\tvoid (*reprobe)(struct pci_dev *);\n\tbool (*can_switch)(struct pci_dev *);\n\tvoid (*gpu_bound)(struct pci_dev *, enum vga_switcheroo_client_id);\n};\n\nstruct vga_switcheroo_handler {\n\tint (*init)(void);\n\tint (*switchto)(enum vga_switcheroo_client_id);\n\tint (*switch_ddc)(enum vga_switcheroo_client_id);\n\tint (*power_state)(enum vga_switcheroo_client_id, enum vga_switcheroo_state);\n\tenum vga_switcheroo_client_id (*get_client_id)(struct pci_dev *);\n};\n\nstruct vgasr_priv {\n\tbool active;\n\tbool delayed_switch_active;\n\tenum vga_switcheroo_client_id delayed_client_id;\n\tstruct dentry *debugfs_root;\n\tint registered_clients;\n\tstruct list_head clients;\n\tconst struct vga_switcheroo_handler *handler;\n\tenum vga_switcheroo_handler_flags_t handler_flags;\n\tstruct mutex mux_hw_lock;\n\tint old_ddc_owner;\n};\n\nstruct vgastate {\n\tvoid *vgabase;\n\tlong unsigned int membase;\n\t__u32 memsize;\n\t__u32 flags;\n\t__u32 depth;\n\t__u32 num_attr;\n\t__u32 num_crtc;\n\t__u32 num_gfx;\n\t__u32 num_seq;\n\tvoid *vidstate;\n};\n\nstruct vgda {\n\t__be32 secs;\n\t__be32 usec;\n\tchar reserved8[16];\n\t__be16 numlvs;\n\t__be16 maxlvs;\n\t__be16 pp_size;\n\t__be16 numpvs;\n\t__be16 total_vgdas;\n\t__be16 vgda_size;\n};\n\nstruct vhost_task {\n\tbool (*fn)(void *);\n\tvoid (*handle_sigkill)(void *);\n\tvoid *data;\n\tstruct completion exited;\n\tlong unsigned int flags;\n\tstruct task_struct *task;\n\tstruct mutex exit_mutex;\n};\n\nstruct videomode {\n\tlong unsigned int pixelclock;\n\tu32 hactive;\n\tu32 hfront_porch;\n\tu32 hback_porch;\n\tu32 hsync_len;\n\tu32 vactive;\n\tu32 vfront_porch;\n\tu32 vback_porch;\n\tu32 vsync_len;\n\tenum display_flags flags;\n};\n\nstruct vif_entry_notifier_info {\n\tstruct fib_notifier_info info;\n\tstruct net_device *dev;\n\tshort unsigned int vif_index;\n\tshort unsigned int vif_flags;\n\tu32 tb_id;\n};\n\nstruct vifctl {\n\tvifi_t vifc_vifi;\n\tunsigned char vifc_flags;\n\tunsigned char vifc_threshold;\n\tunsigned int vifc_rate_limit;\n\tunion {\n\t\tstruct in_addr vifc_lcl_addr;\n\t\tint vifc_lcl_ifindex;\n\t};\n\tstruct in_addr vifc_rmt_addr;\n};\n\nstruct viommu_dev {\n\tstruct iommu_device iommu;\n\tstruct device *dev;\n\tstruct virtio_device *vdev;\n\tstruct ida domain_ids;\n\tstruct virtqueue *vqs[2];\n\tspinlock_t request_lock;\n\tstruct list_head requests;\n\tvoid *evts;\n\tstruct iommu_domain_geometry geometry;\n\tu64 pgsize_bitmap;\n\tu32 first_domain;\n\tu32 last_domain;\n\tu32 map_flags;\n\tu32 probe_size;\n};\n\nstruct viommu_domain {\n\tstruct iommu_domain domain;\n\tstruct viommu_dev *viommu;\n\tstruct mutex mutex;\n\tunsigned int id;\n\tu32 map_flags;\n\tspinlock_t mappings_lock;\n\tstruct rb_root_cached mappings;\n\tlong unsigned int nr_endpoints;\n\tbool bypass;\n};\n\nstruct viommu_endpoint {\n\tstruct device *dev;\n\tstruct viommu_dev *viommu;\n\tstruct viommu_domain *vdomain;\n\tstruct list_head resv_regions;\n};\n\nstruct virtio_iommu_fault {\n\t__u8 reason;\n\t__u8 reserved[3];\n\t__le32 flags;\n\t__le32 endpoint;\n\t__u8 reserved2[4];\n\t__le64 address;\n};\n\nstruct viommu_event {\n\tunion {\n\t\tu32 head;\n\t\tstruct virtio_iommu_fault fault;\n\t};\n};\n\nstruct viommu_mapping {\n\tphys_addr_t paddr;\n\tstruct interval_tree_node iova;\n\tu32 flags;\n};\n\nstruct viommu_request {\n\tstruct list_head list;\n\tvoid *writeback;\n\tunsigned int write_offset;\n\tunsigned int len;\n\tchar buf[0];\n};\n\nstruct viot_iommu;\n\nstruct viot_endpoint {\n\tunion {\n\t\tstruct {\n\t\t\tu16 segment_start;\n\t\t\tu16 segment_end;\n\t\t\tu16 bdf_start;\n\t\t\tu16 bdf_end;\n\t\t};\n\t\tu64 address;\n\t};\n\tu32 endpoint_id;\n\tstruct viot_iommu *viommu;\n\tstruct list_head list;\n};\n\nstruct viot_iommu {\n\tunsigned int offset;\n\tstruct fwnode_handle *fwnode;\n\tstruct list_head list;\n};\n\nstruct virtio_blk_outhdr {\n\t__virtio32 type;\n\t__virtio32 ioprio;\n\t__virtio64 sector;\n};\n\nstruct virtblk_req {\n\tstruct virtio_blk_outhdr out_hdr;\n\tunion {\n\t\tu8 status;\n\t\tstruct {\n\t\t\t__virtio64 sector;\n\t\t\tu8 status;\n\t\t} zone_append;\n\t} in_hdr;\n\tsize_t in_hdr_len;\n\tstruct sg_table sg_table;\n\tstruct scatterlist sg[0];\n};\n\nstruct virtio_admin_cmd {\n\t__le16 opcode;\n\t__le16 group_type;\n\t__le64 group_member_id;\n\tstruct scatterlist *data_sg;\n\tstruct scatterlist *result_sg;\n\tstruct completion completion;\n\tint ret;\n};\n\nstruct virtio_admin_cmd_hdr {\n\t__le16 opcode;\n\t__le16 group_type;\n\t__u8 reserved1[12];\n\t__le64 group_member_id;\n};\n\nstruct virtio_admin_cmd_legacy_rd_data {\n\t__u8 offset;\n};\n\nstruct virtio_admin_cmd_legacy_wr_data {\n\t__u8 offset;\n\t__u8 reserved[7];\n\t__u8 registers[0];\n};\n\nstruct virtio_admin_cmd_notify_info_data {\n\t__u8 flags;\n\t__u8 bar;\n\t__u8 padding[6];\n\t__le64 offset;\n};\n\nstruct virtio_admin_cmd_notify_info_result {\n\tstruct virtio_admin_cmd_notify_info_data entries[4];\n};\n\nstruct virtio_admin_cmd_status {\n\t__le16 status;\n\t__le16 status_qualifier;\n\t__u8 reserved2[4];\n};\n\nstruct virtio_balloon_stat {\n\t__virtio16 tag;\n\t__virtio64 val;\n} __attribute__((packed));\n\nstruct virtio_balloon {\n\tstruct virtio_device *vdev;\n\tstruct virtqueue *inflate_vq;\n\tstruct virtqueue *deflate_vq;\n\tstruct virtqueue *stats_vq;\n\tstruct virtqueue *free_page_vq;\n\tstruct workqueue_struct *balloon_wq;\n\tstruct work_struct report_free_page_work;\n\tstruct work_struct update_balloon_stats_work;\n\tstruct work_struct update_balloon_size_work;\n\tspinlock_t stop_update_lock;\n\tbool stop_update;\n\tlong unsigned int config_read_bitmap;\n\tstruct list_head free_page_list;\n\tspinlock_t free_page_list_lock;\n\tlong unsigned int num_free_page_blocks;\n\tu32 cmd_id_received_cache;\n\t__virtio32 cmd_id_active;\n\t__virtio32 cmd_id_stop;\n\twait_queue_head_t acked;\n\tunsigned int num_pages;\n\tstruct balloon_dev_info vb_dev_info;\n\tstruct mutex balloon_lock;\n\tunsigned int num_pfns;\n\t__virtio32 pfns[256];\n\tstruct virtio_balloon_stat stats[10];\n\tstruct shrinker *shrinker;\n\tstruct notifier_block oom_nb;\n\tstruct virtqueue *reporting_vq;\n\tstruct page_reporting_dev_info pr_dev_info;\n\tspinlock_t wakeup_lock;\n\tbool processing_wakeup_event;\n\tu32 wakeup_signal_mask;\n};\n\nstruct virtio_balloon_config {\n\t__le32 num_pages;\n\t__le32 actual;\n\tunion {\n\t\t__le32 free_page_hint_cmd_id;\n\t\t__le32 free_page_report_cmd_id;\n\t};\n\t__le32 poison_val;\n};\n\nstruct virtio_blk_vq;\n\nstruct virtio_blk {\n\tstruct mutex vdev_mutex;\n\tstruct virtio_device *vdev;\n\tstruct gendisk *disk;\n\tstruct blk_mq_tag_set tag_set;\n\tstruct work_struct config_work;\n\tint index;\n\tint num_vqs;\n\tint io_queues[3];\n\tstruct virtio_blk_vq *vqs;\n\tunsigned int zone_sectors;\n};\n\nstruct virtio_blk_geometry {\n\t__virtio16 cylinders;\n\t__u8 heads;\n\t__u8 sectors;\n};\n\nstruct virtio_blk_zoned_characteristics {\n\t__virtio32 zone_sectors;\n\t__virtio32 max_open_zones;\n\t__virtio32 max_active_zones;\n\t__virtio32 max_append_sectors;\n\t__virtio32 write_granularity;\n\t__u8 model;\n\t__u8 unused2[3];\n};\n\nstruct virtio_blk_config {\n\t__virtio64 capacity;\n\t__virtio32 size_max;\n\t__virtio32 seg_max;\n\tstruct virtio_blk_geometry geometry;\n\t__virtio32 blk_size;\n\t__u8 physical_block_exp;\n\t__u8 alignment_offset;\n\t__virtio16 min_io_size;\n\t__virtio32 opt_io_size;\n\t__u8 wce;\n\t__u8 unused;\n\t__virtio16 num_queues;\n\t__virtio32 max_discard_sectors;\n\t__virtio32 max_discard_seg;\n\t__virtio32 discard_sector_alignment;\n\t__virtio32 max_write_zeroes_sectors;\n\t__virtio32 max_write_zeroes_seg;\n\t__u8 write_zeroes_may_unmap;\n\t__u8 unused1[3];\n\t__virtio32 max_secure_erase_sectors;\n\t__virtio32 max_secure_erase_seg;\n\t__virtio32 secure_erase_sector_alignment;\n\tstruct virtio_blk_zoned_characteristics zoned;\n};\n\nstruct virtio_blk_discard_write_zeroes {\n\t__le64 sector;\n\t__le32 num_sectors;\n\t__le32 flags;\n};\n\nstruct virtio_blk_vq {\n\tstruct virtqueue *vq;\n\tspinlock_t lock;\n\tchar name[16];\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct virtio_blk_zone_descriptor {\n\t__virtio64 z_cap;\n\t__virtio64 z_start;\n\t__virtio64 z_wp;\n\t__u8 z_type;\n\t__u8 z_state;\n\t__u8 reserved[38];\n};\n\nstruct virtio_blk_zone_report {\n\t__virtio64 nr_zones;\n\t__u8 reserved[56];\n\tstruct virtio_blk_zone_descriptor zones[0];\n};\n\nstruct virtqueue_info;\n\nstruct virtio_shm_region;\n\nstruct virtio_config_ops {\n\tvoid (*get)(struct virtio_device *, unsigned int, void *, unsigned int);\n\tvoid (*set)(struct virtio_device *, unsigned int, const void *, unsigned int);\n\tu32 (*generation)(struct virtio_device *);\n\tu8 (*get_status)(struct virtio_device *);\n\tvoid (*set_status)(struct virtio_device *, u8);\n\tvoid (*reset)(struct virtio_device *);\n\tint (*find_vqs)(struct virtio_device *, unsigned int, struct virtqueue **, struct virtqueue_info *, struct irq_affinity *);\n\tvoid (*del_vqs)(struct virtio_device *);\n\tvoid (*synchronize_cbs)(struct virtio_device *);\n\tu64 (*get_features)(struct virtio_device *);\n\tint (*finalize_features)(struct virtio_device *);\n\tconst char * (*bus_name)(struct virtio_device *);\n\tint (*set_vq_affinity)(struct virtqueue *, const struct cpumask *);\n\tconst struct cpumask * (*get_vq_affinity)(struct virtio_device *, int);\n\tbool (*get_shm_region)(struct virtio_device *, struct virtio_shm_region *, u8);\n\tint (*disable_vq_and_reset)(struct virtqueue *);\n\tint (*enable_vq_after_reset)(struct virtqueue *);\n};\n\nstruct virtio_console_config {\n\t__virtio16 cols;\n\t__virtio16 rows;\n\t__virtio32 max_nr_ports;\n\t__virtio32 emerg_wr;\n};\n\nstruct virtio_device_id {\n\t__u32 device;\n\t__u32 vendor;\n};\n\nstruct vringh_config_ops;\n\nstruct virtio_device {\n\tint index;\n\tbool failed;\n\tbool config_core_enabled;\n\tbool config_driver_disabled;\n\tbool config_change_pending;\n\tspinlock_t config_lock;\n\tspinlock_t vqs_list_lock;\n\tstruct device dev;\n\tstruct virtio_device_id id;\n\tconst struct virtio_config_ops *config;\n\tconst struct vringh_config_ops *vringh_config;\n\tstruct list_head vqs;\n\tu64 features;\n\tvoid *priv;\n};\n\nstruct virtio_driver {\n\tstruct device_driver driver;\n\tconst struct virtio_device_id *id_table;\n\tconst unsigned int *feature_table;\n\tunsigned int feature_table_size;\n\tconst unsigned int *feature_table_legacy;\n\tunsigned int feature_table_size_legacy;\n\tint (*validate)(struct virtio_device *);\n\tint (*probe)(struct virtio_device *);\n\tvoid (*scan)(struct virtio_device *);\n\tvoid (*remove)(struct virtio_device *);\n\tvoid (*config_changed)(struct virtio_device *);\n\tint (*freeze)(struct virtio_device *);\n\tint (*restore)(struct virtio_device *);\n};\n\nstruct virtio_iommu_range_64 {\n\t__le64 start;\n\t__le64 end;\n};\n\nstruct virtio_iommu_range_32 {\n\t__le32 start;\n\t__le32 end;\n};\n\nstruct virtio_iommu_config {\n\t__le64 page_size_mask;\n\tstruct virtio_iommu_range_64 input_range;\n\tstruct virtio_iommu_range_32 domain_range;\n\t__le32 probe_size;\n\t__u8 bypass;\n\t__u8 reserved[3];\n};\n\nstruct virtio_iommu_probe_property {\n\t__le16 type;\n\t__le16 length;\n};\n\nstruct virtio_iommu_probe_resv_mem {\n\tstruct virtio_iommu_probe_property head;\n\t__u8 subtype;\n\t__u8 reserved[3];\n\t__le64 start;\n\t__le64 end;\n};\n\nstruct virtio_iommu_req_head {\n\t__u8 type;\n\t__u8 reserved[3];\n};\n\nstruct virtio_iommu_req_tail {\n\t__u8 status;\n\t__u8 reserved[3];\n};\n\nstruct virtio_iommu_req_attach {\n\tstruct virtio_iommu_req_head head;\n\t__le32 domain;\n\t__le32 endpoint;\n\t__le32 flags;\n\t__u8 reserved[4];\n\tstruct virtio_iommu_req_tail tail;\n};\n\nstruct virtio_iommu_req_detach {\n\tstruct virtio_iommu_req_head head;\n\t__le32 domain;\n\t__le32 endpoint;\n\t__u8 reserved[8];\n\tstruct virtio_iommu_req_tail tail;\n};\n\nstruct virtio_iommu_req_map {\n\tstruct virtio_iommu_req_head head;\n\t__le32 domain;\n\t__le64 virt_start;\n\t__le64 virt_end;\n\t__le64 phys_start;\n\t__le32 flags;\n\tstruct virtio_iommu_req_tail tail;\n};\n\nstruct virtio_iommu_req_probe {\n\tstruct virtio_iommu_req_head head;\n\t__le32 endpoint;\n\t__u8 reserved[64];\n\t__u8 properties[0];\n};\n\nstruct virtio_iommu_req_unmap {\n\tstruct virtio_iommu_req_head head;\n\t__le32 domain;\n\t__le64 virt_start;\n\t__le64 virt_end;\n\t__u8 reserved[4];\n\tstruct virtio_iommu_req_tail tail;\n};\n\nstruct virtio_mmio_device {\n\tstruct virtio_device vdev;\n\tstruct platform_device *pdev;\n\tvoid *base;\n\tlong unsigned int version;\n\tspinlock_t lock;\n\tstruct list_head virtqueues;\n};\n\nstruct virtio_mmio_vq_info {\n\tstruct virtqueue *vq;\n\tstruct list_head node;\n};\n\nstruct virtio_net_hdr_mrg_rxbuf {\n\tstruct virtio_net_hdr hdr;\n\t__virtio16 num_buffers;\n};\n\nstruct virtio_net_hdr_v1 {\n\t__u8 flags;\n\t__u8 gso_type;\n\t__virtio16 hdr_len;\n\t__virtio16 gso_size;\n\tunion {\n\t\tstruct {\n\t\t\t__virtio16 csum_start;\n\t\t\t__virtio16 csum_offset;\n\t\t};\n\t\tstruct {\n\t\t\t__virtio16 start;\n\t\t\t__virtio16 offset;\n\t\t} csum;\n\t\tstruct {\n\t\t\t__le16 segments;\n\t\t\t__le16 dup_acks;\n\t\t} rsc;\n\t};\n\t__virtio16 num_buffers;\n};\n\nstruct virtio_net_hdr_v1_hash {\n\tstruct virtio_net_hdr_v1 hdr;\n\t__le32 hash_value;\n\t__le16 hash_report;\n\t__le16 padding;\n};\n\nstruct virtio_net_common_hdr {\n\tunion {\n\t\tstruct virtio_net_hdr hdr;\n\t\tstruct virtio_net_hdr_mrg_rxbuf mrg_hdr;\n\t\tstruct virtio_net_hdr_v1_hash hash_v1_hdr;\n\t};\n};\n\nstruct virtio_net_config {\n\t__u8 mac[6];\n\t__virtio16 status;\n\t__virtio16 max_virtqueue_pairs;\n\t__virtio16 mtu;\n\t__le32 speed;\n\t__u8 duplex;\n\t__u8 rss_max_key_size;\n\t__le16 rss_max_indirection_table_length;\n\t__le32 supported_hash_types;\n};\n\nstruct virtio_net_ctrl_coal {\n\t__le32 max_packets;\n\t__le32 max_usecs;\n};\n\nstruct virtio_net_ctrl_coal_rx {\n\t__le32 rx_max_packets;\n\t__le32 rx_usecs;\n};\n\nstruct virtio_net_ctrl_coal_tx {\n\t__le32 tx_max_packets;\n\t__le32 tx_usecs;\n};\n\nstruct virtio_net_ctrl_coal_vq {\n\t__le16 vqn;\n\t__le16 reserved;\n\tstruct virtio_net_ctrl_coal coal;\n};\n\nstruct virtio_net_ctrl_mac {\n\t__virtio32 entries;\n\t__u8 macs[0];\n};\n\nstruct virtio_net_ctrl_mq {\n\t__virtio16 virtqueue_pairs;\n};\n\nstruct virtio_net_ctrl_queue_stats {\n\tstruct {\n\t\t__le16 vq_index;\n\t\t__le16 reserved[3];\n\t\t__le64 types_bitmap[1];\n\t} stats[1];\n};\n\nstruct virtio_net_ctrl_rss {\n\tu32 hash_types;\n\tu16 indirection_table_mask;\n\tu16 unclassified_queue;\n\tu16 hash_cfg_reserved;\n\tu16 max_tx_vq;\n\tu8 hash_key_length;\n\tu8 key[40];\n\tu16 *indirection_table;\n};\n\nstruct virtio_net_stats_capabilities {\n\t__le64 supported_stats_types[1];\n};\n\nstruct virtio_net_stats_reply_hdr {\n\t__u8 type;\n\t__u8 reserved;\n\t__le16 vq_index;\n\t__le16 reserved1;\n\t__le16 size;\n};\n\nstruct virtio_pci_vq_info;\n\nstruct virtio_pci_admin_vq {\n\tstruct virtio_pci_vq_info *info;\n\tspinlock_t lock;\n\tu64 supported_cmds;\n\tchar name[10];\n\tu16 vq_index;\n};\n\nstruct virtio_pci_common_cfg {\n\t__le32 device_feature_select;\n\t__le32 device_feature;\n\t__le32 guest_feature_select;\n\t__le32 guest_feature;\n\t__le16 msix_config;\n\t__le16 num_queues;\n\t__u8 device_status;\n\t__u8 config_generation;\n\t__le16 queue_select;\n\t__le16 queue_size;\n\t__le16 queue_msix_vector;\n\t__le16 queue_enable;\n\t__le16 queue_notify_off;\n\t__le32 queue_desc_lo;\n\t__le32 queue_desc_hi;\n\t__le32 queue_avail_lo;\n\t__le32 queue_avail_hi;\n\t__le32 queue_used_lo;\n\t__le32 queue_used_hi;\n};\n\nstruct virtio_pci_legacy_device {\n\tstruct pci_dev *pci_dev;\n\tu8 *isr;\n\tvoid *ioaddr;\n\tstruct virtio_device_id id;\n};\n\nstruct virtio_pci_modern_device {\n\tstruct pci_dev *pci_dev;\n\tstruct virtio_pci_common_cfg *common;\n\tvoid *device;\n\tvoid *notify_base;\n\tresource_size_t notify_pa;\n\tu8 *isr;\n\tsize_t notify_len;\n\tsize_t device_len;\n\tsize_t common_len;\n\tint notify_map_cap;\n\tu32 notify_offset_multiplier;\n\tint modern_bars;\n\tstruct virtio_device_id id;\n\tint (*device_id_check)(struct pci_dev *);\n\tu64 dma_mask;\n};\n\nstruct virtio_pci_device {\n\tstruct virtio_device vdev;\n\tstruct pci_dev *pci_dev;\n\tunion {\n\t\tstruct virtio_pci_legacy_device ldev;\n\t\tstruct virtio_pci_modern_device mdev;\n\t};\n\tbool is_legacy;\n\tu8 *isr;\n\tspinlock_t lock;\n\tstruct list_head virtqueues;\n\tstruct list_head slow_virtqueues;\n\tstruct virtio_pci_vq_info **vqs;\n\tstruct virtio_pci_admin_vq admin_vq;\n\tint msix_enabled;\n\tint intx_enabled;\n\tcpumask_var_t *msix_affinity_masks;\n\tchar (*msix_names)[256];\n\tunsigned int msix_vectors;\n\tunsigned int msix_used_vectors;\n\tbool per_vq_vectors;\n\tstruct virtqueue * (*setup_vq)(struct virtio_pci_device *, struct virtio_pci_vq_info *, unsigned int, void (*)(struct virtqueue *), const char *, bool, u16);\n\tvoid (*del_vq)(struct virtio_pci_vq_info *);\n\tu16 (*config_vector)(struct virtio_pci_device *, u16);\n\tint (*avq_index)(struct virtio_device *, u16 *, u16 *);\n};\n\nstruct virtio_pci_modern_common_cfg {\n\tstruct virtio_pci_common_cfg cfg;\n\t__le16 queue_notify_data;\n\t__le16 queue_reset;\n\t__le16 admin_queue_index;\n\t__le16 admin_queue_num;\n};\n\nstruct virtio_pci_vq_info {\n\tstruct virtqueue *vq;\n\tstruct list_head node;\n\tunsigned int msix_vector;\n};\n\nstruct virtio_scsi_event {\n\t__virtio32 event;\n\t__u8 lun[8];\n\t__virtio32 reason;\n};\n\nstruct virtio_scsi;\n\nstruct virtio_scsi_event_node {\n\tstruct virtio_scsi *vscsi;\n\tstruct virtio_scsi_event event;\n\tstruct work_struct work;\n};\n\nstruct virtio_scsi_vq {\n\tspinlock_t vq_lock;\n\tstruct virtqueue *vq;\n};\n\nstruct virtio_scsi {\n\tstruct virtio_device *vdev;\n\tstruct virtio_scsi_event_node event_list[8];\n\tu32 num_queues;\n\tint io_queues[3];\n\tstruct hlist_node node;\n\tbool stop_events;\n\tstruct virtio_scsi_vq ctrl_vq;\n\tstruct virtio_scsi_vq event_vq;\n\tstruct virtio_scsi_vq req_vqs[0];\n};\n\nstruct virtio_scsi_cmd_req {\n\t__u8 lun[8];\n\t__virtio64 tag;\n\t__u8 task_attr;\n\t__u8 prio;\n\t__u8 crn;\n\t__u8 cdb[32];\n} __attribute__((packed));\n\nstruct virtio_scsi_cmd_req_pi {\n\t__u8 lun[8];\n\t__virtio64 tag;\n\t__u8 task_attr;\n\t__u8 prio;\n\t__u8 crn;\n\t__virtio32 pi_bytesout;\n\t__virtio32 pi_bytesin;\n\t__u8 cdb[32];\n} __attribute__((packed));\n\nstruct virtio_scsi_ctrl_tmf_req {\n\t__virtio32 type;\n\t__virtio32 subtype;\n\t__u8 lun[8];\n\t__virtio64 tag;\n};\n\nstruct virtio_scsi_ctrl_an_req {\n\t__virtio32 type;\n\t__u8 lun[8];\n\t__virtio32 event_requested;\n};\n\nstruct virtio_scsi_cmd_resp {\n\t__virtio32 sense_len;\n\t__virtio32 resid;\n\t__virtio16 status_qualifier;\n\t__u8 status;\n\t__u8 response;\n\t__u8 sense[96];\n};\n\nstruct virtio_scsi_ctrl_tmf_resp {\n\t__u8 response;\n};\n\nstruct virtio_scsi_ctrl_an_resp {\n\t__virtio32 event_actual;\n\t__u8 response;\n} __attribute__((packed));\n\nstruct virtio_scsi_cmd {\n\tstruct scsi_cmnd *sc;\n\tstruct completion *comp;\n\tunion {\n\t\tstruct virtio_scsi_cmd_req cmd;\n\t\tstruct virtio_scsi_cmd_req_pi cmd_pi;\n\t\tstruct virtio_scsi_ctrl_tmf_req tmf;\n\t\tstruct virtio_scsi_ctrl_an_req an;\n\t} req;\n\tunion {\n\t\tstruct virtio_scsi_cmd_resp cmd;\n\t\tstruct virtio_scsi_ctrl_tmf_resp tmf;\n\t\tstruct virtio_scsi_ctrl_an_resp an;\n\t\tstruct virtio_scsi_event evt;\n\t} resp;\n\tlong: 64;\n} __attribute__((packed));\n\nstruct virtio_scsi_config {\n\t__virtio32 num_queues;\n\t__virtio32 seg_max;\n\t__virtio32 max_sectors;\n\t__virtio32 cmd_per_lun;\n\t__virtio32 event_info_size;\n\t__virtio32 sense_size;\n\t__virtio32 cdb_size;\n\t__virtio16 max_channel;\n\t__virtio16 max_target;\n\t__virtio32 max_lun;\n};\n\nstruct virtio_shm_region {\n\tu64 addr;\n\tu64 len;\n};\n\nstruct virtnet_info {\n\tstruct virtio_device *vdev;\n\tstruct virtqueue *cvq;\n\tstruct net_device *dev;\n\tstruct send_queue *sq;\n\tstruct receive_queue *rq;\n\tunsigned int status;\n\tu16 max_queue_pairs;\n\tu16 curr_queue_pairs;\n\tu16 xdp_queue_pairs;\n\tbool xdp_enabled;\n\tbool big_packets;\n\tunsigned int big_packets_num_skbfrags;\n\tbool mergeable_rx_bufs;\n\tbool has_rss;\n\tbool has_rss_hash_report;\n\tu8 rss_key_size;\n\tu16 rss_indir_table_size;\n\tu32 rss_hash_types_supported;\n\tu32 rss_hash_types_saved;\n\tstruct virtio_net_ctrl_rss rss;\n\tbool has_cvq;\n\tstruct mutex cvq_lock;\n\tbool any_header_sg;\n\tu8 hdr_len;\n\tstruct delayed_work refill;\n\tbool refill_enabled;\n\tspinlock_t refill_lock;\n\tstruct work_struct config_work;\n\tstruct work_struct rx_mode_work;\n\tbool rx_mode_work_enabled;\n\tbool affinity_hint_set;\n\tstruct hlist_node node;\n\tstruct hlist_node node_dead;\n\tstruct control_buf *ctrl;\n\tu8 duplex;\n\tu32 speed;\n\tbool rx_dim_enabled;\n\tstruct virtnet_interrupt_coalesce intr_coal_tx;\n\tstruct virtnet_interrupt_coalesce intr_coal_rx;\n\tlong unsigned int guest_offloads;\n\tlong unsigned int guest_offloads_capable;\n\tstruct failover *failover;\n\tu64 device_stats_cap;\n};\n\nstruct virtnet_rq_dma {\n\tdma_addr_t addr;\n\tu32 ref;\n\tu16 len;\n\tu16 need_sync;\n};\n\nstruct virtnet_sq_free_stats {\n\tu64 packets;\n\tu64 bytes;\n\tu64 napi_packets;\n\tu64 napi_bytes;\n};\n\nstruct virtnet_stat_desc {\n\tchar desc[32];\n\tsize_t offset;\n\tsize_t qstat_offset;\n};\n\nstruct virtnet_stats_ctx {\n\tbool to_qstat;\n\tu32 desc_num[3];\n\tu64 bitmap[3];\n\tu32 size[3];\n\tu64 *data;\n};\n\nstruct virtqueue {\n\tstruct list_head list;\n\tvoid (*callback)(struct virtqueue *);\n\tconst char *name;\n\tstruct virtio_device *vdev;\n\tunsigned int index;\n\tunsigned int num_free;\n\tunsigned int num_max;\n\tbool reset;\n\tvoid *priv;\n};\n\ntypedef void vq_callback_t(struct virtqueue *);\n\nstruct virtqueue_info {\n\tconst char *name;\n\tvq_callback_t *callback;\n\tbool ctx;\n};\n\nstruct vlan_priority_tci_mapping;\n\nstruct vlan_pcpu_stats;\n\nstruct vlan_dev_priv {\n\tunsigned int nr_ingress_mappings;\n\tu32 ingress_priority_map[8];\n\tunsigned int nr_egress_mappings;\n\tstruct vlan_priority_tci_mapping *egress_priority_map[16];\n\t__be16 vlan_proto;\n\tu16 vlan_id;\n\tu16 flags;\n\tstruct net_device *real_dev;\n\tnetdevice_tracker dev_tracker;\n\tunsigned char real_dev_addr[6];\n\tstruct proc_dir_entry *dent;\n\tstruct vlan_pcpu_stats *vlan_pcpu_stats;\n\tstruct netpoll *netpoll;\n};\n\nstruct vlan_ethhdr {\n\tunion {\n\t\tstruct {\n\t\t\tunsigned char h_dest[6];\n\t\t\tunsigned char h_source[6];\n\t\t};\n\t\tstruct {\n\t\t\tunsigned char h_dest[6];\n\t\t\tunsigned char h_source[6];\n\t\t} addrs;\n\t};\n\t__be16 h_vlan_proto;\n\t__be16 h_vlan_TCI;\n\t__be16 h_vlan_encapsulated_proto;\n};\n\nstruct vlan_group {\n\tunsigned int nr_vlan_devs;\n\tstruct hlist_node hlist;\n\tstruct net_device **vlan_devices_arrays[16];\n};\n\nstruct vlan_hdr {\n\t__be16 h_vlan_TCI;\n\t__be16 h_vlan_encapsulated_proto;\n};\n\nstruct vlan_info {\n\tstruct net_device *real_dev;\n\tstruct vlan_group grp;\n\tstruct list_head vid_list;\n\tunsigned int nr_vids;\n\tstruct callback_head rcu;\n};\n\nstruct vlan_pcpu_stats {\n\tu64_stats_t rx_packets;\n\tu64_stats_t rx_bytes;\n\tu64_stats_t rx_multicast;\n\tu64_stats_t tx_packets;\n\tu64_stats_t tx_bytes;\n\tstruct u64_stats_sync syncp;\n\tu32 rx_errors;\n\tu32 tx_dropped;\n};\n\nstruct vlan_priority_tci_mapping {\n\tu32 priority;\n\tu16 vlan_qos;\n\tstruct vlan_priority_tci_mapping *next;\n};\n\nstruct vlan_vid {\n\tstruct list_head list;\n\t__be16 proto;\n\tu16 vid;\n};\n\nstruct vlan_vid_info {\n\tstruct list_head list;\n\t__be16 proto;\n\tu16 vid;\n\tint refcount;\n};\n\nstruct vm_userfaultfd_ctx {\n\tstruct userfaultfd_ctx *ctx;\n};\n\nstruct vma_lock;\n\nstruct vma_numab_state;\n\nstruct vm_area_struct {\n\tunion {\n\t\tstruct {\n\t\t\tlong unsigned int vm_start;\n\t\t\tlong unsigned int vm_end;\n\t\t};\n\t\tstruct callback_head vm_rcu;\n\t};\n\tstruct mm_struct *vm_mm;\n\tpgprot_t vm_page_prot;\n\tunion {\n\t\tconst vm_flags_t vm_flags;\n\t\tvm_flags_t __vm_flags;\n\t};\n\tbool detached;\n\tint vm_lock_seq;\n\tstruct vma_lock *vm_lock;\n\tstruct {\n\t\tstruct rb_node rb;\n\t\tlong unsigned int rb_subtree_last;\n\t} shared;\n\tstruct list_head anon_vma_chain;\n\tstruct anon_vma *anon_vma;\n\tconst struct vm_operations_struct *vm_ops;\n\tlong unsigned int vm_pgoff;\n\tstruct file *vm_file;\n\tvoid *vm_private_data;\n\tstruct anon_vma_name *anon_name;\n\tatomic_long_t swap_readahead_info;\n\tstruct mempolicy *vm_policy;\n\tstruct vma_numab_state *numab_state;\n\tstruct vm_userfaultfd_ctx vm_userfaultfd_ctx;\n};\n\nstruct vm_event_state {\n\tlong unsigned int event[111];\n};\n\nstruct vm_fault {\n\tconst struct {\n\t\tstruct vm_area_struct *vma;\n\t\tgfp_t gfp_mask;\n\t\tlong unsigned int pgoff;\n\t\tlong unsigned int address;\n\t\tlong unsigned int real_address;\n\t};\n\tenum fault_flag flags;\n\tpmd_t *pmd;\n\tpud_t *pud;\n\tunion {\n\t\tpte_t orig_pte;\n\t\tpmd_t orig_pmd;\n\t};\n\tstruct page *cow_page;\n\tstruct page *page;\n\tpte_t *pte;\n\tspinlock_t *ptl;\n\tpgtable_t prealloc_pte;\n};\n\nstruct vm_operations_struct {\n\tvoid (*open)(struct vm_area_struct *);\n\tvoid (*close)(struct vm_area_struct *);\n\tint (*may_split)(struct vm_area_struct *, long unsigned int);\n\tint (*mremap)(struct vm_area_struct *);\n\tint (*mprotect)(struct vm_area_struct *, long unsigned int, long unsigned int, long unsigned int);\n\tvm_fault_t (*fault)(struct vm_fault *);\n\tvm_fault_t (*huge_fault)(struct vm_fault *, unsigned int);\n\tvm_fault_t (*map_pages)(struct vm_fault *, long unsigned int, long unsigned int);\n\tlong unsigned int (*pagesize)(struct vm_area_struct *);\n\tvm_fault_t (*page_mkwrite)(struct vm_fault *);\n\tvm_fault_t (*pfn_mkwrite)(struct vm_fault *);\n\tint (*access)(struct vm_area_struct *, long unsigned int, void *, int, int);\n\tconst char * (*name)(struct vm_area_struct *);\n\tint (*set_policy)(struct vm_area_struct *, struct mempolicy *);\n\tstruct mempolicy * (*get_policy)(struct vm_area_struct *, long unsigned int, long unsigned int *);\n\tstruct page * (*find_special_page)(struct vm_area_struct *, long unsigned int);\n};\n\nstruct vm_special_mapping {\n\tconst char *name;\n\tstruct page **pages;\n\tvm_fault_t (*fault)(const struct vm_special_mapping *, struct vm_area_struct *, struct vm_fault *);\n\tint (*mremap)(const struct vm_special_mapping *, struct vm_area_struct *);\n};\n\nstruct vm_stack {\n\tstruct callback_head rcu;\n\tstruct vm_struct *stack_vm_area;\n};\n\nstruct vm_struct {\n\tstruct vm_struct *next;\n\tvoid *addr;\n\tlong unsigned int size;\n\tlong unsigned int flags;\n\tstruct page **pages;\n\tunsigned int page_order;\n\tunsigned int nr_pages;\n\tphys_addr_t phys_addr;\n\tconst void *caller;\n};\n\nstruct vm_unmapped_area_info {\n\tlong unsigned int flags;\n\tlong unsigned int length;\n\tlong unsigned int low_limit;\n\tlong unsigned int high_limit;\n\tlong unsigned int align_mask;\n\tlong unsigned int align_offset;\n\tlong unsigned int start_gap;\n};\n\nstruct vma_list {\n\tstruct vm_area_struct *vma;\n\tstruct list_head head;\n\tatomic_t mmap_count;\n};\n\nstruct vma_lock {\n\tstruct rw_semaphore lock;\n};\n\nstruct vma_numab_state {\n\tlong unsigned int next_scan;\n\tlong unsigned int pids_active_reset;\n\tlong unsigned int pids_active[2];\n\tint start_scan_seq;\n\tint prev_scan_seq;\n};\n\nstruct vma_prepare {\n\tstruct vm_area_struct *vma;\n\tstruct vm_area_struct *adj_next;\n\tstruct file *file;\n\tstruct address_space *mapping;\n\tstruct anon_vma *anon_vma;\n\tstruct vm_area_struct *insert;\n\tstruct vm_area_struct *remove;\n\tstruct vm_area_struct *remove2;\n};\n\nstruct vmap_area {\n\tlong unsigned int va_start;\n\tlong unsigned int va_end;\n\tstruct rb_node rb_node;\n\tstruct list_head list;\n\tunion {\n\t\tlong unsigned int subtree_max_size;\n\t\tstruct vm_struct *vm;\n\t};\n\tlong unsigned int flags;\n};\n\nstruct vmap_block {\n\tspinlock_t lock;\n\tstruct vmap_area *va;\n\tlong unsigned int free;\n\tlong unsigned int dirty;\n\tlong unsigned int used_map[4];\n\tlong unsigned int dirty_min;\n\tlong unsigned int dirty_max;\n\tstruct list_head free_list;\n\tstruct callback_head callback_head;\n\tstruct list_head purge;\n\tunsigned int cpu;\n};\n\nstruct vmap_block_queue {\n\tspinlock_t lock;\n\tstruct list_head free;\n\tstruct xarray vmap_blocks;\n};\n\nstruct vmap_pool {\n\tstruct list_head head;\n\tlong unsigned int len;\n};\n\nstruct vmap_node {\n\tstruct vmap_pool pool[256];\n\tspinlock_t pool_lock;\n\tbool skip_populate;\n\tstruct rb_list busy;\n\tstruct rb_list lazy;\n\tstruct list_head purge_list;\n\tstruct work_struct purge_work;\n\tlong unsigned int nr_purged;\n};\n\nstruct vmap_pfn_data {\n\tlong unsigned int *pfns;\n\tpgprot_t prot;\n\tunsigned int idx;\n};\n\nstruct vmcore {\n\tstruct list_head list;\n\tlong long unsigned int paddr;\n\tlong long unsigned int size;\n\tloff_t offset;\n};\n\nstruct vmcore_cb {\n\tbool (*pfn_is_ram)(struct vmcore_cb *, long unsigned int);\n\tstruct list_head next;\n};\n\nstruct vmcoredd_data {\n\tchar dump_name[44];\n\tunsigned int size;\n\tint (*vmcoredd_callback)(struct vmcoredd_data *, void *);\n};\n\nstruct vmcoredd_header {\n\t__u32 n_namesz;\n\t__u32 n_descsz;\n\t__u32 n_type;\n\t__u8 name[8];\n\t__u8 dump_name[44];\n};\n\nstruct vmcoredd_node {\n\tstruct list_head list;\n\tvoid *buf;\n\tunsigned int size;\n};\n\nstruct vme_callback {\n\tvoid (*func)(int, int, void *);\n\tvoid *priv_data;\n};\n\nstruct vme_irq {\n\tint count;\n\tstruct vme_callback callback[256];\n};\n\nstruct vme_slave_resource;\n\nstruct vme_master_resource;\n\nstruct vme_dma_list;\n\nstruct vme_dma_attr;\n\nstruct vme_lm_resource;\n\nstruct vme_bridge {\n\tchar name[16];\n\tint num;\n\tstruct list_head master_resources;\n\tstruct list_head slave_resources;\n\tstruct list_head dma_resources;\n\tstruct list_head lm_resources;\n\tstruct list_head vme_error_handlers;\n\tstruct list_head devices;\n\tstruct device *parent;\n\tvoid *driver_priv;\n\tstruct list_head bus_list;\n\tstruct vme_irq irq[7];\n\tstruct mutex irq_mtx;\n\tint (*slave_get)(struct vme_slave_resource *, int *, long long unsigned int *, long long unsigned int *, dma_addr_t *, u32 *, u32 *);\n\tint (*slave_set)(struct vme_slave_resource *, int, long long unsigned int, long long unsigned int, dma_addr_t, u32, u32);\n\tint (*master_get)(struct vme_master_resource *, int *, long long unsigned int *, long long unsigned int *, u32 *, u32 *, u32 *);\n\tint (*master_set)(struct vme_master_resource *, int, long long unsigned int, long long unsigned int, u32, u32, u32);\n\tssize_t (*master_read)(struct vme_master_resource *, void *, size_t, loff_t);\n\tssize_t (*master_write)(struct vme_master_resource *, void *, size_t, loff_t);\n\tunsigned int (*master_rmw)(struct vme_master_resource *, unsigned int, unsigned int, unsigned int, loff_t);\n\tint (*dma_list_add)(struct vme_dma_list *, struct vme_dma_attr *, struct vme_dma_attr *, size_t);\n\tint (*dma_list_exec)(struct vme_dma_list *);\n\tint (*dma_list_empty)(struct vme_dma_list *);\n\tvoid (*irq_set)(struct vme_bridge *, int, int, int);\n\tint (*irq_generate)(struct vme_bridge *, int, int);\n\tint (*lm_set)(struct vme_lm_resource *, long long unsigned int, u32, u32);\n\tint (*lm_get)(struct vme_lm_resource *, long long unsigned int *, u32 *, u32 *);\n\tint (*lm_attach)(struct vme_lm_resource *, int, void (*)(void *), void *);\n\tint (*lm_detach)(struct vme_lm_resource *, int);\n\tint (*slot_get)(struct vme_bridge *);\n\tvoid * (*alloc_consistent)(struct device *, size_t, dma_addr_t *);\n\tvoid (*free_consistent)(struct device *, size_t, void *, dma_addr_t);\n};\n\nstruct vme_dev {\n\tint num;\n\tstruct vme_bridge *bridge;\n\tstruct device dev;\n\tstruct list_head drv_list;\n\tstruct list_head bridge_list;\n};\n\nstruct vme_dma_attr {\n\tu32 type;\n\tvoid *private;\n};\n\nstruct vme_dma_resource;\n\nstruct vme_dma_list {\n\tstruct list_head list;\n\tstruct vme_dma_resource *parent;\n\tstruct list_head entries;\n\tstruct mutex mtx;\n};\n\nstruct vme_dma_pattern {\n\tu32 pattern;\n\tu32 type;\n};\n\nstruct vme_dma_pci {\n\tdma_addr_t address;\n};\n\nstruct vme_dma_resource {\n\tstruct list_head list;\n\tstruct vme_bridge *parent;\n\tstruct mutex mtx;\n\tint locked;\n\tint number;\n\tstruct list_head pending;\n\tstruct list_head running;\n\tu32 route_attr;\n};\n\nstruct vme_dma_vme {\n\tlong long unsigned int address;\n\tu32 aspace;\n\tu32 cycle;\n\tu32 dwidth;\n};\n\nstruct vme_driver {\n\tconst char *name;\n\tint (*match)(struct vme_dev *);\n\tint (*probe)(struct vme_dev *);\n\tvoid (*remove)(struct vme_dev *);\n\tstruct device_driver driver;\n\tstruct list_head devices;\n};\n\nstruct vme_error_handler {\n\tstruct list_head list;\n\tlong long unsigned int start;\n\tlong long unsigned int end;\n\tlong long unsigned int first_error;\n\tu32 aspace;\n\tunsigned int num_errors;\n};\n\nstruct vme_lm_resource {\n\tstruct list_head list;\n\tstruct vme_bridge *parent;\n\tstruct mutex mtx;\n\tint locked;\n\tint number;\n\tint monitors;\n};\n\nstruct vme_master_resource {\n\tstruct list_head list;\n\tstruct vme_bridge *parent;\n\tspinlock_t lock;\n\tint locked;\n\tint number;\n\tu32 address_attr;\n\tu32 cycle_attr;\n\tu32 width_attr;\n\tstruct resource bus_resource;\n\tvoid *kern_base;\n};\n\nstruct vme_resource {\n\tenum vme_resource_type type;\n\tstruct list_head *entry;\n};\n\nstruct vme_slave_resource {\n\tstruct list_head list;\n\tstruct vme_bridge *parent;\n\tstruct mutex mtx;\n\tint locked;\n\tint number;\n\tu32 address_attr;\n\tu32 cycle_attr;\n};\n\nstruct vmemmap_remap_walk {\n\tvoid (*remap_pte)(pte_t *, long unsigned int, struct vmemmap_remap_walk *);\n\tlong unsigned int nr_walked;\n\tstruct page *reuse_page;\n\tlong unsigned int reuse_addr;\n\tstruct list_head *vmemmap_pages;\n\tlong unsigned int flags;\n};\n\nstruct vmpressure_event {\n\tstruct eventfd_ctx *efd;\n\tenum vmpressure_levels level;\n\tenum vmpressure_modes mode;\n\tstruct list_head node;\n};\n\nstruct vmware_steal_time {\n\tunion {\n\t\tu64 clock;\n\t\tstruct {\n\t\t\tu32 clock_low;\n\t\t\tu32 clock_high;\n\t\t};\n\t};\n\tu64 reserved[7];\n};\n\nstruct vring_desc;\n\ntypedef struct vring_desc vring_desc_t;\n\nstruct vring_avail;\n\ntypedef struct vring_avail vring_avail_t;\n\nstruct vring_used;\n\ntypedef struct vring_used vring_used_t;\n\nstruct vring {\n\tunsigned int num;\n\tvring_desc_t *desc;\n\tvring_avail_t *avail;\n\tvring_used_t *used;\n};\n\nstruct vring_avail {\n\t__virtio16 flags;\n\t__virtio16 idx;\n\t__virtio16 ring[0];\n};\n\nstruct vring_desc {\n\t__virtio64 addr;\n\t__virtio32 len;\n\t__virtio16 flags;\n\t__virtio16 next;\n};\n\nstruct vring_desc_extra {\n\tdma_addr_t addr;\n\tu32 len;\n\tu16 flags;\n\tu16 next;\n};\n\nstruct vring_packed_desc;\n\nstruct vring_desc_state_packed {\n\tvoid *data;\n\tstruct vring_packed_desc *indir_desc;\n\tu16 num;\n\tu16 last;\n};\n\nstruct vring_desc_state_split {\n\tvoid *data;\n\tstruct vring_desc *indir_desc;\n};\n\nstruct vring_packed_desc {\n\t__le64 addr;\n\t__le32 len;\n\t__le16 id;\n\t__le16 flags;\n};\n\nstruct vring_packed_desc_event {\n\t__le16 off_wrap;\n\t__le16 flags;\n};\n\nstruct vring_used_elem {\n\t__virtio32 id;\n\t__virtio32 len;\n};\n\ntypedef struct vring_used_elem vring_used_elem_t;\n\nstruct vring_used {\n\t__virtio16 flags;\n\t__virtio16 idx;\n\tvring_used_elem_t ring[0];\n};\n\nstruct vring_virtqueue_split {\n\tstruct vring vring;\n\tu16 avail_flags_shadow;\n\tu16 avail_idx_shadow;\n\tstruct vring_desc_state_split *desc_state;\n\tstruct vring_desc_extra *desc_extra;\n\tdma_addr_t queue_dma_addr;\n\tsize_t queue_size_in_bytes;\n\tu32 vring_align;\n\tbool may_reduce_num;\n};\n\nstruct vring_virtqueue_packed {\n\tstruct {\n\t\tunsigned int num;\n\t\tstruct vring_packed_desc *desc;\n\t\tstruct vring_packed_desc_event *driver;\n\t\tstruct vring_packed_desc_event *device;\n\t} vring;\n\tbool avail_wrap_counter;\n\tu16 avail_used_flags;\n\tu16 next_avail_idx;\n\tu16 event_flags_shadow;\n\tstruct vring_desc_state_packed *desc_state;\n\tstruct vring_desc_extra *desc_extra;\n\tdma_addr_t ring_dma_addr;\n\tdma_addr_t driver_event_dma_addr;\n\tdma_addr_t device_event_dma_addr;\n\tsize_t ring_size_in_bytes;\n\tsize_t event_size_in_bytes;\n};\n\nstruct vring_virtqueue {\n\tstruct virtqueue vq;\n\tbool packed_ring;\n\tbool use_dma_api;\n\tbool weak_barriers;\n\tbool broken;\n\tbool indirect;\n\tbool event;\n\tbool premapped;\n\tbool do_unmap;\n\tunsigned int free_head;\n\tunsigned int num_added;\n\tu16 last_used_idx;\n\tbool event_triggered;\n\tunion {\n\t\tstruct vring_virtqueue_split split;\n\t\tstruct vring_virtqueue_packed packed;\n\t};\n\tbool (*notify)(struct virtqueue *);\n\tbool we_own_ring;\n\tstruct device *dma_dev;\n};\n\nstruct vt_consize {\n\tshort unsigned int v_rows;\n\tshort unsigned int v_cols;\n\tshort unsigned int v_vlin;\n\tshort unsigned int v_clin;\n\tshort unsigned int v_vcol;\n\tshort unsigned int v_ccol;\n};\n\nstruct vt_event {\n\tunsigned int event;\n\tunsigned int oldev;\n\tunsigned int newev;\n\tunsigned int pad[4];\n};\n\nstruct vt_event_wait {\n\tstruct list_head list;\n\tstruct vt_event event;\n\tint done;\n};\n\nstruct vt_notifier_param {\n\tstruct vc_data *vc;\n\tunsigned int c;\n};\n\nstruct vt_setactivate {\n\tunsigned int console;\n\tstruct vt_mode mode;\n};\n\nstruct vt_sizes {\n\tshort unsigned int v_rows;\n\tshort unsigned int v_cols;\n\tshort unsigned int v_scrollsize;\n};\n\nstruct vt_spawn_console {\n\tspinlock_t lock;\n\tstruct pid *pid;\n\tint sig;\n};\n\nstruct vt_stat {\n\tshort unsigned int v_active;\n\tshort unsigned int v_signal;\n\tshort unsigned int v_state;\n};\n\nstruct vxlan_metadata {\n\tu32 gbp;\n};\n\nstruct wait_bit_key {\n\tvoid *flags;\n\tint bit_nr;\n\tlong unsigned int timeout;\n};\n\nstruct wait_bit_queue_entry {\n\tstruct wait_bit_key key;\n\tstruct wait_queue_entry wq_entry;\n};\n\nstruct wait_exceptional_entry_queue {\n\twait_queue_entry_t wait;\n\tstruct exceptional_entry_key key;\n};\n\nstruct wait_page_key {\n\tstruct folio *folio;\n\tint bit_nr;\n\tint page_match;\n};\n\nstruct wake_irq {\n\tstruct device *dev;\n\tunsigned int status;\n\tint irq;\n\tconst char *name;\n};\n\nstruct wakelock {\n\tchar *name;\n\tstruct rb_node node;\n\tstruct wakeup_source *ws;\n\tstruct list_head lru;\n};\n\nstruct wakeup_header {\n\tu16 video_mode;\n\tu32 pmode_entry;\n\tu16 pmode_cs;\n\tu32 pmode_cr0;\n\tu32 pmode_cr3;\n\tu32 pmode_cr4;\n\tu32 pmode_efer_low;\n\tu32 pmode_efer_high;\n\tu64 pmode_gdt;\n\tu32 pmode_misc_en_low;\n\tu32 pmode_misc_en_high;\n\tu32 pmode_behavior;\n\tu32 realmode_flags;\n\tu32 real_magic;\n\tu32 signature;\n} __attribute__((packed));\n\nstruct wakeup_source {\n\tconst char *name;\n\tint id;\n\tstruct list_head entry;\n\tspinlock_t lock;\n\tstruct wake_irq *wakeirq;\n\tstruct timer_list timer;\n\tlong unsigned int timer_expires;\n\tktime_t total_time;\n\tktime_t max_time;\n\tktime_t last_time;\n\tktime_t start_prevent_time;\n\tktime_t prevent_sleep_time;\n\tlong unsigned int event_count;\n\tlong unsigned int active_count;\n\tlong unsigned int relax_count;\n\tlong unsigned int expire_count;\n\tlong unsigned int wakeup_count;\n\tstruct device *dev;\n\tbool active: 1;\n\tbool autosleep_enabled: 1;\n};\n\nstruct walk_rcec_data {\n\tstruct pci_dev *rcec;\n\tint (*user_callback)(struct pci_dev *, void *);\n\tvoid *user_data;\n};\n\nstruct warn_args {\n\tconst char *fmt;\n\tva_list args;\n};\n\nstruct watch {\n\tunion {\n\t\tstruct callback_head rcu;\n\t\tu32 info_id;\n\t};\n\tstruct watch_queue *queue;\n\tstruct hlist_node queue_node;\n\tstruct watch_list *watch_list;\n\tstruct hlist_node list_node;\n\tconst struct cred *cred;\n\tvoid *private;\n\tu64 id;\n\tstruct kref usage;\n};\n\nstruct xenbus_watch {\n\tstruct list_head list;\n\tconst char *node;\n\tunsigned int nr_pending;\n\tbool (*will_handle)(struct xenbus_watch *, const char *, const char *);\n\tvoid (*callback)(struct xenbus_watch *, const char *, const char *);\n};\n\nstruct xenbus_file_priv;\n\nstruct watch_adapter {\n\tstruct list_head list;\n\tstruct xenbus_watch watch;\n\tstruct xenbus_file_priv *dev_data;\n\tchar *token;\n};\n\nstruct watch_type_filter {\n\tenum watch_notification_type type;\n\t__u32 subtype_filter[1];\n\t__u32 info_filter;\n\t__u32 info_mask;\n};\n\nstruct watch_filter {\n\tunion {\n\t\tstruct callback_head rcu;\n\t\tlong unsigned int type_filter[1];\n\t};\n\tu32 nr_filters;\n\tstruct watch_type_filter filters[0];\n};\n\nstruct watch_list {\n\tstruct callback_head rcu;\n\tstruct hlist_head watchers;\n\tvoid (*release_watch)(struct watch *);\n\tspinlock_t lock;\n};\n\nstruct watch_notification_type_filter {\n\t__u32 type;\n\t__u32 info_filter;\n\t__u32 info_mask;\n\t__u32 subtype_filter[8];\n};\n\nstruct watch_notification_filter {\n\t__u32 nr_filters;\n\t__u32 __reserved;\n\tstruct watch_notification_type_filter filters[0];\n};\n\nstruct watch_notification_removal {\n\tstruct watch_notification watch;\n\t__u64 id;\n};\n\nstruct watch_queue {\n\tstruct callback_head rcu;\n\tstruct watch_filter *filter;\n\tstruct pipe_inode_info *pipe;\n\tstruct hlist_head watches;\n\tstruct page **notes;\n\tlong unsigned int *notes_bitmap;\n\tstruct kref usage;\n\tspinlock_t lock;\n\tunsigned int nr_notes;\n\tunsigned int nr_pages;\n};\n\nstruct watchdog_device;\n\nstruct watchdog_core_data {\n\tstruct device dev;\n\tstruct cdev cdev;\n\tstruct watchdog_device *wdd;\n\tstruct mutex lock;\n\tktime_t last_keepalive;\n\tktime_t last_hw_keepalive;\n\tktime_t open_deadline;\n\tstruct hrtimer timer;\n\tstruct kthread_work work;\n\tlong unsigned int status;\n};\n\nstruct watchdog_info;\n\nstruct watchdog_ops;\n\nstruct watchdog_device {\n\tint id;\n\tstruct device *parent;\n\tconst struct attribute_group **groups;\n\tconst struct watchdog_info *info;\n\tconst struct watchdog_ops *ops;\n\tconst struct watchdog_governor *gov;\n\tunsigned int bootstatus;\n\tunsigned int timeout;\n\tunsigned int pretimeout;\n\tunsigned int min_timeout;\n\tunsigned int max_timeout;\n\tunsigned int min_hw_heartbeat_ms;\n\tunsigned int max_hw_heartbeat_ms;\n\tstruct notifier_block reboot_nb;\n\tstruct notifier_block restart_nb;\n\tstruct notifier_block pm_nb;\n\tvoid *driver_data;\n\tstruct watchdog_core_data *wd_data;\n\tlong unsigned int status;\n\tstruct list_head deferred;\n};\n\nstruct watchdog_governor {\n\tconst char name[20];\n\tvoid (*pretimeout)(struct watchdog_device *);\n};\n\nstruct watchdog_info {\n\t__u32 options;\n\t__u32 firmware_version;\n\t__u8 identity[32];\n};\n\nstruct watchdog_ops {\n\tstruct module *owner;\n\tint (*start)(struct watchdog_device *);\n\tint (*stop)(struct watchdog_device *);\n\tint (*ping)(struct watchdog_device *);\n\tunsigned int (*status)(struct watchdog_device *);\n\tint (*set_timeout)(struct watchdog_device *, unsigned int);\n\tint (*set_pretimeout)(struct watchdog_device *, unsigned int);\n\tunsigned int (*get_timeleft)(struct watchdog_device *);\n\tint (*restart)(struct watchdog_device *, long unsigned int, void *);\n\tlong int (*ioctl)(struct watchdog_device *, unsigned int, long unsigned int);\n};\n\nstruct watchdog_pretimeout {\n\tstruct watchdog_device *wdd;\n\tstruct list_head entry;\n};\n\nstruct wb_lock_cookie {\n\tbool locked;\n\tlong unsigned int flags;\n};\n\nstruct wb_stats {\n\tlong unsigned int nr_dirty;\n\tlong unsigned int nr_io;\n\tlong unsigned int nr_more_io;\n\tlong unsigned int nr_dirty_time;\n\tlong unsigned int nr_writeback;\n\tlong unsigned int nr_reclaimable;\n\tlong unsigned int nr_dirtied;\n\tlong unsigned int nr_written;\n\tlong unsigned int dirty_thresh;\n\tlong unsigned int wb_thresh;\n};\n\nstruct wb_writeback_work {\n\tlong int nr_pages;\n\tstruct super_block *sb;\n\tenum writeback_sync_modes sync_mode;\n\tunsigned int tagged_writepages: 1;\n\tunsigned int for_kupdate: 1;\n\tunsigned int range_cyclic: 1;\n\tunsigned int for_background: 1;\n\tunsigned int for_sync: 1;\n\tunsigned int auto_free: 1;\n\tenum wb_reason reason;\n\tstruct list_head list;\n\tstruct wb_completion *done;\n};\n\nstruct wbrf_ranges_in_out {\n\tu64 num_of_ranges;\n\tstruct freq_band_range band_list[11];\n};\n\nstruct wbt_wait_data {\n\tstruct rq_wb *rwb;\n\tenum wbt_flags wb_acct;\n\tblk_opf_t opf;\n};\n\nstruct wci_ent {\n\twork_func_t func;\n\tatomic64_t cnt;\n\tstruct hlist_node hash_node;\n};\n\nstruct win_certificate {\n\tuint32_t length;\n\tuint16_t revision;\n\tuint16_t cert_type;\n};\n\nstruct wiphy_iftype_akm_suites;\n\nstruct wiphy_wowlan_support;\n\nstruct wiphy_iftype_ext_capab;\n\nstruct wiphy_coalesce_support;\n\nstruct wiphy_vendor_command;\n\nstruct wiphy_radio;\n\nstruct wiphy {\n\tstruct mutex mtx;\n\tu8 perm_addr[6];\n\tu8 addr_mask[6];\n\tstruct mac_address *addresses;\n\tconst struct ieee80211_txrx_stypes *mgmt_stypes;\n\tconst struct ieee80211_iface_combination *iface_combinations;\n\tint n_iface_combinations;\n\tu16 software_iftypes;\n\tu16 n_addresses;\n\tu16 interface_modes;\n\tu16 max_acl_mac_addrs;\n\tu32 flags;\n\tu32 regulatory_flags;\n\tu32 features;\n\tu8 ext_features[9];\n\tu32 ap_sme_capa;\n\tenum cfg80211_signal_type signal_type;\n\tint bss_priv_size;\n\tu8 max_scan_ssids;\n\tu8 max_sched_scan_reqs;\n\tu8 max_sched_scan_ssids;\n\tu8 max_match_sets;\n\tu16 max_scan_ie_len;\n\tu16 max_sched_scan_ie_len;\n\tu32 max_sched_scan_plans;\n\tu32 max_sched_scan_plan_interval;\n\tu32 max_sched_scan_plan_iterations;\n\tint n_cipher_suites;\n\tconst u32 *cipher_suites;\n\tint n_akm_suites;\n\tconst u32 *akm_suites;\n\tconst struct wiphy_iftype_akm_suites *iftype_akm_suites;\n\tunsigned int num_iftype_akm_suites;\n\tu8 retry_short;\n\tu8 retry_long;\n\tu32 frag_threshold;\n\tu32 rts_threshold;\n\tu8 coverage_class;\n\tchar fw_version[32];\n\tu32 hw_version;\n\tconst struct wiphy_wowlan_support *wowlan;\n\tstruct cfg80211_wowlan *wowlan_config;\n\tu16 max_remain_on_channel_duration;\n\tu8 max_num_pmkids;\n\tu32 available_antennas_tx;\n\tu32 available_antennas_rx;\n\tu32 probe_resp_offload;\n\tconst u8 *extended_capabilities;\n\tconst u8 *extended_capabilities_mask;\n\tu8 extended_capabilities_len;\n\tconst struct wiphy_iftype_ext_capab *iftype_ext_capab;\n\tunsigned int num_iftype_ext_capab;\n\tconst void *privid;\n\tstruct ieee80211_supported_band *bands[6];\n\tvoid (*reg_notifier)(struct wiphy *, struct regulatory_request *);\n\tconst struct ieee80211_regdomain *regd;\n\tstruct device dev;\n\tbool registered;\n\tstruct dentry *debugfsdir;\n\tconst struct ieee80211_ht_cap *ht_capa_mod_mask;\n\tconst struct ieee80211_vht_cap *vht_capa_mod_mask;\n\tstruct list_head wdev_list;\n\tpossible_net_t _net;\n\tconst struct iw_handler_def *wext;\n\tconst struct wiphy_coalesce_support *coalesce;\n\tconst struct wiphy_vendor_command *vendor_commands;\n\tconst struct nl80211_vendor_cmd_info *vendor_events;\n\tint n_vendor_commands;\n\tint n_vendor_events;\n\tu16 max_ap_assoc_sta;\n\tu8 max_num_csa_counters;\n\tu32 bss_select_support;\n\tu8 nan_supported_bands;\n\tu32 txq_limit;\n\tu32 txq_memory_limit;\n\tu32 txq_quantum;\n\tlong unsigned int tx_queue_len;\n\tu8 support_mbssid: 1;\n\tu8 support_only_he_mbssid: 1;\n\tconst struct cfg80211_pmsr_capabilities *pmsr_capa;\n\tstruct {\n\t\tu64 peer;\n\t\tu64 vif;\n\t\tu8 max_retry;\n\t} tid_config_support;\n\tu8 max_data_retry_count;\n\tconst struct cfg80211_sar_capa *sar_capa;\n\tstruct rfkill *rfkill;\n\tu8 mbssid_max_interfaces;\n\tu8 ema_max_profile_periodicity;\n\tu16 max_num_akm_suites;\n\tu16 hw_timestamp_max_peers;\n\tint n_radio;\n\tconst struct wiphy_radio *radio;\n\tlong: 64;\n\tlong: 64;\n\tchar priv[0];\n};\n\nstruct wiphy_coalesce_support {\n\tint n_rules;\n\tint max_delay;\n\tint n_patterns;\n\tint pattern_max_len;\n\tint pattern_min_len;\n\tint max_pkt_offset;\n};\n\nstruct wiphy_iftype_akm_suites {\n\tu16 iftypes_mask;\n\tconst u32 *akm_suites;\n\tint n_akm_suites;\n};\n\nstruct wiphy_iftype_ext_capab {\n\tenum nl80211_iftype iftype;\n\tconst u8 *extended_capabilities;\n\tconst u8 *extended_capabilities_mask;\n\tu8 extended_capabilities_len;\n\tu16 eml_capabilities;\n\tu16 mld_capa_and_ops;\n};\n\nstruct wiphy_radio_freq_range;\n\nstruct wiphy_radio {\n\tconst struct wiphy_radio_freq_range *freq_range;\n\tint n_freq_range;\n\tconst struct ieee80211_iface_combination *iface_combinations;\n\tint n_iface_combinations;\n};\n\nstruct wiphy_radio_freq_range {\n\tu32 start_freq;\n\tu32 end_freq;\n};\n\nstruct wiphy_vendor_command {\n\tstruct nl80211_vendor_cmd_info info;\n\tu32 flags;\n\tint (*doit)(struct wiphy *, struct wireless_dev *, const void *, int);\n\tint (*dumpit)(struct wiphy *, struct wireless_dev *, struct sk_buff *, const void *, int, long unsigned int *);\n\tconst struct nla_policy *policy;\n\tunsigned int maxattr;\n};\n\nstruct wiphy_work;\n\ntypedef void (*wiphy_work_func_t)(struct wiphy *, struct wiphy_work *);\n\nstruct wiphy_work {\n\tstruct list_head entry;\n\twiphy_work_func_t func;\n};\n\nstruct wiphy_wowlan_tcp_support;\n\nstruct wiphy_wowlan_support {\n\tu32 flags;\n\tint n_patterns;\n\tint pattern_max_len;\n\tint pattern_min_len;\n\tint max_pkt_offset;\n\tint max_nd_match_sets;\n\tconst struct wiphy_wowlan_tcp_support *tcp;\n};\n\nstruct wiphy_wowlan_tcp_support {\n\tconst struct nl80211_wowlan_tcp_data_token_feature *tok;\n\tu32 data_payload_max;\n\tu32 data_interval_max;\n\tu32 wake_payload_max;\n\tbool seq;\n};\n\nstruct cfg80211_conn;\n\nstruct cfg80211_cached_keys;\n\nstruct cfg80211_cqm_config;\n\nstruct cfg80211_internal_bss;\n\nstruct wireless_dev {\n\tstruct wiphy *wiphy;\n\tenum nl80211_iftype iftype;\n\tstruct list_head list;\n\tstruct net_device *netdev;\n\tu32 identifier;\n\tstruct list_head mgmt_registrations;\n\tu8 mgmt_registrations_need_update: 1;\n\tbool use_4addr;\n\tbool is_running;\n\tbool registered;\n\tbool registering;\n\tshort: 0;\n\tu8 address[6];\n\tstruct cfg80211_conn *conn;\n\tstruct cfg80211_cached_keys *connect_keys;\n\tenum ieee80211_bss_type conn_bss_type;\n\tu32 conn_owner_nlportid;\n\tstruct work_struct disconnect_wk;\n\tu8 disconnect_bssid[6];\n\tstruct list_head event_list;\n\tspinlock_t event_lock;\n\tu8 connected: 1;\n\tbool ps;\n\tint ps_timeout;\n\tu32 ap_unexpected_nlportid;\n\tu32 owner_nlportid;\n\tbool nl_owner_dead;\n\tbool cac_started;\n\tlong unsigned int cac_start_time;\n\tunsigned int cac_time_ms;\n\tstruct {\n\t\tstruct cfg80211_ibss_params ibss;\n\t\tstruct cfg80211_connect_params connect;\n\t\tstruct cfg80211_cached_keys *keys;\n\t\tconst u8 *ie;\n\t\tsize_t ie_len;\n\t\tu8 bssid[6];\n\t\tu8 prev_bssid[6];\n\t\tu8 ssid[32];\n\t\ts8 default_key;\n\t\ts8 default_mgmt_key;\n\t\tbool prev_bssid_valid;\n\t} wext;\n\tstruct wiphy_work cqm_rssi_work;\n\tstruct cfg80211_cqm_config *cqm_config;\n\tstruct list_head pmsr_list;\n\tspinlock_t pmsr_lock;\n\tstruct work_struct pmsr_free_wk;\n\tlong unsigned int unprot_beacon_reported;\n\tunion {\n\t\tstruct {\n\t\t\tu8 connected_addr[6];\n\t\t\tu8 ssid[32];\n\t\t\tu8 ssid_len;\n\t\t\tlong: 0;\n\t\t} client;\n\t\tstruct {\n\t\t\tint beacon_interval;\n\t\t\tstruct cfg80211_chan_def preset_chandef;\n\t\t\tstruct cfg80211_chan_def chandef;\n\t\t\tu8 id[32];\n\t\t\tu8 id_len;\n\t\t\tu8 id_up_len;\n\t\t} mesh;\n\t\tstruct {\n\t\t\tstruct cfg80211_chan_def preset_chandef;\n\t\t\tu8 ssid[32];\n\t\t\tu8 ssid_len;\n\t\t} ap;\n\t\tstruct {\n\t\t\tstruct cfg80211_internal_bss *current_bss;\n\t\t\tstruct cfg80211_chan_def chandef;\n\t\t\tint beacon_interval;\n\t\t\tu8 ssid[32];\n\t\t\tu8 ssid_len;\n\t\t} ibss;\n\t\tstruct {\n\t\t\tstruct cfg80211_chan_def chandef;\n\t\t} ocb;\n\t} u;\n\tstruct {\n\t\tu8 addr[6];\n\t\tunion {\n\t\t\tstruct {\n\t\t\t\tunsigned int beacon_interval;\n\t\t\t\tstruct cfg80211_chan_def chandef;\n\t\t\t} ap;\n\t\t\tstruct {\n\t\t\t\tstruct cfg80211_internal_bss *current_bss;\n\t\t\t} client;\n\t\t};\n\t} links[15];\n\tu16 valid_links;\n};\n\nstruct wm831x;\n\nstruct wm831x_backlight_pdata;\n\nstruct wm831x_backup_pdata;\n\nstruct wm831x_battery_pdata;\n\nstruct wm831x_touch_pdata;\n\nstruct wm831x_watchdog_pdata;\n\nstruct wm831x_status_pdata;\n\nstruct wm831x_pdata {\n\tint wm831x_num;\n\tint (*pre_init)(struct wm831x *);\n\tint (*post_init)(struct wm831x *);\n\tbool irq_cmos;\n\tbool disable_touch;\n\tbool soft_shutdown;\n\tint irq_base;\n\tint gpio_base;\n\tint gpio_defaults[16];\n\tstruct wm831x_backlight_pdata *backlight;\n\tstruct wm831x_backup_pdata *backup;\n\tstruct wm831x_battery_pdata *battery;\n\tstruct wm831x_touch_pdata *touch;\n\tstruct wm831x_watchdog_pdata *watchdog;\n\tstruct wm831x_status_pdata *status[2];\n\tstruct regulator_init_data *dcdc[4];\n\tstruct regulator_init_data *epe[2];\n\tstruct regulator_init_data *ldo[11];\n\tstruct regulator_init_data *isink[2];\n};\n\ntypedef int (*wm831x_auxadc_read_fn)(struct wm831x *, enum wm831x_auxadc);\n\nstruct wm831x {\n\tstruct mutex io_lock;\n\tstruct device *dev;\n\tstruct regmap *regmap;\n\tstruct wm831x_pdata pdata;\n\tenum wm831x_parent type;\n\tint irq;\n\tstruct mutex irq_lock;\n\tstruct irq_domain *irq_domain;\n\tint irq_masks_cur[5];\n\tint irq_masks_cache[5];\n\tbool soft_shutdown;\n\tunsigned int has_gpio_ena: 1;\n\tunsigned int has_cs_sts: 1;\n\tunsigned int charger_irq_wake: 1;\n\tint num_gpio;\n\tint gpio_update[16];\n\tbool gpio_level_high[16];\n\tbool gpio_level_low[16];\n\tstruct mutex auxadc_lock;\n\tstruct list_head auxadc_pending;\n\tu16 auxadc_active;\n\twm831x_auxadc_read_fn auxadc_read;\n\tstruct mutex key_lock;\n\tunsigned int locked: 1;\n};\n\nstruct wm831x_auxadc_req {\n\tstruct list_head list;\n\tenum wm831x_auxadc input;\n\tint val;\n\tstruct completion done;\n};\n\nstruct wm831x_backlight_pdata {\n\tint isink;\n\tint max_uA;\n};\n\nstruct wm831x_backup_pdata {\n\tint charger_enable;\n\tint no_constant_voltage;\n\tint vlim;\n\tint ilim;\n};\n\nstruct wm831x_battery_pdata {\n\tint enable;\n\tint fast_enable;\n\tint off_mask;\n\tint trickle_ilim;\n\tint vsel;\n\tint eoc_iterm;\n\tint fast_ilim;\n\tint timeout;\n};\n\nstruct wm831x_irq_data {\n\tint primary;\n\tint reg;\n\tint mask;\n};\n\nstruct wm831x_status_pdata {\n\tenum wm831x_status_src default_src;\n\tconst char *name;\n\tconst char *default_trigger;\n};\n\nstruct wm831x_touch_pdata {\n\tint fivewire;\n\tint isel;\n\tint rpu;\n\tint pressure;\n\tunsigned int data_irq;\n\tint data_irqf;\n\tunsigned int pd_irq;\n\tint pd_irqf;\n};\n\nstruct wm831x_watchdog_pdata {\n\tenum wm831x_watchdog_action primary;\n\tenum wm831x_watchdog_action secondary;\n\tunsigned int software: 1;\n};\n\nstruct wm8350_audio_platform_data;\n\nstruct wm8350_codec {\n\tstruct platform_device *pdev;\n\tstruct wm8350_audio_platform_data *platform_data;\n};\n\nstruct wm8350_gpio {\n\tstruct platform_device *pdev;\n};\n\nstruct wm8350_hwmon {\n\tstruct platform_device *pdev;\n\tstruct device *classdev;\n};\n\nstruct wm8350_led {\n\tstruct platform_device *pdev;\n\tstruct work_struct work;\n\tspinlock_t value_lock;\n\tenum led_brightness value;\n\tstruct led_classdev cdev;\n\tint max_uA_index;\n\tint enabled;\n\tstruct regulator *isink;\n\tstruct regulator_consumer_supply isink_consumer;\n\tstruct regulator_init_data isink_init;\n\tstruct regulator *dcdc;\n\tstruct regulator_consumer_supply dcdc_consumer;\n\tstruct regulator_init_data dcdc_init;\n};\n\nstruct wm8350_pmic {\n\tint max_dcdc;\n\tint max_isink;\n\tint isink_A_dcdc;\n\tint isink_B_dcdc;\n\tu16 dcdc1_hib_mode;\n\tu16 dcdc3_hib_mode;\n\tu16 dcdc4_hib_mode;\n\tu16 dcdc6_hib_mode;\n\tstruct platform_device *pdev[12];\n\tstruct wm8350_led led[2];\n};\n\nstruct wm8350_charger_policy;\n\nstruct wm8350_power {\n\tstruct platform_device *pdev;\n\tstruct power_supply *battery;\n\tstruct power_supply *usb;\n\tstruct power_supply *ac;\n\tstruct wm8350_charger_policy *policy;\n\tint rev_g_coeff;\n};\n\nstruct wm8350_rtc {\n\tstruct platform_device *pdev;\n\tstruct rtc_device *rtc;\n\tint alarm_enabled;\n\tint update_enabled;\n};\n\nstruct wm8350_wdt {\n\tstruct platform_device *pdev;\n};\n\nstruct wm8350 {\n\tstruct device *dev;\n\tstruct regmap *regmap;\n\tbool unlocked;\n\tstruct mutex auxadc_mutex;\n\tstruct completion auxadc_done;\n\tstruct mutex irq_lock;\n\tint chip_irq;\n\tint irq_base;\n\tu16 irq_masks[7];\n\tstruct wm8350_codec codec;\n\tstruct wm8350_gpio gpio;\n\tstruct wm8350_hwmon hwmon;\n\tstruct wm8350_pmic pmic;\n\tstruct wm8350_power power;\n\tstruct wm8350_rtc rtc;\n\tstruct wm8350_wdt wdt;\n};\n\nstruct wm8350_audio_platform_data {\n\tint vmid_discharge_msecs;\n\tint drain_msecs;\n\tint cap_discharge_msecs;\n\tint vmid_charge_msecs;\n\tu32 vmid_s_curve: 2;\n\tu32 dis_out4: 2;\n\tu32 dis_out3: 2;\n\tu32 dis_out2: 2;\n\tu32 dis_out1: 2;\n\tu32 vroi_out4: 1;\n\tu32 vroi_out3: 1;\n\tu32 vroi_out2: 1;\n\tu32 vroi_out1: 1;\n\tu32 vroi_enable: 1;\n\tu32 codec_current_on: 2;\n\tu32 codec_current_standby: 2;\n\tu32 codec_current_charge: 2;\n};\n\nstruct wm8350_charger_policy {\n\tint eoc_mA;\n\tint charge_mV;\n\tint fast_limit_mA;\n\tint fast_limit_USB_mA;\n\tint charge_timeout;\n\tint trickle_start_mV;\n\tint trickle_charge_mA;\n\tint trickle_charge_USB_mA;\n};\n\nstruct wm8350_irq_data {\n\tint primary;\n\tint reg;\n\tint mask;\n\tint primary_only;\n};\n\nstruct wm8350_platform_data {\n\tint (*init)(struct wm8350 *);\n\tint irq_high;\n\tint irq_base;\n\tint gpio_base;\n};\n\nstruct wm8350_reg_access {\n\tu16 readable;\n\tu16 writable;\n\tu16 vol;\n};\n\nstruct wm8400 {\n\tstruct device *dev;\n\tstruct regmap *regmap;\n\tstruct platform_device regulators[6];\n};\n\nstruct wm8400_platform_data {\n\tint (*platform_init)(struct device *);\n};\n\nstruct wol_reply_data {\n\tstruct ethnl_reply_data base;\n\tstruct ethtool_wolinfo wol;\n\tbool show_sopass;\n};\n\nstruct word_at_a_time {\n\tconst long unsigned int one_bits;\n\tconst long unsigned int high_bits;\n};\n\nstruct work_for_cpu {\n\tstruct work_struct work;\n\tlong int (*fn)(void *);\n\tvoid *arg;\n\tlong int ret;\n};\n\nstruct work_offq_data {\n\tu32 pool_id;\n\tu32 disable;\n\tu32 flags;\n};\n\nstruct worker {\n\tunion {\n\t\tstruct list_head entry;\n\t\tstruct hlist_node hentry;\n\t};\n\tstruct work_struct *current_work;\n\twork_func_t current_func;\n\tstruct pool_workqueue *current_pwq;\n\tu64 current_at;\n\tunsigned int current_color;\n\tint sleeping;\n\twork_func_t last_func;\n\tstruct list_head scheduled;\n\tstruct task_struct *task;\n\tstruct worker_pool *pool;\n\tstruct list_head node;\n\tlong unsigned int last_active;\n\tunsigned int flags;\n\tint id;\n\tchar desc[32];\n\tstruct workqueue_struct *rescue_wq;\n};\n\nstruct worker_pool {\n\traw_spinlock_t lock;\n\tint cpu;\n\tint node;\n\tint id;\n\tunsigned int flags;\n\tlong unsigned int watchdog_ts;\n\tbool cpu_stall;\n\tint nr_running;\n\tstruct list_head worklist;\n\tint nr_workers;\n\tint nr_idle;\n\tstruct list_head idle_list;\n\tstruct timer_list idle_timer;\n\tstruct work_struct idle_cull_work;\n\tstruct timer_list mayday_timer;\n\tstruct hlist_head busy_hash[64];\n\tstruct worker *manager;\n\tstruct list_head workers;\n\tstruct ida worker_ida;\n\tstruct workqueue_attrs *attrs;\n\tstruct hlist_node hash_node;\n\tint refcnt;\n\tstruct callback_head rcu;\n};\n\nstruct workqueue_attrs {\n\tint nice;\n\tcpumask_var_t cpumask;\n\tcpumask_var_t __pod_cpumask;\n\tbool affn_strict;\n\tenum wq_affn_scope affn_scope;\n\tbool ordered;\n};\n\nstruct wq_flusher;\n\nstruct wq_device;\n\nstruct wq_node_nr_active;\n\nstruct workqueue_struct {\n\tstruct list_head pwqs;\n\tstruct list_head list;\n\tstruct mutex mutex;\n\tint work_color;\n\tint flush_color;\n\tatomic_t nr_pwqs_to_flush;\n\tstruct wq_flusher *first_flusher;\n\tstruct list_head flusher_queue;\n\tstruct list_head flusher_overflow;\n\tstruct list_head maydays;\n\tstruct worker *rescuer;\n\tint nr_drainers;\n\tint max_active;\n\tint min_active;\n\tint saved_max_active;\n\tint saved_min_active;\n\tstruct workqueue_attrs *unbound_attrs;\n\tstruct pool_workqueue *dfl_pwq;\n\tstruct wq_device *wq_dev;\n\tchar name[32];\n\tstruct callback_head rcu;\n\tlong: 64;\n\tlong: 64;\n\tunsigned int flags;\n\tstruct pool_workqueue **cpu_pwq;\n\tstruct wq_node_nr_active *node_nr_active[0];\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct workspace {\n\tvoid *mem;\n\tsize_t mem_size;\n\tsize_t window_size;\n};\n\nstruct wpan_phy;\n\nstruct wpan_dev_header_ops;\n\nstruct wpan_dev {\n\tstruct wpan_phy *wpan_phy;\n\tint iftype;\n\tstruct list_head list;\n\tstruct net_device *netdev;\n\tconst struct wpan_dev_header_ops *header_ops;\n\tstruct net_device *lowpan_dev;\n\tu32 identifier;\n\t__le16 pan_id;\n\t__le16 short_addr;\n\t__le64 extended_addr;\n\tatomic_t bsn;\n\tatomic_t dsn;\n\tu8 min_be;\n\tu8 max_be;\n\tu8 csma_retries;\n\ts8 frame_retries;\n\tbool lbt;\n\tbool ackreq;\n\tstruct mutex association_lock;\n\tstruct ieee802154_pan_device *parent;\n\tstruct list_head children;\n\tunsigned int max_associations;\n\tunsigned int nchildren;\n};\n\nstruct wpan_dev_header_ops {\n\tint (*create)(struct sk_buff *, struct net_device *, const struct ieee802154_addr *, const struct ieee802154_addr *, unsigned int);\n};\n\nstruct wpan_phy_supported {\n\tu32 channels[32];\n\tu32 cca_modes;\n\tu32 cca_opts;\n\tu32 iftypes;\n\tenum nl802154_supported_bool_states lbt;\n\tu8 min_minbe;\n\tu8 max_minbe;\n\tu8 min_maxbe;\n\tu8 max_maxbe;\n\tu8 min_csma_backoffs;\n\tu8 max_csma_backoffs;\n\ts8 min_frame_retries;\n\ts8 max_frame_retries;\n\tsize_t tx_powers_size;\n\tsize_t cca_ed_levels_size;\n\tconst s32 *tx_powers;\n\tconst s32 *cca_ed_levels;\n};\n\nstruct wpan_phy_cca {\n\tenum nl802154_cca_modes mode;\n\tenum nl802154_cca_opts opt;\n};\n\nstruct wpan_phy {\n\tconst void *privid;\n\tlong unsigned int flags;\n\tu8 current_channel;\n\tu8 current_page;\n\tstruct wpan_phy_supported supported;\n\ts32 transmit_power;\n\tstruct wpan_phy_cca cca;\n\t__le64 perm_extended_addr;\n\ts32 cca_ed_level;\n\tu32 symbol_duration;\n\tu16 lifs_period;\n\tu16 sifs_period;\n\tstruct device dev;\n\tpossible_net_t _net;\n\tspinlock_t queue_lock;\n\tatomic_t ongoing_txs;\n\tatomic_t hold_txs;\n\twait_queue_head_t sync_txq;\n\tenum ieee802154_filtering_level filtering;\n\tlong: 64;\n\tlong: 64;\n\tchar priv[0];\n};\n\nstruct wq_barrier {\n\tstruct work_struct work;\n\tstruct completion done;\n\tstruct task_struct *task;\n};\n\nstruct wq_device {\n\tstruct workqueue_struct *wq;\n\tstruct device dev;\n};\n\nstruct wq_drain_dead_softirq_work {\n\tstruct work_struct work;\n\tstruct worker_pool *pool;\n\tstruct completion done;\n};\n\nstruct wq_flusher {\n\tstruct list_head list;\n\tint flush_color;\n\tstruct completion done;\n};\n\nstruct wq_node_nr_active {\n\tint max;\n\tatomic_t nr;\n\traw_spinlock_t lock;\n\tstruct list_head pending_pwqs;\n};\n\nstruct wq_pod_type {\n\tint nr_pods;\n\tcpumask_var_t *pod_cpus;\n\tint *pod_node;\n\tint *cpu_pod;\n};\n\ntypedef void (*swap_func_t)(void *, void *, int);\n\nstruct wrapper {\n\tcmp_func_t cmp;\n\tswap_func_t swap;\n};\n\nstruct wrapper_priv_data {\n\tstruct dwc2_hsotg *hsotg;\n};\n\nstruct writeback_control {\n\tlong int nr_to_write;\n\tlong int pages_skipped;\n\tloff_t range_start;\n\tloff_t range_end;\n\tenum writeback_sync_modes sync_mode;\n\tunsigned int for_kupdate: 1;\n\tunsigned int for_background: 1;\n\tunsigned int tagged_writepages: 1;\n\tunsigned int for_reclaim: 1;\n\tunsigned int range_cyclic: 1;\n\tunsigned int for_sync: 1;\n\tunsigned int unpinned_netfs_wb: 1;\n\tunsigned int no_cgroup_owner: 1;\n\tstruct swap_iocb **swap_plug;\n\tstruct folio_batch fbatch;\n\tlong unsigned int index;\n\tint saved_err;\n\tstruct bdi_writeback *wb;\n\tstruct inode *inode;\n\tint wb_id;\n\tint wb_lcand_id;\n\tint wb_tcand_id;\n\tsize_t wb_bytes;\n\tsize_t wb_lcand_bytes;\n\tsize_t wb_tcand_bytes;\n};\n\nstruct writer {\n\tuint8_t *buffer;\n\tuint8_t previous_byte;\n\tsize_t buffer_pos;\n\tint bufsize;\n\tsize_t global_pos;\n\tlong int (*flush)(void *, long unsigned int);\n\tstruct lzma_header *header;\n};\n\nstruct ww_class {\n\tatomic_long_t stamp;\n\tstruct lock_class_key acquire_key;\n\tstruct lock_class_key mutex_key;\n\tconst char *acquire_name;\n\tconst char *mutex_name;\n\tunsigned int is_wait_die;\n};\n\nstruct x509_certificate {\n\tstruct x509_certificate *next;\n\tstruct x509_certificate *signer;\n\tstruct public_key *pub;\n\tstruct public_key_signature *sig;\n\tchar *issuer;\n\tchar *subject;\n\tstruct asymmetric_key_id *id;\n\tstruct asymmetric_key_id *skid;\n\ttime64_t valid_from;\n\ttime64_t valid_to;\n\tconst void *tbs;\n\tunsigned int tbs_size;\n\tunsigned int raw_sig_size;\n\tconst void *raw_sig;\n\tconst void *raw_serial;\n\tunsigned int raw_serial_size;\n\tunsigned int raw_issuer_size;\n\tconst void *raw_issuer;\n\tconst void *raw_subject;\n\tunsigned int raw_subject_size;\n\tunsigned int raw_skid_size;\n\tconst void *raw_skid;\n\tunsigned int index;\n\tbool seen;\n\tbool verified;\n\tbool self_signed;\n\tbool unsupported_sig;\n\tbool blacklisted;\n};\n\nstruct x509_parse_context {\n\tstruct x509_certificate *cert;\n\tlong unsigned int data;\n\tconst void *key;\n\tsize_t key_size;\n\tconst void *params;\n\tsize_t params_size;\n\tenum OID key_algo;\n\tenum OID last_oid;\n\tenum OID sig_algo;\n\tu8 o_size;\n\tu8 cn_size;\n\tu8 email_size;\n\tu16 o_offset;\n\tu16 cn_offset;\n\tu16 email_offset;\n\tunsigned int raw_akid_size;\n\tconst void *raw_akid;\n\tconst void *akid_raw_issuer;\n\tunsigned int akid_raw_issuer_size;\n};\n\nstruct x64_jit_data {\n\tstruct bpf_binary_header *rw_header;\n\tstruct bpf_binary_header *header;\n\tint *addrs;\n\tu8 *image;\n\tint proglen;\n\tstruct jit_context ctx;\n};\n\nstruct x86_apic_ops {\n\tunsigned int (*io_apic_read)(unsigned int, unsigned int);\n\tvoid (*restore)(void);\n};\n\nstruct x86_cpu_desc {\n\tu8 x86_family;\n\tu8 x86_vendor;\n\tu8 x86_model;\n\tu8 x86_stepping;\n\tu32 x86_microcode_rev;\n};\n\nstruct x86_cpuinit_ops {\n\tvoid (*setup_percpu_clockev)(void);\n\tvoid (*early_percpu_clock_init)(void);\n\tvoid (*fixup_cpu_id)(struct cpuinfo_x86 *, int);\n\tbool parallel_bringup;\n};\n\nstruct x86_guest {\n\tint (*enc_status_change_prepare)(long unsigned int, int, bool);\n\tint (*enc_status_change_finish)(long unsigned int, int, bool);\n\tbool (*enc_tlb_flush_required)(bool);\n\tbool (*enc_cache_flush_required)(void);\n\tvoid (*enc_kexec_begin)(void);\n\tvoid (*enc_kexec_finish)(void);\n};\n\nstruct x86_hybrid_pmu {\n\tstruct pmu pmu;\n\tconst char *name;\n\tenum hybrid_pmu_type pmu_type;\n\tcpumask_t supported_cpus;\n\tunion perf_capabilities intel_cap;\n\tu64 intel_ctrl;\n\tu64 pebs_events_mask;\n\tu64 config_mask;\n\tunion {\n\t\tu64 cntr_mask64;\n\t\tlong unsigned int cntr_mask[1];\n\t};\n\tunion {\n\t\tu64 fixed_cntr_mask64;\n\t\tlong unsigned int fixed_cntr_mask[1];\n\t};\n\tstruct event_constraint unconstrained;\n\tu64 hw_cache_event_ids[42];\n\tu64 hw_cache_extra_regs[42];\n\tstruct event_constraint *event_constraints;\n\tstruct event_constraint *pebs_constraints;\n\tstruct extra_reg *extra_regs;\n\tunsigned int late_ack: 1;\n\tunsigned int mid_ack: 1;\n\tunsigned int enabled_ack: 1;\n\tu64 pebs_data_source[256];\n};\n\nstruct x86_init_acpi {\n\tvoid (*set_root_pointer)(u64);\n\tu64 (*get_root_pointer)(void);\n\tvoid (*reduced_hw_early_init)(void);\n};\n\nstruct x86_init_iommu {\n\tint (*iommu_init)(void);\n};\n\nstruct x86_init_irqs {\n\tvoid (*pre_vector_init)(void);\n\tvoid (*intr_init)(void);\n\tvoid (*intr_mode_select)(void);\n\tvoid (*intr_mode_init)(void);\n\tstruct irq_domain * (*create_pci_msi_domain)(void);\n};\n\nstruct x86_init_mpparse {\n\tvoid (*setup_ioapic_ids)(void);\n\tvoid (*find_mptable)(void);\n\tvoid (*early_parse_smp_cfg)(void);\n\tvoid (*parse_smp_cfg)(void);\n};\n\nstruct x86_init_oem {\n\tvoid (*arch_setup)(void);\n\tvoid (*banner)(void);\n};\n\nstruct x86_init_resources {\n\tvoid (*probe_roms)(void);\n\tvoid (*reserve_resources)(void);\n\tchar * (*memory_setup)(void);\n\tvoid (*dmi_setup)(void);\n};\n\nstruct x86_init_paging {\n\tvoid (*pagetable_init)(void);\n};\n\nstruct x86_init_timers {\n\tvoid (*setup_percpu_clockev)(void);\n\tvoid (*timer_init)(void);\n\tvoid (*wallclock_init)(void);\n};\n\nstruct x86_init_pci {\n\tint (*arch_init)(void);\n\tint (*init)(void);\n\tvoid (*init_irq)(void);\n\tvoid (*fixup_irqs)(void);\n};\n\nstruct x86_init_ops {\n\tstruct x86_init_resources resources;\n\tstruct x86_init_mpparse mpparse;\n\tstruct x86_init_irqs irqs;\n\tstruct x86_init_oem oem;\n\tstruct x86_init_paging paging;\n\tstruct x86_init_timers timers;\n\tstruct x86_init_iommu iommu;\n\tstruct x86_init_pci pci;\n\tstruct x86_hyper_init hyper;\n\tstruct x86_init_acpi acpi;\n};\n\nstruct x86_legacy_devices {\n\tint pnpbios;\n};\n\nstruct x86_legacy_features {\n\tenum x86_legacy_i8042_state i8042;\n\tint rtc;\n\tint warm_reset;\n\tint no_vga;\n\tint reserve_bios_regions;\n\tstruct x86_legacy_devices devices;\n};\n\nstruct x86_mapping_info {\n\tvoid * (*alloc_pgt_page)(void *);\n\tvoid (*free_pgt_page)(void *, void *);\n\tvoid *context;\n\tlong unsigned int page_flag;\n\tlong unsigned int offset;\n\tbool direct_gbpages;\n\tlong unsigned int kernpg_flag;\n};\n\nstruct x86_perf_regs {\n\tstruct pt_regs regs;\n\tu64 *xmm_regs;\n};\n\nstruct x86_perf_task_context_opt {\n\tint lbr_callstack_users;\n\tint lbr_stack_state;\n\tint log_id;\n};\n\nstruct x86_perf_task_context {\n\tu64 lbr_sel;\n\tint tos;\n\tint valid_lbrs;\n\tstruct x86_perf_task_context_opt opt;\n\tstruct lbr_entry lbr[32];\n};\n\nstruct x86_perf_task_context_arch_lbr {\n\tstruct x86_perf_task_context_opt opt;\n\tstruct lbr_entry entries[0];\n};\n\nstruct x86_perf_task_context_arch_lbr_xsave {\n\tstruct x86_perf_task_context_opt opt;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tunion {\n\t\tstruct xregs_state xsave;\n\t\tstruct {\n\t\t\tstruct fxregs_state i387;\n\t\t\tstruct xstate_header header;\n\t\t\tstruct arch_lbr_state lbr;\n\t\t\tlong: 64;\n\t\t\tlong: 64;\n\t\t\tlong: 64;\n\t\t};\n\t};\n};\n\nstruct x86_platform_ops {\n\tlong unsigned int (*calibrate_cpu)(void);\n\tlong unsigned int (*calibrate_tsc)(void);\n\tvoid (*get_wallclock)(struct timespec64 *);\n\tint (*set_wallclock)(const struct timespec64 *);\n\tvoid (*iommu_shutdown)(void);\n\tbool (*is_untracked_pat_range)(u64, u64);\n\tvoid (*nmi_init)(void);\n\tunsigned char (*get_nmi_reason)(void);\n\tvoid (*save_sched_clock_state)(void);\n\tvoid (*restore_sched_clock_state)(void);\n\tvoid (*apic_post_init)(void);\n\tstruct x86_legacy_features legacy;\n\tvoid (*set_legacy_features)(void);\n\tvoid (*realmode_reserve)(void);\n\tvoid (*realmode_init)(void);\n\tstruct x86_hyper_runtime hyper;\n\tstruct x86_guest guest;\n};\n\nstruct x86_pmu_quirk;\n\nstruct x86_pmu {\n\tconst char *name;\n\tint version;\n\tint (*handle_irq)(struct pt_regs *);\n\tvoid (*disable_all)(void);\n\tvoid (*enable_all)(int);\n\tvoid (*enable)(struct perf_event *);\n\tvoid (*disable)(struct perf_event *);\n\tvoid (*assign)(struct perf_event *, int);\n\tvoid (*add)(struct perf_event *);\n\tvoid (*del)(struct perf_event *);\n\tvoid (*read)(struct perf_event *);\n\tint (*set_period)(struct perf_event *);\n\tu64 (*update)(struct perf_event *);\n\tint (*hw_config)(struct perf_event *);\n\tint (*schedule_events)(struct cpu_hw_events *, int, int *);\n\tunsigned int eventsel;\n\tunsigned int perfctr;\n\tunsigned int fixedctr;\n\tint (*addr_offset)(int, bool);\n\tint (*rdpmc_index)(int);\n\tu64 (*event_map)(int);\n\tint max_events;\n\tu64 config_mask;\n\tunion {\n\t\tu64 cntr_mask64;\n\t\tlong unsigned int cntr_mask[1];\n\t};\n\tunion {\n\t\tu64 fixed_cntr_mask64;\n\t\tlong unsigned int fixed_cntr_mask[1];\n\t};\n\tint cntval_bits;\n\tu64 cntval_mask;\n\tunion {\n\t\tlong unsigned int events_maskl;\n\t\tlong unsigned int events_mask[1];\n\t};\n\tint events_mask_len;\n\tint apic;\n\tu64 max_period;\n\tstruct event_constraint * (*get_event_constraints)(struct cpu_hw_events *, int, struct perf_event *);\n\tvoid (*put_event_constraints)(struct cpu_hw_events *, struct perf_event *);\n\tvoid (*start_scheduling)(struct cpu_hw_events *);\n\tvoid (*commit_scheduling)(struct cpu_hw_events *, int, int);\n\tvoid (*stop_scheduling)(struct cpu_hw_events *);\n\tstruct event_constraint *event_constraints;\n\tstruct x86_pmu_quirk *quirks;\n\tvoid (*limit_period)(struct perf_event *, s64 *);\n\tunsigned int late_ack: 1;\n\tunsigned int mid_ack: 1;\n\tunsigned int enabled_ack: 1;\n\tint attr_rdpmc_broken;\n\tint attr_rdpmc;\n\tstruct attribute **format_attrs;\n\tssize_t (*events_sysfs_show)(char *, u64);\n\tconst struct attribute_group **attr_update;\n\tlong unsigned int attr_freeze_on_smi;\n\tint (*cpu_prepare)(int);\n\tvoid (*cpu_starting)(int);\n\tvoid (*cpu_dying)(int);\n\tvoid (*cpu_dead)(int);\n\tvoid (*check_microcode)(void);\n\tvoid (*sched_task)(struct perf_event_pmu_context *, bool);\n\tu64 intel_ctrl;\n\tunion perf_capabilities intel_cap;\n\tunsigned int bts: 1;\n\tunsigned int bts_active: 1;\n\tunsigned int pebs: 1;\n\tunsigned int pebs_active: 1;\n\tunsigned int pebs_broken: 1;\n\tunsigned int pebs_prec_dist: 1;\n\tunsigned int pebs_no_tlb: 1;\n\tunsigned int pebs_no_isolation: 1;\n\tunsigned int pebs_block: 1;\n\tunsigned int pebs_ept: 1;\n\tint pebs_record_size;\n\tint pebs_buffer_size;\n\tu64 pebs_events_mask;\n\tvoid (*drain_pebs)(struct pt_regs *, struct perf_sample_data *);\n\tstruct event_constraint *pebs_constraints;\n\tvoid (*pebs_aliases)(struct perf_event *);\n\tu64 (*pebs_latency_data)(struct perf_event *, u64);\n\tlong unsigned int large_pebs_flags;\n\tu64 rtm_abort_event;\n\tu64 pebs_capable;\n\tunsigned int lbr_tos;\n\tunsigned int lbr_from;\n\tunsigned int lbr_to;\n\tunsigned int lbr_info;\n\tunsigned int lbr_nr;\n\tunion {\n\t\tu64 lbr_sel_mask;\n\t\tu64 lbr_ctl_mask;\n\t};\n\tunion {\n\t\tconst int *lbr_sel_map;\n\t\tint *lbr_ctl_map;\n\t};\n\tbool lbr_double_abort;\n\tbool lbr_pt_coexist;\n\tunsigned int lbr_has_info: 1;\n\tunsigned int lbr_has_tsx: 1;\n\tunsigned int lbr_from_flags: 1;\n\tunsigned int lbr_to_cycles: 1;\n\tunsigned int lbr_depth_mask: 8;\n\tunsigned int lbr_deep_c_reset: 1;\n\tunsigned int lbr_lip: 1;\n\tunsigned int lbr_cpl: 1;\n\tunsigned int lbr_filter: 1;\n\tunsigned int lbr_call_stack: 1;\n\tunsigned int lbr_mispred: 1;\n\tunsigned int lbr_timed_lbr: 1;\n\tunsigned int lbr_br_type: 1;\n\tunsigned int lbr_counters: 4;\n\tvoid (*lbr_reset)(void);\n\tvoid (*lbr_read)(struct cpu_hw_events *);\n\tvoid (*lbr_save)(void *);\n\tvoid (*lbr_restore)(void *);\n\tatomic_t lbr_exclusive[3];\n\tint num_topdown_events;\n\tvoid (*swap_task_ctx)(struct perf_event_pmu_context *, struct perf_event_pmu_context *);\n\tunsigned int amd_nb_constraints: 1;\n\tu64 perf_ctr_pair_en;\n\tstruct extra_reg *extra_regs;\n\tunsigned int flags;\n\tstruct perf_guest_switch_msr * (*guest_get_msrs)(int *, void *);\n\tint (*check_period)(struct perf_event *, u64);\n\tint (*aux_output_match)(struct perf_event *);\n\tvoid (*filter)(struct pmu *, int, bool *);\n\tint num_hybrid_pmus;\n\tstruct x86_hybrid_pmu *hybrid_pmu;\n\tenum hybrid_cpu_type (*get_hybrid_cpu_type)(void);\n};\n\nstruct x86_pmu_capability {\n\tint version;\n\tint num_counters_gp;\n\tint num_counters_fixed;\n\tint bit_width_gp;\n\tint bit_width_fixed;\n\tunsigned int events_mask;\n\tint events_mask_len;\n\tunsigned int pebs_ept: 1;\n};\n\nunion x86_pmu_config {\n\tstruct {\n\t\tu64 event: 8;\n\t\tu64 umask: 8;\n\t\tu64 usr: 1;\n\t\tu64 os: 1;\n\t\tu64 edge: 1;\n\t\tu64 pc: 1;\n\t\tu64 interrupt: 1;\n\t\tu64 __reserved1: 1;\n\t\tu64 en: 1;\n\t\tu64 inv: 1;\n\t\tu64 cmask: 8;\n\t\tu64 event2: 4;\n\t\tu64 __reserved2: 4;\n\t\tu64 go: 1;\n\t\tu64 ho: 1;\n\t} bits;\n\tu64 value;\n};\n\nstruct x86_pmu_lbr {\n\tunsigned int nr;\n\tunsigned int from;\n\tunsigned int to;\n\tunsigned int info;\n\tbool has_callstack;\n};\n\nstruct x86_pmu_quirk {\n\tstruct x86_pmu_quirk *next;\n\tvoid (*func)(void);\n};\n\nstruct x86_topology_system {\n\tunsigned int dom_shifts[7];\n\tunsigned int dom_size[7];\n};\n\nstruct xa_limit {\n\tu32 max;\n\tu32 min;\n};\n\nstruct xa_node {\n\tunsigned char shift;\n\tunsigned char offset;\n\tunsigned char count;\n\tunsigned char nr_values;\n\tstruct xa_node *parent;\n\tstruct xarray *array;\n\tunion {\n\t\tstruct list_head private_list;\n\t\tstruct callback_head callback_head;\n\t};\n\tvoid *slots[64];\n\tunion {\n\t\tlong unsigned int tags[3];\n\t\tlong unsigned int marks[3];\n\t};\n};\n\ntypedef void (*xa_update_node_t)(struct xa_node *);\n\nstruct xa_state {\n\tstruct xarray *xa;\n\tlong unsigned int xa_index;\n\tunsigned char xa_shift;\n\tunsigned char xa_sibs;\n\tunsigned char xa_offset;\n\tunsigned char xa_pad;\n\tstruct xa_node *xa_node;\n\tstruct xa_node *xa_alloc;\n\txa_update_node_t xa_update;\n\tstruct list_lru *xa_lru;\n};\n\nstruct xattr {\n\tconst char *name;\n\tvoid *value;\n\tsize_t value_len;\n};\n\nstruct xattr_handler {\n\tconst char *name;\n\tconst char *prefix;\n\tint flags;\n\tbool (*list)(struct dentry *);\n\tint (*get)(const struct xattr_handler *, struct dentry *, struct inode *, const char *, void *, size_t);\n\tint (*set)(const struct xattr_handler *, struct mnt_idmap *, struct dentry *, struct inode *, const char *, const void *, size_t, int);\n};\n\nstruct xattr_list {\n\tstruct list_head list;\n\tchar *name;\n\tbool enabled;\n};\n\nstruct xattr_name {\n\tchar name[256];\n};\n\nstruct xb_find_info {\n\tstruct xenbus_device *dev;\n\tconst char *nodename;\n};\n\nstruct xsd_sockmsg {\n\tuint32_t type;\n\tuint32_t req_id;\n\tuint32_t tx_id;\n\tuint32_t len;\n};\n\nstruct xb_req_data {\n\tstruct list_head list;\n\twait_queue_head_t wq;\n\tstruct xsd_sockmsg msg;\n\tuint32_t caller_req_id;\n\tenum xsd_sockmsg_type type;\n\tchar *body;\n\tconst struct kvec *vec;\n\tint num_vecs;\n\tint err;\n\tenum xb_req_state state;\n\tbool user_req;\n\tvoid (*cb)(struct xb_req_data *);\n\tvoid *par;\n};\n\nstruct xbc_node {\n\tuint16_t next;\n\tuint16_t child;\n\tuint16_t parent;\n\tuint16_t data;\n};\n\nstruct xdbc_info_context {\n\t__le64 string0;\n\t__le64 manufacturer;\n\t__le64 product;\n\t__le64 serial;\n\t__le32 length;\n\t__le32 __reserved_0[7];\n};\n\nstruct xdbc_ep_context {\n\t__le32 ep_info1;\n\t__le32 ep_info2;\n\t__le64 deq;\n\t__le32 tx_info;\n\t__le32 __reserved_0[11];\n};\n\nstruct xdbc_context {\n\tstruct xdbc_info_context info;\n\tstruct xdbc_ep_context out;\n\tstruct xdbc_ep_context in;\n};\n\nstruct xdbc_erst_entry {\n\t__le64 seg_addr;\n\t__le32 seg_size;\n\t__le32 __reserved_0;\n};\n\nstruct xdbc_regs {\n\t__le32 capability;\n\t__le32 doorbell;\n\t__le32 ersts;\n\t__le32 __reserved_0;\n\t__le64 erstba;\n\t__le64 erdp;\n\t__le32 control;\n\t__le32 status;\n\t__le32 portsc;\n\t__le32 __reserved_1;\n\t__le64 dccp;\n\t__le32 devinfo1;\n\t__le32 devinfo2;\n};\n\nstruct xdbc_segment;\n\nstruct xdbc_trb;\n\nstruct xdbc_ring {\n\tstruct xdbc_segment *segment;\n\tstruct xdbc_trb *enqueue;\n\tstruct xdbc_trb *dequeue;\n\tu32 cycle_state;\n};\n\nstruct xdbc_segment {\n\tstruct xdbc_trb *trbs;\n\tdma_addr_t dma;\n};\n\nstruct xdbc_state {\n\tu16 vendor;\n\tu16 device;\n\tu32 bus;\n\tu32 dev;\n\tu32 func;\n\tvoid *xhci_base;\n\tu64 xhci_start;\n\tsize_t xhci_length;\n\tint port_number;\n\tstruct xdbc_regs *xdbc_reg;\n\tdma_addr_t table_dma;\n\tvoid *table_base;\n\tdma_addr_t erst_dma;\n\tsize_t erst_size;\n\tvoid *erst_base;\n\tstruct xdbc_ring evt_ring;\n\tstruct xdbc_segment evt_seg;\n\tdma_addr_t dbcc_dma;\n\tsize_t dbcc_size;\n\tvoid *dbcc_base;\n\tdma_addr_t string_dma;\n\tsize_t string_size;\n\tvoid *string_base;\n\tstruct xdbc_ring out_ring;\n\tstruct xdbc_segment out_seg;\n\tvoid *out_buf;\n\tdma_addr_t out_dma;\n\tstruct xdbc_ring in_ring;\n\tstruct xdbc_segment in_seg;\n\tvoid *in_buf;\n\tdma_addr_t in_dma;\n\tu32 flags;\n\traw_spinlock_t lock;\n};\n\nstruct xdbc_strings {\n\tchar string0[64];\n\tchar manufacturer[64];\n\tchar product[64];\n\tchar serial[64];\n};\n\nstruct xdbc_trb {\n\t__le32 field[4];\n};\n\nstruct xdp_attachment_info {\n\tstruct bpf_prog *prog;\n\tu32 flags;\n};\n\nstruct xdp_buff_xsk {\n\tstruct xdp_buff xdp;\n\tu8 cb[24];\n\tdma_addr_t dma;\n\tdma_addr_t frame_dma;\n\tstruct xsk_buff_pool *pool;\n\tu64 orig_addr;\n\tstruct list_head free_list_node;\n\tstruct list_head xskb_list_node;\n};\n\nstruct xdp_bulk_queue {\n\tvoid *q[8];\n\tstruct list_head flush_node;\n\tstruct bpf_cpu_map_entry *obj;\n\tunsigned int count;\n};\n\nstruct xdp_cpumap_stats {\n\tunsigned int redirect;\n\tunsigned int pass;\n\tunsigned int drop;\n};\n\nstruct xdp_desc {\n\t__u64 addr;\n\t__u32 len;\n\t__u32 options;\n};\n\nstruct xdp_dev_bulk_queue {\n\tstruct xdp_frame *q[16];\n\tstruct list_head flush_node;\n\tstruct net_device *dev;\n\tstruct net_device *dev_rx;\n\tstruct bpf_prog *xdp_prog;\n\tunsigned int count;\n};\n\nstruct xdp_frame {\n\tvoid *data;\n\tu16 len;\n\tu16 headroom;\n\tu32 metasize;\n\tstruct xdp_mem_info mem;\n\tstruct net_device *dev_rx;\n\tu32 frame_sz;\n\tu32 flags;\n};\n\nstruct xdp_frame_bulk {\n\tint count;\n\tvoid *xa;\n\tvoid *q[16];\n};\n\nstruct xdp_mem_allocator {\n\tstruct xdp_mem_info mem;\n\tunion {\n\t\tvoid *allocator;\n\t\tstruct page_pool *page_pool;\n\t};\n\tstruct rhash_head node;\n\tstruct callback_head rcu;\n};\n\nstruct xdp_metadata_ops {\n\tint (*xmo_rx_timestamp)(const struct xdp_md *, u64 *);\n\tint (*xmo_rx_hash)(const struct xdp_md *, u32 *, enum xdp_rss_hash_type *);\n\tint (*xmo_rx_vlan_tag)(const struct xdp_md *, __be16 *, u16 *);\n};\n\nstruct xdp_ring_offset {\n\t__u64 producer;\n\t__u64 consumer;\n\t__u64 desc;\n\t__u64 flags;\n};\n\nstruct xdp_mmap_offsets {\n\tstruct xdp_ring_offset rx;\n\tstruct xdp_ring_offset tx;\n\tstruct xdp_ring_offset fr;\n\tstruct xdp_ring_offset cr;\n};\n\nstruct xdp_ring_offset_v1 {\n\t__u64 producer;\n\t__u64 consumer;\n\t__u64 desc;\n};\n\nstruct xdp_mmap_offsets_v1 {\n\tstruct xdp_ring_offset_v1 rx;\n\tstruct xdp_ring_offset_v1 tx;\n\tstruct xdp_ring_offset_v1 fr;\n\tstruct xdp_ring_offset_v1 cr;\n};\n\nstruct xdp_options {\n\t__u32 flags;\n};\n\nstruct xdp_page_head {\n\tstruct xdp_buff orig_ctx;\n\tstruct xdp_buff ctx;\n\tunion {\n\t\tstruct {\n\t\t\tstruct {} __empty_frame;\n\t\t\tstruct xdp_frame frame[0];\n\t\t};\n\t\tstruct {\n\t\t\tstruct {} __empty_data;\n\t\t\tu8 data[0];\n\t\t};\n\t};\n};\n\nstruct xdp_ring {\n\tu32 producer;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tu32 pad1;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tu32 consumer;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tu32 pad2;\n\tu32 flags;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tu32 pad3;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct xdp_rxtx_ring {\n\tstruct xdp_ring ptrs;\n\tstruct xdp_desc desc[0];\n};\n\nstruct xsk_queue;\n\nstruct xdp_umem;\n\nstruct xdp_sock {\n\tstruct sock sk;\n\tlong: 64;\n\tstruct xsk_queue *rx;\n\tstruct net_device *dev;\n\tstruct xdp_umem *umem;\n\tstruct list_head flush_node;\n\tstruct xsk_buff_pool *pool;\n\tu16 queue_id;\n\tbool zc;\n\tbool sg;\n\tenum {\n\t\tXSK_READY = 0,\n\t\tXSK_BOUND = 1,\n\t\tXSK_UNBOUND = 2,\n\t} state;\n\tlong: 64;\n\tstruct xsk_queue *tx;\n\tstruct list_head tx_list;\n\tu32 tx_budget_spent;\n\tspinlock_t rx_lock;\n\tu64 rx_dropped;\n\tu64 rx_queue_full;\n\tstruct sk_buff *skb;\n\tstruct list_head map_list;\n\tspinlock_t map_list_lock;\n\tstruct mutex mutex;\n\tstruct xsk_queue *fq_tmp;\n\tstruct xsk_queue *cq_tmp;\n};\n\nstruct xdp_statistics {\n\t__u64 rx_dropped;\n\t__u64 rx_invalid_descs;\n\t__u64 tx_invalid_descs;\n\t__u64 rx_ring_full;\n\t__u64 rx_fill_ring_empty_descs;\n\t__u64 tx_ring_empty_descs;\n};\n\nstruct xdp_test_data {\n\tstruct xdp_buff *orig_ctx;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tstruct xdp_rxq_info rxq;\n\tstruct net_device *dev;\n\tstruct page_pool *pp;\n\tstruct xdp_frame **frames;\n\tstruct sk_buff **skbs;\n\tstruct xdp_mem_info mem;\n\tu32 batch_size;\n\tu32 frame_cnt;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct xdp_txq_info {\n\tstruct net_device *dev;\n};\n\nstruct xdp_umem {\n\tvoid *addrs;\n\tu64 size;\n\tu32 headroom;\n\tu32 chunk_size;\n\tu32 chunks;\n\tu32 npgs;\n\tstruct user_struct *user;\n\trefcount_t users;\n\tu8 flags;\n\tu8 tx_metadata_len;\n\tbool zc;\n\tstruct page **pgs;\n\tint id;\n\tstruct list_head xsk_dma_list;\n\tstruct work_struct work;\n};\n\nstruct xdp_umem_reg {\n\t__u64 addr;\n\t__u64 len;\n\t__u32 chunk_size;\n\t__u32 headroom;\n\t__u32 flags;\n\t__u32 tx_metadata_len;\n};\n\nstruct xdp_umem_ring {\n\tstruct xdp_ring ptrs;\n\tu64 desc[0];\n};\n\nstruct xdr_netobj {\n\tunsigned int len;\n\tu8 *data;\n};\n\nstruct xen_add_to_physmap {\n\tdomid_t domid;\n\tuint16_t size;\n\tunsigned int space;\n\txen_ulong_t idx;\n\txen_pfn_t gpfn;\n};\n\nstruct xen_add_to_physmap_range {\n\tdomid_t domid;\n\tuint16_t space;\n\tuint16_t size;\n\tdomid_t foreign_domid;\n\t__guest_handle_xen_ulong_t idxs;\n\t__guest_handle_xen_pfn_t gpfns;\n\t__guest_handle_int errs;\n};\n\nstruct xen_build_id {\n\tuint32_t len;\n\tunsigned char buf[0];\n};\n\nstruct xen_bus_type {\n\tchar *root;\n\tunsigned int levels;\n\tint (*get_bus_id)(char *, const char *);\n\tint (*probe)(struct xen_bus_type *, const char *, const char *);\n\tbool (*otherend_will_handle)(struct xenbus_watch *, const char *, const char *);\n\tvoid (*otherend_changed)(struct xenbus_watch *, const char *, const char *);\n\tstruct bus_type bus;\n};\n\nstruct xen_clock_event_device {\n\tstruct clock_event_device evt;\n\tchar name[16];\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct xen_common_irq {\n\tint irq;\n\tchar *name;\n};\n\nstruct xen_compile_info {\n\tchar compiler[64];\n\tchar compile_by[16];\n\tchar compile_domain[32];\n\tchar compile_date[32];\n};\n\nstruct xen_device_domain_owner {\n\tdomid_t domain;\n\tstruct pci_dev *dev;\n\tstruct list_head list;\n};\n\nstruct xen_extraversion {\n\tchar extraversion[16];\n};\n\nstruct xen_feature_info {\n\tunsigned int submap_idx;\n\tuint32_t submap;\n};\n\nstruct xen_grant_dma_data {\n\tdomid_t backend_domid;\n\tbool broken;\n};\n\nstruct xen_hvm_evtchn_upcall_vector {\n\tuint32_t vcpu;\n\tuint8_t vector;\n};\n\ntypedef struct xen_hvm_evtchn_upcall_vector xen_hvm_evtchn_upcall_vector_t;\n\nstruct xen_hvm_get_mem_type {\n\tdomid_t domid;\n\tuint16_t mem_type;\n\tuint16_t pad[2];\n\tuint64_t pfn;\n};\n\nstruct xen_hvm_pagetable_dying {\n\tdomid_t domid;\n\t__u64 gpa;\n};\n\nstruct xen_hvm_param {\n\tdomid_t domid;\n\tuint32_t index;\n\tuint64_t value;\n};\n\nstruct xen_machphys_mapping {\n\txen_ulong_t v_start;\n\txen_ulong_t v_end;\n\txen_ulong_t max_mfn;\n};\n\nstruct xen_mc_fetch {\n\tuint32_t flags;\n\tuint32_t _pad0;\n\tuint64_t fetch_id;\n\t__guest_handle_mc_info data;\n};\n\nstruct xen_mc_notifydomain {\n\tuint16_t mc_domid;\n\tuint16_t mc_vcpuid;\n\tuint32_t flags;\n};\n\nstruct xen_mc_physcpuinfo {\n\tuint32_t ncpus;\n\tuint32_t _pad0;\n\t__guest_handle_mcinfo_logical_cpu info;\n};\n\nstruct xen_mc_msrinject {\n\tuint32_t mcinj_cpunr;\n\tuint32_t mcinj_flags;\n\tuint32_t mcinj_count;\n\tuint32_t _pad0;\n\tstruct mcinfo_msr mcinj_msr[8];\n};\n\nstruct xen_mc_mceinject {\n\tunsigned int mceinj_cpunr;\n};\n\nstruct xen_mc {\n\tuint32_t cmd;\n\tuint32_t interface_version;\n\tunion {\n\t\tstruct xen_mc_fetch mc_fetch;\n\t\tstruct xen_mc_notifydomain mc_notifydomain;\n\t\tstruct xen_mc_physcpuinfo mc_physcpuinfo;\n\t\tstruct xen_mc_msrinject mc_msrinject;\n\t\tstruct xen_mc_mceinject mc_mceinject;\n\t} u;\n};\n\nstruct xen_mce {\n\t__u64 status;\n\t__u64 misc;\n\t__u64 addr;\n\t__u64 mcgstatus;\n\t__u64 ip;\n\t__u64 tsc;\n\t__u64 time;\n\t__u8 cpuvendor;\n\t__u8 inject_flags;\n\t__u16 pad;\n\t__u32 cpuid;\n\t__u8 cs;\n\t__u8 bank;\n\t__u8 cpu;\n\t__u8 finished;\n\t__u32 extcpu;\n\t__u32 socketid;\n\t__u32 apicid;\n\t__u64 mcgcap;\n\t__u64 synd;\n\t__u64 ipid;\n\t__u64 ppin;\n};\n\nstruct xen_mce_log {\n\tchar signature[12];\n\tunsigned int len;\n\tunsigned int next;\n\tunsigned int flags;\n\tunsigned int recordlen;\n\tstruct xen_mce entry[32];\n};\n\nstruct xen_memory_reservation {\n\t__guest_handle_xen_pfn_t extent_start;\n\txen_ulong_t nr_extents;\n\tunsigned int extent_order;\n\tunsigned int address_bits;\n\tdomid_t domid;\n};\n\nstruct xen_memory_exchange {\n\tstruct xen_memory_reservation in;\n\tstruct xen_memory_reservation out;\n\txen_ulong_t nr_exchanged;\n};\n\ntypedef void *__guest_handle_void;\n\nstruct xen_memory_map {\n\tunsigned int nr_entries;\n\t__guest_handle_void buffer;\n};\n\nstruct xen_memory_region {\n\tlong unsigned int start_pfn;\n\tlong unsigned int n_pfns;\n};\n\nstruct xen_msi_ops {\n\tint (*setup_msi_irqs)(struct pci_dev *, int, int);\n\tvoid (*teardown_msi_irqs)(struct pci_dev *);\n};\n\nstruct xen_netif_rx_request {\n\tuint16_t id;\n\tuint16_t pad;\n\tgrant_ref_t gref;\n};\n\nunion xen_netif_rx_sring_entry {\n\tstruct xen_netif_rx_request req;\n\tstruct xen_netif_rx_response rsp;\n};\n\nstruct xen_netif_rx_sring {\n\tRING_IDX req_prod;\n\tRING_IDX req_event;\n\tRING_IDX rsp_prod;\n\tRING_IDX rsp_event;\n\tuint8_t __pad[48];\n\tunion xen_netif_rx_sring_entry ring[0];\n};\n\nstruct xen_netif_tx_request {\n\tgrant_ref_t gref;\n\tuint16_t offset;\n\tuint16_t flags;\n\tuint16_t id;\n\tuint16_t size;\n};\n\nstruct xen_netif_tx_response {\n\tuint16_t id;\n\tint16_t status;\n};\n\nunion xen_netif_tx_sring_entry {\n\tstruct xen_netif_tx_request req;\n\tstruct xen_netif_tx_response rsp;\n};\n\nstruct xen_netif_tx_sring {\n\tRING_IDX req_prod;\n\tRING_IDX req_event;\n\tRING_IDX rsp_prod;\n\tRING_IDX rsp_event;\n\tuint8_t __pad[48];\n\tunion xen_netif_tx_sring_entry ring[0];\n};\n\nstruct xen_page_foreign {\n\tdomid_t domid;\n\tgrant_ref_t gref;\n};\n\nstruct xen_pci_frontend_ops {\n\tint (*enable_msi)(struct pci_dev *, int *);\n\tvoid (*disable_msi)(struct pci_dev *);\n\tint (*enable_msix)(struct pci_dev *, int *, int);\n\tvoid (*disable_msix)(struct pci_dev *);\n};\n\nstruct xen_pct_register {\n\tuint8_t descriptor;\n\tuint16_t length;\n\tuint8_t space_id;\n\tuint8_t bit_width;\n\tuint8_t bit_offset;\n\tuint8_t reserved;\n\tuint64_t address;\n};\n\nstruct xenpf_settime32 {\n\tuint32_t secs;\n\tuint32_t nsecs;\n\tuint64_t system_time;\n};\n\nstruct xenpf_settime64 {\n\tuint64_t secs;\n\tuint32_t nsecs;\n\tuint32_t mbz;\n\tuint64_t system_time;\n};\n\nstruct xenpf_add_memtype {\n\txen_pfn_t mfn;\n\tuint64_t nr_mfns;\n\tuint32_t type;\n\tuint32_t handle;\n\tuint32_t reg;\n};\n\nstruct xenpf_del_memtype {\n\tuint32_t handle;\n\tuint32_t reg;\n};\n\nstruct xenpf_read_memtype {\n\tuint32_t reg;\n\txen_pfn_t mfn;\n\tuint64_t nr_mfns;\n\tuint32_t type;\n};\n\nstruct xenpf_microcode_update {\n\t__guest_handle_void data;\n\tuint32_t length;\n};\n\nstruct xenpf_platform_quirk {\n\tuint32_t quirk_id;\n};\n\nstruct xenpf_efi_time {\n\tuint16_t year;\n\tuint8_t month;\n\tuint8_t day;\n\tuint8_t hour;\n\tuint8_t min;\n\tuint8_t sec;\n\tuint32_t ns;\n\tint16_t tz;\n\tuint8_t daylight;\n};\n\nstruct xenpf_efi_guid {\n\tuint32_t data1;\n\tuint16_t data2;\n\tuint16_t data3;\n\tuint8_t data4[8];\n};\n\nstruct xenpf_efi_runtime_call {\n\tuint32_t function;\n\tuint32_t misc;\n\txen_ulong_t status;\n\tunion {\n\t\tstruct {\n\t\t\tstruct xenpf_efi_time time;\n\t\t\tuint32_t resolution;\n\t\t\tuint32_t accuracy;\n\t\t} get_time;\n\t\tstruct xenpf_efi_time set_time;\n\t\tstruct xenpf_efi_time get_wakeup_time;\n\t\tstruct xenpf_efi_time set_wakeup_time;\n\t\tstruct {\n\t\t\t__guest_handle_void name;\n\t\t\txen_ulong_t size;\n\t\t\t__guest_handle_void data;\n\t\t\tstruct xenpf_efi_guid vendor_guid;\n\t\t} get_variable;\n\t\tstruct {\n\t\t\t__guest_handle_void name;\n\t\t\txen_ulong_t size;\n\t\t\t__guest_handle_void data;\n\t\t\tstruct xenpf_efi_guid vendor_guid;\n\t\t} set_variable;\n\t\tstruct {\n\t\t\txen_ulong_t size;\n\t\t\t__guest_handle_void name;\n\t\t\tstruct xenpf_efi_guid vendor_guid;\n\t\t} get_next_variable_name;\n\t\tstruct {\n\t\t\tuint32_t attr;\n\t\t\tuint64_t max_store_size;\n\t\t\tuint64_t remain_store_size;\n\t\t\tuint64_t max_size;\n\t\t} query_variable_info;\n\t\tstruct {\n\t\t\t__guest_handle_void capsule_header_array;\n\t\t\txen_ulong_t capsule_count;\n\t\t\tuint64_t max_capsule_size;\n\t\t\tuint32_t reset_type;\n\t\t} query_capsule_capabilities;\n\t\tstruct {\n\t\t\t__guest_handle_void capsule_header_array;\n\t\t\txen_ulong_t capsule_count;\n\t\t\tuint64_t sg_list;\n\t\t} update_capsule;\n\t} u;\n};\n\nunion xenpf_efi_info {\n\tuint32_t version;\n\tstruct {\n\t\tuint64_t addr;\n\t\tuint32_t nent;\n\t} cfg;\n\tstruct {\n\t\tuint32_t revision;\n\t\tuint32_t bufsz;\n\t\t__guest_handle_void name;\n\t} vendor;\n\tstruct {\n\t\tuint64_t addr;\n\t\tuint64_t size;\n\t\tuint64_t attr;\n\t\tuint32_t type;\n\t} mem;\n};\n\nstruct xenpf_firmware_info {\n\tuint32_t type;\n\tuint32_t index;\n\tunion {\n\t\tstruct {\n\t\t\tuint8_t device;\n\t\t\tuint8_t version;\n\t\t\tuint16_t interface_support;\n\t\t\tuint16_t legacy_max_cylinder;\n\t\t\tuint8_t legacy_max_head;\n\t\t\tuint8_t legacy_sectors_per_track;\n\t\t\t__guest_handle_void edd_params;\n\t\t} disk_info;\n\t\tstruct {\n\t\t\tuint8_t device;\n\t\t\tuint32_t mbr_signature;\n\t\t} disk_mbr_signature;\n\t\tstruct {\n\t\t\tuint8_t capabilities;\n\t\t\tuint8_t edid_transfer_time;\n\t\t\t__guest_handle_uchar edid;\n\t\t} vbeddc_info;\n\t\tunion xenpf_efi_info efi_info;\n\t\tuint8_t kbd_shift_flags;\n\t} u;\n};\n\nstruct xenpf_enter_acpi_sleep {\n\tuint16_t val_a;\n\tuint16_t val_b;\n\tuint32_t sleep_state;\n\tuint32_t flags;\n};\n\nstruct xenpf_change_freq {\n\tuint32_t flags;\n\tuint32_t cpu;\n\tuint64_t freq;\n};\n\nstruct xenpf_getidletime {\n\t__guest_handle_uchar cpumap_bitmap;\n\tuint32_t cpumap_nr_cpus;\n\t__guest_handle_uint64_t idletime;\n\tuint64_t now;\n};\n\nstruct xen_processor_flags {\n\tuint32_t bm_control: 1;\n\tuint32_t bm_check: 1;\n\tuint32_t has_cst: 1;\n\tuint32_t power_setup_done: 1;\n\tuint32_t bm_rld_set: 1;\n};\n\nstruct xen_processor_cx;\n\ntypedef struct xen_processor_cx *__guest_handle_xen_processor_cx;\n\nstruct xen_processor_power {\n\tuint32_t count;\n\tstruct xen_processor_flags flags;\n\t__guest_handle_xen_processor_cx states;\n};\n\nstruct xen_processor_px;\n\ntypedef struct xen_processor_px *__guest_handle_xen_processor_px;\n\nstruct xen_psd_package {\n\tuint64_t num_entries;\n\tuint64_t revision;\n\tuint64_t domain;\n\tuint64_t coord_type;\n\tuint64_t num_processors;\n};\n\nstruct xen_processor_performance {\n\tuint32_t flags;\n\tuint32_t platform_limit;\n\tstruct xen_pct_register control_register;\n\tstruct xen_pct_register status_register;\n\tuint32_t state_count;\n\t__guest_handle_xen_processor_px states;\n\tstruct xen_psd_package domain_info;\n\tuint32_t shared_type;\n};\n\nstruct xenpf_set_processor_pminfo {\n\tuint32_t id;\n\tuint32_t type;\n\tunion {\n\t\tstruct xen_processor_power power;\n\t\tstruct xen_processor_performance perf;\n\t\t__guest_handle_uint32_t pdc;\n\t};\n};\n\nstruct xenpf_pcpuinfo {\n\tuint32_t xen_cpuid;\n\tuint32_t max_present;\n\tuint32_t flags;\n\tuint32_t apic_id;\n\tuint32_t acpi_id;\n};\n\nstruct xenpf_cpu_ol {\n\tuint32_t cpuid;\n};\n\nstruct xenpf_cpu_hotadd {\n\tuint32_t apic_id;\n\tuint32_t acpi_id;\n\tuint32_t pxm;\n};\n\nstruct xenpf_mem_hotadd {\n\tuint64_t spfn;\n\tuint64_t epfn;\n\tuint32_t pxm;\n\tuint32_t flags;\n};\n\nstruct xenpf_core_parking {\n\tuint32_t type;\n\tuint32_t idle_nums;\n};\n\nstruct xenpf_symdata {\n\tuint32_t namelen;\n\tuint32_t symnum;\n\t__guest_handle_char name;\n\tuint64_t address;\n\tchar type;\n};\n\nstruct xen_platform_op {\n\tuint32_t cmd;\n\tuint32_t interface_version;\n\tunion {\n\t\tstruct xenpf_settime32 settime32;\n\t\tstruct xenpf_settime64 settime64;\n\t\tstruct xenpf_add_memtype add_memtype;\n\t\tstruct xenpf_del_memtype del_memtype;\n\t\tstruct xenpf_read_memtype read_memtype;\n\t\tstruct xenpf_microcode_update microcode;\n\t\tstruct xenpf_platform_quirk platform_quirk;\n\t\tstruct xenpf_efi_runtime_call efi_runtime_call;\n\t\tstruct xenpf_firmware_info firmware_info;\n\t\tstruct xenpf_enter_acpi_sleep enter_acpi_sleep;\n\t\tstruct xenpf_change_freq change_freq;\n\t\tstruct xenpf_getidletime getidletime;\n\t\tstruct xenpf_set_processor_pminfo set_pminfo;\n\t\tstruct xenpf_pcpuinfo pcpu_info;\n\t\tstruct xenpf_cpu_ol cpu_ol;\n\t\tstruct xenpf_cpu_hotadd cpu_add;\n\t\tstruct xenpf_mem_hotadd mem_add;\n\t\tstruct xenpf_core_parking core_parking;\n\t\tstruct xenpf_symdata symdata;\n\t\tstruct dom0_vga_console_info dom0_console;\n\t\tuint8_t pad[128];\n\t} u;\n};\n\nstruct xen_platform_parameters {\n\txen_ulong_t virt_start;\n};\n\nstruct xen_pmu_amd_ctxt {\n\tuint32_t counters;\n\tuint32_t ctrls;\n\tuint64_t regs[0];\n};\n\nstruct xen_pmu_regs {\n\tuint64_t ip;\n\tuint64_t sp;\n\tuint64_t flags;\n\tuint16_t cs;\n\tuint16_t ss;\n\tuint8_t cpl;\n\tuint8_t pad[3];\n};\n\nstruct xen_pmu_intel_ctxt {\n\tuint32_t fixed_counters;\n\tuint32_t arch_counters;\n\tuint64_t global_ctrl;\n\tuint64_t global_ovf_ctrl;\n\tuint64_t global_status;\n\tuint64_t fixed_ctrl;\n\tuint64_t ds_area;\n\tuint64_t pebs_enable;\n\tuint64_t debugctl;\n\tuint64_t regs[0];\n};\n\nstruct xen_pmu_arch {\n\tunion {\n\t\tstruct xen_pmu_regs regs;\n\t\tuint8_t pad[64];\n\t} r;\n\tuint64_t pmu_flags;\n\tunion {\n\t\tuint32_t lapic_lvtpc;\n\t\tuint64_t pad;\n\t} l;\n\tunion {\n\t\tstruct xen_pmu_amd_ctxt amd;\n\t\tstruct xen_pmu_intel_ctxt intel;\n\t\tuint8_t pad[128];\n\t} c;\n};\n\nstruct xen_pmu_cntr_pair {\n\tuint64_t counter;\n\tuint64_t control;\n};\n\nstruct xen_pmu_data {\n\tuint32_t vcpu_id;\n\tuint32_t pcpu_id;\n\tdomid_t domain_id;\n\tuint8_t pad[6];\n\tstruct xen_pmu_arch pmu;\n};\n\nstruct xen_pmu_params {\n\tstruct {\n\t\tuint32_t maj;\n\t\tuint32_t min;\n\t} version;\n\tuint64_t val;\n\tuint32_t vcpu;\n\tuint32_t pad;\n};\n\nstruct xen_power_register {\n\tuint32_t space_id;\n\tuint32_t bit_width;\n\tuint32_t bit_offset;\n\tuint32_t access_size;\n\tuint64_t address;\n};\n\nstruct xen_processor_csd;\n\ntypedef struct xen_processor_csd *__guest_handle_xen_processor_csd;\n\nstruct xen_processor_csd {\n\tuint32_t domain;\n\tuint32_t coord_type;\n\tuint32_t num;\n};\n\nstruct xen_processor_cx {\n\tstruct xen_power_register reg;\n\tuint8_t type;\n\tuint32_t latency;\n\tuint32_t power;\n\tuint32_t dpcnt;\n\t__guest_handle_xen_processor_csd dp;\n};\n\nstruct xen_processor_px {\n\tuint64_t core_frequency;\n\tuint64_t power;\n\tuint64_t transition_latency;\n\tuint64_t bus_master_latency;\n\tuint64_t control;\n\tuint64_t status;\n};\n\nstruct xen_remove_from_physmap {\n\tdomid_t domid;\n\txen_pfn_t gpfn;\n};\n\nstruct xenbus_device {\n\tconst char *devicetype;\n\tconst char *nodename;\n\tconst char *otherend;\n\tint otherend_id;\n\tstruct xenbus_watch otherend_watch;\n\tstruct device dev;\n\tenum xenbus_state state;\n\tstruct completion down;\n\tstruct work_struct work;\n\tstruct semaphore reclaim_sem;\n\tatomic_t event_channels;\n\tatomic_t events;\n\tatomic_t spurious_events;\n\tatomic_t jiffies_eoi_delayed;\n\tunsigned int spurious_threshold;\n};\n\nstruct xenbus_device_id {\n\tchar devicetype[32];\n};\n\nstruct xenbus_driver {\n\tconst char *name;\n\tconst struct xenbus_device_id *ids;\n\tbool allow_rebind;\n\tbool not_essential;\n\tint (*probe)(struct xenbus_device *, const struct xenbus_device_id *);\n\tvoid (*otherend_changed)(struct xenbus_device *, enum xenbus_state);\n\tvoid (*remove)(struct xenbus_device *);\n\tint (*suspend)(struct xenbus_device *);\n\tint (*resume)(struct xenbus_device *);\n\tint (*uevent)(const struct xenbus_device *, struct kobj_uevent_env *);\n\tstruct device_driver driver;\n\tint (*read_otherend_details)(struct xenbus_device *);\n\tint (*is_ready)(struct xenbus_device *);\n\tvoid (*reclaim_memory)(struct xenbus_device *);\n};\n\nstruct xenbus_file_priv {\n\tstruct mutex msgbuffer_mutex;\n\tstruct list_head transactions;\n\tstruct list_head watches;\n\tunsigned int len;\n\tunion {\n\t\tstruct xsd_sockmsg msg;\n\t\tchar buffer[4096];\n\t} u;\n\tstruct mutex reply_mutex;\n\tstruct list_head read_buffers;\n\twait_queue_head_t read_waitq;\n\tstruct kref kref;\n\tstruct work_struct wq;\n};\n\nstruct xenbus_map_node {\n\tstruct list_head next;\n\tunion {\n\t\tstruct {\n\t\t\tstruct vm_struct *area;\n\t\t} pv;\n\t\tstruct {\n\t\t\tstruct page *pages[16];\n\t\t\tlong unsigned int addrs[16];\n\t\t\tvoid *addr;\n\t\t} hvm;\n\t};\n\tgrant_handle_t handles[16];\n\tunsigned int nr_handles;\n};\n\nstruct xenbus_ring_ops {\n\tint (*map)(struct xenbus_device *, struct map_ring_valloc *, grant_ref_t *, unsigned int, void **);\n\tint (*unmap)(struct xenbus_device *, void *);\n};\n\nstruct xenbus_transaction {\n\tu32 id;\n};\n\nstruct xenbus_transaction_holder {\n\tstruct list_head list;\n\tstruct xenbus_transaction handle;\n\tunsigned int generation_id;\n};\n\nstruct xencons_interface;\n\nstruct xencons_info {\n\tstruct list_head list;\n\tstruct xenbus_device *xbdev;\n\tstruct xencons_interface *intf;\n\tunsigned int evtchn;\n\tXENCONS_RING_IDX out_cons;\n\tunsigned int out_cons_same;\n\tstruct hvc_struct *hvc;\n\tint irq;\n\tint vtermno;\n\tgrant_ref_t gntref;\n\tspinlock_t ring_lock;\n};\n\nstruct xencons_interface {\n\tchar in[1024];\n\tchar out[2048];\n\tXENCONS_RING_IDX in_cons;\n\tXENCONS_RING_IDX in_prod;\n\tXENCONS_RING_IDX out_cons;\n\tXENCONS_RING_IDX out_prod;\n};\n\nstruct xennet_gnttab_make_txreq {\n\tstruct netfront_queue *queue;\n\tstruct sk_buff *skb;\n\tstruct page *page;\n\tstruct xen_netif_tx_request *tx;\n\tstruct xen_netif_tx_request tx_local;\n\tunsigned int size;\n};\n\nstruct xennet_stat {\n\tchar name[32];\n\tu16 offset;\n};\n\nstruct xenpmu {\n\tstruct xen_pmu_data *xenpmu_data;\n\tuint8_t flags;\n};\n\nstruct xenstore_domain_interface {\n\tchar req[1024];\n\tchar rsp[1024];\n\tXENSTORE_RING_IDX req_cons;\n\tXENSTORE_RING_IDX req_prod;\n\tXENSTORE_RING_IDX rsp_cons;\n\tXENSTORE_RING_IDX rsp_prod;\n\tuint32_t server_features;\n\tuint32_t connection;\n\tuint32_t error;\n};\n\nstruct xfrm4_protocol {\n\tint (*handler)(struct sk_buff *);\n\tint (*input_handler)(struct sk_buff *, int, __be32, int);\n\tint (*cb_handler)(struct sk_buff *, int);\n\tint (*err_handler)(struct sk_buff *, u32);\n\tstruct xfrm4_protocol *next;\n\tint priority;\n};\n\nstruct xfrm6_protocol {\n\tint (*handler)(struct sk_buff *);\n\tint (*input_handler)(struct sk_buff *, int, __be32, int);\n\tint (*cb_handler)(struct sk_buff *, int);\n\tint (*err_handler)(struct sk_buff *, struct inet6_skb_parm *, u8, u8, int, __be32);\n\tstruct xfrm6_protocol *next;\n\tint priority;\n};\n\nstruct xfrm_address_filter {\n\txfrm_address_t saddr;\n\txfrm_address_t daddr;\n\t__u16 family;\n\t__u8 splen;\n\t__u8 dplen;\n};\n\nstruct xfrm_algo {\n\tchar alg_name[64];\n\tunsigned int alg_key_len;\n\tchar alg_key[0];\n};\n\nstruct xfrm_algo_aead {\n\tchar alg_name[64];\n\tunsigned int alg_key_len;\n\tunsigned int alg_icv_len;\n\tchar alg_key[0];\n};\n\nstruct xfrm_algo_auth {\n\tchar alg_name[64];\n\tunsigned int alg_key_len;\n\tunsigned int alg_trunc_len;\n\tchar alg_key[0];\n};\n\nstruct xfrm_dev_offload {\n\tstruct net_device *dev;\n\tnetdevice_tracker dev_tracker;\n\tstruct net_device *real_dev;\n\tlong unsigned int offload_handle;\n\tu8 dir: 2;\n\tu8 type: 2;\n\tu8 flags: 2;\n};\n\nstruct xfrm_dst {\n\tunion {\n\t\tstruct dst_entry dst;\n\t\tstruct rtable rt;\n\t\tstruct rt6_info rt6;\n\t} u;\n\tstruct dst_entry *route;\n\tstruct dst_entry *child;\n\tstruct dst_entry *path;\n\tstruct xfrm_policy *pols[2];\n\tint num_pols;\n\tint num_xfrms;\n\tu32 xfrm_genid;\n\tu32 policy_genid;\n\tu32 route_mtu_cached;\n\tu32 child_mtu_cached;\n\tu32 route_cookie;\n\tu32 path_cookie;\n};\n\nstruct xfrm_dst_lookup_params {\n\tstruct net *net;\n\tint tos;\n\tint oif;\n\txfrm_address_t *saddr;\n\txfrm_address_t *daddr;\n\tu32 mark;\n\t__u8 ipproto;\n\tunion flowi_uli uli;\n};\n\nstruct xfrm_encap_tmpl {\n\t__u16 encap_type;\n\t__be16 encap_sport;\n\t__be16 encap_dport;\n\txfrm_address_t encap_oa;\n};\n\nstruct xfrm_flo {\n\tstruct dst_entry *dst_orig;\n\tu8 flags;\n};\n\nstruct xfrm_flow_keys {\n\tstruct flow_dissector_key_basic basic;\n\tstruct flow_dissector_key_control control;\n\tunion {\n\t\tstruct flow_dissector_key_ipv4_addrs ipv4;\n\t\tstruct flow_dissector_key_ipv6_addrs ipv6;\n\t} addrs;\n\tstruct flow_dissector_key_ip ip;\n\tstruct flow_dissector_key_icmp icmp;\n\tstruct flow_dissector_key_ports ports;\n\tstruct flow_dissector_key_keyid gre;\n};\n\nstruct xfrm_id {\n\txfrm_address_t daddr;\n\t__be32 spi;\n\t__u8 proto;\n};\n\nstruct xfrm_if_decode_session_result;\n\nstruct xfrm_if_cb {\n\tbool (*decode_session)(struct sk_buff *, short unsigned int, struct xfrm_if_decode_session_result *);\n};\n\nstruct xfrm_if_decode_session_result {\n\tstruct net *net;\n\tu32 if_id;\n};\n\nstruct xfrm_input_afinfo {\n\tu8 family;\n\tbool is_ipip;\n\tint (*callback)(struct sk_buff *, u8, int);\n};\n\nstruct xfrm_kmaddress {\n\txfrm_address_t local;\n\txfrm_address_t remote;\n\tu32 reserved;\n\tu16 family;\n};\n\nstruct xfrm_lifetime_cfg {\n\t__u64 soft_byte_limit;\n\t__u64 hard_byte_limit;\n\t__u64 soft_packet_limit;\n\t__u64 hard_packet_limit;\n\t__u64 soft_add_expires_seconds;\n\t__u64 hard_add_expires_seconds;\n\t__u64 soft_use_expires_seconds;\n\t__u64 hard_use_expires_seconds;\n};\n\nstruct xfrm_lifetime_cur {\n\t__u64 bytes;\n\t__u64 packets;\n\t__u64 add_time;\n\t__u64 use_time;\n};\n\nstruct xfrm_mark {\n\t__u32 v;\n\t__u32 m;\n};\n\nstruct xfrm_tmpl;\n\nstruct xfrm_selector;\n\nstruct xfrm_migrate;\n\nstruct xfrm_mgr {\n\tstruct list_head list;\n\tint (*notify)(struct xfrm_state *, const struct km_event *);\n\tint (*acquire)(struct xfrm_state *, struct xfrm_tmpl *, struct xfrm_policy *);\n\tstruct xfrm_policy * (*compile_policy)(struct sock *, int, u8 *, int, int *);\n\tint (*new_mapping)(struct xfrm_state *, xfrm_address_t *, __be16);\n\tint (*notify_policy)(struct xfrm_policy *, int, const struct km_event *);\n\tint (*report)(struct net *, u8, struct xfrm_selector *, xfrm_address_t *);\n\tint (*migrate)(const struct xfrm_selector *, u8, u8, const struct xfrm_migrate *, int, const struct xfrm_kmaddress *, const struct xfrm_encap_tmpl *);\n\tbool (*is_alive)(const struct km_event *);\n};\n\nstruct xfrm_migrate {\n\txfrm_address_t old_daddr;\n\txfrm_address_t old_saddr;\n\txfrm_address_t new_daddr;\n\txfrm_address_t new_saddr;\n\tu8 proto;\n\tu8 mode;\n\tu16 reserved;\n\tu32 reqid;\n\tu16 old_family;\n\tu16 new_family;\n};\n\nstruct xfrm_mode {\n\tu8 encap;\n\tu8 family;\n\tu8 flags;\n};\n\nstruct xfrm_tunnel_skb_cb {\n\tunion {\n\t\tstruct inet_skb_parm h4;\n\t\tstruct inet6_skb_parm h6;\n\t} header;\n\tunion {\n\t\tstruct ip_tunnel *ip4;\n\t\tstruct ip6_tnl *ip6;\n\t} tunnel;\n};\n\nstruct xfrm_mode_skb_cb {\n\tstruct xfrm_tunnel_skb_cb header;\n\t__be16 id;\n\t__be16 frag_off;\n\tu8 ihl;\n\tu8 tos;\n\tu8 ttl;\n\tu8 protocol;\n\tu8 optlen;\n\tu8 flow_lbl[3];\n};\n\nstruct xfrm_pol_inexact_key {\n\tpossible_net_t net;\n\tu32 if_id;\n\tu16 family;\n\tu8 dir;\n\tu8 type;\n};\n\nstruct xfrm_pol_inexact_bin {\n\tstruct xfrm_pol_inexact_key k;\n\tstruct rhash_head head;\n\tstruct hlist_head hhead;\n\tseqcount_spinlock_t count;\n\tstruct rb_root root_d;\n\tstruct rb_root root_s;\n\tstruct list_head inexact_bins;\n\tstruct callback_head rcu;\n};\n\nstruct xfrm_pol_inexact_candidates {\n\tstruct hlist_head *res[4];\n};\n\nstruct xfrm_pol_inexact_node {\n\tstruct rb_node node;\n\tunion {\n\t\txfrm_address_t addr;\n\t\tstruct callback_head rcu;\n\t};\n\tu8 prefixlen;\n\tstruct rb_root root;\n\tstruct hlist_head hhead;\n};\n\nstruct xfrm_selector {\n\txfrm_address_t daddr;\n\txfrm_address_t saddr;\n\t__be16 dport;\n\t__be16 dport_mask;\n\t__be16 sport;\n\t__be16 sport_mask;\n\t__u16 family;\n\t__u8 prefixlen_d;\n\t__u8 prefixlen_s;\n\t__u8 proto;\n\tint ifindex;\n\t__kernel_uid32_t user;\n};\n\nstruct xfrm_policy_walk_entry {\n\tstruct list_head all;\n\tu8 dead;\n};\n\nstruct xfrm_policy_queue {\n\tstruct sk_buff_head hold_queue;\n\tstruct timer_list hold_timer;\n\tlong unsigned int timeout;\n};\n\nstruct xfrm_tmpl {\n\tstruct xfrm_id id;\n\txfrm_address_t saddr;\n\tshort unsigned int encap_family;\n\tu32 reqid;\n\tu8 mode;\n\tu8 share;\n\tu8 optional;\n\tu8 allalgs;\n\tu32 aalgos;\n\tu32 ealgos;\n\tu32 calgos;\n};\n\nstruct xfrm_policy {\n\tpossible_net_t xp_net;\n\tstruct hlist_node bydst;\n\tstruct hlist_node byidx;\n\trwlock_t lock;\n\trefcount_t refcnt;\n\tu32 pos;\n\tstruct timer_list timer;\n\tatomic_t genid;\n\tu32 priority;\n\tu32 index;\n\tu32 if_id;\n\tstruct xfrm_mark mark;\n\tstruct xfrm_selector selector;\n\tstruct xfrm_lifetime_cfg lft;\n\tstruct xfrm_lifetime_cur curlft;\n\tstruct xfrm_policy_walk_entry walk;\n\tstruct xfrm_policy_queue polq;\n\tbool bydst_reinsert;\n\tu8 type;\n\tu8 action;\n\tu8 flags;\n\tu8 xfrm_nr;\n\tu16 family;\n\tstruct xfrm_sec_ctx *security;\n\tstruct xfrm_tmpl xfrm_vec[6];\n\tstruct hlist_node bydst_inexact_list;\n\tstruct callback_head rcu;\n\tstruct xfrm_dev_offload xdo;\n};\n\nstruct xfrm_policy_afinfo {\n\tstruct dst_ops *dst_ops;\n\tstruct dst_entry * (*dst_lookup)(const struct xfrm_dst_lookup_params *);\n\tint (*get_saddr)(xfrm_address_t *, const struct xfrm_dst_lookup_params *);\n\tint (*fill_dst)(struct xfrm_dst *, struct net_device *, const struct flowi *);\n\tstruct dst_entry * (*blackhole_route)(struct net *, struct dst_entry *);\n};\n\nstruct xfrm_policy_walk {\n\tstruct xfrm_policy_walk_entry walk;\n\tu8 type;\n\tu32 seq;\n};\n\nstruct xfrm_replay_state {\n\t__u32 oseq;\n\t__u32 seq;\n\t__u32 bitmap;\n};\n\nstruct xfrm_replay_state_esn {\n\tunsigned int bmp_len;\n\t__u32 oseq;\n\t__u32 seq;\n\t__u32 oseq_hi;\n\t__u32 seq_hi;\n\t__u32 replay_window;\n\t__u32 bmp[0];\n};\n\nstruct xfrm_sec_ctx {\n\t__u8 ctx_doi;\n\t__u8 ctx_alg;\n\t__u16 ctx_len;\n\t__u32 ctx_sid;\n\tchar ctx_str[0];\n};\n\nstruct xfrm_skb_cb {\n\tstruct xfrm_tunnel_skb_cb header;\n\tunion {\n\t\tstruct {\n\t\t\t__u32 low;\n\t\t\t__u32 hi;\n\t\t} output;\n\t\tstruct {\n\t\t\t__be32 low;\n\t\t\t__be32 hi;\n\t\t} input;\n\t} seq;\n};\n\nstruct xfrm_spi_skb_cb {\n\tstruct xfrm_tunnel_skb_cb header;\n\tunsigned int daddroff;\n\tunsigned int family;\n\t__be32 seq;\n};\n\nstruct xfrm_state_walk {\n\tstruct list_head all;\n\tu8 state;\n\tu8 dying;\n\tu8 proto;\n\tu32 seq;\n\tstruct xfrm_address_filter *filter;\n};\n\nstruct xfrm_stats {\n\t__u32 replay_window;\n\t__u32 replay;\n\t__u32 integrity_failed;\n};\n\nstruct xfrm_type;\n\nstruct xfrm_type_offload;\n\nstruct xfrm_state {\n\tpossible_net_t xs_net;\n\tunion {\n\t\tstruct hlist_node gclist;\n\t\tstruct hlist_node bydst;\n\t};\n\tunion {\n\t\tstruct hlist_node dev_gclist;\n\t\tstruct hlist_node bysrc;\n\t};\n\tstruct hlist_node byspi;\n\tstruct hlist_node byseq;\n\trefcount_t refcnt;\n\tspinlock_t lock;\n\tstruct xfrm_id id;\n\tstruct xfrm_selector sel;\n\tstruct xfrm_mark mark;\n\tu32 if_id;\n\tu32 tfcpad;\n\tu32 genid;\n\tstruct xfrm_state_walk km;\n\tstruct {\n\t\tu32 reqid;\n\t\tu8 mode;\n\t\tu8 replay_window;\n\t\tu8 aalgo;\n\t\tu8 ealgo;\n\t\tu8 calgo;\n\t\tu8 flags;\n\t\tu16 family;\n\t\txfrm_address_t saddr;\n\t\tint header_len;\n\t\tint trailer_len;\n\t\tu32 extra_flags;\n\t\tstruct xfrm_mark smark;\n\t} props;\n\tstruct xfrm_lifetime_cfg lft;\n\tstruct xfrm_algo_auth *aalg;\n\tstruct xfrm_algo *ealg;\n\tstruct xfrm_algo *calg;\n\tstruct xfrm_algo_aead *aead;\n\tconst char *geniv;\n\t__be16 new_mapping_sport;\n\tu32 new_mapping;\n\tu32 mapping_maxage;\n\tstruct xfrm_encap_tmpl *encap;\n\tstruct sock *encap_sk;\n\tu32 nat_keepalive_interval;\n\ttime64_t nat_keepalive_expiration;\n\txfrm_address_t *coaddr;\n\tstruct xfrm_state *tunnel;\n\tatomic_t tunnel_users;\n\tstruct xfrm_replay_state replay;\n\tstruct xfrm_replay_state_esn *replay_esn;\n\tstruct xfrm_replay_state preplay;\n\tstruct xfrm_replay_state_esn *preplay_esn;\n\tenum xfrm_replay_mode repl_mode;\n\tu32 xflags;\n\tu32 replay_maxage;\n\tu32 replay_maxdiff;\n\tstruct timer_list rtimer;\n\tstruct xfrm_stats stats;\n\tstruct xfrm_lifetime_cur curlft;\n\tstruct hrtimer mtimer;\n\tstruct xfrm_dev_offload xso;\n\tlong int saved_tmo;\n\ttime64_t lastused;\n\tstruct page_frag xfrag;\n\tconst struct xfrm_type *type;\n\tstruct xfrm_mode inner_mode;\n\tstruct xfrm_mode inner_mode_iaf;\n\tstruct xfrm_mode outer_mode;\n\tconst struct xfrm_type_offload *type_offload;\n\tstruct xfrm_sec_ctx *security;\n\tvoid *data;\n\tu8 dir;\n};\n\nstruct xfrm_state_afinfo {\n\tu8 family;\n\tu8 proto;\n\tconst struct xfrm_type_offload *type_offload_esp;\n\tconst struct xfrm_type *type_esp;\n\tconst struct xfrm_type *type_ipip;\n\tconst struct xfrm_type *type_ipip6;\n\tconst struct xfrm_type *type_comp;\n\tconst struct xfrm_type *type_ah;\n\tconst struct xfrm_type *type_routing;\n\tconst struct xfrm_type *type_dstopts;\n\tint (*output)(struct net *, struct sock *, struct sk_buff *);\n\tint (*transport_finish)(struct sk_buff *, int);\n\tvoid (*local_error)(struct sk_buff *, u32);\n};\n\nstruct xfrm_trans_cb {\n\tunion {\n\t\tstruct inet_skb_parm h4;\n\t\tstruct inet6_skb_parm h6;\n\t} header;\n\tint (*finish)(struct net *, struct sock *, struct sk_buff *);\n\tstruct net *net;\n};\n\nstruct xfrm_trans_tasklet {\n\tstruct work_struct work;\n\tspinlock_t queue_lock;\n\tstruct sk_buff_head queue;\n};\n\nstruct xfrm_translator {\n\tint (*alloc_compat)(struct sk_buff *, const struct nlmsghdr *);\n\tstruct nlmsghdr * (*rcv_msg_compat)(const struct nlmsghdr *, int, const struct nla_policy *, struct netlink_ext_ack *);\n\tint (*xlate_user_policy_sockptr)(u8 **, int);\n\tstruct module *owner;\n};\n\nstruct xfrm_type {\n\tstruct module *owner;\n\tu8 proto;\n\tu8 flags;\n\tint (*init_state)(struct xfrm_state *, struct netlink_ext_ack *);\n\tvoid (*destructor)(struct xfrm_state *);\n\tint (*input)(struct xfrm_state *, struct sk_buff *);\n\tint (*output)(struct xfrm_state *, struct sk_buff *);\n\tint (*reject)(struct xfrm_state *, struct sk_buff *, const struct flowi *);\n};\n\nstruct xfrm_type_offload {\n\tstruct module *owner;\n\tu8 proto;\n\tvoid (*encap)(struct xfrm_state *, struct sk_buff *);\n\tint (*input_tail)(struct xfrm_state *, struct sk_buff *);\n\tint (*xmit)(struct xfrm_state *, struct sk_buff *, netdev_features_t);\n};\n\nstruct xfrm_user_offload {\n\tint ifindex;\n\t__u8 flags;\n};\n\nstruct xfrm_user_sec_ctx {\n\t__u16 len;\n\t__u16 exttype;\n\t__u8 ctx_alg;\n\t__u8 ctx_doi;\n\t__u16 ctx_len;\n};\n\nstruct xfrmdev_ops {\n\tint (*xdo_dev_state_add)(struct xfrm_state *, struct netlink_ext_ack *);\n\tvoid (*xdo_dev_state_delete)(struct xfrm_state *);\n\tvoid (*xdo_dev_state_free)(struct xfrm_state *);\n\tbool (*xdo_dev_offload_ok)(struct sk_buff *, struct xfrm_state *);\n\tvoid (*xdo_dev_state_advance_esn)(struct xfrm_state *);\n\tvoid (*xdo_dev_state_update_stats)(struct xfrm_state *);\n\tint (*xdo_dev_policy_add)(struct xfrm_policy *, struct netlink_ext_ack *);\n\tvoid (*xdo_dev_policy_delete)(struct xfrm_policy *);\n\tvoid (*xdo_dev_policy_free)(struct xfrm_policy *);\n};\n\nstruct xfrmk_sadinfo {\n\tu32 sadhcnt;\n\tu32 sadhmcnt;\n\tu32 sadcnt;\n};\n\nstruct xfrmk_spdinfo {\n\tu32 incnt;\n\tu32 outcnt;\n\tu32 fwdcnt;\n\tu32 inscnt;\n\tu32 outscnt;\n\tu32 fwdscnt;\n\tu32 spdhcnt;\n\tu32 spdhmcnt;\n};\n\nstruct xhci_bus_state {\n\tlong unsigned int bus_suspended;\n\tlong unsigned int next_statechange;\n\tu32 port_c_suspend;\n\tu32 suspended_ports;\n\tu32 port_remote_wakeup;\n\tlong unsigned int resuming_ports;\n};\n\nstruct xhci_bw_info {\n\tunsigned int ep_interval;\n\tunsigned int mult;\n\tunsigned int num_packets;\n\tunsigned int max_packet_size;\n\tunsigned int max_esit_payload;\n\tunsigned int type;\n};\n\nstruct xhci_cap_regs {\n\t__le32 hc_capbase;\n\t__le32 hcs_params1;\n\t__le32 hcs_params2;\n\t__le32 hcs_params3;\n\t__le32 hcc_params;\n\t__le32 db_off;\n\t__le32 run_regs_off;\n\t__le32 hcc_params2;\n};\n\nstruct xhci_container_ctx;\n\nstruct xhci_command {\n\tstruct xhci_container_ctx *in_ctx;\n\tu32 status;\n\tint slot_id;\n\tstruct completion *completion;\n\tunion xhci_trb *command_trb;\n\tstruct list_head cmd_list;\n\tunsigned int timeout_ms;\n};\n\nstruct xhci_container_ctx {\n\tunsigned int type;\n\tint size;\n\tu8 *bytes;\n\tdma_addr_t dma;\n};\n\nstruct xhci_erst_entry;\n\nstruct xhci_erst {\n\tstruct xhci_erst_entry *entries;\n\tunsigned int num_entries;\n\tdma_addr_t erst_dma_addr;\n};\n\nstruct xhci_hcd;\n\nstruct xhci_dbc {\n\tspinlock_t lock;\n\tstruct device *dev;\n\tstruct xhci_hcd *xhci;\n\tstruct dbc_regs *regs;\n\tstruct xhci_ring *ring_evt;\n\tstruct xhci_ring *ring_in;\n\tstruct xhci_ring *ring_out;\n\tstruct xhci_erst erst;\n\tstruct xhci_container_ctx *ctx;\n\tstruct dbc_str_descs *string;\n\tdma_addr_t string_dma;\n\tsize_t string_size;\n\tu16 idVendor;\n\tu16 idProduct;\n\tu16 bcdDevice;\n\tu8 bInterfaceProtocol;\n\tenum dbc_state state;\n\tstruct delayed_work event_work;\n\tunsigned int poll_interval;\n\tunsigned int resume_required: 1;\n\tstruct dbc_ep eps[2];\n\tconst struct dbc_driver *driver;\n\tvoid *priv;\n};\n\nstruct xhci_device_context_array {\n\t__le64 dev_context_ptrs[256];\n\tdma_addr_t dma;\n};\n\nstruct xhci_doorbell_array {\n\t__le32 doorbell[256];\n};\n\nstruct xhci_driver_overrides {\n\tsize_t extra_priv_size;\n\tint (*reset)(struct usb_hcd *);\n\tint (*start)(struct usb_hcd *);\n\tint (*add_endpoint)(struct usb_hcd *, struct usb_device *, struct usb_host_endpoint *);\n\tint (*drop_endpoint)(struct usb_hcd *, struct usb_device *, struct usb_host_endpoint *);\n\tint (*check_bandwidth)(struct usb_hcd *, struct usb_device *);\n\tvoid (*reset_bandwidth)(struct usb_hcd *, struct usb_device *);\n\tint (*update_hub_device)(struct usb_hcd *, struct usb_device *, struct usb_tt *, gfp_t);\n\tint (*hub_control)(struct usb_hcd *, u16, u16, u16, char *, u16);\n};\n\nstruct xhci_ep_ctx {\n\t__le32 ep_info;\n\t__le32 ep_info2;\n\t__le64 deq;\n\t__le32 tx_info;\n\t__le32 reserved[3];\n};\n\nstruct xhci_stream_info;\n\nstruct xhci_ep_priv {\n\tchar name[32];\n\tstruct dentry *root;\n\tstruct xhci_stream_info *stream_info;\n\tstruct xhci_ring *show_ring;\n\tunsigned int stream_id;\n};\n\nstruct xhci_erst_entry {\n\t__le64 seg_addr;\n\t__le32 seg_size;\n\t__le32 rsvd;\n};\n\nstruct xhci_event_cmd {\n\t__le64 cmd_trb;\n\t__le32 status;\n\t__le32 flags;\n};\n\nstruct xhci_file_map {\n\tconst char *name;\n\tint (*show)(struct seq_file *, void *);\n};\n\nstruct xhci_generic_trb {\n\t__le32 field[4];\n};\n\nstruct xhci_port;\n\nstruct xhci_hub {\n\tstruct xhci_port **ports;\n\tunsigned int num_ports;\n\tstruct usb_hcd *hcd;\n\tstruct xhci_bus_state bus_state;\n\tu8 maj_rev;\n\tu8 min_rev;\n};\n\nstruct xhci_op_regs;\n\nstruct xhci_run_regs;\n\nstruct xhci_interrupter;\n\nstruct xhci_scratchpad;\n\nstruct xhci_virt_device;\n\nstruct xhci_root_port_bw_info;\n\nstruct xhci_port_cap;\n\nstruct xhci_hcd {\n\tstruct usb_hcd *main_hcd;\n\tstruct usb_hcd *shared_hcd;\n\tstruct xhci_cap_regs *cap_regs;\n\tstruct xhci_op_regs *op_regs;\n\tstruct xhci_run_regs *run_regs;\n\tstruct xhci_doorbell_array *dba;\n\t__u32 hcs_params1;\n\t__u32 hcs_params2;\n\t__u32 hcs_params3;\n\t__u32 hcc_params;\n\t__u32 hcc_params2;\n\tspinlock_t lock;\n\tu8 sbrn;\n\tu16 hci_version;\n\tu8 max_slots;\n\tu16 max_interrupters;\n\tu8 max_ports;\n\tu8 isoc_threshold;\n\tu32 imod_interval;\n\tint event_ring_max;\n\tint page_size;\n\tint page_shift;\n\tint nvecs;\n\tstruct clk *clk;\n\tstruct clk *reg_clk;\n\tstruct reset_control *reset;\n\tstruct xhci_device_context_array *dcbaa;\n\tstruct xhci_interrupter **interrupters;\n\tstruct xhci_ring *cmd_ring;\n\tunsigned int cmd_ring_state;\n\tstruct list_head cmd_list;\n\tunsigned int cmd_ring_reserved_trbs;\n\tstruct delayed_work cmd_timer;\n\tstruct completion cmd_ring_stop_completion;\n\tstruct xhci_command *current_cmd;\n\tstruct xhci_scratchpad *scratchpad;\n\tstruct mutex mutex;\n\tstruct xhci_virt_device *devs[256];\n\tstruct xhci_root_port_bw_info *rh_bw;\n\tstruct dma_pool *device_pool;\n\tstruct dma_pool *segment_pool;\n\tstruct dma_pool *small_streams_pool;\n\tstruct dma_pool *medium_streams_pool;\n\tunsigned int xhc_state;\n\tlong unsigned int run_graceperiod;\n\tstruct s3_save s3;\n\tlong long unsigned int quirks;\n\tunsigned int num_active_eps;\n\tunsigned int limit_active_eps;\n\tstruct xhci_port *hw_ports;\n\tstruct xhci_hub usb2_rhub;\n\tstruct xhci_hub usb3_rhub;\n\tunsigned int hw_lpm_support: 1;\n\tunsigned int broken_suspend: 1;\n\tunsigned int allow_single_roothub: 1;\n\tstruct xhci_port_cap *port_caps;\n\tunsigned int num_port_caps;\n\tstruct timer_list comp_mode_recovery_timer;\n\tu32 port_status_u0;\n\tu16 test_mode;\n\tstruct dentry *debugfs_root;\n\tstruct dentry *debugfs_slots;\n\tstruct list_head regset_list;\n\tvoid *dbc;\n\tlong unsigned int priv[0];\n};\n\nstruct xhci_input_control_ctx {\n\t__le32 drop_flags;\n\t__le32 add_flags;\n\t__le32 rsvd2[6];\n};\n\nstruct xhci_intr_reg;\n\nstruct xhci_interrupter {\n\tstruct xhci_ring *event_ring;\n\tstruct xhci_erst erst;\n\tstruct xhci_intr_reg *ir_set;\n\tunsigned int intr_num;\n\tbool ip_autoclear;\n\tu32 isoc_bei_interval;\n\tu32 s3_irq_pending;\n\tu32 s3_irq_control;\n\tu32 s3_erst_size;\n\tu64 s3_erst_base;\n\tu64 s3_erst_dequeue;\n};\n\nstruct xhci_interval_bw {\n\tunsigned int num_packets;\n\tstruct list_head endpoints;\n\tunsigned int overhead[3];\n};\n\nstruct xhci_interval_bw_table {\n\tunsigned int interval0_esit_payload;\n\tstruct xhci_interval_bw interval_bw[16];\n\tunsigned int bw_used;\n\tunsigned int ss_bw_in;\n\tunsigned int ss_bw_out;\n};\n\nstruct xhci_intr_reg {\n\t__le32 irq_pending;\n\t__le32 irq_control;\n\t__le32 erst_size;\n\t__le32 rsvd;\n\t__le64 erst_base;\n\t__le64 erst_dequeue;\n};\n\nstruct xhci_link_trb {\n\t__le64 segment_ptr;\n\t__le32 intr_target;\n\t__le32 control;\n};\n\nstruct xhci_op_regs {\n\t__le32 command;\n\t__le32 status;\n\t__le32 page_size;\n\t__le32 reserved1;\n\t__le32 reserved2;\n\t__le32 dev_notification;\n\t__le64 cmd_ring;\n\t__le32 reserved3[4];\n\t__le64 dcbaa_ptr;\n\t__le32 config_reg;\n\t__le32 reserved4[241];\n\t__le32 port_status_base;\n\t__le32 port_power_base;\n\t__le32 port_link_base;\n\t__le32 reserved5;\n\t__le32 reserved6[1016];\n};\n\nstruct xhci_port {\n\t__le32 *addr;\n\tint hw_portnum;\n\tint hcd_portnum;\n\tstruct xhci_hub *rhub;\n\tstruct xhci_port_cap *port_cap;\n\tunsigned int lpm_incapable: 1;\n\tlong unsigned int resume_timestamp;\n\tbool rexit_active;\n\tint slot_id;\n\tstruct completion rexit_done;\n\tstruct completion u3exit_done;\n};\n\nstruct xhci_port_cap {\n\tu32 *psi;\n\tu8 psi_count;\n\tu8 psi_uid_count;\n\tu8 maj_rev;\n\tu8 min_rev;\n\tu32 protocol_caps;\n};\n\nstruct xhci_regset {\n\tchar name[32];\n\tstruct debugfs_regset32 regset;\n\tsize_t nregs;\n\tstruct list_head list;\n};\n\nstruct xhci_ring {\n\tstruct xhci_segment *first_seg;\n\tstruct xhci_segment *last_seg;\n\tunion xhci_trb *enqueue;\n\tstruct xhci_segment *enq_seg;\n\tunion xhci_trb *dequeue;\n\tstruct xhci_segment *deq_seg;\n\tstruct list_head td_list;\n\tu32 cycle_state;\n\tunsigned int stream_id;\n\tunsigned int num_segs;\n\tunsigned int num_trbs_free;\n\tunsigned int bounce_buf_len;\n\tenum xhci_ring_type type;\n\tbool last_td_was_short;\n\tstruct xarray *trb_address_map;\n};\n\nstruct xhci_root_port_bw_info {\n\tstruct list_head tts;\n\tunsigned int num_active_tts;\n\tstruct xhci_interval_bw_table bw_table;\n};\n\nstruct xhci_run_regs {\n\t__le32 microframe_index;\n\t__le32 rsvd[7];\n\tstruct xhci_intr_reg ir_set[128];\n};\n\nstruct xhci_scratchpad {\n\tu64 *sp_array;\n\tdma_addr_t sp_dma;\n\tvoid **sp_buffers;\n};\n\nstruct xhci_segment {\n\tunion xhci_trb *trbs;\n\tstruct xhci_segment *next;\n\tunsigned int num;\n\tdma_addr_t dma;\n\tdma_addr_t bounce_dma;\n\tvoid *bounce_buf;\n\tunsigned int bounce_offs;\n\tunsigned int bounce_len;\n};\n\nstruct xhci_slot_ctx {\n\t__le32 dev_info;\n\t__le32 dev_info2;\n\t__le32 tt_info;\n\t__le32 dev_state;\n\t__le32 reserved[4];\n};\n\nstruct xhci_slot_priv {\n\tchar name[32];\n\tstruct dentry *root;\n\tstruct xhci_ep_priv *eps[31];\n\tstruct xhci_virt_device *dev;\n};\n\nstruct xhci_stream_ctx {\n\t__le64 stream_ring;\n\t__le32 reserved[2];\n};\n\nstruct xhci_stream_info {\n\tstruct xhci_ring **stream_rings;\n\tunsigned int num_streams;\n\tstruct xhci_stream_ctx *stream_ctx_array;\n\tunsigned int num_stream_ctxs;\n\tdma_addr_t ctx_array_dma;\n\tstruct xarray trb_address_map;\n\tstruct xhci_command *free_streams_command;\n};\n\nstruct xhci_transfer_event {\n\t__le64 buffer;\n\t__le32 transfer_len;\n\t__le32 flags;\n};\n\nunion xhci_trb {\n\tstruct xhci_link_trb link;\n\tstruct xhci_transfer_event trans_event;\n\tstruct xhci_event_cmd event_cmd;\n\tstruct xhci_generic_trb generic;\n};\n\nstruct xhci_tt_bw_info {\n\tstruct list_head tt_list;\n\tint slot_id;\n\tint ttport;\n\tstruct xhci_interval_bw_table bw_table;\n\tint active_eps;\n};\n\nstruct xhci_virt_ep {\n\tstruct xhci_virt_device *vdev;\n\tunsigned int ep_index;\n\tstruct xhci_ring *ring;\n\tstruct xhci_stream_info *stream_info;\n\tstruct xhci_ring *new_ring;\n\tunsigned int err_count;\n\tunsigned int ep_state;\n\tstruct list_head cancelled_td_list;\n\tstruct xhci_hcd *xhci;\n\tstruct xhci_segment *queued_deq_seg;\n\tunion xhci_trb *queued_deq_ptr;\n\tbool skip;\n\tstruct xhci_bw_info bw_info;\n\tstruct list_head bw_endpoint_list;\n\tlong unsigned int stop_time;\n\tint next_frame_id;\n\tbool use_extended_tbc;\n};\n\nstruct xhci_virt_device {\n\tint slot_id;\n\tstruct usb_device *udev;\n\tstruct xhci_container_ctx *out_ctx;\n\tstruct xhci_container_ctx *in_ctx;\n\tstruct xhci_virt_ep eps[31];\n\tstruct xhci_port *rhub_port;\n\tstruct xhci_interval_bw_table *bw_table;\n\tstruct xhci_tt_bw_info *tt_info;\n\tlong unsigned int flags;\n\tu16 current_mel;\n\tvoid *debugfs_private;\n};\n\nstruct xmaddr {\n\tphys_addr_t maddr;\n};\n\ntypedef struct xmaddr xmaddr_t;\n\nstruct xol_area {\n\twait_queue_head_t wq;\n\tatomic_t slot_count;\n\tlong unsigned int *bitmap;\n\tstruct vm_special_mapping xol_mapping;\n\tstruct page *pages[2];\n\tlong unsigned int vaddr;\n};\n\nstruct xpaddr {\n\tphys_addr_t paddr;\n};\n\ntypedef struct xpaddr xpaddr_t;\n\nstruct xprt_create;\n\nstruct xprt_class {\n\tstruct list_head list;\n\tint ident;\n\tstruct rpc_xprt * (*setup)(struct xprt_create *);\n\tstruct module *owner;\n\tchar name[32];\n\tconst char *netid[0];\n};\n\nstruct xprt_create {\n\tint ident;\n\tstruct net *net;\n\tstruct sockaddr *srcaddr;\n\tstruct sockaddr *dstaddr;\n\tsize_t addrlen;\n\tconst char *servername;\n\tstruct svc_xprt *bc_xprt;\n\tstruct rpc_xprt_switch *bc_xps;\n\tunsigned int flags;\n\tstruct xprtsec_parms xprtsec;\n\tlong unsigned int connect_timeout;\n\tlong unsigned int reconnect_timeout;\n};\n\nstruct xps_map;\n\nstruct xps_dev_maps {\n\tstruct callback_head rcu;\n\tunsigned int nr_ids;\n\ts16 num_tc;\n\tstruct xps_map *attr_map[0];\n};\n\nstruct xps_map {\n\tunsigned int len;\n\tunsigned int alloc_len;\n\tstruct callback_head rcu;\n\tu16 queues[0];\n};\n\nstruct xs_watch_event {\n\tstruct list_head list;\n\tunsigned int len;\n\tstruct xenbus_watch *handle;\n\tconst char *path;\n\tconst char *token;\n\tchar body[0];\n};\n\nstruct xsd_errors {\n\tint errnum;\n\tconst char *errstring;\n};\n\nstruct xsk_buff_pool {\n\tstruct device *dev;\n\tstruct net_device *netdev;\n\tstruct list_head xsk_tx_list;\n\tspinlock_t xsk_tx_list_lock;\n\trefcount_t users;\n\tstruct xdp_umem *umem;\n\tstruct work_struct work;\n\tstruct list_head free_list;\n\tstruct list_head xskb_list;\n\tu32 heads_cnt;\n\tu16 queue_id;\n\tlong: 64;\n\tstruct xsk_queue *fq;\n\tstruct xsk_queue *cq;\n\tdma_addr_t *dma_pages;\n\tstruct xdp_buff_xsk *heads;\n\tstruct xdp_desc *tx_descs;\n\tu64 chunk_mask;\n\tu64 addrs_cnt;\n\tu32 free_list_cnt;\n\tu32 dma_pages_cnt;\n\tu32 free_heads_cnt;\n\tu32 headroom;\n\tu32 chunk_size;\n\tu32 chunk_shift;\n\tu32 frame_len;\n\tu8 tx_metadata_len;\n\tu8 cached_need_wakeup;\n\tbool uses_need_wakeup;\n\tbool unaligned;\n\tbool tx_sw_csum;\n\tvoid *addrs;\n\tspinlock_t cq_lock;\n\tstruct xdp_buff_xsk *free_heads[0];\n\tlong: 64;\n\tlong: 64;\n};\n\nstruct xsk_cb_desc {\n\tvoid *src;\n\tu8 off;\n\tu8 bytes;\n};\n\nstruct xsk_dma_map {\n\tdma_addr_t *dma_pages;\n\tstruct device *dev;\n\tstruct net_device *netdev;\n\trefcount_t users;\n\tstruct list_head list;\n\tu32 dma_pages_cnt;\n};\n\nstruct xsk_map {\n\tstruct bpf_map map;\n\tspinlock_t lock;\n\tatomic_t count;\n\tstruct xdp_sock *xsk_map[0];\n};\n\nstruct xsk_map_node {\n\tstruct list_head node;\n\tstruct xsk_map *map;\n\tstruct xdp_sock **map_entry;\n};\n\nstruct xsk_queue {\n\tu32 ring_mask;\n\tu32 nentries;\n\tu32 cached_prod;\n\tu32 cached_cons;\n\tstruct xdp_ring *ring;\n\tu64 invalid_descs;\n\tu64 queue_empty_descs;\n\tsize_t ring_vmalloc_size;\n};\n\nstruct xsk_tx_metadata {\n\t__u64 flags;\n\tunion {\n\t\tstruct {\n\t\t\t__u16 csum_start;\n\t\t\t__u16 csum_offset;\n\t\t} request;\n\t\tstruct {\n\t\t\t__u64 tx_timestamp;\n\t\t} completion;\n\t};\n};\n\nstruct xsk_tx_metadata_ops {\n\tvoid (*tmo_request_timestamp)(void *);\n\tu64 (*tmo_fill_timestamp)(void *);\n\tvoid (*tmo_request_checksum)(u16, u16, void *);\n};\n\nstruct xts_instance_ctx {\n\tstruct crypto_skcipher_spawn spawn;\n\tstruct crypto_cipher_spawn tweak_spawn;\n};\n\nstruct xts_request_ctx {\n\tle128 t;\n\tstruct scatterlist *tail;\n\tstruct scatterlist sg[2];\n\tstruct skcipher_request subreq;\n};\n\nstruct xts_tfm_ctx {\n\tstruct crypto_skcipher *child;\n\tstruct crypto_cipher *tweak;\n};\n\nstruct xxh32_state {\n\tuint32_t total_len_32;\n\tuint32_t large_len;\n\tuint32_t v1;\n\tuint32_t v2;\n\tuint32_t v3;\n\tuint32_t v4;\n\tuint32_t mem32[4];\n\tuint32_t memsize;\n};\n\nstruct xz_dec_hash {\n\tvli_type unpadded;\n\tvli_type uncompressed;\n\tuint32_t crc32;\n};\n\nstruct xz_dec_lzma2;\n\nstruct xz_dec_bcj;\n\nstruct xz_dec {\n\tenum {\n\t\tSEQ_STREAM_HEADER = 0,\n\t\tSEQ_BLOCK_START = 1,\n\t\tSEQ_BLOCK_HEADER = 2,\n\t\tSEQ_BLOCK_UNCOMPRESS = 3,\n\t\tSEQ_BLOCK_PADDING = 4,\n\t\tSEQ_BLOCK_CHECK = 5,\n\t\tSEQ_INDEX = 6,\n\t\tSEQ_INDEX_PADDING = 7,\n\t\tSEQ_INDEX_CRC32 = 8,\n\t\tSEQ_STREAM_FOOTER = 9,\n\t} sequence;\n\tuint32_t pos;\n\tvli_type vli;\n\tsize_t in_start;\n\tsize_t out_start;\n\tuint32_t crc32;\n\tenum xz_check check_type;\n\tenum xz_mode mode;\n\tbool allow_buf_error;\n\tstruct {\n\t\tvli_type compressed;\n\t\tvli_type uncompressed;\n\t\tuint32_t size;\n\t} block_header;\n\tstruct {\n\t\tvli_type compressed;\n\t\tvli_type uncompressed;\n\t\tvli_type count;\n\t\tstruct xz_dec_hash hash;\n\t} block;\n\tstruct {\n\t\tenum {\n\t\t\tSEQ_INDEX_COUNT = 0,\n\t\t\tSEQ_INDEX_UNPADDED = 1,\n\t\t\tSEQ_INDEX_UNCOMPRESSED = 2,\n\t\t} sequence;\n\t\tvli_type size;\n\t\tvli_type count;\n\t\tstruct xz_dec_hash hash;\n\t} index;\n\tstruct {\n\t\tsize_t pos;\n\t\tsize_t size;\n\t\tuint8_t buf[1024];\n\t} temp;\n\tstruct xz_dec_lzma2 *lzma2;\n\tstruct xz_dec_bcj *bcj;\n\tbool bcj_active;\n};\n\nstruct xz_dec_bcj {\n\tenum {\n\t\tBCJ_X86 = 4,\n\t\tBCJ_POWERPC = 5,\n\t\tBCJ_IA64 = 6,\n\t\tBCJ_ARM = 7,\n\t\tBCJ_ARMTHUMB = 8,\n\t\tBCJ_SPARC = 9,\n\t} type;\n\tenum xz_ret ret;\n\tbool single_call;\n\tuint32_t pos;\n\tuint32_t x86_prev_mask;\n\tuint8_t *out;\n\tsize_t out_pos;\n\tsize_t out_size;\n\tstruct {\n\t\tsize_t filtered;\n\t\tsize_t size;\n\t\tuint8_t buf[16];\n\t} temp;\n};\n\nstruct xz_dec_lzma2 {\n\tstruct rc_dec rc;\n\tstruct dictionary dict;\n\tstruct lzma2_dec lzma2;\n\tstruct lzma_dec lzma;\n\tstruct {\n\t\tuint32_t size;\n\t\tuint8_t buf[63];\n\t} temp;\n};\n\nstruct xz_dec_microlzma {\n\tstruct xz_dec_lzma2 s;\n};\n\nstruct zap_details {\n\tstruct folio *single_folio;\n\tbool even_cows;\n\tzap_flags_t zap_flags;\n};\n\nstruct zbud_header {\n\tstruct list_head buddy;\n\tunsigned int first_chunks;\n\tunsigned int last_chunks;\n};\n\nstruct zbud_pool {\n\tspinlock_t lock;\n\tunion {\n\t\tstruct list_head buddied;\n\t\tstruct list_head unbuddied[63];\n\t};\n\tu64 pages_nr;\n};\n\nstruct zone_report_args {\n\tstruct blk_zone *zones;\n};\n\nstruct zpodd {\n\tenum odd_mech_type mech_type;\n\tstruct ata_device *dev;\n\tbool from_notify;\n\tbool zp_ready;\n\tlong unsigned int last_ready;\n\tbool zp_sampled;\n\tbool powered_off;\n};\n\nstruct zpool_driver;\n\nstruct zpool {\n\tstruct zpool_driver *driver;\n\tvoid *pool;\n};\n\nstruct zpool_driver {\n\tchar *type;\n\tstruct module *owner;\n\tatomic_t refcount;\n\tstruct list_head list;\n\tvoid * (*create)(const char *, gfp_t);\n\tvoid (*destroy)(void *);\n\tbool malloc_support_movable;\n\tint (*malloc)(void *, size_t, gfp_t, long unsigned int *);\n\tvoid (*free)(void *, long unsigned int);\n\tbool sleep_mapped;\n\tvoid * (*map)(void *, long unsigned int, enum zpool_mapmode);\n\tvoid (*unmap)(void *, long unsigned int);\n\tu64 (*total_pages)(void *);\n};\n\nstruct zs_pool_stats {\n\tatomic_long_t pages_compacted;\n};\n\nstruct zs_pool {\n\tconst char *name;\n\tstruct size_class *size_class[255];\n\tstruct kmem_cache *handle_cachep;\n\tstruct kmem_cache *zspage_cachep;\n\tatomic_long_t pages_allocated;\n\tstruct zs_pool_stats stats;\n\tstruct shrinker *shrinker;\n\tstruct work_struct free_work;\n\trwlock_t migrate_lock;\n\tatomic_t compaction_in_progress;\n};\n\nstruct zspage {\n\tstruct {\n\t\tunsigned int huge: 1;\n\t\tunsigned int fullness: 4;\n\t\tunsigned int class: 9;\n\t\tunsigned int magic: 8;\n\t};\n\tunsigned int inuse;\n\tunsigned int freeobj;\n\tstruct page *first_page;\n\tstruct list_head list;\n\tstruct zs_pool *pool;\n\trwlock_t lock;\n};\n\nstruct zswap_pool;\n\nstruct zswap_entry {\n\tswp_entry_t swpentry;\n\tunsigned int length;\n\tstruct zswap_pool *pool;\n\tunion {\n\t\tlong unsigned int handle;\n\t\tlong unsigned int value;\n\t};\n\tstruct obj_cgroup *objcg;\n\tstruct list_head lru;\n};\n\nstruct zswap_pool {\n\tstruct zpool *zpool;\n\tstruct crypto_acomp_ctx *acomp_ctx;\n\tstruct percpu_ref ref;\n\tstruct list_head list;\n\tstruct work_struct release_work;\n\tstruct hlist_node node;\n\tchar tfm_name[128];\n};\n\ntypedef size_t (*ZSTD_blockCompressor)(ZSTD_matchState_t *, seqStore_t *, U32 *, const void *, size_t);\n\ntypedef U32 (*ZSTD_getAllMatchesFn)(ZSTD_match_t *, ZSTD_matchState_t *, U32 *, const BYTE *, const BYTE *, const U32 *, const U32, const U32);\n\ntypedef size_t (*ZSTD_sequenceCopier)(ZSTD_CCtx *, ZSTD_sequencePosition *, const ZSTD_Sequence * const, size_t, const void *, size_t);\n\ntypedef acpi_status (*acpi_exception_handler)(acpi_status, acpi_name, u16, u32, void *);\n\ntypedef acpi_status (*acpi_execute_op)(struct acpi_walk_state *);\n\ntypedef void (*acpi_gbl_event_handler)(u32, acpi_handle, u32, void *);\n\ntypedef acpi_status (*acpi_gpe_callback)(struct acpi_gpe_xrupt_info *, struct acpi_gpe_block_info *, void *);\n\ntypedef acpi_status (*acpi_init_handler)(acpi_handle, u32);\n\ntypedef u32 (*acpi_interface_handler)(acpi_string, u32);\n\ntypedef u32 (*acpi_osd_handler)(void *);\n\ntypedef acpi_status (*acpi_pkg_callback)(u8, union acpi_operand_object *, union acpi_generic_state *, void *);\n\ntypedef acpi_status (*acpi_table_handler)(u32, void *, void *);\n\ntypedef acpi_status (*acpi_walk_aml_callback)(u8 *, u32, u32, u8, void **);\n\ntypedef acpi_status (*acpi_walk_resource_callback)(struct acpi_resource *, void *);\n\ntypedef void amd_pmu_branch_reset_t(void);\n\ntypedef int (*apei_exec_entry_func_t)(struct apei_exec_context *, struct acpi_whea_header *, void *);\n\ntypedef int (*apei_hest_func_t)(struct acpi_hest_header *, void *);\n\ntypedef int (*arch_set_vga_state_t)(struct pci_dev *, bool, unsigned int, u32);\n\ntypedef unsigned int (*ata_xlat_func_t)(struct ata_queued_cmd *);\n\ntypedef void blk_log_action_t(struct trace_iterator *, const char *, bool);\n\ntypedef int (*bpf_aux_classic_check_t)(struct sock_filter *, unsigned int);\n\ntypedef u32 (*bpf_convert_ctx_access_t)(enum bpf_access_type, const struct bpf_insn *, struct bpf_insn *, struct bpf_prog *, u32 *);\n\ntypedef long unsigned int (*bpf_ctx_copy_t)(void *, const void *, long unsigned int, long unsigned int);\n\ntypedef unsigned int (*bpf_dispatcher_fn)(const void *, const struct bpf_insn *, unsigned int (*)(const void *, const struct bpf_insn *));\n\ntypedef unsigned int (*bpf_func_t)(const void *, const struct bpf_insn *);\n\ntypedef void (*bpf_jit_fill_hole_t)(void *, unsigned int);\n\ntypedef int (*bpf_op_t)(struct net_device *, struct netdev_bpf *);\n\ntypedef u32 (*bpf_prog_run_fn)(const struct bpf_prog *, const void *);\n\ntypedef u64 (*bpf_trampoline_enter_t)(struct bpf_prog *, struct bpf_tramp_run_ctx *);\n\ntypedef void (*bpf_trampoline_exit_t)(struct bpf_prog *, u64, struct bpf_tramp_run_ctx *);\n\ntypedef u64 (*btf_bpf_bind)(struct bpf_sock_addr_kern *, struct sockaddr *, int);\n\ntypedef u64 (*btf_bpf_bprm_opts_set)(struct linux_binprm *, u64);\n\ntypedef u64 (*btf_bpf_btf_find_by_name_kind)(char *, int, u32, int);\n\ntypedef u64 (*btf_bpf_cgrp_storage_delete)(struct bpf_map *, struct cgroup *);\n\ntypedef u64 (*btf_bpf_cgrp_storage_get)(struct bpf_map *, struct cgroup *, void *, u64, gfp_t);\n\ntypedef u64 (*btf_bpf_clone_redirect)(struct sk_buff *, u32, u64);\n\ntypedef u64 (*btf_bpf_copy_from_user)(void *, u32, const void *);\n\ntypedef u64 (*btf_bpf_copy_from_user_task)(void *, u32, const void *, struct task_struct *, u64);\n\ntypedef u64 (*btf_bpf_csum_diff)(__be32 *, u32, __be32 *, u32, __wsum);\n\ntypedef u64 (*btf_bpf_csum_level)(struct sk_buff *, u64);\n\ntypedef u64 (*btf_bpf_csum_update)(struct sk_buff *, __wsum);\n\ntypedef u64 (*btf_bpf_current_task_under_cgroup)(struct bpf_map *, u32);\n\ntypedef u64 (*btf_bpf_d_path)(struct path *, char *, u32);\n\ntypedef u64 (*btf_bpf_dynptr_data)(const struct bpf_dynptr_kern *, u32, u32);\n\ntypedef u64 (*btf_bpf_dynptr_from_mem)(void *, u32, u64, struct bpf_dynptr_kern *);\n\ntypedef u64 (*btf_bpf_dynptr_read)(void *, u32, const struct bpf_dynptr_kern *, u32, u64);\n\ntypedef u64 (*btf_bpf_dynptr_write)(const struct bpf_dynptr_kern *, u32, void *, u32, u64);\n\ntypedef u64 (*btf_bpf_event_output_data)(void *, struct bpf_map *, u64, void *, u64);\n\ntypedef u64 (*btf_bpf_find_vma)(struct task_struct *, u64, bpf_callback_t, void *, u64);\n\ntypedef u64 (*btf_bpf_flow_dissector_load_bytes)(const struct bpf_flow_dissector *, u32, void *, u32);\n\ntypedef u64 (*btf_bpf_for_each_map_elem)(struct bpf_map *, void *, void *, u64);\n\ntypedef u64 (*btf_bpf_get_attach_cookie)(void *);\n\ntypedef u64 (*btf_bpf_get_attach_cookie_kprobe_multi)(struct pt_regs *);\n\ntypedef u64 (*btf_bpf_get_attach_cookie_pe)(struct bpf_perf_event_data_kern *);\n\ntypedef u64 (*btf_bpf_get_attach_cookie_trace)(void *);\n\ntypedef u64 (*btf_bpf_get_attach_cookie_tracing)(void *);\n\ntypedef u64 (*btf_bpf_get_attach_cookie_uprobe_multi)(struct pt_regs *);\n\ntypedef u64 (*btf_bpf_get_branch_snapshot)(void *, u32, u64);\n\ntypedef u64 (*btf_bpf_get_cgroup_classid)(const struct sk_buff *);\n\ntypedef u64 (*btf_bpf_get_cgroup_classid_curr)(void);\n\ntypedef u64 (*btf_bpf_get_current_ancestor_cgroup_id)(int);\n\ntypedef u64 (*btf_bpf_get_current_cgroup_id)(void);\n\ntypedef u64 (*btf_bpf_get_current_comm)(char *, u32);\n\ntypedef u64 (*btf_bpf_get_current_pid_tgid)(void);\n\ntypedef u64 (*btf_bpf_get_current_task)(void);\n\ntypedef u64 (*btf_bpf_get_current_task_btf)(void);\n\ntypedef u64 (*btf_bpf_get_current_uid_gid)(void);\n\ntypedef u64 (*btf_bpf_get_func_ip_kprobe)(struct pt_regs *);\n\ntypedef u64 (*btf_bpf_get_func_ip_kprobe_multi)(struct pt_regs *);\n\ntypedef u64 (*btf_bpf_get_func_ip_tracing)(void *);\n\ntypedef u64 (*btf_bpf_get_func_ip_uprobe_multi)(struct pt_regs *);\n\ntypedef u64 (*btf_bpf_get_hash_recalc)(struct sk_buff *);\n\ntypedef u64 (*btf_bpf_get_listener_sock)(struct sock *);\n\ntypedef u64 (*btf_bpf_get_local_storage)(struct bpf_map *, u64);\n\ntypedef u64 (*btf_bpf_get_netns_cookie_sk_msg)(struct sk_msg *);\n\ntypedef u64 (*btf_bpf_get_netns_cookie_sock)(struct sock *);\n\ntypedef u64 (*btf_bpf_get_netns_cookie_sock_addr)(struct bpf_sock_addr_kern *);\n\ntypedef u64 (*btf_bpf_get_netns_cookie_sock_ops)(struct bpf_sock_ops_kern *);\n\ntypedef u64 (*btf_bpf_get_netns_cookie_sockopt)(struct bpf_sockopt_kern *);\n\ntypedef u64 (*btf_bpf_get_ns_current_pid_tgid)(u64, u64, struct bpf_pidns_info *, u32);\n\ntypedef u64 (*btf_bpf_get_numa_node_id)(void);\n\ntypedef u64 (*btf_bpf_get_raw_cpu_id)(void);\n\ntypedef u64 (*btf_bpf_get_retval)(void);\n\ntypedef u64 (*btf_bpf_get_route_realm)(const struct sk_buff *);\n\ntypedef u64 (*btf_bpf_get_smp_processor_id)(void);\n\ntypedef u64 (*btf_bpf_get_socket_cookie)(struct sk_buff *);\n\ntypedef u64 (*btf_bpf_get_socket_cookie_sock)(struct sock *);\n\ntypedef u64 (*btf_bpf_get_socket_cookie_sock_addr)(struct bpf_sock_addr_kern *);\n\ntypedef u64 (*btf_bpf_get_socket_cookie_sock_ops)(struct bpf_sock_ops_kern *);\n\ntypedef u64 (*btf_bpf_get_socket_ptr_cookie)(struct sock *);\n\ntypedef u64 (*btf_bpf_get_socket_uid)(struct sk_buff *);\n\ntypedef u64 (*btf_bpf_get_stack)(struct pt_regs *, void *, u32, u64);\n\ntypedef u64 (*btf_bpf_get_stack_pe)(struct bpf_perf_event_data_kern *, void *, u32, u64);\n\ntypedef u64 (*btf_bpf_get_stack_raw_tp)(struct bpf_raw_tracepoint_args *, void *, u32, u64);\n\ntypedef u64 (*btf_bpf_get_stack_tp)(void *, void *, u32, u64);\n\ntypedef u64 (*btf_bpf_get_stackid)(struct pt_regs *, struct bpf_map *, u64);\n\ntypedef u64 (*btf_bpf_get_stackid_pe)(struct bpf_perf_event_data_kern *, struct bpf_map *, u64);\n\ntypedef u64 (*btf_bpf_get_stackid_raw_tp)(struct bpf_raw_tracepoint_args *, struct bpf_map *, u64);\n\ntypedef u64 (*btf_bpf_get_stackid_tp)(void *, struct bpf_map *, u64);\n\ntypedef u64 (*btf_bpf_get_task_stack)(struct task_struct *, void *, u32, u64);\n\ntypedef u64 (*btf_bpf_ima_file_hash)(struct file *, void *, u32);\n\ntypedef u64 (*btf_bpf_ima_inode_hash)(struct inode *, void *, u32);\n\ntypedef u64 (*btf_bpf_inode_storage_delete)(struct bpf_map *, struct inode *);\n\ntypedef u64 (*btf_bpf_inode_storage_get)(struct bpf_map *, struct inode *, void *, u64, gfp_t);\n\ntypedef u64 (*btf_bpf_jiffies64)(void);\n\ntypedef u64 (*btf_bpf_kallsyms_lookup_name)(const char *, int, int, u64 *);\n\ntypedef u64 (*btf_bpf_kptr_xchg)(void *, void *);\n\ntypedef u64 (*btf_bpf_ktime_get_boot_ns)(void);\n\ntypedef u64 (*btf_bpf_ktime_get_coarse_ns)(void);\n\ntypedef u64 (*btf_bpf_ktime_get_ns)(void);\n\ntypedef u64 (*btf_bpf_ktime_get_tai_ns)(void);\n\ntypedef u64 (*btf_bpf_l3_csum_replace)(struct sk_buff *, u32, u64, u64, u64);\n\ntypedef u64 (*btf_bpf_l4_csum_replace)(struct sk_buff *, u32, u64, u64, u64);\n\ntypedef u64 (*btf_bpf_loop)(u32, void *, void *, u64);\n\ntypedef u64 (*btf_bpf_lwt_in_push_encap)(struct sk_buff *, u32, void *, u32);\n\ntypedef u64 (*btf_bpf_lwt_seg6_action)(struct sk_buff *, u32, void *, u32);\n\ntypedef u64 (*btf_bpf_lwt_seg6_adjust_srh)(struct sk_buff *, u32, s32);\n\ntypedef u64 (*btf_bpf_lwt_seg6_store_bytes)(struct sk_buff *, u32, const void *, u32);\n\ntypedef u64 (*btf_bpf_lwt_xmit_push_encap)(struct sk_buff *, u32, void *, u32);\n\ntypedef u64 (*btf_bpf_map_delete_elem)(struct bpf_map *, void *);\n\ntypedef u64 (*btf_bpf_map_lookup_elem)(struct bpf_map *, void *);\n\ntypedef u64 (*btf_bpf_map_lookup_percpu_elem)(struct bpf_map *, void *, u32);\n\ntypedef u64 (*btf_bpf_map_peek_elem)(struct bpf_map *, void *);\n\ntypedef u64 (*btf_bpf_map_pop_elem)(struct bpf_map *, void *);\n\ntypedef u64 (*btf_bpf_map_push_elem)(struct bpf_map *, void *, u64);\n\ntypedef u64 (*btf_bpf_map_update_elem)(struct bpf_map *, void *, void *, u64);\n\ntypedef u64 (*btf_bpf_msg_apply_bytes)(struct sk_msg *, u32);\n\ntypedef u64 (*btf_bpf_msg_cork_bytes)(struct sk_msg *, u32);\n\ntypedef u64 (*btf_bpf_msg_pop_data)(struct sk_msg *, u32, u32, u64);\n\ntypedef u64 (*btf_bpf_msg_pull_data)(struct sk_msg *, u32, u32, u64);\n\ntypedef u64 (*btf_bpf_msg_push_data)(struct sk_msg *, u32, u32, u64);\n\ntypedef u64 (*btf_bpf_msg_redirect_hash)(struct sk_msg *, struct bpf_map *, void *, u64);\n\ntypedef u64 (*btf_bpf_msg_redirect_map)(struct sk_msg *, struct bpf_map *, u32, u64);\n\ntypedef u64 (*btf_bpf_override_return)(struct pt_regs *, long unsigned int);\n\ntypedef u64 (*btf_bpf_per_cpu_ptr)(const void *, u32);\n\ntypedef u64 (*btf_bpf_perf_event_output)(struct pt_regs *, struct bpf_map *, u64, void *, u64);\n\ntypedef u64 (*btf_bpf_perf_event_output_raw_tp)(struct bpf_raw_tracepoint_args *, struct bpf_map *, u64, void *, u64);\n\ntypedef u64 (*btf_bpf_perf_event_output_tp)(void *, struct bpf_map *, u64, void *, u64);\n\ntypedef u64 (*btf_bpf_perf_event_read)(struct bpf_map *, u64);\n\ntypedef u64 (*btf_bpf_perf_event_read_value)(struct bpf_map *, u64, struct bpf_perf_event_value *, u32);\n\ntypedef u64 (*btf_bpf_perf_prog_read_value)(struct bpf_perf_event_data_kern *, struct bpf_perf_event_value *, u32);\n\ntypedef u64 (*btf_bpf_probe_read_compat)(void *, u32, const void *);\n\ntypedef u64 (*btf_bpf_probe_read_compat_str)(void *, u32, const void *);\n\ntypedef u64 (*btf_bpf_probe_read_kernel)(void *, u32, const void *);\n\ntypedef u64 (*btf_bpf_probe_read_kernel_str)(void *, u32, const void *);\n\ntypedef u64 (*btf_bpf_probe_read_user)(void *, u32, const void *);\n\ntypedef u64 (*btf_bpf_probe_read_user_str)(void *, u32, const void *);\n\ntypedef u64 (*btf_bpf_probe_write_user)(void *, const void *, u32);\n\ntypedef u64 (*btf_bpf_read_branch_records)(struct bpf_perf_event_data_kern *, void *, u32, u64);\n\ntypedef u64 (*btf_bpf_redirect)(u32, u64);\n\ntypedef u64 (*btf_bpf_redirect_neigh)(u32, struct bpf_redir_neigh *, int, u64);\n\ntypedef u64 (*btf_bpf_redirect_peer)(u32, u64);\n\ntypedef u64 (*btf_bpf_ringbuf_discard)(void *, u64);\n\ntypedef u64 (*btf_bpf_ringbuf_discard_dynptr)(struct bpf_dynptr_kern *, u64);\n\ntypedef u64 (*btf_bpf_ringbuf_output)(struct bpf_map *, void *, u64, u64);\n\ntypedef u64 (*btf_bpf_ringbuf_query)(struct bpf_map *, u64);\n\ntypedef u64 (*btf_bpf_ringbuf_reserve)(struct bpf_map *, u64, u64);\n\ntypedef u64 (*btf_bpf_ringbuf_reserve_dynptr)(struct bpf_map *, u32, u64, struct bpf_dynptr_kern *);\n\ntypedef u64 (*btf_bpf_ringbuf_submit)(void *, u64);\n\ntypedef u64 (*btf_bpf_ringbuf_submit_dynptr)(struct bpf_dynptr_kern *, u64);\n\ntypedef u64 (*btf_bpf_send_signal)(u32);\n\ntypedef u64 (*btf_bpf_send_signal_thread)(u32);\n\ntypedef u64 (*btf_bpf_seq_printf)(struct seq_file *, char *, u32, const void *, u32);\n\ntypedef u64 (*btf_bpf_seq_printf_btf)(struct seq_file *, struct btf_ptr *, u32, u64);\n\ntypedef u64 (*btf_bpf_seq_write)(struct seq_file *, const void *, u32);\n\ntypedef u64 (*btf_bpf_set_hash)(struct sk_buff *, u32);\n\ntypedef u64 (*btf_bpf_set_hash_invalid)(struct sk_buff *);\n\ntypedef u64 (*btf_bpf_set_retval)(int);\n\ntypedef u64 (*btf_bpf_sk_ancestor_cgroup_id)(struct sock *, int);\n\ntypedef u64 (*btf_bpf_sk_assign)(struct sk_buff *, struct sock *, u64);\n\ntypedef u64 (*btf_bpf_sk_cgroup_id)(struct sock *);\n\ntypedef u64 (*btf_bpf_sk_fullsock)(struct sock *);\n\ntypedef u64 (*btf_bpf_sk_getsockopt)(struct sock *, int, int, char *, int);\n\ntypedef u64 (*btf_bpf_sk_lookup_assign)(struct bpf_sk_lookup_kern *, struct sock *, u64);\n\ntypedef u64 (*btf_bpf_sk_lookup_tcp)(struct sk_buff *, struct bpf_sock_tuple *, u32, u64, u64);\n\ntypedef u64 (*btf_bpf_sk_lookup_udp)(struct sk_buff *, struct bpf_sock_tuple *, u32, u64, u64);\n\ntypedef u64 (*btf_bpf_sk_redirect_hash)(struct sk_buff *, struct bpf_map *, void *, u64);\n\ntypedef u64 (*btf_bpf_sk_redirect_map)(struct sk_buff *, struct bpf_map *, u32, u64);\n\ntypedef u64 (*btf_bpf_sk_release)(struct sock *);\n\ntypedef u64 (*btf_bpf_sk_setsockopt)(struct sock *, int, int, char *, int);\n\ntypedef u64 (*btf_bpf_sk_storage_delete)(struct bpf_map *, struct sock *);\n\ntypedef u64 (*btf_bpf_sk_storage_delete_tracing)(struct bpf_map *, struct sock *);\n\ntypedef u64 (*btf_bpf_sk_storage_get)(struct bpf_map *, struct sock *, void *, u64, gfp_t);\n\ntypedef u64 (*btf_bpf_sk_storage_get_tracing)(struct bpf_map *, struct sock *, void *, u64, gfp_t);\n\ntypedef u64 (*btf_bpf_skb_adjust_room)(struct sk_buff *, s32, u32, u64);\n\ntypedef u64 (*btf_bpf_skb_ancestor_cgroup_id)(const struct sk_buff *, int);\n\ntypedef u64 (*btf_bpf_skb_cgroup_classid)(const struct sk_buff *);\n\ntypedef u64 (*btf_bpf_skb_cgroup_id)(const struct sk_buff *);\n\ntypedef u64 (*btf_bpf_skb_change_head)(struct sk_buff *, u32, u64);\n\ntypedef u64 (*btf_bpf_skb_change_proto)(struct sk_buff *, __be16, u64);\n\ntypedef u64 (*btf_bpf_skb_change_tail)(struct sk_buff *, u32, u64);\n\ntypedef u64 (*btf_bpf_skb_change_type)(struct sk_buff *, u32);\n\ntypedef u64 (*btf_bpf_skb_check_mtu)(struct sk_buff *, u32, u32 *, s32, u64);\n\ntypedef u64 (*btf_bpf_skb_ecn_set_ce)(struct sk_buff *);\n\ntypedef u64 (*btf_bpf_skb_event_output)(struct sk_buff *, struct bpf_map *, u64, void *, u64);\n\ntypedef u64 (*btf_bpf_skb_fib_lookup)(struct sk_buff *, struct bpf_fib_lookup *, int, u32);\n\ntypedef u64 (*btf_bpf_skb_get_nlattr)(struct sk_buff *, u32, u32);\n\ntypedef u64 (*btf_bpf_skb_get_nlattr_nest)(struct sk_buff *, u32, u32);\n\ntypedef u64 (*btf_bpf_skb_get_pay_offset)(struct sk_buff *);\n\ntypedef u64 (*btf_bpf_skb_get_tunnel_key)(struct sk_buff *, struct bpf_tunnel_key *, u32, u64);\n\ntypedef u64 (*btf_bpf_skb_get_tunnel_opt)(struct sk_buff *, u8 *, u32);\n\ntypedef u64 (*btf_bpf_skb_get_xfrm_state)(struct sk_buff *, u32, struct bpf_xfrm_state *, u32, u64);\n\ntypedef u64 (*btf_bpf_skb_load_bytes)(const struct sk_buff *, u32, void *, u32);\n\ntypedef u64 (*btf_bpf_skb_load_bytes_relative)(const struct sk_buff *, u32, void *, u32, u32);\n\ntypedef u64 (*btf_bpf_skb_load_helper_16)(const struct sk_buff *, const void *, int, int);\n\ntypedef u64 (*btf_bpf_skb_load_helper_16_no_cache)(const struct sk_buff *, int);\n\ntypedef u64 (*btf_bpf_skb_load_helper_32)(const struct sk_buff *, const void *, int, int);\n\ntypedef u64 (*btf_bpf_skb_load_helper_32_no_cache)(const struct sk_buff *, int);\n\ntypedef u64 (*btf_bpf_skb_load_helper_8)(const struct sk_buff *, const void *, int, int);\n\ntypedef u64 (*btf_bpf_skb_load_helper_8_no_cache)(const struct sk_buff *, int);\n\ntypedef u64 (*btf_bpf_skb_pull_data)(struct sk_buff *, u32);\n\ntypedef u64 (*btf_bpf_skb_set_tstamp)(struct sk_buff *, u64, u32);\n\ntypedef u64 (*btf_bpf_skb_set_tunnel_key)(struct sk_buff *, const struct bpf_tunnel_key *, u32, u64);\n\ntypedef u64 (*btf_bpf_skb_set_tunnel_opt)(struct sk_buff *, const u8 *, u32);\n\ntypedef u64 (*btf_bpf_skb_store_bytes)(struct sk_buff *, u32, const void *, u32, u64);\n\ntypedef u64 (*btf_bpf_skb_under_cgroup)(struct sk_buff *, struct bpf_map *, u32);\n\ntypedef u64 (*btf_bpf_skb_vlan_pop)(struct sk_buff *);\n\ntypedef u64 (*btf_bpf_skb_vlan_push)(struct sk_buff *, __be16, u16);\n\ntypedef u64 (*btf_bpf_skc_lookup_tcp)(struct sk_buff *, struct bpf_sock_tuple *, u32, u64, u64);\n\ntypedef u64 (*btf_bpf_skc_to_mptcp_sock)(struct sock *);\n\ntypedef u64 (*btf_bpf_skc_to_tcp6_sock)(struct sock *);\n\ntypedef u64 (*btf_bpf_skc_to_tcp_request_sock)(struct sock *);\n\ntypedef u64 (*btf_bpf_skc_to_tcp_sock)(struct sock *);\n\ntypedef u64 (*btf_bpf_skc_to_tcp_timewait_sock)(struct sock *);\n\ntypedef u64 (*btf_bpf_skc_to_udp6_sock)(struct sock *);\n\ntypedef u64 (*btf_bpf_skc_to_unix_sock)(struct sock *);\n\ntypedef u64 (*btf_bpf_snprintf)(char *, u32, char *, const void *, u32);\n\ntypedef u64 (*btf_bpf_snprintf_btf)(char *, u32, struct btf_ptr *, u32, u64);\n\ntypedef u64 (*btf_bpf_sock_addr_getsockopt)(struct bpf_sock_addr_kern *, int, int, char *, int);\n\ntypedef u64 (*btf_bpf_sock_addr_setsockopt)(struct bpf_sock_addr_kern *, int, int, char *, int);\n\ntypedef u64 (*btf_bpf_sock_addr_sk_lookup_tcp)(struct bpf_sock_addr_kern *, struct bpf_sock_tuple *, u32, u64, u64);\n\ntypedef u64 (*btf_bpf_sock_addr_sk_lookup_udp)(struct bpf_sock_addr_kern *, struct bpf_sock_tuple *, u32, u64, u64);\n\ntypedef u64 (*btf_bpf_sock_addr_skc_lookup_tcp)(struct bpf_sock_addr_kern *, struct bpf_sock_tuple *, u32, u64, u64);\n\ntypedef u64 (*btf_bpf_sock_from_file)(struct file *);\n\ntypedef u64 (*btf_bpf_sock_hash_update)(struct bpf_sock_ops_kern *, struct bpf_map *, void *, u64);\n\ntypedef u64 (*btf_bpf_sock_map_update)(struct bpf_sock_ops_kern *, struct bpf_map *, void *, u64);\n\ntypedef u64 (*btf_bpf_sock_ops_cb_flags_set)(struct bpf_sock_ops_kern *, int);\n\ntypedef u64 (*btf_bpf_sock_ops_getsockopt)(struct bpf_sock_ops_kern *, int, int, char *, int);\n\ntypedef u64 (*btf_bpf_sock_ops_load_hdr_opt)(struct bpf_sock_ops_kern *, void *, u32, u64);\n\ntypedef u64 (*btf_bpf_sock_ops_reserve_hdr_opt)(struct bpf_sock_ops_kern *, u32, u64);\n\ntypedef u64 (*btf_bpf_sock_ops_setsockopt)(struct bpf_sock_ops_kern *, int, int, char *, int);\n\ntypedef u64 (*btf_bpf_sock_ops_store_hdr_opt)(struct bpf_sock_ops_kern *, const void *, u32, u64);\n\ntypedef u64 (*btf_bpf_spin_lock)(struct bpf_spin_lock *);\n\ntypedef u64 (*btf_bpf_spin_unlock)(struct bpf_spin_lock *);\n\ntypedef u64 (*btf_bpf_strncmp)(const char *, u32, const char *);\n\ntypedef u64 (*btf_bpf_strtol)(const char *, size_t, u64, s64 *);\n\ntypedef u64 (*btf_bpf_strtoul)(const char *, size_t, u64, u64 *);\n\ntypedef u64 (*btf_bpf_sys_bpf)(int, union bpf_attr *, u32);\n\ntypedef u64 (*btf_bpf_sys_close)(u32);\n\ntypedef u64 (*btf_bpf_sysctl_get_current_value)(struct bpf_sysctl_kern *, char *, size_t);\n\ntypedef u64 (*btf_bpf_sysctl_get_name)(struct bpf_sysctl_kern *, char *, size_t, u64);\n\ntypedef u64 (*btf_bpf_sysctl_get_new_value)(struct bpf_sysctl_kern *, char *, size_t);\n\ntypedef u64 (*btf_bpf_sysctl_set_new_value)(struct bpf_sysctl_kern *, const char *, size_t);\n\ntypedef u64 (*btf_bpf_task_pt_regs)(struct task_struct *);\n\ntypedef u64 (*btf_bpf_task_storage_delete)(struct bpf_map *, struct task_struct *);\n\ntypedef u64 (*btf_bpf_task_storage_delete_recur)(struct bpf_map *, struct task_struct *);\n\ntypedef u64 (*btf_bpf_task_storage_get)(struct bpf_map *, struct task_struct *, void *, u64, gfp_t);\n\ntypedef u64 (*btf_bpf_task_storage_get_recur)(struct bpf_map *, struct task_struct *, void *, u64, gfp_t);\n\ntypedef u64 (*btf_bpf_tc_sk_lookup_tcp)(struct sk_buff *, struct bpf_sock_tuple *, u32, u64, u64);\n\ntypedef u64 (*btf_bpf_tc_sk_lookup_udp)(struct sk_buff *, struct bpf_sock_tuple *, u32, u64, u64);\n\ntypedef u64 (*btf_bpf_tc_skc_lookup_tcp)(struct sk_buff *, struct bpf_sock_tuple *, u32, u64, u64);\n\ntypedef u64 (*btf_bpf_tcp_check_syncookie)(struct sock *, void *, u32, struct tcphdr *, u32);\n\ntypedef u64 (*btf_bpf_tcp_gen_syncookie)(struct sock *, void *, u32, struct tcphdr *, u32);\n\ntypedef u64 (*btf_bpf_tcp_raw_check_syncookie_ipv4)(struct iphdr *, struct tcphdr *);\n\ntypedef u64 (*btf_bpf_tcp_raw_check_syncookie_ipv6)(struct ipv6hdr *, struct tcphdr *);\n\ntypedef u64 (*btf_bpf_tcp_raw_gen_syncookie_ipv4)(struct iphdr *, struct tcphdr *, u32);\n\ntypedef u64 (*btf_bpf_tcp_raw_gen_syncookie_ipv6)(struct ipv6hdr *, struct tcphdr *, u32);\n\ntypedef u64 (*btf_bpf_tcp_send_ack)(struct tcp_sock *, u32);\n\ntypedef u64 (*btf_bpf_tcp_sock)(struct sock *);\n\ntypedef u64 (*btf_bpf_this_cpu_ptr)(const void *);\n\ntypedef u64 (*btf_bpf_timer_cancel)(struct bpf_async_kern *);\n\ntypedef u64 (*btf_bpf_timer_init)(struct bpf_async_kern *, struct bpf_map *, u64);\n\ntypedef u64 (*btf_bpf_timer_set_callback)(struct bpf_async_kern *, void *, struct bpf_prog_aux *);\n\ntypedef u64 (*btf_bpf_timer_start)(struct bpf_async_kern *, u64, u64);\n\ntypedef u64 (*btf_bpf_trace_printk)(char *, u32, u64, u64, u64);\n\ntypedef u64 (*btf_bpf_trace_vprintk)(char *, u32, const void *, u32);\n\ntypedef u64 (*btf_bpf_unlocked_sk_getsockopt)(struct sock *, int, int, char *, int);\n\ntypedef u64 (*btf_bpf_unlocked_sk_setsockopt)(struct sock *, int, int, char *, int);\n\ntypedef u64 (*btf_bpf_user_ringbuf_drain)(struct bpf_map *, void *, void *, u64);\n\ntypedef u64 (*btf_bpf_user_rnd_u32)(void);\n\ntypedef u64 (*btf_bpf_xdp_adjust_head)(struct xdp_buff *, int);\n\ntypedef u64 (*btf_bpf_xdp_adjust_meta)(struct xdp_buff *, int);\n\ntypedef u64 (*btf_bpf_xdp_adjust_tail)(struct xdp_buff *, int);\n\ntypedef u64 (*btf_bpf_xdp_check_mtu)(struct xdp_buff *, u32, u32 *, s32, u64);\n\ntypedef u64 (*btf_bpf_xdp_event_output)(struct xdp_buff *, struct bpf_map *, u64, void *, u64);\n\ntypedef u64 (*btf_bpf_xdp_fib_lookup)(struct xdp_buff *, struct bpf_fib_lookup *, int, u32);\n\ntypedef u64 (*btf_bpf_xdp_get_buff_len)(struct xdp_buff *);\n\ntypedef u64 (*btf_bpf_xdp_load_bytes)(struct xdp_buff *, u32, void *, u32);\n\ntypedef u64 (*btf_bpf_xdp_redirect)(u32, u64);\n\ntypedef u64 (*btf_bpf_xdp_redirect_map)(struct bpf_map *, u64, u64);\n\ntypedef u64 (*btf_bpf_xdp_sk_lookup_tcp)(struct xdp_buff *, struct bpf_sock_tuple *, u32, u32, u64);\n\ntypedef u64 (*btf_bpf_xdp_sk_lookup_udp)(struct xdp_buff *, struct bpf_sock_tuple *, u32, u32, u64);\n\ntypedef u64 (*btf_bpf_xdp_skc_lookup_tcp)(struct xdp_buff *, struct bpf_sock_tuple *, u32, u32, u64);\n\ntypedef u64 (*btf_bpf_xdp_store_bytes)(struct xdp_buff *, u32, void *, u32);\n\ntypedef u64 (*btf_get_func_arg)(void *, u32, u64 *);\n\ntypedef u64 (*btf_get_func_arg_cnt)(void *);\n\ntypedef u64 (*btf_get_func_ret)(void *, u64 *);\n\ntypedef u64 (*btf_sk_reuseport_load_bytes)(const struct sk_reuseport_kern *, u32, void *, u32);\n\ntypedef u64 (*btf_sk_reuseport_load_bytes_relative)(const struct sk_reuseport_kern *, u32, void *, u32, u32);\n\ntypedef u64 (*btf_sk_select_reuseport)(struct sk_reuseport_kern *, struct bpf_map *, void *, u32);\n\ntypedef u64 (*btf_sk_skb_adjust_room)(struct sk_buff *, s32, u32, u64);\n\ntypedef u64 (*btf_sk_skb_change_head)(struct sk_buff *, u32, u64);\n\ntypedef u64 (*btf_sk_skb_change_tail)(struct sk_buff *, u32, u64);\n\ntypedef u64 (*btf_sk_skb_pull_data)(struct sk_buff *, u32);\n\ntypedef void (*btf_trace_ack_update_msk)(void *, u64, u64, u64, u64, u64);\n\ntypedef void (*btf_trace_add_device_to_group)(void *, int, struct device *);\n\ntypedef void (*btf_trace_aer_event)(void *, const char *, const u32, const u8, const u8, struct pcie_tlp_log *);\n\ntypedef void (*btf_trace_alarmtimer_cancel)(void *, struct alarm *, ktime_t);\n\ntypedef void (*btf_trace_alarmtimer_fired)(void *, struct alarm *, ktime_t);\n\ntypedef void (*btf_trace_alarmtimer_start)(void *, struct alarm *, ktime_t);\n\ntypedef void (*btf_trace_alarmtimer_suspend)(void *, ktime_t, int);\n\ntypedef void (*btf_trace_alloc_vmap_area)(void *, long unsigned int, long unsigned int, long unsigned int, long unsigned int, long unsigned int, int);\n\ntypedef void (*btf_trace_amd_pstate_perf)(void *, long unsigned int, long unsigned int, long unsigned int, u64, u64, u64, u64, unsigned int, bool, bool);\n\ntypedef void (*btf_trace_arm_event)(void *, const struct cper_sec_proc_arm *);\n\ntypedef void (*btf_trace_ata_bmdma_setup)(void *, struct ata_port *, const struct ata_taskfile *, unsigned int);\n\ntypedef void (*btf_trace_ata_bmdma_start)(void *, struct ata_port *, const struct ata_taskfile *, unsigned int);\n\ntypedef void (*btf_trace_ata_bmdma_status)(void *, struct ata_port *, unsigned int);\n\ntypedef void (*btf_trace_ata_bmdma_stop)(void *, struct ata_port *, const struct ata_taskfile *, unsigned int);\n\ntypedef void (*btf_trace_ata_eh_about_to_do)(void *, struct ata_link *, unsigned int, unsigned int);\n\ntypedef void (*btf_trace_ata_eh_done)(void *, struct ata_link *, unsigned int, unsigned int);\n\ntypedef void (*btf_trace_ata_eh_link_autopsy)(void *, struct ata_device *, unsigned int, unsigned int);\n\ntypedef void (*btf_trace_ata_eh_link_autopsy_qc)(void *, struct ata_queued_cmd *);\n\ntypedef void (*btf_trace_ata_exec_command)(void *, struct ata_port *, const struct ata_taskfile *, unsigned int);\n\ntypedef void (*btf_trace_ata_link_hardreset_begin)(void *, struct ata_link *, unsigned int *, long unsigned int);\n\ntypedef void (*btf_trace_ata_link_hardreset_end)(void *, struct ata_link *, unsigned int *, int);\n\ntypedef void (*btf_trace_ata_link_postreset)(void *, struct ata_link *, unsigned int *, int);\n\ntypedef void (*btf_trace_ata_link_softreset_begin)(void *, struct ata_link *, unsigned int *, long unsigned int);\n\ntypedef void (*btf_trace_ata_link_softreset_end)(void *, struct ata_link *, unsigned int *, int);\n\ntypedef void (*btf_trace_ata_port_freeze)(void *, struct ata_port *);\n\ntypedef void (*btf_trace_ata_port_thaw)(void *, struct ata_port *);\n\ntypedef void (*btf_trace_ata_qc_complete_done)(void *, struct ata_queued_cmd *);\n\ntypedef void (*btf_trace_ata_qc_complete_failed)(void *, struct ata_queued_cmd *);\n\ntypedef void (*btf_trace_ata_qc_complete_internal)(void *, struct ata_queued_cmd *);\n\ntypedef void (*btf_trace_ata_qc_issue)(void *, struct ata_queued_cmd *);\n\ntypedef void (*btf_trace_ata_qc_prep)(void *, struct ata_queued_cmd *);\n\ntypedef void (*btf_trace_ata_sff_flush_pio_task)(void *, struct ata_port *);\n\ntypedef void (*btf_trace_ata_sff_hsm_command_complete)(void *, struct ata_queued_cmd *, unsigned char);\n\ntypedef void (*btf_trace_ata_sff_hsm_state)(void *, struct ata_queued_cmd *, unsigned char);\n\ntypedef void (*btf_trace_ata_sff_pio_transfer_data)(void *, struct ata_queued_cmd *, unsigned int, unsigned int);\n\ntypedef void (*btf_trace_ata_sff_port_intr)(void *, struct ata_queued_cmd *, unsigned char);\n\ntypedef void (*btf_trace_ata_slave_hardreset_begin)(void *, struct ata_link *, unsigned int *, long unsigned int);\n\ntypedef void (*btf_trace_ata_slave_hardreset_end)(void *, struct ata_link *, unsigned int *, int);\n\ntypedef void (*btf_trace_ata_slave_postreset)(void *, struct ata_link *, unsigned int *, int);\n\ntypedef void (*btf_trace_ata_std_sched_eh)(void *, struct ata_port *);\n\ntypedef void (*btf_trace_ata_tf_load)(void *, struct ata_port *, const struct ata_taskfile *);\n\ntypedef void (*btf_trace_atapi_pio_transfer_data)(void *, struct ata_queued_cmd *, unsigned int, unsigned int);\n\ntypedef void (*btf_trace_atapi_send_cdb)(void *, struct ata_queued_cmd *, unsigned int, unsigned int);\n\ntypedef void (*btf_trace_attach_device_to_domain)(void *, struct device *);\n\ntypedef void (*btf_trace_balance_dirty_pages)(void *, struct bdi_writeback *, long unsigned int, long unsigned int, long unsigned int, long unsigned int, long unsigned int, long unsigned int, long unsigned int, long unsigned int, long unsigned int, long int, long unsigned int);\n\ntypedef void (*btf_trace_bdi_dirty_ratelimit)(void *, struct bdi_writeback *, long unsigned int, long unsigned int);\n\ntypedef void (*btf_trace_block_bio_backmerge)(void *, struct bio *);\n\ntypedef void (*btf_trace_block_bio_bounce)(void *, struct bio *);\n\ntypedef void (*btf_trace_block_bio_complete)(void *, struct request_queue *, struct bio *);\n\ntypedef void (*btf_trace_block_bio_frontmerge)(void *, struct bio *);\n\ntypedef void (*btf_trace_block_bio_queue)(void *, struct bio *);\n\ntypedef void (*btf_trace_block_bio_remap)(void *, struct bio *, dev_t, sector_t);\n\ntypedef void (*btf_trace_block_dirty_buffer)(void *, struct buffer_head *);\n\ntypedef void (*btf_trace_block_getrq)(void *, struct bio *);\n\ntypedef void (*btf_trace_block_io_done)(void *, struct request *);\n\ntypedef void (*btf_trace_block_io_start)(void *, struct request *);\n\ntypedef void (*btf_trace_block_plug)(void *, struct request_queue *);\n\ntypedef void (*btf_trace_block_rq_complete)(void *, struct request *, blk_status_t, unsigned int);\n\ntypedef void (*btf_trace_block_rq_error)(void *, struct request *, blk_status_t, unsigned int);\n\ntypedef void (*btf_trace_block_rq_insert)(void *, struct request *);\n\ntypedef void (*btf_trace_block_rq_issue)(void *, struct request *);\n\ntypedef void (*btf_trace_block_rq_merge)(void *, struct request *);\n\ntypedef void (*btf_trace_block_rq_remap)(void *, struct request *, dev_t, sector_t);\n\ntypedef void (*btf_trace_block_rq_requeue)(void *, struct request *);\n\ntypedef void (*btf_trace_block_split)(void *, struct bio *, unsigned int);\n\ntypedef void (*btf_trace_block_touch_buffer)(void *, struct buffer_head *);\n\ntypedef void (*btf_trace_block_unplug)(void *, struct request_queue *, unsigned int, bool);\n\ntypedef void (*btf_trace_bpf_test_finish)(void *, int *);\n\ntypedef void (*btf_trace_bpf_trace_printk)(void *, const char *);\n\ntypedef void (*btf_trace_bpf_trigger_tp)(void *, int);\n\ntypedef void (*btf_trace_bpf_xdp_link_attach_failed)(void *, const char *);\n\ntypedef void (*btf_trace_br_fdb_add)(void *, struct ndmsg *, struct net_device *, const unsigned char *, u16, u16);\n\ntypedef void (*btf_trace_br_fdb_external_learn_add)(void *, struct net_bridge *, struct net_bridge_port *, const unsigned char *, u16);\n\ntypedef void (*btf_trace_br_fdb_update)(void *, struct net_bridge *, struct net_bridge_port *, const unsigned char *, u16, long unsigned int);\n\ntypedef void (*btf_trace_br_mdb_full)(void *, const struct net_device *, const struct br_ip *);\n\ntypedef void (*btf_trace_break_lease_block)(void *, struct inode *, struct file_lease *);\n\ntypedef void (*btf_trace_break_lease_noblock)(void *, struct inode *, struct file_lease *);\n\ntypedef void (*btf_trace_break_lease_unblock)(void *, struct inode *, struct file_lease *);\n\ntypedef void (*btf_trace_cache_tag_assign)(void *, struct cache_tag *);\n\ntypedef void (*btf_trace_cache_tag_flush_all)(void *, struct cache_tag *);\n\ntypedef void (*btf_trace_cache_tag_flush_range)(void *, struct cache_tag *, long unsigned int, long unsigned int, long unsigned int, long unsigned int, long unsigned int);\n\ntypedef void (*btf_trace_cache_tag_flush_range_np)(void *, struct cache_tag *, long unsigned int, long unsigned int, long unsigned int, long unsigned int, long unsigned int);\n\ntypedef void (*btf_trace_cache_tag_unassign)(void *, struct cache_tag *);\n\ntypedef void (*btf_trace_call_function_entry)(void *, int);\n\ntypedef void (*btf_trace_call_function_exit)(void *, int);\n\ntypedef void (*btf_trace_call_function_single_entry)(void *, int);\n\ntypedef void (*btf_trace_call_function_single_exit)(void *, int);\n\ntypedef void (*btf_trace_cdev_update)(void *, struct thermal_cooling_device *, long unsigned int);\n\ntypedef void (*btf_trace_cgroup_attach_task)(void *, struct cgroup *, const char *, struct task_struct *, bool);\n\ntypedef void (*btf_trace_cgroup_destroy_root)(void *, struct cgroup_root *);\n\ntypedef void (*btf_trace_cgroup_freeze)(void *, struct cgroup *, const char *);\n\ntypedef void (*btf_trace_cgroup_mkdir)(void *, struct cgroup *, const char *);\n\ntypedef void (*btf_trace_cgroup_notify_frozen)(void *, struct cgroup *, const char *, int);\n\ntypedef void (*btf_trace_cgroup_notify_populated)(void *, struct cgroup *, const char *, int);\n\ntypedef void (*btf_trace_cgroup_release)(void *, struct cgroup *, const char *);\n\ntypedef void (*btf_trace_cgroup_remount)(void *, struct cgroup_root *);\n\ntypedef void (*btf_trace_cgroup_rename)(void *, struct cgroup *, const char *);\n\ntypedef void (*btf_trace_cgroup_rmdir)(void *, struct cgroup *, const char *);\n\ntypedef void (*btf_trace_cgroup_rstat_cpu_lock_contended)(void *, struct cgroup *, int, bool);\n\ntypedef void (*btf_trace_cgroup_rstat_cpu_lock_contended_fastpath)(void *, struct cgroup *, int, bool);\n\ntypedef void (*btf_trace_cgroup_rstat_cpu_locked)(void *, struct cgroup *, int, bool);\n\ntypedef void (*btf_trace_cgroup_rstat_cpu_locked_fastpath)(void *, struct cgroup *, int, bool);\n\ntypedef void (*btf_trace_cgroup_rstat_cpu_unlock)(void *, struct cgroup *, int, bool);\n\ntypedef void (*btf_trace_cgroup_rstat_cpu_unlock_fastpath)(void *, struct cgroup *, int, bool);\n\ntypedef void (*btf_trace_cgroup_rstat_lock_contended)(void *, struct cgroup *, int, bool);\n\ntypedef void (*btf_trace_cgroup_rstat_locked)(void *, struct cgroup *, int, bool);\n\ntypedef void (*btf_trace_cgroup_rstat_unlock)(void *, struct cgroup *, int, bool);\n\ntypedef void (*btf_trace_cgroup_setup_root)(void *, struct cgroup_root *);\n\ntypedef void (*btf_trace_cgroup_transfer_tasks)(void *, struct cgroup *, const char *, struct task_struct *, bool);\n\ntypedef void (*btf_trace_cgroup_unfreeze)(void *, struct cgroup *, const char *);\n\ntypedef void (*btf_trace_clk_disable)(void *, struct clk_core *);\n\ntypedef void (*btf_trace_clk_disable_complete)(void *, struct clk_core *);\n\ntypedef void (*btf_trace_clk_enable)(void *, struct clk_core *);\n\ntypedef void (*btf_trace_clk_enable_complete)(void *, struct clk_core *);\n\ntypedef void (*btf_trace_clk_prepare)(void *, struct clk_core *);\n\ntypedef void (*btf_trace_clk_prepare_complete)(void *, struct clk_core *);\n\ntypedef void (*btf_trace_clk_rate_request_done)(void *, struct clk_rate_request *);\n\ntypedef void (*btf_trace_clk_rate_request_start)(void *, struct clk_rate_request *);\n\ntypedef void (*btf_trace_clk_set_duty_cycle)(void *, struct clk_core *, struct clk_duty *);\n\ntypedef void (*btf_trace_clk_set_duty_cycle_complete)(void *, struct clk_core *, struct clk_duty *);\n\ntypedef void (*btf_trace_clk_set_max_rate)(void *, struct clk_core *, long unsigned int);\n\ntypedef void (*btf_trace_clk_set_min_rate)(void *, struct clk_core *, long unsigned int);\n\ntypedef void (*btf_trace_clk_set_parent)(void *, struct clk_core *, struct clk_core *);\n\ntypedef void (*btf_trace_clk_set_parent_complete)(void *, struct clk_core *, struct clk_core *);\n\ntypedef void (*btf_trace_clk_set_phase)(void *, struct clk_core *, int);\n\ntypedef void (*btf_trace_clk_set_phase_complete)(void *, struct clk_core *, int);\n\ntypedef void (*btf_trace_clk_set_rate)(void *, struct clk_core *, long unsigned int);\n\ntypedef void (*btf_trace_clk_set_rate_complete)(void *, struct clk_core *, long unsigned int);\n\ntypedef void (*btf_trace_clk_set_rate_range)(void *, struct clk_core *, long unsigned int, long unsigned int);\n\ntypedef void (*btf_trace_clk_unprepare)(void *, struct clk_core *);\n\ntypedef void (*btf_trace_clk_unprepare_complete)(void *, struct clk_core *);\n\ntypedef void (*btf_trace_clock_disable)(void *, const char *, unsigned int, unsigned int);\n\ntypedef void (*btf_trace_clock_enable)(void *, const char *, unsigned int, unsigned int);\n\ntypedef void (*btf_trace_clock_set_rate)(void *, const char *, unsigned int, unsigned int);\n\ntypedef void (*btf_trace_compact_retry)(void *, int, enum compact_priority, enum compact_result, int, int, bool);\n\ntypedef void (*btf_trace_console)(void *, const char *, size_t);\n\ntypedef void (*btf_trace_consume_skb)(void *, struct sk_buff *, void *);\n\ntypedef void (*btf_trace_contention_begin)(void *, void *, unsigned int);\n\ntypedef void (*btf_trace_contention_end)(void *, void *, int);\n\ntypedef void (*btf_trace_cpu_frequency)(void *, unsigned int, unsigned int);\n\ntypedef void (*btf_trace_cpu_frequency_limits)(void *, struct cpufreq_policy *);\n\ntypedef void (*btf_trace_cpu_idle)(void *, unsigned int, unsigned int);\n\ntypedef void (*btf_trace_cpu_idle_miss)(void *, unsigned int, unsigned int, bool);\n\ntypedef void (*btf_trace_cpuhp_enter)(void *, unsigned int, int, int, int (*)(unsigned int));\n\ntypedef void (*btf_trace_cpuhp_exit)(void *, unsigned int, int, int, int);\n\ntypedef void (*btf_trace_cpuhp_multi_enter)(void *, unsigned int, int, int, int (*)(unsigned int, struct hlist_node *), struct hlist_node *);\n\ntypedef void (*btf_trace_cros_ec_request_done)(void *, struct cros_ec_command *, int);\n\ntypedef void (*btf_trace_cros_ec_request_start)(void *, struct cros_ec_command *);\n\ntypedef void (*btf_trace_csd_function_entry)(void *, smp_call_func_t, call_single_data_t *);\n\ntypedef void (*btf_trace_csd_function_exit)(void *, smp_call_func_t, call_single_data_t *);\n\ntypedef void (*btf_trace_csd_queue_cpu)(void *, const unsigned int, long unsigned int, smp_call_func_t, call_single_data_t *);\n\ntypedef void (*btf_trace_dax_insert_mapping)(void *, struct inode *, struct vm_fault *, void *);\n\ntypedef void (*btf_trace_dax_insert_pfn_mkwrite)(void *, struct inode *, struct vm_fault *, int);\n\ntypedef void (*btf_trace_dax_insert_pfn_mkwrite_no_entry)(void *, struct inode *, struct vm_fault *, int);\n\ntypedef void (*btf_trace_dax_load_hole)(void *, struct inode *, struct vm_fault *, int);\n\ntypedef void (*btf_trace_dax_pmd_fault)(void *, struct inode *, struct vm_fault *, long unsigned int, int);\n\ntypedef void (*btf_trace_dax_pmd_fault_done)(void *, struct inode *, struct vm_fault *, long unsigned int, int);\n\ntypedef void (*btf_trace_dax_pmd_insert_mapping)(void *, struct inode *, struct vm_fault *, long int, pfn_t, void *);\n\ntypedef void (*btf_trace_dax_pmd_load_hole)(void *, struct inode *, struct vm_fault *, struct folio *, void *);\n\ntypedef void (*btf_trace_dax_pmd_load_hole_fallback)(void *, struct inode *, struct vm_fault *, struct folio *, void *);\n\ntypedef void (*btf_trace_dax_pte_fault)(void *, struct inode *, struct vm_fault *, int);\n\ntypedef void (*btf_trace_dax_pte_fault_done)(void *, struct inode *, struct vm_fault *, int);\n\ntypedef void (*btf_trace_dax_writeback_one)(void *, struct inode *, long unsigned int, long unsigned int);\n\ntypedef void (*btf_trace_dax_writeback_range)(void *, struct inode *, long unsigned int, long unsigned int);\n\ntypedef void (*btf_trace_dax_writeback_range_done)(void *, struct inode *, long unsigned int, long unsigned int);\n\ntypedef void (*btf_trace_deferred_error_apic_entry)(void *, int);\n\ntypedef void (*btf_trace_deferred_error_apic_exit)(void *, int);\n\ntypedef void (*btf_trace_dev_pm_qos_add_request)(void *, const char *, enum dev_pm_qos_req_type, s32);\n\ntypedef void (*btf_trace_dev_pm_qos_remove_request)(void *, const char *, enum dev_pm_qos_req_type, s32);\n\ntypedef void (*btf_trace_dev_pm_qos_update_request)(void *, const char *, enum dev_pm_qos_req_type, s32);\n\ntypedef void (*btf_trace_devfreq_frequency)(void *, struct devfreq *, long unsigned int, long unsigned int);\n\ntypedef void (*btf_trace_devfreq_monitor)(void *, struct devfreq *);\n\ntypedef void (*btf_trace_device_pm_callback_end)(void *, struct device *, int);\n\ntypedef void (*btf_trace_device_pm_callback_start)(void *, struct device *, const char *, int);\n\ntypedef void (*btf_trace_devlink_health_recover_aborted)(void *, const struct devlink *, const char *, bool, u64);\n\ntypedef void (*btf_trace_devlink_health_report)(void *, const struct devlink *, const char *, const char *);\n\ntypedef void (*btf_trace_devlink_health_reporter_state_update)(void *, const struct devlink *, const char *, bool);\n\ntypedef void (*btf_trace_devlink_hwerr)(void *, const struct devlink *, int, const char *);\n\ntypedef void (*btf_trace_devlink_hwmsg)(void *, const struct devlink *, bool, long unsigned int, const u8 *, size_t);\n\ntypedef void (*btf_trace_devlink_trap_report)(void *, const struct devlink *, struct sk_buff *, const struct devlink_trap_metadata *);\n\ntypedef void (*btf_trace_devres_log)(void *, struct device *, const char *, void *, const char *, size_t);\n\ntypedef void (*btf_trace_dma_fence_destroy)(void *, struct dma_fence *);\n\ntypedef void (*btf_trace_dma_fence_emit)(void *, struct dma_fence *);\n\ntypedef void (*btf_trace_dma_fence_enable_signal)(void *, struct dma_fence *);\n\ntypedef void (*btf_trace_dma_fence_init)(void *, struct dma_fence *);\n\ntypedef void (*btf_trace_dma_fence_signaled)(void *, struct dma_fence *);\n\ntypedef void (*btf_trace_dma_fence_wait_end)(void *, struct dma_fence *);\n\ntypedef void (*btf_trace_dma_fence_wait_start)(void *, struct dma_fence *);\n\ntypedef void (*btf_trace_dql_stall_detected)(void *, short unsigned int, unsigned int, long unsigned int, long unsigned int, long unsigned int, long unsigned int *);\n\ntypedef void (*btf_trace_drm_vblank_event)(void *, int, unsigned int, ktime_t, bool);\n\ntypedef void (*btf_trace_drm_vblank_event_delivered)(void *, struct drm_file *, int, unsigned int);\n\ntypedef void (*btf_trace_drm_vblank_event_queued)(void *, struct drm_file *, int, unsigned int);\n\ntypedef void (*btf_trace_emulate_vsyscall)(void *, int);\n\ntypedef void (*btf_trace_error_apic_entry)(void *, int);\n\ntypedef void (*btf_trace_error_apic_exit)(void *, int);\n\ntypedef void (*btf_trace_error_report_end)(void *, enum error_detector, long unsigned int);\n\ntypedef void (*btf_trace_error_wwnr)(void *, int, char *, char *);\n\ntypedef void (*btf_trace_event_wwnr)(void *, int, char *, char *, char *, bool);\n\ntypedef void (*btf_trace_exit_mmap)(void *, struct mm_struct *);\n\ntypedef void (*btf_trace_ext4_alloc_da_blocks)(void *, struct inode *);\n\ntypedef void (*btf_trace_ext4_allocate_blocks)(void *, struct ext4_allocation_request *, long long unsigned int);\n\ntypedef void (*btf_trace_ext4_allocate_inode)(void *, struct inode *, struct inode *, int);\n\ntypedef void (*btf_trace_ext4_begin_ordered_truncate)(void *, struct inode *, loff_t);\n\ntypedef void (*btf_trace_ext4_collapse_range)(void *, struct inode *, loff_t, loff_t);\n\ntypedef void (*btf_trace_ext4_da_release_space)(void *, struct inode *, int);\n\ntypedef void (*btf_trace_ext4_da_reserve_space)(void *, struct inode *, int);\n\ntypedef void (*btf_trace_ext4_da_update_reserve_space)(void *, struct inode *, int, int);\n\ntypedef void (*btf_trace_ext4_da_write_begin)(void *, struct inode *, loff_t, unsigned int);\n\ntypedef void (*btf_trace_ext4_da_write_end)(void *, struct inode *, loff_t, unsigned int, unsigned int);\n\ntypedef void (*btf_trace_ext4_da_write_pages)(void *, struct inode *, long unsigned int, struct writeback_control *);\n\ntypedef void (*btf_trace_ext4_da_write_pages_extent)(void *, struct inode *, struct ext4_map_blocks *);\n\ntypedef void (*btf_trace_ext4_discard_blocks)(void *, struct super_block *, long long unsigned int, long long unsigned int);\n\ntypedef void (*btf_trace_ext4_discard_preallocations)(void *, struct inode *, unsigned int);\n\ntypedef void (*btf_trace_ext4_drop_inode)(void *, struct inode *, int);\n\ntypedef void (*btf_trace_ext4_error)(void *, struct super_block *, const char *, unsigned int);\n\ntypedef void (*btf_trace_ext4_es_cache_extent)(void *, struct inode *, struct extent_status *);\n\ntypedef void (*btf_trace_ext4_es_find_extent_range_enter)(void *, struct inode *, ext4_lblk_t);\n\ntypedef void (*btf_trace_ext4_es_find_extent_range_exit)(void *, struct inode *, struct extent_status *);\n\ntypedef void (*btf_trace_ext4_es_insert_delayed_extent)(void *, struct inode *, struct extent_status *, bool, bool);\n\ntypedef void (*btf_trace_ext4_es_insert_extent)(void *, struct inode *, struct extent_status *);\n\ntypedef void (*btf_trace_ext4_es_lookup_extent_enter)(void *, struct inode *, ext4_lblk_t);\n\ntypedef void (*btf_trace_ext4_es_lookup_extent_exit)(void *, struct inode *, struct extent_status *, int);\n\ntypedef void (*btf_trace_ext4_es_remove_extent)(void *, struct inode *, ext4_lblk_t, ext4_lblk_t);\n\ntypedef void (*btf_trace_ext4_es_shrink)(void *, struct super_block *, int, u64, int, int);\n\ntypedef void (*btf_trace_ext4_es_shrink_count)(void *, struct super_block *, int, int);\n\ntypedef void (*btf_trace_ext4_es_shrink_scan_enter)(void *, struct super_block *, int, int);\n\ntypedef void (*btf_trace_ext4_es_shrink_scan_exit)(void *, struct super_block *, int, int);\n\ntypedef void (*btf_trace_ext4_evict_inode)(void *, struct inode *);\n\ntypedef void (*btf_trace_ext4_ext_convert_to_initialized_enter)(void *, struct inode *, struct ext4_map_blocks *, struct ext4_extent *);\n\ntypedef void (*btf_trace_ext4_ext_convert_to_initialized_fastpath)(void *, struct inode *, struct ext4_map_blocks *, struct ext4_extent *, struct ext4_extent *);\n\ntypedef void (*btf_trace_ext4_ext_handle_unwritten_extents)(void *, struct inode *, struct ext4_map_blocks *, int, unsigned int, ext4_fsblk_t);\n\ntypedef void (*btf_trace_ext4_ext_load_extent)(void *, struct inode *, ext4_lblk_t, ext4_fsblk_t);\n\ntypedef void (*btf_trace_ext4_ext_map_blocks_enter)(void *, struct inode *, ext4_lblk_t, unsigned int, unsigned int);\n\ntypedef void (*btf_trace_ext4_ext_map_blocks_exit)(void *, struct inode *, unsigned int, struct ext4_map_blocks *, int);\n\ntypedef void (*btf_trace_ext4_ext_remove_space)(void *, struct inode *, ext4_lblk_t, ext4_lblk_t, int);\n\ntypedef void (*btf_trace_ext4_ext_remove_space_done)(void *, struct inode *, ext4_lblk_t, ext4_lblk_t, int, struct partial_cluster *, __le16);\n\ntypedef void (*btf_trace_ext4_ext_rm_idx)(void *, struct inode *, ext4_fsblk_t);\n\ntypedef void (*btf_trace_ext4_ext_rm_leaf)(void *, struct inode *, ext4_lblk_t, struct ext4_extent *, struct partial_cluster *);\n\ntypedef void (*btf_trace_ext4_ext_show_extent)(void *, struct inode *, ext4_lblk_t, ext4_fsblk_t, short unsigned int);\n\ntypedef void (*btf_trace_ext4_fallocate_enter)(void *, struct inode *, loff_t, loff_t, int);\n\ntypedef void (*btf_trace_ext4_fallocate_exit)(void *, struct inode *, loff_t, unsigned int, int);\n\ntypedef void (*btf_trace_ext4_fc_cleanup)(void *, journal_t *, int, tid_t);\n\ntypedef void (*btf_trace_ext4_fc_commit_start)(void *, struct super_block *, tid_t);\n\ntypedef void (*btf_trace_ext4_fc_commit_stop)(void *, struct super_block *, int, int, tid_t);\n\ntypedef void (*btf_trace_ext4_fc_replay)(void *, struct super_block *, int, int, int, int);\n\ntypedef void (*btf_trace_ext4_fc_replay_scan)(void *, struct super_block *, int, int);\n\ntypedef void (*btf_trace_ext4_fc_stats)(void *, struct super_block *);\n\ntypedef void (*btf_trace_ext4_fc_track_create)(void *, handle_t *, struct inode *, struct dentry *, int);\n\ntypedef void (*btf_trace_ext4_fc_track_inode)(void *, handle_t *, struct inode *, int);\n\ntypedef void (*btf_trace_ext4_fc_track_link)(void *, handle_t *, struct inode *, struct dentry *, int);\n\ntypedef void (*btf_trace_ext4_fc_track_range)(void *, handle_t *, struct inode *, long int, long int, int);\n\ntypedef void (*btf_trace_ext4_fc_track_unlink)(void *, handle_t *, struct inode *, struct dentry *, int);\n\ntypedef void (*btf_trace_ext4_forget)(void *, struct inode *, int, __u64);\n\ntypedef void (*btf_trace_ext4_free_blocks)(void *, struct inode *, __u64, long unsigned int, int);\n\ntypedef void (*btf_trace_ext4_free_inode)(void *, struct inode *);\n\ntypedef void (*btf_trace_ext4_fsmap_high_key)(void *, struct super_block *, u32, u32, u64, u64, u64);\n\ntypedef void (*btf_trace_ext4_fsmap_low_key)(void *, struct super_block *, u32, u32, u64, u64, u64);\n\ntypedef void (*btf_trace_ext4_fsmap_mapping)(void *, struct super_block *, u32, u32, u64, u64, u64);\n\ntypedef void (*btf_trace_ext4_get_implied_cluster_alloc_exit)(void *, struct super_block *, struct ext4_map_blocks *, int);\n\ntypedef void (*btf_trace_ext4_getfsmap_high_key)(void *, struct super_block *, struct ext4_fsmap *);\n\ntypedef void (*btf_trace_ext4_getfsmap_low_key)(void *, struct super_block *, struct ext4_fsmap *);\n\ntypedef void (*btf_trace_ext4_getfsmap_mapping)(void *, struct super_block *, struct ext4_fsmap *);\n\ntypedef void (*btf_trace_ext4_ind_map_blocks_enter)(void *, struct inode *, ext4_lblk_t, unsigned int, unsigned int);\n\ntypedef void (*btf_trace_ext4_ind_map_blocks_exit)(void *, struct inode *, unsigned int, struct ext4_map_blocks *, int);\n\ntypedef void (*btf_trace_ext4_insert_range)(void *, struct inode *, loff_t, loff_t);\n\ntypedef void (*btf_trace_ext4_invalidate_folio)(void *, struct folio *, size_t, size_t);\n\ntypedef void (*btf_trace_ext4_journal_start_inode)(void *, struct inode *, int, int, int, int, long unsigned int);\n\ntypedef void (*btf_trace_ext4_journal_start_reserved)(void *, struct super_block *, int, long unsigned int);\n\ntypedef void (*btf_trace_ext4_journal_start_sb)(void *, struct super_block *, int, int, int, int, long unsigned int);\n\ntypedef void (*btf_trace_ext4_journalled_invalidate_folio)(void *, struct folio *, size_t, size_t);\n\ntypedef void (*btf_trace_ext4_journalled_write_end)(void *, struct inode *, loff_t, unsigned int, unsigned int);\n\ntypedef void (*btf_trace_ext4_lazy_itable_init)(void *, struct super_block *, ext4_group_t);\n\ntypedef void (*btf_trace_ext4_load_inode)(void *, struct super_block *, long unsigned int);\n\ntypedef void (*btf_trace_ext4_load_inode_bitmap)(void *, struct super_block *, long unsigned int);\n\ntypedef void (*btf_trace_ext4_mark_inode_dirty)(void *, struct inode *, long unsigned int);\n\ntypedef void (*btf_trace_ext4_mb_bitmap_load)(void *, struct super_block *, long unsigned int);\n\ntypedef void (*btf_trace_ext4_mb_buddy_bitmap_load)(void *, struct super_block *, long unsigned int);\n\ntypedef void (*btf_trace_ext4_mb_discard_preallocations)(void *, struct super_block *, int);\n\ntypedef void (*btf_trace_ext4_mb_new_group_pa)(void *, struct ext4_allocation_context *, struct ext4_prealloc_space *);\n\ntypedef void (*btf_trace_ext4_mb_new_inode_pa)(void *, struct ext4_allocation_context *, struct ext4_prealloc_space *);\n\ntypedef void (*btf_trace_ext4_mb_release_group_pa)(void *, struct super_block *, struct ext4_prealloc_space *);\n\ntypedef void (*btf_trace_ext4_mb_release_inode_pa)(void *, struct ext4_prealloc_space *, long long unsigned int, unsigned int);\n\ntypedef void (*btf_trace_ext4_mballoc_alloc)(void *, struct ext4_allocation_context *);\n\ntypedef void (*btf_trace_ext4_mballoc_discard)(void *, struct super_block *, struct inode *, ext4_group_t, ext4_grpblk_t, ext4_grpblk_t);\n\ntypedef void (*btf_trace_ext4_mballoc_free)(void *, struct super_block *, struct inode *, ext4_group_t, ext4_grpblk_t, ext4_grpblk_t);\n\ntypedef void (*btf_trace_ext4_mballoc_prealloc)(void *, struct ext4_allocation_context *);\n\ntypedef void (*btf_trace_ext4_nfs_commit_metadata)(void *, struct inode *);\n\ntypedef void (*btf_trace_ext4_other_inode_update_time)(void *, struct inode *, ino_t);\n\ntypedef void (*btf_trace_ext4_prefetch_bitmaps)(void *, struct super_block *, ext4_group_t, ext4_group_t, unsigned int);\n\ntypedef void (*btf_trace_ext4_punch_hole)(void *, struct inode *, loff_t, loff_t, int);\n\ntypedef void (*btf_trace_ext4_read_block_bitmap_load)(void *, struct super_block *, long unsigned int, bool);\n\ntypedef void (*btf_trace_ext4_read_folio)(void *, struct inode *, struct folio *);\n\ntypedef void (*btf_trace_ext4_release_folio)(void *, struct inode *, struct folio *);\n\ntypedef void (*btf_trace_ext4_remove_blocks)(void *, struct inode *, struct ext4_extent *, ext4_lblk_t, ext4_fsblk_t, struct partial_cluster *);\n\ntypedef void (*btf_trace_ext4_request_blocks)(void *, struct ext4_allocation_request *);\n\ntypedef void (*btf_trace_ext4_request_inode)(void *, struct inode *, int);\n\ntypedef void (*btf_trace_ext4_shutdown)(void *, struct super_block *, long unsigned int);\n\ntypedef void (*btf_trace_ext4_sync_file_enter)(void *, struct file *, int);\n\ntypedef void (*btf_trace_ext4_sync_file_exit)(void *, struct inode *, int);\n\ntypedef void (*btf_trace_ext4_sync_fs)(void *, struct super_block *, int);\n\ntypedef void (*btf_trace_ext4_trim_all_free)(void *, struct super_block *, ext4_group_t, ext4_grpblk_t, ext4_grpblk_t);\n\ntypedef void (*btf_trace_ext4_trim_extent)(void *, struct super_block *, ext4_group_t, ext4_grpblk_t, ext4_grpblk_t);\n\ntypedef void (*btf_trace_ext4_truncate_enter)(void *, struct inode *);\n\ntypedef void (*btf_trace_ext4_truncate_exit)(void *, struct inode *);\n\ntypedef void (*btf_trace_ext4_unlink_enter)(void *, struct inode *, struct dentry *);\n\ntypedef void (*btf_trace_ext4_unlink_exit)(void *, struct dentry *, int);\n\ntypedef void (*btf_trace_ext4_update_sb)(void *, struct super_block *, ext4_fsblk_t, unsigned int);\n\ntypedef void (*btf_trace_ext4_write_begin)(void *, struct inode *, loff_t, unsigned int);\n\ntypedef void (*btf_trace_ext4_write_end)(void *, struct inode *, loff_t, unsigned int, unsigned int);\n\ntypedef void (*btf_trace_ext4_writepages)(void *, struct inode *, struct writeback_control *);\n\ntypedef void (*btf_trace_ext4_writepages_result)(void *, struct inode *, struct writeback_control *, int, int);\n\ntypedef void (*btf_trace_ext4_zero_range)(void *, struct inode *, loff_t, loff_t, int);\n\ntypedef void (*btf_trace_extlog_mem_event)(void *, struct cper_sec_mem_err *, u32, const guid_t *, const char *, u8);\n\ntypedef void (*btf_trace_fcntl_setlk)(void *, struct inode *, struct file_lock *, int);\n\ntypedef void (*btf_trace_fdb_delete)(void *, struct net_bridge *, struct net_bridge_fdb_entry *);\n\ntypedef void (*btf_trace_fib6_table_lookup)(void *, const struct net *, const struct fib6_result *, struct fib6_table *, const struct flowi6 *);\n\ntypedef void (*btf_trace_fib_table_lookup)(void *, u32, const struct flowi4 *, const struct fib_nh_common *, int);\n\ntypedef void (*btf_trace_file_check_and_advance_wb_err)(void *, struct file *, errseq_t);\n\ntypedef void (*btf_trace_filemap_set_wb_err)(void *, struct address_space *, errseq_t);\n\ntypedef void (*btf_trace_finish_task_reaping)(void *, int);\n\ntypedef void (*btf_trace_flock_lock_inode)(void *, struct inode *, struct file_lock *, int);\n\ntypedef void (*btf_trace_flush_foreign)(void *, struct bdi_writeback *, unsigned int, unsigned int);\n\ntypedef void (*btf_trace_folio_wait_writeback)(void *, struct folio *, struct address_space *);\n\ntypedef void (*btf_trace_free_vmap_area_noflush)(void *, long unsigned int, long unsigned int, long unsigned int);\n\ntypedef void (*btf_trace_generic_add_lease)(void *, struct inode *, struct file_lease *);\n\ntypedef void (*btf_trace_generic_delete_lease)(void *, struct inode *, struct file_lease *);\n\ntypedef void (*btf_trace_get_mapping_status)(void *, struct mptcp_ext *);\n\ntypedef void (*btf_trace_global_dirty_state)(void *, long unsigned int, long unsigned int);\n\ntypedef void (*btf_trace_gpio_direction)(void *, unsigned int, int, int);\n\ntypedef void (*btf_trace_gpio_value)(void *, unsigned int, int, int);\n\ntypedef void (*btf_trace_guest_halt_poll_ns)(void *, bool, unsigned int, unsigned int);\n\ntypedef void (*btf_trace_handshake_cancel)(void *, const struct net *, const struct handshake_req *, const struct sock *);\n\ntypedef void (*btf_trace_handshake_cancel_busy)(void *, const struct net *, const struct handshake_req *, const struct sock *);\n\ntypedef void (*btf_trace_handshake_cancel_none)(void *, const struct net *, const struct handshake_req *, const struct sock *);\n\ntypedef void (*btf_trace_handshake_cmd_accept)(void *, const struct net *, const struct handshake_req *, const struct sock *, int);\n\ntypedef void (*btf_trace_handshake_cmd_accept_err)(void *, const struct net *, const struct handshake_req *, const struct sock *, int);\n\ntypedef void (*btf_trace_handshake_cmd_done)(void *, const struct net *, const struct handshake_req *, const struct sock *, int);\n\ntypedef void (*btf_trace_handshake_cmd_done_err)(void *, const struct net *, const struct handshake_req *, const struct sock *, int);\n\ntypedef void (*btf_trace_handshake_complete)(void *, const struct net *, const struct handshake_req *, const struct sock *, int);\n\ntypedef void (*btf_trace_handshake_destruct)(void *, const struct net *, const struct handshake_req *, const struct sock *);\n\ntypedef void (*btf_trace_handshake_notify_err)(void *, const struct net *, const struct handshake_req *, const struct sock *, int);\n\ntypedef void (*btf_trace_handshake_submit)(void *, const struct net *, const struct handshake_req *, const struct sock *);\n\ntypedef void (*btf_trace_handshake_submit_err)(void *, const struct net *, const struct handshake_req *, const struct sock *, int);\n\ntypedef void (*btf_trace_hrtimer_cancel)(void *, struct hrtimer *);\n\ntypedef void (*btf_trace_hrtimer_expire_entry)(void *, struct hrtimer *, ktime_t *);\n\ntypedef void (*btf_trace_hrtimer_expire_exit)(void *, struct hrtimer *);\n\ntypedef void (*btf_trace_hrtimer_init)(void *, struct hrtimer *, clockid_t, enum hrtimer_mode);\n\ntypedef void (*btf_trace_hrtimer_start)(void *, struct hrtimer *, enum hrtimer_mode);\n\ntypedef void (*btf_trace_hugepage_set_pmd)(void *, long unsigned int, long unsigned int);\n\ntypedef void (*btf_trace_hugepage_set_pud)(void *, long unsigned int, long unsigned int);\n\ntypedef void (*btf_trace_hugepage_update_pmd)(void *, long unsigned int, long unsigned int, long unsigned int, long unsigned int);\n\ntypedef void (*btf_trace_hugepage_update_pud)(void *, long unsigned int, long unsigned int, long unsigned int, long unsigned int);\n\ntypedef void (*btf_trace_hwmon_attr_show)(void *, int, const char *, long int);\n\ntypedef void (*btf_trace_hwmon_attr_show_string)(void *, int, const char *, const char *);\n\ntypedef void (*btf_trace_hwmon_attr_store)(void *, int, const char *, long int);\n\ntypedef void (*btf_trace_hyperv_mmu_flush_tlb_multi)(void *, const struct cpumask *, const struct flush_tlb_info *);\n\ntypedef void (*btf_trace_hyperv_nested_flush_guest_mapping)(void *, u64, int);\n\ntypedef void (*btf_trace_hyperv_nested_flush_guest_mapping_range)(void *, u64, int);\n\ntypedef void (*btf_trace_hyperv_send_ipi_mask)(void *, const struct cpumask *, int);\n\ntypedef void (*btf_trace_hyperv_send_ipi_one)(void *, int, int);\n\ntypedef void (*btf_trace_i2c_read)(void *, const struct i2c_adapter *, const struct i2c_msg *, int);\n\ntypedef void (*btf_trace_i2c_reply)(void *, const struct i2c_adapter *, const struct i2c_msg *, int);\n\ntypedef void (*btf_trace_i2c_result)(void *, const struct i2c_adapter *, int, int);\n\ntypedef void (*btf_trace_i2c_write)(void *, const struct i2c_adapter *, const struct i2c_msg *, int);\n\ntypedef void (*btf_trace_icc_set_bw)(void *, struct icc_path *, struct icc_node *, int, u32, u32);\n\ntypedef void (*btf_trace_icc_set_bw_end)(void *, struct icc_path *, int);\n\ntypedef void (*btf_trace_icmp_send)(void *, const struct sk_buff *, int, int);\n\ntypedef void (*btf_trace_inet_sk_error_report)(void *, const struct sock *);\n\ntypedef void (*btf_trace_inet_sock_set_state)(void *, const struct sock *, const int, const int);\n\ntypedef void (*btf_trace_initcall_finish)(void *, initcall_t, int);\n\ntypedef void (*btf_trace_initcall_level)(void *, const char *);\n\ntypedef void (*btf_trace_initcall_start)(void *, initcall_t);\n\ntypedef void (*btf_trace_inode_foreign_history)(void *, struct inode *, struct writeback_control *, unsigned int);\n\ntypedef void (*btf_trace_inode_switch_wbs)(void *, struct inode *, struct bdi_writeback *, struct bdi_writeback *);\n\ntypedef void (*btf_trace_io_page_fault)(void *, struct device *, long unsigned int, int);\n\ntypedef void (*btf_trace_io_uring_complete)(void *, void *, void *, u64, int, unsigned int, u64, u64);\n\ntypedef void (*btf_trace_io_uring_cqe_overflow)(void *, void *, long long unsigned int, s32, u32, void *);\n\ntypedef void (*btf_trace_io_uring_cqring_wait)(void *, void *, int);\n\ntypedef void (*btf_trace_io_uring_create)(void *, int, void *, u32, u32, u32);\n\ntypedef void (*btf_trace_io_uring_defer)(void *, struct io_kiocb *);\n\ntypedef void (*btf_trace_io_uring_fail_link)(void *, struct io_kiocb *, struct io_kiocb *);\n\ntypedef void (*btf_trace_io_uring_file_get)(void *, struct io_kiocb *, int);\n\ntypedef void (*btf_trace_io_uring_link)(void *, struct io_kiocb *, struct io_kiocb *);\n\ntypedef void (*btf_trace_io_uring_local_work_run)(void *, void *, int, unsigned int);\n\ntypedef void (*btf_trace_io_uring_poll_arm)(void *, struct io_kiocb *, int, int);\n\ntypedef void (*btf_trace_io_uring_queue_async_work)(void *, struct io_kiocb *, int);\n\ntypedef void (*btf_trace_io_uring_register)(void *, void *, unsigned int, unsigned int, unsigned int, long int);\n\ntypedef void (*btf_trace_io_uring_req_failed)(void *, const struct io_uring_sqe *, struct io_kiocb *, int);\n\ntypedef void (*btf_trace_io_uring_short_write)(void *, void *, u64, u64, u64);\n\ntypedef void (*btf_trace_io_uring_submit_req)(void *, struct io_kiocb *);\n\ntypedef void (*btf_trace_io_uring_task_add)(void *, struct io_kiocb *, int);\n\ntypedef void (*btf_trace_io_uring_task_work_run)(void *, void *, unsigned int);\n\ntypedef void (*btf_trace_iocost_inuse_adjust)(void *, struct ioc_gq *, const char *, struct ioc_now *, u32, u32, u64, u64);\n\ntypedef void (*btf_trace_iocost_inuse_shortage)(void *, struct ioc_gq *, const char *, struct ioc_now *, u32, u32, u64, u64);\n\ntypedef void (*btf_trace_iocost_inuse_transfer)(void *, struct ioc_gq *, const char *, struct ioc_now *, u32, u32, u64, u64);\n\ntypedef void (*btf_trace_iocost_ioc_vrate_adj)(void *, struct ioc *, u64, u32 *, u32, int, int);\n\ntypedef void (*btf_trace_iocost_iocg_activate)(void *, struct ioc_gq *, const char *, struct ioc_now *, u64, u64, u64);\n\ntypedef void (*btf_trace_iocost_iocg_forgive_debt)(void *, struct ioc_gq *, const char *, struct ioc_now *, u32, u64, u64, u64, u64);\n\ntypedef void (*btf_trace_iocost_iocg_idle)(void *, struct ioc_gq *, const char *, struct ioc_now *, u64, u64, u64);\n\ntypedef void (*btf_trace_iomap_dio_complete)(void *, struct kiocb *, int, ssize_t);\n\ntypedef void (*btf_trace_iomap_dio_invalidate_fail)(void *, struct inode *, loff_t, u64);\n\ntypedef void (*btf_trace_iomap_dio_rw_begin)(void *, struct kiocb *, struct iov_iter *, unsigned int, size_t);\n\ntypedef void (*btf_trace_iomap_dio_rw_queued)(void *, struct inode *, loff_t, u64);\n\ntypedef void (*btf_trace_iomap_invalidate_folio)(void *, struct inode *, loff_t, u64);\n\ntypedef void (*btf_trace_iomap_iter)(void *, struct iomap_iter *, const void *, long unsigned int);\n\ntypedef void (*btf_trace_iomap_iter_dstmap)(void *, struct inode *, struct iomap *);\n\ntypedef void (*btf_trace_iomap_iter_srcmap)(void *, struct inode *, struct iomap *);\n\ntypedef void (*btf_trace_iomap_readahead)(void *, struct inode *, int);\n\ntypedef void (*btf_trace_iomap_readpage)(void *, struct inode *, int);\n\ntypedef void (*btf_trace_iomap_release_folio)(void *, struct inode *, loff_t, u64);\n\ntypedef void (*btf_trace_iomap_writepage)(void *, struct inode *, loff_t, u64);\n\ntypedef void (*btf_trace_iomap_writepage_map)(void *, struct inode *, u64, unsigned int, struct iomap *);\n\ntypedef void (*btf_trace_ipi_entry)(void *, const char *);\n\ntypedef void (*btf_trace_ipi_exit)(void *, const char *);\n\ntypedef void (*btf_trace_ipi_raise)(void *, const struct cpumask *, const char *);\n\ntypedef void (*btf_trace_ipi_send_cpu)(void *, const unsigned int, long unsigned int, void *);\n\ntypedef void (*btf_trace_ipi_send_cpumask)(void *, const struct cpumask *, long unsigned int, void *);\n\ntypedef void (*btf_trace_irq_handler_entry)(void *, int, struct irqaction *);\n\ntypedef void (*btf_trace_irq_handler_exit)(void *, int, struct irqaction *, int);\n\ntypedef void (*btf_trace_irq_matrix_alloc)(void *, int, unsigned int, struct irq_matrix *, struct cpumap *);\n\ntypedef void (*btf_trace_irq_matrix_alloc_managed)(void *, int, unsigned int, struct irq_matrix *, struct cpumap *);\n\ntypedef void (*btf_trace_irq_matrix_alloc_reserved)(void *, int, unsigned int, struct irq_matrix *, struct cpumap *);\n\ntypedef void (*btf_trace_irq_matrix_assign)(void *, int, unsigned int, struct irq_matrix *, struct cpumap *);\n\ntypedef void (*btf_trace_irq_matrix_assign_system)(void *, int, struct irq_matrix *);\n\ntypedef void (*btf_trace_irq_matrix_free)(void *, int, unsigned int, struct irq_matrix *, struct cpumap *);\n\ntypedef void (*btf_trace_irq_matrix_offline)(void *, struct irq_matrix *);\n\ntypedef void (*btf_trace_irq_matrix_online)(void *, struct irq_matrix *);\n\ntypedef void (*btf_trace_irq_matrix_remove_managed)(void *, int, unsigned int, struct irq_matrix *, struct cpumap *);\n\ntypedef void (*btf_trace_irq_matrix_remove_reserved)(void *, struct irq_matrix *);\n\ntypedef void (*btf_trace_irq_matrix_reserve)(void *, struct irq_matrix *);\n\ntypedef void (*btf_trace_irq_matrix_reserve_managed)(void *, int, unsigned int, struct irq_matrix *, struct cpumap *);\n\ntypedef void (*btf_trace_irq_noise)(void *, int, const char *, u64, u64);\n\ntypedef void (*btf_trace_irq_work_entry)(void *, int);\n\ntypedef void (*btf_trace_irq_work_exit)(void *, int);\n\ntypedef void (*btf_trace_itimer_expire)(void *, int, struct pid *, long long unsigned int);\n\ntypedef void (*btf_trace_itimer_state)(void *, int, const struct itimerspec64 * const, long long unsigned int);\n\ntypedef void (*btf_trace_jbd2_checkpoint)(void *, journal_t *, int);\n\ntypedef void (*btf_trace_jbd2_checkpoint_stats)(void *, dev_t, tid_t, struct transaction_chp_stats_s *);\n\ntypedef void (*btf_trace_jbd2_commit_flushing)(void *, journal_t *, transaction_t *);\n\ntypedef void (*btf_trace_jbd2_commit_locking)(void *, journal_t *, transaction_t *);\n\ntypedef void (*btf_trace_jbd2_commit_logging)(void *, journal_t *, transaction_t *);\n\ntypedef void (*btf_trace_jbd2_drop_transaction)(void *, journal_t *, transaction_t *);\n\ntypedef void (*btf_trace_jbd2_end_commit)(void *, journal_t *, transaction_t *);\n\ntypedef void (*btf_trace_jbd2_handle_extend)(void *, dev_t, tid_t, unsigned int, unsigned int, int, int);\n\ntypedef void (*btf_trace_jbd2_handle_restart)(void *, dev_t, tid_t, unsigned int, unsigned int, int);\n\ntypedef void (*btf_trace_jbd2_handle_start)(void *, dev_t, tid_t, unsigned int, unsigned int, int);\n\ntypedef void (*btf_trace_jbd2_handle_stats)(void *, dev_t, tid_t, unsigned int, unsigned int, int, int, int, int);\n\ntypedef void (*btf_trace_jbd2_lock_buffer_stall)(void *, dev_t, long unsigned int);\n\ntypedef void (*btf_trace_jbd2_run_stats)(void *, dev_t, tid_t, struct transaction_run_stats_s *);\n\ntypedef void (*btf_trace_jbd2_shrink_checkpoint_list)(void *, journal_t *, tid_t, tid_t, tid_t, long unsigned int, tid_t);\n\ntypedef void (*btf_trace_jbd2_shrink_count)(void *, journal_t *, long unsigned int, long unsigned int);\n\ntypedef void (*btf_trace_jbd2_shrink_scan_enter)(void *, journal_t *, long unsigned int, long unsigned int);\n\ntypedef void (*btf_trace_jbd2_shrink_scan_exit)(void *, journal_t *, long unsigned int, long unsigned int, long unsigned int);\n\ntypedef void (*btf_trace_jbd2_start_commit)(void *, journal_t *, transaction_t *);\n\ntypedef void (*btf_trace_jbd2_submit_inode_data)(void *, struct inode *);\n\ntypedef void (*btf_trace_jbd2_update_log_tail)(void *, journal_t *, tid_t, long unsigned int, long unsigned int);\n\ntypedef void (*btf_trace_jbd2_write_superblock)(void *, journal_t *, blk_opf_t);\n\ntypedef void (*btf_trace_kfree)(void *, long unsigned int, const void *);\n\ntypedef void (*btf_trace_kfree_skb)(void *, struct sk_buff *, void *, enum skb_drop_reason, struct sock *);\n\ntypedef void (*btf_trace_kmalloc)(void *, long unsigned int, const void *, size_t, size_t, gfp_t, int);\n\ntypedef void (*btf_trace_kmem_cache_alloc)(void *, long unsigned int, const void *, struct kmem_cache *, gfp_t, int);\n\ntypedef void (*btf_trace_kmem_cache_free)(void *, long unsigned int, const void *, const struct kmem_cache *);\n\ntypedef void (*btf_trace_ksm_advisor)(void *, s64, long unsigned int, unsigned int);\n\ntypedef void (*btf_trace_ksm_enter)(void *, void *);\n\ntypedef void (*btf_trace_ksm_exit)(void *, void *);\n\ntypedef void (*btf_trace_ksm_merge_one_page)(void *, long unsigned int, void *, void *, int);\n\ntypedef void (*btf_trace_ksm_merge_with_ksm_page)(void *, void *, long unsigned int, void *, void *, int);\n\ntypedef void (*btf_trace_ksm_remove_ksm_page)(void *, long unsigned int);\n\ntypedef void (*btf_trace_ksm_remove_rmap_item)(void *, long unsigned int, void *, void *);\n\ntypedef void (*btf_trace_ksm_start_scan)(void *, int, u32);\n\ntypedef void (*btf_trace_ksm_stop_scan)(void *, int, u32);\n\ntypedef void (*btf_trace_leases_conflict)(void *, bool, struct file_lease *, struct file_lease *);\n\ntypedef void (*btf_trace_local_timer_entry)(void *, int);\n\ntypedef void (*btf_trace_local_timer_exit)(void *, int);\n\ntypedef void (*btf_trace_locks_get_lock_context)(void *, struct inode *, int, struct file_lock_context *);\n\ntypedef void (*btf_trace_locks_remove_posix)(void *, struct inode *, struct file_lock *, int);\n\ntypedef void (*btf_trace_ma_op)(void *, const char *, struct ma_state *);\n\ntypedef void (*btf_trace_ma_read)(void *, const char *, struct ma_state *);\n\ntypedef void (*btf_trace_ma_write)(void *, const char *, struct ma_state *, long unsigned int, void *);\n\ntypedef void (*btf_trace_map)(void *, long unsigned int, phys_addr_t, size_t);\n\ntypedef void (*btf_trace_mark_victim)(void *, struct task_struct *, uid_t);\n\ntypedef void (*btf_trace_mc_event)(void *, const unsigned int, const char *, const char *, const int, const u8, const s8, const s8, const s8, long unsigned int, const u8, long unsigned int, const char *);\n\ntypedef void (*btf_trace_mce_record)(void *, struct mce *);\n\ntypedef void (*btf_trace_mctp_key_acquire)(void *, const struct mctp_sk_key *);\n\ntypedef void (*btf_trace_mctp_key_release)(void *, const struct mctp_sk_key *, int);\n\ntypedef void (*btf_trace_mdio_access)(void *, struct mii_bus *, char, u8, unsigned int, u16, int);\n\ntypedef void (*btf_trace_mem_connect)(void *, const struct xdp_mem_allocator *, const struct xdp_rxq_info *);\n\ntypedef void (*btf_trace_mem_disconnect)(void *, const struct xdp_mem_allocator *);\n\ntypedef void (*btf_trace_mem_return_failed)(void *, const struct xdp_mem_info *, const struct page *);\n\ntypedef void (*btf_trace_memory_failure_event)(void *, long unsigned int, int, int);\n\ntypedef void (*btf_trace_mm_alloc_contig_migrate_range_info)(void *, long unsigned int, long unsigned int, long unsigned int, long unsigned int, long unsigned int, int);\n\ntypedef void (*btf_trace_mm_collapse_huge_page)(void *, struct mm_struct *, int, int);\n\ntypedef void (*btf_trace_mm_collapse_huge_page_isolate)(void *, struct page *, int, int, bool, int);\n\ntypedef void (*btf_trace_mm_collapse_huge_page_swapin)(void *, struct mm_struct *, int, int, int);\n\ntypedef void (*btf_trace_mm_compaction_begin)(void *, struct compact_control *, long unsigned int, long unsigned int, bool);\n\ntypedef void (*btf_trace_mm_compaction_defer_compaction)(void *, struct zone *, int);\n\ntypedef void (*btf_trace_mm_compaction_defer_reset)(void *, struct zone *, int);\n\ntypedef void (*btf_trace_mm_compaction_deferred)(void *, struct zone *, int);\n\ntypedef void (*btf_trace_mm_compaction_end)(void *, struct compact_control *, long unsigned int, long unsigned int, bool, int);\n\ntypedef void (*btf_trace_mm_compaction_fast_isolate_freepages)(void *, long unsigned int, long unsigned int, long unsigned int, long unsigned int);\n\ntypedef void (*btf_trace_mm_compaction_finished)(void *, struct zone *, int, int);\n\ntypedef void (*btf_trace_mm_compaction_isolate_freepages)(void *, long unsigned int, long unsigned int, long unsigned int, long unsigned int);\n\ntypedef void (*btf_trace_mm_compaction_isolate_migratepages)(void *, long unsigned int, long unsigned int, long unsigned int, long unsigned int);\n\ntypedef void (*btf_trace_mm_compaction_kcompactd_sleep)(void *, int);\n\ntypedef void (*btf_trace_mm_compaction_kcompactd_wake)(void *, int, int, enum zone_type);\n\ntypedef void (*btf_trace_mm_compaction_migratepages)(void *, unsigned int, unsigned int);\n\ntypedef void (*btf_trace_mm_compaction_suitable)(void *, struct zone *, int, int);\n\ntypedef void (*btf_trace_mm_compaction_try_to_compact_pages)(void *, int, gfp_t, int);\n\ntypedef void (*btf_trace_mm_compaction_wakeup_kcompactd)(void *, int, int, enum zone_type);\n\ntypedef void (*btf_trace_mm_filemap_add_to_page_cache)(void *, struct folio *);\n\ntypedef void (*btf_trace_mm_filemap_delete_from_page_cache)(void *, struct folio *);\n\ntypedef void (*btf_trace_mm_khugepaged_collapse_file)(void *, struct mm_struct *, struct folio *, long unsigned int, long unsigned int, bool, struct file *, int, int);\n\ntypedef void (*btf_trace_mm_khugepaged_scan_file)(void *, struct mm_struct *, struct folio *, struct file *, int, int, int);\n\ntypedef void (*btf_trace_mm_khugepaged_scan_pmd)(void *, struct mm_struct *, struct page *, bool, int, int, int, int);\n\ntypedef void (*btf_trace_mm_lru_activate)(void *, struct folio *);\n\ntypedef void (*btf_trace_mm_lru_insertion)(void *, struct folio *);\n\ntypedef void (*btf_trace_mm_migrate_pages)(void *, long unsigned int, long unsigned int, long unsigned int, long unsigned int, long unsigned int, long unsigned int, enum migrate_mode, int);\n\ntypedef void (*btf_trace_mm_migrate_pages_start)(void *, enum migrate_mode, int);\n\ntypedef void (*btf_trace_mm_page_alloc)(void *, struct page *, unsigned int, gfp_t, int);\n\ntypedef void (*btf_trace_mm_page_alloc_extfrag)(void *, struct page *, int, int, int, int);\n\ntypedef void (*btf_trace_mm_page_alloc_zone_locked)(void *, struct page *, unsigned int, int, int);\n\ntypedef void (*btf_trace_mm_page_free)(void *, struct page *, unsigned int);\n\ntypedef void (*btf_trace_mm_page_free_batched)(void *, struct page *);\n\ntypedef void (*btf_trace_mm_page_pcpu_drain)(void *, struct page *, unsigned int, int);\n\ntypedef void (*btf_trace_mm_shrink_slab_end)(void *, struct shrinker *, int, int, long int, long int, long int);\n\ntypedef void (*btf_trace_mm_shrink_slab_start)(void *, struct shrinker *, struct shrink_control *, long int, long unsigned int, long long unsigned int, long unsigned int, int);\n\ntypedef void (*btf_trace_mm_vmscan_direct_reclaim_begin)(void *, int, gfp_t);\n\ntypedef void (*btf_trace_mm_vmscan_direct_reclaim_end)(void *, long unsigned int);\n\ntypedef void (*btf_trace_mm_vmscan_kswapd_sleep)(void *, int);\n\ntypedef void (*btf_trace_mm_vmscan_kswapd_wake)(void *, int, int, int);\n\ntypedef void (*btf_trace_mm_vmscan_lru_isolate)(void *, int, int, long unsigned int, long unsigned int, long unsigned int, long unsigned int, int);\n\ntypedef void (*btf_trace_mm_vmscan_lru_shrink_active)(void *, int, long unsigned int, long unsigned int, long unsigned int, long unsigned int, int, int);\n\ntypedef void (*btf_trace_mm_vmscan_lru_shrink_inactive)(void *, int, long unsigned int, long unsigned int, struct reclaim_stat *, int, int);\n\ntypedef void (*btf_trace_mm_vmscan_memcg_reclaim_begin)(void *, int, gfp_t);\n\ntypedef void (*btf_trace_mm_vmscan_memcg_reclaim_end)(void *, long unsigned int);\n\ntypedef void (*btf_trace_mm_vmscan_memcg_softlimit_reclaim_begin)(void *, int, gfp_t);\n\ntypedef void (*btf_trace_mm_vmscan_memcg_softlimit_reclaim_end)(void *, long unsigned int);\n\ntypedef void (*btf_trace_mm_vmscan_node_reclaim_begin)(void *, int, int, gfp_t);\n\ntypedef void (*btf_trace_mm_vmscan_node_reclaim_end)(void *, long unsigned int);\n\ntypedef void (*btf_trace_mm_vmscan_throttled)(void *, int, int, int, int);\n\ntypedef void (*btf_trace_mm_vmscan_wakeup_kswapd)(void *, int, int, int, gfp_t);\n\ntypedef void (*btf_trace_mm_vmscan_write_folio)(void *, struct folio *);\n\ntypedef void (*btf_trace_mmap_lock_acquire_returned)(void *, struct mm_struct *, const char *, bool, bool);\n\ntypedef void (*btf_trace_mmap_lock_released)(void *, struct mm_struct *, const char *, bool);\n\ntypedef void (*btf_trace_mmap_lock_start_locking)(void *, struct mm_struct *, const char *, bool);\n\ntypedef void (*btf_trace_mmc_request_done)(void *, struct mmc_host *, struct mmc_request *);\n\ntypedef void (*btf_trace_mmc_request_start)(void *, struct mmc_host *, struct mmc_request *);\n\ntypedef void (*btf_trace_module_free)(void *, struct module *);\n\ntypedef void (*btf_trace_module_get)(void *, struct module *, long unsigned int);\n\ntypedef void (*btf_trace_module_load)(void *, struct module *);\n\ntypedef void (*btf_trace_module_put)(void *, struct module *, long unsigned int);\n\ntypedef void (*btf_trace_module_request)(void *, char *, bool, long unsigned int);\n\ntypedef void (*btf_trace_mon_llc_occupancy_limbo)(void *, u32, u32, int, u64);\n\ntypedef void (*btf_trace_mptcp_sendmsg_frag)(void *, struct mptcp_ext *);\n\ntypedef void (*btf_trace_mptcp_subflow_get_send)(void *, struct mptcp_subflow_context *);\n\ntypedef void (*btf_trace_napi_gro_frags_entry)(void *, const struct sk_buff *);\n\ntypedef void (*btf_trace_napi_gro_frags_exit)(void *, int);\n\ntypedef void (*btf_trace_napi_gro_receive_entry)(void *, const struct sk_buff *);\n\ntypedef void (*btf_trace_napi_gro_receive_exit)(void *, int);\n\ntypedef void (*btf_trace_napi_poll)(void *, struct napi_struct *, int, int);\n\ntypedef void (*btf_trace_neigh_cleanup_and_release)(void *, struct neighbour *, int);\n\ntypedef void (*btf_trace_neigh_create)(void *, struct neigh_table *, struct net_device *, const void *, const struct neighbour *, bool);\n\ntypedef void (*btf_trace_neigh_event_send_dead)(void *, struct neighbour *, int);\n\ntypedef void (*btf_trace_neigh_event_send_done)(void *, struct neighbour *, int);\n\ntypedef void (*btf_trace_neigh_timer_handler)(void *, struct neighbour *, int);\n\ntypedef void (*btf_trace_neigh_update)(void *, struct neighbour *, const u8 *, u8, u32, u32);\n\ntypedef void (*btf_trace_neigh_update_done)(void *, struct neighbour *, int);\n\ntypedef void (*btf_trace_net_dev_queue)(void *, struct sk_buff *);\n\ntypedef void (*btf_trace_net_dev_start_xmit)(void *, const struct sk_buff *, const struct net_device *);\n\ntypedef void (*btf_trace_net_dev_xmit)(void *, struct sk_buff *, int, struct net_device *, unsigned int);\n\ntypedef void (*btf_trace_net_dev_xmit_timeout)(void *, struct net_device *, int);\n\ntypedef void (*btf_trace_netif_receive_skb)(void *, struct sk_buff *);\n\ntypedef void (*btf_trace_netif_receive_skb_entry)(void *, const struct sk_buff *);\n\ntypedef void (*btf_trace_netif_receive_skb_exit)(void *, int);\n\ntypedef void (*btf_trace_netif_receive_skb_list_entry)(void *, const struct sk_buff *);\n\ntypedef void (*btf_trace_netif_receive_skb_list_exit)(void *, int);\n\ntypedef void (*btf_trace_netif_rx)(void *, struct sk_buff *);\n\ntypedef void (*btf_trace_netif_rx_entry)(void *, const struct sk_buff *);\n\ntypedef void (*btf_trace_netif_rx_exit)(void *, int);\n\ntypedef void (*btf_trace_netlink_extack)(void *, const char *);\n\ntypedef void (*btf_trace_nmi_handler)(void *, void *, s64, int);\n\ntypedef void (*btf_trace_nmi_noise)(void *, u64, u64);\n\ntypedef void (*btf_trace_non_standard_event)(void *, const guid_t *, const guid_t *, const char *, const u8, const u8 *, const u32);\n\ntypedef void (*btf_trace_notifier_register)(void *, void *);\n\ntypedef void (*btf_trace_notifier_run)(void *, void *);\n\ntypedef void (*btf_trace_notifier_unregister)(void *, void *);\n\ntypedef void (*btf_trace_oom_score_adj_update)(void *, struct task_struct *);\n\ntypedef void (*btf_trace_page_fault_kernel)(void *, long unsigned int, struct pt_regs *, long unsigned int);\n\ntypedef void (*btf_trace_page_fault_user)(void *, long unsigned int, struct pt_regs *, long unsigned int);\n\ntypedef void (*btf_trace_page_pool_release)(void *, const struct page_pool *, s32, u32, u32);\n\ntypedef void (*btf_trace_page_pool_state_hold)(void *, const struct page_pool *, netmem_ref, u32);\n\ntypedef void (*btf_trace_page_pool_state_release)(void *, const struct page_pool *, netmem_ref, u32);\n\ntypedef void (*btf_trace_page_pool_update_nid)(void *, const struct page_pool *, int);\n\ntypedef void (*btf_trace_pelt_cfs_tp)(void *, struct cfs_rq *);\n\ntypedef void (*btf_trace_pelt_dl_tp)(void *, struct rq *);\n\ntypedef void (*btf_trace_pelt_hw_tp)(void *, struct rq *);\n\ntypedef void (*btf_trace_pelt_irq_tp)(void *, struct rq *);\n\ntypedef void (*btf_trace_pelt_rt_tp)(void *, struct rq *);\n\ntypedef void (*btf_trace_pelt_se_tp)(void *, struct sched_entity *);\n\ntypedef void (*btf_trace_percpu_alloc_percpu)(void *, long unsigned int, bool, bool, size_t, size_t, void *, int, void *, size_t, gfp_t);\n\ntypedef void (*btf_trace_percpu_alloc_percpu_fail)(void *, bool, bool, size_t, size_t);\n\ntypedef void (*btf_trace_percpu_create_chunk)(void *, void *);\n\ntypedef void (*btf_trace_percpu_destroy_chunk)(void *, void *);\n\ntypedef void (*btf_trace_percpu_free_percpu)(void *, void *, int, void *);\n\ntypedef void (*btf_trace_pm_qos_add_request)(void *, s32);\n\ntypedef void (*btf_trace_pm_qos_remove_request)(void *, s32);\n\ntypedef void (*btf_trace_pm_qos_update_flags)(void *, enum pm_qos_req_action, int, int);\n\ntypedef void (*btf_trace_pm_qos_update_request)(void *, s32);\n\ntypedef void (*btf_trace_pm_qos_update_target)(void *, enum pm_qos_req_action, int, int);\n\ntypedef void (*btf_trace_posix_lock_inode)(void *, struct inode *, struct file_lock *, int);\n\ntypedef void (*btf_trace_power_domain_target)(void *, const char *, unsigned int, unsigned int);\n\ntypedef void (*btf_trace_powernv_throttle)(void *, int, const char *, int);\n\ntypedef void (*btf_trace_prq_report)(void *, struct intel_iommu *, struct device *, u64, u64, u64, u64, long unsigned int);\n\ntypedef void (*btf_trace_pseudo_lock_l2)(void *, u64, u64);\n\ntypedef void (*btf_trace_pseudo_lock_l3)(void *, u64, u64);\n\ntypedef void (*btf_trace_pseudo_lock_mem_latency)(void *, u32);\n\ntypedef void (*btf_trace_pstate_sample)(void *, u32, u32, u32, u32, u64, u64, u64, u32, u32);\n\ntypedef void (*btf_trace_purge_vmap_area_lazy)(void *, long unsigned int, long unsigned int, unsigned int);\n\ntypedef void (*btf_trace_pwm_apply)(void *, struct pwm_device *, const struct pwm_state *, int);\n\ntypedef void (*btf_trace_pwm_get)(void *, struct pwm_device *, const struct pwm_state *, int);\n\ntypedef void (*btf_trace_qdisc_create)(void *, const struct Qdisc_ops *, struct net_device *, u32);\n\ntypedef void (*btf_trace_qdisc_dequeue)(void *, struct Qdisc *, const struct netdev_queue *, int, struct sk_buff *);\n\ntypedef void (*btf_trace_qdisc_destroy)(void *, struct Qdisc *);\n\ntypedef void (*btf_trace_qdisc_enqueue)(void *, struct Qdisc *, const struct netdev_queue *, struct sk_buff *);\n\ntypedef void (*btf_trace_qdisc_reset)(void *, struct Qdisc *);\n\ntypedef void (*btf_trace_qi_submit)(void *, struct intel_iommu *, u64, u64, u64, u64);\n\ntypedef void (*btf_trace_rcu_stall_warning)(void *, const char *, const char *);\n\ntypedef void (*btf_trace_rcu_utilization)(void *, const char *);\n\ntypedef void (*btf_trace_rdpmc)(void *, unsigned int, u64, int);\n\ntypedef void (*btf_trace_read_msr)(void *, unsigned int, u64, int);\n\ntypedef void (*btf_trace_reclaim_retry_zone)(void *, struct zoneref *, int, long unsigned int, long unsigned int, long unsigned int, int, bool);\n\ntypedef void (*btf_trace_regcache_drop_region)(void *, struct regmap *, unsigned int, unsigned int);\n\ntypedef void (*btf_trace_regcache_sync)(void *, struct regmap *, const char *, const char *);\n\ntypedef void (*btf_trace_regmap_async_complete_done)(void *, struct regmap *);\n\ntypedef void (*btf_trace_regmap_async_complete_start)(void *, struct regmap *);\n\ntypedef void (*btf_trace_regmap_async_io_complete)(void *, struct regmap *);\n\ntypedef void (*btf_trace_regmap_async_write_start)(void *, struct regmap *, unsigned int, int);\n\ntypedef void (*btf_trace_regmap_bulk_read)(void *, struct regmap *, unsigned int, const void *, int);\n\ntypedef void (*btf_trace_regmap_bulk_write)(void *, struct regmap *, unsigned int, const void *, int);\n\ntypedef void (*btf_trace_regmap_cache_bypass)(void *, struct regmap *, bool);\n\ntypedef void (*btf_trace_regmap_cache_only)(void *, struct regmap *, bool);\n\ntypedef void (*btf_trace_regmap_hw_read_done)(void *, struct regmap *, unsigned int, int);\n\ntypedef void (*btf_trace_regmap_hw_read_start)(void *, struct regmap *, unsigned int, int);\n\ntypedef void (*btf_trace_regmap_hw_write_done)(void *, struct regmap *, unsigned int, int);\n\ntypedef void (*btf_trace_regmap_hw_write_start)(void *, struct regmap *, unsigned int, int);\n\ntypedef void (*btf_trace_regmap_reg_read)(void *, struct regmap *, unsigned int, unsigned int);\n\ntypedef void (*btf_trace_regmap_reg_read_cache)(void *, struct regmap *, unsigned int, unsigned int);\n\ntypedef void (*btf_trace_regmap_reg_write)(void *, struct regmap *, unsigned int, unsigned int);\n\ntypedef void (*btf_trace_regulator_bypass_disable)(void *, const char *);\n\ntypedef void (*btf_trace_regulator_bypass_disable_complete)(void *, const char *);\n\ntypedef void (*btf_trace_regulator_bypass_enable)(void *, const char *);\n\ntypedef void (*btf_trace_regulator_bypass_enable_complete)(void *, const char *);\n\ntypedef void (*btf_trace_regulator_disable)(void *, const char *);\n\ntypedef void (*btf_trace_regulator_disable_complete)(void *, const char *);\n\ntypedef void (*btf_trace_regulator_enable)(void *, const char *);\n\ntypedef void (*btf_trace_regulator_enable_complete)(void *, const char *);\n\ntypedef void (*btf_trace_regulator_enable_delay)(void *, const char *);\n\ntypedef void (*btf_trace_regulator_set_voltage)(void *, const char *, int, int);\n\ntypedef void (*btf_trace_regulator_set_voltage_complete)(void *, const char *, unsigned int);\n\ntypedef void (*btf_trace_remove_device_from_group)(void *, int, struct device *);\n\ntypedef void (*btf_trace_remove_migration_pmd)(void *, long unsigned int, long unsigned int);\n\ntypedef void (*btf_trace_remove_migration_pte)(void *, long unsigned int, long unsigned int, int);\n\ntypedef void (*btf_trace_reschedule_entry)(void *, int);\n\ntypedef void (*btf_trace_reschedule_exit)(void *, int);\n\ntypedef void (*btf_trace_rpm_idle)(void *, struct device *, int);\n\ntypedef void (*btf_trace_rpm_resume)(void *, struct device *, int);\n\ntypedef void (*btf_trace_rpm_return_int)(void *, struct device *, long unsigned int, int);\n\ntypedef void (*btf_trace_rpm_status)(void *, struct device *, enum rpm_status);\n\ntypedef void (*btf_trace_rpm_suspend)(void *, struct device *, int);\n\ntypedef void (*btf_trace_rpm_usage)(void *, struct device *, int);\n\ntypedef void (*btf_trace_rseq_ip_fixup)(void *, long unsigned int, long unsigned int, long unsigned int, long unsigned int);\n\ntypedef void (*btf_trace_rseq_update)(void *, struct task_struct *);\n\ntypedef void (*btf_trace_rss_stat)(void *, struct mm_struct *, int);\n\ntypedef void (*btf_trace_rtc_alarm_irq_enable)(void *, unsigned int, int);\n\ntypedef void (*btf_trace_rtc_irq_set_freq)(void *, int, int);\n\ntypedef void (*btf_trace_rtc_irq_set_state)(void *, int, int);\n\ntypedef void (*btf_trace_rtc_read_alarm)(void *, time64_t, int);\n\ntypedef void (*btf_trace_rtc_read_offset)(void *, long int, int);\n\ntypedef void (*btf_trace_rtc_read_time)(void *, time64_t, int);\n\ntypedef void (*btf_trace_rtc_set_alarm)(void *, time64_t, int);\n\ntypedef void (*btf_trace_rtc_set_offset)(void *, long int, int);\n\ntypedef void (*btf_trace_rtc_set_time)(void *, time64_t, int);\n\ntypedef void (*btf_trace_rtc_timer_dequeue)(void *, struct rtc_timer *);\n\ntypedef void (*btf_trace_rtc_timer_enqueue)(void *, struct rtc_timer *);\n\ntypedef void (*btf_trace_rtc_timer_fired)(void *, struct rtc_timer *);\n\ntypedef void (*btf_trace_sample_threshold)(void *, u64, u64, u64);\n\ntypedef void (*btf_trace_sb_clear_inode_writeback)(void *, struct inode *);\n\ntypedef void (*btf_trace_sb_mark_inode_writeback)(void *, struct inode *);\n\ntypedef void (*btf_trace_sched_compute_energy_tp)(void *, struct task_struct *, int, long unsigned int, long unsigned int, long unsigned int);\n\ntypedef void (*btf_trace_sched_cpu_capacity_tp)(void *, struct rq *);\n\ntypedef void (*btf_trace_sched_kthread_stop)(void *, struct task_struct *);\n\ntypedef void (*btf_trace_sched_kthread_stop_ret)(void *, int);\n\ntypedef void (*btf_trace_sched_kthread_work_execute_end)(void *, struct kthread_work *, kthread_work_func_t);\n\ntypedef void (*btf_trace_sched_kthread_work_execute_start)(void *, struct kthread_work *);\n\ntypedef void (*btf_trace_sched_kthread_work_queue_work)(void *, struct kthread_worker *, struct kthread_work *);\n\ntypedef void (*btf_trace_sched_migrate_task)(void *, struct task_struct *, int);\n\ntypedef void (*btf_trace_sched_move_numa)(void *, struct task_struct *, int, int);\n\ntypedef void (*btf_trace_sched_overutilized_tp)(void *, struct root_domain *, bool);\n\ntypedef void (*btf_trace_sched_pi_setprio)(void *, struct task_struct *, struct task_struct *);\n\ntypedef void (*btf_trace_sched_prepare_exec)(void *, struct task_struct *, struct linux_binprm *);\n\ntypedef void (*btf_trace_sched_process_exec)(void *, struct task_struct *, pid_t, struct linux_binprm *);\n\ntypedef void (*btf_trace_sched_process_exit)(void *, struct task_struct *);\n\ntypedef void (*btf_trace_sched_process_fork)(void *, struct task_struct *, struct task_struct *);\n\ntypedef void (*btf_trace_sched_process_free)(void *, struct task_struct *);\n\ntypedef void (*btf_trace_sched_process_hang)(void *, struct task_struct *);\n\ntypedef void (*btf_trace_sched_process_wait)(void *, struct pid *);\n\ntypedef void (*btf_trace_sched_skip_vma_numa)(void *, struct mm_struct *, struct vm_area_struct *, enum numa_vmaskip_reason);\n\ntypedef void (*btf_trace_sched_stat_blocked)(void *, struct task_struct *, u64);\n\ntypedef void (*btf_trace_sched_stat_iowait)(void *, struct task_struct *, u64);\n\ntypedef void (*btf_trace_sched_stat_runtime)(void *, struct task_struct *, u64);\n\ntypedef void (*btf_trace_sched_stat_sleep)(void *, struct task_struct *, u64);\n\ntypedef void (*btf_trace_sched_stat_wait)(void *, struct task_struct *, u64);\n\ntypedef void (*btf_trace_sched_stick_numa)(void *, struct task_struct *, int, struct task_struct *, int);\n\ntypedef void (*btf_trace_sched_swap_numa)(void *, struct task_struct *, int, struct task_struct *, int);\n\ntypedef void (*btf_trace_sched_switch)(void *, bool, struct task_struct *, struct task_struct *, unsigned int);\n\ntypedef void (*btf_trace_sched_update_nr_running_tp)(void *, struct rq *, int);\n\ntypedef void (*btf_trace_sched_util_est_cfs_tp)(void *, struct cfs_rq *);\n\ntypedef void (*btf_trace_sched_util_est_se_tp)(void *, struct sched_entity *);\n\ntypedef void (*btf_trace_sched_wait_task)(void *, struct task_struct *);\n\ntypedef void (*btf_trace_sched_wake_idle_without_ipi)(void *, int);\n\ntypedef void (*btf_trace_sched_wakeup)(void *, struct task_struct *);\n\ntypedef void (*btf_trace_sched_wakeup_new)(void *, struct task_struct *);\n\ntypedef void (*btf_trace_sched_waking)(void *, struct task_struct *);\n\ntypedef void (*btf_trace_scsi_dispatch_cmd_done)(void *, struct scsi_cmnd *);\n\ntypedef void (*btf_trace_scsi_dispatch_cmd_error)(void *, struct scsi_cmnd *, int);\n\ntypedef void (*btf_trace_scsi_dispatch_cmd_start)(void *, struct scsi_cmnd *);\n\ntypedef void (*btf_trace_scsi_dispatch_cmd_timeout)(void *, struct scsi_cmnd *);\n\ntypedef void (*btf_trace_scsi_eh_wakeup)(void *, struct Scsi_Host *);\n\ntypedef void (*btf_trace_scsi_prepare_zone_append)(void *, struct scsi_cmnd *, sector_t, unsigned int);\n\ntypedef void (*btf_trace_scsi_zone_wp_update)(void *, struct scsi_cmnd *, sector_t, unsigned int, unsigned int);\n\ntypedef void (*btf_trace_selinux_audited)(void *, struct selinux_audit_data *, char *, char *, const char *);\n\ntypedef void (*btf_trace_set_migration_pmd)(void *, long unsigned int, long unsigned int);\n\ntypedef void (*btf_trace_set_migration_pte)(void *, long unsigned int, long unsigned int, int);\n\ntypedef void (*btf_trace_signal_deliver)(void *, int, struct kernel_siginfo *, struct k_sigaction *);\n\ntypedef void (*btf_trace_signal_generate)(void *, int, struct kernel_siginfo *, struct task_struct *, int, int);\n\ntypedef void (*btf_trace_sk_data_ready)(void *, const struct sock *);\n\ntypedef void (*btf_trace_skb_copy_datagram_iovec)(void *, const struct sk_buff *, int);\n\ntypedef void (*btf_trace_skip_task_reaping)(void *, int);\n\ntypedef void (*btf_trace_smbus_read)(void *, const struct i2c_adapter *, u16, short unsigned int, char, u8, int);\n\ntypedef void (*btf_trace_smbus_reply)(void *, const struct i2c_adapter *, u16, short unsigned int, char, u8, int, const union i2c_smbus_data *, int);\n\ntypedef void (*btf_trace_smbus_result)(void *, const struct i2c_adapter *, u16, short unsigned int, char, u8, int, int);\n\ntypedef void (*btf_trace_smbus_write)(void *, const struct i2c_adapter *, u16, short unsigned int, char, u8, int, const union i2c_smbus_data *);\n\ntypedef void (*btf_trace_sock_exceed_buf_limit)(void *, struct sock *, struct proto *, long int, int);\n\ntypedef void (*btf_trace_sock_rcvqueue_full)(void *, struct sock *, struct sk_buff *);\n\ntypedef void (*btf_trace_sock_recv_length)(void *, struct sock *, int, int);\n\ntypedef void (*btf_trace_sock_send_length)(void *, struct sock *, int, int);\n\ntypedef void (*btf_trace_softirq_entry)(void *, unsigned int);\n\ntypedef void (*btf_trace_softirq_exit)(void *, unsigned int);\n\ntypedef void (*btf_trace_softirq_noise)(void *, int, u64, u64);\n\ntypedef void (*btf_trace_softirq_raise)(void *, unsigned int);\n\ntypedef void (*btf_trace_spi_controller_busy)(void *, struct spi_controller *);\n\ntypedef void (*btf_trace_spi_controller_idle)(void *, struct spi_controller *);\n\ntypedef void (*btf_trace_spi_message_done)(void *, struct spi_message *);\n\ntypedef void (*btf_trace_spi_message_start)(void *, struct spi_message *);\n\ntypedef void (*btf_trace_spi_message_submit)(void *, struct spi_message *);\n\ntypedef void (*btf_trace_spi_set_cs)(void *, struct spi_device *, bool);\n\ntypedef void (*btf_trace_spi_setup)(void *, struct spi_device *, int);\n\ntypedef void (*btf_trace_spi_transfer_start)(void *, struct spi_message *, struct spi_transfer *);\n\ntypedef void (*btf_trace_spi_transfer_stop)(void *, struct spi_message *, struct spi_transfer *);\n\ntypedef void (*btf_trace_spurious_apic_entry)(void *, int);\n\ntypedef void (*btf_trace_spurious_apic_exit)(void *, int);\n\ntypedef void (*btf_trace_start_task_reaping)(void *, int);\n\ntypedef void (*btf_trace_subflow_check_data_avail)(void *, __u8, struct sk_buff *);\n\ntypedef void (*btf_trace_suspend_resume)(void *, const char *, int, bool);\n\ntypedef void (*btf_trace_swiotlb_bounced)(void *, struct device *, dma_addr_t, size_t);\n\ntypedef void (*btf_trace_sync_timeline)(void *, struct sync_timeline *);\n\ntypedef void (*btf_trace_sys_enter)(void *, struct pt_regs *, long int);\n\ntypedef void (*btf_trace_sys_exit)(void *, struct pt_regs *, long int);\n\ntypedef void (*btf_trace_task_newtask)(void *, struct task_struct *, long unsigned int);\n\ntypedef void (*btf_trace_task_rename)(void *, struct task_struct *, const char *);\n\ntypedef void (*btf_trace_tasklet_entry)(void *, struct tasklet_struct *, void *);\n\ntypedef void (*btf_trace_tasklet_exit)(void *, struct tasklet_struct *, void *);\n\ntypedef void (*btf_trace_tcp_ao_handshake_failure)(void *, const struct sock *, const struct sk_buff *, const __u8, const __u8, const __u8);\n\ntypedef void (*btf_trace_tcp_ao_key_not_found)(void *, const struct sock *, const struct sk_buff *, const __u8, const __u8, const __u8);\n\ntypedef void (*btf_trace_tcp_ao_mismatch)(void *, const struct sock *, const struct sk_buff *, const __u8, const __u8, const __u8);\n\ntypedef void (*btf_trace_tcp_ao_rcv_sne_update)(void *, const struct sock *, __u32);\n\ntypedef void (*btf_trace_tcp_ao_rnext_request)(void *, const struct sock *, const struct sk_buff *, const __u8, const __u8, const __u8);\n\ntypedef void (*btf_trace_tcp_ao_snd_sne_update)(void *, const struct sock *, __u32);\n\ntypedef void (*btf_trace_tcp_ao_synack_no_key)(void *, const struct sock *, const __u8, const __u8);\n\ntypedef void (*btf_trace_tcp_ao_wrong_maclen)(void *, const struct sock *, const struct sk_buff *, const __u8, const __u8, const __u8);\n\ntypedef void (*btf_trace_tcp_bad_csum)(void *, const struct sk_buff *);\n\ntypedef void (*btf_trace_tcp_cong_state_set)(void *, struct sock *, const u8);\n\ntypedef void (*btf_trace_tcp_destroy_sock)(void *, struct sock *);\n\ntypedef void (*btf_trace_tcp_hash_ao_required)(void *, const struct sock *, const struct sk_buff *);\n\ntypedef void (*btf_trace_tcp_hash_bad_header)(void *, const struct sock *, const struct sk_buff *);\n\ntypedef void (*btf_trace_tcp_hash_md5_mismatch)(void *, const struct sock *, const struct sk_buff *);\n\ntypedef void (*btf_trace_tcp_hash_md5_required)(void *, const struct sock *, const struct sk_buff *);\n\ntypedef void (*btf_trace_tcp_hash_md5_unexpected)(void *, const struct sock *, const struct sk_buff *);\n\ntypedef void (*btf_trace_tcp_probe)(void *, struct sock *, struct sk_buff *);\n\ntypedef void (*btf_trace_tcp_rcv_space_adjust)(void *, struct sock *);\n\ntypedef void (*btf_trace_tcp_receive_reset)(void *, struct sock *);\n\ntypedef void (*btf_trace_tcp_retransmit_skb)(void *, const struct sock *, const struct sk_buff *);\n\ntypedef void (*btf_trace_tcp_retransmit_synack)(void *, const struct sock *, const struct request_sock *);\n\ntypedef void (*btf_trace_tcp_send_reset)(void *, const struct sock *, const struct sk_buff *, const enum sk_rst_reason);\n\ntypedef void (*btf_trace_test_pages_isolated)(void *, long unsigned int, long unsigned int, long unsigned int);\n\ntypedef void (*btf_trace_thermal_apic_entry)(void *, int);\n\ntypedef void (*btf_trace_thermal_apic_exit)(void *, int);\n\ntypedef void (*btf_trace_thermal_power_actor)(void *, struct thermal_zone_device *, int, u32, u32);\n\ntypedef void (*btf_trace_thermal_power_allocator)(void *, struct thermal_zone_device *, u32, u32, int, u32, u32, int, s32);\n\ntypedef void (*btf_trace_thermal_power_allocator_pid)(void *, struct thermal_zone_device *, s32, s32, s64, s64, s64, s32);\n\ntypedef void (*btf_trace_thermal_power_devfreq_get_power)(void *, struct thermal_cooling_device *, struct devfreq_dev_status *, long unsigned int, u32);\n\ntypedef void (*btf_trace_thermal_power_devfreq_limit)(void *, struct thermal_cooling_device *, long unsigned int, long unsigned int, u32);\n\ntypedef void (*btf_trace_thermal_temperature)(void *, struct thermal_zone_device *);\n\ntypedef void (*btf_trace_thermal_zone_trip)(void *, struct thermal_zone_device *, int, enum thermal_trip_type);\n\ntypedef void (*btf_trace_thread_noise)(void *, struct task_struct *, u64, u64);\n\ntypedef void (*btf_trace_threshold_apic_entry)(void *, int);\n\ntypedef void (*btf_trace_threshold_apic_exit)(void *, int);\n\ntypedef void (*btf_trace_tick_stop)(void *, int, int);\n\ntypedef void (*btf_trace_time_out_leases)(void *, struct inode *, struct file_lease *);\n\ntypedef void (*btf_trace_timer_base_idle)(void *, bool, unsigned int);\n\ntypedef void (*btf_trace_timer_cancel)(void *, struct timer_list *);\n\ntypedef void (*btf_trace_timer_expire_entry)(void *, struct timer_list *, long unsigned int);\n\ntypedef void (*btf_trace_timer_expire_exit)(void *, struct timer_list *);\n\ntypedef void (*btf_trace_timer_init)(void *, struct timer_list *);\n\ntypedef void (*btf_trace_timer_start)(void *, struct timer_list *, long unsigned int);\n\ntypedef void (*btf_trace_tlb_flush)(void *, int, long unsigned int);\n\ntypedef void (*btf_trace_tls_alert_recv)(void *, const struct sock *, unsigned char, unsigned char);\n\ntypedef void (*btf_trace_tls_alert_send)(void *, const struct sock *, unsigned char, unsigned char);\n\ntypedef void (*btf_trace_tls_contenttype)(void *, const struct sock *, unsigned char);\n\ntypedef void (*btf_trace_tmigr_connect_child_parent)(void *, struct tmigr_group *);\n\ntypedef void (*btf_trace_tmigr_connect_cpu_parent)(void *, struct tmigr_cpu *);\n\ntypedef void (*btf_trace_tmigr_cpu_active)(void *, struct tmigr_cpu *);\n\ntypedef void (*btf_trace_tmigr_cpu_idle)(void *, struct tmigr_cpu *, u64);\n\ntypedef void (*btf_trace_tmigr_cpu_new_timer)(void *, struct tmigr_cpu *);\n\ntypedef void (*btf_trace_tmigr_cpu_new_timer_idle)(void *, struct tmigr_cpu *, u64);\n\ntypedef void (*btf_trace_tmigr_cpu_offline)(void *, struct tmigr_cpu *);\n\ntypedef void (*btf_trace_tmigr_cpu_online)(void *, struct tmigr_cpu *);\n\ntypedef void (*btf_trace_tmigr_group_set)(void *, struct tmigr_group *);\n\ntypedef void (*btf_trace_tmigr_group_set_cpu_active)(void *, struct tmigr_group *, union tmigr_state, u32);\n\ntypedef void (*btf_trace_tmigr_group_set_cpu_inactive)(void *, struct tmigr_group *, union tmigr_state, u32);\n\ntypedef void (*btf_trace_tmigr_handle_remote)(void *, struct tmigr_group *);\n\ntypedef void (*btf_trace_tmigr_handle_remote_cpu)(void *, struct tmigr_cpu *);\n\ntypedef void (*btf_trace_tmigr_update_events)(void *, struct tmigr_group *, struct tmigr_group *, union tmigr_state, union tmigr_state, u64);\n\ntypedef void (*btf_trace_track_foreign_dirty)(void *, struct folio *, struct bdi_writeback *);\n\ntypedef void (*btf_trace_udp_fail_queue_rcv_skb)(void *, int, struct sock *, struct sk_buff *);\n\ntypedef void (*btf_trace_unmap)(void *, long unsigned int, size_t, size_t);\n\ntypedef void (*btf_trace_user_enter)(void *, int);\n\ntypedef void (*btf_trace_user_exit)(void *, int);\n\ntypedef void (*btf_trace_vector_activate)(void *, unsigned int, bool, bool, bool);\n\ntypedef void (*btf_trace_vector_alloc)(void *, unsigned int, unsigned int, bool, int);\n\ntypedef void (*btf_trace_vector_alloc_managed)(void *, unsigned int, unsigned int, int);\n\ntypedef void (*btf_trace_vector_clear)(void *, unsigned int, unsigned int, unsigned int, unsigned int, unsigned int);\n\ntypedef void (*btf_trace_vector_config)(void *, unsigned int, unsigned int, unsigned int, unsigned int);\n\ntypedef void (*btf_trace_vector_deactivate)(void *, unsigned int, bool, bool, bool);\n\ntypedef void (*btf_trace_vector_free_moved)(void *, unsigned int, unsigned int, unsigned int, bool);\n\ntypedef void (*btf_trace_vector_reserve)(void *, unsigned int, int);\n\ntypedef void (*btf_trace_vector_reserve_managed)(void *, unsigned int, int);\n\ntypedef void (*btf_trace_vector_setup)(void *, unsigned int, bool, int);\n\ntypedef void (*btf_trace_vector_teardown)(void *, unsigned int, bool, bool);\n\ntypedef void (*btf_trace_vector_update)(void *, unsigned int, unsigned int, unsigned int, unsigned int, unsigned int);\n\ntypedef void (*btf_trace_vm_unmapped_area)(void *, long unsigned int, struct vm_unmapped_area_info *);\n\ntypedef void (*btf_trace_vma_mas_szero)(void *, struct maple_tree *, long unsigned int, long unsigned int);\n\ntypedef void (*btf_trace_vma_store)(void *, struct maple_tree *, struct vm_area_struct *);\n\ntypedef void (*btf_trace_wake_reaper)(void *, int);\n\ntypedef void (*btf_trace_wakeup_source_activate)(void *, const char *, unsigned int);\n\ntypedef void (*btf_trace_wakeup_source_deactivate)(void *, const char *, unsigned int);\n\ntypedef void (*btf_trace_watchdog_ping)(void *, struct watchdog_device *, int);\n\ntypedef void (*btf_trace_watchdog_set_timeout)(void *, struct watchdog_device *, unsigned int, int);\n\ntypedef void (*btf_trace_watchdog_start)(void *, struct watchdog_device *, int);\n\ntypedef void (*btf_trace_watchdog_stop)(void *, struct watchdog_device *, int);\n\ntypedef void (*btf_trace_wbc_writepage)(void *, struct writeback_control *, struct backing_dev_info *);\n\ntypedef void (*btf_trace_wbt_lat)(void *, struct backing_dev_info *, long unsigned int);\n\ntypedef void (*btf_trace_wbt_stat)(void *, struct backing_dev_info *, struct blk_rq_stat *);\n\ntypedef void (*btf_trace_wbt_step)(void *, struct backing_dev_info *, const char *, int, long unsigned int, unsigned int, unsigned int, unsigned int);\n\ntypedef void (*btf_trace_wbt_timer)(void *, struct backing_dev_info *, unsigned int, int, unsigned int);\n\ntypedef void (*btf_trace_workqueue_activate_work)(void *, struct work_struct *);\n\ntypedef void (*btf_trace_workqueue_execute_end)(void *, struct work_struct *, work_func_t);\n\ntypedef void (*btf_trace_workqueue_execute_start)(void *, struct work_struct *);\n\ntypedef void (*btf_trace_workqueue_queue_work)(void *, int, struct pool_workqueue *, struct work_struct *);\n\ntypedef void (*btf_trace_write_msr)(void *, unsigned int, u64, int);\n\ntypedef void (*btf_trace_writeback_bdi_register)(void *, struct backing_dev_info *);\n\ntypedef void (*btf_trace_writeback_dirty_folio)(void *, struct folio *, struct address_space *);\n\ntypedef void (*btf_trace_writeback_dirty_inode)(void *, struct inode *, int);\n\ntypedef void (*btf_trace_writeback_dirty_inode_enqueue)(void *, struct inode *);\n\ntypedef void (*btf_trace_writeback_dirty_inode_start)(void *, struct inode *, int);\n\ntypedef void (*btf_trace_writeback_exec)(void *, struct bdi_writeback *, struct wb_writeback_work *);\n\ntypedef void (*btf_trace_writeback_lazytime)(void *, struct inode *);\n\ntypedef void (*btf_trace_writeback_lazytime_iput)(void *, struct inode *);\n\ntypedef void (*btf_trace_writeback_mark_inode_dirty)(void *, struct inode *, int);\n\ntypedef void (*btf_trace_writeback_pages_written)(void *, long int);\n\ntypedef void (*btf_trace_writeback_queue)(void *, struct bdi_writeback *, struct wb_writeback_work *);\n\ntypedef void (*btf_trace_writeback_queue_io)(void *, struct bdi_writeback *, struct wb_writeback_work *, long unsigned int, int);\n\ntypedef void (*btf_trace_writeback_sb_inodes_requeue)(void *, struct inode *);\n\ntypedef void (*btf_trace_writeback_single_inode)(void *, struct inode *, struct writeback_control *, long unsigned int);\n\ntypedef void (*btf_trace_writeback_single_inode_start)(void *, struct inode *, struct writeback_control *, long unsigned int);\n\ntypedef void (*btf_trace_writeback_start)(void *, struct bdi_writeback *, struct wb_writeback_work *);\n\ntypedef void (*btf_trace_writeback_wait)(void *, struct bdi_writeback *, struct wb_writeback_work *);\n\ntypedef void (*btf_trace_writeback_wake_background)(void *, struct bdi_writeback *);\n\ntypedef void (*btf_trace_writeback_write_inode)(void *, struct inode *, struct writeback_control *);\n\ntypedef void (*btf_trace_writeback_write_inode_start)(void *, struct inode *, struct writeback_control *);\n\ntypedef void (*btf_trace_writeback_written)(void *, struct bdi_writeback *, struct wb_writeback_work *);\n\ntypedef void (*btf_trace_x86_fpu_after_restore)(void *, struct fpu *);\n\ntypedef void (*btf_trace_x86_fpu_after_save)(void *, struct fpu *);\n\ntypedef void (*btf_trace_x86_fpu_before_restore)(void *, struct fpu *);\n\ntypedef void (*btf_trace_x86_fpu_before_save)(void *, struct fpu *);\n\ntypedef void (*btf_trace_x86_fpu_copy_dst)(void *, struct fpu *);\n\ntypedef void (*btf_trace_x86_fpu_copy_src)(void *, struct fpu *);\n\ntypedef void (*btf_trace_x86_fpu_dropped)(void *, struct fpu *);\n\ntypedef void (*btf_trace_x86_fpu_init_state)(void *, struct fpu *);\n\ntypedef void (*btf_trace_x86_fpu_regs_activated)(void *, struct fpu *);\n\ntypedef void (*btf_trace_x86_fpu_regs_deactivated)(void *, struct fpu *);\n\ntypedef void (*btf_trace_x86_fpu_xstate_check_failed)(void *, struct fpu *);\n\ntypedef void (*btf_trace_x86_platform_ipi_entry)(void *, int);\n\ntypedef void (*btf_trace_x86_platform_ipi_exit)(void *, int);\n\ntypedef void (*btf_trace_xdp_bulk_tx)(void *, const struct net_device *, int, int, int);\n\ntypedef void (*btf_trace_xdp_cpumap_enqueue)(void *, int, unsigned int, unsigned int, int);\n\ntypedef void (*btf_trace_xdp_cpumap_kthread)(void *, int, unsigned int, unsigned int, int, struct xdp_cpumap_stats *);\n\ntypedef void (*btf_trace_xdp_devmap_xmit)(void *, const struct net_device *, const struct net_device *, int, int, int);\n\ntypedef void (*btf_trace_xdp_exception)(void *, const struct net_device *, const struct bpf_prog *, u32);\n\ntypedef void (*btf_trace_xdp_redirect)(void *, const struct net_device *, const struct bpf_prog *, const void *, int, enum bpf_map_type, u32, u32);\n\ntypedef void (*btf_trace_xdp_redirect_err)(void *, const struct net_device *, const struct bpf_prog *, const void *, int, enum bpf_map_type, u32, u32);\n\ntypedef void (*btf_trace_xdp_redirect_map)(void *, const struct net_device *, const struct bpf_prog *, const void *, int, enum bpf_map_type, u32, u32);\n\ntypedef void (*btf_trace_xdp_redirect_map_err)(void *, const struct net_device *, const struct bpf_prog *, const void *, int, enum bpf_map_type, u32, u32);\n\ntypedef void (*btf_trace_xen_cpu_load_idt)(void *, const struct desc_ptr *);\n\ntypedef void (*btf_trace_xen_cpu_set_ldt)(void *, const void *, unsigned int);\n\ntypedef void (*btf_trace_xen_cpu_write_gdt_entry)(void *, struct desc_struct *, int, const void *, int);\n\ntypedef void (*btf_trace_xen_cpu_write_idt_entry)(void *, gate_desc *, int, const gate_desc *);\n\ntypedef void (*btf_trace_xen_cpu_write_ldt_entry)(void *, struct desc_struct *, int, u64);\n\ntypedef void (*btf_trace_xen_mc_batch)(void *, enum xen_lazy_mode);\n\ntypedef void (*btf_trace_xen_mc_callback)(void *, xen_mc_callback_fn_t, void *);\n\ntypedef void (*btf_trace_xen_mc_entry)(void *, struct multicall_entry *, unsigned int);\n\ntypedef void (*btf_trace_xen_mc_entry_alloc)(void *, size_t);\n\ntypedef void (*btf_trace_xen_mc_extend_args)(void *, long unsigned int, size_t, enum xen_mc_extend_args);\n\ntypedef void (*btf_trace_xen_mc_flush)(void *, unsigned int, unsigned int, unsigned int);\n\ntypedef void (*btf_trace_xen_mc_flush_reason)(void *, enum xen_mc_flush_reason);\n\ntypedef void (*btf_trace_xen_mc_issue)(void *, enum xen_lazy_mode);\n\ntypedef void (*btf_trace_xen_mmu_alloc_ptpage)(void *, struct mm_struct *, long unsigned int, unsigned int, bool);\n\ntypedef void (*btf_trace_xen_mmu_flush_tlb_multi)(void *, const struct cpumask *, struct mm_struct *, long unsigned int, long unsigned int);\n\ntypedef void (*btf_trace_xen_mmu_flush_tlb_one_user)(void *, long unsigned int);\n\ntypedef void (*btf_trace_xen_mmu_pgd_pin)(void *, struct mm_struct *, pgd_t *);\n\ntypedef void (*btf_trace_xen_mmu_pgd_unpin)(void *, struct mm_struct *, pgd_t *);\n\ntypedef void (*btf_trace_xen_mmu_ptep_modify_prot_commit)(void *, struct mm_struct *, long unsigned int, pte_t *, pte_t);\n\ntypedef void (*btf_trace_xen_mmu_ptep_modify_prot_start)(void *, struct mm_struct *, long unsigned int, pte_t *, pte_t);\n\ntypedef void (*btf_trace_xen_mmu_release_ptpage)(void *, long unsigned int, unsigned int, bool);\n\ntypedef void (*btf_trace_xen_mmu_set_p4d)(void *, p4d_t *, p4d_t *, p4d_t);\n\ntypedef void (*btf_trace_xen_mmu_set_pmd)(void *, pmd_t *, pmd_t);\n\ntypedef void (*btf_trace_xen_mmu_set_pte)(void *, pte_t *, pte_t);\n\ntypedef void (*btf_trace_xen_mmu_set_pud)(void *, pud_t *, pud_t);\n\ntypedef void (*btf_trace_xen_mmu_write_cr3)(void *, bool, long unsigned int);\n\ntypedef void (*btf_trace_xhci_add_endpoint)(void *, struct xhci_ep_ctx *);\n\ntypedef void (*btf_trace_xhci_address_ctrl_ctx)(void *, struct xhci_input_control_ctx *);\n\ntypedef void (*btf_trace_xhci_address_ctx)(void *, struct xhci_hcd *, struct xhci_container_ctx *, unsigned int);\n\ntypedef void (*btf_trace_xhci_alloc_dev)(void *, struct xhci_slot_ctx *);\n\ntypedef void (*btf_trace_xhci_alloc_virt_device)(void *, struct xhci_virt_device *);\n\ntypedef void (*btf_trace_xhci_configure_endpoint)(void *, struct xhci_slot_ctx *);\n\ntypedef void (*btf_trace_xhci_configure_endpoint_ctrl_ctx)(void *, struct xhci_input_control_ctx *);\n\ntypedef void (*btf_trace_xhci_dbc_alloc_request)(void *, struct dbc_request *);\n\ntypedef void (*btf_trace_xhci_dbc_free_request)(void *, struct dbc_request *);\n\ntypedef void (*btf_trace_xhci_dbc_gadget_ep_queue)(void *, struct xhci_ring *, struct xhci_generic_trb *);\n\ntypedef void (*btf_trace_xhci_dbc_giveback_request)(void *, struct dbc_request *);\n\ntypedef void (*btf_trace_xhci_dbc_handle_event)(void *, struct xhci_ring *, struct xhci_generic_trb *);\n\ntypedef void (*btf_trace_xhci_dbc_handle_transfer)(void *, struct xhci_ring *, struct xhci_generic_trb *);\n\ntypedef void (*btf_trace_xhci_dbc_queue_request)(void *, struct dbc_request *);\n\ntypedef void (*btf_trace_xhci_dbg_address)(void *, struct va_format *);\n\ntypedef void (*btf_trace_xhci_dbg_cancel_urb)(void *, struct va_format *);\n\ntypedef void (*btf_trace_xhci_dbg_context_change)(void *, struct va_format *);\n\ntypedef void (*btf_trace_xhci_dbg_init)(void *, struct va_format *);\n\ntypedef void (*btf_trace_xhci_dbg_quirks)(void *, struct va_format *);\n\ntypedef void (*btf_trace_xhci_dbg_reset_ep)(void *, struct va_format *);\n\ntypedef void (*btf_trace_xhci_dbg_ring_expansion)(void *, struct va_format *);\n\ntypedef void (*btf_trace_xhci_discover_or_reset_device)(void *, struct xhci_slot_ctx *);\n\ntypedef void (*btf_trace_xhci_free_dev)(void *, struct xhci_slot_ctx *);\n\ntypedef void (*btf_trace_xhci_free_virt_device)(void *, struct xhci_virt_device *);\n\ntypedef void (*btf_trace_xhci_get_port_status)(void *, struct xhci_port *, u32);\n\ntypedef void (*btf_trace_xhci_handle_cmd_addr_dev)(void *, struct xhci_slot_ctx *);\n\ntypedef void (*btf_trace_xhci_handle_cmd_config_ep)(void *, struct xhci_ep_ctx *);\n\ntypedef void (*btf_trace_xhci_handle_cmd_disable_slot)(void *, struct xhci_slot_ctx *);\n\ntypedef void (*btf_trace_xhci_handle_cmd_reset_dev)(void *, struct xhci_slot_ctx *);\n\ntypedef void (*btf_trace_xhci_handle_cmd_reset_ep)(void *, struct xhci_ep_ctx *);\n\ntypedef void (*btf_trace_xhci_handle_cmd_set_deq)(void *, struct xhci_slot_ctx *);\n\ntypedef void (*btf_trace_xhci_handle_cmd_set_deq_ep)(void *, struct xhci_ep_ctx *);\n\ntypedef void (*btf_trace_xhci_handle_cmd_stop_ep)(void *, struct xhci_ep_ctx *);\n\ntypedef void (*btf_trace_xhci_handle_command)(void *, struct xhci_ring *, struct xhci_generic_trb *);\n\ntypedef void (*btf_trace_xhci_handle_event)(void *, struct xhci_ring *, struct xhci_generic_trb *);\n\ntypedef void (*btf_trace_xhci_handle_port_status)(void *, struct xhci_port *, u32);\n\ntypedef void (*btf_trace_xhci_handle_transfer)(void *, struct xhci_ring *, struct xhci_generic_trb *);\n\ntypedef void (*btf_trace_xhci_hub_status_data)(void *, struct xhci_port *, u32);\n\ntypedef void (*btf_trace_xhci_inc_deq)(void *, struct xhci_ring *);\n\ntypedef void (*btf_trace_xhci_inc_enq)(void *, struct xhci_ring *);\n\ntypedef void (*btf_trace_xhci_queue_trb)(void *, struct xhci_ring *, struct xhci_generic_trb *);\n\ntypedef void (*btf_trace_xhci_ring_alloc)(void *, struct xhci_ring *);\n\ntypedef void (*btf_trace_xhci_ring_ep_doorbell)(void *, u32, u32);\n\ntypedef void (*btf_trace_xhci_ring_expansion)(void *, struct xhci_ring *);\n\ntypedef void (*btf_trace_xhci_ring_free)(void *, struct xhci_ring *);\n\ntypedef void (*btf_trace_xhci_ring_host_doorbell)(void *, u32, u32);\n\ntypedef void (*btf_trace_xhci_setup_addressable_virt_device)(void *, struct xhci_virt_device *);\n\ntypedef void (*btf_trace_xhci_setup_device)(void *, struct xhci_virt_device *);\n\ntypedef void (*btf_trace_xhci_setup_device_slot)(void *, struct xhci_slot_ctx *);\n\ntypedef void (*btf_trace_xhci_stop_device)(void *, struct xhci_virt_device *);\n\ntypedef void (*btf_trace_xhci_urb_dequeue)(void *, struct urb *);\n\ntypedef void (*btf_trace_xhci_urb_enqueue)(void *, struct urb *);\n\ntypedef void (*btf_trace_xhci_urb_giveback)(void *, struct urb *);\n\ntypedef int (*cb_t)(struct param *);\n\ntypedef bool (*check_reserved_t)(u64, u64, enum e820_type);\n\ntypedef void cleanup_cb_t(struct rq_wait *, void *);\n\ntypedef int (*cmp_r_func_t)(const void *, const void *, const void *);\n\ntypedef void (*companion_fn)(struct pci_dev *, struct usb_hcd *, struct pci_dev *, struct usb_hcd *);\n\ntypedef int cont_fn(struct opal_dev *);\n\ntypedef int (*cppc_mode_transition_fn)(int);\n\ntypedef void cpu_emergency_virt_cb(void);\n\ntypedef void detailed_cb(const struct detailed_timing *, void *);\n\ntypedef void * (*devcon_match_fn_t)(const struct fwnode_handle *, const char *, void *);\n\ntypedef int devlink_chunk_fill_t(void *, u8 *, u32, u64, struct netlink_ext_ack *);\n\ntypedef int devlink_nl_dump_one_func_t(struct sk_buff *, struct devlink *, struct netlink_callback *, int);\n\ntypedef int (*dr_match_t)(struct device *, void *, void *);\n\ntypedef int drm_ioctl_compat_t(struct file *, unsigned int, long unsigned int);\n\ntypedef bool (*drm_vblank_get_scanout_position_func)(struct drm_crtc *, bool, int *, int *, ktime_t *, ktime_t *, const struct drm_display_mode *);\n\ntypedef int (*dummy_ops_test_ret_fn)(struct bpf_dummy_ops_state *, ...);\n\ntypedef int (*dynevent_check_arg_fn_t)(void *);\n\ntypedef void (*efi_element_handler_t)(const char *, const void *, size_t);\n\ntypedef int (*efi_memattr_perm_setter)(struct mm_struct *, efi_memory_desc_t *, bool);\n\ntypedef void (*ethnl_notify_handler_t)(struct net_device *, unsigned int, const void *);\n\ntypedef void (*exitcall_t)(void);\n\ntypedef int (*ext4_mballoc_query_range_fn)(struct super_block *, ext4_group_t, ext4_grpblk_t, ext4_grpblk_t, void *);\n\ntypedef void ext4_update_sb_callback(struct ext4_super_block *, const void *);\n\ntypedef int filler_t(struct file *, struct folio *);\n\ntypedef bool (*filter_func_t)(struct uprobe_consumer *, enum uprobe_filter_ctx, struct mm_struct *);\n\ntypedef void fn_handler_fn(struct vc_data *);\n\ntypedef void free_folio_t(struct folio *, long unsigned int);\n\ntypedef int (*ftrace_mapper_func)(void *);\n\ntypedef access_mask_t get_access_mask_t(const struct landlock_ruleset * const, const u16);\n\ntypedef int (*get_char_func)(void);\n\ntypedef struct sk_buff * (*gro_receive_sk_t)(struct sock *, struct list_head *, struct sk_buff *);\n\ntypedef struct sk_buff * (*gro_receive_t)(struct list_head *, struct sk_buff *);\n\ntypedef int (*hyperv_fill_flush_list_func)(struct hv_guest_mapping_flush_list *, void *);\n\ntypedef void (*idtentry_t)(struct pt_regs *);\n\ntypedef u32 inet6_ehashfn_t(const struct net *, const struct in6_addr *, const u16, const struct in6_addr *, const __be16);\n\ntypedef u32 inet_ehashfn_t(const struct net *, const __be32, const __u16, const __be32, const __be16);\n\ntypedef int (*initxattrs)(struct inode *, const struct xattr *, void *);\n\ntypedef struct dentry *instantiate_t(struct dentry *, struct task_struct *, const void *);\n\ntypedef int (*ioctl_fn)(struct file *, struct dm_ioctl *, size_t);\n\ntypedef int (*iomap_punch_t)(struct inode *, loff_t, loff_t);\n\ntypedef size_t (*iov_step_f)(void *, size_t, size_t, void *, void *);\n\ntypedef size_t (*iov_ustep_f)(void *, size_t, size_t, void *, void *);\n\ntypedef int (*iova_bitmap_fn_t)(struct iova_bitmap *, long unsigned int, size_t, void *);\n\ntypedef void ip6_icmp_send_t(struct sk_buff *, u8, u8, __u32, const struct in6_addr *, const struct inet6_skb_parm *);\n\ntypedef void (*irq_write_msi_msg_t)(struct msi_desc *, struct msi_msg *);\n\ntypedef void k_handler_fn(struct vc_data *, unsigned char, char);\n\ntypedef int (*klp_shadow_ctor_t)(void *, void *, void *);\n\ntypedef void (*klp_shadow_dtor_t)(void *, void *);\n\ntypedef int (*list_cmp_func_t)(void *, const struct list_head *, const struct list_head *);\n\ntypedef enum lru_status (*list_lru_walk_cb)(struct list_head *, struct list_lru_one *, spinlock_t *, void *);\n\ntypedef int mh_filter_t(struct sock *, struct sk_buff *);\n\ntypedef void (*move_fn_t)(struct lruvec *, struct folio *);\n\ntypedef int (*netlink_filter_fn)(struct sock *, struct sk_buff *, void *);\n\ntypedef struct folio *new_folio_t(struct folio *, long unsigned int);\n\ntypedef void (*nmi_shootdown_cb)(int, struct pt_regs *);\n\ntypedef struct ns_common *ns_get_path_helper_t(void *);\n\ntypedef int (*objpool_init_obj_cb)(void *, void *);\n\ntypedef void (*online_page_callback_t)(struct page *, unsigned int);\n\ntypedef int (*parse_pred_fn)(const char *, void *, int, struct filter_parse_error *, struct filter_pred **);\n\ntypedef int (*parse_unknown_fn)(char *, char *, const char *, void *);\n\ntypedef void (*pci_parity_check_fn_t)(struct pci_dev *);\n\ntypedef int (*pcie_callback_t)(struct pcie_device *);\n\ntypedef int pcpu_fc_cpu_distance_fn_t(unsigned int, unsigned int);\n\ntypedef int pcpu_fc_cpu_to_node_fn_t(int);\n\ntypedef void perf_iterate_f(struct perf_event *, void *);\n\ntypedef int perf_snapshot_branch_stack_t(struct perf_branch_entry *, unsigned int);\n\ntypedef int (*pm_callback_t)(struct device *);\n\ntypedef int (*pm_cpu_match_t)(const struct x86_cpu_id *);\n\ntypedef struct rt6_info * (*pol_lookup_t)(struct net *, struct fib6_table *, struct flowi6 *, const struct sk_buff *, int);\n\ntypedef int (*pp_nl_fill_cb)(struct sk_buff *, const struct page_pool *, const struct genl_info *);\n\ntypedef int (*proc_visitor)(struct task_struct *, void *);\n\ntypedef int (*pte_fn_t)(pte_t *, long unsigned int, void *);\n\ntypedef int read_block_fn(void *, u8 *, unsigned int, size_t);\n\ntypedef void (*rethook_handler_t)(struct rethook_node *, void *, long unsigned int, struct pt_regs *);\n\ntypedef bool (*ring_buffer_cond_fn)(void *);\n\ntypedef int (*rproc_handle_resource_t)(struct rproc *, void *, int, int);\n\ntypedef irqreturn_t (*rtc_irq_handler)(int, void *);\n\ntypedef bool (*sb_for_each_fn)(struct sbitmap *, unsigned int, void *);\n\ntypedef int (*sendmsg_func)(struct sock *, struct msghdr *);\n\ntypedef void (*serial8250_isa_config_fn)(int, struct uart_port *, u32 *);\n\ntypedef int (*set_callee_state_fn)(struct bpf_verifier_env *, struct bpf_func_state *, struct bpf_func_state *, int);\n\ntypedef void (*set_debug_port_t)(int);\n\ntypedef void (*set_params_cb)(struct dwc2_hsotg *);\n\ntypedef struct scatterlist *sg_alloc_fn(unsigned int, gfp_t);\n\ntypedef void sg_free_fn(struct scatterlist *, unsigned int);\n\ntypedef void sha1_block_fn(struct sha1_state *, const u8 *, int);\n\ntypedef void sha256_block_fn(struct sha256_state *, const u8 *, int);\n\ntypedef void sha512_block_fn(struct sha512_state *, const u8 *, int);\n\ntypedef bool (*smp_cond_func_t)(int, void *);\n\ntypedef int splice_actor(struct pipe_inode_info *, struct pipe_buffer *, struct splice_desc *);\n\ntypedef int splice_direct_actor(struct pipe_inode_info *, struct splice_desc *);\n\ntypedef bool (*stack_trace_consume_fn)(void *, long unsigned int);\n\ntypedef void (*swap_r_func_t)(void *, void *, int, const void *);\n\ntypedef void (*synth_probe_func_t)(void *, u64 *, unsigned int *);\n\ntypedef long int (*sys_call_ptr_t)(const struct pt_regs *);\n\ntypedef int (*task_call_f)(struct task_struct *, void *);\n\ntypedef void (*task_work_func_t)(struct callback_head *);\n\ntypedef void text_poke_f(void *, const void *, size_t);\n\ntypedef int (*tg_visitor)(struct task_group *, void *);\n\ntypedef struct sock * (*udp_lookup_t)(const struct sk_buff *, __be16, __be16);\n\ntypedef bool (*up_f)(struct tmigr_group *, struct tmigr_group *, struct tmigr_walk *);\n\ntypedef void (*user_event_func_t)(struct user_event *, struct iov_iter *, void *, bool *);\n\ntypedef void (*visitor128_t)(void *, long unsigned int, u64, u64, size_t);\n\ntypedef void (*visitor32_t)(void *, long unsigned int, u32, size_t);\n\ntypedef void (*visitor64_t)(void *, long unsigned int, u64, size_t);\n\ntypedef void (*visitorl_t)(void *, long unsigned int, long unsigned int, size_t);\n\ntypedef int wait_bit_action_f(struct wait_bit_key *, int);\n\ntypedef int (*walk_hmem_fn)(struct device *, int, const struct resource *);\n\ntypedef int (*walk_memory_groups_func_t)(struct memory_group *, void *);\n\ntypedef int (*wext_ioctl_func)(struct net_device *, struct iwreq *, unsigned int, struct iw_request_info *, iw_handler);\n\ntypedef int (*writepage_t)(struct folio *, struct writeback_control *, void *);\n\ntypedef void (*xen_gfn_fn_t)(long unsigned int, void *);\n\ntypedef void (*xen_grant_fn_t)(long unsigned int, unsigned int, unsigned int, void *);\n\ntypedef void (*xhci_get_quirks_t)(struct device *, struct xhci_hcd *);\n\nstruct nf_bridge_frag_data;\n\nstruct kunit;\n\nstruct bpf_iter;\n\nstruct cma;\n\nstruct creds;\n\nstruct pctldev;\n\n\n/* BPF kfuncs */\n#ifndef BPF_NO_KFUNC_PROTOTYPES\n#endif\n\n#ifndef BPF_NO_PRESERVE_ACCESS_INDEX\n#pragma clang attribute pop\n#endif\n\n#endif /* __VMLINUX_H__ */\n"
  },
  {
    "path": "nhp/etcd/etcdconn.go",
    "content": "package etcd\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"time\"\n\n\tclientv3 \"go.etcd.io/etcd/client/v3\"\n\n\t\"github.com/OpenNHP/opennhp/nhp/log\"\n)\n\ntype EtcdConfig struct {\n\tKey       string\n\tEndpoints []string\n\tUsername  string\n\tPassword  string\n}\n\ntype EtcdConn struct {\n\tEndpoints []string\n\tUsername  string\n\tPassword  string\n\tKey       string\n\tclient    *clientv3.Client\n\tctx       context.Context\n\twatcher   clientv3.Watcher\n\tsignals   struct {\n\t\tstop chan struct{}\n\t}\n}\n\nfunc (conn *EtcdConn) InitClient() error {\n\tvar err error\n\tconn.client, err = clientv3.New(clientv3.Config{\n\t\tEndpoints:   conn.Endpoints,\n\t\tDialTimeout: 5 * time.Second,\n\t\tUsername:    conn.Username,\n\t\tPassword:    conn.Password,\n\t})\n\n\tconn.Key = \"/\" + conn.Key\n\tif err != nil {\n\t\treturn err\n\t}\n\tctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)\n\tdefer cancel()\n\tconn.ctx = ctx\n\t_, err = conn.client.Status(conn.ctx, conn.Endpoints[0])\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (conn *EtcdConn) GetValue() ([]byte, error) {\n\tval, err := conn.client.Get(conn.ctx, conn.Key)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tif len(val.Kvs) == 0 {\n\t\treturn nil, errors.New(\"key not found\")\n\t}\n\tif len(val.Kvs[0].Value) == 0 {\n\t\treturn nil, errors.New(\"value not set\")\n\t}\n\treturn val.Kvs[0].Value, nil\n}\n\nfunc (conn *EtcdConn) SetValue(v string) error {\n\t_, err := conn.client.Put(conn.ctx, conn.Key, v)\n\treturn err\n}\n\nfunc (conn *EtcdConn) WatchValue(callbackFunc func(val []byte)) {\n\t// create etcd watcher\n\tconn.watcher = clientv3.NewWatcher(conn.client)\n\n\twatchChan := conn.watcher.Watch(context.Background(), conn.Key)\n\n\tfor {\n\t\tselect {\n\t\tcase resp := <-watchChan:\n\t\t\t// handle change events\n\t\t\tfor _, ev := range resp.Events {\n\t\t\t\tswitch ev.Type {\n\t\t\t\tcase clientv3.EventTypePut:\n\t\t\t\t\tcallbackFunc(ev.Kv.Value)\n\t\t\t\tcase clientv3.EventTypeDelete:\n\t\t\t\t\tlog.Debug(\"[DELETE] Key: %s\\n\", string(ev.Kv.Key))\n\t\t\t\t}\n\t\t\t}\n\t\tcase <-conn.signals.stop:\n\t\t\tconn.watcher.Close()\n\t\t\treturn\n\t\t}\n\t}\n\n}\n\nfunc (conn *EtcdConn) Close() {\n\tif conn.client != nil {\n\t\t// stop the etcd watcher\n\t\tclose(conn.signals.stop)\n\t\tconn.client.Close()\n\t}\n}\n"
  },
  {
    "path": "nhp/go.mod",
    "content": "module github.com/OpenNHP/opennhp/nhp\n\ngo 1.25.6\n\nrequire (\n\tgithub.com/cilium/ebpf v0.21.0\n\tgithub.com/coocood/freecache v1.2.5\n\tgithub.com/emmansun/gmsm v0.41.1\n\tgithub.com/fsnotify/fsnotify v1.9.0\n\tgithub.com/gin-gonic/gin v1.12.0\n\tgithub.com/google/uuid v1.6.0\n\tgithub.com/tetratelabs/wazero v1.11.0\n\tgo.etcd.io/etcd/client/v3 v3.6.8\n\tgolang.org/x/crypto v0.48.0\n\tgolang.org/x/sys v0.42.0\n)\n\nrequire (\n\tgithub.com/bytedance/gopkg v0.1.3 // indirect\n\tgithub.com/bytedance/sonic v1.15.0 // indirect\n\tgithub.com/bytedance/sonic/loader v0.5.0 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.3.0 // indirect\n\tgithub.com/cloudwego/base64x v0.1.6 // indirect\n\tgithub.com/coreos/go-semver v0.3.1 // indirect\n\tgithub.com/coreos/go-systemd/v22 v22.6.0 // indirect\n\tgithub.com/gabriel-vasile/mimetype v1.4.12 // indirect\n\tgithub.com/gin-contrib/sse v1.1.0 // indirect\n\tgithub.com/go-playground/locales v0.14.1 // indirect\n\tgithub.com/go-playground/universal-translator v0.18.1 // indirect\n\tgithub.com/go-playground/validator/v10 v10.30.1 // indirect\n\tgithub.com/goccy/go-json v0.10.5 // indirect\n\tgithub.com/goccy/go-yaml v1.19.2 // indirect\n\tgithub.com/gogo/protobuf v1.3.2 // indirect\n\tgithub.com/golang/protobuf v1.5.4 // indirect\n\tgithub.com/grpc-ecosystem/grpc-gateway/v2 v2.27.4 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.3.0 // indirect\n\tgithub.com/leodido/go-urn v1.4.0 // indirect\n\tgithub.com/mattn/go-isatty v0.0.20 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/pelletier/go-toml/v2 v2.2.4 // indirect\n\tgithub.com/quic-go/qpack v0.6.0 // indirect\n\tgithub.com/quic-go/quic-go v0.59.0 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgithub.com/ugorji/go/codec v1.3.1 // indirect\n\tgo.etcd.io/etcd/api/v3 v3.6.8 // indirect\n\tgo.etcd.io/etcd/client/pkg/v3 v3.6.8 // indirect\n\tgo.mongodb.org/mongo-driver/v2 v2.5.0 // indirect\n\tgo.uber.org/multierr v1.11.0 // indirect\n\tgo.uber.org/zap v1.27.1 // indirect\n\tgolang.org/x/arch v0.23.0 // indirect\n\tgolang.org/x/net v0.51.0 // indirect\n\tgolang.org/x/text v0.34.0 // indirect\n\tgoogle.golang.org/genproto/googleapis/api v0.0.0-20251222181119-0a764e51fe1b // indirect\n\tgoogle.golang.org/genproto/googleapis/rpc v0.0.0-20251222181119-0a764e51fe1b // indirect\n\tgoogle.golang.org/grpc v1.78.0 // indirect\n\tgoogle.golang.org/protobuf v1.36.11 // indirect\n)\n"
  },
  {
    "path": "nhp/go.sum",
    "content": "github.com/bytedance/gopkg v0.1.3 h1:TPBSwH8RsouGCBcMBktLt1AymVo2TVsBVCY4b6TnZ/M=\ngithub.com/bytedance/gopkg v0.1.3/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=\ngithub.com/bytedance/sonic v1.15.0 h1:/PXeWFaR5ElNcVE84U0dOHjiMHQOwNIx3K4ymzh/uSE=\ngithub.com/bytedance/sonic v1.15.0/go.mod h1:tFkWrPz0/CUCLEF4ri4UkHekCIcdnkqXw9VduqpJh0k=\ngithub.com/bytedance/sonic/loader v0.5.0 h1:gXH3KVnatgY7loH5/TkeVyXPfESoqSBSBEiDd5VjlgE=\ngithub.com/bytedance/sonic/loader v0.5.0/go.mod h1:AR4NYCk5DdzZizZ5djGqQ92eEhCCcdf5x77udYiSJRo=\ngithub.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=\ngithub.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=\ngithub.com/cilium/ebpf v0.21.0 h1:4dpx1J/B/1apeTmWBH5BkVLayHTkFrMovVPnHEk+l3k=\ngithub.com/cilium/ebpf v0.21.0/go.mod h1:1kHKv6Kvh5a6TePP5vvvoMa1bclRyzUXELSs272fmIQ=\ngithub.com/cloudwego/base64x v0.1.6 h1:t11wG9AECkCDk5fMSoxmufanudBtJ+/HemLstXDLI2M=\ngithub.com/cloudwego/base64x v0.1.6/go.mod h1:OFcloc187FXDaYHvrNIjxSe8ncn0OOM8gEHfghB2IPU=\ngithub.com/coocood/freecache v1.2.5 h1:FmhRQ8cLLVq9zWhHVYODUEZ0xu6rTPrVeAnX1AEIf7I=\ngithub.com/coocood/freecache v1.2.5/go.mod h1:RBUWa/Cy+OHdfTGFEhEuE1pMCMX51Ncizj7rthiQ3vk=\ngithub.com/coreos/go-semver v0.3.1 h1:yi21YpKnrx1gt5R+la8n5WgS0kCrsPp33dmEyHReZr4=\ngithub.com/coreos/go-semver v0.3.1/go.mod h1:irMmmIw/7yzSRPWryHsK7EYSg09caPQL03VsM8rvUec=\ngithub.com/coreos/go-systemd/v22 v22.6.0 h1:aGVa/v8B7hpb0TKl0MWoAavPDmHvobFe5R5zn0bCJWo=\ngithub.com/coreos/go-systemd/v22 v22.6.0/go.mod h1:iG+pp635Fo7ZmV/j14KUcmEyWF+0X7Lua8rrTWzYgWU=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=\ngithub.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/emmansun/gmsm v0.41.1 h1:mD1MqmaXTEqt+9UVmDpRYvcEMIa5vuslFEnw7IWp6/w=\ngithub.com/emmansun/gmsm v0.41.1/go.mod h1:FD1EQk4XcSMkahZFzNwFoI/uXzAlODB9JVsJ9G5N7Do=\ngithub.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k=\ngithub.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0=\ngithub.com/gabriel-vasile/mimetype v1.4.12 h1:e9hWvmLYvtp846tLHam2o++qitpguFiYCKbn0w9jyqw=\ngithub.com/gabriel-vasile/mimetype v1.4.12/go.mod h1:d+9Oxyo1wTzWdyVUPMmXFvp4F9tea18J8ufA774AB3s=\ngithub.com/gin-contrib/sse v1.1.0 h1:n0w2GMuUpWDVp7qSpvze6fAu9iRxJY4Hmj6AmBOU05w=\ngithub.com/gin-contrib/sse v1.1.0/go.mod h1:hxRZ5gVpWMT7Z0B0gSNYqqsSCNIJMjzvm6fqCz9vjwM=\ngithub.com/gin-gonic/gin v1.12.0 h1:b3YAbrZtnf8N//yjKeU2+MQsh2mY5htkZidOM7O0wG8=\ngithub.com/gin-gonic/gin v1.12.0/go.mod h1:VxccKfsSllpKshkBWgVgRniFFAzFb9csfngsqANjnLc=\ngithub.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=\ngithub.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=\ngithub.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=\ngithub.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=\ngithub.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=\ngithub.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=\ngithub.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA=\ngithub.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=\ngithub.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=\ngithub.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=\ngithub.com/go-playground/validator/v10 v10.30.1 h1:f3zDSN/zOma+w6+1Wswgd9fLkdwy06ntQJp0BBvFG0w=\ngithub.com/go-playground/validator/v10 v10.30.1/go.mod h1:oSuBIQzuJxL//3MelwSLD5hc2Tu889bF0Idm9Dg26cM=\ngithub.com/go-quicktest/qt v1.101.1-0.20240301121107-c6c8733fa1e6 h1:teYtXy9B7y5lHTp8V9KPxpYRAVA7dozigQcMiBust1s=\ngithub.com/go-quicktest/qt v1.101.1-0.20240301121107-c6c8733fa1e6/go.mod h1:p4lGIVX+8Wa6ZPNDvqcxq36XpUDLh42FLetFU7odllI=\ngithub.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4=\ngithub.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M=\ngithub.com/goccy/go-yaml v1.19.2 h1:PmFC1S6h8ljIz6gMRBopkjP1TVT7xuwrButHID66PoM=\ngithub.com/goccy/go-yaml v1.19.2/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA=\ngithub.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=\ngithub.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=\ngithub.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=\ngithub.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=\ngithub.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=\ngithub.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=\ngithub.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.27.4 h1:kEISI/Gx67NzH3nJxAmY/dGac80kKZgZt134u7Y/k1s=\ngithub.com/grpc-ecosystem/grpc-gateway/v2 v2.27.4/go.mod h1:6Nz966r3vQYCqIzWsuEl9d7cf7mRhtDmm++sOxlnfxI=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzhA9Y=\ngithub.com/klauspost/cpuid/v2 v2.3.0/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0=\ngithub.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=\ngithub.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ=\ngithub.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI=\ngithub.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=\ngithub.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4=\ngithub.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=\ngithub.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/quic-go/qpack v0.6.0 h1:g7W+BMYynC1LbYLSqRt8PBg5Tgwxn214ZZR34VIOjz8=\ngithub.com/quic-go/qpack v0.6.0/go.mod h1:lUpLKChi8njB4ty2bFLX2x4gzDqXwUpaO1DP9qMDZII=\ngithub.com/quic-go/quic-go v0.59.0 h1:OLJkp1Mlm/aS7dpKgTc6cnpynnD2Xg7C1pwL6vy/SAw=\ngithub.com/quic-go/quic-go v0.59.0/go.mod h1:upnsH4Ju1YkqpLXC305eW3yDZ4NfnNbmQRCMWS58IKU=\ngithub.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ=\ngithub.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=\ngithub.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=\ngithub.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=\ngithub.com/tetratelabs/wazero v1.11.0 h1:+gKemEuKCTevU4d7ZTzlsvgd1uaToIDtlQlmNbwqYhA=\ngithub.com/tetratelabs/wazero v1.11.0/go.mod h1:eV28rsN8Q+xwjogd7f4/Pp4xFxO7uOGbLcD/LzB1wiU=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/ugorji/go/codec v1.3.1 h1:waO7eEiFDwidsBN6agj1vJQ4AG7lh2yqXyOXqhgQuyY=\ngithub.com/ugorji/go/codec v1.3.1/go.mod h1:pRBVtBSKl77K30Bv8R2P+cLSGaTtex6fsA2Wjqmfxj4=\ngithub.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngithub.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=\ngo.etcd.io/etcd/api/v3 v3.6.8 h1:gqb1VN92TAI6G2FiBvWcqKtHiIjr4SU2GdXxTwyexbM=\ngo.etcd.io/etcd/api/v3 v3.6.8/go.mod h1:qyQj1HZPUV3B5cbAL8scG62+fyz5dSxxu0w8pn28N6Q=\ngo.etcd.io/etcd/client/pkg/v3 v3.6.8 h1:Qs/5C0LNFiqXxYf2GU8MVjYUEXJ6sZaYOz0zEqQgy50=\ngo.etcd.io/etcd/client/pkg/v3 v3.6.8/go.mod h1:GsiTRUZE2318PggZkAo6sWb6l8JLVrnckTNfbG8PWtw=\ngo.etcd.io/etcd/client/v3 v3.6.8 h1:B3G76t1UykqAOrbio7s/EPatixQDkQBevN8/mwiplrY=\ngo.etcd.io/etcd/client/v3 v3.6.8/go.mod h1:MVG4BpSIuumPi+ELF7wYtySETmoTWBHVcDoHdVupwt8=\ngo.mongodb.org/mongo-driver/v2 v2.5.0 h1:yXUhImUjjAInNcpTcAlPHiT7bIXhshCTL3jVBkF3xaE=\ngo.mongodb.org/mongo-driver/v2 v2.5.0/go.mod h1:yOI9kBsufol30iFsl1slpdq1I0eHPzybRWdyYUs8K/0=\ngo.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64=\ngo.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y=\ngo.opentelemetry.io/otel v1.38.0 h1:RkfdswUDRimDg0m2Az18RKOsnI8UDzppJAtj01/Ymk8=\ngo.opentelemetry.io/otel v1.38.0/go.mod h1:zcmtmQ1+YmQM9wrNsTGV/q/uyusom3P8RxwExxkZhjM=\ngo.opentelemetry.io/otel/metric v1.38.0 h1:Kl6lzIYGAh5M159u9NgiRkmoMKjvbsKtYRwgfrA6WpA=\ngo.opentelemetry.io/otel/metric v1.38.0/go.mod h1:kB5n/QoRM8YwmUahxvI3bO34eVtQf2i4utNVLr9gEmI=\ngo.opentelemetry.io/otel/sdk v1.38.0 h1:l48sr5YbNf2hpCUj/FoGhW9yDkl+Ma+LrVl8qaM5b+E=\ngo.opentelemetry.io/otel/sdk v1.38.0/go.mod h1:ghmNdGlVemJI3+ZB5iDEuk4bWA3GkTpW+DOoZMYBVVg=\ngo.opentelemetry.io/otel/sdk/metric v1.38.0 h1:aSH66iL0aZqo//xXzQLYozmWrXxyFkBJ6qT5wthqPoM=\ngo.opentelemetry.io/otel/sdk/metric v1.38.0/go.mod h1:dg9PBnW9XdQ1Hd6ZnRz689CbtrUp0wMMs9iPcgT9EZA=\ngo.opentelemetry.io/otel/trace v1.38.0 h1:Fxk5bKrDZJUH+AMyyIXGcFAPah0oRcT+LuNtJrmcNLE=\ngo.opentelemetry.io/otel/trace v1.38.0/go.mod h1:j1P9ivuFsTceSWe1oY+EeW3sc+Pp42sO++GHkg4wwhs=\ngo.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=\ngo.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=\ngo.uber.org/mock v0.6.0 h1:hyF9dfmbgIX5EfOdasqLsWD6xqpNZlXblLB/Dbnwv3Y=\ngo.uber.org/mock v0.6.0/go.mod h1:KiVJ4BqZJaMj4svdfmHM0AUx4NJYO8ZNpPnZn1Z+BBU=\ngo.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=\ngo.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=\ngo.uber.org/zap v1.27.1 h1:08RqriUEv8+ArZRYSTXy1LeBScaMpVSTBhCeaZYfMYc=\ngo.uber.org/zap v1.27.1/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=\ngolang.org/x/arch v0.23.0 h1:lKF64A2jF6Zd8L0knGltUnegD62JMFBiCPBmQpToHhg=\ngolang.org/x/arch v0.23.0/go.mod h1:dNHoOeKiyja7GTvF9NJS1l3Z2yntpQNzgrjh1cU103A=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.48.0 h1:/VRzVqiRSggnhY7gNRxPauEQ5Drw9haKdM0jqfcCFts=\ngolang.org/x/crypto v0.48.0/go.mod h1:r0kV5h3qnFPlQnBSrULhlsRfryS2pmewsg+XfMgkVos=\ngolang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=\ngolang.org/x/net v0.51.0 h1:94R/GTO7mt3/4wIKpcR5gkGmRLOuE/2hNGeWq/GBIFo=\ngolang.org/x/net v0.51.0/go.mod h1:aamm+2QF5ogm02fjy5Bb7CQ0WMt1/WVM7FtyaTLlA9Y=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4=\ngolang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.42.0 h1:omrd2nAlyT5ESRdCLYdm3+fMfNFE/+Rf4bDIQImRJeo=\ngolang.org/x/sys v0.42.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.34.0 h1:oL/Qq0Kdaqxa1KbNeMKwQq0reLCCaFtqu2eNuSeNHbk=\ngolang.org/x/text v0.34.0/go.mod h1:homfLqTYRFyVYemLBFl5GgL/DWEiH5wcsQ5gSh1yziA=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=\ngolang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk=\ngonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20251222181119-0a764e51fe1b h1:uA40e2M6fYRBf0+8uN5mLlqUtV192iiksiICIBkYJ1E=\ngoogle.golang.org/genproto/googleapis/api v0.0.0-20251222181119-0a764e51fe1b/go.mod h1:Xa7le7qx2vmqB/SzWUBa7KdMjpdpAHlh5QCSnjessQk=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20251222181119-0a764e51fe1b h1:Mv8VFug0MP9e5vUxfBcE3vUkV6CImK3cMNMIDFjmzxU=\ngoogle.golang.org/genproto/googleapis/rpc v0.0.0-20251222181119-0a764e51fe1b/go.mod h1:j9x/tPzZkyxcgEFkiKEEGxfvyumM01BEtsW8xzOahRQ=\ngoogle.golang.org/grpc v1.78.0 h1:K1XZG/yGDJnzMdd/uZHAkVqJE+xIDOcmdSFZkBUicNc=\ngoogle.golang.org/grpc v1.78.0/go.mod h1:I47qjTo4OKbMkjA/aOOwxDIiPSBofUtQUI5EfpWvW7U=\ngoogle.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE=\ngoogle.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\n"
  },
  {
    "path": "nhp/log/globalLog.go",
    "content": "package log\n\nvar glbLogger *Logger\n\nfunc init() {\n\tl := NewLogger(\"\", 3, \"\", \"\")\n\tSetGlobalLogger(l)\n}\n\nfunc SetGlobalLogger(l *Logger) {\n\tif glbLogger != nil {\n\t\tglbLogger.Close()\n\t}\n\tglbLogger = l\n\tglbLogger.callDepth += 1\n}\n\n// must be called after SetGlobalLogger()\nfunc Warning(format string, args ...any) {\n\tglbLogger.Warning(format, args...)\n}\n\nfunc Error(format string, args ...any) {\n\tglbLogger.Error(format, args...)\n}\n\nfunc Critical(format string, args ...any) {\n\tglbLogger.Critical(format, args...)\n}\n\nfunc Evaluate(format string, args ...any) {\n\tglbLogger.Evaluate(format, args...)\n}\n\nfunc Info(format string, args ...any) {\n\tglbLogger.Info(format, args...)\n}\n\nfunc Stats(format string, args ...any) {\n\tglbLogger.Stats(format, args...)\n}\n\nfunc Audit(format string, args ...any) {\n\tglbLogger.Audit(format, args...)\n}\n\nfunc Transaction(format string, args ...any) {\n\tglbLogger.Transaction(format, args...)\n}\n\nfunc Debug(format string, args ...any) {\n\tglbLogger.Debug(format, args...)\n}\n\nfunc Trace(format string, args ...any) {\n\tglbLogger.Trace(format, args...)\n}\n\nfunc Verbose(format string, args ...any) {\n\tglbLogger.Verbose(format, args...)\n}\n\nfunc Close() {\n\tif glbLogger != nil {\n\t\tglbLogger.Close()\n\t}\n}\n"
  },
  {
    "path": "nhp/log/logger.go",
    "content": "package log\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"log\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"sync\"\n\t\"time\"\n)\n\nconst (\n\tLogQueueSize       = 1024\n\tShowCallerFileLine = true\n)\n\n// Log levels for use with NewLogger.\nconst (\n\tLogLevelSilent = iota\n\tLogLevelError\n\tLogLevelInfo\n\tLogLevelAudit\n\tLogLevelDebug\n\tLogLevelTrace\n)\n\ntype AsyncLogWriter struct {\n\tsync.Mutex\n\twg sync.WaitGroup\n\n\tDirPath  string\n\tName     string\n\tcurrDate string\n\n\tdateUpdatedCh chan string\n\tmsg           chan []byte\n}\n\nfunc (lw *AsyncLogWriter) Start() {\n\tlw.currDate = time.Now().Format(\"2006-01-02\")\n\n\tif lw.msg == nil {\n\t\tif len(lw.DirPath) > 0 {\n\t\t\terr := os.MkdirAll(lw.DirPath, os.ModePerm)\n\t\t\tif err != nil {\n\t\t\t\tfmt.Printf(\"Warning: AsyncLogWriter cannot create directory %s (%v). Using current working directory instead.\\n\", lw.DirPath, err)\n\t\t\t\tlw.DirPath = \"\"\n\t\t\t}\n\t\t}\n\n\t\tlw.msg = make(chan []byte, LogQueueSize)\n\t\tlw.wg.Add(1)\n\t\tgo lw.writeRoutine()\n\t}\n}\n\n// async writer\n// must be initiated first, implements atomic write\nfunc (lw *AsyncLogWriter) Write(buf []byte) (n int, err error) {\n\tlw.Lock()\n\tdefer lw.Unlock()\n\n\tlen := len(buf)\n\tmsg := make([]byte, len)\n\tcopy(msg, buf)\n\tlw.msg <- msg\n\n\treturn len, nil\n}\n\nfunc (lw *AsyncLogWriter) writeRoutine() {\n\tdefer lw.wg.Done()\n\n\tuseStdout := len(lw.DirPath) == 0 && len(lw.Name) == 0\n\n\tfor {\n\t\tvar quit bool\n\t\tvar err error\n\t\tmsgArr := make([][]byte, 0, LogQueueSize)\n\n\t\tselect {\n\t\t// block to wait for incoming log messages\n\t\tcase msg := <-lw.msg:\n\t\t\tif msg == nil {\n\t\t\t\tquit = true\n\t\t\t} else {\n\t\t\t\tmsgArr = append(msgArr, msg)\n\t\t\t}\n\t\t\t// collect all remaining messages if there are any\n\t\tcollectRest:\n\t\t\tfor {\n\t\t\t\tselect {\n\t\t\t\tcase msg = <-lw.msg:\n\t\t\t\t\tif msg == nil {\n\t\t\t\t\t\tquit = true\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmsgArr = append(msgArr, msg)\n\t\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\tbreak collectRest\n\t\t\t\t}\n\t\t\t}\n\n\t\tcase <-time.After(100 * time.Millisecond):\n\t\t}\n\n\t\t// check date update\n\t\tdate := time.Now().Format(\"2006-01-02\")\n\n\t\t// check if date has been updated\n\t\tif lw.dateUpdatedCh != nil && date != lw.currDate {\n\t\t\t// non-blocking update with the old date\n\t\t\tif len(lw.dateUpdatedCh) > 0 {\n\t\t\t\t<-lw.dateUpdatedCh\n\t\t\t}\n\t\t\tlw.dateUpdatedCh <- lw.currDate\n\t\t\tlw.currDate = date\n\t\t}\n\n\t\t// write messages to file\n\t\tif len(msgArr) > 0 {\n\t\t\tvar file *os.File\n\t\t\tif useStdout {\n\t\t\t\tfile = os.Stdout\n\t\t\t} else {\n\t\t\t\tfilename := fmt.Sprintf(\"%s-%s.log\", lw.Name, date)\n\t\t\t\tif len(lw.DirPath) > 0 {\n\t\t\t\t\tfilename = filepath.Join(lw.DirPath, filename)\n\t\t\t\t}\n\t\t\t\tfile, err = os.OpenFile(filename, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0600)\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"Error: AsyncLogWriter cannot open file %s (%v)\\n\", filename, err)\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// O_CREATE: create file if it does not exist\n\t\t\t// O_APPEND: open at the end of file\n\t\t\t// O_SYNC: sync data right into disk at write. Don't use this flag to reduce file i/o\n\t\t\t//file, err := os.OpenFile(filename, os.O_WRONLY|os.O_APPEND|os.O_CREATE|os.O_SYNC, 0644)\n\t\t\tfor _, m := range msgArr {\n\t\t\t\t_, err := file.Write(m)\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Printf(\"Error: AsyncLogWriter failed to write file %s (%v)\\n\", file.Name(), err)\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// close after all writes\n\t\t\tif !useStdout {\n\t\t\t\tif err := file.Sync(); err != nil {\n\t\t\t\t\tfmt.Printf(\"Error: AsyncLogWriter failed to sync file %s (%v)\\n\", file.Name(), err)\n\t\t\t\t}\n\t\t\t\tif err := file.Close(); err != nil {\n\t\t\t\t\tfmt.Printf(\"Error: AsyncLogWriter failed to close file %s (%v)\\n\", file.Name(), err)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif quit {\n\t\t\treturn\n\t\t}\n\t}\n}\n\nfunc (lw *AsyncLogWriter) Close() {\n\tlw.Lock()\n\tdefer lw.Unlock()\n\n\tif lw.msg != nil {\n\t\tlw.msg <- nil\n\t\tlw.wg.Wait()\n\t\tclose(lw.msg)\n\t\tlw.msg = nil\n\t}\n\tif lw.dateUpdatedCh != nil {\n\t\tclose(lw.dateUpdatedCh)\n\t\tlw.dateUpdatedCh = nil\n\t}\n\n}\n\n// A logger that implements async logging by default (logging without impact on real business logic).\n// It also provides customizable logging functions.\n// At default implementation, it is recommended to call Close() at program termination.\ntype Logger struct {\n\tsync.Mutex\n\tlw         *AsyncLogWriter\n\tlwEvaluate *AsyncLogWriter\n\tlwAudit    *AsyncLogWriter\n\tlgWrn      *log.Logger\n\tlgErr      *log.Logger\n\tlgCrt      *log.Logger\n\tlgEva      *log.Logger\n\tlgInf      *log.Logger\n\tlgSts      *log.Logger\n\tlgAdt      *log.Logger\n\tlgTrx      *log.Logger\n\tlgDbg      *log.Logger\n\tlgTrc      *log.Logger\n\tlgVbs      *log.Logger\n\n\tWarning     func(format string, args ...any)\n\tError       func(format string, args ...any)\n\tCritical    func(format string, args ...any)\n\tEvaluate    func(format string, args ...any)\n\tInfo        func(format string, args ...any)\n\tStats       func(format string, args ...any)\n\tAudit       func(format string, args ...any)\n\tTransaction func(format string, args ...any)\n\tDebug       func(format string, args ...any)\n\tTrace       func(format string, args ...any)\n\tVerbose     func(format string, args ...any)\n\n\tlogLevel    int\n\tcallDepth   int // call depth to be adjusted by how it is called\n\tisSubLogger bool\n\tisRunning   bool\n\n\tsubLoggers []*Logger\n}\n\n// Function for use in Logger for discarding logged lines.\nfunc BlackholeLogf(format string, args ...any) {}\n\n// NewLogger constructs a Logger that logs at the specified log l.logLevel and above.\n// It decorates log lines with the log l.logLevel, date, time, and prepend.\nfunc NewLogger(prepend string, level int, dir string, filename string) *Logger {\n\tl := &Logger{\n\t\tlogLevel:  level,\n\t\tcallDepth: 2,\n\t}\n\n\t// start generic log writer\n\tl.lw = &AsyncLogWriter{\n\t\tDirPath:       dir,\n\t\tName:          filename,\n\t\tdateUpdatedCh: make(chan string, 1),\n\t}\n\tl.lw.Start()\n\n\t// start evaluate log writer\n\tl.lwEvaluate = &AsyncLogWriter{\n\t\tDirPath: dir,\n\t\tName:    filename + \"-evaluate\",\n\t}\n\tl.lwEvaluate.Start()\n\n\t// start audit log writer\n\tl.lwAudit = &AsyncLogWriter{\n\t\tDirPath: dir,\n\t\tName:    filename + \"-audit\",\n\t}\n\tl.lwAudit.Start()\n\n\tl.initActions(prepend)\n\treturn l\n}\n\n//nolint:gosec // G104: Logger.Output errors are non-critical and handled by async writer\nfunc (l *Logger) initActions(prepend string) {\n\tflag := log.Ldate | log.Ltime | log.Lmsgprefix\n\tif ShowCallerFileLine {\n\t\tflag |= log.Lshortfile\n\t}\n\n\tl.lgWrn = log.New(l.lw, prepend+\" [Warning] \", flag)\n\tl.Warning = func(format string, args ...any) {\n\t\tif l.logLevel >= LogLevelError {\n\t\t\t_ = l.lgWrn.Output(l.callDepth, fmt.Sprintf(format, args...))\n\t\t}\n\t}\n\n\tl.lgErr = log.New(l.lw, prepend+\" [Error] \", flag)\n\tl.Error = func(format string, args ...any) {\n\t\tif l.logLevel >= LogLevelError {\n\t\t\t_ = l.lgErr.Output(l.callDepth, fmt.Sprintf(format, args...))\n\t\t}\n\t}\n\n\tl.lgCrt = log.New(l.lw, prepend+\" [Critical] \", flag)\n\tl.Critical = func(format string, args ...any) {\n\t\tif l.logLevel >= LogLevelError {\n\t\t\t_ = l.lgCrt.Output(l.callDepth, fmt.Sprintf(format, args...))\n\t\t}\n\t}\n\n\tl.lgEva = log.New(l.lwEvaluate, prepend+\" [Evaluate] \", flag|log.Lmicroseconds)\n\tl.Evaluate = func(format string, args ...any) {\n\t\tif l.logLevel >= LogLevelError {\n\t\t\t_ = l.lgEva.Output(l.callDepth, fmt.Sprintf(format, args...))\n\t\t}\n\t}\n\n\tl.lgInf = log.New(l.lw, prepend+\" [Info] \", flag)\n\tl.Info = func(format string, args ...any) {\n\t\tif l.logLevel >= LogLevelInfo {\n\t\t\t_ = l.lgInf.Output(l.callDepth, fmt.Sprintf(format, args...))\n\t\t}\n\t}\n\n\tl.lgSts = log.New(l.lw, prepend+\" [Stats] \", flag)\n\tl.Stats = func(format string, args ...any) {\n\t\tif l.logLevel >= LogLevelInfo {\n\t\t\t_ = l.lgSts.Output(l.callDepth, fmt.Sprintf(format, args...))\n\t\t}\n\t}\n\n\t// output to audit log writer\n\tl.lgAdt = log.New(l.lwAudit, prepend+\" [Audit] \", flag)\n\tl.Audit = func(format string, args ...any) {\n\t\tif l.logLevel >= LogLevelAudit {\n\t\t\t_ = l.lgAdt.Output(l.callDepth, fmt.Sprintf(format, args...))\n\t\t}\n\t}\n\n\tl.lgTrx = log.New(l.lwAudit, prepend+\" [Transaction] \", flag)\n\tl.Transaction = func(format string, args ...any) {\n\t\tif l.logLevel >= LogLevelAudit {\n\t\t\t_ = l.lgTrx.Output(l.callDepth, fmt.Sprintf(format, args...))\n\t\t}\n\t}\n\n\tl.lgDbg = log.New(l.lw, prepend+\" [Debug] \", flag)\n\tl.Debug = func(format string, args ...any) {\n\t\tif l.logLevel >= LogLevelDebug {\n\t\t\t_ = l.lgDbg.Output(l.callDepth, fmt.Sprintf(format, args...))\n\t\t}\n\t}\n\n\tl.lgVbs = log.New(l.lw, prepend+\" [Verbose] \", flag)\n\tl.Verbose = func(format string, args ...any) {\n\t\tif l.logLevel >= LogLevelTrace {\n\t\t\t_ = l.lgVbs.Output(l.callDepth, fmt.Sprintf(format, args...))\n\t\t}\n\t}\n\n\tl.lgTrc = log.New(l.lw, prepend+\" [Trace] \", flag)\n\tl.Trace = func(format string, args ...any) {\n\t\tif l.logLevel >= LogLevelTrace {\n\t\t\t_ = l.lgTrc.Output(l.callDepth, fmt.Sprintf(format, args...))\n\t\t}\n\t}\n\tl.isRunning = true\n}\n\nfunc (l *Logger) SetLogLevel(level int) {\n\tl.Lock()\n\tl.logLevel = level\n\tl.Unlock()\n\n\tif l.isSubLogger {\n\t\treturn\n\t}\n\n\tfor _, subl := range l.subLoggers {\n\t\tsubl.SetLogLevel(level)\n\t}\n}\n\nfunc (l *Logger) Close() {\n\tif !l.isRunning {\n\t\treturn\n\t}\n\tl.isRunning = false\n\t// stop pushing further messages by SetOutput() because it is thread-safe\n\tif l.lgWrn != nil {\n\t\tl.lgWrn.SetOutput(io.Discard)\n\t}\n\tif l.lgErr != nil {\n\t\tl.lgErr.SetOutput(io.Discard)\n\t}\n\tif l.lgCrt != nil {\n\t\tl.lgCrt.SetOutput(io.Discard)\n\t}\n\tif l.lgEva != nil {\n\t\tl.lgEva.SetOutput(io.Discard)\n\t}\n\tif l.lgInf != nil {\n\t\tl.lgInf.SetOutput(io.Discard)\n\t}\n\tif l.lgAdt != nil {\n\t\tl.lgAdt.SetOutput(io.Discard)\n\t}\n\tif l.lgSts != nil {\n\t\tl.lgSts.SetOutput(io.Discard)\n\t}\n\tif l.lgTrx != nil {\n\t\tl.lgTrx.SetOutput(io.Discard)\n\t}\n\tif l.lgDbg != nil {\n\t\tl.lgDbg.SetOutput(io.Discard)\n\t}\n\tif l.lgTrc != nil {\n\t\tl.lgTrc.SetOutput(io.Discard)\n\t}\n\tif l.lgVbs != nil {\n\t\tl.lgVbs.SetOutput(io.Discard)\n\t}\n\tif l.isSubLogger {\n\t\t// sublogger reuses writer so must not close the writer routine\n\t\treturn\n\t}\n\n\tfor _, subl := range l.subLoggers {\n\t\tsubl.Close()\n\t}\n\tif l.lw != nil {\n\t\tl.lw.Close()\n\t}\n\tif l.lwEvaluate != nil {\n\t\tl.lwEvaluate.Close()\n\t}\n\tif l.lwAudit != nil {\n\t\tl.lwAudit.Close()\n\t}\n}\n\nfunc (l *Logger) Writer() io.Writer {\n\treturn l.lw\n}\n\nfunc (l *Logger) NewSubLogger(prepend string, level int) *Logger {\n\tnewl := &Logger{\n\t\tlogLevel:    level,\n\t\tcallDepth:   2,\n\t\tisSubLogger: true,\n\t\tlw:          l.lw,\n\t\tlwEvaluate:  l.lwEvaluate,\n\t\tlwAudit:     l.lwAudit,\n\t}\n\n\t// reuse parent's log writer\n\tnewl.initActions(prepend)\n\tl.Lock()\n\tl.subLoggers = append(l.subLoggers, newl)\n\tl.Unlock()\n\n\treturn newl\n}\n\nfunc (l *Logger) DateUpdateChan() chan string {\n\treturn l.lw.dateUpdatedCh\n}\n\nfunc (l *Logger) SetFlags(flag int) {\n\tl.Lock()\n\tdefer l.Unlock()\n\n\tif l.lgWrn != nil {\n\t\tl.lgWrn.SetFlags(flag)\n\t}\n\tif l.lgErr != nil {\n\t\tl.lgErr.SetFlags(flag)\n\t}\n\tif l.lgCrt != nil {\n\t\tl.lgCrt.SetFlags(flag)\n\t}\n\tif l.lgEva != nil {\n\t\tl.lgEva.SetFlags(flag)\n\t}\n\tif l.lgInf != nil {\n\t\tl.lgInf.SetFlags(flag)\n\t}\n\tif l.lgSts != nil {\n\t\tl.lgSts.SetFlags(flag)\n\t}\n\tif l.lgAdt != nil {\n\t\tl.lgAdt.SetFlags(flag)\n\t}\n\tif l.lgTrx != nil {\n\t\tl.lgTrx.SetFlags(flag)\n\t}\n\tif l.lgDbg != nil {\n\t\tl.lgDbg.SetFlags(flag)\n\t}\n\tif l.lgTrc != nil {\n\t\tl.lgTrc.SetFlags(flag)\n\t}\n\tif l.lgVbs != nil {\n\t\tl.lgVbs.SetFlags(flag)\n\t}\n}\n\nfunc NewLoggerDefine(prepend string, level int, dir string, filename string) *Logger {\n\tl := &Logger{\n\t\tlogLevel:  level,\n\t\tcallDepth: 2,\n\t}\n\n\t// start generic log writer\n\tl.lw = &AsyncLogWriter{\n\t\tDirPath:       dir,\n\t\tName:          filename,\n\t\tdateUpdatedCh: make(chan string, 1),\n\t}\n\tl.lw.Start()\n\n\t// start evaluate log writer\n\tl.lwEvaluate = &AsyncLogWriter{\n\t\tDirPath: dir,\n\t\tName:    filename + \"-evaluate\",\n\t}\n\tl.lwEvaluate.Start()\n\n\t// start audit log writer\n\tl.lwAudit = &AsyncLogWriter{\n\t\tDirPath: dir,\n\t\tName:    filename + \"-audit\",\n\t}\n\tl.lwAudit.Start()\n\n\tl.initActionsNoInfoPrepend(prepend)\n\treturn l\n}\n\n//nolint:gosec // G104: Logger.Output errors are non-critical and handled by async writer\nfunc (l *Logger) initActionsNoInfoPrepend(prepend string) {\n\tflag := log.Ldate | log.Ltime | log.Lmsgprefix\n\tif ShowCallerFileLine {\n\t\tflag |= log.Lshortfile\n\t}\n\n\tl.lgInf = log.New(l.lw, prepend, flag)\n\tl.Info = func(format string, args ...any) {\n\t\tif l.logLevel >= LogLevelInfo {\n\t\t\t_ = l.lgInf.Output(l.callDepth, fmt.Sprintf(format, args...))\n\t\t}\n\t}\n\n\tl.isRunning = true\n}\n"
  },
  {
    "path": "nhp/plugins/serverpluginhandler.go",
    "content": "package plugins\n\nimport (\n\t\"fmt\"\n\t\"path/filepath\"\n\t\"plugin\"\n\n\t\"github.com/gin-gonic/gin\"\n\n\tcommon \"github.com/OpenNHP/opennhp/nhp/common\"\n\tlog \"github.com/OpenNHP/opennhp/nhp/log\"\n\tutils \"github.com/OpenNHP/opennhp/nhp/utils\"\n)\n\nvar ExeDirPath string\n\ntype PluginHandler interface {\n\tVersion() string\n\tSignature() string\n\tExportedData() *PluginParamsOut\n\tInit(*PluginParamsIn) error\n\tClose() error\n\tRequestOTP(*common.NhpOTPRequest, *NhpServerPluginHelper) error\n\tRegisterAgent(*common.NhpRegisterRequest, *NhpServerPluginHelper) (*common.ServerRegisterAckMsg, error)\n\tListService(*common.NhpListRequest, *NhpServerPluginHelper) (*common.ServerListResultMsg, error)\n\tAuthWithNHP(*common.NhpAuthRequest, *NhpServerPluginHelper) (*common.ServerKnockAckMsg, error)\n\tAuthWithHttp(*gin.Context, *common.HttpKnockRequest, *HttpServerPluginHelper) (*common.ServerKnockAckMsg, error)\n}\n\ntype PluginHandlerSymbol struct {\n\tsVersion       plugin.Symbol\n\tsSignature     plugin.Symbol\n\tsExportedData  plugin.Symbol\n\tsInit          plugin.Symbol\n\tsClose         plugin.Symbol\n\tsRequestOTP    plugin.Symbol\n\tsRegisterAgent plugin.Symbol\n\tsListService   plugin.Symbol\n\tsAuthWithNHP   plugin.Symbol\n\tsAuthWithHttp  plugin.Symbol\n}\n\nvar errPluginNotImplemented error = fmt.Errorf(\"plugin not implemented\")\n\nfunc (s *PluginHandlerSymbol) Version() string {\n\tif s.sVersion == nil {\n\t\treturn \"\"\n\t}\n\tdefer utils.CatchPanic()\n\n\treturn s.sVersion.(func() string)()\n}\n\nfunc (s *PluginHandlerSymbol) Signature() string {\n\tif s.sSignature == nil {\n\t\treturn \"\"\n\t}\n\tdefer utils.CatchPanic()\n\n\treturn s.sSignature.(func() string)()\n}\n\nfunc (s *PluginHandlerSymbol) ExportedData() *PluginParamsOut {\n\tif s.sExportedData == nil {\n\t\treturn nil\n\t}\n\tdefer utils.CatchPanic()\n\n\treturn s.sExportedData.(func() *PluginParamsOut)()\n}\n\nfunc (s *PluginHandlerSymbol) Init(in *PluginParamsIn) error {\n\tif s.sInit == nil {\n\t\treturn errPluginNotImplemented\n\t}\n\tdefer utils.CatchPanic()\n\n\treturn s.sInit.(func(*PluginParamsIn) error)(in)\n}\n\nfunc (s *PluginHandlerSymbol) Close() error {\n\tif s.sClose == nil {\n\t\treturn errPluginNotImplemented\n\t}\n\tdefer utils.CatchPanic()\n\n\treturn s.sClose.(func() error)()\n}\n\nfunc (s *PluginHandlerSymbol) RequestOTP(req *common.NhpOTPRequest, helper *NhpServerPluginHelper) error {\n\tif s.sRequestOTP == nil {\n\t\treturn errPluginNotImplemented\n\t}\n\tdefer utils.CatchPanic()\n\n\treturn s.sRequestOTP.(func(*common.NhpOTPRequest, *NhpServerPluginHelper) error)(req, helper)\n}\n\nfunc (s *PluginHandlerSymbol) RegisterAgent(req *common.NhpRegisterRequest, helper *NhpServerPluginHelper) (*common.ServerRegisterAckMsg, error) {\n\tif s.sRegisterAgent == nil {\n\t\treturn nil, errPluginNotImplemented\n\t}\n\tdefer utils.CatchPanic()\n\n\treturn s.sRegisterAgent.(func(*common.NhpRegisterRequest, *NhpServerPluginHelper) (*common.ServerRegisterAckMsg, error))(req, helper)\n}\n\nfunc (s *PluginHandlerSymbol) ListService(req *common.NhpListRequest, helper *NhpServerPluginHelper) (*common.ServerListResultMsg, error) {\n\tif s.sListService == nil {\n\t\treturn nil, errPluginNotImplemented\n\t}\n\tdefer utils.CatchPanic()\n\n\treturn s.sListService.(func(*common.NhpListRequest, *NhpServerPluginHelper) (*common.ServerListResultMsg, error))(req, helper)\n}\n\nfunc (s *PluginHandlerSymbol) AuthWithNHP(req *common.NhpAuthRequest, helper *NhpServerPluginHelper) (*common.ServerKnockAckMsg, error) {\n\tif s.sAuthWithNHP == nil {\n\t\tlog.Error(\"AuthWithNHP not implemented\")\n\t\treturn nil, errPluginNotImplemented\n\t}\n\tdefer utils.CatchPanic()\n\n\treturn s.sAuthWithNHP.(func(*common.NhpAuthRequest, *NhpServerPluginHelper) (*common.ServerKnockAckMsg, error))(req, helper)\n}\n\nfunc (s *PluginHandlerSymbol) AuthWithHttp(ctx *gin.Context, req *common.HttpKnockRequest, hlpr *HttpServerPluginHelper) (*common.ServerKnockAckMsg, error) {\n\tif s.sAuthWithHttp == nil {\n\t\treturn nil, errPluginNotImplemented\n\t}\n\tdefer utils.CatchPanic()\n\n\treturn s.sAuthWithHttp.(func(*gin.Context, *common.HttpKnockRequest, *HttpServerPluginHelper) (*common.ServerKnockAckMsg, error))(ctx, req, hlpr)\n}\n\nfunc ReadPluginHandler(pluginPath string) PluginHandler {\n\tp, err := plugin.Open(filepath.Join(ExeDirPath, \"plugins\", pluginPath))\n\tif err != nil {\n\t\tlog.Error(\"open plugin %s failed: %v\", pluginPath, err)\n\t\treturn nil\n\t}\n\ts := &PluginHandlerSymbol{}\n\ts.sVersion, _ = p.Lookup(\"Version\")\n\ts.sSignature, _ = p.Lookup(\"Signature\")\n\ts.sExportedData, _ = p.Lookup(\"ExportedData\")\n\ts.sInit, _ = p.Lookup(\"Init\")\n\ts.sClose, _ = p.Lookup(\"Close\")\n\ts.sRequestOTP, _ = p.Lookup(\"RequestOTP\")\n\ts.sRegisterAgent, _ = p.Lookup(\"RegisterAgent\")\n\ts.sListService, _ = p.Lookup(\"ListService\")\n\ts.sAuthWithNHP, _ = p.Lookup(\"AuthWithNHP\")\n\ts.sAuthWithHttp, _ = p.Lookup(\"AuthWithHttp\")\n\n\treturn s\n}\n\ntype PluginParamsIn struct {\n\tPluginDirPath *string\n\tLog           *log.Logger\n\tHostname      *string\n\tLocalIp       *string\n\tLocalMac      *string\n}\n\ntype PluginParamsOut struct {\n}\n\ntype NhpPluginPostAuthFunc func(*common.NhpAuthRequest, *common.ResourceData) (*common.ServerKnockAckMsg, error)\n\ntype HttpPluginPostAuthFunc func(*common.HttpKnockRequest, *common.ResourceData) (*common.ServerKnockAckMsg, error)\n\n// Session helper function types for plugin access to HTTP session.\n// These bypass Go plugin type system limitations by using primitive types.\ntype SessionGetFunc func(ctx *gin.Context, key string) interface{}\ntype SessionSetFunc func(ctx *gin.Context, key string, val interface{})\ntype SessionSaveFunc func(ctx *gin.Context) error\ntype SessionClearFunc func(ctx *gin.Context)\n\ntype NhpServerPluginHelper struct {\n\tStopSignal              <-chan struct{}\n\tAuthWithNhpCallbackFunc NhpPluginPostAuthFunc\n}\n\ntype HttpServerPluginHelper struct {\n\tStopSignal               <-chan struct{}\n\tAuthWithHttpCallbackFunc HttpPluginPostAuthFunc\n\t// Session helper functions - provided by main program\n\tSessionGet   SessionGetFunc\n\tSessionSet   SessionSetFunc\n\tSessionSave  SessionSaveFunc\n\tSessionClear SessionClearFunc\n}\n"
  },
  {
    "path": "nhp/test/api_test.go",
    "content": "package test\n\nimport (\n\t\"net/url\"\n\t\"testing\"\n)\n\n/*\nfunc TestZLBTokenAPIOld(t *testing.T) {\n\taccessKey := \"wxtyjrqsmzqglbzpt\"\n\tsecretKey := \"wxtyjrqsmzqglbzptpwd\"\n\ttoken := \"8a1189bf8caba36b018cae241546098c-commonToken\"\n\tu := \"https://appapi.zjzwfw.gov.cn/sso/servlet/simpleauth?method=getUserInfo&\"\n\n\ttimestamp := time.Now().Format(\"20060102150405\")\n\tsign := fmt.Sprintf(\"%s%s%s\", accessKey, secretKey, timestamp)\n\tfmt.Printf(\"sign string: %s\\n\", sign)\n\tsignHash := utils.MD5(sign)\n\n\tparams := url.Values{}\n\tparams.Add(\"servicecode\", accessKey)\n\tparams.Add(\"time\", timestamp)\n\tparams.Add(\"sign\", signHash)\n\tparams.Add(\"token\", token)\n\tparams.Add(\"datatype\", \"json\")\n\trawQuery := params.Encode()\n\n\tvar headers = make(map[string]string)\n\theaders[\"Content-Type\"] = \"application/x-www-form-urlencoded\"\n\theaders[\"Content-Length\"] = strconv.Itoa(len(rawQuery))\n\n\tresp, err := utils.Request(u, \"POST\", rawQuery, headers)\n\tfmt.Printf(\"Post to %s, headers: %s\\ncontent:\\n%s\\n\", u, headers, rawQuery)\n\tfmt.Printf(\"get zlb user info response: %s, err %s\\n\", resp, err)\n}\n\nfunc TestZLBTokenAPI(t *testing.T) {\n\taccessKey := \"BCDSGA_9754b3458c581ef0efb7b66946c9c324\"\n\tsecretKey := \"BCDSGS_d8d2e2f21c2a02c09a641a11cf45d91e\"\n\tappId := \"2001832595\"\n\tvar accessToken string\n\tzlbServerBaseUrl := \"https://ibcdsg.zj.gov.cn:8443\"\n\tgetTokenUrl := \"/restapi/prod/IC33000020220329000007/uc/sso/access_token\"\n\n\tcontent := fmt.Sprintf(\"{\\\"ticketId\\\":\\\"%s\\\",\\\"appId\\\":\\\"%s\\\"}\", \"a1d67776ce344be1a240bbacd8c3daf3\", appId)\n\n\ttimestamp := time.Now().UTC().Format(\"Mon, 02 Jan 2006 15:04:05 MST\")\n\t//timestamp = strings.Replace(timestamp, \"UTC\", \"GMT\", 1)\n\tfmt.Println(\"timestamp: \", timestamp)\n\n\tsignStr := fmt.Sprintf(\"POST\\n%s\\n%s\\n%s\\n%s\\n\", getTokenUrl, \"\", accessKey, timestamp)\n\t//signHex := hex.EncodeToString(utils.HMACSha256(secretKey, signStr))\n\tsignHex := utils.HMACSha256(secretKey, signStr)\n\tfmt.Println(\"sign hex: \", signHex)\n\tsignBase64 := base64.StdEncoding.EncodeToString([]byte(signHex))\n\tfmt.Println(\"sign base64: \", signBase64)\n\n\tvar headers = make(map[string]string)\n\theaders[\"Content-Type\"] = \"application/json\"\n\t//headers[\"Content-Length\"] = strconv.Itoa(len(content))\n\theaders[\"X-BG-DATE-TIME\"] = timestamp\n\theaders[\"X-BG-HMAC-ACCESS-KEY\"] = accessKey\n\theaders[\"X-BG-HMAC-ALGORITHM\"] = \"hmac-sha256\"\n\theaders[\"X-BG-HMAC-SIGNATURE\"] = signBase64\n\n\tresp, err := utils.Request(zlbServerBaseUrl+getTokenUrl, \"POST\", content, headers)\n\tif err != nil {\n\t\treturn\n\t}\n\tfmt.Println(\"get access token response: \", resp)\n\n\td := &zlb.ZLBApiResp{}\n\tif err = json.Unmarshal([]byte(resp), d); err != nil {\n\t\treturn\n\t}\n\n\tif !d.Success {\n\t\treturn\n\t}\n\n\taccessToken, ok := d.Data[\"accessToken\"].(string)\n\tif !ok {\n\t\tfmt.Println(\"access token is not a string \")\n\t}\n\tfmt.Println(\"access token: \", accessToken)\n}\n*/\n\nfunc TestUrlEncoding(t *testing.T) {\n\tstr := \"中文\"\n\tencoded := url.QueryEscape(str)\n\tprintln(\"encoded: \", encoded)\n\tdecoded, err := url.QueryUnescape(str)\n\tprintln(\"decoded: \", decoded, \" error: \", err)\n}\n"
  },
  {
    "path": "nhp/test/conn_test.go",
    "content": "package test\n\nimport (\n\t\"fmt\"\n\t\"net\"\n\t\"sync\"\n\t\"testing\"\n)\n\nfunc TestUdpConnection(t *testing.T) {\n\tlistenConn, err := net.ListenUDP(\"udp\", &net.UDPAddr{\n\t\t//IP:   net.ParseIP(\"127.0.0.1\"),\n\t\tIP:   net.IPv4zero,\n\t\tPort: 9999,\n\t})\n\tif err != nil {\n\t\tfmt.Printf(\"listen error %v\\n\", err)\n\t\treturn\n\t}\n\tladdr := listenConn.LocalAddr()\n\tlocalAddr, err := net.ResolveUDPAddr(laddr.Network(), laddr.String())\n\tif err != nil {\n\t\tfmt.Printf(\"resolve local UDPAddr error %v\\n\", err)\n\t\treturn\n\t}\n\tfmt.Printf(\"listening on address: %s\\n\", localAddr.String())\n\n\tvar wait sync.WaitGroup\n\twait.Add(2)\n\tgo func() {\n\t\tdefer wait.Done()\n\n\t\tpkt := make([]byte, 4)\n\t\t// udp recv, blocking until packet arrives or conn.Close()\n\t\tn, remoteAddr, err := listenConn.ReadFromUDP(pkt[:])\n\t\tif err != nil {\n\t\t\tfmt.Printf(\"Read %d bytes from UDP %s error: (%d) %v\\n\", n, remoteAddr.String(), err, err)\n\t\t\treturn\n\t\t}\n\t\tfmt.Printf(\"Read %d bytes from UDP %s: %v\\n\", n, remoteAddr.String(), pkt[:])\n\t}()\n\n\t// close connection\n\t/* go func() {\n\t\tdefer wait.Done()\n\t\tlistenConn.Close()\n\t}() */\n\n\t// send a larger packet\n\t/* go func() {\n\t\tdefer wait.Done()\n\n\t\tremoteAddr := &net.UDPAddr{\n\t\t\tIP:   net.ParseIP(\"127.0.0.1\"),\n\t\t\tPort: 9999,\n\t\t}\n\t\tcConn, err := net.DialUDP(\"udp\", nil, remoteAddr)\n\t\tif err != nil {\n\t\t\tfmt.Printf(\"could not connect to remote addr %s\", remoteAddr.String())\n\t\t\treturn\n\t\t}\n\t\tpkt := []byte{1, 2, 3, 4, 5, 6}\n\t\tn, err := cConn.Write(pkt[:])\n\t\tif err != nil {\n\t\t\tfmt.Printf(\"Write %d bytes to UDP %s error: %v\\n\", n, remoteAddr.String(), err)\n\t\t\treturn\n\t\t}\n\t\tfmt.Printf(\"Write %d bytes to UDP %s: %v\\n\", n, remoteAddr.String(), pkt[:])\n\t}() */\n\n\t// send 0 byte packet\n\tgo func() {\n\t\tdefer wait.Done()\n\n\t\tremoteAddr := &net.UDPAddr{\n\t\t\tIP:   net.ParseIP(\"127.0.0.1\"),\n\t\t\tPort: 9999,\n\t\t}\n\t\tcConn, err := net.DialUDP(\"udp\", nil, remoteAddr)\n\t\tif err != nil {\n\t\t\tfmt.Printf(\"could not connect to remote addr %s\", remoteAddr.String())\n\t\t\treturn\n\t\t}\n\t\tpkt := []byte{1}\n\t\tn, err := cConn.Write(pkt[:])\n\t\tif err != nil {\n\t\t\tfmt.Printf(\"Write %d bytes to UDP %s error: %v\\n\", n, remoteAddr.String(), err)\n\t\t\treturn\n\t\t}\n\t\tfmt.Printf(\"Write %d bytes to UDP %s: %v\\n\", n, remoteAddr.String(), pkt[:])\n\t}()\n\n\twait.Wait()\n}\n"
  },
  {
    "path": "nhp/test/ecdh_test.go",
    "content": "package test\n\nimport (\n\t\"encoding/base64\"\n\t\"fmt\"\n\t\"testing\"\n\n\tcore \"github.com/OpenNHP/opennhp/nhp/core\"\n)\n\nfunc TestCurve25519Keys(t *testing.T) {\n\te := core.NewECDH(core.ECC_CURVE25519)\n\n\tfmt.Printf(\"Private key: %s\\n\", e.PrivateKeyBase64())\n\tfmt.Printf(\"Public key: %s\\n\", e.PublicKeyBase64())\n}\n\nfunc TestSM2Keys(t *testing.T) {\n\te := core.NewECDH(core.ECC_SM2)\n\n\tfmt.Printf(\"Private key: %s\\n\", e.PrivateKeyBase64())\n\tfmt.Printf(\"Public key: %s\\n\", e.PublicKeyBase64())\n}\n\nfunc TestPublicKeys(t *testing.T) {\n\t//prk, err := base64.StdEncoding.DecodeString(\"kgvvQaBGfHNWCbZMkFWS1K07BgRXlnOo7CHTZF1bsmI=\") // server\n\t//prk, err := base64.StdEncoding.DecodeString(\"2kRXjwV9zAUMc0Vf0jl984q2p9EiyjbAMUPKNu517z4=\") // agent\n\tprk, err := base64.StdEncoding.DecodeString(\"D2bieOaJarsM9euBBfSs/Ky8g/X6lBQ73NmP55CMgds=\") // ac\n\tif err != nil {\n\t\tfmt.Printf(\"Private key decode error\\n\")\n\t\treturn\n\t}\n\tcurvee := core.ECDHFromKey(core.ECC_CURVE25519, prk)\n\tif curvee == nil {\n\t\tfmt.Printf(\"Wrong private key\\n\")\n\t\treturn\n\t}\n\tsm2e := core.ECDHFromKey(core.ECC_SM2, prk)\n\tif sm2e == nil {\n\t\tfmt.Printf(\"Wrong private key\\n\")\n\t\treturn\n\t}\n\n\tfmt.Printf(\"Curve25519 public key: %s\\n\", curvee.PublicKeyBase64())\n\tfmt.Printf(\"SM2 public key: %s\\n\", sm2e.PublicKeyBase64())\n}\n\nfunc TestPeer(t *testing.T) {\n\tserver := &core.UdpPeer{\n\t\tIp:           \"192.168.2.27\",\n\t\tPort:         62206,\n\t\tPubKeyBase64: \"c0HALYy3433SqJmfN0JpRk1Q6H7xh84MAg89jYtRrQM=\",\n\t\tExpireTime:   1716345064,\n\t\tType:         core.NHP_SERVER,\n\t}\n\n\tvar p *core.UdpPeer = server\n\n\tvar peer core.Peer = p\n\n\tfmt.Printf(\"Pub key %s, addr %s, name %s\\n\", peer.PublicKeyBase64(), peer.SendAddr().String(), peer.Name())\n}\n"
  },
  {
    "path": "nhp/test/ecdsa_test.go",
    "content": "package test\n\nimport (\n\t\"crypto/rand\"\n\t\"encoding/base64\"\n\t\"encoding/hex\"\n\t\"fmt\"\n\t\"testing\"\n\n\t\"github.com/emmansun/gmsm/sm2\"\n\n\tcore \"github.com/OpenNHP/opennhp/nhp/core\"\n\t\"github.com/OpenNHP/opennhp/nhp/core/scheme/gmsm\"\n)\n\nfunc TestSM2ECDSAKeys(t *testing.T) {\n\tvar err error\n\tvar pubKey [64]byte\n\tvar privKey [32]byte\n\tsm2PrivKey := new(sm2.PrivateKey)\n\n\tfor {\n\t\tsm2PrivKey, err = sm2.GenerateKey(rand.Reader)\n\t\tif err == nil {\n\t\t\tbreak\n\t\t}\n\t}\n\tdBuf := sm2PrivKey.D.Bytes()\n\tfmt.Printf(\"Private key length: %d\\n\", len(dBuf))\n\tcopy(privKey[:], dBuf[:])\n\n\txBuf := sm2PrivKey.PublicKey.X.Bytes()\n\tyBuf := sm2PrivKey.PublicKey.Y.Bytes()\n\tfmt.Printf(\"Public key X length: %d\\n\", len(xBuf))\n\tfmt.Printf(\"Public key Y length: %d\\n\", len(yBuf))\n\tcopy(pubKey[:len(xBuf)], xBuf[:])\n\tcopy(pubKey[len(xBuf):], yBuf[:])\n\n\tpubStr := base64.StdEncoding.EncodeToString(pubKey[:])\n\tprivStr := base64.StdEncoding.EncodeToString(privKey[:])\n\n\tfmt.Printf(\"Public key: %s\\n\", pubStr)\n\tfmt.Printf(\"Private key: %s\\n\", privStr)\n}\n\nfunc TestSM2ECDSAKeysSerializeAndDeserialize(t *testing.T) {\n\tvar err error\n\tvar pubKey [64]byte\n\tvar privKey [32]byte\n\tsm2PrivKey := new(sm2.PrivateKey)\n\n\tfor {\n\t\tsm2PrivKey, err = sm2.GenerateKey(rand.Reader)\n\t\tif err == nil {\n\t\t\tbreak\n\t\t}\n\t}\n\tdBuf := sm2PrivKey.D.Bytes()\n\tcopy(privKey[:], dBuf[:])\n\n\txBuf := sm2PrivKey.PublicKey.X.Bytes()\n\tyBuf := sm2PrivKey.PublicKey.Y.Bytes()\n\tcopy(pubKey[:len(xBuf)], xBuf[:])\n\tcopy(pubKey[len(xBuf):], yBuf[:])\n\n\tpubStr := base64.StdEncoding.EncodeToString(pubKey[:])\n\tprivStr := base64.StdEncoding.EncodeToString(privKey[:])\n\n\tfmt.Printf(\"Public key: %s\\n\", pubStr)\n\tfmt.Printf(\"Private key: %s\\n\", privStr)\n\tfmt.Printf(\"Public key: %s\\n\", hex.EncodeToString(pubKey[:]))\n\tfmt.Printf(\"Private key: %s\\n\", hex.EncodeToString(privKey[:]))\n\n\tplainText := \"This is a test for sm2 ecdsa keys serialization\"\n\thash, err := core.NewHash(core.HASH_SHA256)\n\tif err != nil {\n\t\tfmt.Printf(\"Failed to create hash: %v\\n\", err)\n\t\treturn\n\t}\n\thash.Write([]byte(plainText))\n\thashedBytes := hash.Sum(nil)\n\tfmt.Printf(\"hashed hex: %s, length: %d\\n\", hex.EncodeToString(hashedBytes), len(hashedBytes))\n\tfmt.Printf(\"hashed byte slice: %v\\n\", hashedBytes)\n\thashedBytes = []byte(\"AABBCCDD\")\n\n\tsignature, err := sm2PrivKey.Sign(rand.Reader, hashedBytes, nil)\n\tif err != nil {\n\t\tfmt.Printf(\"Sign error: %v\\n\", err)\n\t\treturn\n\t}\n\tfmt.Printf(\"signature hex: %s, length: %d\\n\", hex.EncodeToString(signature), len(signature))\n\n\tsuccess := sm2.VerifyASN1(&sm2PrivKey.PublicKey, hashedBytes[:], signature)\n\tfmt.Printf(\"Signature verification: %v\\n\", success)\n\n\tencrypted, err := sm2.Encrypt(rand.Reader, &sm2PrivKey.PublicKey, []byte(plainText), nil)\n\tif err != nil {\n\t\tfmt.Printf(\"encrypt error: %v\\n\", err)\n\t\treturn\n\t}\n\tfmt.Printf(\"encrypted hex: %s, length: %d\\n\", hex.EncodeToString(encrypted), len(encrypted))\n\tdecrypted, err := sm2.Decrypt(sm2PrivKey, encrypted)\n\tif err != nil {\n\t\tfmt.Printf(\"decrypt error: %v\\n\", err)\n\t\treturn\n\t}\n\tfmt.Printf(\"Decypted plaintext: %s\\n\", decrypted)\n\n\tprivKey1, err := gmsm.Base64DecodeSM2ECDSAPrivateKey(pubStr, privStr)\n\tif err != nil {\n\t\tfmt.Printf(\"decode priv key error: %v\\n\", err)\n\t\treturn\n\t}\n\n\tdecrypted1, err := sm2.Decrypt(privKey1, encrypted)\n\tif err != nil {\n\t\tfmt.Printf(\"decrypt1 error: %v\\n\", err)\n\t\treturn\n\t}\n\tfmt.Printf(\"Decypted plaintext1: %s\\n\", decrypted1)\n\n\tpubKey1, err := gmsm.Base64DecodeSM2ECDSAPublicKey(pubStr)\n\tif err != nil {\n\t\tfmt.Printf(\"decode pub key error: %v\\n\", err)\n\t\treturn\n\t}\n\tsuccess1 := sm2.VerifyASN1(pubKey1, hashedBytes[:], signature)\n\tfmt.Printf(\"Signature verification1: %v\\n\", success1)\n}\n\nfunc TestKeyDeserialization(t *testing.T) {\n\tpubHexStr := \"04627652fd978d0c4290d28e3233309f83e35ec2834fc5f9df2bfd32d658200a9bed7906bde12f4504ea04ca5f65eff1a9253cdcef6415a36999642e5395d9080f\"\n\tprivHexStr := \"1045f665465c1d78663ee7719592667fe8ca65d3b24c62259a45208c7d2c04f4\"\n\n\tpubBytes, _ := hex.DecodeString(pubHexStr)\n\tprivBytes, _ := hex.DecodeString(privHexStr)\n\n\tprivKey, err := gmsm.Base64DecodeSM2ECDSAPrivateKey(base64.StdEncoding.EncodeToString(pubBytes), base64.StdEncoding.EncodeToString(privBytes))\n\tif err != nil {\n\t\tfmt.Printf(\"decode failed %v\\n\", err)\n\t\treturn\n\t}\n\n\tencrypted, err := sm2.Encrypt(rand.Reader, &privKey.PublicKey, []byte(\"PlainTextAABBCCDD\"), nil)\n\tif err != nil {\n\t\tfmt.Printf(\"encrypt error: %v\\n\", err)\n\t\treturn\n\t}\n\tfmt.Printf(\"encrypted hex: %s, length: %d\\n\", hex.EncodeToString(encrypted), len(encrypted))\n\tdecrypted, err := sm2.Decrypt(privKey, encrypted)\n\tif err != nil {\n\t\tfmt.Printf(\"decrypt error: %v\\n\", err)\n\t\treturn\n\t}\n\tfmt.Printf(\"decrypt ok: %s\\n\", decrypted)\n}\n\nfunc TestECDHForECDSA(t *testing.T) {\n\tpubStr, privStr := gmsm.GenerateSM2ECDHKeypair()\n\tfmt.Printf(\"Public key: %s\\n\", pubStr)\n\tfmt.Printf(\"Private key: %s\\n\", privStr)\n\n\tsm2PrivKey, err := gmsm.Base64DecodeSM2ECDSAPrivateKey(pubStr, privStr)\n\tif err != nil {\n\t\tfmt.Printf(\"decode error: %v\\n\", err)\n\t\treturn\n\t}\n\n\tplainText := \"Test ECDSA functions using ECDH keys\"\n\tsignBytes := []byte(\"AAbbCCdd\")\n\tencrypted, err := sm2.Encrypt(rand.Reader, &sm2PrivKey.PublicKey, []byte(plainText), nil)\n\tif err != nil {\n\t\tfmt.Printf(\"decode error: %v\\n\", err)\n\t\treturn\n\t}\n\tdecrypted, err := sm2.Decrypt(sm2PrivKey, encrypted)\n\tif err != nil {\n\t\tfmt.Printf(\"decrypt error: %v\\n\", err)\n\t\treturn\n\t}\n\tfmt.Printf(\"Decypted plaintext: %s\\n\", decrypted)\n\n\tsignature, err := sm2PrivKey.Sign(rand.Reader, signBytes[:], nil)\n\tif err != nil {\n\t\tfmt.Printf(\"sign error: %v\\n\", err)\n\t\treturn\n\t}\n\tfmt.Printf(\"signature hex: %s\\n\", hex.EncodeToString(signature))\n\n\tverified := sm2.VerifyASN1(&sm2PrivKey.PublicKey, signBytes, signature)\n\tfmt.Printf(\"signature verification: %v\\n\", verified)\n}\n"
  },
  {
    "path": "nhp/test/fuzz_json_test.go",
    "content": "package test\n\nimport (\n\t\"encoding/json\"\n\t\"testing\"\n\n\t\"github.com/OpenNHP/opennhp/nhp/common\"\n)\n\n// FuzzAgentKnockMsg tests JSON parsing of AgentKnockMsg.\n// This is a security-critical message type used for authentication.\nfunc FuzzAgentKnockMsg(f *testing.F) {\n\t// Seed corpus with valid JSON structures\n\tf.Add([]byte(`{\"userId\":\"test\",\"deviceId\":\"dev1\"}`))\n\tf.Add([]byte(`{\"userId\":\"\",\"deviceId\":\"\"}`))\n\tf.Add([]byte(`{}`))\n\tf.Add([]byte(`{\"nested\":{\"deep\":\"value\"}}`))\n\tf.Add([]byte(`[]`))\n\tf.Add([]byte(`null`))\n\tf.Add([]byte(``))\n\n\tf.Fuzz(func(t *testing.T, data []byte) {\n\t\tvar msg common.AgentKnockMsg\n\t\t// Should not panic on any JSON input\n\t\t_ = json.Unmarshal(data, &msg)\n\t})\n}\n\n// FuzzServerKnockAckMsg tests JSON parsing of server acknowledgment messages.\nfunc FuzzServerKnockAckMsg(f *testing.F) {\n\tf.Add([]byte(`{\"errCode\":0,\"errMsg\":\"success\"}`))\n\tf.Add([]byte(`{\"errCode\":-1,\"errMsg\":\"error\"}`))\n\tf.Add([]byte(`{}`))\n\n\tf.Fuzz(func(t *testing.T, data []byte) {\n\t\tvar msg common.ServerKnockAckMsg\n\t\t_ = json.Unmarshal(data, &msg)\n\t})\n}\n\n// FuzzACOpsResultMsg tests JSON parsing of AC operation result messages.\nfunc FuzzACOpsResultMsg(f *testing.F) {\n\tf.Add([]byte(`{\"errCode\":0,\"preAccessAction\":{}}`))\n\tf.Add([]byte(`{}`))\n\n\tf.Fuzz(func(t *testing.T, data []byte) {\n\t\tvar msg common.ACOpsResultMsg\n\t\t_ = json.Unmarshal(data, &msg)\n\t})\n}\n\n// FuzzDARMsg tests JSON parsing of Data Access Request messages.\n// Security-critical for DHP (Data Hiding Protocol).\nfunc FuzzDARMsg(f *testing.F) {\n\tf.Add([]byte(`{\"doId\":\"test-id\",\"dbId\":\"db1\"}`))\n\tf.Add([]byte(`{}`))\n\n\tf.Fuzz(func(t *testing.T, data []byte) {\n\t\tvar msg common.DARMsg\n\t\t_ = json.Unmarshal(data, &msg)\n\t})\n}\n"
  },
  {
    "path": "nhp/test/fuzz_test.go",
    "content": "package test\n\nimport (\n\t\"testing\"\n\n\t\"github.com/OpenNHP/opennhp/nhp/core\"\n)\n\n// FuzzECDHFromKey tests ECDH key creation with random inputs.\n// This is important for security as malformed keys should be handled gracefully.\nfunc FuzzECDHFromKey(f *testing.F) {\n\t// Seed corpus with valid key sizes\n\tf.Add([]byte{}, int(core.ECC_CURVE25519))\n\tf.Add(make([]byte, 32), int(core.ECC_CURVE25519))\n\tf.Add(make([]byte, 64), int(core.ECC_SM2))\n\tf.Add(make([]byte, 16), int(core.ECC_CURVE25519))\n\tf.Add(make([]byte, 48), int(core.ECC_SM2))\n\n\tf.Fuzz(func(t *testing.T, data []byte, eccType int) {\n\t\t// Normalize eccType to valid range\n\t\tvar eType core.EccTypeEnum\n\t\tswitch eccType % 2 {\n\t\tcase 0:\n\t\t\teType = core.ECC_CURVE25519\n\t\tcase 1:\n\t\t\teType = core.ECC_SM2\n\t\t}\n\n\t\t// ECDHFromKey should not panic on any input\n\t\t// It should return nil for invalid keys\n\t\te := core.ECDHFromKey(eType, data)\n\t\tif e != nil {\n\t\t\t// If key was accepted, verify basic operations don't panic\n\t\t\t_ = e.PublicKey()\n\t\t\t_ = e.PublicKeyBase64()\n\t\t}\n\t})\n}\n\n// FuzzAESDecrypt tests AES decryption with random inputs.\n// Ensures malformed ciphertext is handled without panics.\nfunc FuzzAESDecrypt(f *testing.F) {\n\t// Seed corpus with various sizes\n\tf.Add(make([]byte, 16), make([]byte, 32)) // minimum block size\n\tf.Add(make([]byte, 32), make([]byte, 32)) // two blocks\n\tf.Add(make([]byte, 48), make([]byte, 32)) // three blocks\n\tf.Add([]byte{}, make([]byte, 32))         // empty ciphertext\n\n\tf.Fuzz(func(t *testing.T, ciphertext []byte, key []byte) {\n\t\t// Normalize key to 32 bytes (AES-256)\n\t\tif len(key) < 32 {\n\t\t\tpaddedKey := make([]byte, 32)\n\t\t\tcopy(paddedKey, key)\n\t\t\tkey = paddedKey\n\t\t} else if len(key) > 32 {\n\t\t\tkey = key[:32]\n\t\t}\n\n\t\t// AESDecrypt should not panic on any input\n\t\t_, _ = core.AESDecrypt(ciphertext, key)\n\t})\n}\n\n// FuzzHeaderTypeToDeviceType tests header type to device type mapping.\nfunc FuzzHeaderTypeToDeviceType(f *testing.F) {\n\t// Seed with known valid types\n\tf.Add(0)  // NHP_KPL\n\tf.Add(1)  // NHP_KNK\n\tf.Add(10) // NHP_AOL\n\tf.Add(100)\n\tf.Add(-1)\n\tf.Add(1000000)\n\n\tf.Fuzz(func(t *testing.T, headerType int) {\n\t\t// Should not panic on any input\n\t\t_ = core.HeaderTypeToDeviceType(headerType)\n\t\t_ = core.HeaderTypeToString(headerType)\n\t})\n}\n\n// FuzzCBCDecryption tests CBC decryption with random inputs.\n// Tests both AES256 and SM4 cipher modes.\nfunc FuzzCBCDecryption(f *testing.F) {\n\t// Seed corpus with various sizes\n\tf.Add(make([]byte, 16), 0) // one block, AES\n\tf.Add(make([]byte, 32), 0) // two blocks, AES\n\tf.Add(make([]byte, 17), 0) // invalid size (not multiple of block), AES\n\tf.Add(make([]byte, 16), 1) // one block, SM4\n\tf.Add(make([]byte, 17), 1) // invalid size, SM4\n\tf.Add([]byte{}, 0)         // empty\n\n\tf.Fuzz(func(t *testing.T, ciphertext []byte, cipherType int) {\n\t\t// Use a fixed key for testing\n\t\tvar key [core.SymmetricKeySize]byte\n\t\tfor i := range key {\n\t\t\tkey[i] = byte(i)\n\t\t}\n\n\t\tvar gcmType core.GcmTypeEnum\n\t\tswitch cipherType % 2 {\n\t\tcase 0:\n\t\t\tgcmType = core.GCM_AES256\n\t\tcase 1:\n\t\t\tgcmType = core.GCM_SM4\n\t\t}\n\n\t\t// CBCDecryption should not panic on any input\n\t\t_, _ = core.CBCDecryption(gcmType, &key, ciphertext, false)\n\t})\n}\n\n// FuzzUdpPeerName tests UdpPeer.Name() with various public key lengths.\n// The Name() function slices PubKeyBase64 which could panic on short strings.\nfunc FuzzUdpPeerName(f *testing.F) {\n\t// Seed corpus with various lengths\n\tf.Add(\"\")\n\tf.Add(\"abc\")\n\tf.Add(\"0123456789\")\n\tf.Add(\"012345678901234567890123456789012345678901234\") // 45 chars - valid\n\tf.Add(\"01234567890123456789012345678901234567890123\")  // 44 chars - almost valid\n\tf.Add(\"0123456789012345678901234567890123456789012\")   // 43 chars - minimum\n\n\tf.Fuzz(func(t *testing.T, pubKeyBase64 string) {\n\t\tpeer := &core.UdpPeer{\n\t\t\tPubKeyBase64: pubKeyBase64,\n\t\t}\n\t\t// Name() should not panic on any input\n\t\t_ = peer.Name()\n\t})\n}\n\n// FuzzPacketParsing tests Packet methods with malformed/truncated data.\n// Network packets could be truncated or malformed by attackers.\nfunc FuzzPacketParsing(f *testing.F) {\n\t// Seed with various packet sizes\n\tf.Add([]byte{})          // empty\n\tf.Add(make([]byte, 8))   // too short for most operations\n\tf.Add(make([]byte, 12))  // just enough for Flag()\n\tf.Add(make([]byte, 24))  // just enough for Counter()\n\tf.Add(make([]byte, 64))  // typical minimum header\n\tf.Add(make([]byte, 128)) // larger packet\n\n\tf.Fuzz(func(t *testing.T, data []byte) {\n\t\tpkt := &core.Packet{\n\t\t\tContent: data,\n\t\t}\n\n\t\t// These methods access fixed offsets and could panic\n\t\t// They should be safe on any input\n\t\tdefer func() {\n\t\t\tif r := recover(); r != nil {\n\t\t\t\tt.Errorf(\"panic on packet of length %d: %v\", len(data), r)\n\t\t\t}\n\t\t}()\n\n\t\t// Only call methods if we have enough data to avoid expected panics\n\t\t// This tests the boundary conditions\n\t\tif len(data) >= 12 {\n\t\t\t_ = pkt.Flag()\n\t\t}\n\t\tif len(data) >= 8 {\n\t\t\t_, _ = pkt.HeaderTypeAndSize()\n\t\t}\n\t\tif len(data) >= 24 {\n\t\t\t_ = pkt.Counter()\n\t\t}\n\t})\n}\n"
  },
  {
    "path": "nhp/test/iputils_test.go",
    "content": "package test\n\nimport (\n\t\"testing\"\n\n\t\"github.com/OpenNHP/opennhp/nhp/utils\"\n)\n\nfunc TestDetectIPType(t *testing.T) {\n\ttests := []struct {\n\t\tname     string\n\t\tip       string\n\t\texpected utils.IPTYPE\n\t\thasError bool\n\t}{\n\t\t// Valid IPv4 addresses\n\t\t{\"standard IPv4\", \"192.168.1.1\", utils.IPV4, false},\n\t\t{\"IPv4 loopback\", \"127.0.0.1\", utils.IPV4, false},\n\t\t{\"IPv4 broadcast\", \"255.255.255.255\", utils.IPV4, false},\n\t\t{\"IPv4 zero\", \"0.0.0.0\", utils.IPV4, false},\n\t\t{\"IPv4 private class A\", \"10.0.0.1\", utils.IPV4, false},\n\t\t{\"IPv4 private class B\", \"172.16.0.1\", utils.IPV4, false},\n\t\t{\"IPv4 private class C\", \"192.168.0.1\", utils.IPV4, false},\n\n\t\t// Valid IPv6 addresses\n\t\t{\"IPv6 loopback\", \"::1\", utils.IPV6, false},\n\t\t{\"IPv6 full\", \"2001:0db8:85a3:0000:0000:8a2e:0370:7334\", utils.IPV6, false},\n\t\t{\"IPv6 compressed\", \"2001:db8:85a3::8a2e:370:7334\", utils.IPV6, false},\n\t\t{\"IPv6 link-local\", \"fe80::1\", utils.IPV6, false},\n\t\t{\"IPv6 all zeros\", \"::\", utils.IPV6, false},\n\t\t{\"IPv6 documentation\", \"2001:db8::1\", utils.IPV6, false},\n\n\t\t// IPv4-mapped IPv6 addresses are treated as IPv4 by Go's net package\n\t\t// because they represent IPv4 addresses embedded in IPv6 notation.\n\t\t// This is the correct behavior for firewall rules.\n\t\t{\"IPv4-mapped IPv6\", \"::ffff:192.168.1.1\", utils.IPV4, false},\n\t\t{\"IPv4-mapped IPv6 zeros\", \"::ffff:0.0.0.0\", utils.IPV4, false},\n\n\t\t// Invalid addresses\n\t\t{\"empty string\", \"\", 0, true},\n\t\t{\"random text\", \"not-an-ip\", 0, true},\n\t\t{\"incomplete IPv4\", \"192.168.1\", 0, true},\n\t\t{\"IPv4 with port\", \"192.168.1.1:8080\", 0, true},\n\t\t{\"IPv6 with brackets\", \"[::1]\", 0, true},\n\t\t{\"overflow IPv4\", \"256.256.256.256\", 0, true},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tresult, err := utils.DetectIPType(tt.ip)\n\t\t\tif tt.hasError {\n\t\t\t\tif err == nil {\n\t\t\t\t\tt.Errorf(\"expected error for %s, got nil\", tt.ip)\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Errorf(\"unexpected error for %s: %v\", tt.ip, err)\n\t\t\t\t}\n\t\t\t\tif result != tt.expected {\n\t\t\t\t\tt.Errorf(\"for %s: expected %d, got %d\", tt.ip, tt.expected, result)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestIsIPv4(t *testing.T) {\n\ttests := []struct {\n\t\tname     string\n\t\tip       string\n\t\texpected bool\n\t}{\n\t\t{\"valid IPv4\", \"192.168.1.1\", true},\n\t\t{\"IPv4 loopback\", \"127.0.0.1\", true},\n\t\t{\"IPv6 loopback\", \"::1\", false},\n\t\t{\"IPv6 full\", \"2001:db8::1\", false},\n\t\t{\"IPv4-mapped IPv6\", \"::ffff:192.168.1.1\", true}, // Treated as IPv4\n\t\t{\"invalid\", \"not-an-ip\", false},\n\t\t{\"empty\", \"\", false},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tresult := utils.IsIPv4(tt.ip)\n\t\t\tif result != tt.expected {\n\t\t\t\tt.Errorf(\"IsIPv4(%s): expected %v, got %v\", tt.ip, tt.expected, result)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestIsIPv6(t *testing.T) {\n\ttests := []struct {\n\t\tname     string\n\t\tip       string\n\t\texpected bool\n\t}{\n\t\t{\"IPv6 loopback\", \"::1\", true},\n\t\t{\"IPv6 full\", \"2001:db8::1\", true},\n\t\t{\"IPv6 link-local\", \"fe80::1\", true},\n\t\t{\"IPv4-mapped IPv6\", \"::ffff:192.168.1.1\", false}, // Treated as IPv4\n\t\t{\"valid IPv4\", \"192.168.1.1\", false},\n\t\t{\"IPv4 loopback\", \"127.0.0.1\", false},\n\t\t{\"invalid\", \"not-an-ip\", false},\n\t\t{\"empty\", \"\", false},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tresult := utils.IsIPv6(tt.ip)\n\t\t\tif result != tt.expected {\n\t\t\t\tt.Errorf(\"IsIPv6(%s): expected %v, got %v\", tt.ip, tt.expected, result)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestGetCIDRMask(t *testing.T) {\n\ttests := []struct {\n\t\tname      string\n\t\tipType    utils.IPTYPE\n\t\trangeMode bool\n\t\texpected  string\n\t}{\n\t\t{\"IPv4 single host\", utils.IPV4, false, \"/32\"},\n\t\t{\"IPv4 range\", utils.IPV4, true, \"/25\"},\n\t\t{\"IPv6 single host\", utils.IPV6, false, \"/128\"},\n\t\t{\"IPv6 range\", utils.IPV6, true, \"/121\"},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tresult := utils.GetCIDRMask(tt.ipType, tt.rangeMode)\n\t\t\tif result != tt.expected {\n\t\t\t\tt.Errorf(\"GetCIDRMask(%d, %v): expected %s, got %s\", tt.ipType, tt.rangeMode, tt.expected, result)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestCIDRMaskConstants(t *testing.T) {\n\tif utils.IPv4SingleHost != \"/32\" {\n\t\tt.Errorf(\"IPv4SingleHost: expected /32, got %s\", utils.IPv4SingleHost)\n\t}\n\tif utils.IPv4AdjacentRange != \"/25\" {\n\t\tt.Errorf(\"IPv4AdjacentRange: expected /25, got %s\", utils.IPv4AdjacentRange)\n\t}\n\tif utils.IPv6SingleHost != \"/128\" {\n\t\tt.Errorf(\"IPv6SingleHost: expected /128, got %s\", utils.IPv6SingleHost)\n\t}\n\tif utils.IPv6AdjacentRange != \"/121\" {\n\t\tt.Errorf(\"IPv6AdjacentRange: expected /121, got %s\", utils.IPv6AdjacentRange)\n\t}\n}\n"
  },
  {
    "path": "nhp/test/ipv6_support_test.go",
    "content": "package test\n\nimport (\n\t\"net\"\n\t\"testing\"\n\n\t\"github.com/OpenNHP/opennhp/nhp/utils\"\n)\n\n// TestIPv6CIDRParsing verifies that IPv6 CIDR notation works correctly\nfunc TestIPv6CIDRParsing(t *testing.T) {\n\ttests := []struct {\n\t\tname        string\n\t\tip          string\n\t\tmask        string\n\t\texpectValid bool\n\t\texpectNet   string\n\t}{\n\t\t// IPv6 single host\n\t\t{\"IPv6 loopback /128\", \"::1\", \"/128\", true, \"::1/128\"},\n\t\t{\"IPv6 address /128\", \"2001:db8::1\", \"/128\", true, \"2001:db8::1/128\"},\n\t\t{\"IPv6 link-local /128\", \"fe80::1\", \"/128\", true, \"fe80::1/128\"},\n\n\t\t// IPv6 range (121-bit = 128 addresses)\n\t\t{\"IPv6 address /121\", \"2001:db8::1\", \"/121\", true, \"2001:db8::/121\"},\n\t\t{\"IPv6 loopback /121\", \"::1\", \"/121\", true, \"::/121\"},\n\n\t\t// IPv4 single host\n\t\t{\"IPv4 address /32\", \"192.168.1.1\", \"/32\", true, \"192.168.1.1/32\"},\n\t\t{\"IPv4 loopback /32\", \"127.0.0.1\", \"/32\", true, \"127.0.0.1/32\"},\n\n\t\t// IPv4 range (25-bit = 128 addresses)\n\t\t{\"IPv4 address /25\", \"192.168.1.1\", \"/25\", true, \"192.168.1.0/25\"},\n\t\t{\"IPv4 address /25 upper\", \"192.168.1.200\", \"/25\", true, \"192.168.1.128/25\"},\n\n\t\t// IPv6 any notation\n\t\t{\"IPv6 any\", \"::\", \"/0\", true, \"::/0\"},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\t_, ipNet, err := net.ParseCIDR(tt.ip + tt.mask)\n\t\t\tif tt.expectValid {\n\t\t\t\tif err != nil {\n\t\t\t\t\tt.Errorf(\"expected valid CIDR for %s%s, got error: %v\", tt.ip, tt.mask, err)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif ipNet.String() != tt.expectNet {\n\t\t\t\t\tt.Errorf(\"expected network %s, got %s\", tt.expectNet, ipNet.String())\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err == nil {\n\t\t\t\t\tt.Errorf(\"expected error for %s%s, got valid CIDR\", tt.ip, tt.mask)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n\n// TestIPv6AddressRangeSize verifies the /121 mask gives 128 addresses like /25 for IPv4\nfunc TestIPv6AddressRangeSize(t *testing.T) {\n\t// IPv4 /25 should have 128 addresses\n\t_, ipv4Net, _ := net.ParseCIDR(\"192.168.1.0/25\")\n\tipv4Size := addressCount(ipv4Net)\n\n\t// IPv6 /121 should also have 128 addresses\n\t_, ipv6Net, _ := net.ParseCIDR(\"2001:db8::/121\")\n\tipv6Size := addressCount(ipv6Net)\n\n\tif ipv4Size != 128 {\n\t\tt.Errorf(\"IPv4 /25 expected 128 addresses, got %d\", ipv4Size)\n\t}\n\n\tif ipv6Size != 128 {\n\t\tt.Errorf(\"IPv6 /121 expected 128 addresses, got %d\", ipv6Size)\n\t}\n\n\tif ipv4Size != ipv6Size {\n\t\tt.Errorf(\"IPv4 /25 (%d) and IPv6 /121 (%d) should have same address count\", ipv4Size, ipv6Size)\n\t}\n}\n\n// addressCount calculates the number of addresses in a network\nfunc addressCount(ipNet *net.IPNet) int {\n\tones, bits := ipNet.Mask.Size()\n\treturn 1 << (bits - ones)\n}\n\n// TestGetCIDRMaskIntegration tests the full flow of detecting IP type and getting mask\nfunc TestGetCIDRMaskIntegration(t *testing.T) {\n\ttests := []struct {\n\t\tname      string\n\t\tip        string\n\t\trangeMode bool\n\t\texpectIP  utils.IPTYPE\n\t\texpectNet string\n\t}{\n\t\t// Single host mode\n\t\t{\"IPv4 single host\", \"192.168.1.100\", false, utils.IPV4, \"192.168.1.100/32\"},\n\t\t{\"IPv6 single host\", \"2001:db8::100\", false, utils.IPV6, \"2001:db8::100/128\"},\n\n\t\t// Range mode - note: ParseCIDR returns the network with host bits masked\n\t\t{\"IPv4 range\", \"192.168.1.100\", true, utils.IPV4, \"192.168.1.0/25\"},\n\t\t{\"IPv6 range\", \"2001:db8::1\", true, utils.IPV6, \"2001:db8::/121\"},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\t// Step 1: Detect IP type\n\t\t\tipType, err := utils.DetectIPType(tt.ip)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"DetectIPType failed for %s: %v\", tt.ip, err)\n\t\t\t}\n\t\t\tif ipType != tt.expectIP {\n\t\t\t\tt.Errorf(\"expected IP type %d, got %d\", tt.expectIP, ipType)\n\t\t\t}\n\n\t\t\t// Step 2: Get appropriate CIDR mask\n\t\t\tmask := utils.GetCIDRMask(ipType, tt.rangeMode)\n\n\t\t\t// Step 3: Parse CIDR\n\t\t\t_, ipNet, err := net.ParseCIDR(tt.ip + mask)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"ParseCIDR failed for %s%s: %v\", tt.ip, mask, err)\n\t\t\t}\n\n\t\t\tif ipNet.String() != tt.expectNet {\n\t\t\t\tt.Errorf(\"expected network %s, got %s\", tt.expectNet, ipNet.String())\n\t\t\t}\n\t\t})\n\t}\n}\n\n// TestIPSetNameSelection verifies correct ipset name selection for IPv4/IPv6\nfunc TestIPSetNameSelection(t *testing.T) {\n\t// We can't create actual ipsets, but we can verify the naming logic\n\ttests := []struct {\n\t\tname       string\n\t\tipType     utils.IPTYPE\n\t\tsetType    int\n\t\texpectName string\n\t}{\n\t\t// Default set (type 1)\n\t\t{\"IPv4 default set\", utils.IPV4, 1, \"defaultset\"},\n\t\t{\"IPv6 default set\", utils.IPV6, 1, \"defaultset_v6\"},\n\n\t\t// Temp set (type 4)\n\t\t{\"IPv4 temp set\", utils.IPV4, 4, \"tempset\"},\n\t\t{\"IPv6 temp set\", utils.IPV6, 4, \"tempset_v6\"},\n\t}\n\n\t// Create a mock IPSet to test GetIpsetName\n\tipset := &utils.IPSet{}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tname := ipset.GetIpsetName(tt.ipType, tt.setType)\n\t\t\tif name != tt.expectName {\n\t\t\t\tt.Errorf(\"expected ipset name %s, got %s\", tt.expectName, name)\n\t\t\t}\n\t\t})\n\t}\n}\n\n// TestIPv6AnyNotation verifies the correct \"any\" notation for IPv6\nfunc TestIPv6AnyNotation(t *testing.T) {\n\t// Correct notation is ::/0\n\t_, ipNet, err := net.ParseCIDR(\"::/0\")\n\tif err != nil {\n\t\tt.Fatalf(\"failed to parse ::/0: %v\", err)\n\t}\n\n\t// Verify it covers all IPv6 addresses\n\tif !ipNet.Contains(net.ParseIP(\"::1\")) {\n\t\tt.Error(\"::/0 should contain ::1\")\n\t}\n\tif !ipNet.Contains(net.ParseIP(\"2001:db8::1\")) {\n\t\tt.Error(\"::/0 should contain 2001:db8::1\")\n\t}\n\tif !ipNet.Contains(net.ParseIP(\"fe80::1\")) {\n\t\tt.Error(\"::/0 should contain fe80::1\")\n\t}\n\n\t// Old incorrect notation should also parse but we prefer the canonical form\n\t_, ipNetOld, err := net.ParseCIDR(\"0:0:0:0:0:0:0:0/0\")\n\tif err != nil {\n\t\tt.Fatalf(\"failed to parse old notation: %v\", err)\n\t}\n\n\t// Both should be equivalent\n\tif ipNet.String() != ipNetOld.String() {\n\t\tt.Logf(\"Note: ::/0 normalizes to %s, old notation normalizes to %s\", ipNet.String(), ipNetOld.String())\n\t}\n}\n\n// TestIPv6EdgeCases tests edge cases in IPv6 handling\nfunc TestIPv6EdgeCases(t *testing.T) {\n\ttests := []struct {\n\t\tname    string\n\t\tip      string\n\t\tisIPv4  bool\n\t\tisIPv6  bool\n\t\tisValid bool\n\t}{\n\t\t// Standard cases\n\t\t{\"IPv4 standard\", \"192.168.1.1\", true, false, true},\n\t\t{\"IPv6 standard\", \"2001:db8::1\", false, true, true},\n\n\t\t// Edge cases\n\t\t{\"IPv6 all zeros\", \"::\", false, true, true},\n\t\t{\"IPv6 all ones\", \"ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff\", false, true, true},\n\t\t{\"IPv4 all zeros\", \"0.0.0.0\", true, false, true},\n\t\t{\"IPv4 all ones\", \"255.255.255.255\", true, false, true},\n\n\t\t// IPv4-mapped IPv6 (treated as IPv4 by Go's net package)\n\t\t{\"IPv4-mapped IPv6\", \"::ffff:192.168.1.1\", true, false, true},\n\n\t\t// Invalid\n\t\t{\"Empty string\", \"\", false, false, false},\n\t\t{\"Invalid format\", \"not-an-ip\", false, false, false},\n\t\t{\"IPv4 with extra octet\", \"192.168.1.1.1\", false, false, false},\n\t\t{\"IPv6 with too many groups\", \"2001:db8:1:2:3:4:5:6:7:8\", false, false, false},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tisIPv4 := utils.IsIPv4(tt.ip)\n\t\t\tisIPv6 := utils.IsIPv6(tt.ip)\n\n\t\t\tif isIPv4 != tt.isIPv4 {\n\t\t\t\tt.Errorf(\"IsIPv4(%s): expected %v, got %v\", tt.ip, tt.isIPv4, isIPv4)\n\t\t\t}\n\t\t\tif isIPv6 != tt.isIPv6 {\n\t\t\t\tt.Errorf(\"IsIPv6(%s): expected %v, got %v\", tt.ip, tt.isIPv6, isIPv6)\n\t\t\t}\n\n\t\t\t_, err := utils.DetectIPType(tt.ip)\n\t\t\tisValid := err == nil\n\t\t\tif isValid != tt.isValid {\n\t\t\t\tt.Errorf(\"DetectIPType(%s) valid: expected %v, got %v (err: %v)\", tt.ip, tt.isValid, isValid, err)\n\t\t\t}\n\t\t})\n\t}\n}\n\n// TestIPHashStringFormats verifies the hash string format for ipset rules\nfunc TestIPHashStringFormats(t *testing.T) {\n\t// These are the formats used in msghandler.go for ipset Add operations\n\ttests := []struct {\n\t\tname     string\n\t\tformat   string\n\t\texpected string\n\t}{\n\t\t// TCP format: src,port,dst\n\t\t{\"TCP with port\", \"192.168.1.1,80,10.0.0.1\", \"192.168.1.1,80,10.0.0.1\"},\n\t\t{\"TCP port range\", \"192.168.1.1,1-65535,10.0.0.1\", \"192.168.1.1,1-65535,10.0.0.1\"},\n\n\t\t// UDP format: src,udp:port,dst\n\t\t{\"UDP with port\", \"192.168.1.1,udp:53,10.0.0.1\", \"192.168.1.1,udp:53,10.0.0.1\"},\n\t\t{\"UDP port range\", \"192.168.1.1,udp:1-65535,10.0.0.1\", \"192.168.1.1,udp:1-65535,10.0.0.1\"},\n\n\t\t// ICMP format: src,icmp:type/code,dst\n\t\t{\"ICMP ping\", \"192.168.1.1,icmp:8/0,10.0.0.1\", \"192.168.1.1,icmp:8/0,10.0.0.1\"},\n\n\t\t// IPv6 formats\n\t\t{\"IPv6 TCP\", \"2001:db8::1,80,2001:db8::2\", \"2001:db8::1,80,2001:db8::2\"},\n\t\t{\"IPv6 UDP\", \"2001:db8::1,udp:53,2001:db8::2\", \"2001:db8::1,udp:53,2001:db8::2\"},\n\t\t// Note: ICMPv6 uses type 128 for Echo Request (not type 8 like ICMPv4)\n\t\t{\"IPv6 ICMP\", \"2001:db8::1,icmpv6:128/0,2001:db8::2\", \"2001:db8::1,icmpv6:128/0,2001:db8::2\"},\n\n\t\t// Net/port format for tempset\n\t\t{\"IPv4 net,port\", \"192.168.1.0/25,80\", \"192.168.1.0/25,80\"},\n\t\t{\"IPv6 net,port\", \"2001:db8::/121,80\", \"2001:db8::/121,80\"},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\t// Just verify the format is what we expect\n\t\t\tif tt.format != tt.expected {\n\t\t\t\tt.Errorf(\"format mismatch: got %s, want %s\", tt.format, tt.expected)\n\t\t\t}\n\t\t})\n\t}\n}\n\n// TestIPTablesStructFields verifies the IPTables struct has IPv6 fields\nfunc TestIPTablesStructFields(t *testing.T) {\n\t// Create an IPTables struct and verify IPv6 fields exist\n\tipt := &utils.IPTables{}\n\n\t// These fields should exist after our changes\n\t_ = ipt.Binary           // IPv4 iptables path\n\t_ = ipt.Binary6          // IPv6 ip6tables path\n\t_ = ipt.IPv6Available    // Whether ip6tables is available\n\t_ = ipt.AcceptInputMode  // IPv4 accept mode\n\t_ = ipt.AcceptInput6Mode // IPv6 accept mode\n\n\t// IPv4 policy fields\n\t_ = ipt.InputPolicy   // IPv4 INPUT chain policy\n\t_ = ipt.ForwardPolicy // IPv4 FORWARD chain policy\n\t_ = ipt.OutputPolicy  // IPv4 OUTPUT chain policy\n\n\t// IPv6 policy fields (new)\n\t_ = ipt.Input6Policy   // IPv6 INPUT chain policy\n\t_ = ipt.Forward6Policy // IPv6 FORWARD chain policy\n\t_ = ipt.Output6Policy  // IPv6 OUTPUT chain policy\n\n\t// Verify default values\n\tif ipt.IPv6Available != false {\n\t\tt.Error(\"IPv6Available should default to false\")\n\t}\n\tif ipt.Binary6 != \"\" {\n\t\tt.Error(\"Binary6 should default to empty string\")\n\t}\n\n\t// Verify IPv6 policy defaults (should be 0 = POLICY_ACCEPT by default)\n\tif ipt.Input6Policy != 0 {\n\t\tt.Errorf(\"Input6Policy should default to 0, got %d\", ipt.Input6Policy)\n\t}\n\tif ipt.Forward6Policy != 0 {\n\t\tt.Errorf(\"Forward6Policy should default to 0, got %d\", ipt.Forward6Policy)\n\t}\n\tif ipt.Output6Policy != 0 {\n\t\tt.Errorf(\"Output6Policy should default to 0, got %d\", ipt.Output6Policy)\n\t}\n}\n\n// TestCIDRMaskConstants verifies the CIDR mask constants are correct\nfunc TestCIDRMaskConstantsValues(t *testing.T) {\n\t// Verify constant values\n\tif utils.IPv4SingleHost != \"/32\" {\n\t\tt.Errorf(\"IPv4SingleHost should be /32, got %s\", utils.IPv4SingleHost)\n\t}\n\tif utils.IPv4AdjacentRange != \"/25\" {\n\t\tt.Errorf(\"IPv4AdjacentRange should be /25, got %s\", utils.IPv4AdjacentRange)\n\t}\n\tif utils.IPv6SingleHost != \"/128\" {\n\t\tt.Errorf(\"IPv6SingleHost should be /128, got %s\", utils.IPv6SingleHost)\n\t}\n\tif utils.IPv6AdjacentRange != \"/121\" {\n\t\tt.Errorf(\"IPv6AdjacentRange should be /121, got %s\", utils.IPv6AdjacentRange)\n\t}\n\n\t// Verify they produce valid CIDRs\n\ttestIPs := []struct {\n\t\tip   string\n\t\tmask string\n\t}{\n\t\t{\"192.168.1.1\", utils.IPv4SingleHost},\n\t\t{\"192.168.1.1\", utils.IPv4AdjacentRange},\n\t\t{\"2001:db8::1\", utils.IPv6SingleHost},\n\t\t{\"2001:db8::1\", utils.IPv6AdjacentRange},\n\t}\n\n\tfor _, test := range testIPs {\n\t\t_, _, err := net.ParseCIDR(test.ip + test.mask)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"failed to parse %s%s: %v\", test.ip, test.mask, err)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "nhp/test/log_test.go",
    "content": "package test\n\nimport (\n\t\"testing\"\n\t\"time\"\n\n\tlog \"github.com/OpenNHP/opennhp/nhp/log\"\n)\n\nfunc TestLog(t *testing.T) {\n\t// init logger\n\t//tlog := log.NewLogger(\"NHP-LogTest\", log.LogLevelDebug, \"\", \"logtest\")\n\t//log.SetGlobalLogger(tlog)\n\n\tfor i := 0; i < 3; i++ {\n\t\tlog.Info(\"Info log test\")\n\t\t//log.Debug(\"Debug log test\")\n\t\t//log.Critical(\"Critical log test\")\n\t\ttime.Sleep(5 * time.Second)\n\t}\n\tlog.Close()\n}\n"
  },
  {
    "path": "nhp/test/packet_test.go",
    "content": "package test\n\nimport (\n\t\"encoding/base64\"\n\t\"encoding/binary\"\n\t\"fmt\"\n\t\"testing\"\n\t\"unsafe\"\n\n\tcommon \"github.com/OpenNHP/opennhp/nhp/common\"\n\tcore \"github.com/OpenNHP/opennhp/nhp/core\"\n\t\"github.com/OpenNHP/opennhp/nhp/core/scheme/curve\"\n\t\"github.com/OpenNHP/opennhp/nhp/core/scheme/gmsm\"\n)\n\nfunc TestHeaderTypeAndSize(t *testing.T) {\n\tpkt := &core.Packet{\n\t\t//Content: []byte{0x18, 0xca, 0xba, 0xa6, 0x18, 0xcb, 0xba, 0xa4},\n\t\tContent: []byte{91, 89, 55, 86, 91, 88, 55, 25},\n\t}\n\n\ttp, sz := pkt.HeaderTypeAndSize()\n\n\tfmt.Printf(\"Header type: %d, payload size: %d\", tp, sz)\n}\n\nfunc TestHMAC(t *testing.T) {\n\tbuf := []byte{95, 205, 121, 55, 95, 204, 121, 100, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 115, 222, 224, 148, 163, 67, 89, 253, 194, 76, 203, 140, 48, 126, 226, 192, 141, 20, 34, 116, 14, 189, 159, 83, 219, 82, 88, 229, 146, 21, 229, 223, 208, 164, 174, 217, 154, 219, 90, 190, 140, 27, 9, 52, 89, 155, 197, 189, 145, 46, 69, 230, 45, 25, 127, 121, 196, 37, 112, 130, 155, 240, 47, 83, 25, 151, 82, 247, 255, 146, 54, 40, 8, 22, 33, 92, 112, 85, 158, 43, 170, 58, 165, 12, 161, 97, 195, 67, 178, 12, 205, 119, 98, 161, 5, 238, 75, 188, 12, 65, 35, 195, 197, 71, 12, 24, 0, 141, 27, 135, 228, 196, 136, 190, 195, 72, 246, 86, 65, 145, 95, 234, 80, 177, 91, 237, 186, 212, 231, 49, 118, 236, 156, 232, 5, 131, 218, 129, 213, 199, 46, 141, 47, 198, 4, 205, 31, 72, 91, 103, 125, 216, 54, 233, 222, 93, 203, 62, 96, 215, 42, 53, 147, 115, 69, 35, 151, 126, 249, 10, 38, 46, 89, 13, 146, 107, 14, 110, 109, 159, 19, 82, 95, 111, 104, 36, 251, 135, 148, 88, 231, 197, 131, 50, 254, 254, 249, 112, 125, 237, 19, 218, 198, 210, 207, 83, 75, 27, 117, 46, 176, 73, 65, 151, 40, 136, 133, 59, 32, 57, 51, 238, 222, 95, 134, 201, 21, 241, 153, 1, 176, 152, 179, 88, 118, 200, 130, 222, 210, 212, 11, 69, 229, 7, 56, 208, 241, 37, 148, 19, 111, 80, 221, 238, 247, 38, 88, 204, 43, 42, 13, 215, 25, 12, 100, 131, 34, 113, 100, 142, 170, 29, 20, 24, 196, 242, 46, 101, 3, 253, 111, 104, 25}\n\n\tvar header core.Header\n\tvar ciphers *core.CipherSuite\n\tvar serverEcdh core.Ecdh\n\n\tprk, _ := base64.StdEncoding.DecodeString(\"kgvvQaBGfHNWCbZMkFWS1K07BgRXlnOo7CHTZF1bsmI=\")\n\n\tflag := binary.BigEndian.Uint16(buf[10:12])\n\tif flag&common.NHP_FLAG_EXTENDEDLENGTH == 0 {\n\t\theader = (*curve.HeaderCurve)(unsafe.Pointer(&buf[0]))\n\t\tciphers = core.NewCipherSuite(common.CIPHER_SCHEME_CURVE)\n\t\tserverEcdh = core.ECDHFromKey(ciphers.EccType, prk)\n\t} else {\n\t\theader = (*gmsm.HeaderGmsm)(unsafe.Pointer(&buf[0]))\n\t\tciphers = core.NewCipherSuite(common.CIPHER_SCHEME_GMSM)\n\t\tserverEcdh = core.ECDHFromKey(ciphers.EccType, prk)\n\t}\n\n\thmacHash, err := core.NewHash(ciphers.HashType)\n\tif err != nil {\n\t\tfmt.Printf(\"Failed to create hash: %v\\n\", err)\n\t\treturn\n\t}\n\thmacHash.Write([]byte(core.InitialHashString))\n\thmacHash.Write(serverEcdh.PublicKey())\n\thmacHash.Write(buf[0 : header.Size()-core.HashSize])\n\tcalculatedHmac := hmacHash.Sum(nil)\n\n\tfmt.Printf(\"%v\\n\", calculatedHmac)\n\tfmt.Printf(\"%v\\n\", header.HMACBytes())\n}\n"
  },
  {
    "path": "nhp/test/pkcs7_test.go",
    "content": "package test\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n\n\t\"github.com/OpenNHP/opennhp/nhp/utils\"\n)\n\nfunc TestPKCS7Pad(t *testing.T) {\n\ttests := []struct {\n\t\tname      string\n\t\tdata      []byte\n\t\tblockSize int\n\t\texpected  []byte\n\t}{\n\t\t{\n\t\t\tname:      \"empty data\",\n\t\t\tdata:      []byte{},\n\t\t\tblockSize: 16,\n\t\t\texpected:  bytes.Repeat([]byte{16}, 16),\n\t\t},\n\t\t{\n\t\t\tname:      \"one byte\",\n\t\t\tdata:      []byte{0x01},\n\t\t\tblockSize: 16,\n\t\t\texpected:  append([]byte{0x01}, bytes.Repeat([]byte{15}, 15)...),\n\t\t},\n\t\t{\n\t\t\tname:      \"block size minus one\",\n\t\t\tdata:      bytes.Repeat([]byte{0xAA}, 15),\n\t\t\tblockSize: 16,\n\t\t\texpected:  append(bytes.Repeat([]byte{0xAA}, 15), []byte{1}...),\n\t\t},\n\t\t{\n\t\t\tname:      \"exact block size\",\n\t\t\tdata:      bytes.Repeat([]byte{0xBB}, 16),\n\t\t\tblockSize: 16,\n\t\t\texpected:  append(bytes.Repeat([]byte{0xBB}, 16), bytes.Repeat([]byte{16}, 16)...),\n\t\t},\n\t\t{\n\t\t\tname:      \"block size 8\",\n\t\t\tdata:      []byte{1, 2, 3, 4, 5},\n\t\t\tblockSize: 8,\n\t\t\texpected:  []byte{1, 2, 3, 4, 5, 3, 3, 3},\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tresult := utils.PKCS7Pad(tt.data, tt.blockSize)\n\t\t\tif !bytes.Equal(result, tt.expected) {\n\t\t\t\tt.Errorf(\"PKCS7Pad() = %v, want %v\", result, tt.expected)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestPKCS7Unpad(t *testing.T) {\n\ttests := []struct {\n\t\tname      string\n\t\tdata      []byte\n\t\tblockSize int\n\t\texpected  []byte\n\t}{\n\t\t{\n\t\t\tname:      \"full block padding\",\n\t\t\tdata:      bytes.Repeat([]byte{16}, 16),\n\t\t\tblockSize: 16,\n\t\t\texpected:  []byte{},\n\t\t},\n\t\t{\n\t\t\tname:      \"one byte padding\",\n\t\t\tdata:      append(bytes.Repeat([]byte{0xAA}, 15), []byte{1}...),\n\t\t\tblockSize: 16,\n\t\t\texpected:  bytes.Repeat([]byte{0xAA}, 15),\n\t\t},\n\t\t{\n\t\t\tname:      \"standard padding\",\n\t\t\tdata:      []byte{1, 2, 3, 4, 5, 3, 3, 3},\n\t\t\tblockSize: 8,\n\t\t\texpected:  []byte{1, 2, 3, 4, 5},\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tresult := utils.PKCS7Unpad(tt.data, tt.blockSize)\n\t\t\tif !bytes.Equal(result, tt.expected) {\n\t\t\t\tt.Errorf(\"PKCS7Unpad() = %v, want %v\", result, tt.expected)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestPKCS7UnpadInvalid(t *testing.T) {\n\ttests := []struct {\n\t\tname      string\n\t\tdata      []byte\n\t\tblockSize int\n\t}{\n\t\t{\n\t\t\tname:      \"empty data\",\n\t\t\tdata:      []byte{},\n\t\t\tblockSize: 16,\n\t\t},\n\t\t{\n\t\t\tname:      \"padding byte larger than block size\",\n\t\t\tdata:      []byte{1, 2, 3, 4, 5, 6, 7, 17},\n\t\t\tblockSize: 8,\n\t\t},\n\t\t{\n\t\t\tname:      \"zero padding\",\n\t\t\tdata:      []byte{1, 2, 3, 4, 5, 6, 7, 0},\n\t\t\tblockSize: 8,\n\t\t},\n\t\t{\n\t\t\tname:      \"inconsistent padding bytes\",\n\t\t\tdata:      []byte{1, 2, 3, 4, 5, 3, 2, 3},\n\t\t\tblockSize: 8,\n\t\t},\n\t\t{\n\t\t\tname:      \"padding larger than data length\",\n\t\t\tdata:      []byte{1, 2, 5},\n\t\t\tblockSize: 8,\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tresult := utils.PKCS7Unpad(tt.data, tt.blockSize)\n\t\t\tif result != nil {\n\t\t\t\tt.Errorf(\"PKCS7Unpad() = %v, want nil for invalid padding\", result)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestPKCS7RoundTrip(t *testing.T) {\n\ttestCases := [][]byte{\n\t\t{},\n\t\t{1},\n\t\t{1, 2, 3, 4, 5},\n\t\tbytes.Repeat([]byte{0xAB}, 15),\n\t\tbytes.Repeat([]byte{0xCD}, 16),\n\t\tbytes.Repeat([]byte{0xEF}, 17),\n\t\tbytes.Repeat([]byte{0x12}, 100),\n\t}\n\n\tfor _, original := range testCases {\n\t\tpadded := utils.PKCS7Pad(original, 16)\n\t\tif len(padded)%16 != 0 {\n\t\t\tt.Errorf(\"padded length %d is not multiple of 16\", len(padded))\n\t\t}\n\n\t\tunpadded := utils.PKCS7Unpad(padded, 16)\n\t\tif !bytes.Equal(unpadded, original) {\n\t\t\tt.Errorf(\"round trip failed: original=%v, got=%v\", original, unpadded)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "nhp/test/tokenstore_test.go",
    "content": "package test\n\nimport (\n\t\"sync\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/OpenNHP/opennhp/nhp/common\"\n)\n\n// testEntry is a simple implementation of common.TokenEntry for testing.\ntype testEntry struct {\n\tvalue      string\n\texpireTime time.Time\n}\n\nfunc (e *testEntry) GetExpireTime() time.Time {\n\treturn e.expireTime\n}\n\nfunc TestTokenStore_StoreAndLoad(t *testing.T) {\n\tts := common.NewTokenStore[*testEntry]()\n\n\tentry := &testEntry{value: \"test-value\", expireTime: time.Now().Add(1 * time.Hour)}\n\ttoken := \"abcd1234token\"\n\n\tts.Store(token, entry)\n\n\tloaded, found := ts.Load(token)\n\tif !found {\n\t\tt.Fatal(\"expected to find stored token\")\n\t}\n\tif loaded.value != \"test-value\" {\n\t\tt.Errorf(\"expected value 'test-value', got '%s'\", loaded.value)\n\t}\n}\n\nfunc TestTokenStore_LoadNotFound(t *testing.T) {\n\tts := common.NewTokenStore[*testEntry]()\n\n\t_, found := ts.Load(\"nonexistent\")\n\tif found {\n\t\tt.Error(\"expected not to find nonexistent token\")\n\t}\n}\n\nfunc TestTokenStore_Delete(t *testing.T) {\n\tts := common.NewTokenStore[*testEntry]()\n\n\tentry := &testEntry{value: \"test\", expireTime: time.Now().Add(1 * time.Hour)}\n\ttoken := \"token-to-delete\"\n\n\tts.Store(token, entry)\n\tts.Delete(token)\n\n\t_, found := ts.Load(token)\n\tif found {\n\t\tt.Error(\"expected token to be deleted\")\n\t}\n}\n\nfunc TestTokenStore_CleanExpired(t *testing.T) {\n\tts := common.NewTokenStore[*testEntry]()\n\n\t// Add an expired entry\n\texpiredEntry := &testEntry{value: \"expired\", expireTime: time.Now().Add(-1 * time.Hour)}\n\tts.Store(\"expired-token\", expiredEntry)\n\n\t// Add a valid entry\n\tvalidEntry := &testEntry{value: \"valid\", expireTime: time.Now().Add(1 * time.Hour)}\n\tts.Store(\"valid-token\", validEntry)\n\n\tif ts.Size() != 2 {\n\t\tt.Errorf(\"expected size 2, got %d\", ts.Size())\n\t}\n\n\tremoved := ts.CleanExpired()\n\tif removed != 1 {\n\t\tt.Errorf(\"expected 1 removed, got %d\", removed)\n\t}\n\n\tif ts.Size() != 1 {\n\t\tt.Errorf(\"expected size 1 after cleanup, got %d\", ts.Size())\n\t}\n\n\t// Verify expired token is gone\n\t_, found := ts.Load(\"expired-token\")\n\tif found {\n\t\tt.Error(\"expected expired token to be removed\")\n\t}\n\n\t// Verify valid token still exists\n\t_, found = ts.Load(\"valid-token\")\n\tif !found {\n\t\tt.Error(\"expected valid token to still exist\")\n\t}\n}\n\nfunc TestTokenStore_Size(t *testing.T) {\n\tts := common.NewTokenStore[*testEntry]()\n\n\tif ts.Size() != 0 {\n\t\tt.Errorf(\"expected empty store to have size 0, got %d\", ts.Size())\n\t}\n\n\tfor i := 0; i < 100; i++ {\n\t\ttoken := string(rune('A'+i%26)) + \"token\" + string(rune('0'+i%10))\n\t\tentry := &testEntry{value: token, expireTime: time.Now().Add(1 * time.Hour)}\n\t\tts.Store(token, entry)\n\t}\n\n\tif ts.Size() != 100 {\n\t\tt.Errorf(\"expected size 100, got %d\", ts.Size())\n\t}\n}\n\nfunc TestTokenStore_ConcurrentAccess(t *testing.T) {\n\tts := common.NewTokenStore[*testEntry]()\n\tvar wg sync.WaitGroup\n\n\t// Concurrent writes\n\tfor i := 0; i < 100; i++ {\n\t\twg.Add(1)\n\t\tgo func(n int) {\n\t\t\tdefer wg.Done()\n\t\t\ttoken := string(rune('A'+n%26)) + \"concurrent\" + string(rune('0'+n%10))\n\t\t\tentry := &testEntry{value: token, expireTime: time.Now().Add(1 * time.Hour)}\n\t\t\tts.Store(token, entry)\n\t\t}(i)\n\t}\n\twg.Wait()\n\n\t// Concurrent reads\n\tfor i := 0; i < 100; i++ {\n\t\twg.Add(1)\n\t\tgo func(n int) {\n\t\t\tdefer wg.Done()\n\t\t\ttoken := string(rune('A'+n%26)) + \"concurrent\" + string(rune('0'+n%10))\n\t\t\tts.Load(token)\n\t\t}(i)\n\t}\n\twg.Wait()\n\n\t// Concurrent deletes\n\tfor i := 0; i < 50; i++ {\n\t\twg.Add(1)\n\t\tgo func(n int) {\n\t\t\tdefer wg.Done()\n\t\t\ttoken := string(rune('A'+n%26)) + \"concurrent\" + string(rune('0'+n%10))\n\t\t\tts.Delete(token)\n\t\t}(i)\n\t}\n\twg.Wait()\n}\n\nfunc TestTokenStore_TwoLevelIndexing(t *testing.T) {\n\tts := common.NewTokenStore[*testEntry]()\n\n\t// Store tokens with different first characters\n\ttokens := []string{\"Atoken1\", \"Btoken2\", \"Atoken3\", \"Ctoken4\", \"Atoken5\"}\n\tfor _, token := range tokens {\n\t\tentry := &testEntry{value: token, expireTime: time.Now().Add(1 * time.Hour)}\n\t\tts.Store(token, entry)\n\t}\n\n\t// All should be loadable\n\tfor _, token := range tokens {\n\t\tloaded, found := ts.Load(token)\n\t\tif !found {\n\t\t\tt.Errorf(\"expected to find token '%s'\", token)\n\t\t}\n\t\tif loaded.value != token {\n\t\t\tt.Errorf(\"expected value '%s', got '%s'\", token, loaded.value)\n\t\t}\n\t}\n\n\t// Delete one and verify others still exist\n\tts.Delete(\"Atoken3\")\n\t_, found := ts.Load(\"Atoken3\")\n\tif found {\n\t\tt.Error(\"expected Atoken3 to be deleted\")\n\t}\n\n\t// Other 'A' tokens should still exist\n\t_, found = ts.Load(\"Atoken1\")\n\tif !found {\n\t\tt.Error(\"expected Atoken1 to still exist\")\n\t}\n\t_, found = ts.Load(\"Atoken5\")\n\tif !found {\n\t\tt.Error(\"expected Atoken5 to still exist\")\n\t}\n}\n"
  },
  {
    "path": "nhp/test/utils_test.go",
    "content": "package test\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"strings\"\n\t\"testing\"\n\n\tlog \"github.com/OpenNHP/opennhp/nhp/log\"\n\tutils \"github.com/OpenNHP/opennhp/nhp/utils\"\n)\n\nfunc TestUUID(t *testing.T) {\n\tuuid, err := utils.NewUUID()\n\tif err != nil {\n\t\tfmt.Println(\"error: \", err)\n\t\treturn\n\t}\n\n\tfmt.Println(\"uuid: \", uuid)\n}\n\nfunc TestGenerateUUIDv4(t *testing.T) {\n\tuuid, err := utils.GenerateUUIDv4()\n\tif err != nil {\n\t\tfmt.Println(\"error: \", err)\n\t\treturn\n\t}\n\n\tfmt.Println(\"uuid: \", uuid)\n}\n\nfunc TestIPTables(t *testing.T) {\n\tiptables, err := utils.NewIPTables()\n\n\tif err != nil {\n\t\tfmt.Printf(\"error: %v\\n\", err)\n\t}\n\n\tfmt.Printf(\"iptables: %+v\", iptables)\n}\n\nfunc TestPanicCatch(t *testing.T) {\n\ttlog := log.NewLogger(\"NHP-LogTest\", log.LogLevelDebug, \"\", \"logtest\")\n\tlog.SetGlobalLogger(tlog)\n\n\tfunc() {\n\t\tdefer func() {\n\t\t\tfmt.Println(\"defer function returns 0\")\n\t\t}()\n\n\t\tdefer utils.CatchPanicThenRun(func() {\n\t\t\tfmt.Println(\"panic caught###\")\n\t\t})\n\n\t\tdefer func() {\n\t\t\tfmt.Println(\"defer function returns 1\")\n\t\t}()\n\n\t\tfmt.Println(\"function starts\")\n\n\t\tpanic(1)\n\t}()\n}\n\nfunc TestUpdateTomlConfig(t *testing.T) {\n\ttempFile, err := os.CreateTemp(\"\", \"config-*.toml\")\n\tif err != nil {\n\t\tt.Fatalf(\"can't create temporary file: %v\", err)\n\t}\n\tdefer os.Remove(tempFile.Name())\n\n\tinitialContent := `# NHP-Agent base config\n# field with (-) does not support dynamic update\n\n# PrivateKeyBase64 (-): agent private key in base64 format.\n# TEEPrivateKeyBase64 (-): TEE private key in base64 format.\n# DefaultCipherScheme: 0: curve25519, 1: gmsm.\n# UserId: specify the user id this agent represents.\n# OrganizationId: specify the organization id this agent represents.\n# LogLevel: 0: silent, 1: error, 2: info, 3: audit, 4: debug, 5: trace.\nPrivateKeyBase64 = \"lDaE1EKKyIJG4A28IZup/GDBZWYWEPZqGFaoV4Rlnn0=\"\nDefaultCipherScheme = 0\nUserId = \"agent-0\"\nOrganizationId = \"opennhp.org\"\nLogLevel = 4\n# UserData: a customized user entry for flexibility.\n# Its key-value pairs will be send to server along with knock message.\n[UserData]\n\"ExampleKey0\" = \"StringValue\"\n\"ExampleKey1\" = 1\n\"ExampleKey2\" = true\n`\n\t_, writeErr := tempFile.WriteString(initialContent)\n\tif writeErr != nil {\n\t\tt.Fatalf(\"can't write into temporary file: %v\", writeErr)\n\t}\n\ttempFile.Close()\n\n\tupdateErr := utils.UpdateTomlConfig(tempFile.Name(), \"PrivateKeyBase64\", \"+Jnee2lP6Kn47qzSaqwSmWxORsBkkCV6YHsRqXM23Vo=\")\n\tif updateErr != nil {\n\t\tt.Fatalf(\"can't update toml config: %v\", updateErr)\n\t}\n\n\tcontent, err := os.ReadFile(tempFile.Name())\n\tif err != nil {\n\t\tt.Fatalf(\"can't read temporary file: %v\", err)\n\t}\n\n\tif !strings.Contains(string(content), \"PrivateKeyBase64 = \\\"+Jnee2lP6Kn47qzSaqwSmWxORsBkkCV6YHsRqXM23Vo=\\\"\") {\n\t\tt.Fatalf(\"can't find updated value in temporary file\")\n\t}\n}\n"
  },
  {
    "path": "nhp/utils/cache.go",
    "content": "package utils\n\nimport (\n\t\"strings\"\n\n\t\"github.com/coocood/freecache\"\n)\n\nconst (\n\tCACHESIZE                = 1 * 1024 * 1024 // Note value size larger than 1/1024 of total cache size will not be cached\n\tEXPIRE_GRPC_DNS          = 60 * 60 * 2\n\tEXPIRE_GRPC_SMARTSENCE   = 60 * 60 * 2\n\tEXPIRE_LINKER_LEASE      = 60 * 5\n\tEXPIRE_LOG_TIMEGAP       = 5 // Interval for logging output, using seconds as the unit.\n\tEXPIRE_LINKER_PEER       = 60\n\tEXPIRE_PEER_POLICY_IP    = 10\n\tEXPIRE_USER_FORBIDDEN_IP = 10\n\tEXPIRE                   = 0\n)\n\nvar cacheStore *freecache.Cache\n\nfunc init() {\n\tcacheStore = freecache.NewCache(CACHESIZE)\n}\n\nfunc FormatCacheKey(strs ...string) string {\n\tif len(strs) == 0 {\n\t\treturn \"\"\n\t}\n\n\treturn strings.Join(strs, \"/\")\n}\n\nfunc CacheWriteValue(key, value string, timeout int) error {\n\terr := cacheStore.Set([]byte(key), []byte(value), timeout)\n\treturn err\n}\n\nfunc CacheReadValue(key string) string {\n\tres, err := cacheStore.Get([]byte(key))\n\tif err != nil || len(res) == 0 {\n\t\treturn \"\"\n\t}\n\n\treturn string(res)\n}\n\nfunc CacheDeleteValue(key string) bool {\n\tok := cacheStore.Del([]byte(key))\n\treturn ok\n}\n"
  },
  {
    "path": "nhp/utils/cmd.go",
    "content": "package utils\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"fmt\"\n\t\"log\"\n\t\"os/exec\"\n\t\"strings\"\n\t\"time\"\n)\n\nfunc Run(command string, in string, args ...string) (string, string, error) {\n\tctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)\n\tdefer cancel()\n\tc := make(chan string)\n\tdefer close(c)\n\tvar stderr bytes.Buffer\n\tvar stdout bytes.Buffer\n\n\tcmd := exec.CommandContext(ctx, command, args...) //nolint:gosec // G204: Command args passed as separate parameters, not shell string\n\tcmd.Stderr = &stderr\n\tcmd.Stdout = &stdout\n\tif len(in) > 0 {\n\t\tcmd.Stdin = strings.NewReader(in)\n\t}\n\terr := cmd.Run()\n\tif err != nil {\n\t\treturn \"\", cmd.String(), err\n\t}\n\tif stderr.String() != \"\" {\n\t\tlog.Println(stderr.String())\n\t\treturn \"\", cmd.String(), fmt.Errorf(\"%s\", stderr.String())\n\t}\n\n\tres := strings.Replace(stdout.String(), \"\\n\", \"\", -1)\n\treturn res, cmd.String(), nil\n}\n"
  },
  {
    "path": "nhp/utils/compress.go",
    "content": "package utils\n\nimport (\n\t\"bytes\"\n\t\"compress/gzip\"\n\t\"encoding/base64\"\n\t\"io\"\n)\n\nfunc Compression(data string) ([]byte, error) {\n\tvar buf bytes.Buffer\n\tgzwriter := gzip.NewWriter(&buf)\n\n\t_, err := gzwriter.Write([]byte(data))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\terr = gzwriter.Close()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn buf.Bytes(), nil\n}\n\nfunc Decompression(data string) (string, error) {\n\tdataBytes, err := base64.StdEncoding.DecodeString(data)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\treader := bytes.NewReader(dataBytes)\n\tgzreader, err := gzip.NewReader(reader)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\tdefer gzreader.Close()\n\n\toutput, err := io.ReadAll(gzreader)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\treturn string(output), nil\n}\n"
  },
  {
    "path": "nhp/utils/constant.go",
    "content": "package utils\n"
  },
  {
    "path": "nhp/utils/crypto.go",
    "content": "package utils\n\nimport (\n\t\"bytes\"\n\t\"crypto/hmac\"\n\t\"crypto/md5\"\n\t\"crypto/rand\"\n\t\"crypto/rsa\"\n\t\"crypto/sha256\"\n\t\"crypto/x509\"\n\t\"encoding/base64\"\n\t\"encoding/hex\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n)\n\n// PKCS7Pad adds PKCS#7 padding to data to make it a multiple of blockSize.\n// PKCS#5 is a subset of PKCS#7 with a fixed block size of 8 bytes.\n// This implementation works for any block size (typically 8 or 16 bytes).\nfunc PKCS7Pad(data []byte, blockSize int) []byte {\n\tpadding := blockSize - len(data)%blockSize\n\tpadText := bytes.Repeat([]byte{byte(padding)}, padding)\n\treturn append(data, padText...)\n}\n\n// PKCS7Unpad removes PKCS#7 padding from data.\n// Returns nil if the padding is invalid.\nfunc PKCS7Unpad(data []byte, blockSize int) []byte {\n\tlength := len(data)\n\tif length == 0 {\n\t\treturn nil\n\t}\n\tunpadLen := int(data[length-1])\n\tif unpadLen > blockSize || unpadLen > length || unpadLen == 0 {\n\t\treturn nil\n\t}\n\t// Verify padding bytes are all the same value\n\tfor i := length - unpadLen; i < length; i++ {\n\t\tif data[i] != byte(unpadLen) {\n\t\t\treturn nil\n\t\t}\n\t}\n\treturn data[:length-unpadLen]\n}\n\n// pkcs5Padding is an alias for PKCS7Pad for backward compatibility.\n// Deprecated: Use PKCS7Pad instead.\nfunc pkcs5Padding(ciphertext []byte, blockSize int) []byte {\n\treturn PKCS7Pad(ciphertext, blockSize)\n}\n\n// pkcs5UnPadding is an alias for PKCS7Unpad for backward compatibility.\n// Deprecated: Use PKCS7Unpad instead.\nfunc pkcs5UnPadding(origData []byte) []byte {\n\treturn PKCS7Unpad(origData, 16) // Default to AES block size\n}\n\nfunc HMACSha256(key, value string) []byte {\n\tvar secretKey = []byte(key)\n\th := hmac.New(sha256.New, secretKey)\n\th.Write([]byte(value))\n\n\thash := h.Sum(nil)\n\n\treturn hash\n}\n\n//nolint:gosec // G401: MD5 used for non-cryptographic checksums, not for security\nfunc MD5(value string) string {\n\t_16bytes := md5.Sum([]byte(value))\n\treturn hex.EncodeToString(_16bytes[:])\n}\n\nfunc Base64(value []byte) string {\n\treturn base64.StdEncoding.EncodeToString(value)\n}\n\nfunc GenerateRsaKey(bits int) (string, string) {\n\t// Generate private key.\n\tprivateKey, err := rsa.GenerateKey(rand.Reader, bits)\n\tif err != nil {\n\t\treturn \"\", \"\"\n\t}\n\tpivKey := x509.MarshalPKCS1PrivateKey(privateKey)\n\tpubKey := x509.MarshalPKCS1PublicKey(&privateKey.PublicKey)\n\n\treturn base64.StdEncoding.EncodeToString(pivKey), base64.StdEncoding.EncodeToString(pubKey)\n}\n\n// Md5sum computes MD5 checksum for file integrity verification (not cryptographic security)\n//\n//nolint:gosec // G401: MD5 used for file integrity checksums, not for cryptographic security\nfunc Md5sum(fullFilePath string) (string, error) {\n\tfileInfo, err := os.Stat(fullFilePath)\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"file not found: %w\", err)\n\t}\n\n\tif !fileInfo.Mode().IsRegular() {\n\t\treturn \"\", fmt.Errorf(\"path is not a regular file\")\n\t}\n\n\tfile, err := os.Open(fullFilePath) //nolint:gosec // G304: Path validated by os.Stat above\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"failed to open file: %w\", err)\n\t}\n\tdefer file.Close()\n\n\thasher := md5.New()\n\n\tif _, err := io.Copy(hasher, file); err != nil {\n\t\treturn \"\", fmt.Errorf(\"failed to read file content: %w\", err)\n\t}\n\n\t// Convert hash to hex string\n\treturn hex.EncodeToString(hasher.Sum(nil)), nil\n}\n"
  },
  {
    "path": "nhp/utils/crypto_test.go",
    "content": "package utils\n\nimport (\n\t\"fmt\"\n\t\"testing\"\n)\n\nfunc TestRSAKeys(t *testing.T) {\n\tprivKeyStr, pubKeyStr := GenerateRsaKey(1000)\n\n\tfmt.Println(\"private key: \", privKeyStr)\n\tfmt.Println(\"private key length: \", len(privKeyStr))\n\tfmt.Println(\"public key: \", pubKeyStr)\n\tfmt.Println(\"public key length\", len(pubKeyStr))\n}\n"
  },
  {
    "path": "nhp/utils/ebpf/ebpf.go",
    "content": "package ebpf\n\nimport (\n\t\"encoding/binary\"\n\t\"fmt\"\n\t\"net\"\n\t\"strconv\"\n\n\t\"github.com/cilium/ebpf\"\n\n\t\"github.com/OpenNHP/opennhp/nhp/log\"\n)\n\ntype whitelistKey struct {\n\tSrcIP    uint32 `ebpf:\"src_ip\"`\n\tDstIP    uint32 `ebpf:\"dst_ip\"`\n\tDstPort  uint16 `ebpf:\"dst_port\"`\n\tProtocol uint8  `ebpf:\"protocol\"`\n}\n\ntype srcDestKey struct {\n\tSrcIP uint32 `ebpf:\"src_ip\"`\n\tDstIP uint32 `ebpf:\"dst_ip\"`\n}\n\ntype portListKey struct {\n\tSrcIP        uint32 `ebpf:\"src_ip\"`\n\tDstPortStart uint16 `ebpf:\"dst_port_start\"`\n\tDstPortEnd   uint16 `ebpf:\"dst_port_end\"`\n}\n\ntype srcIPdstPortKey struct {\n\tSrcIP   uint32 `ebpf:\"src_ip\"`\n\tDstPort uint16 `ebpf:\"dst_port\"`\n}\n\ntype procoPortKey struct {\n\tDstPort  uint16 `ebpf:\"dst_port\"`\n\tProtocol uint8  `ebpf:\"protocol\"`\n}\n\ntype whitelistValue struct {\n\tAllowed    uint8\n\t_          [7]byte\n\tExpireTime uint64\n}\n\ntype procoPortValue struct {\n\tAllowed    uint8\n\tExpireTime uint64\n}\n\nconst (\n\tMapTypeWhitelist     = 1\n\tMapTypeSdWhitelist   = 2\n\tMapTypeIcmpWhitelist = 3\n\tMapTypeSrcAndPort    = 4\n\tMapTypeSrcPortList   = 5\n\tMapTypeProtocolPort  = 6\n)\n\ntype EbpfRuleParams struct {\n\tSrcIP        string\n\tDstIP        string\n\tDstPort      int\n\tDstPortStart int\n\tDstPortEnd   int\n\tProtocol     string\n}\n\nfunc (r *whitelistKey) ToWlKey() []byte {\n\tkeyBytes := make([]byte, 11)\n\tbinary.LittleEndian.PutUint32(keyBytes[0:4], r.SrcIP)\n\tbinary.LittleEndian.PutUint32(keyBytes[4:8], r.DstIP)\n\tbinary.BigEndian.PutUint16(keyBytes[8:10], r.DstPort)\n\tkeyBytes[10] = r.Protocol\n\treturn keyBytes\n}\n\nfunc (r *whitelistKey) ToWlValue(ttlSec uint64) whitelistValue {\n\tnow, _ := getBootTimeNanos()\n\treturn whitelistValue{\n\t\tAllowed:    1,\n\t\tExpireTime: now + ttlSec*1e9,\n\t}\n}\n\nfunc (r *srcDestKey) ToSdKey() []byte {\n\tkeyBytes := make([]byte, 8)\n\tbinary.LittleEndian.PutUint32(keyBytes[0:4], r.SrcIP)\n\tbinary.LittleEndian.PutUint32(keyBytes[4:8], r.DstIP)\n\treturn keyBytes\n}\n\nfunc (r *srcDestKey) ToSdValue(ttlSec uint64) whitelistValue {\n\tnow, _ := getBootTimeNanos()\n\treturn whitelistValue{\n\t\tAllowed:    1,\n\t\tExpireTime: now + ttlSec*1e9,\n\t}\n}\n\nfunc (r *procoPortKey) ToPpKey() []byte {\n\tkeyBytes := make([]byte, 3)\n\tbinary.LittleEndian.PutUint16(keyBytes[0:2], r.DstPort)\n\tkeyBytes[2] = r.Protocol\n\treturn keyBytes\n}\n\nfunc (r *procoPortKey) ToPpValue(ttlSec uint64) procoPortValue {\n\tnow, _ := getBootTimeNanos()\n\treturn procoPortValue{\n\t\tAllowed:    1,\n\t\tExpireTime: now + ttlSec*1e9,\n\t}\n}\n\nfunc (r *portListKey) ToPlKey() []byte {\n\tkeyBytes := make([]byte, 8)\n\tbinary.LittleEndian.PutUint32(keyBytes[0:4], r.SrcIP)\n\tbinary.LittleEndian.PutUint16(keyBytes[4:6], r.DstPortStart)\n\tbinary.LittleEndian.PutUint16(keyBytes[6:8], r.DstPortEnd)\n\treturn keyBytes\n}\n\nfunc (r *portListKey) ToPlValue(ttlSec uint64) whitelistValue {\n\tnow, _ := getBootTimeNanos()\n\treturn whitelistValue{\n\t\tAllowed:    1,\n\t\tExpireTime: now + ttlSec*1e9,\n\t}\n}\n\nfunc (r *srcIPdstPortKey) ToSpKey() []byte {\n\tkeyBytes := make([]byte, 6)\n\tbinary.LittleEndian.PutUint32(keyBytes[0:4], r.SrcIP)\n\tbinary.LittleEndian.PutUint16(keyBytes[4:6], r.DstPort)\n\treturn keyBytes\n}\n\nfunc (r *srcIPdstPortKey) ToSpValue(ttlSec uint64) whitelistValue {\n\tnow, _ := getBootTimeNanos()\n\treturn whitelistValue{\n\t\tAllowed:    1,\n\t\tExpireTime: now + ttlSec*1e9,\n\t}\n}\n\n// function for update whitelist map\nfunc AddWhitelistRule(whitelistMap *ebpf.Map, rule *whitelistKey, ttlSec uint64) error {\n\tkeyBytes := rule.ToWlKey()\n\tvalue := rule.ToWlValue(ttlSec)\n\n\tif err := whitelistMap.Update(keyBytes, &value, ebpf.UpdateAny); err != nil {\n\t\tlog.Error(\"failed to update whitelist map: %v\", err)\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// function for update sdwhitelist map\nfunc AddSdWhitelistRule(whitelistMap *ebpf.Map, rule *srcDestKey, ttlSec uint64) error {\n\tkeyBytes := rule.ToSdKey()\n\tvalue := rule.ToSdValue(ttlSec)\n\n\tif err := whitelistMap.Update(keyBytes, &value, ebpf.UpdateAny); err != nil {\n\t\tlog.Error(\"failed to update sdwhitelist map: %v\", err)\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// function for update sdportlist map\nfunc AddSdPortlistRule(whitelistMap *ebpf.Map, rule *portListKey, ttlSec uint64) error {\n\tkeyBytes := rule.ToPlKey()\n\tvalue := rule.ToPlValue(ttlSec)\n\n\tif err := whitelistMap.Update(keyBytes, &value, ebpf.UpdateAny); err != nil {\n\t\tlog.Error(\"failed to update src dst portlist map: %v\", err)\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// function for update protocol_port map\nfunc AddPpWhitelistRule(whitelistMap *ebpf.Map, rule *procoPortKey, ttlSec uint64) error {\n\tkeyBytes := rule.ToPpKey()\n\tvalue := rule.ToPpValue(ttlSec)\n\n\tif err := whitelistMap.Update(keyBytes, &value, ebpf.UpdateAny); err != nil {\n\t\tlog.Error(\"failed to update sdwhitelist map: %v\", err)\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// function for update src dst port map\nfunc AddSrcipDestPortRule(whitelistMap *ebpf.Map, rule *srcIPdstPortKey, ttlSec uint64) error {\n\tkeyBytes := rule.ToSpKey()\n\tvalue := rule.ToSpValue(ttlSec)\n\n\tif err := whitelistMap.Update(keyBytes, &value, ebpf.UpdateAny); err != nil {\n\t\tlog.Error(\"failed to update src_port_list map: %v\", err)\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc AddEbpfRuleForSrcDstPortProto(srcIPStr, dstIPStr string, protocol uint8, dstPort uint16, ttlSec uint64) error {\n\twhitelistMap, err := ebpf.LoadPinnedMap(\"/sys/fs/bpf/spp\", nil)\n\tif err != nil {\n\t\tlog.Error(\"failed to load pinned whitelist map: %v\", err)\n\t\treturn err\n\t}\n\tdefer whitelistMap.Close()\n\n\tsrcIP, err := parseIP(srcIPStr)\n\tif err != nil {\n\t\tlog.Error(\"invalid source IP: %v\", err)\n\t\treturn err\n\t}\n\n\tdstIP, err := parseIP(dstIPStr)\n\tif err != nil {\n\t\tlog.Error(\"invalid destination IP: %v\", err)\n\t\treturn err\n\t}\n\n\trule := &whitelistKey{\n\t\tSrcIP:    srcIP,\n\t\tDstIP:    dstIP,\n\t\tDstPort:  dstPort,\n\t\tProtocol: protocol,\n\t}\n\n\treturn AddWhitelistRule(whitelistMap, rule, ttlSec)\n}\n\nfunc AddEbpfRuleForSrcDst(srcIPStr, dstIPStr string, ttlSec uint64) error {\n\twhitelistMap, err := ebpf.LoadPinnedMap(\"/sys/fs/bpf/sdwhitelist\", nil)\n\tif err != nil {\n\t\tlog.Error(\"failed to load pinned whitelist map: %v\", err)\n\t\treturn err\n\t}\n\tdefer whitelistMap.Close()\n\n\tsrcIP, err := parseIP(srcIPStr)\n\tif err != nil {\n\t\tlog.Error(\"invalid source IP: %v\", err)\n\t\treturn err\n\t}\n\n\tdstIP, err := parseIP(dstIPStr)\n\tif err != nil {\n\t\tlog.Error(\"invalid destination IP: %v\", err)\n\t\treturn err\n\t}\n\n\trule := &srcDestKey{\n\t\tSrcIP: srcIP,\n\t\tDstIP: dstIP,\n\t}\n\n\treturn AddSdWhitelistRule(whitelistMap, rule, ttlSec)\n}\n\nfunc AddEbpfRuleForSrcDestPort(srcIPStr string, dstPort int, ttlSec uint64) error {\n\twhitelistMap, err := ebpf.LoadPinnedMap(\"/sys/fs/bpf/src_port\", nil)\n\tif err != nil {\n\t\tlog.Error(\"failed to load pinned whitelist map: %v\", err)\n\t\treturn err\n\t}\n\tdefer whitelistMap.Close()\n\n\tsrcIP, err := parseIP(srcIPStr)\n\tif err != nil {\n\t\tlog.Error(\"invalid source IP: %v\", err)\n\t\treturn err\n\t}\n\n\tdstPortu, err := safeIntToUint16(dstPort)\n\n\tif err != nil {\n\t\tlog.Error(\"failed to safeIntToUint16 in src_port_list map: %v\", err)\n\t\treturn err\n\t}\n\n\trule := &srcIPdstPortKey{\n\t\tSrcIP:   srcIP,\n\t\tDstPort: dstPortu,\n\t}\n\treturn AddSrcipDestPortRule(whitelistMap, rule, ttlSec)\n}\n\n// function for update icmpwhitelist map\nfunc AddEbpfIcmpRuleForSrcDst(srcIPStr, dstIPStr string, ttlSec uint64) error {\n\twhitelistMap, err := ebpf.LoadPinnedMap(\"/sys/fs/bpf/icmpwhitelist\", nil)\n\tif err != nil {\n\t\tlog.Error(\"failed to load pinned whitelist map: %v\", err)\n\t\treturn err\n\t}\n\tdefer whitelistMap.Close()\n\n\tsrcIP, err := parseIP(srcIPStr)\n\tif err != nil {\n\t\tlog.Error(\"invalid source IP: %v\", err)\n\t\treturn err\n\t}\n\n\tdstIP, err := parseIP(dstIPStr)\n\tif err != nil {\n\t\tlog.Error(\"invalid destination IP: %v\", err)\n\t\treturn err\n\t}\n\n\trule := &srcDestKey{\n\t\tSrcIP: srcIP,\n\t\tDstIP: dstIP,\n\t}\n\n\treturn AddSdWhitelistRule(whitelistMap, rule, ttlSec)\n}\n\n// function for update port_list map\nfunc AddEbpfRuleForSrcDestPortList(srcIPStr string, dstPortStart, dstPortEnd int, ttlSec uint64) error {\n\tportListMap, err := ebpf.LoadPinnedMap(\"/sys/fs/bpf/port_list\", nil)\n\tif err != nil {\n\t\tlog.Error(\"failed to load pinned port_list map: %v\", err)\n\t\treturn err\n\t}\n\tdefer portListMap.Close()\n\n\tsrcIP, err := parseIP(srcIPStr)\n\tif err != nil {\n\t\tlog.Error(\"invalid source IP: %v\", err)\n\t\treturn err\n\t}\n\n\tportStart, err := safeIntToUint16(dstPortStart)\n\tif err != nil {\n\t\tlog.Error(\"failed to safeIntToUint16 for dstPortStart: %d\", dstPortStart)\n\t\treturn err\n\t}\n\tportEnd, err := safeIntToUint16(dstPortEnd)\n\n\tif err != nil {\n\t\tlog.Error(\"failed to safeIntToUint16 for dstPortEnd: %d\", dstPortEnd)\n\t\treturn err\n\t}\n\n\trule := &portListKey{\n\t\tSrcIP:        srcIP,\n\t\tDstPortStart: portStart,\n\t\tDstPortEnd:   portEnd,\n\t}\n\n\treturn AddSdPortlistRule(portListMap, rule, ttlSec)\n}\n\n// function for update protocol dstport map\nfunc AddEbpfRuleForProtocolPort(protocol uint8, dstPort uint16, ttlSec uint64) error {\n\tportStr := fmt.Sprintf(\"%d\", dstPort)\n\tdstPortt, err := parsePort(portStr)\n\tif err != nil {\n\t\tlog.Error(\"failed to parsePort: %v\", portStr)\n\t\treturn err\n\t}\n\tportListMap, err := ebpf.LoadPinnedMap(\"/sys/fs/bpf/protocol_port\", nil)\n\tif err != nil {\n\t\tlog.Error(\"failed to load pinned protocol_port map: %v\", err)\n\t\treturn err\n\t}\n\tdefer portListMap.Close()\n\n\trule := &procoPortKey{\n\t\tDstPort:  dstPortt,\n\t\tProtocol: protocol,\n\t}\n\n\treturn AddPpWhitelistRule(portListMap, rule, ttlSec)\n}\n\nfunc safeIntToUint16(i int) (uint16, error) {\n\tif i < 0 || i > 65535 {\n\t\treturn 0, fmt.Errorf(\"value %d is out of range for uint16\", i)\n\t}\n\treturn uint16(i), nil\n}\n\n// A generic entry function that calls the corresponding function to add whitelist entries based on mapTypeandparams.\nfunc EbpfRuleAdd(mapType int, params EbpfRuleParams, TtlSec int) error {\n\tvar err error\n\tTtlSec64 := uint64(TtlSec)\n\tvar protocol uint8\n\tif len(params.Protocol) > 0 {\n\t\tswitch params.Protocol {\n\t\tcase \"tcp\":\n\t\t\tprotocol = 6\n\t\tcase \"udp\":\n\t\t\tprotocol = 17\n\t\tcase \"icmp\":\n\t\t\tprotocol = 1\n\t\tdefault:\n\t\t\treturn fmt.Errorf(\"unsupported protocol: %s\", params.Protocol)\n\t\t}\n\t}\n\n\tswitch mapType {\n\tcase MapTypeWhitelist:\n\t\t//base the map whitelist\n\t\terr = AddEbpfRuleForSrcDstPortProto(params.SrcIP, params.DstIP, protocol, uint16(params.DstPort), TtlSec64)\n\t\tif err != nil {\n\t\t\tlog.Error(\"failed add ebpf src: %s dst: %s, error: %v, protocol: %d, dstport: %d\", params.SrcIP, params.DstIP, err, protocol, uint16(params.DstPort))\n\t\t\treturn err\n\t\t}\n\n\tcase MapTypeSdWhitelist:\n\t\t//base the map sdwhitelist\n\t\terr = AddEbpfRuleForSrcDst(params.SrcIP, params.DstIP, TtlSec64)\n\t\tif err != nil {\n\t\t\tlog.Error(\"failed add ebpf src: %s dst: %s\", params.SrcIP, params.DstIP)\n\t\t\treturn err\n\t\t}\n\n\tcase MapTypeIcmpWhitelist:\n\t\t//base the map icmpwhitelist\n\t\terr = AddEbpfIcmpRuleForSrcDst(params.SrcIP, params.DstIP, TtlSec64)\n\t\tif err != nil {\n\t\t\tlog.Error(\"failed add ebpf icmp src: %s dst: %s\", params.SrcIP, params.DstIP)\n\t\t\treturn err\n\t\t}\n\n\tcase MapTypeSrcAndPort:\n\t\t//base the map src_port_list\n\t\terr = AddEbpfRuleForSrcDestPort(params.SrcIP, params.DstPort, TtlSec64)\n\t\tif err != nil {\n\t\t\tlog.Error(\"failed add ebpf src: %s dst port: %d\", params.SrcIP, params.DstPort)\n\t\t\treturn err\n\t\t}\n\n\tcase MapTypeSrcPortList:\n\t\t//base the map port_list\n\t\terr = AddEbpfRuleForSrcDestPortList(params.SrcIP, params.DstPortStart, params.DstPortEnd, TtlSec64)\n\t\tif err != nil {\n\t\t\tlog.Error(\"failed add ebpf src: %s dst port start: %d dst port end: %d\", params.SrcIP, params.DstPortStart, params.DstPortEnd)\n\t\t\treturn err\n\t\t}\n\n\tcase MapTypeProtocolPort:\n\t\t//base the map protocol_port\n\t\tdstPort := uint16(params.DstPort)\n\t\terr = AddEbpfRuleForProtocolPort(protocol, dstPort, TtlSec64)\n\t\tif err != nil {\n\t\t\tlog.Error(\"failed add ebpf protocol: %s dst port: %d\", params.Protocol, params.DstPort)\n\t\t\treturn err\n\t\t}\n\n\tdefault:\n\t\treturn fmt.Errorf(\"unsupported map type: %d\", mapType)\n\t}\n\n\treturn nil\n}\n\n// Parse the IP address\nfunc parseIP(ipStr string) (uint32, error) {\n\tip := net.ParseIP(ipStr)\n\tif ip == nil {\n\t\tlog.Error(\"invalid IP address: %s\", ipStr)\n\t\treturn 0, fmt.Errorf(\"invalid IP address: %s\", ipStr)\n\t}\n\tip = ip.To4()\n\tif ip == nil {\n\t\tlog.Error(\"only IPv4 addresses are supported: %s\", ipStr)\n\t\treturn 0, fmt.Errorf(\"only IPv4 addresses are supported: %s\", ipStr)\n\t}\n\treturn binary.LittleEndian.Uint32(ip), nil\n}\n\n// Parse the port\nfunc parsePort(portStr string) (uint16, error) {\n\tport, err := strconv.ParseUint(portStr, 10, 16)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\treturn binary.LittleEndian.Uint16([]byte{byte(port >> 8), byte(port & 0xFF)}), nil\n}\n"
  },
  {
    "path": "nhp/utils/ebpf/ebpf_linux.go",
    "content": "//go:build linux\n\npackage ebpf\n\nimport (\n\t\"fmt\"\n\n\t\"golang.org/x/sys/unix\"\n)\n\nfunc getBootTimeNanos() (uint64, error) {\n\tvar ts unix.Timespec\n\tif err := unix.ClockGettime(unix.CLOCK_BOOTTIME, &ts); err != nil {\n\t\treturn 0, fmt.Errorf(\"clock_gettime failed: %v\", err)\n\t}\n\treturn uint64(ts.Sec)*1e9 + uint64(ts.Nsec), nil\n}\n"
  },
  {
    "path": "nhp/utils/ebpf/ebpf_other.go",
    "content": "//go:build !linux\n\npackage ebpf\n\nimport \"fmt\"\n\nvar ErrEBPFSupportedOnlyOnLinux = fmt.Errorf(\"eBPF functionality is only supported on Linux, current platform is not Linux\")\n\nfunc getBootTimeNanos() (uint64, error) {\n\tttlSec := 1222222222222\n\treturn uint64(ttlSec), ErrEBPFSupportedOnlyOnLinux\n}\n"
  },
  {
    "path": "nhp/utils/encoding.go",
    "content": "package utils\n\nimport \"encoding/base64\"\n\nfunc DecodeString(s string) ([]byte, error) {\n\tres, err := base64.StdEncoding.DecodeString(s)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn res, nil\n}\n\nfunc EncodingString(s []byte) string {\n\treturn base64.StdEncoding.EncodeToString(s)\n}\n"
  },
  {
    "path": "nhp/utils/file.go",
    "content": "package utils\n\nimport (\n\t\"crypto/md5\"\n\t\"crypto/sha1\"\n\t\"crypto/sha256\"\n\t\"fmt\"\n\t\"hash\"\n\t\"io\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/fsnotify/fsnotify\"\n\n\t\"github.com/OpenNHP/opennhp/nhp/log\"\n)\n\nfunc ReadWholeFile(fileName string) (string, error) {\n\tif _, err := os.Stat(fileName); os.IsNotExist(err) {\n\t\treturn \"\", err\n\t}\n\n\tbuf, err := os.ReadFile(fileName) //nolint:gosec // G304: fileName is application-controlled config path\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\treturn string(buf), nil\n}\n\n// HashFile computes hash for file integrity verification (not cryptographic security)\n//\n//nolint:gosec // G401,G501: MD5/SHA1 used for file integrity checksums, not for cryptographic security\nfunc HashFile(method string, fileName string) (string, error) {\n\tfile, err := os.Open(fileName) //nolint:gosec // G304: fileName is application-controlled path\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\tdefer file.Close() // Be sure to close your file\n\n\tvar hash hash.Hash\n\n\tswitch {\n\tcase strings.EqualFold(method, \"md5\"):\n\t\thash = md5.New()\n\n\tcase strings.EqualFold(method, \"sha1\"):\n\t\thash = sha1.New()\n\n\tcase strings.EqualFold(method, \"sha256\"):\n\t\thash = sha256.New()\n\t}\n\n\tif _, err := io.Copy(hash, file); err != nil {\n\t\treturn \"\", err\n\t}\n\treturn fmt.Sprintf(\"%x\", hash.Sum(nil)), nil // Get hex encoded hash sum\n}\n\ntype fileWatcher struct {\n\tfilename string\n\twatcher  *fsnotify.Watcher\n\twait     *sync.WaitGroup\n}\n\nfunc (w *fileWatcher) Close() error {\n\tw.watcher.Close()\n\tw.wait.Wait()\n\tlog.Info(\"file watcher for %s closed\", w.filename)\n\treturn nil\n}\n\nfunc WatchFile(file string, callback func()) io.Closer {\n\twatcher, err := fsnotify.NewWatcher()\n\tif err != nil {\n\t\tlog.Error(\"failed to create file watcher for %s: %v\", file, err)\n\t\treturn nil\n\t}\n\n\t// we have to watch the entire directory to pick up renames/atomic saves in a cross-platform way\n\tfilename := filepath.Clean(file)\n\tdirPath, _ := filepath.Split(filename)\n\tif err := watcher.Add(dirPath); err != nil {\n\t\tlog.Error(\"failed to add directory to watcher: %v\", err)\n\t\treturn nil\n\t}\n\n\tvar eventsWG sync.WaitGroup\n\tvar debounceTimer *time.Timer\n\tdebounceTime := 100 * time.Millisecond\n\teventsWG.Add(1)\n\n\tgo func() {\n\t\tdefer CatchPanic()\n\t\tdefer watcher.Close()\n\t\tdefer eventsWG.Done()\n\n\t\tfor {\n\t\t\tselect {\n\t\t\tcase event, ok := <-watcher.Events:\n\t\t\t\tif !ok { // 'Events' channel is closed\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t// callback fires when file is modified or created\n\t\t\t\tif filepath.Clean(event.Name) == filename {\n\t\t\t\t\tif event.Has(fsnotify.Write) || event.Has(fsnotify.Create) {\n\t\t\t\t\t\tif callback != nil {\n\t\t\t\t\t\t\tif debounceTimer != nil {\n\t\t\t\t\t\t\t\tdebounceTimer.Stop()\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tdebounceTimer = time.AfterFunc(debounceTime, func() { callback() })\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if event.Has(fsnotify.Remove) {\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\tcase err, ok := <-watcher.Errors:\n\t\t\t\tif ok { // 'Errors' channel is not closed\n\t\t\t\t\tlog.Error(\"file watcher error: %v\", err)\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}()\n\n\tlog.Info(\"start watching file %s\", filename)\n\treturn &fileWatcher{filename, watcher, &eventsWG}\n}\n"
  },
  {
    "path": "nhp/utils/host.go",
    "content": "package utils\n\nimport (\n\t\"net\"\n\t\"strings\"\n)\n\nfunc GetLocalOutboundAddress() net.IP {\n\tcon, err := net.Dial(\"udp\", \"8.8.8.8:80\")\n\tif err != nil {\n\t\treturn nil\n\t}\n\tdefer con.Close()\n\n\taddr := con.LocalAddr().(*net.UDPAddr)\n\n\treturn addr.IP\n}\n\nfunc GetMacAddress(ip string) string {\n\tinterfaces, err := net.Interfaces()\n\tif err != nil {\n\t\treturn \"\"\n\t}\n\n\tfor _, intf := range interfaces {\n\t\tif addrs, err := intf.Addrs(); err == nil {\n\t\t\tfor _, addr := range addrs {\n\t\t\t\tif strings.Contains(addr.String(), ip) {\n\t\t\t\t\tmac := intf.HardwareAddr.String()\n\t\t\t\t\treturn mac\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn \"\"\n}\n"
  },
  {
    "path": "nhp/utils/iptables.go",
    "content": "package utils\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"fmt\"\n\t\"os/exec\"\n\t\"strings\"\n\t\"time\"\n\n\tlog \"github.com/OpenNHP/opennhp/nhp/log\"\n)\n\ntype IPTYPE int32\n\nconst (\n\tDefaultSet     = \"defaultset\"\n\tDefaultSetV6   = \"defaultset_v6\"\n\tWhitelistSet   = \"whitelistset\"\n\tWhitelistSetV6 = \"whitelistset_v6\"\n\tBlacklistSet   = \"blacklistset\"\n\tBlacklistSetV6 = \"blacklistset_v6\"\n\tTempSet        = \"tempset\"\n\tTempSetV6      = \"tempset_v6\"\n)\n\nconst (\n\tIPV6 IPTYPE = 1\n\tIPV4 IPTYPE = 2\n)\n\nconst (\n\tPOLICY_ACCEPT = iota\n\tPOLICY_DROP\n\tPOLICY_REJECT\n)\n\ntype IPTables struct {\n\tBinary           string\n\tBinary6          string // ip6tables binary path\n\tIPv6Available    bool   // true if ip6tables is available\n\tInputPolicy      int    // IPv4 INPUT chain policy\n\tForwardPolicy    int    // IPv4 FORWARD chain policy\n\tOutputPolicy     int    // IPv4 OUTPUT chain policy\n\tInput6Policy     int    // IPv6 INPUT chain policy\n\tForward6Policy   int    // IPv6 FORWARD chain policy\n\tOutput6Policy    int    // IPv6 OUTPUT chain policy\n\tAcceptInputMode  bool\n\tAcceptInput6Mode bool // separate tracking for IPv6\n}\n\ntype IPTablesRuleOperation int32\n\nconst (\n\tADD_IPTABLES_RULE_OPERATION = 0\n\tDEL_IPTABLES_RULE_OPERATION = 1\n)\n\n// Note: need root to run\nfunc NewIPTables() (*IPTables, error) {\n\tpath, err := exec.LookPath(\"iptables\")\n\tif err != nil {\n\t\tlog.Error(\"unable to locate iptables: %v\", err)\n\t\treturn nil, err\n\t}\n\n\tcmd := exec.Command(path, \"-L\")\n\tret, err := cmd.Output()\n\tif err != nil {\n\t\tlog.Error(\"execute command %s, error: %v\\nYou need root privilege to run this appplication\", cmd.String(), err)\n\t\treturn nil, err\n\t}\n\n\tt := &IPTables{\n\t\tBinary: path,\n\t}\n\n\t// Detect ip6tables (optional - don't fail if not available)\n\tpath6, err6 := exec.LookPath(\"ip6tables\")\n\tif err6 == nil {\n\t\tcmd6 := exec.Command(path6, \"-L\")\n\t\tret6, err6 := cmd6.Output()\n\t\tif err6 == nil {\n\t\t\tt.Binary6 = path6\n\t\t\tt.IPv6Available = true\n\t\t\tlog.Info(\"ip6tables detected and available\")\n\n\t\t\t// Parse IPv6 policies\n\t\t\tout6Strs := strings.Split(string(ret6), \"\\n\")\n\t\t\tfor _, line := range out6Strs {\n\t\t\t\tswitch {\n\t\t\t\tcase strings.HasPrefix(line, \"Chain INPUT\"):\n\t\t\t\t\tswitch {\n\t\t\t\t\tcase strings.Contains(line, \"ACCEPT\"):\n\t\t\t\t\t\tt.Input6Policy = POLICY_ACCEPT\n\t\t\t\t\tcase strings.Contains(line, \"DROP\"):\n\t\t\t\t\t\tt.Input6Policy = POLICY_DROP\n\t\t\t\t\tcase strings.Contains(line, \"REJECT\"):\n\t\t\t\t\t\tt.Input6Policy = POLICY_REJECT\n\t\t\t\t\t}\n\n\t\t\t\tcase strings.HasPrefix(line, \"Chain FORWARD\"):\n\t\t\t\t\tswitch {\n\t\t\t\t\tcase strings.Contains(line, \"ACCEPT\"):\n\t\t\t\t\t\tt.Forward6Policy = POLICY_ACCEPT\n\t\t\t\t\tcase strings.Contains(line, \"DROP\"):\n\t\t\t\t\t\tt.Forward6Policy = POLICY_DROP\n\t\t\t\t\tcase strings.Contains(line, \"REJECT\"):\n\t\t\t\t\t\tt.Forward6Policy = POLICY_REJECT\n\t\t\t\t\t}\n\n\t\t\t\tcase strings.HasPrefix(line, \"Chain OUTPUT\"):\n\t\t\t\t\tswitch {\n\t\t\t\t\tcase strings.Contains(line, \"ACCEPT\"):\n\t\t\t\t\t\tt.Output6Policy = POLICY_ACCEPT\n\t\t\t\t\tcase strings.Contains(line, \"DROP\"):\n\t\t\t\t\t\tt.Output6Policy = POLICY_DROP\n\t\t\t\t\tcase strings.Contains(line, \"REJECT\"):\n\t\t\t\t\t\tt.Output6Policy = POLICY_REJECT\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tlog.Warning(\"ip6tables found but not functional: %v\", err6)\n\t\t}\n\t} else {\n\t\tlog.Warning(\"ip6tables not found - IPv6 firewall rules will be skipped\")\n\t}\n\n\toutStrs := strings.Split(string(ret), \"\\n\")\n\tfor _, line := range outStrs {\n\t\tswitch {\n\t\tcase strings.HasPrefix(line, \"Chain INPUT\"):\n\t\t\tswitch {\n\t\t\tcase strings.Contains(line, \"ACCEPT\"):\n\t\t\t\tt.InputPolicy = POLICY_ACCEPT\n\t\t\tcase strings.Contains(line, \"DROP\"):\n\t\t\t\tt.InputPolicy = POLICY_DROP\n\t\t\tcase strings.Contains(line, \"REJECT\"):\n\t\t\t\tt.InputPolicy = POLICY_REJECT\n\t\t\t}\n\n\t\tcase strings.HasPrefix(line, \"Chain FORWARD\"):\n\t\t\tswitch {\n\t\t\tcase strings.Contains(line, \"ACCEPT\"):\n\t\t\t\tt.ForwardPolicy = POLICY_ACCEPT\n\t\t\tcase strings.Contains(line, \"DROP\"):\n\t\t\t\tt.ForwardPolicy = POLICY_DROP\n\t\t\tcase strings.Contains(line, \"REJECT\"):\n\t\t\t\tt.ForwardPolicy = POLICY_REJECT\n\t\t\t}\n\n\t\tcase strings.HasPrefix(line, \"Chain OUTPUT\"):\n\t\t\tswitch {\n\t\t\tcase strings.Contains(line, \"ACCEPT\"):\n\t\t\t\tt.OutputPolicy = POLICY_ACCEPT\n\t\t\tcase strings.Contains(line, \"DROP\"):\n\t\t\t\tt.OutputPolicy = POLICY_DROP\n\t\t\tcase strings.Contains(line, \"REJECT\"):\n\t\t\t\tt.OutputPolicy = POLICY_REJECT\n\t\t\t}\n\t\t}\n\t}\n\n\treturn t, nil\n}\n\nfunc (table *IPTables) changePolicy(inputPolicy, forwardPolicy, outputPolicy *int) {\n\toperStr := \"ACCEPT\"\n\n\tif inputPolicy != nil {\n\t\tswitch *inputPolicy {\n\t\tcase POLICY_ACCEPT:\n\t\t\toperStr = \"ACCEPT\"\n\t\tcase POLICY_DROP:\n\t\t\toperStr = \"DROP\"\n\t\tcase POLICY_REJECT:\n\t\t\toperStr = \"REJECT\"\n\t\t}\n\t\tcmd := exec.Command(table.Binary, \"-P\", \"INPUT\", operStr)\n\t\terr := cmd.Run()\n\t\tif err != nil {\n\t\t\tlog.Debug(\"execute command %s, error: %v\", cmd.String(), err)\n\t\t}\n\t}\n\n\tif forwardPolicy != nil {\n\t\tswitch *forwardPolicy {\n\t\tcase POLICY_ACCEPT:\n\t\t\toperStr = \"ACCEPT\"\n\t\tcase POLICY_DROP:\n\t\t\toperStr = \"DROP\"\n\t\tcase POLICY_REJECT:\n\t\t\toperStr = \"REJECT\"\n\t\t}\n\t\tcmd := exec.Command(table.Binary, \"-P\", \"FORWARD\", operStr)\n\t\terr := cmd.Run()\n\t\tif err != nil {\n\t\t\tlog.Debug(\"execute command %s, error: %v\", cmd.String(), err)\n\t\t}\n\t}\n\n\tif outputPolicy != nil {\n\t\tswitch *outputPolicy {\n\t\tcase POLICY_ACCEPT:\n\t\t\toperStr = \"ACCEPT\"\n\t\tcase POLICY_DROP:\n\t\t\toperStr = \"DROP\"\n\t\tcase POLICY_REJECT:\n\t\t\toperStr = \"REJECT\"\n\t\t}\n\t\tcmd := exec.Command(table.Binary, \"-P\", \"OUTPUT\", operStr)\n\t\terr := cmd.Run()\n\t\tif err != nil {\n\t\t\tlog.Debug(\"execute command %s, error: %v\", cmd.String(), err)\n\t\t}\n\t}\n}\n\nfunc (table *IPTables) changeIptablesRule(inputPolicy, forwardPolicy, outputPolicy *int, operator IPTablesRuleOperation, dest string) {\n\toperStr := \"ACCEPT\"\n\toperation := \"-I\"\n\tif operator == DEL_IPTABLES_RULE_OPERATION {\n\t\toperation = \"-D\"\n\t}\n\n\tif inputPolicy != nil {\n\t\tswitch *inputPolicy {\n\t\tcase POLICY_ACCEPT:\n\t\t\toperStr = \"ACCEPT\"\n\t\tcase POLICY_DROP:\n\t\t\toperStr = \"DROP\"\n\t\tcase POLICY_REJECT:\n\t\t\toperStr = \"REJECT\"\n\t\t}\n\t\tcmd := exec.Command(table.Binary, operation, \"INPUT\", \"-d\", dest, \"-j\", operStr)\n\t\terr := cmd.Run()\n\t\tif err != nil {\n\t\t\tlog.Debug(\"execute command %s, error: %v\", cmd.String(), err)\n\t\t}\n\t}\n\n\tif forwardPolicy != nil {\n\t\tswitch *forwardPolicy {\n\t\tcase POLICY_ACCEPT:\n\t\t\toperStr = \"ACCEPT\"\n\t\tcase POLICY_DROP:\n\t\t\toperStr = \"DROP\"\n\t\tcase POLICY_REJECT:\n\t\t\toperStr = \"REJECT\"\n\t\t}\n\t\tcmd := exec.Command(table.Binary, operation, \"FORWARD\", \"-d\", dest, \"-j\", operStr)\n\t\terr := cmd.Run()\n\t\tif err != nil {\n\t\t\tlog.Debug(\"execute command %s, error: %v\", cmd.String(), err)\n\t\t}\n\t}\n\n\tif outputPolicy != nil {\n\t\tswitch *outputPolicy {\n\t\tcase POLICY_ACCEPT:\n\t\t\toperStr = \"ACCEPT\"\n\t\tcase POLICY_DROP:\n\t\t\toperStr = \"DROP\"\n\t\tcase POLICY_REJECT:\n\t\t\toperStr = \"REJECT\"\n\t\t}\n\t\tcmd := exec.Command(table.Binary, operation, \"OUTPUT\", \"-d\", dest, \"-j\", operStr)\n\t\terr := cmd.Run()\n\t\tif err != nil {\n\t\t\tlog.Debug(\"execute command %s, error: %v\", cmd.String(), err)\n\t\t}\n\t}\n}\n\nfunc (table *IPTables) ResetAllInput() {\n\tif !table.AcceptInputMode {\n\t\treturn\n\t}\n\tlog.Info(\"reset iptables input v2\")\n\tinputPolicy := POLICY_ACCEPT\n\tforwardPolicy := POLICY_ACCEPT\n\t//table.changePolicy(&inputPolicy, nil, nil)\n\ttable.changeIptablesRule(&inputPolicy, &forwardPolicy, nil, DEL_IPTABLES_RULE_OPERATION, \"0.0.0.0/0\")\n\ttable.AcceptInputMode = false\n}\n\nfunc (table *IPTables) AcceptAllInput() {\n\tif table.AcceptInputMode {\n\t\treturn\n\t}\n\tlog.Info(\"accept iptables input v2\")\n\tinputPolicy := POLICY_ACCEPT\n\tforwardPolicy := POLICY_ACCEPT\n\t//table.changePolicy(&inputPolicy, nil, nil)\n\ttable.changeIptablesRule(&inputPolicy, &forwardPolicy, nil, ADD_IPTABLES_RULE_OPERATION, \"0.0.0.0/0\")\n\ttable.AcceptInputMode = true\n}\n\n// ResetAllInput6 resets ip6tables input rules (IPv6)\nfunc (table *IPTables) ResetAllInput6() {\n\tif !table.IPv6Available || !table.AcceptInput6Mode {\n\t\treturn\n\t}\n\tlog.Info(\"reset ip6tables input\")\n\tinputPolicy := POLICY_ACCEPT\n\tforwardPolicy := POLICY_ACCEPT\n\ttable.changeIp6tablesRule(&inputPolicy, &forwardPolicy, nil, DEL_IPTABLES_RULE_OPERATION, \"::/0\")\n\ttable.AcceptInput6Mode = false\n}\n\n// AcceptAllInput6 accepts all ip6tables input (IPv6)\nfunc (table *IPTables) AcceptAllInput6() {\n\tif !table.IPv6Available || table.AcceptInput6Mode {\n\t\treturn\n\t}\n\tlog.Info(\"accept ip6tables input\")\n\tinputPolicy := POLICY_ACCEPT\n\tforwardPolicy := POLICY_ACCEPT\n\ttable.changeIp6tablesRule(&inputPolicy, &forwardPolicy, nil, ADD_IPTABLES_RULE_OPERATION, \"::/0\")\n\ttable.AcceptInput6Mode = true\n}\n\n// changeIp6tablesRule applies rules to ip6tables (IPv6 version of changeIptablesRule)\nfunc (table *IPTables) changeIp6tablesRule(inputPolicy, forwardPolicy, outputPolicy *int, operator IPTablesRuleOperation, dest string) {\n\tif !table.IPv6Available {\n\t\treturn\n\t}\n\n\toperStr := \"ACCEPT\"\n\toperation := \"-I\"\n\tif operator == DEL_IPTABLES_RULE_OPERATION {\n\t\toperation = \"-D\"\n\t}\n\n\tif inputPolicy != nil {\n\t\tswitch *inputPolicy {\n\t\tcase POLICY_ACCEPT:\n\t\t\toperStr = \"ACCEPT\"\n\t\tcase POLICY_DROP:\n\t\t\toperStr = \"DROP\"\n\t\tcase POLICY_REJECT:\n\t\t\toperStr = \"REJECT\"\n\t\t}\n\t\tcmd := exec.Command(table.Binary6, operation, \"INPUT\", \"-d\", dest, \"-j\", operStr)\n\t\terr := cmd.Run()\n\t\tif err != nil {\n\t\t\tlog.Debug(\"execute command %s, error: %v\", cmd.String(), err)\n\t\t}\n\t}\n\n\tif forwardPolicy != nil {\n\t\tswitch *forwardPolicy {\n\t\tcase POLICY_ACCEPT:\n\t\t\toperStr = \"ACCEPT\"\n\t\tcase POLICY_DROP:\n\t\t\toperStr = \"DROP\"\n\t\tcase POLICY_REJECT:\n\t\t\toperStr = \"REJECT\"\n\t\t}\n\t\tcmd := exec.Command(table.Binary6, operation, \"FORWARD\", \"-d\", dest, \"-j\", operStr)\n\t\terr := cmd.Run()\n\t\tif err != nil {\n\t\t\tlog.Debug(\"execute command %s, error: %v\", cmd.String(), err)\n\t\t}\n\t}\n\n\tif outputPolicy != nil {\n\t\tswitch *outputPolicy {\n\t\tcase POLICY_ACCEPT:\n\t\t\toperStr = \"ACCEPT\"\n\t\tcase POLICY_DROP:\n\t\t\toperStr = \"DROP\"\n\t\tcase POLICY_REJECT:\n\t\t\toperStr = \"REJECT\"\n\t\t}\n\t\tcmd := exec.Command(table.Binary6, operation, \"OUTPUT\", \"-d\", dest, \"-j\", operStr)\n\t\terr := cmd.Run()\n\t\tif err != nil {\n\t\t\tlog.Debug(\"execute command %s, error: %v\", cmd.String(), err)\n\t\t}\n\t}\n}\n\ntype IPSet struct {\n\tBinary string // Binary is Command path\n\tWait   bool\n}\n\n// NewIPSet new ipset\n// @Return: *IPSet, error\n// Note: need root to run\nfunc NewIPSet(wait bool) (*IPSet, error) {\n\tpath, err := exec.LookPath(\"ipset\")\n\tif err != nil {\n\t\tlog.Error(\"unable to locate ipset: %v\", err)\n\t\treturn nil, err\n\t}\n\n\treturn &IPSet{\n\t\tBinary: path,\n\t\tWait:   wait,\n\t}, nil\n}\n\nfunc (ipset *IPSet) Add(ipType IPTYPE, t int, expire int, args ...string) (string, error) {\n\tctx, cancel := context.WithTimeout(context.TODO(), 2*time.Second)\n\tdefer cancel()\n\n\tname := ipset.GetIpsetName(ipType, t)\n\tparams := append([]string{\"add\", \"-exist\", name}, args...)\n\tparams = append(params, \"timeout\", fmt.Sprintf(\"%d\", expire))\n\n\tlog.Debug(\"Execute ipset: ipset %s\", params)\n\treturn ipset.Run(ctx, params...)\n}\n\nfunc (ipset *IPSet) GetIpsetName(ipType IPTYPE, t int) string {\n\tvar name string\n\tswitch t {\n\tcase 1:\n\t\tif ipType == IPV4 {\n\t\t\treturn DefaultSet\n\t\t} else if ipType == IPV6 {\n\t\t\treturn DefaultSetV6\n\t\t}\n\t\treturn DefaultSet\n\tcase 2: // Blacklist and Whitelist\n\tcase 3:\n\t\treturn ipset.GetDefaultName(ipType, t)\n\tcase 4:\n\t\tif ipType == IPV4 {\n\t\t\treturn TempSet\n\t\t} else if ipType == IPV6 {\n\t\t\treturn TempSetV6\n\t\t}\n\t\treturn TempSet\n\t}\n\treturn name\n}\n\nfunc (ipset *IPSet) GetDefaultName(ipType IPTYPE, t int) string {\n\tvar name string\n\tswitch t {\n\tcase 2: // Whitelist\n\t\tname = WhitelistSet\n\t\tif ipType == IPV6 {\n\t\t\tname = WhitelistSetV6\n\t\t}\n\tcase 3: // Blacklist\n\t\tname = BlacklistSet\n\t\tif ipType == IPV6 {\n\t\t\tname = BlacklistSetV6\n\t\t}\n\t}\n\treturn name\n}\n\nfunc (ipset *IPSet) Run(ctx context.Context, args ...string) (string, error) {\n\tc := make(chan string)\n\tdefer close(c)\n\tvar stderr bytes.Buffer\n\tvar stdout bytes.Buffer\n\n\tcmd := exec.CommandContext(ctx, ipset.Binary, args...)\n\tcmd.Stderr = &stderr\n\tcmd.Stdout = &stdout\n\terr := cmd.Run()\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\tif stderr.String() != \"\" {\n\t\treturn \"\", fmt.Errorf(\"%s\", stderr.String())\n\t}\n\treturn stdout.String(), nil\n}\n"
  },
  {
    "path": "nhp/utils/iputils.go",
    "content": "package utils\n\nimport (\n\t\"fmt\"\n\t\"net\"\n)\n\n// CIDR mask constants for IP address handling\nconst (\n\tIPv4SingleHost    = \"/32\"  // Single IPv4 host\n\tIPv4AdjacentRange = \"/25\"  // 128 IPv4 addresses\n\tIPv6SingleHost    = \"/128\" // Single IPv6 host\n\tIPv6AdjacentRange = \"/121\" // 128 IPv6 addresses (equivalent to IPv4 /25)\n)\n\n// DetectIPType parses an IP address string and returns whether it's IPv4 or IPv6.\n// Returns an error if the IP address is invalid.\nfunc DetectIPType(ipStr string) (IPTYPE, error) {\n\tip := net.ParseIP(ipStr)\n\tif ip == nil {\n\t\treturn 0, fmt.Errorf(\"invalid IP address: %s\", ipStr)\n\t}\n\tif ip.To4() != nil {\n\t\treturn IPV4, nil\n\t}\n\treturn IPV6, nil\n}\n\n// IsIPv6 returns true if the string is a valid IPv6 address.\n// Note: IPv4-mapped IPv6 addresses (::ffff:x.x.x.x) return false because\n// Go's net.IP.To4() returns a non-nil value for these addresses.\nfunc IsIPv6(ipStr string) bool {\n\tip := net.ParseIP(ipStr)\n\treturn ip != nil && ip.To4() == nil\n}\n\n// IsIPv4 returns true if the string is a valid IPv4 address.\nfunc IsIPv4(ipStr string) bool {\n\tip := net.ParseIP(ipStr)\n\treturn ip != nil && ip.To4() != nil\n}\n\n// GetCIDRMask returns the appropriate CIDR mask suffix for a given IP type and access mode.\n// If rangeMode is true, returns the range mask (128 addresses); otherwise returns single-host mask.\nfunc GetCIDRMask(ipType IPTYPE, rangeMode bool) string {\n\tif ipType == IPV6 {\n\t\tif rangeMode {\n\t\t\treturn IPv6AdjacentRange\n\t\t}\n\t\treturn IPv6SingleHost\n\t}\n\t// IPv4 or default\n\tif rangeMode {\n\t\treturn IPv4AdjacentRange\n\t}\n\treturn IPv4SingleHost\n}\n"
  },
  {
    "path": "nhp/utils/parser.go",
    "content": "package utils\n\nimport (\n\t\"fmt\"\n\t\"strconv\"\n)\n\nfunc ParseBool(v int) bool {\n\treturn v == 1\n}\n\nfunc ParseInt(v string) int {\n\tr, err := strconv.Atoi(v)\n\tif err != nil {\n\t\treturn 0\n\t}\n\treturn r\n}\n\nfunc ParseUInt64(v string) uint64 {\n\tr, err := strconv.ParseUint(v, 10, 64)\n\tif err != nil {\n\t\treturn 0\n\t}\n\treturn r\n}\n\nfunc ParseInt64ToInt(v int64) int {\n\tres, err := strconv.Atoi(fmt.Sprintf(\"%d\", v))\n\tif err != nil {\n\t\treturn 0\n\t}\n\treturn res\n}\n"
  },
  {
    "path": "nhp/utils/request.go",
    "content": "package utils\n\nimport (\n\t\"io\"\n\t\"net/http\"\n\t\"strings\"\n\t\"time\"\n)\n\nconst (\n\t// ContentType ContentType\n\tContentType string = \"application/x-www-form-urlencoded\"\n)\n\n// Get access web service\nfunc Get(url string) (string, error) {\n\tclient := &http.Client{Timeout: 10 * time.Second}\n\tresp, err := client.Get(url)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\tdefer resp.Body.Close()\n\tbody, err := io.ReadAll(resp.Body)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\treturn string(body), nil\n}\n\nfunc Request(url, method string, str string, header map[string]string) (string, error) {\n\tpayload := strings.NewReader(str)\n\n\tclient := &http.Client{}\n\treq, err := http.NewRequest(method, url, payload)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\t// req.Header.Add(\"Content-Type\", \"application/json\")\n\tfor k, v := range header {\n\t\treq.Header.Add(k, v)\n\t}\n\n\tres, err := client.Do(req)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\tdefer res.Body.Close()\n\n\tbody, err := io.ReadAll(res.Body)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\treturn string(body), nil\n}\n"
  },
  {
    "path": "nhp/utils/utils.go",
    "content": "package utils\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io\"\n\t\"math/rand\"\n\t\"net/http\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"regexp\"\n\t\"runtime/debug\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/OpenNHP/opennhp/nhp/log\"\n)\n\n// GetRandomUint32 returns a non-zero random uint32 for packet preamble obfuscation.\n// Uses math/rand which is sufficient for this non-cryptographic use case.\n//\n//nolint:gosec // G404: math/rand is intentional - used for packet obfuscation, not security\nfunc GetRandomUint32() (r uint32) {\n\trng := rand.New(rand.NewSource(time.Now().UnixNano()))\n\tfor {\n\t\tr = rng.Uint32()\n\t\tif r != 0 {\n\t\t\tbreak\n\t\t}\n\t}\n\treturn r\n}\n\nfunc CatchPanic() {\n\tif x := recover(); x != nil {\n\t\tfor _, line := range append([]string{fmt.Sprint(x)}, strings.Split(string(debug.Stack()), \"\\n\")...) {\n\t\t\tif len(strings.TrimSpace(line)) > 0 {\n\t\t\t\tlog.Error(\"%s\", line)\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc CatchPanicThenRun(catchFun func()) {\n\tif x := recover(); x != nil {\n\t\tfor _, line := range append([]string{fmt.Sprint(x)}, strings.Split(string(debug.Stack()), \"\\n\")...) {\n\t\t\tif len(strings.TrimSpace(line)) > 0 {\n\t\t\t\tlog.Error(\"%s\", line)\n\t\t\t}\n\t\t}\n\t\tif catchFun != nil {\n\t\t\tcatchFun()\n\t\t}\n\t}\n}\n\n// Here's how to get the current date string in the format yyyyMMdd (like 20250210) in various programming languages:\nfunc GetCurrentDate() (date string) {\n\tnow := time.Now()\n\tdate = now.Format(\"20060102\")\n\treturn date\n}\n\nfunc DownloadFileToTemp(fileUrl string, pattern string) (string, error) {\n\ttempDir, err := os.MkdirTemp(\"\", pattern)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\tfileName := filepath.Base(fileUrl)\n\ttempFilePath := filepath.Join(tempDir, fileName)\n\n\toutFile, err := os.Create(tempFilePath)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\tdefer outFile.Close()\n\n\tresp, err := http.Get(fileUrl) //nolint:gosec // G107: URL comes from trusted configuration\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\tdefer resp.Body.Close()\n\n\tif resp.StatusCode != http.StatusOK {\n\t\treturn \"\", fmt.Errorf(\"failed to download file (%s): status code %s\", fileUrl, resp.Status)\n\t}\n\n\t_, err = io.Copy(outFile, resp.Body)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\treturn tempFilePath, nil\n}\n\nfunc GenerateTempFilePath(pattern string) (string, error) {\n\tfile, err := os.CreateTemp(\"\", pattern)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\ttempPath := file.Name()\n\n\tif err := file.Close(); err != nil {\n\t\treturn \"\", err\n\t}\n\n\treturn tempPath, nil\n}\n\nfunc SaveStructAsJsonFile(filePath string, data any) error {\n\tif data == nil {\n\t\treturn fmt.Errorf(\"data cannot be nil\")\n\t}\n\tif filePath == \"\" {\n\t\treturn fmt.Errorf(\"file path cannot be empty\")\n\t}\n\n\tjsonData, err := json.MarshalIndent(data, \"\", \"  \")\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to marshal data to JSON: %w\", err)\n\t}\n\n\terr = os.WriteFile(filePath, jsonData, 0644) //nolint:gosec // G306: Generic utility - callers determine sensitivity\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to write JSON to file: %w\", err)\n\t}\n\n\treturn nil\n}\n\nfunc LoadJsonFileAsStruct(filePath string) (any, error) {\n\tif filePath == \"\" {\n\t\treturn nil, fmt.Errorf(\"file path cannot be empty\")\n\t}\n\n\tjsonData, err := os.ReadFile(filePath)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to read file: %w\", err)\n\t}\n\n\tvar data map[string]any\n\n\tif err := json.Unmarshal(jsonData, &data); err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to unmarshal JSON %s to struct: %w\", string(jsonData), err)\n\t}\n\n\treturn data, nil\n}\n\nfunc UpdateTomlConfig(filePath string, key string, value any) error {\n\tcontent, err := os.ReadFile(filePath)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tvar newContent string\n\n\tswitch value := value.(type) {\n\tcase string:\n\t\tre := regexp.MustCompile(`(?m)^\\s*` + key + `\\s*=\\s*\".+\"\\s*$`)\n\t\tnewContent = re.ReplaceAllString(string(content), fmt.Sprintf(\"%s = \\\"%s\\\"\", key, value))\n\tdefault:\n\t\treturn fmt.Errorf(\"unsupported type: %T\", value)\n\t}\n\n\terr = os.WriteFile(filePath, []byte(newContent), 0644) //nolint:gosec // G306: Config files are typically world-readable\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "nhp/utils/uuid.go",
    "content": "package utils\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"math/rand\"\n\t\"time\"\n\n\t\"github.com/google/uuid\"\n)\n\n// NewUUID generates a UUID using math/rand. For cryptographically secure UUIDs,\n// use GenerateUUIDv4() instead which uses crypto/rand.\n//\n//nolint:gosec // G404: math/rand is acceptable for non-security UUID generation\nfunc NewUUID() (string, error) {\n\trng := rand.New(rand.NewSource(time.Now().UnixNano()))\n\tuuid := make([]byte, 16)\n\t_, err := rng.Read(uuid)\n\tif err != nil {\n\t\treturn \"\", errors.New(\"failed to generate UUID: \" + err.Error())\n\t}\n\n\t// Set version bits (version 4)\n\tuuid[6] = (uuid[6] & 0x0F) | 0x40\n\t// Set variant bits (variant 1)\n\tuuid[8] = (uuid[8] & 0x3F) | 0x80\n\n\treturn fmt.Sprintf(\"%x-%x-%x-%x-%x\", uuid[0:4], uuid[4:6], uuid[6:8], uuid[8:10], uuid[10:]), nil\n}\n\n// RandNumber returns a random 4-digit number (1000-10999) for non-security purposes.\n//\n//nolint:gosec // G404: math/rand is acceptable for non-security random numbers\nfunc RandNumber() int {\n\trng := rand.New(rand.NewSource(time.Now().UnixNano()))\n\trandomNumber := rng.Intn(10000)\n\tif randomNumber < 1000 {\n\t\trandomNumber += 1000\n\t}\n\n\treturn randomNumber\n}\n\n// GenerateUUIDv4 creates a random UUID (version 4)\nfunc GenerateUUIDv4() (string, error) {\n\tu, err := uuid.NewRandom()\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"failed to generate UUID v4: %w\", err)\n\t}\n\treturn u.String(), nil\n}\n"
  },
  {
    "path": "nhp/utils/waitpool.go",
    "content": "package utils\n\nimport (\n\t\"sync\"\n\t\"sync/atomic\"\n)\n\ntype WaitPool struct {\n\tpool  sync.Pool\n\tcond  sync.Cond\n\tlock  sync.Mutex\n\tcount uint32\n\tmax   uint32\n}\n\nfunc NewWaitPool(max uint32, new func() any) *WaitPool {\n\tp := &WaitPool{pool: sync.Pool{New: new}, max: max}\n\tp.cond = sync.Cond{L: &p.lock}\n\treturn p\n}\n\nfunc (p *WaitPool) Get() any {\n\tif p.max != 0 {\n\t\tp.lock.Lock()\n\t\tfor atomic.LoadUint32(&p.count) >= p.max {\n\t\t\tp.cond.Wait()\n\t\t}\n\t\tatomic.AddUint32(&p.count, 1)\n\t\tp.lock.Unlock()\n\t}\n\treturn p.pool.Get()\n}\n\nfunc (p *WaitPool) Put(x any) {\n\tp.pool.Put(x)\n\tif p.max == 0 {\n\t\treturn\n\t}\n\tatomic.AddUint32(&p.count, ^uint32(0))\n\tp.cond.Signal()\n}\n"
  },
  {
    "path": "nhp/version/VERSION",
    "content": "0.6.0"
  },
  {
    "path": "nhp/version/version.go",
    "content": "package version\n\nvar (\n\tVersion    = \"\" // space holder, update when build\n\tCommitId   = \"\" // space holder, update when build\n\tCommitTime = \"\" // space holder, update when build\n\tBuildTime  = \"\" // space holder, update when build\n)\n"
  }
]